emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master 6aaa489 1/2: Merge branch 'master' into cairo


From: Jan D.
Subject: [Emacs-diffs] master 6aaa489 1/2: Merge branch 'master' into cairo
Date: Sat, 23 May 2015 10:38:56 +0000

branch: master
commit 6aaa489dc112f51f6045f79b37cb78dd513e398f
Merge: ee14727 7ac84a2
Author: Jan D <address@hidden>
Commit: Jan D <address@hidden>

    Merge branch 'master' into cairo
---
 .gitignore                                         |    1 -
 CONTRIBUTE                                         |    3 +
 ChangeLog.2                                        |  601 +++++++++++
 Makefile.in                                        |   11 +-
 admin/charsets/Makefile                            |  324 ------
 admin/charsets/Makefile.in                         |  335 +++++++
 admin/charsets/mapconv                             |   33 +-
 admin/charsets/mapfiles/PTCP154                    |    2 +-
 admin/notes/unicode                                |   19 +
 build-aux/gitlog-to-changelog                      |   11 +-
 build-aux/gitlog-to-emacslog                       |    4 +-
 configure.ac                                       |    3 +-
 doc/lispref/display.texi                           |   15 +-
 doc/lispref/frames.texi                            |   31 +-
 doc/lispref/nonascii.texi                          |    4 +-
 doc/lispref/positions.texi                         |   15 +-
 doc/lispref/windows.texi                           |   49 +-
 doc/misc/erc.texi                                  |   20 +
 etc/NEWS                                           |   38 +-
 lib-src/emacsclient.c                              |    8 +-
 lib-src/etags.c                                    |  107 ++-
 lisp/ChangeLog.16                                  |    3 +-
 lisp/allout-widgets.el                             |    2 +-
 lisp/allout.el                                     |    4 +-
 lisp/autorevert.el                                 |   37 +-
 lisp/calc/calc-aent.el                             |    2 +-
 lisp/calc/calc-yank.el                             |    2 +-
 lisp/calc/calc.el                                  |    2 +-
 lisp/calculator.el                                 |    4 +-
 lisp/calendar/calendar.el                          |    2 +-
 lisp/calendar/diary-lib.el                         |   12 +-
 lisp/calendar/solar.el                             |    2 +-
 lisp/calendar/todo-mode.el                         |    2 +-
 lisp/cedet/ede/auto.el                             |   12 +-
 lisp/cedet/ede/files.el                            |    2 +-
 lisp/cedet/semantic/mru-bookmark.el                |    2 +-
 lisp/cedet/semantic/symref.el                      |    4 +-
 lisp/cedet/semantic/tag.el                         |    4 +-
 lisp/cedet/srecode/cpp.el                          |    2 +-
 lisp/cedet/srecode/texi.el                         |   10 +-
 lisp/cus-edit.el                                   |    2 +-
 lisp/dired-aux.el                                  |    2 +-
 lisp/dired.el                                      |    2 +-
 lisp/dirtrack.el                                   |    2 +-
 lisp/emacs-lisp/advice.el                          |    3 -
 lisp/emacs-lisp/autoload.el                        |    1 -
 lisp/emacs-lisp/byte-opt.el                        |    4 +-
 lisp/emacs-lisp/bytecomp.el                        |    2 +-
 lisp/emacs-lisp/check-declare.el                   |    2 +-
 lisp/emacs-lisp/checkdoc.el                        |   15 +-
 lisp/emacs-lisp/cl-generic.el                      |   47 +-
 lisp/emacs-lisp/cl-indent.el                       |    6 +-
 lisp/emacs-lisp/cl-macs.el                         |    1 -
 lisp/emacs-lisp/debug.el                           |    2 +-
 lisp/emacs-lisp/edebug.el                          |    2 +-
 lisp/emacs-lisp/elint.el                           |    2 -
 lisp/emacs-lisp/generator.el                       |   10 +-
 lisp/emacs-lisp/lisp-mode.el                       |  482 +++++-----
 lisp/emacs-lisp/lisp.el                            |    5 +-
 lisp/emacs-lisp/package.el                         |  259 +++--
 lisp/emacs-lisp/subr-x.el                          |    4 +
 lisp/emacs-lisp/syntax.el                          |    2 +-
 lisp/emulation/viper-util.el                       |    2 +-
 lisp/erc/erc-backend.el                            |    2 +-
 lisp/erc/erc-ezbounce.el                           |    2 +-
 lisp/erc/erc-pcomplete.el                          |    2 +-
 lisp/erc/erc.el                                    |   53 +-
 lisp/eshell/em-term.el                             |   39 +-
 lisp/eshell/esh-arg.el                             |   41 +-
 lisp/eshell/esh-io.el                              |   48 +-
 lisp/eshell/esh-mode.el                            |    2 +-
 lisp/eshell/esh-util.el                            |    2 +-
 lisp/face-remap.el                                 |    2 +-
 lisp/facemenu.el                                   |    2 +-
 lisp/faces.el                                      |    8 +-
 lisp/files.el                                      |    6 +-
 lisp/forms.el                                      |    2 +-
 lisp/gnus/canlock.el                               |    5 +-
 lisp/gnus/deuglify.el                              |   10 +-
 lisp/gnus/gnus-art.el                              |    4 +-
 lisp/gnus/gnus-cus.el                              |    2 +-
 lisp/gnus/gnus-group.el                            |    2 +-
 lisp/gnus/gnus-sum.el                              |    2 +-
 lisp/gnus/message.el                               |    2 +-
 lisp/gnus/nndoc.el                                 |    2 +-
 lisp/gnus/nnmaildir.el                             |    4 +-
 lisp/gnus/rfc2047.el                               |    2 +-
 lisp/hippie-exp.el                                 |    4 +-
 lisp/ibuffer.el                                    |    4 +-
 lisp/icomplete.el                                  |   16 +-
 lisp/ido.el                                        |    4 +-
 lisp/ielm.el                                       |    2 +-
 lisp/info.el                                       |    2 +-
 lisp/language/tv-util.el                           |    2 +-
 lisp/ldefs-boot.el                                 |    2 +-
 lisp/leim/quail/cyrillic.el                        |    4 +-
 lisp/leim/quail/ethiopic.el                        |    4 +-
 lisp/leim/quail/hebrew.el                          |    8 +-
 lisp/leim/quail/thai.el                            |    6 +-
 lisp/linum.el                                      |    2 +-
 lisp/ls-lisp.el                                    |    2 +-
 lisp/mail/mailabbrev.el                            |    2 +-
 lisp/mail/mailalias.el                             |    2 +-
 lisp/mail/sendmail.el                              |    2 +-
 lisp/mail/supercite.el                             |   10 +-
 lisp/mail/uudecode.el                              |    2 +-
 lisp/minibuffer.el                                 |   16 +-
 lisp/net/ange-ftp.el                               |    2 +-
 lisp/net/dbus.el                                   |   28 +-
 lisp/net/network-stream.el                         |    2 +-
 lisp/net/rcirc.el                                  |    2 +-
 lisp/net/rlogin.el                                 |    4 +-
 lisp/net/secrets.el                                |    4 +-
 lisp/net/soap-client.el                            |    2 +-
 lisp/net/telnet.el                                 |    2 +-
 lisp/net/tramp-adb.el                              |    4 +-
 lisp/net/tramp-cmds.el                             |    2 +-
 lisp/net/tramp-compat.el                           |    4 +-
 lisp/net/tramp-gvfs.el                             |    2 +-
 lisp/net/tramp-sh.el                               |   12 +-
 lisp/net/tramp-smb.el                              |    4 +-
 lisp/net/tramp.el                                  |   14 +-
 lisp/obsolete/xesam.el                             |    2 +-
 lisp/org/ob-ruby.el                                |    2 +-
 lisp/org/org-agenda.el                             |    2 +-
 lisp/org/org-bbdb.el                               |    2 +-
 lisp/org/org-capture.el                            |    2 +-
 lisp/org/org-compat.el                             |    2 +-
 lisp/org/org-gnus.el                               |    2 +-
 lisp/org/org-macs.el                               |    2 +-
 lisp/org/org-protocol.el                           |    2 +-
 lisp/org/org.el                                    |   16 +-
 lisp/org/ox-html.el                                |    2 +-
 lisp/org/ox-odt.el                                 |    4 +-
 lisp/org/ox-texinfo.el                             |    2 +-
 lisp/play/handwrite.el                             |    8 +-
 lisp/progmodes/ada-xref.el                         |    2 +-
 lisp/progmodes/cc-defs.el                          |   10 +-
 lisp/progmodes/cc-engine.el                        |    2 +-
 lisp/progmodes/cc-fonts.el                         |    4 +-
 lisp/progmodes/cc-guess.el                         |    4 +-
 lisp/progmodes/compile.el                          |    2 +-
 lisp/progmodes/cperl-mode.el                       |    2 +-
 lisp/progmodes/gdb-mi.el                           |    6 +-
 lisp/progmodes/idlw-shell.el                       |    4 +-
 lisp/progmodes/idlwave.el                          |    6 +-
 lisp/progmodes/python.el                           |    2 +-
 lisp/progmodes/ruby-mode.el                        |    2 +-
 lisp/progmodes/verilog-mode.el                     |   12 +-
 lisp/ps-print.el                                   |    4 +-
 lisp/recentf.el                                    |    2 +-
 lisp/ses.el                                        |    8 +-
 lisp/simple.el                                     |    8 +-
 lisp/skeleton.el                                   |    5 +-
 lisp/subr.el                                       |   13 +
 lisp/term/tvi970.el                                |    4 +-
 lisp/term/w32console.el                            |   10 +-
 lisp/textmodes/artist.el                           |   26 +-
 lisp/textmodes/bibtex.el                           |    8 +-
 lisp/textmodes/ispell.el                           |    6 +-
 lisp/textmodes/makeinfo.el                         |    2 +-
 lisp/textmodes/rst.el                              |   18 +-
 lisp/textmodes/tildify.el                          |    2 +-
 lisp/type-break.el                                 |    2 +-
 lisp/vc/compare-w.el                               |    2 +-
 lisp/vc/ediff-util.el                              |    2 +-
 lisp/vc/log-edit.el                                |    2 +-
 lisp/vc/log-view.el                                |    9 +-
 lisp/vc/vc-annotate.el                             |   26 +-
 lisp/vc/vc-bzr.el                                  |    2 +-
 lisp/vc/vc-git.el                                  |   19 +-
 lisp/vc/vc.el                                      |    3 +-
 lisp/wid-edit.el                                   |    2 +-
 lisp/widget.el                                     |    2 +-
 lisp/windmove.el                                   |    4 +-
 lisp/window.el                                     |   66 ++-
 lisp/woman.el                                      |   12 +-
 lisp/xt-mouse.el                                   |    8 +-
 src/buffer.c                                       |    8 +-
 src/cmds.c                                         |   13 +-
 src/font.c                                         |   10 +-
 src/frame.c                                        |   13 +-
 src/gnutls.c                                       |    2 +-
 src/keyboard.c                                     |    3 +-
 src/keymap.c                                       |    4 +-
 src/nsfns.m                                        |    6 +-
 src/w32fns.c                                       |    4 +-
 src/w32heap.c                                      |    4 +-
 src/w32term.c                                      |    2 +-
 src/xdisp.c                                        |   24 +-
 src/xfns.c                                         |    4 +-
 src/xterm.c                                        |    9 +-
 test/automated/cl-generic-tests.el                 |   40 +-
 test/automated/compile-tests.el                    |   13 +-
 .../data/decompress/{foo-gzipped => foo.gz}        |  Bin 30 -> 30 bytes
 .../package/newer-versions/simple-single-1.4.el    |    2 +-
 test/automated/file-notify-tests.el                |    2 +-
 test/automated/package-test.el                     |    2 +-
 test/automated/sgml-mode-tests.el                  |  135 +++
 test/automated/subr-tests.el                       |   64 ++
 test/automated/zlib-tests.el                       |    2 +-
 test/etags/CTAGS.good                              |   63 +--
 test/etags/ETAGS.good_1                            |  133 +--
 test/etags/ETAGS.good_2                            |  131 +--
 test/etags/ETAGS.good_3                            |  133 +--
 test/etags/ETAGS.good_4                            |  133 +--
 test/etags/ETAGS.good_5                            |  131 +--
 test/etags/Makefile                                |   19 +-
 test/etags/c-src/dostorture.c                      |  107 --
 test/etags/cp-src/c.C                              |    2 +-
 test/etags/html-src/algrthms.html                  | 1038 ++++++++++----------
 test/etags/html-src/index.shtml                    |    6 +-
 test/etags/html-src/software.html                  |    8 +-
 test/etags/html-src/softwarelibero.html            |  166 ++--
 214 files changed, 3363 insertions(+), 2491 deletions(-)

diff --git a/.gitignore b/.gitignore
index 618249c..df9dc8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,7 +40,6 @@ Info.plist
 InfoPlist.strings
 Makefile
 makefile
-!admin/charsets/Makefile
 !etc/refcards/Makefile
 !test/automated/data/flymake/Makefile
 !test/indent/Makefile
diff --git a/CONTRIBUTE b/CONTRIBUTE
index bf23155..7e697dd 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -96,6 +96,9 @@ messages:
 - Commit messages should not contain the "Signed-off-by:" lines that
   are used in some other projects.
 
+- Any lines of the commit message that start with "; " are omitted
+  from the generated ChangeLog.
+
 - Explaining the rationale for a design choice is best done in comments
   in the source code.  However, sometimes it is useful to describe just
   the rationale for a change; that can be done in the commit message
diff --git a/ChangeLog.2 b/ChangeLog.2
index d1c9477..b75a665 100644
--- a/ChangeLog.2
+++ b/ChangeLog.2
@@ -1,3 +1,604 @@
+2015-05-17  Johan Bockgård  <address@hidden>
+
+       Fix integer-valued `mouse-highlight' (Bug#20590)
+       * src/xterm.c (handle_one_xevent) [USE_GTK]: Fix ifdef scope.
+
+2015-05-17  Eli Zaretskii  <address@hidden>
+
+       MS-Windows followup for ASCIIfication of curved quotes
+       * lisp/term/w32console.el (terminal-init-w32console): Repeat the
+       test for curved quotes being displayable, after switching the
+       terminal encoding.  (Bug#20545)
+
+2015-05-17  Paul Eggert  <address@hidden>
+
+       Spelling fixes
+
+2015-05-17  Jan D  <address@hidden>
+
+       Add comment that x_shift_glyphs_for_insert is never called.
+       * xterm.c (x_shift_glyphs_for_insert, x_redisplay_interface): Add
+       comment that this function is never called.
+
+2015-05-16  Glenn Morris  <address@hidden>
+
+       * src/lisp.mk: Remove from repository and generate at build-time.
+       * src/Makefile.in (lisp.mk): New rule to generate from loadup.el.
+       (shortlisp_filter): New variable.
+       (emacs$(EXEEXT), $(etc)/DOC): Depend on lisp.mk.
+       (distclean): Remove lisp.mk.
+       * Makefile.in ($(MAKEFILE_NAME)): No longer depend on src/lisp.mk.
+       * lisp/loadup.el: Tweak layout to make it easier to parse.
+       * make-dist: Do not distribute src/lisp.mk.
+
+2015-05-16  Dmitry Gutov  <address@hidden>
+
+       Display shorter dates in Git annotate output
+       * lisp/vc/vc-git.el (vc-git-annotate-command): Use the short date
+       format (when not overridden with vc-git-annotate-switches).
+       (vc-git-annotate-time): Support the short format, as well as ISO
+       8601 that has been used until now (bug#5428).
+
+2015-05-16  Paul Eggert  <address@hidden>
+
+       ASCIIfy curved quotes on displays lacking them
+       * lisp/international/mule-cmds.el (set-locale-environment):
+       If curved quotes don't work, display straight ASCII approximations
+       (Bug#20545).
+
+2015-05-16  Glenn Morris  <address@hidden>
+
+       Small src/Makefile simplification.
+       * src/lisp.mk (shortlisp): Rename from lisp, remove $lispsource prefix.
+       * src/Makefile.in (lisp): Derive from shortlisp.
+       ($(etc)/DOC): Use $shortlisp rather than parsing lisp.mk.
+
+2015-05-16  Eli Zaretskii  <address@hidden>
+
+       * lisp/help-mode.el (help-go-forward): Doc fix.
+       (Bug#20577)
+
+       * doc/lispref/debugging.texi (Profiling): Improve indexing.
+       (Bug#20576)
+
+2015-05-16  Dmitry Gutov  <address@hidden>
+
+       Use `unless' to have one fewer `not'
+       * lisp/vc/vc-git.el (vc-git-resolve-when-done): Use `unless' to
+       have one fewer `not'.
+
+       Remove redundant :group declarations from vc-git.el
+       * lisp/vc/vc-git.el (vc-git-diff-switches)
+       (vc-git-annotate-switches, vc-git-resolve-conflicts)
+       (vc-git-program, vc-git-root-log-format): Remove the redundant
+       :group declarations.
+
+2015-05-16  Nicolas Petton  <address@hidden>
+
+       Removes the predicate from lisp-complete-symbol (Bug#20456)
+       * lisp/emacs-lisp/lisp.el (lisp-complete-symbol): Do not use predicate
+       and remove it from the docstring.
+
+2015-05-16  Dmitry Gutov  <address@hidden>
+
+       Add new option vc-git-resolve-conflicts
+       * lisp/vc/vc-git.el (vc-git-resolve-conflicts): New variable.
+       (vc-git-find-file-hook): Add to after-save-hook only when the
+       above is non-nil.
+       (vc-git-resolve-when-done): Update to honor the new variable.
+       (Bug#20292)
+
+2015-05-16  Eli Zaretskii  <address@hidden>
+
+       Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs
+
+2015-05-16  Artur Malabarba  <address@hidden>
+
+       * lisp/emacs-lisp/tabulated-list.el: Don't error on nil header-string
+       (tabulated-list-init-header): Document new behavior.
+       (tabulated-list-print-fake-header): No nothing if
+       `tabulated-list--header-string' is nil.
+       (tabulated-list--header-string): Add a docstring.
+       * doc/lispref/modes.texi (Tabulated List Mode): Document it.
+       * etc/NEWS: Document it.
+
+2015-05-15  Leo Liu  <address@hidden>
+
+       Revert "Fix cps--gensym"
+       * lisp/emacs-lisp/generator.el (cps--gensym): Revert commit
+         fbda511ab8069d0115eafca411a43353b85431b1 on 2015-05-14.
+
+2015-05-15  Glenn Morris  <address@hidden>
+
+       Replace AC_SUBST_FILE in configure with include in Makefiles.
+       * configure.ac (DEPDIR, MKDEPDIR, deps_frag, lwlib_deps_frag)
+       (oldxmenu_deps_frag, lisp_frag): Remove output variables/files.
+       (AUTO_DEPEND): New output variable.
+       * lwlib/Makefile.in (AUTO_DEPEND): New, set by configure.
+       (DEPFLAGS, MKDEPDIR): Set directly via conditional.
+       (lwlib_deps_frag): Replace by conditional include.
+       * lwlib/autodeps.mk: Remove file.
+       * oldXMenu/Makefile.in (AUTO_DEPEND): New, set by configure.
+       (DEPFLAGS, MKDEPDIR): Set directly via conditional.
+       (oldxmenu_deps_frag): Replace by conditional include.
+       * oldXMenu/autodeps.mk: Remove file.
+       * src/Makefile.in (AUTO_DEPEND): New, set by configure.
+       (DEPFLAGS, MKDEPDIR): Set directly via conditional.
+       (lisp_frag): Replace by an include.
+       (deps_frag): Replace by conditional include.
+       * src/autodeps.mk: Remove file.
+
+       Tweak japanese.el's loading of dependencies.
+       * lisp/loadup.el: Explicitly load cp51932 and eucjp-ms.
+       * lisp/language/japanese.el: Use require rather than load.
+       * lisp/international/cp51932.el, lisp/international/eucjp-ms.el:
+       Provide a feature.
+       * admin/charsets/eucjp-ms.awk, admin/charsets/cp51932.awk:
+       Provide a feature in the generated file.
+
+2015-05-15  Jan D  <address@hidden>
+
+       Fix NS warnings.
+       * nsmenu.m (ns_popup_dialog)
+       * nsimage.m (initFromXBM:width:height:fg:bg:)
+       * nsfns.m (Fx_create_frame): Remove unused variables.
+       (Fns_read_file_name): Initialize fname, remove ret.
+       * nsterm.m (ns_draw_window_cursor): Handle DEFAULT_CURSOR in switch.
+       (ns_get_color, ns_set_horizontal_scroll_bar, keyDown): Remove unused
+       variable.
+       (init): Add parantesis in if.
+       (ns_create_terminal): Assign set_horizontal_scroll_bar_hook.
+
+2015-05-15  Jan Djärv  <address@hidden>
+
+       Fix a enum conversion warning in macfont.m
+       * src/macfont.h (CharacterCollection): Typedef to NSCharacterCollection.
+       (MAC_CHARACTER_COLLECTION_*): Use the NS variants.
+
+2015-05-15  Eli Zaretskii  <address@hidden>
+
+       Support de-alt dictionary with Aspell.
+       * lisp/textmodes/ispell.el (ispell-aspell-find-dictionary):
+       Support Aspell dictionaries with names like "de-alt".  (Bug#20581)
+
+2015-05-15  Jan Djärv  <address@hidden>
+
+       cus-start.el: Add ns-confirm-quit.
+       * cus-start.el: Add ns-confirm-quit.
+
+       Fix warnings on OSX 10.10.
+       * nsfns.m (MODAL_OK_RESPONSE): New define for different OSX versions.
+       (Fns_read_file_name): Check against MODAL_OK_RESPONSE.
+       (compute_tip_xy): Use convertRectToScreen for OSX >= 10.7
+       * nsmenu.m (initWithContentRect:styleMask:backing:defer:)
+       * nsimage.m (allocInitFromFile, setPixmapData): Only call
+       setScalesWhenResized for OSX < 10.6.
+       * nsterm.h (EmacsScroller): Declare scrollerWidth.
+       * nsterm.m (ns_copy_bits): New function that does not use deprecated
+       NSCopyBits.
+       (ns_scroll_run, ns_shift_glyphs_for_insert): Call ns_copy_bits.
+       (runAlertPanel): New function.
+       (applicationShouldTerminate:): Call runAlertPanel.
+       (initFrameFromEmacs, toggleFullScreen:): Only call useOptimizedDrawing
+       for OSX < 10.10.
+       (initFrameFromEmacs:): Only call allocateGState for OSX < 10.10.
+       (windowWillUseStandardFrame:defaultFrame:): Cast arg to abs to int.
+       (draggingEntered:): Returns NSDragOperation.
+       (scrollerWidth): Use scrollerWidthForControlSize for OSX >= 10.7.
+
+2015-05-15  Artur Malabarba  <address@hidden>
+
+       * lisp/emacs-lisp/package.el: Don't ensure-init during startup
+       (package--init-file-ensured): New variable.
+       (package-initialize, package--ensure-init-file): Use it.
+
+2015-05-15  Jan Djärv  <address@hidden>
+
+       Honor :fore/background for XBM on NS (Bug#14969).
+       * nsterm.h (EmacsImage): Add xbm_fg, remove initFromSkipXBM,
+       initFromXBM takes bg, fg args, remove flip arg.
+       (ns_image_from_XBM): Add bg, fg args.
+       * image.c (x_create_bitmap_from_data)
+       (Create_Pixmap_From_Bitmap_Data): ns_image_from_XBM takes bg, fg args.
+       * nsimage.m (ns_image_from_XBM): Add fg, bg args, pass to initFromXBM.
+       Remove flip arg.
+       (initFromSkipXBM): Move code to initFromXBM.
+       (initFromXBM): Actually set fg and bg, instead of playing alpha games.
+       Use fg, bg from args (Bug#14969).  Remove if (length) section, was 
always
+       false.
+       Remove bit flipping (bitPat, swt), generated incorrect images when
+       width/height wasn't a multiple of 8.
+       (setXBMColor:): Modify planes by comparing to saved xbm_fg.
+       * nsterm.m (ns_draw_fringe_bitmap): initFromXBM takes fg, bg args, 
remove
+       flip arg.
+
+2015-05-15  Artur Malabarba  <address@hidden>
+
+       * lisp/emacs-lisp/package.el: Be more careful with the init file
+       (package--ensure-init-file): Check that user-init-file is set,
+       exists, is readable, and is writable.  (Bug#20584)
+       Also expand the docstring.
+
+2015-05-14  Wilson Snyder  <address@hidden>
+
+       Sync with upstream verilog-mode revision 6232468
+       * lisp/progmodes/verilog-mode.el 
(verilog-font-lock-grouping-keywords-face)
+       (verilog-highlight-grouping-keywords): Fix use of face when
+       `verilog-highlight-grouping-keywords' set.  Reported by Jeff
+       Pompa.
+       (verilog-auto-reset): Fix AUTORESET to ignore member resets if
+       parent is reset, bug906. Reported by Ken Schmidt.
+       (verilog-auto-inout-module): Add fourth regexp argument to
+       AUTOINOUTMODULE and AUTOINOUTCOMP for signals to not match,
+       bug856. Reported by John Tillema.
+       (verilog-auto-inst-port): Fix AUTOINST interfaces to not show
+       modport if signal attachment is itself a modport.  Reported by
+       Matthew Lovell.
+       (verilog-auto-reset, verilog-auto-sense-sigs): Fix AUTORESET with
+       always_comb and always_latch, bug844.  Reported by Greg Hilton.
+       (verilog-at-constraint-p, verilog-beg-of-statement-1): Fix hanging
+       with many curly-bracket pairs, bug663.
+       (verilog-set-auto-endcomments): Fix end comments for functions of
+       type void, etc.  Reported by Alex Reed.
+       (verilog-do-indent): Fix electric tab deleting form-feeds.  Note
+       caused by indent-line-to deleting tabls pre 24.5.
+       (verilog-nameable-item-re): Fix nameable items that can have an
+       end-identifier to include endchecker, endgroup, endprogram,
+       endproperty, and endsequence.  Reported by Alex Reed.
+       (verilog-label-be): When auto-commenting a buffer, consider
+       auto-comments on all known keywords (not just a subset thereof).
+       Reported by Alex Reed.
+       (verilog-auto-end-comment-lines-re)
+       (verilog-end-block-ordered-re, verilog-set-auto-endcomments):
+       Automatically comment property/endproperty blocks to match other
+       similar blocks like sequence/endsequence, function/endfunction,
+       etc. Reported by Alex Reed.
+       (verilog-set-auto-endcomments): Detect the function- or task-name
+       when auto-commenting blocks that lack an explicit
+       portlist. Reported by Alex Reed.
+       (verilog-auto, verilog-auto-insert-last): Add AUTOINSERTLAST to
+       allow post-AUTO user fixups, bug826. Reported by Dennis
+       Muhlestein.
+       (verilog-no-indent-begin-re): When `verilog-indent-begin-after-if'
+       is nil, fix indenting initial/final to match always statements,
+       bug825. Reported by Tim Clapp.
+       (verilog-extended-complete-re): Fix indentation of DPI-C imports
+       with c_identifiers, and DPI-C imports, bug557. Reported by ZeDong
+       Mao and Jason Forkey.
+       (verilog-read-decls): Fix parsing typed interfaces.  Fix
+       AUTOINOUTMODPORT missing types.  Reported by Stephan Bourduas.
+       Fix localparam not being ignored in AUTOINSTPARAM,
+       bug889. Reported by Shannon Hill.
+       (verilog-auto-output-every): Add regexp to AUTOOUTPUTEVERY,
+       bug793.  Reported by Pierre-David Pfister.
+       (verilog-auto-arg-format, verilog-auto-arg-ports): Add
+       verilog-auto-arg-format to support newlines in AUTOARG. Reported
+       by Jie Xiao.
+       (verilog-batch-execute-func): Do not batch re-auto files loaded by
+       Local Variables. Fix printing "no changes to be saved" with
+       verilog-batch. Reported by Dan Dever.
+       (verilog-auto-inout-module): Fix AUTOINOUTMODULE not inserting
+       interface-only modules, bug721.  Reported by Dean Hoyt.
+       Author: Alex Reed <address@hidden>
+       * lisp/progmodes/verilog-mode.el (verilog-beg-of-statement): Don't
+       treat '<keyword>:<identifier>' as the start of a labeled
+       statement, bug905.  Reported by Enzo Chi.
+       (verilog-directive-re, verilog-compiler-directives)
+       (verilog-keywords): Match full set of IEEE 2012-1800 compiler
+       directives (plus some extras) when determining indentation, bug
+       901.  Reported by Bernd Beuster.
+       (verilog-at-constraint-p): Fix indentation of coverpoint bins if
+       iff expression doesn't start with word-character, bug900.
+       (verilog-optional-signed-range-re, verilog-optional-signed-re):
+       Fix incorrect indentation/alignment of unsigned declarations,
+       bug897.
+       (verilog-looking-back, verilog-in-attribute-p): Fix labling of
+       always constructs, bug895.
+       (verilog-calc-1): Fix verilog-mode constraint indentation,
+       bug324. Reported by Eric Mastromarchi.
+       (verilog-beg-of-statement): Fix indenting for some forms of
+       constraintsm bug433.  Reported by Brad Parker.  Fix indentation of
+       continued assignment incorrect if first line ends with ']',
+       bug437. Reported by Dan Dever.  Fix indention of cover inside an
+       ifdef, bug 862. Reported by Bernd Beuster Fix labeling do-while
+       blocks, bug842.
+       (verilog-preprocessor-re): Fix fork/end UNMATCHED warning,
+       bug859. Reported by Kaushal Modi.
+       (verilog-set-auto-endcomments): Fix endlabel end comments, bug888.
+       (verilog-backward-token): Fix indenting sensitivity lists with
+       named events, bug840.  Reed.
+       (verilog-no-indent-begin-re): Fix `verilog-indent-begin-after-if'
+       nil not honoring 'forever', 'foreach', and 'do' keywords.
+
+2015-05-14  Paul Eggert  <address@hidden>
+
+       Check for invalid GTK+ monitor scales
+       * src/gtkutil.c (xg_get_gdk_scale): Return 1 for invalid scales,
+       INT_MAX for too-large scales.  All callers changed to assume the
+       result is valid (Bug#20432).
+       (xg_frame_set_char_size, xg_update_scrollbar_pos):
+       Calculate scale only if needed.
+       show ASCII approximations instead.
+
+2015-05-14  Eli Zaretskii  <address@hidden>
+
+       Fix daemon crashes when linum-mode is turned on early on
+       * src/window.c (Fwindow_end): Don't try calling display engine
+       functions on initial-frame frame.  (Bug#20565)
+
+       Fix selective diff browsing in Ediff
+       * lisp/vc/ediff-util.el (ediff-focus-on-regexp-matches): Go to the
+       beginning of the region before searching for the
+       ediff-regexp-focus-* regexps.  (Bug#20568)
+
+2015-05-14  Jan D  <address@hidden>
+
+       Fixes Bug#20142.
+       * gtkutil.c (delete_cb): Don't send delete event here, it does arrive
+       in the main loop, even for Gtk 3 (Bug#20142).
+
+       Don't access display after i/o error (Bug#19147).
+       * xterm.c (x_connection_closed): Add third arg ioerror.
+       If ioerror, set display to 0 (Bug#19147).
+       (x_error_quitter): Call x_connection_closed with third arg false.
+       (x_io_error_quitter): Call x_connection_closed with third arg true.
+
+       Handle GTK_SCALE, fixes Bug#20432.
+       * gtkutil.c (xg_get_gdk_scale): New function.
+       (xg_frame_set_char_size)
+       (x_wm_set_size_hint, xg_get_default_scrollbar_width)
+       (xg_get_default_scrollbar_height)
+       (xg_update_horizontal_scrollbar_pos): Take GTK_SCALE in to account
+       when setting sizes (Bug#20432).
+
+2015-05-13  Leo Liu  <address@hidden>
+
+       Fix cps--gensym
+       * lisp/emacs-lisp/generator.el (cps--gensym): Fix.
+
+2015-05-13  Glenn Morris  <address@hidden>
+
+       Fix bootstrap (void function cl-member).
+       * lisp/emacs-lisp/cl-lib.el: Load cl-seq if no cl-loaddefs file.
+       * lisp/emacs-lisp/cl-seq.el: Provide a feature.
+
+2015-05-13  Stefan Monnier  <address@hidden>
+
+       * lisp/loadup.el ("emacs-lisp/cl-generic"): Preload
+       * src/lisp.mk (lisp): Add emacs-lisp/cl-generic.elc.
+       * lisp/emacs-lisp/cl-generic.el (cl-generic-define-method):
+       Avoid defalias for closures which are not immutable.
+       (cl--generic-prefill-dispatchers): New macro.  Use it to prefill the
+       dispatchers table with various entries.
+       * lisp/emacs-lisp/ert.el (emacs-lisp-mode-hook):
+       * lisp/emacs-lisp/seq.el (emacs-lisp-mode-hook): Use add-hook.
+
+2015-05-13  Eli Zaretskii  <address@hidden>
+
+       Improve tagging of C bindings in DEFVAR_*
+       * src/Makefile.in (TAGS): Add --regex options to tag the C binding
+       from DEFVAR_*.
+
+2015-05-13  Paul Eggert  <address@hidden>
+
+       * src/editfns.c (Fformat): Fix use-after-free bug (Bug#20548).
+
+2015-05-12  Glenn Morris  <address@hidden>
+
+       * lisp/progmodes/tcl.el (tcl-filter):
+       Handle comint-prompt-read-only like gud.el does.  (Bug#20549)
+
+       Add basic VC push support.
+       * lisp/vc/vc.el (vc-push): New autoloaded command.
+       * lisp/vc/vc-hooks.el (vc-prefix-map, vc-menu-map): Add vc-push.
+       * lisp/vc/vc-bzr.el (vc-bzr--pushpull): New, factored from vc-bzr-pull.
+       (vc-bzr-pull): Reimplement using vc-bzr--pushpull.
+       (vc-bzr-push): New.
+       * lisp/vc/vc-git.el (vc-git--pushpull): New, factored from vc-git-pull.
+       (vc-git-pull): Reimplement using vc-git--pushpull.
+       (vc-git-push): New.
+       * lisp/vc/vc-hg.el (vc-hg--pushpull): New, factored from vc-hg-pull.
+       (vc-hg-pull, vc-hg-push): Reimplement using vc-hg--pushpull.
+       * doc/emacs/maintaining.texi (Pulling / Pushing):
+       Rename from "VC Pull".  Mention pushing.
+       (VC With A Merging VCS, VC Change Log): Update xrefs.
+       (Branches): Update menu.
+       * doc/emacs/emacs.texi: Update menu.
+       * etc/NEWS: Mention this.
+
+2015-05-12  Nicolas Petton  <address@hidden>
+
+       Improve the seq pcase pattern and the `seq-let' macro
+       * lisp/emacs-lisp/seq.el: The pcase pattern now matches only if the
+       object is a sequence, and binds each element of ARGS to the
+       corresponding element of the sequence.
+
+2015-05-12  Eli Zaretskii  <address@hidden>
+
+       Fix tags created from DEFVAR_* declarations in C
+       * src/Makefile.in (TAGS): Improve the --regex argument to etags,
+       to make tags extracted from DEFVAR_* declarations more accurate.
+
+       Add a test suite for etags
+       * test/etags/: New test suite, adapted from
+       http://fly.isti.cnr.it/pub/software/unix/etags-regression-test.tar.bz2,
+       whose original author is Francesco Potortì <address@hidden>.
+
+       Fix tagging of symbols in C enumerations
+       * lib-src/etags.c (consider_token): Don't tag symbols in
+       expressions that assign values to enum constants.  See
+       http://lists.gnu.org/archive/html/emacs-devel/2015-05/msg00291.html
+       for details.
+       (C_entries): Reset fvdef to fvnone after processing a preprocessor
+       conditional and after a comma outside of parentheses.
+
+2015-05-12  Glenn Morris  <address@hidden>
+
+       * lisp/url/url-handlers.el (url-file-name-completion)
+       (url-file-name-all-completions): Silence compiler.
+
+       * lisp/emacs-lisp/chart.el (chart-axis-draw): Replace obsolete alias.
+
+       * lisp/play/dunnet.el (dun-dos-boot-msg): Fix time.  (Bug#20554)
+
+2015-05-12  Stefan Monnier  <address@hidden>
+
+       * lisp/emacs-lisp/cl-generic.el: Add dispatch on &context arguments
+       (cl--generic-mandatory-args): Remove.
+       (cl--generic-split-args): New function.
+       (cl-generic-define, cl--generic-lambda): Use it.
+       (cl-generic-define-method): Use it as well, and add support for
+       context args.
+       (cl--generic-get-dispatcher): Handle &context dispatch.
+       (cl--generic-cache-miss): `dispatch-arg' can now be a context 
expression.
+       (cl--generic-dispatchers): Pre-fill.
+       * test/automated/cl-generic-tests.el (sm-generic-test-12-context): New 
test.
+
+2015-05-11  Glenn Morris  <address@hidden>
+
+       * make-dist: Abort if "make ChangeLog" fails.  Add "--no-changelog".
+
+2015-05-11  Stefan Monnier  <address@hidden>
+
+       * lisp/term/xterm.el: Fix xterm-paste handling for rxvt
+       * lisp/term/rxvt.el: Require term/xterm.
+       (rxvt-function-map): Use xterm-rxvt-function-map.
+       (rxvt-standard-colors): Move before first use.
+       (terminal-init-rxvt): Use xterm--push-map and 
xterm-register-default-colors.
+       (rxvt-rgb-convert-to-16bit, rxvt-register-default-colors): Remove.
+       * lisp/term/xterm.el (xterm-rxvt-function-map): New var.
+       Move shared bindings between rxvt and xterm to it.
+       (xterm-function-map): Use it.  Move the xterm-paste binding to
+       xterm-rxvt-function-map (bug#20444).
+       (xterm-standard-colors): Move before first use.
+       (xterm--push-map): New function.
+       (xterm-register-default-colors): Take standard colors as argument.
+       (terminal-init-xterm): Use it.  Adjust call to
+       xterm-register-default-colors.
+
+2015-05-11  Glenn Morris  <address@hidden>
+
+       * lisp/term/x-win.el: Quieten --without-x compilation.
+       (x-own-selection-internal, x-disown-selection-internal)
+       (x-selection-owner-p, x-selection-exists-p, x-get-selection-internal):
+       Declare.
+
+       * Makefile.in (emacslog): Remove srcdir.
+       (ChangeLog): Update for the above.
+
+2015-05-11  Paul Eggert  <address@hidden>
+
+       Spelling fix
+
+2015-05-10  Fabián Ezequiel Gallina  <address@hidden>
+
+       python.el: better limit for looking-back calls
+       * lisp/progmodes/python.el (python-shell-accept-process-output):
+       Use last comint prompt start as limit for looking-back.
+
+2015-05-10  Stefan Monnier  <address@hidden>
+
+       CEDET (srecode-insert-fcn): Fix use of oref on a class
+       * lisp/cedet/srecode/insert.el (srecode-insert-fcn): Fix use of oref on
+       a class.  Reported by Pierre Lorenzon.
+       (srecode-template-inserter-point): Remove declaration.
+
+       CEDET (srecode-create-dictionary): Avoid obsolete object name
+       * lisp/cedet/srecode/dictionary.el (srecode-create-dictionary):
+       Don't use a symbol as an object name.  Reported by Pierre Lorenzon.
+
+2015-05-10  Paul Eggert  <address@hidden>
+
+       C-x 8 shorthands for curved quotes, Euro, etc.
+       Although C-x 8 lets you insert arbitrary Unicode characters,
+       it's awkward to use this to insert commonly used symbols such as curved
+       quotes, the Euro symbol, etc.  This patch adds simpler sequences for
+       characters commonly found in English text and in basic math.
+       For example, assuming the Alt key works on your keyboard and iso-transl
+       is loaded, one can now type "A-[" instead of "A-RET LEFT SIN TAB RET"
+       to get the character "‘" (U+2018 LEFT SINGLE QUOTATION MARK).
+       (Bug#20499)
+       * doc/emacs/mule.texi (Unibyte Mode):
+       A few other printing characters now work too.
+       * etc/NEWS: Document this.
+       * lisp/international/iso-transl.el (iso-transl-char-map):
+       Also support the following characters:
+       ‐ ‑ ‒ – — ― ‘ ’ “ ” † ‡ • ′ ″ € № ← → ↔ − ≈ ≠ ≤ ≥
+
+2015-05-10  Dmitry Gutov  <address@hidden>
+
+       Add xref-find-regexp
+       * lisp/progmodes/xref.el (xref-find-function): Describe the
+       `matches' action.
+       (xref-find-regexp): New command, using it.
+       (xref-collect-references): Rename to xref-collect-matches.
+       (xref--collect-reference): Rename to xref--collect-match.
+       (xref-collect-matches, xref--collect-match): Accept new argument,
+       KIND.  Update accordingly.
+       (xref--regexp-to-extended): New function.
+       * lisp/progmodes/elisp-mode.el (elisp-xref-find): Support the
+       `matches' action.
+       (elisp--xref-find-matches): Accept new argument.  Resolve a FIXME.
+       * lisp/progmodes/etags.el (etags-xref-find):
+       Support the `matches' action.
+       (etags--xref-find-matches): New function.
+
+2015-05-10  Glenn Morris  <address@hidden>
+
+       * Makefile.in: Fixes for recent change-history changes.
+       (change-history-nocommit): Update footer regexp.
+       Ensure output script stays executable.
+
+2015-05-10  Nicolas Petton  <address@hidden>
+
+       New version of `seq-let' based on a pcase pattern
+       * lisp/emacs-lisp/seq.el (seq-let): Define the macro in terms of a
+       pcase pattern if `pcase-defmacro' is defined (Emacs>=25.1).
+
+2015-05-10  Przemysław Wojnowski  <address@hidden>
+
+       Add basic HTML5 tags and a template
+       * lisp/textmodes/sgml-mode.el: Basic HTML5 support.
+       (html-tag-alist): Add HTML5 tags.
+       (html-tag-help): Add new tags descriptions.
+       (html-navigational-links): Template for nav links.
+       (html-html5-template): Template for a HTML5 page.
+
+2015-05-10  Dmitry Gutov  <address@hidden>
+
+       semantic/symref/grep: Don't use word boundaries
+       * lisp/cedet/semantic/symref/grep.el
+       (semantic-symref-perform-search): Instead of wrapping input in
+       word boundaries, check that the characters before and after are
+       not word constituents.
+
+       semantic/symref/grep: Support regexp search
+       * lisp/cedet/semantic/symref.el
+       (semantic-symref-hit-to-tag-via-buffer): Don't regexp-quote when
+       the search type is regexp.
+       * lisp/cedet/semantic/symref/grep.el
+       (semantic-symref-perform-search): Support the regexp search type.
+       Pass -E to Grep when it's used.
+
+       semantic-symref-regexp: Allow to input an arbitrary string
+       * lisp/cedet/semantic/symref/list.el (semantic-symref-regexp):
+       Allow to input an arbitrary string interactively.
+
+       Remove tag-symbol-match-p from etags-xref-find-definitions-tag-order
+       * lisp/progmodes/etags.el (etags-xref-find-definitions-tag-order):
+       Remove tag-symbol-match-p from the default value
+       (http://lists.gnu.org/archive/html/emacs-devel/2015-05/msg00292.html).
+
+       Declare find-tag obsolete
+       * lisp/progmodes/etags.el (find-tag): Declare obsolete in favor of
+       xref-find-definitions.
+
+2015-05-10  Jan D  <address@hidden>
+
+       Draw composite string correctly (Bug#20537).
+       * nsterm.m (ns_draw_composite_glyph_string_foreground): New function.
+       (ns_draw_glyph_string): Call it (Bug#20537).
+
 2015-05-09  Eli Zaretskii  <address@hidden>
 
        Avoid infloop in ERC
diff --git a/Makefile.in b/Makefile.in
index eec6d31..9790dbd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -831,7 +831,7 @@ clean_dirs = $(mostlyclean_dirs) nextstep
 $(foreach dir,$(clean_dirs),$(eval $(call submake_template,$(dir),clean)))
 
 clean: $(clean_dirs:=_clean)
-       for dir in test/automated; do \
+       for dir in test/automated admin/charsets; do \
          [ ! -d $$dir ] || $(MAKE) -C $$dir clean; \
        done
        -rm -f *.tmp etc/*.tmp*
@@ -856,8 +856,10 @@ distclean_dirs = $(clean_dirs) leim lisp
 
 $(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),distclean)))
 
+maybeclean_dirs = test/automated admin/grammars admin/unidata admin/charsets
+
 distclean: $(distclean_dirs:=_distclean)
-       for dir in test/automated admin/grammars admin/unidata; do \
+       for dir in ${maybeclean_dirs}; do \
          [ ! -d $$dir ] || $(MAKE) -C $$dir distclean; \
        done
        ${top_distclean}
@@ -868,7 +870,7 @@ distclean: $(distclean_dirs:=_distclean)
 $(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),bootstrap-clean)))
 
 bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
-       for dir in test/automated admin/grammars admin/unidata; do \
+       for dir in ${maybeclean_dirs}; do \
          [ ! -d $$dir ] || $(MAKE) -C $$dir bootstrap-clean; \
        done
        [ ! -f config.log ] || mv -f config.log config.log~
@@ -896,7 +898,7 @@ maintainer_clean_dirs = src leim lisp
 $(foreach dir,$(maintainer_clean_dirs),$(eval $(call 
submake_template,$(dir),maintainer-clean)))
 
 maintainer-clean: bootstrap-clean $(maintainer_clean_dirs:=_maintainer-clean)
-       for dir in test/automated admin/grammars admin/unidata; do \
+       for dir in ${maybeclean_dirs}; do \
          [ ! -d $$dir ] || $(MAKE) -C $$dir maintainer-clean; \
        done
        ${top_maintainer_clean}
@@ -910,6 +912,7 @@ maintainer-clean: bootstrap-clean 
$(maintainer_clean_dirs:=_maintainer-clean)
 $(foreach dir,$(SUBDIR),$(eval $(call submake_template,$(dir),extraclean)))
 
 ## FIXME this is busted because most of these do not have extraclean rules.
+## Also it is missing things that do have such rules.
 extraclean: $(SUBDIR:=_extraclean)
        ${top_maintainer_clean}
        -rm -f config-tmp-*
diff --git a/admin/charsets/Makefile b/admin/charsets/Makefile
deleted file mode 100644
index e5cf250..0000000
--- a/admin/charsets/Makefile
+++ /dev/null
@@ -1,324 +0,0 @@
-# Makefile -- Makefile to generate charset maps in etc/charsets.
-# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
-#   National Institute of Advanced Industrial Science and Technology (AIST)
-#   Registration Number H13PRO009
-#
-# 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:
-
-#  If your system doesn't have the directory /usr/share/i18n/charmaps,
-#  get the source of the latest glibc, gzip all the charmap files in
-#  the directory "localedate/charmaps", and set the variable
-#  GLIBC_CHARMAPS to that directory.
-
-GLIBC_CHARMAPS=/usr/share/i18n/charmaps
-
-CHARSETS = ${ISO8859} ${IBM} ${CODEPAGE} ${CJK} ${MISC} ${MULE}
-
-# Note: We can not prepend "ISO-" to these map files because of file
-# name limits on DOS.
-ISO8859 = \
-       8859-2.map 8859-3.map 8859-4.map 8859-5.map 8859-6.map 8859-7.map \
-       8859-8.map 8859-9.map 8859-10.map 8859-11.map 8859-13.map 8859-14.map \
-       8859-15.map 8859-16.map
-
-IBM = \
-       IBM037.map IBM038.map \
-       IBM256.map IBM273.map IBM274.map IBM275.map IBM277.map IBM278.map \
-       IBM280.map IBM281.map IBM284.map IBM285.map IBM290.map IBM297.map \
-       IBM420.map IBM423.map IBM424.map IBM437.map IBM500.map IBM850.map \
-       IBM851.map IBM852.map IBM855.map IBM856.map IBM857.map IBM860.map \
-       IBM861.map IBM862.map IBM863.map IBM864.map IBM865.map IBM866.map \
-       IBM868.map IBM869.map IBM870.map IBM871.map IBM874.map IBM875.map \
-       IBM880.map IBM891.map IBM903.map IBM904.map IBM905.map IBM918.map \
-       IBM1004.map IBM1026.map IBM1047.map
-
-CODEPAGE = \
-       CP737.map CP775.map CP1125.map\
-       CP1250.map CP1251.map CP1252.map CP1253.map CP1254.map \
-       CP1255.map CP1256.map CP1257.map CP1258.map \
-       CP10007.map \
-       CP720.map CP858.map
-
-CJK =   GB2312.map GBK.map GB180302.map GB180304.map \
-       BIG5.map BIG5-HKSCS.map\
-       CNS-1.map CNS-2.map CNS-3.map CNS-4.map CNS-5.map CNS-6.map CNS-7.map \
-       CNS-F.map \
-       JISX0201.map JISX0208.map JISX0212.map JISX2131.map JISX2132.map \
-       JISC6226.map CP932-2BYTE.map JISX213A.map\
-       KSC5601.map KSC5636.map JOHAB.map
-
-MISC =  KOI-8.map KOI8-R.map KOI8-U.map KOI8-T.map ALTERNATIVNYJ.map \
-       MIK.map PTCP154.map \
-       TIS-620.map VISCII.map VSCII.map VSCII-2.map\
-       KA-PS.map KA-ACADEMY.map \
-       HP-ROMAN8.map NEXTSTEP.map MACINTOSH.map EBCDICUK.map EBCDICUS.map \
-       stdenc.map symbol.map \
-       CP949-2BYTE.map \
-       BIG5-1.map BIG5-2.map
-
-# Emacs-mule charsets.
-MULE = MULE-ethiopic.map MULE-ipa.map MULE-is13194.map \
-       MULE-sisheng.map MULE-tibetan.map \
-       MULE-lviscii.map MULE-uviscii.map
-
-TRANS_TABLE = cp51932.el eucjp-ms.el
-SED_SCRIPT = jisx2131-filter
-
-all: ${CHARSETS} ${TRANS_TABLE}
-
-AWK = gawk
-
-# Rules for each charset
-
-VSCII.map: ${GLIBC_CHARMAPS}/TCVN5712-1.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[0-9a-f].[  ]/' GLIBC-1 compact.awk > $@
-
-VSCII-2.map: ${GLIBC_CHARMAPS}/TCVN5712-1.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[2-7a-f].[  ]/' GLIBC-1 compact.awk \
-         | sed 's/0x20-0x7F.*/0x00-0x7F 0x0000/' > $@
-
-ALTERNATIVNYJ.map: IBM866.map
-       # Generating address@hidden
-       @echo "# Modified from IBM866.map according to the chart at" > $@
-       @echo "# http://www.cyrillic.com/ref/cyrillic/koi-8alt.html,"; >> $@
-       @echo "# with guesses for the Unicodes of the glyphs." >> $@
-       @sed -e '1 d' \
-            -e '/0xF2/ s/ .*/ 0x2019/' \
-            -e '/0xF3/ s/ .*/ 0x2018/' \
-            -e '/0xF4/ s/ .*/ 0x0301/' \
-            -e '/0xF5/ s/ .*/ 0x0300/' \
-            -e '/0xF6/ s/ .*/ 0x203A/' \
-            -e '/0xF7/ s/ .*/ 0x2039/' \
-            -e '/0xF8/ s/ .*/ 0x2191/' \
-            -e '/0xF9/ s/ .*/ 0x2193/' \
-            -e '/0xFA/ s/ .*/ 0x00B1/' \
-            -e '/0xFB/ s/ .*/ 0x00F7/' < $< >> $@
-
-MIK.map: mapfiles/bulgarian-mik.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '1,$$' CZYBORRA compact.awk > $@
-
-PTCP154.map: mapfiles/PTCP154 mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^0x/' IANA compact.awk > $@
-
-stdenc.map: mapfiles/stdenc.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^[0-9A-Fa-f]/' UNICODE compact.awk > $@
-
-symbol.map: mapfiles/symbol.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^[0-9A-Fa-f]/' UNICODE compact.awk > $@
-
-CP720.map: mapfiles/CP720.map
-       # Generating address@hidden
-       @cp $< $@
-
-CP858.map: mapfiles/CP858.map
-       # Generating address@hidden
-       @cp $< $@
-
-CP949-2BYTE.map: ${GLIBC_CHARMAPS}/CP949.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[89a-f]/' GLIBC-2 compact.awk > $@
-
-GB2312.map: ${GLIBC_CHARMAPS}/GB2312.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[a-f]/' GLIBC-2-7 compact.awk > $@
-
-GBK.map: ${GLIBC_CHARMAPS}/GBK.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[89a-f]/' GLIBC-2 compact.awk > $@
-
-GB180302.map: ${GLIBC_CHARMAPS}/GB18030.gz mapconv gb180302.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x..\/x..[    ]/' GLIBC-2 gb180302.awk > $@
-
-GB180304.map: GB180302.map gb180304.awk
-       # Generating address@hidden
-       @$(AWK) -f gb180304.awk < $< > $@
-
-JISX0201.map: ${GLIBC_CHARMAPS}/JIS_X0201.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[0-9]/' GLIBC-1 compact.awk > $@
-       @echo "# Generated by hand" >> $@
-       @echo "0xA1-0xDF 0xFF61" >> $@
-
-JISX0208.map: ${GLIBC_CHARMAPS}/EUC-JP.gz mapconv
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[a-f]/' GLIBC-2-7 \
-         | sed 's/0x2015/0x2014/' > $@
-
-JISX0212.map: ${GLIBC_CHARMAPS}/EUC-JP.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x8f/ s,/x8f,,' GLIBC-2-7 compact.awk > $@
-
-jisx2131-filter: mapfiles/JISX213A.map
-       @sed -n -e '/^#/d' -e 's,.*0x\([0-9A-Z]*\)$$,/0x0*\1$$/d,p' < $< > $@
-
-JISX2131.map: ${GLIBC_CHARMAPS}/EUC-JISX0213.gz mapconv jisx2131-filter
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[a-f]/' GLIBC-2-7 \
-         | sed -f jisx2131-filter \
-         | sed -e 's/0x2015/0x2014/' -e 's/0x2299/0x29BF/' > $@
-
-JISX2132.map: ${GLIBC_CHARMAPS}/EUC-JISX0213.gz mapconv
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x8f/ s,/x8f,,' GLIBC-2-7 > $@
-
-JISX213A.map: mapfiles/JISX213A.map
-       # Generating $@
-       @cp $<  $@
-
-CP932-2BYTE.map: mapfiles/CP932.TXT mapconv cp932.awk
-       # Generating address@hidden
-       @./mapconv $< '/^0x[89A-F][0-9A-F][0-9A-F]/' UNICODE2 cp932.awk > $@
-
-cp51932.el: CP932-2BYTE.map cp51932.awk
-       @$(AWK) -f cp51932.awk < CP932-2BYTE.map > $@
-
-eucjp-ms.el: ${GLIBC_CHARMAPS}/EUC-JP-MS.gz eucjp-ms.awk
-       @zcat $< | $(AWK) -f eucjp-ms.awk > $@
-
-JISC6226.map: mapfiles/Uni2JIS mapconv kuten.awk
-       # Generating address@hidden
-# As Uni2JIS doesn't contain mappings of characters added to Unicode
-# recently, we add them manually here (including one correction for
-# U+005C vs U+FF3C).  These changes are based on bogytech's blog at
-# http://bogytech.blogspot.jp/search/label/emacs.
-       @./mapconv $< '/^[^#].*0-/' YASUOKA kuten.awk \
-         | sed -e '/0x2140/s/005C/FF3C/' \
-               -e '$$ a 0x3442 0x3D4E' \
-               -e '$$ a 0x374E 0x25874' \
-               -e '$$ a 0x3764 0x28EF6' \
-               -e '$$ a 0x513D 0x2F80F' \
-               -e '$$ a 0x7045 0x9724' > $@
-
-KSC5601.map: ${GLIBC_CHARMAPS}/EUC-KR.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[a-f]/' GLIBC-2-7 compact.awk > $@
-
-BIG5.map: ${GLIBC_CHARMAPS}/BIG5.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[a-f]/' GLIBC-2 > $@
-
-BIG5-1.map: BIG5.map mapconv big5.awk
-       # Generating address@hidden
-       @echo "# Generated from $<" > $@
-       @sed -n -e '/0xa140/,/0xc8fe/p' < $< | gawk -f big5.awk >> $@
-
-BIG5-2.map: BIG5.map mapconv big5.awk
-       # Generating address@hidden
-       @echo "# Generated from $<" > $@
-       @sed -n -e '/0xc940/,$$ p' < $< | gawk -f big5.awk >> $@
-
-BIG5-HKSCS.map: ${GLIBC_CHARMAPS}/BIG5-HKSCS.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[89a-f].\//' GLIBC-2 compact.awk > $@
-
-JOHAB.map: ${GLIBC_CHARMAPS}/JOHAB.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[89a-f]/' GLIBC-2 compact.awk > $@
-
-CNS-1.map: ${GLIBC_CHARMAPS}/EUC-TW.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x[a-f]/' GLIBC-2-7 compact.awk > $@
-
-# CNS-1.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-#      # Generating address@hidden
-#      @./mapconv $< '/^C1/' KANJI-DATABASE compact.awk > $@
-
-CNS-2.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^C2/' KANJI-DATABASE compact.awk > $@
-
-CNS-3.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^C3/' KANJI-DATABASE compact.awk > $@
-
-CNS-4.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^C4/' KANJI-DATABASE compact.awk > $@
-
-CNS-5.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^C5/' KANJI-DATABASE compact.awk > $@
-
-CNS-6.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^C6/' KANJI-DATABASE compact.awk > $@
-
-CNS-7.map: mapfiles/cns2ucsdkw.txt mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^C7/' KANJI-DATABASE compact.awk > $@
-
-CNS-F.map: ${GLIBC_CHARMAPS}/EUC-TW.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*\/x8e\/xaf/ s,/x8e/xaf,,' GLIBC-2-7 compact.awk > $@
-
-# General target to produce map files for mule charsets.
-MULE-%.map: mapfiles/MULE-%.map
-       # Generating address@hidden
-       @cp $< $@
-
-# General target to produce map files for ISO-8859, GEORGIAN, and
-# EBCDIC charsets.  We can not use the original file name because of
-# file name limit on DOS.  "KA" is ISO 639 language code for Georgian.
-
-8859-%.map: ${GLIBC_CHARMAPS}/ISO-8859-%.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x/' GLIBC-1 compact.awk > $@
-
-KA-%.map: ${GLIBC_CHARMAPS}/GEORGIAN-%.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x/' GLIBC-1 compact.awk > $@
-
-EBCDIC%.map: ${GLIBC_CHARMAPS}/EBCDIC-%.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x/' GLIBC-1 compact.awk > $@
-
-# General target to produce map files for single-byte charsets.
-
-%.map: ${GLIBC_CHARMAPS}/%.gz mapconv compact.awk
-       # Generating address@hidden
-       @./mapconv $< '/^<.*[   ]\/x/' GLIBC-1 compact.awk > $@
-
-install:
-       @for f in ${CHARSETS}; do \
-         if test -r $$f; then \
-           if ! cmp -s $$f ../../etc/charsets/$$f; then \
-             echo updating $$f; \
-             cp $$f ../../etc/charsets; \
-           fi; \
-         fi; \
-       done
-       @for f in ${TRANS_TABLE}; do \
-         if test -r $$f; then \
-           if ! cmp -s $$f ../../lisp/international/$$f; then \
-             echo updating $$f; \
-             cp $$f ../../lisp/international; \
-           fi; \
-         fi; \
-       done
-
-# Clear files that are automatically generated.
-clean:
-       rm -f ${CHARSETS} ${TRANS_TABLE} ${SED_SCRIPT}
-
diff --git a/admin/charsets/Makefile.in b/admin/charsets/Makefile.in
new file mode 100644
index 0000000..0b96cd1
--- /dev/null
+++ b/admin/charsets/Makefile.in
@@ -0,0 +1,335 @@
+### @configure_input@
+
+# Copyright (C) 2015 Free Software Foundation, Inc.
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+#   National Institute of Advanced Industrial Science and Technology (AIST)
+#   Registration Number H13PRO009
+#
+# 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:
+
+# Generate charset maps in etc/charsets.
+
+#  If your system doesn't have the directory /usr/share/i18n/charmaps,
+#  get the source of the latest glibc, gzip all the charmap files in
+#  the directory "localedate/charmaps", and set the variable
+#  GLIBC_CHARMAPS to that directory.
+
+SHELL = @SHELL@
+
+AWK = @AWK@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+charsetdir = ${top_srcdir}/etc/charsets
+lispintdir = ${top_srcdir}/lisp/international
+mapfiledir = ${srcdir}/mapfiles
+
+GLIBC_CHARMAPS=/usr/share/i18n/charmaps
+
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_V_GEN = $(address@hidden@)
+am__v_GEN_ = $(address@hidden@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+
+AM_V_at = $(address@hidden@)
+am__v_at_ = $(address@hidden@)
+am__v_at_0 = @
+am__v_at_1 =
+
+# Note: We can not prepend "ISO-" to these map files because of file
+# name limits on DOS.
+ISO8859 = \
+       8859-2.map 8859-3.map 8859-4.map 8859-5.map 8859-6.map 8859-7.map \
+       8859-8.map 8859-9.map 8859-10.map 8859-11.map 8859-13.map 8859-14.map \
+       8859-15.map 8859-16.map
+
+IBM = \
+       IBM037.map IBM038.map \
+       IBM256.map IBM273.map IBM274.map IBM275.map IBM277.map IBM278.map \
+       IBM280.map IBM281.map IBM284.map IBM285.map IBM290.map IBM297.map \
+       IBM420.map IBM423.map IBM424.map IBM437.map IBM500.map IBM850.map \
+       IBM851.map IBM852.map IBM855.map IBM856.map IBM857.map IBM860.map \
+       IBM861.map IBM862.map IBM863.map IBM864.map IBM865.map IBM866.map \
+       IBM868.map IBM869.map IBM870.map IBM871.map IBM874.map IBM875.map \
+       IBM880.map IBM891.map IBM903.map IBM904.map IBM905.map IBM918.map \
+       IBM1004.map IBM1026.map IBM1047.map
+
+CODEPAGE = \
+       CP737.map CP775.map CP1125.map\
+       CP1250.map CP1251.map CP1252.map CP1253.map CP1254.map \
+       CP1255.map CP1256.map CP1257.map CP1258.map \
+       CP10007.map \
+       CP720.map CP858.map
+
+CJK =   GB2312.map GBK.map GB180302.map GB180304.map \
+       BIG5.map BIG5-HKSCS.map\
+       CNS-1.map CNS-2.map CNS-3.map CNS-4.map CNS-5.map CNS-6.map CNS-7.map \
+       CNS-F.map \
+       JISX0201.map JISX0208.map JISX0212.map JISX2131.map JISX2132.map \
+       JISC6226.map CP932-2BYTE.map JISX213A.map\
+       KSC5601.map KSC5636.map JOHAB.map
+
+MISC =  KOI-8.map KOI8-R.map KOI8-U.map KOI8-T.map ALTERNATIVNYJ.map \
+       MIK.map PTCP154.map \
+       TIS-620.map VISCII.map VSCII.map VSCII-2.map\
+       KA-PS.map KA-ACADEMY.map \
+       HP-ROMAN8.map NEXTSTEP.map MACINTOSH.map EBCDICUK.map EBCDICUS.map \
+       stdenc.map symbol.map \
+       CP949-2BYTE.map \
+       BIG5-1.map BIG5-2.map
+
+# Emacs-mule charsets.
+MULE = MULE-ethiopic.map MULE-ipa.map MULE-is13194.map \
+       MULE-sisheng.map MULE-tibetan.map \
+       MULE-lviscii.map MULE-uviscii.map
+
+SED_SCRIPT = jisx2131-filter
+
+TRANS_TABLE = cp51932.el eucjp-ms.el
+TRANS_TABLE := $(addprefix ${lispintdir}/,${TRANS_TABLE})
+
+CHARSETS = ${ISO8859} ${IBM} ${CODEPAGE} ${CJK} ${MISC} ${MULE}
+CHARSETS := $(addprefix ${charsetdir}/,${CHARSETS})
+
+## Those charsets whose source is not in GLIBC_CHARMAPS.
+LOCAL = MIK.map PTCP154.map stdenc.map symbol.map CP720.map CP858.map \
+  JISX213A.map CP932-2BYTE.map JISC6226.map \
+  CNS-2.map CNS-3.map CNS-4.map CNS-5.map CNS-6.map CNS-7.map \
+  ${MULE}
+LOCAL := $(addprefix ${charsetdir}/,${LOCAL})
+
+
+.PHONY: all local
+
+all: ${CHARSETS} ${TRANS_TABLE}
+local: ${LOCAL} ${lispintdir}/cp51932.el
+
+## Rules for each charset.
+
+mapconv = ${srcdir}/mapconv
+run_mapconv = AWK=${AWK} ${srcdir}/mapconv
+big5 = ${srcdir}/big5.awk
+compact = ${srcdir}/compact.awk
+cp51932 = ${srcdir}/cp51932.awk
+cp932 = ${srcdir}/cp932.awk
+eucjp_ms = ${srcdir}/eucjp-ms.awk
+gb180302 = ${srcdir}/gb180302.awk
+gb180304 = ${srcdir}/gb180304.awk
+kuten = ${srcdir}/kuten.awk
+
+## Short aliases, eg VSCII.map = ${charsetdir}/VSCII.map
+define map_template
+ .PHONY: $(notdir ${1})
+ $(notdir ${1}): ${1}
+endef
+
+$(foreach mfile,${CHARSETS} ${TRANS_TABLE},$(eval $(call 
map_template,$(mfile))))
+
+${charsetdir}/VSCII.map: ${GLIBC_CHARMAPS}/TCVN5712-1.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[0-9a-f].[  ]/' GLIBC-1 
${compact} > $@
+
+${charsetdir}/VSCII-2.map: ${GLIBC_CHARMAPS}/TCVN5712-1.gz ${mapconv} 
${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[2-7a-f].[  ]/' GLIBC-1 
${compact} \
+         | sed 's/0x20-0x7F.*/0x00-0x7F 0x0000/' > $@
+
+${charsetdir}/ALTERNATIVNYJ.map: ${charsetdir}/IBM866.map
+       ${AM_V_GEN}(echo "# Modified from $(notdir $<) according to the chart 
at" && \
+         echo "# http://www.cyrillic.com/ref/cyrillic/koi-8alt.html,"; && \
+         echo "# with guesses for the Unicodes of the glyphs." && \
+         sed -e '1 d' \
+            -e '/0xF2/ s/ .*/ 0x2019/' \
+            -e '/0xF3/ s/ .*/ 0x2018/' \
+            -e '/0xF4/ s/ .*/ 0x0301/' \
+            -e '/0xF5/ s/ .*/ 0x0300/' \
+            -e '/0xF6/ s/ .*/ 0x203A/' \
+            -e '/0xF7/ s/ .*/ 0x2039/' \
+            -e '/0xF8/ s/ .*/ 0x2191/' \
+            -e '/0xF9/ s/ .*/ 0x2193/' \
+            -e '/0xFA/ s/ .*/ 0x00B1/' \
+            -e '/0xFB/ s/ .*/ 0x00F7/' < $< ) > $@
+
+${charsetdir}/MIK.map: ${mapfiledir}/bulgarian-mik.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '1,$$' CZYBORRA ${compact} > $@
+
+${charsetdir}/PTCP154.map: ${mapfiledir}/PTCP154 ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^0x/' IANA ${compact} > $@
+
+${charsetdir}/stdenc.map: ${mapfiledir}/stdenc.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^[0-9A-Fa-f]/' UNICODE ${compact} > $@
+
+${charsetdir}/symbol.map: ${mapfiledir}/symbol.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^[0-9A-Fa-f]/' UNICODE ${compact} > $@
+
+${charsetdir}/CP720.map: ${mapfiledir}/CP720.map
+       ${AM_V_GEN}cp $< $@
+
+${charsetdir}/CP858.map: ${mapfiledir}/CP858.map
+       ${AM_V_GEN}cp $< $@
+
+${charsetdir}/CP949-2BYTE.map: ${GLIBC_CHARMAPS}/CP949.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[89a-f]/' GLIBC-2 
${compact} > $@
+
+${charsetdir}/GB2312.map: ${GLIBC_CHARMAPS}/GB2312.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[a-f]/' GLIBC-2-7 
${compact} > $@
+
+${charsetdir}/GBK.map: ${GLIBC_CHARMAPS}/GBK.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[89a-f]/' GLIBC-2 
${compact} > $@
+
+${charsetdir}/GB180302.map: ${GLIBC_CHARMAPS}/GB18030.gz ${mapconv} ${gb180302}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x..\/x..[    ]/' GLIBC-2 
${gb180302} > $@
+
+${charsetdir}/GB180304.map: ${charsetdir}/GB180302.map ${gb180304}
+       ${AM_V_GEN}$(AWK) -f ${gb180304} < $< > $@
+
+${charsetdir}/JISX0201.map: ${GLIBC_CHARMAPS}/JIS_X0201.gz ${mapconv} 
${compact}
+       ${AM_V_GEN}(${mapconv} $< '/^<.*[       ]\/x[0-9]/' GLIBC-1 ${compact} 
&& \
+         echo "# Generated by hand" && \
+         echo "0xA1-0xDF 0xFF61" ) > $@
+
+${charsetdir}/JISX0208.map: ${GLIBC_CHARMAPS}/EUC-JP.gz ${mapconv}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[a-f]/' GLIBC-2-7 \
+         | sed 's/0x2015/0x2014/' > $@
+
+${charsetdir}/JISX0212.map: ${GLIBC_CHARMAPS}/EUC-JP.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x8f/ s,/x8f,,' GLIBC-2-7 
${compact} > $@
+
+jisx2131-filter: ${mapfiledir}/JISX213A.map
+       ${AM_V_at}sed -n -e '/^#/d' -e 's,.*0x\([0-9A-Z]*\)$$,/0x0*\1$$/d,p' < 
$< > $@
+
+${charsetdir}/JISX2131.map: ${GLIBC_CHARMAPS}/EUC-JISX0213.gz ${mapconv} 
jisx2131-filter
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[a-f]/' GLIBC-2-7 \
+         | sed -f jisx2131-filter \
+         | sed -e 's/0x2015/0x2014/' -e 's/0x2299/0x29BF/' > $@
+
+${charsetdir}/JISX2132.map: ${GLIBC_CHARMAPS}/EUC-JISX0213.gz ${mapconv}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x8f/ s,/x8f,,' GLIBC-2-7 > $@
+
+${charsetdir}/JISX213A.map: ${mapfiledir}/JISX213A.map
+       ${AM_V_GEN}cp $< $@
+
+${charsetdir}/CP932-2BYTE.map: ${mapfiledir}/CP932.TXT ${mapconv} ${cp932}
+       ${AM_V_GEN}${run_mapconv} $< '/^0x[89A-F][0-9A-F][0-9A-F]/' UNICODE2 
${cp932} > $@
+
+${lispintdir}/cp51932.el: ${charsetdir}/CP932-2BYTE.map ${cp51932}
+       ${AM_V_GEN}$(AWK) -f ${cp51932} < $< > $@
+
+${lispintdir}/eucjp-ms.el: ${GLIBC_CHARMAPS}/EUC-JP-MS.gz ${eucjp_ms}
+       ${AM_V_GEN}gunzip -c $< | $(AWK) -f ${eucjp_ms} > $@
+
+# As Uni2JIS doesn't contain mappings of characters added to Unicode
+# recently, we add them manually here (including one correction for
+# U+005C vs U+FF3C).  These changes are based on bogytech's blog at
+# http://bogytech.blogspot.jp/search/label/emacs.
+${charsetdir}/JISC6226.map: ${mapfiledir}/Uni2JIS ${mapconv} ${kuten}
+       ${AM_V_GEN}(${run_mapconv} $< '/^[^#].*0-/' YASUOKA ${kuten} \
+         | sed -e '/0x2140/s/005C/FF3C/' && \
+         echo '0x3442 0x3D4E' && echo '0x374E 0x25874' && \
+         echo '0x3764 0x28EF6' && echo '0x513D 0x2F80F' && \
+         echo '0x7045 0x9724' ) > $@
+
+${charsetdir}/KSC5601.map: ${GLIBC_CHARMAPS}/EUC-KR.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[a-f]/' GLIBC-2-7 
${compact} > $@
+
+${charsetdir}/BIG5.map: ${GLIBC_CHARMAPS}/BIG5.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[a-f]/' GLIBC-2 > $@
+
+${charsetdir}/BIG5-1.map: ${charsetdir}/BIG5.map ${mapconv} ${big5}
+       ${AM_V_GEN}(echo "# Generated from $(notdir $<)" && \
+         sed -n -e '/0xa140/,/0xc8fe/p' < $< | $(AWK) -f ${big5} ) > $@
+
+${charsetdir}/BIG5-2.map: ${charsetdir}/BIG5.map ${mapconv} ${big5}
+       ${AM_V_GEN}(echo "# Generated from $(notdir $<)" && \
+         sed -n -e '/0xc940/,$$ p' < $< | $(AWK) -f ${big5} ) > $@
+
+${charsetdir}/BIG5-HKSCS.map: ${GLIBC_CHARMAPS}/BIG5-HKSCS.gz ${mapconv} 
${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[89a-f].\//' GLIBC-2 
${compact} > $@
+
+${charsetdir}/JOHAB.map: ${GLIBC_CHARMAPS}/JOHAB.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[89a-f]/' GLIBC-2 
${compact} > $@
+
+${charsetdir}/CNS-1.map: ${GLIBC_CHARMAPS}/EUC-TW.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x[a-f]/' GLIBC-2-7 
${compact} > $@
+
+# ${charsetdir}/CNS-1.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+#      ${AM_V_GEN}${run_mapconv} $< '/^C1/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-2.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^C2/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-3.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^C3/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-4.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^C4/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-5.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^C5/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-6.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^C6/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-7.map: ${mapfiledir}/cns2ucsdkw.txt ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^C7/' KANJI-DATABASE ${compact} > $@
+
+${charsetdir}/CNS-F.map: ${GLIBC_CHARMAPS}/EUC-TW.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*\/x8e\/xaf/ s,/x8e/xaf,,' GLIBC-2-7 
${compact} > $@
+
+# General target to produce map files for mule charsets.
+${charsetdir}/MULE-%.map: ${mapfiledir}/MULE-%.map
+       ${AM_V_GEN}cp $< $@
+
+# General target to produce map files for ISO-8859, GEORGIAN, and
+# EBCDIC charsets.  We can not use the original file name because of
+# file name limit on DOS.  "KA" is ISO 639 language code for Georgian.
+
+${charsetdir}/8859-%.map: ${GLIBC_CHARMAPS}/ISO-8859-%.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x/' GLIBC-1 ${compact} > $@
+
+${charsetdir}/KA-%.map: ${GLIBC_CHARMAPS}/GEORGIAN-%.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x/' GLIBC-1 ${compact} > $@
+
+${charsetdir}/EBCDIC%.map: ${GLIBC_CHARMAPS}/EBCDIC-%.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x/' GLIBC-1 ${compact} > $@
+
+# General target to produce map files for single-byte charsets.
+
+${charsetdir}/%.map: ${GLIBC_CHARMAPS}/%.gz ${mapconv} ${compact}
+       ${AM_V_GEN}${run_mapconv} $< '/^<.*[    ]\/x/' GLIBC-1 ${compact} > $@
+
+
+.PHONY: clean bootstrap-clean distclean maintainer-clean extraclean totalclean
+
+clean:
+       rm -f ${SED_SCRIPT}
+
+bootstrap-clean: clean
+
+distclean: clean
+       rm -f Makefile
+
+maintainer-clean: distclean
+
+## Do not remove these files, even in a bootstrap.  They rarely change.
+extraclean:
+       rm -f ${LOCAL} ${TRANS_TABLE}
+
+totalclean: extraclean
+       rm -f ${CHARSETS}
diff --git a/admin/charsets/mapconv b/admin/charsets/mapconv
index 8433d22..245dce1 100755
--- a/admin/charsets/mapconv
+++ b/admin/charsets/mapconv
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+# Copyright (C) 2015 Free Software Foundation, Inc.
+
 # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 #   National Institute of Advanced Industrial Science and Technology (AIST)
 #   Registration Number H13PRO009
@@ -33,8 +35,15 @@
 #      GLIBC-1 GLIBC-2 GLIBC-2-7 CZYBORRA IANA UNICODE UNICODE2 YASUOKA
 #   $4: awk script
 
-FILE="admin/charsets/$1"
-BASE=`basename $1 .gz`
+## So that eg [A-F] as used by KANJI-DATABASE branch below works as expected.
+## Otherwise with LANG=en_US.utf8, CNS-6.map was generated with a
+## bogus entry.  By experiment, LC_COLLATE=C was not enough.
+export LC_ALL=C
+
+BASE=`expr "$1" : '.*/\(.*\)' '|' "$1"` # basename
+FILE="admin/charsets/mapfiles/$BASE"
+BASE=`expr "$BASE" : '\(.*\)\.gz$' '|' "$BASE"` # remove any .gz suffix
+AWK=${AWK:-awk}
 
 case "$3" in
     GLIBC*)
@@ -69,7 +78,7 @@ fi
 
 if [ -n "$4" ] ; then
     if [ -f "$4" ] ; then
-       AWKPROG="gawk -f $4"
+       AWKPROG="$AWK -f $4"
     else
        echo "Awk program does not exist: $4"
        exit 1
@@ -81,20 +90,20 @@ fi
 if [ "$3" = "GLIBC-1" ] ; then
     # Source format is:
     #   <UYYYY>        /xXX
-    zcat $1 | sed -n -e "$2 p" \
+    gunzip -c $1 | sed -n -e "${2}p" \
        | sed -e 's,<U\([^>]*\)>[       ]*/x\(..\).*,0x\2 0x\1,' \
        | sort | ${AWKPROG}
 elif [ "$3" = "GLIBC-2" ] ; then
     # Source format is:
     #   <UYYYY>        /xXX/xZZ
-    zcat $1 | sed -n -e "$2 p" \
+    gunzip -c $1 | sed -n -e "${2}p" \
        | sed -e 's,<U\([^>]*\)>[       ]*/x\(..\)/x\(..\).*,0x\2\3 0x\1,' \
        | sort | ${AWKPROG}
 elif [ "$3" = "GLIBC-2-7" ] ; then
     # Source format is:
     #   <UYYYY>        /xXX/xZZ
     # We must drop MSBs of XX and ZZ
-    zcat $1 | sed -n -e "$2 p" \
+    gunzip -c $1 | sed -n -e "${2}p" \
        | sed -e 's/xa/x2/g' -e 's/xb/x3/g' -e 's/xc/x4/g' \
              -e 's/xd/x5/g' -e 's/xe/x6/g' -e 's/xf/x7/g' \
              -e 's,<U\([^>]*\)>[       ]*/x\(..\)/x\(..\).*,0x\2\3 0x\1,' \
@@ -102,13 +111,13 @@ elif [ "$3" = "GLIBC-2-7" ] ; then
 elif [ "$3" = "CZYBORRA" ] ; then
     # Source format is:
     #   =XX    U+YYYY
-    sed -n -e "$2 p" < $1 \
+    sed -n -e "${2}p" < $1 \
        | sed -e 's/=\(..\)[^U]*U+\([0-9A-F]*\).*/0x\1 0x\2/' \
        | sort | ${AWKPROG}
 elif [ "$3" = "IANA" ] ; then
     # Source format is:
     #   0xXX   0xYYYY
-    sed -n -e "$2 p" < $1 \
+    sed -n -e "${2}p" < $1 \
        | sed -e 's/\(0x[0-9A-Fa-f]*\)[^0]*\(0x[0-9A-Fa-f]*\).*/\1 \2/' \
        | sort | ${AWKPROG}
 elif [ "$3" = "UNICODE" ] ; then
@@ -116,25 +125,25 @@ elif [ "$3" = "UNICODE" ] ; then
     #   YYYY   XX
     # We perform reverse sort to prefer the first one in the
     # duplicated mappings (e.g. 0x20->U+0020, 0x20->U+00A0).
-    sed -n -e "$2 p" < $1 \
+    sed -n -e "${2}p" < $1 \
        | sed -e 's/\([0-9A-F]*\)[^0-9A-F]*\([0-9A-F]*\).*/0x\2 0x\1/' \
        | sort -r
 elif [ "$3" = "UNICODE2" ] ; then
     # Source format is:
     #   0xXXXX 0xYYYY  # ...
-    sed -n -e "$2 p" < $1 \
+    sed -n -e "${2}p" < $1 \
        | sed -e 's/\([0-9A-Fx]*\)[^0]*\([0-9A-Fx]*\).*/\1 \2/' \
        | ${AWKPROG} | sort -n -k 4,4
 elif [ "$3" = "YASUOKA" ] ; then
     # Source format is:
     # YYYY     0-XXXX (XXXX is a Kuten code)
-    sed -n -e "$2 p" < $1 \
+    sed -n -e "${2}p" < $1 \
        | sed -e 's/\([0-9A-F]*\)[^0]*0-\([0-9]*\).*/0x\2 0x\1/' \
        | sort | ${AWKPROG}
 elif [ "$3" = "KANJI-DATABASE" ] ; then
     # Source format is:
     # C?-XXXX U+YYYYY .....
-    sed -n -e "$2 p" < $1 \
+    sed -n -e "${2}p" < $1 \
        | sed -e 's/...\(....\) U+\([0-9A-F]*\).*/0x\1 0x\2/' \
        | sort | ${AWKPROG}
 else
diff --git a/admin/charsets/mapfiles/PTCP154 b/admin/charsets/mapfiles/PTCP154
index 1d76058..ab493e5 100644
--- a/admin/charsets/mapfiles/PTCP154
+++ b/admin/charsets/mapfiles/PTCP154
@@ -288,4 +288,4 @@ e-mail: auskov&idc.kz
 Intended usage:
 COMMON
 
-(record created 2002-09-27)
\ No newline at end of file
+(record created 2002-09-27)
diff --git a/admin/notes/unicode b/admin/notes/unicode
index 028bcc1..ebec417 100644
--- a/admin/notes/unicode
+++ b/admin/notes/unicode
@@ -245,6 +245,25 @@ nontrivial changes to the build process.
        lisp/leim/quail/ethiopic.el
        lisp/leim/quail/tibetan.el
 
+ * binary files
+
+     These files contain binary data, and are not text files.
+     Some of the entries in this list are patterns, and stand for any
+     files with the listed extension.
+
+       *.gz
+       *.icns
+       *.ico
+       *.pbm
+       *.pdf
+       *.png
+       *.sig
+       etc/e/eterm-color
+       etc/package-keyring.gpg
+       msdos/emacs.pif
+       nextstep/GNUstep/Emacs.base/Resources/emacs.tiff
+       nt/icons/hand.cur
+
 
 This file is part of GNU Emacs.
 
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
index ad7c273..9abb693 100755
--- a/build-aux/gitlog-to-changelog
+++ b/build-aux/gitlog-to-changelog
@@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
     if 0;
 # Convert git log output to ChangeLog format.
 
-my $VERSION = '2015-05-08 06:05'; # UTC
+my $VERSION = '2015-05-19 01:37'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
@@ -74,6 +74,7 @@ OPTIONS:
                   the default is to convert all log entries.
    --until=DATE convert only the logs older than DATE.
    --ignore-matching=PAT ignore commit messages whose first lines match PAT.
+   --ignore-line=PAT ignore lines of commit messages that match PAT.
    --format=FMT set format string for commit subject and body;
                   see 'man git-log' for the list of format metacharacters;
                   the default is '%s%n%b%n'
@@ -228,6 +229,7 @@ sub git_dir_option($)
   my $append_dot = 0;
   my $cluster = 1;
   my $ignore_matching;
+  my $ignore_line;
   my $strip_tab = 0;
   my $strip_cherry_pick = 0;
   my $srcdir;
@@ -242,6 +244,7 @@ sub git_dir_option($)
      'append-dot' => \$append_dot,
      'cluster!' => \$cluster,
      'ignore-matching=s' => \$ignore_matching,
+     'ignore-line=s' => \$ignore_line,
      'strip-tab' => \$strip_tab,
      'strip-cherry-pick' => \$strip_cherry_pick,
      'srcdir=s' => \$srcdir,
@@ -349,6 +352,12 @@ sub git_dir_option($)
       if (! (defined $ignore_matching
              && @line && $line[0] =~ /$ignore_matching/))
         {
+          if (defined $ignore_line && @line)
+            {
+              @line = grep ! /$ignore_line/, @line;
+              while ($line[$#line] =~ /^\s*$/) { pop @line; }
+            }
+
           # Record whether there are two or more paragraphs.
           my $multi_paragraph = grep /^\s*$/, @line;
 
diff --git a/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog
index e38f896..d1b1af9 100755
--- a/build-aux/gitlog-to-emacslog
+++ b/build-aux/gitlog-to-emacslog
@@ -23,7 +23,7 @@ LC_ALL=C
 export LC_ALL
 
 # The newest revision that should not appear in the generated ChangeLog.
-gen_origin=d2c7e14ac3bd2b517d35a86255c28d5b6d779451
+gen_origin=f89080d18dd64e0c92c5f3d206182d65f23eafeb
 force=
 output=ChangeLog
 nmax=2
@@ -58,7 +58,7 @@ test -d .git || {
 
 # Use Gnulib's packaged ChangeLog generator.
 ./build-aux/gitlog-to-changelog --ignore-matching='^; ' \
-  --format='%B' \
+  --ignore-line='^; ' --format='%B' \
   "$gen_origin.." >"ChangeLog.tmp" || exit
 
 if test -s "ChangeLog.tmp"; then
diff --git a/configure.ac b/configure.ac
index fff3db9..a9fe095 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5271,7 +5271,8 @@ fi
 
 dnl The admin/ directory used to be excluded from tarfiles.
 if test -d $srcdir/admin; then
-  SUBDIR_MAKEFILES="$SUBDIR_MAKEFILES admin/unidata/Makefile 
admin/grammars/Makefile"
+  SUBDIR_MAKEFILES="$SUBDIR_MAKEFILES admin/charsets/Makefile 
admin/unidata/Makefile admin/grammars/Makefile"
+  AC_CONFIG_FILES([admin/charsets/Makefile])
   AC_CONFIG_FILES([admin/unidata/Makefile])
   AC_CONFIG_FILES([admin/grammars/Makefile])
 fi                              dnl -d admin
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index d5d9bb5..b12995b 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -3304,6 +3304,9 @@ fontset, whose short name is @samp{fontset-default}.
 @var{character} may be a script name.  In that case, use
 @var{font-spec} for all character in the charsets.
 
address@hidden may be a font-spec object created by the function
address@hidden (@pxref{Low-Level Font}).
+
 @var{font-spec} may be a cons; @code{(@var{family} . @var{registry})},
 where @var{family} is a family name of a font (possibly including a
 foundry name at the head), @var{registry} is a registry name of a font
@@ -3311,6 +3314,12 @@ foundry name at the head), @var{registry} is a registry 
name of a font
 
 @var{font-spec} may be a font name string.
 
address@hidden may be @code{nil}, which explicitly specifies that
+there's no font for the specified @var{character}.  This is useful,
+for example, to avoid expensive system-wide search for fonts for
+characters that have no glyphs, like those from the Unicode Private
+Use Area (PUA).
+
 The optional argument @var{add}, if address@hidden, specifies how to
 add @var{font-spec} to the font specifications previously set.  If it
 is @code{prepend}, @var{font-spec} is prepended.  If it is
@@ -6614,7 +6623,8 @@ Display a box containing the Unicode codepoint of the 
character, in
 hexadecimal notation.
 
 @item an @acronym{ASCII} string
-Display a box containing that string.
+Display a box containing that string.  The string should contain at
+most 6 @acronym{ASCII} characters.
 
 @item a cons cell @code{(@var{graphical} . @var{text})}
 Display with @var{graphical} on graphical displays, and with
@@ -6625,7 +6635,8 @@ must be one of the display methods described above.
 @noindent
 The @code{thin-space}, @code{empty-box}, @code{hex-code}, and
 @acronym{ASCII} string display methods are drawn with the
address@hidden face.
address@hidden face.  On text terminals, a box is emulated by
+square brackets, @samp{[]}.
 
 The char-table has one extra slot, which determines how to display any
 character that cannot be displayed with any available font, or cannot
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index e19472e..ddf81f3 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -659,6 +659,16 @@ Some window managers ignore program-specified positions.  
If you want to
 be sure the position you specify is not ignored, specify a
 address@hidden value for the @code{user-position} parameter as well.
 
+If the window manager refuses to align a frame at the left or top screen
+edge, combining position notation and @code{user-position} as in
+
address@hidden
+(modify-frame-parameters
+  nil '((user-position . t) (left . (+ -4))))
address@hidden example
+
+may help to override that.
+
 @vindex top, a frame parameter
 @item top
 The screen position of the top (or bottom) edge, in pixels, with respect
@@ -1624,7 +1634,8 @@ tooltip, it first runs the hook 
@code{delete-frame-functions} (each
 function gets one argument, @var{frame}).  By default, @var{frame} is
 the selected frame.
 
-A frame cannot be deleted if its minibuffer is used by other frames.
+A frame cannot be deleted as long as its minibuffer serves as surrogate
+minibuffer for another frame (@pxref{Minibuffers and Frames}).
 Normally, you cannot delete a frame if all other frames are invisible,
 but if @var{force} is address@hidden, then you are allowed to do so.
 @end deffn
@@ -1700,12 +1711,18 @@ you can get it with @code{minibuffer-window} 
(@pxref{Definition of
 minibuffer-window}).
 
 @cindex frame without a minibuffer
-However, you can also create a frame with no minibuffer.  Such a frame
-must use the minibuffer window of some other frame.  When you create the
-frame, you can explicitly specify the minibuffer window to use (in some
-other frame).  If you don't, then the minibuffer is found in the frame
-which is the value of the variable @code{default-minibuffer-frame}.  Its
-value should be a frame that does have a minibuffer.
address@hidden surrogate minibuffer frame
+However, you can also create a frame without a minibuffer.  Such a frame
+must use the minibuffer window of some other frame.  That other frame
+will serve as @dfn{surrogate minibuffer frame} for this frame and cannot
+be deleted via @code{delete-frame} (@pxref{Deleting Frames}) as long as
+this frame is live.
+
+When you create the frame, you can explicitly specify the minibuffer
+window to use (in some other frame).  If you don't, then the minibuffer
+is found in the frame which is the value of the variable
address@hidden  Its value should be a frame that does
+have a minibuffer.
 
 If you use a minibuffer-only frame, you might want that frame to raise
 when you enter the minibuffer.  If so, set the variable
diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi
index 28f90d9..f160184 100644
--- a/doc/lispref/nonascii.texi
+++ b/doc/lispref/nonascii.texi
@@ -540,8 +540,8 @@ property is used for bidirectional display.
 
 @item old-name
 Corresponds to the Unicode @code{Unicode_1_Name} property.  The value
-is a string.  Unassigned codepoints, and characters that have no value
-for this property, the value is @code{nil}.
+is a string.  For unassigned codepoints, and characters that have no
+value for this property, the value is @code{nil}.
 
 @item iso-10646-comment
 Corresponds to the Unicode @code{ISO_Comment} property.  The value is
diff --git a/doc/lispref/positions.texi b/doc/lispref/positions.texi
index e7c79d5..c972bbb 100644
--- a/doc/lispref/positions.texi
+++ b/doc/lispref/positions.texi
@@ -350,10 +350,11 @@ would move to.
 @deffn Command forward-line &optional count
 @cindex beginning of line
 This function moves point forward @var{count} lines, to the beginning of
-the line.  If @var{count} is negative, it moves point
address@hidden@var{count} lines backward, to the beginning of a line.  If
address@hidden is zero, it moves point to the beginning of the current
-line.  If @var{count} is @code{nil}, that means 1.
+the line following that.  If @var{count} is negative, it moves point
address@hidden@var{count} lines backward, to the beginning of a line
+preceding that.  If @var{count} is zero, it moves point to the
+beginning of the current line.  If @var{count} is @code{nil}, that
+means 1.
 
 If @code{forward-line} encounters the beginning or end of the buffer (or
 of the accessible portion) before finding that many lines, it sets point
@@ -362,7 +363,11 @@ there.  No error is signaled.
 @code{forward-line} returns the difference between @var{count} and the
 number of lines actually moved.  If you attempt to move down five lines
 from the beginning of a buffer that has only three lines, point stops at
-the end of the last line, and the value will be 2.
+the end of the last line, and the value will be 2.  As an explicit
+exception, if the last accessible line is non-empty, but has no
+newline (e.g., if the buffer ends without a newline), the function
+sets point to the end of that line, and the value returned by the
+function counts that line as one line successfully moved.
 
 In an interactive call, @var{count} is the numeric prefix argument.
 @end deffn
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 6da3582..b2bc637 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -2005,16 +2005,49 @@ list---both the global buffer list and the selected 
frame's buffer
 list (@pxref{Buffer List}).  However, this is not done if the
 optional argument @var{norecord} is address@hidden
 
-Sometimes, @code{switch-to-buffer} may be unable to display the buffer
-in the selected window.  This happens if the selected window is a
-minibuffer window, or if the selected window is strongly dedicated to
-its buffer (@pxref{Dedicated Windows}).  In that case, the command
-normally tries to display the buffer in some other window, by invoking
address@hidden (see below).  However, if the optional argument
address@hidden is address@hidden, it signals an error
-instead.
+Sometimes, the selected window may not be suitable for displaying the
+buffer.  This happens if the selected window is a minibuffer window, or
+if the selected window is strongly dedicated to its buffer
+(@pxref{Dedicated Windows}).  In such cases, the command normally tries
+to display the buffer in some other window, by invoking
address@hidden (see below).
+
+If the optional argument @var{force-same-window} is address@hidden and
+the selected window is not suitable for displaying the buffer, this
+function always signals an error when called non-interactively.  In
+interactive use, if the selected window is a minibuffer window, this
+function will try to use some other window instead.  If the selected
+window is strongly dedicated to its buffer, the option
address@hidden described next can be used
+to proceed.
 @end deffn
 
address@hidden switch-to-buffer-in-dedicated-window
+This option, if address@hidden, allows @code{switch-to-buffer} to
+proceed when called interactively and the selected window is strongly
+dedicated to its buffer.
+
+The following values are respected:
+
address@hidden @code
address@hidden nil
+Disallows switching and signals an error as in non-interactive use.
+
address@hidden prompt
+Prompts the user whether to allow switching.
+
address@hidden pop
+Invokes @code{pop-to-buffer} to proceed.
+
address@hidden t
+Marks the selected window as non-dedicated and proceeds.
address@hidden table
+
+When called non-interactively, @code{switch-to-buffer} always signals an
+error when the selected window is dedicated to its buffer and
address@hidden is address@hidden
address@hidden defopt
+
 By default, @code{switch-to-buffer} shows the buffer at its position of
 @code{point}.  This behavior can be tuned using the following option.
 
diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi
index 9e570da..56aea0c 100644
--- a/doc/misc/erc.texi
+++ b/doc/misc/erc.texi
@@ -753,6 +753,26 @@ If non, @code{nil}, this is a list of IRC message types to 
hide, e.g.:
 @end example
 @end defopt
 
address@hidden erc-network-hide-list
+If non, @code{nil}, this is a list of IRC networks and message types
+to hide, e.g.:
+
address@hidden
+(setq erc-network-hide-list (("freenode" "JOIN" "PART" "QUIT")
+("OFTC" "JOIN" "PART""))
address@hidden example
address@hidden defopt
+
address@hidden erc-channel-hide-list
+If non, @code{nil}, this is a list of IRC channels and message types
+to hide, e.g.:
+
address@hidden
+(setq erc-channel-hide-list (("#erc" "JOIN" "PART" "QUIT")
+("#emacs" "NICK"))
address@hidden example
address@hidden defopt
+
 @defopt erc-lurker-hide-list
 Like @code{erc-hide-list}, but only applies to messages sent by
 lurkers.  The function @code{erc-lurker-p} determines whether a given
diff --git a/etc/NEWS b/etc/NEWS
index fdd0c87..7ad85ba 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -165,7 +165,7 @@ 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.
 
-** The new `directory-name-p' can be used to check whether a file
+** 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.
@@ -249,6 +249,13 @@ Unicode standards.
 
 ** The `save-place' variable is replaced by a `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.
+
 ** Midnight-mode
 *** `midnight-mode' is a proper minor mode.
 *** clean-buffer-*-regexps can now specify buffers via predicate functions.
@@ -585,8 +592,8 @@ nil to disable this.
 fitting for use in money calculations; 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 and .hxx.
@@ -675,6 +682,20 @@ command line's password prompt.
 *** The new built-in command `clear' can scroll window contents out of sight.
 If provided with an optional non-nil argument, the scrollback contents will be 
cleared.
 
+*** New buffer syntax '#<buffer-name>', which is equivalent to
+'#<buffer buffer-name>'.  This shorthand makes interacting with
+buffers from eshell more convenient.  Custom variable
+`eshell-buffer-shorthand', which has been broken for a while, has been
+removed.
+
+*** By default, eshell "visual" program buffers (created by
+`eshell-visual-commands' and similar custom vars) are no longer killed
+when their processes die.  This fixes issues with short-lived commands
+and makes visual programs more useful in general.  For example, if
+"git log" is a visual command, it will always show the visual command
+buffer, even if the "git log" process dies.  For the old behavior,
+make the new option `eshell-destroy-buffer-when-process-dies' non-nil.
+
 ** Browse-url
 
 *** Support for the Conkeror web browser.
@@ -720,6 +741,10 @@ a typographically-correct documents.
 
 * Incompatible Lisp Changes in Emacs 25.1
 
+** 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.)
+
 ** `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.
@@ -737,7 +762,7 @@ If you want the old behavior of calling the function in the 
buffer
 from which the minibuffer was entered, call it with the new argument
 `switch-buffer'.
 
-** window-configurations no longer record the buffers's marks.
+** window-configurations no longer record the buffers' marks.
 
 ** inhibit-modification-hooks now also inhibits lock-file checks, as well as
 active region handling.
@@ -942,6 +967,11 @@ fullwidth frames, the behavior may depend on the toolkit 
used.
 windows without "fixing" it.  It's supported by `fit-window-to-buffer',
 `temp-buffer-resize-mode' and `display-buffer'.
 
++++
+** 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.
+
 ** Tearoff menus and detachable toolbars for Gtk+ has been removed.
 Those features have been deprecated in Gtk+ for a long time.
 
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 806275f..357ebc7 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -107,13 +107,13 @@ char *w32_getenv (char *);
 /* Name used to invoke this program.  */
 const char *progname;
 
-/* The second argument to main. */
+/* The second argument to main.  */
 char **main_argv;
 
 /* Nonzero means don't wait for a response from Emacs.  --no-wait.  */
 int nowait = 0;
 
-/* Nonzero means don't print messages for successful operations.  --quiet. */
+/* Nonzero means don't print messages for successful operations.  --quiet.  */
 int quiet = 0;
 
 /* Nonzero means args are expressions to be evaluated.  --eval.  */
@@ -131,7 +131,7 @@ const char *alt_display = NULL;
 /* The parent window ID, if we are opening a frame via XEmbed.  */
 char *parent_id = NULL;
 
-/* Nonzero means open a new Emacs frame on the current terminal. */
+/* Nonzero means open a new Emacs frame on the current terminal.  */
 int tty = 0;
 
 /* If non-NULL, the name of an editor to fallback to if the server
@@ -148,7 +148,7 @@ const char *server_file = NULL;
 int emacs_pid = 0;
 
 /* If non-NULL, a string that should form a frame parameter alist to
-   be used for the new frame */
+   be used for the new frame.  */
 const char *frame_parameters = NULL;
 
 static _Noreturn void print_help_and_exit (void);
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 7bacbd3..28729da 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -116,6 +116,7 @@ char pot_etags_version[] = "@(#) pot revision number is 
17.38.1.4";
 # undef HAVE_NTGUI
 # undef  DOS_NT
 # define DOS_NT
+# define O_CLOEXEC O_NOINHERIT
 #endif /* WINDOWSNT */
 
 #include <unistd.h>
@@ -125,6 +126,7 @@ char pot_etags_version[] = "@(#) pot revision number is 
17.38.1.4";
 #include <sysstdio.h>
 #include <ctype.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <binary-io.h>
@@ -336,6 +338,7 @@ static char *absolute_filename (char *, char *);
 static char *absolute_dirname (char *, char *);
 static bool filename_is_absolute (char *f);
 static void canonicalize_filename (char *);
+static char *etags_mktmp (void);
 static void linebuffer_init (linebuffer *);
 static void linebuffer_setlen (linebuffer *, int);
 static void *xmalloc (size_t);
@@ -1437,7 +1440,7 @@ process_file_name (char *file, language *lang)
   fdesc *fdp;
   compressor *compr;
   char *compressed_name, *uncompressed_name;
-  char *ext, *real_name;
+  char *ext, *real_name, *tmp_name;
   int retval;
 
   canonicalize_filename (file);
@@ -1522,9 +1525,20 @@ process_file_name (char *file, language *lang)
     }
   if (real_name == compressed_name)
     {
-      char *cmd = concat (compr->command, " ", real_name);
-      inf = popen (cmd, "r" FOPEN_BINARY);
-      free (cmd);
+      tmp_name = etags_mktmp ();
+      if (!tmp_name)
+       inf = NULL;
+      else
+       {
+         char *cmd1 = concat (compr->command, " ", real_name);
+         char *cmd = concat (cmd1, " > ", tmp_name);
+         free (cmd1);
+         if (system (cmd) == -1)
+           inf = NULL;
+         else
+           inf = fopen (tmp_name, "r" FOPEN_BINARY);
+         free (cmd);
+       }
     }
   else
     inf = fopen (real_name, "r" FOPEN_BINARY);
@@ -1536,10 +1550,12 @@ process_file_name (char *file, language *lang)
 
   process_file (inf, uncompressed_name, lang);
 
+  retval = fclose (inf);
   if (real_name == compressed_name)
-    retval = pclose (inf);
-  else
-    retval = fclose (inf);
+    {
+      remove (tmp_name);
+      free (tmp_name);
+    }
   if (retval < 0)
     pfatal (file);
 
@@ -1707,9 +1723,6 @@ find_entries (FILE *inf)
        }
     }
 
-  /* We rewind here, even if inf may be a pipe.  We fail if the
-     length of the first line is longer than the pipe block size,
-     which is unlikely. */
   rewind (inf);
 
   /* Else try to guess the language given the case insensitive file name. */
@@ -1734,8 +1747,6 @@ find_entries (FILE *inf)
       if (old_last_node == last_node)
        /* No Fortran entries found.  Try C. */
        {
-         /* We do not tag if rewind fails.
-            Only the file name will be recorded in the tags file. */
          rewind (inf);
          curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
          find_entries (inf);
@@ -5015,8 +5026,6 @@ TEX_mode (FILE *inf)
       TEX_opgrp = '<';
       TEX_clgrp = '>';
     }
-  /* If the input file is compressed, inf is a pipe, and rewind may fail.
-     No attempt is made to correct the situation. */
   rewind (inf);
 }
 
@@ -6344,6 +6353,51 @@ etags_getcwd (void)
   return path;
 }
 
+/* Return a newly allocated string containing a name of a temporary file.  */
+static char *
+etags_mktmp (void)
+{
+  const char *tmpdir = getenv ("TMPDIR");
+  const char *slash = "/";
+
+#if MSDOS || defined (DOS_NT)
+  if (!tmpdir)
+    tmpdir = getenv ("TEMP");
+  if (!tmpdir)
+    tmpdir = getenv ("TMP");
+  if (!tmpdir)
+    tmpdir = ".";
+  if (tmpdir[strlen (tmpdir) - 1] == '/'
+      || tmpdir[strlen (tmpdir) - 1] == '\\')
+    slash = "";
+#else
+  if (!tmpdir)
+    tmpdir = "/tmp";
+  if (tmpdir[strlen (tmpdir) - 1] == '/')
+    slash = "";
+#endif
+
+  char *templt = concat (tmpdir, slash, "etXXXXXX");
+  int fd = mkostemp (templt, O_CLOEXEC);
+  if (fd < 0)
+    {
+      free (templt);
+      templt = NULL;
+    }
+  else
+    close (fd);
+
+#if defined (DOS_NT)
+  /* The file name will be used in shell redirection, so it needs to have
+     DOS-style backslashes, or else the Windows shell will barf.  */
+  char *p;
+  for (p = templt; *p; p++)
+    if (*p == '/')
+      *p = '\\';
+#endif
+  return templt;
+}
+
 /* Return a newly allocated string containing the file name of FILE
    relative to the absolute directory DIR (which should end with a slash). */
 static char *
@@ -6484,7 +6538,6 @@ static void
 canonicalize_filename (register char *fn)
 {
   register char* cp;
-  char sep = '/';
 
 #ifdef DOS_NT
   /* Canonicalize drive letter case.  */
@@ -6492,19 +6545,33 @@ canonicalize_filename (register char *fn)
   if (fn[0] != '\0' && fn[1] == ':' && ISUPPER (fn[0]))
     fn[0] = lowcase (fn[0]);
 
-  sep = '\\';
-#endif
+  /* Collapse multiple forward- and back-slashes into a single forward
+     slash. */
+  for (cp = fn; *cp != '\0'; cp++, fn++)
+    if (*cp == '/' || *cp == '\\')
+      {
+       *fn = '/';
+       while (cp[1] == '/' || cp[1] == '\\')
+         cp++;
+      }
+    else
+      *fn = *cp;
 
-  /* Collapse multiple separators into a single slash. */
+#else  /* !DOS_NT */
+
+  /* Collapse multiple slashes into a single slash. */
   for (cp = fn; *cp != '\0'; cp++, fn++)
-    if (*cp == sep)
+    if (*cp == '/')
       {
        *fn = '/';
-       while (cp[1] == sep)
+       while (cp[1] == '/')
          cp++;
       }
     else
       *fn = *cp;
+
+#endif /* !DOS_NT */
+
   *fn = '\0';
 }
 
diff --git a/lisp/ChangeLog.16 b/lisp/ChangeLog.16
index 457c151..bc5267a 100644
--- a/lisp/ChangeLog.16
+++ b/lisp/ChangeLog.16
@@ -5030,8 +5030,7 @@
        * mouse.el (mouse-yank-primarY): Look for frame-type w32, not
        system-type windows-nt.
 
-       * server.el (server-create-window-system-frame): Look for window
-       type.
+       * server.el (server-create-window-system-frame): Look for window type.
        (server-proces-filter): Only force a window system when windows-nt
        _and_ w32.  Explain why.
 
diff --git a/lisp/allout-widgets.el b/lisp/allout-widgets.el
index 164cd31..3c71a81 100644
--- a/lisp/allout-widgets.el
+++ b/lisp/allout-widgets.el
@@ -348,7 +348,7 @@ to `allout-body-modification-handler', and is always reset 
by
 images with lists containing the name of the icon directory (as
 found on the `load-path') and the icon name.
 
-Set this variable to `nil' to empty the cache, and have it replenish from the
+Set this variable to nil to empty the cache, and have it replenish from the
 filesystem.")
 ;;;_    = allout-widgets-unset-inhibit-read-only
 (defvar allout-widgets-unset-inhibit-read-only nil
diff --git a/lisp/allout.el b/lisp/allout.el
index 2cdac99..dcdd35e 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -322,7 +322,7 @@ With value nil, inhibit any automatic allout-mode 
activation."
   "Default allout outline layout specification.
 
 This setting specifies the outline exposure to use when
-`allout-layout' has the local value `t'.  This docstring describes the
+`allout-layout' has the local value t.  This docstring describes the
 layout specifications.
 
 A list value specifies a default layout for the current buffer,
@@ -933,7 +933,7 @@ followed by the equivalent of `(allout-expose-topic 0 : -1 
-1 0)'.
 \(This is the layout used for the allout.el source file.)
 
 `allout-default-layout' describes the specification format.
-`allout-layout' can additionally have the value `t', in which
+`allout-layout' can additionally have the value t, in which
 case the value of `allout-default-layout' is used.")
 (make-variable-buffer-local 'allout-layout)
 ;;;###autoload
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index 357916c..2ff7c01 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -1,4 +1,4 @@
-;;; autorevert.el --- revert buffers when files on disk change
+;;; autorevert.el --- revert buffers when files on disk change  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 1997-1999, 2001-2015 Free Software Foundation, Inc.
 
@@ -95,7 +95,7 @@
 ;; mode.  For example, the following line will activate Auto-Revert
 ;; Mode in all C mode buffers:
 ;;
-;; (add-hook 'c-mode-hook 'turn-on-auto-revert-mode)
+;; (add-hook 'c-mode-hook #'turn-on-auto-revert-mode)
 
 ;;; Code:
 
@@ -260,10 +260,9 @@ buffers.  CPU usage depends on the version control system."
   :type 'boolean
   :version "22.1")
 
-(defvar global-auto-revert-ignore-buffer nil
+(defvar-local global-auto-revert-ignore-buffer nil
   "When non-nil, Global Auto-Revert Mode will not revert this buffer.
 This variable becomes buffer local when set in any fashion.")
-(make-variable-buffer-local 'global-auto-revert-ignore-buffer)
 
 (defcustom auto-revert-remote-files nil
   "If non-nil remote files are also reverted."
@@ -315,9 +314,9 @@ the list of old buffers.")
   "Position of last known end of file.")
 
 (add-hook 'find-file-hook
-         (lambda ()
-           (set (make-local-variable 'auto-revert-tail-pos)
-                (nth 7 (file-attributes buffer-file-name)))))
+         (lambda ()
+           (setq-local auto-revert-tail-pos
+                        (nth 7 (file-attributes buffer-file-name)))))
 
 (defvar auto-revert-notify-watch-descriptor-hash-list
   (make-hash-table :test 'equal)
@@ -326,15 +325,13 @@ Hash key is a watch descriptor, hash value is a list of 
buffers
 which are related to files being watched and carrying the same
 default directory.")
 
-(defvar auto-revert-notify-watch-descriptor nil
+(defvar-local auto-revert-notify-watch-descriptor nil
   "The file watch descriptor active for the current buffer.")
-(make-variable-buffer-local 'auto-revert-notify-watch-descriptor)
 (put 'auto-revert-notify-watch-descriptor 'permanent-local t)
 
-(defvar auto-revert-notify-modified-p nil
+(defvar-local auto-revert-notify-modified-p nil
   "Non-nil when file has been modified on the file system.
 This has been reported by a file notification event.")
-(make-variable-buffer-local 'auto-revert-notify-modified-p)
 
 ;; Functions:
 
@@ -370,7 +367,7 @@ without being changed in the part that is already in the 
buffer."
   "Turn on Auto-Revert Mode.
 
 This function is designed to be added to hooks, for example:
-  (add-hook 'c-mode-hook 'turn-on-auto-revert-mode)"
+  (add-hook 'c-mode-hook #'turn-on-auto-revert-mode)"
   (auto-revert-mode 1))
 
 
@@ -420,8 +417,8 @@ Perform a full revert? ")
       ;; else we might reappend our own end when we save
       (add-hook 'before-save-hook (lambda () (auto-revert-tail-mode 0)) nil t)
       (or (local-variable-p 'auto-revert-tail-pos) ; don't lose prior position
-         (set (make-local-variable 'auto-revert-tail-pos)
-              (nth 7 (file-attributes buffer-file-name))))
+         (setq-local auto-revert-tail-pos
+                      (nth 7 (file-attributes buffer-file-name))))
       ;; let auto-revert-mode set up the mechanism for us if it isn't already
       (or auto-revert-mode
          (let ((auto-revert-tail-mode t))
@@ -434,7 +431,7 @@ Perform a full revert? ")
   "Turn on Auto-Revert Tail mode.
 
 This function is designed to be added to hooks, for example:
-  (add-hook 'my-logfile-mode-hook 'turn-on-auto-revert-tail-mode)"
+  (add-hook 'my-logfile-mode-hook #'turn-on-auto-revert-tail-mode)"
   (auto-revert-tail-mode 1))
 
 
@@ -495,7 +492,7 @@ will use an up-to-date value of `auto-revert-interval'"
           (ignore-errors
             (file-notify-rm-watch auto-revert-notify-watch-descriptor)))))
      auto-revert-notify-watch-descriptor-hash-list)
-    (remove-hook 'kill-buffer-hook 'auto-revert-notify-rm-watch))
+    (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch))
   (setq auto-revert-notify-watch-descriptor nil
        auto-revert-notify-modified-p nil))
 
@@ -508,7 +505,7 @@ will use an up-to-date value of `auto-revert-interval'"
          (file-symlink-p (or buffer-file-name default-directory)))
 
       ;; Fallback to file checks.
-      (set (make-local-variable 'auto-revert-use-notify) nil)
+      (setq-local auto-revert-use-notify nil)
 
     (when (not auto-revert-notify-watch-descriptor)
       (setq auto-revert-notify-watch-descriptor
@@ -530,10 +527,10 @@ will use an up-to-date value of `auto-revert-interval'"
                   (gethash auto-revert-notify-watch-descriptor
                            auto-revert-notify-watch-descriptor-hash-list))
             auto-revert-notify-watch-descriptor-hash-list)
-           (add-hook (make-local-variable 'kill-buffer-hook)
-                     'auto-revert-notify-rm-watch))
+           (add-hook 'kill-buffer-hook
+                     #'auto-revert-notify-rm-watch nil t))
        ;; Fallback to file checks.
-       (set (make-local-variable 'auto-revert-use-notify) nil)))))
+       (setq-local auto-revert-use-notify nil)))))
 
 ;; If we have file notifications, we want to update the auto-revert buffers
 ;; immediately when a notification occurs. Since file updates can happen very
diff --git a/lisp/calc/calc-aent.el b/lisp/calc/calc-aent.el
index 23de53e..cc048eb 100644
--- a/lisp/calc/calc-aent.el
+++ b/lisp/calc/calc-aent.el
@@ -1034,7 +1034,7 @@ in Calc algebraic input.")
 
 (defun math-restore-placeholders (x)
   "Replace placeholders by the proper characters in the symbol x.
-This includes `#' for `_' and `'' for `%'.
+This includes ‘#’ for ‘_’ and ‘'’ for ‘%’.
 If the current Calc language does not use placeholders, return nil."
   (if (or (memq calc-language calc-lang-allow-underscores)
           (memq calc-language calc-lang-allow-percentsigns))
diff --git a/lisp/calc/calc-yank.el b/lisp/calc/calc-yank.el
index 726a720..923df5d 100644
--- a/lisp/calc/calc-yank.el
+++ b/lisp/calc/calc-yank.el
@@ -149,7 +149,7 @@ as well as set the contents of the Emacs register REGISTER 
to TEXT."
   "Return the CALCVAL portion of the contents of the Calc register REG,
 unless the TEXT portion doesn't match the contents of the Emacs register REG,
 in which case either return the contents of the Emacs register (if it is
-text) or `nil'."
+text) or nil."
   (let ((cval (cdr (assq reg calc-register-alist)))
         (val (cdr (assq reg register-alist))))
     (if (stringp val)
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index 1cc11b4..52ed5d7 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -2034,7 +2034,7 @@ See calc-keypad for details."
 ;; (YEAR MONTH DAY math-date-from-gregorian-dt(YEAR MONTH DAY)) for speed.
 (defcustom calc-gregorian-switch nil
   "The first day the Gregorian calendar is used by Calc's date forms.
-This is `nil' (the default) if the Gregorian calendar is the only one used.
+This is nil (the default) if the Gregorian calendar is the only one used.
 Otherwise, it should be a list `(YEAR MONTH DAY)' when Calc begins to use
 the Gregorian calendar; Calc will use the Julian calendar for earlier dates.
 The dates in which different regions of the world began to use the
diff --git a/lisp/calculator.el b/lisp/calculator.el
index 0aef07b..4027887 100644
--- a/lisp/calculator.el
+++ b/lisp/calculator.el
@@ -1203,10 +1203,10 @@ arguments."
     ;; f is an expression
     (let ((TX (and X (calculator-truncate X)))
           (TY (and Y (calculator-truncate Y)))
-          (DX (if (and X calculator-deg) (/ (* X pi) 180) X))
+          (DX (if (and X calculator-deg) (degrees-to-radians X) X))
           (L  calculator-saved-list)
           (fF `(calculator-funcall ',f x y))
-          (fD `(if calculator-deg (/ (* x 180) float-pi) x)))
+          (fD `(if calculator-deg (* radians-to-degrees x) x)))
       (eval `(cl-flet ((F (&optional x y) ,fF) (D (x) ,fD))
                (let ((X ,X) (Y ,Y) (DX ,DX) (TX ,TX) (TY ,TY) (L ',L))
                  ,f))
diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el
index e42a010..1612f48 100644
--- a/lisp/calendar/calendar.el
+++ b/lisp/calendar/calendar.el
@@ -2182,7 +2182,7 @@ in `calendar-month-name-array'.  These abbreviations are 
used in
 the calendar menu entries, and can also be used in the diary
 file.  Do not include a trailing `.' in the strings specified in
 this variable, though you may use such in the diary file.  By
-default, each string is the first ``calendar-abbrev-length'
+default, each string is the first `calendar-abbrev-length'
 characters of the corresponding full name."
  :group 'calendar
  :set-after '(calendar-abbrev-length calendar-month-name-array)
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index 29364b5..d5bd26a 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -104,9 +104,9 @@ are: `string', `symbol', `int', `tnil', `stringtnil.'"
                        (choice (const string :tag "A string")
                                (const symbol :tag "A symbol")
                                (const int :tag "An integer")
-                               (const tnil :tag "`t' or `nil'")
+                               (const tnil :tag "t or nil")
                                (const stringtnil
-                                      :tag "A string, `t', or `nil'"))))
+                                      :tag "A string, t, or nil"))))
   :group 'diary)
 
 (defcustom diary-glob-file-regexp-prefix "^\\#"
@@ -1671,7 +1671,7 @@ DAY MONTH YEAR in the European style).
 
   %%(diary-date MONTH DAY YEAR &optional MARK) text
     Entry applies if date is MONTH, DAY, YEAR.  DAY, MONTH, and YEAR can
-    be a list of integers, `t' (meaning all values), or an integer.
+    be a list of integers, t (meaning all values), or an integer.
 
   %%(diary-float MONTH DAYNAME N &optional DAY MARK) text
     Entry will appear on the Nth DAYNAME after/before MONTH DAY.
@@ -1679,7 +1679,7 @@ DAY MONTH YEAR in the European style).
     If N>0, use the Nth DAYNAME after MONTH DAY.
     If N<0, use the Nth DAYNAME before MONTH DAY.
     DAY defaults to 1 if N>0, and MONTH's last day otherwise.
-    MONTH can be a list of months, a single month, or `t' to
+    MONTH can be a list of months, a single month, or t to
     specify all months.
 
   %%(diary-block M1 D1 Y1 M2 D2 Y2 &optional MARK) text
@@ -1814,7 +1814,7 @@ form used internally by the calendar and diary."
 (defun diary-date (month day year &optional mark)
   "Specific date(s) diary entry.
 Entry applies if date is MONTH, DAY, YEAR.  Each parameter can be a
-list of integers, `t' (meaning all values), or an integer.  The order
+list of integers, t (meaning all values), or an integer.  The order
 of the input parameters changes according to `calendar-date-style'
 \(e.g. to DAY MONTH YEAR in the European style).
 
@@ -1863,7 +1863,7 @@ DAYNAME=0 means Sunday, DAYNAME=1 means Monday, and so on.
 If N>0, use the Nth DAYNAME after MONTH DAY.
 If N<0, use the Nth DAYNAME before MONTH DAY.
 DAY defaults to 1 if N>0, and MONTH's last day otherwise.
-MONTH can be a list of months, an integer, or `t' (meaning all months).
+MONTH can be a list of months, an integer, or t (meaning all months).
 Optional MARK specifies a face or single-character string to use when
 highlighting the day in the calendar."
   ;; This is messy because the diary entry may apply, but the date on which it
diff --git a/lisp/calendar/solar.el b/lisp/calendar/solar.el
index 25a24ee..a2f9d58 100644
--- a/lisp/calendar/solar.el
+++ b/lisp/calendar/solar.el
@@ -346,7 +346,7 @@ If SUNRISE-FLAG is non-nil, only calculate longitude and 
inclination."
                                    (solar-cosine-degrees (* 2 l)))
                                 (* -0.5 y y  (solar-sin-degrees (* 4 l)))
                                 (* -1.25 ecc ecc (solar-sin-degrees (* 2 m)))))
-                       3.1415926535))))
+                       float-pi))))
     (list app i time-eq nut)))
 
 (defun solar-ephemeris-correction (year)
diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el
index bb9316c..7369ec2 100644
--- a/lisp/calendar/todo-mode.el
+++ b/lisp/calendar/todo-mode.el
@@ -5443,7 +5443,7 @@ dynamically create item insertion commands.")
 The list consists of item insertion parameters that can be passed
 as insertion command arguments in fixed positions.  If a position
 in the list is not occupied by the corresponding parameter, it is
-occupied by `nil'."
+occupied by nil."
   (let* ((arg (list (car todo-insert-item--args)))
         (args (nconc (cdr todo-insert-item--args)
                      (list (car (todo-insert-item--argsleft
diff --git a/lisp/cedet/ede/auto.el b/lisp/cedet/ede/auto.el
index 7e8df6b..482632f 100644
--- a/lisp/cedet/ede/auto.el
+++ b/lisp/cedet/ede/auto.el
@@ -86,7 +86,7 @@ into memory.")
      ;; If the thing to match is stored in a config file.
      ((stringp fc)
       (when (file-exists-p fc)
-       (let ((matchstring 
+       (let ((matchstring
               (if (slot-boundp dirmatch 'configdatastash)
                   (oref dirmatch configdatastash)
                 nil)))
@@ -123,7 +123,7 @@ into memory.")
                   (not (= (match-end 0) (length file))))
               )
          )))
-     
+
      ;; Add new matches here
      ;; ((stringp somenewslot ...)
      ;;   )
@@ -155,9 +155,9 @@ into memory.")
 Specifying this matcher object will allow EDE to perform a complex
 check without loading the project.
 
-NOTE: If you use dirmatch, you may need to set :root-only to `nil'.
+NOTE: If you use dirmatch, you may need to set :root-only to nil.
 While it may be a root based project, all subdirs will happen to return
-true for the dirmatch, so for scanning purposes, set it to `nil'.") 
+true for the dirmatch, so for scanning purposes, set it to nil.")
    (proj-root :initarg :proj-root
              :type function
              :documentation "A function symbol to call for the project root.
@@ -280,7 +280,7 @@ added.  Possible values are:
     (if f
        (and f (file-exists-p f))
       (let ((dirmatch (oref this proj-root-dirmatch)))
-       (cond 
+       (cond
         ((stringp dirmatch)
          nil) ; <- do something here - maybe obsolete the option?
         ((ede-project-autoload-dirmatch-p dirmatch)
@@ -312,7 +312,7 @@ NOTE: Do not call this - it should only be called from 
`ede-load-project-file'."
 
 
 
-;;; -------- Old Methods 
+;;; -------- Old Methods
 ;; See if we can do without them.
 
 ;; @FIXME - delete from loaddefs to remove this.
diff --git a/lisp/cedet/ede/files.el b/lisp/cedet/ede/files.el
index 1922337..4ba823a 100644
--- a/lisp/cedet/ede/files.el
+++ b/lisp/cedet/ede/files.el
@@ -41,7 +41,7 @@
 (declare-function ede-locate-flush-hash "ede/locate")
 
 (defvar ede--disable-inode nil
-  "Set to 't' to simulate systems w/out inode support.")
+  "Set to t to simulate systems w/out inode support.")
 
 ;;; Code:
 ;;;###autoload
diff --git a/lisp/cedet/semantic/mru-bookmark.el 
b/lisp/cedet/semantic/mru-bookmark.el
index b75408f..b2a2c8c 100644
--- a/lisp/cedet/semantic/mru-bookmark.el
+++ b/lisp/cedet/semantic/mru-bookmark.el
@@ -207,7 +207,7 @@ The resulting bookmark is then sorted within the ring."
       )))
 
 (defun semantic-mrub-cache-flush-fcn ()
-  "Function called in the `semantic-before-toplevel-cache-flush-hook`.
+  "Function called in the `semantic-before-toplevel-cache-flush-hook'.
 Cause tags in the ring to become unlinked."
   (let* ((ring (oref semantic-mru-bookmark-ring ring))
         (len (ring-length ring))
diff --git a/lisp/cedet/semantic/symref.el b/lisp/cedet/semantic/symref.el
index 2c5e3ba..ca5dd7d 100644
--- a/lisp/cedet/semantic/symref.el
+++ b/lisp/cedet/semantic/symref.el
@@ -351,7 +351,7 @@ until the next command is executed."
   (setq semantic-symref-recently-opened-buffers nil)
   (remove-hook 'post-command-hook 'semantic-symref-cleanup-recent-buffers-fcn)
   )
-  
+
 (cl-defmethod semantic-symref-result-get-tags ((result semantic-symref-result)
                                            &optional open-buffers)
   "Get the list of tags from the symref result RESULT.
@@ -512,7 +512,7 @@ buffers that were opened."
    (searchtype :initarg :searchtype
                :type symbol
                :documentation "The type of search to do.
-Values could be `symbol, `regexp, 'tagname, or 'completion.")
+Values could be 'symbol, 'regexp, 'tagname, or 'completion.")
    (searchscope :initarg :searchscope
                :type symbol
                :documentation
diff --git a/lisp/cedet/semantic/tag.el b/lisp/cedet/semantic/tag.el
index 3ad192b..545ca91 100644
--- a/lisp/cedet/semantic/tag.el
+++ b/lisp/cedet/semantic/tag.el
@@ -621,7 +621,7 @@ buffer, the originating buffer file name is kept in the 
`:filename'
 property of the copied tag.
 If KEEP-FILE is a string, and the originating buffer is NOT available,
 then KEEP-FILE is stored on the `:filename' property.
-This runs the tag hook `unlink-copy-hook`."
+This runs the tag hook `unlink-copy-hook'."
   ;; Right now, TAG is a list.
   (let ((copy (semantic-tag-clone tag name)))
 
@@ -958,7 +958,7 @@ 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 'type, or the list of arguments to a
 tag of class 'function."
   )
 
diff --git a/lisp/cedet/srecode/cpp.el b/lisp/cedet/srecode/cpp.el
index ec92ae3..e77e05c 100644
--- a/lisp/cedet/srecode/cpp.el
+++ b/lisp/cedet/srecode/cpp.el
@@ -84,7 +84,7 @@ HEADER - Shown section if in a header file."
 ;;;###autoload
 (defun srecode-semantic-handle-:cpp (dict)
   "Add macros into the dictionary DICT based on the current c file.
-Calls `srecode-semantic-handle-:c.
+Calls `srecode-semantic-handle-:c'.
 Also adds the following:
  - nothing -"
   (srecode-semantic-handle-:c dict)
diff --git a/lisp/cedet/srecode/texi.el b/lisp/cedet/srecode/texi.el
index 5c3f21c..be75f37 100644
--- a/lisp/cedet/srecode/texi.el
+++ b/lisp/cedet/srecode/texi.el
@@ -241,11 +241,11 @@ This is to take advantage of TeXinfo's markup symbols."
 For instances where CLASS is the class being referenced, do not Xref
 that class.
 
- `function' => @dfn{function}
- `variable' => @code{variable}
- `class'    => @code{class} @xref{class}
- `unknown'  => @code{unknown}
- \"text\"     => ``text''
+ function   => @dfn{function}
+ variable   => @code{variable}
+ class      => @code{class} @xref{class}
+ unknown    => @code{unknown}
+ \" text \"   => `` text ''
  'quoteme   => @code{quoteme}
  non-nil    => address@hidden
  t          => @code{t}
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 9f57d0d..1d9a9d6 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -1965,7 +1965,7 @@ Each entry is of the form (STATE MAGIC FACE ITEM-DESC [ 
GROUP-DESC ]), where
 
 STATE is one of the following symbols:
 
-`nil'
+nil
    For internal use, should never occur.
 `unknown'
    For internal use, should never occur.
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 4dcb519..18a3c88 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -2257,7 +2257,7 @@ of marked files.  If KILL-ROOT is non-nil, kill DIRNAME 
as well."
   ;;   components are string-lessp.
   ;; Thus ("/usr/" "/usr/bin") and ("/usr/a/" "/usr/b/") are tree-lessp.
   ;; string-lessp could arguably be replaced by file-newer-than-file-p
-  ;;   if dired-actual-switches contained `t'.
+  ;;   if dired-actual-switches contained t.
   (setq dir1 (file-name-as-directory dir1)
        dir2 (file-name-as-directory dir2))
   (let ((components-1 (dired-split "/" dir1))
diff --git a/lisp/dired.el b/lisp/dired.el
index ca13900..e523b94 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -3889,7 +3889,7 @@ Ask means pop up a menu for the user to select one of 
copy, move or link."
 
 ;;; Start of automatically extracted autoloads.
 
-;;;### (autoloads nil "dired-aux" "dired-aux.el" 
"8820677763cb69eef827e38b86d35f47")
+;;;### (autoloads nil "dired-aux" "dired-aux.el" 
"45867cb96abef86d29a9850ee2113cf2")
 ;;; Generated autoloads from dired-aux.el
 
 (autoload 'dired-diff "dired-aux" "\
diff --git a/lisp/dirtrack.el b/lisp/dirtrack.el
index d1957a2..d1c46dd 100644
--- a/lisp/dirtrack.el
+++ b/lisp/dirtrack.el
@@ -51,7 +51,7 @@
 ;; which matches your prompt up to and including the pathname part.
 ;; The second is a number which tells which regular expression group to
 ;; match to extract only the pathname.  If you use a multi-line prompt,
-;; add 't' as a third element.  Note that some of the functions in
+;; add t as a third element.  Note that some of the functions in
 ;; 'comint.el' assume a single-line prompt (eg, comint-bol).
 ;;
 ;; Determining this information may take some experimentation.  Using
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index 212ae90..907f03b 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -2149,7 +2149,6 @@ the cache-id will clear the cache."
 
 (defun ad-arglist (definition)
   "Return the argument list of DEFINITION."
-  (require 'help-fns)
   (help-function-arglist
    (if (or (macrop definition) (ad-advice-p definition))
        (cdr definition)
@@ -2474,8 +2473,6 @@ Example: `(ad-map-arglists '(a &rest args) '(w x y z))' 
will return
                       (capitalize (symbol-name class))
                       (ad-advice-name advice)))))))
 
-(require 'help-fns)        ;For help-split-fundoc and help-add-fundoc-usage.
-
 (defun ad--make-advised-docstring (function &optional style)
   "Construct a documentation string for the advised FUNCTION.
 Concatenate the original documentation with the documentation
diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el
index 206d5bb..a6fefeb 100644
--- a/lisp/emacs-lisp/autoload.el
+++ b/lisp/emacs-lisp/autoload.el
@@ -32,7 +32,6 @@
 
 (require 'lisp-mode)                   ;for `doc-string-elt' properties.
 (require 'lisp-mnt)
-(require 'help-fns)                    ;for help-add-fundoc-usage.
 (eval-when-compile (require 'cl-lib))
 
 (defvar generated-autoload-file nil
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 06a1106..3014793 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -566,7 +566,7 @@
               (cons fn args)))))))
 
 (defun byte-optimize-all-constp (list)
-  "Non-nil if all elements of LIST satisfy `macroexp-const-p"
+  "Non-nil if all elements of LIST satisfy `macroexp-const-p'."
   (let ((constant t))
     (while (and list constant)
       (unless (macroexp-const-p (car list))
@@ -1225,7 +1225,7 @@
         window-left-child window-left-column window-margins window-minibuffer-p
         window-next-buffers window-next-sibling window-new-normal
         window-new-total window-normal-size window-parameter window-parameters
-        window-parent window-pixel-edges window-point window-prev-buffers 
+        window-parent window-pixel-edges window-point window-prev-buffers
         window-prev-sibling window-redisplay-end-trigger window-scroll-bars
         window-start window-text-height window-top-child window-top-line
         window-total-height window-total-width window-use-time window-vscroll
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 67744c6..efd4389 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -348,7 +348,7 @@ else the global value will be modified."
 ;;;###autoload
 (defun byte-compile-enable-warning (warning)
   "Change `byte-compile-warnings' to enable WARNING.
-If `byte-compile-warnings' is `t', do nothing.  Otherwise, if the
+If `byte-compile-warnings' is t, do nothing.  Otherwise, if the
 first element is `not', remove WARNING, else add it.
 Normally you should let-bind `byte-compile-warnings' before calling this,
 else the global value will be modified."
diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el
index 7269b83..ecdb6d8 100644
--- a/lisp/emacs-lisp/check-declare.el
+++ b/lisp/emacs-lisp/check-declare.el
@@ -98,7 +98,7 @@ don't know how to recognize (e.g. some macros)."
                  (stringp (setq fnfile (nth 2 form)))
                  (setq fnfile (check-declare-locate fnfile
                                                     (expand-file-name file)))
-                 ;; Use `t' to distinguish unspecified arglist from empty one.
+                 ;; Use t to distinguish unspecified arglist from empty one.
                  (or (eq t (setq arglist (if (> len 3)
                                              (nth 3 form)
                                            t)))
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index 777fed0..18361c8 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -1615,8 +1615,8 @@ function,command,variable,option or symbol." ms1))))))
            (or
             ;; * The documentation string for a variable that is a
             ;;   yes-or-no flag should start with words such as Non-nil
-            ;;   means..., to make it clear that all non-`nil' values are
-            ;;   equivalent and indicate explicitly what `nil' and non-`nil'
+            ;;   means..., to make it clear that all non-nil values are
+            ;;   equivalent and indicate explicitly what nil and non-nil
             ;;   mean.
             ;; * If a user option variable records a true-or-false
             ;;   condition, give it a name that ends in `-flag'.
@@ -2405,7 +2405,7 @@ Argument END is the maximum bounds to search in."
 According to the documentation for the function `error', the error list
 should not end with a period, and should start with a capital letter.
 The function `y-or-n-p' has similar constraints.
-Argument TYPE specifies the type of question, such as `error or `y-or-n-p."
+Argument TYPE specifies the type of question, such as `error' or `y-or-n-p'."
   ;; If type is nil, then attempt to derive it.
   (if (not type)
       (save-excursion
@@ -2613,9 +2613,12 @@ function called to create the messages."
                     (count-lines (point-min) (or point (point-min))))
                    ": " msg)))
     (with-current-buffer (get-buffer checkdoc-diagnostic-buffer)
-      (goto-char (point-max))
-      (let ((inhibit-read-only t))
-        (apply #'insert text)))))
+      (let ((inhibit-read-only t)
+            (pt (point-max)))
+        (goto-char pt)
+        (apply #'insert text)
+        (when noninteractive
+          (warn (buffer-substring pt (point-max))))))))
 
 (defun checkdoc-show-diagnostics ()
   "Display the checkdoc diagnostic buffer in a temporary window."
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index a2716ef..b3c127f 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -237,14 +237,19 @@ BODY, if present, is used as the body of a default method.
                (`(,spec-args . ,_) (cl--generic-split-args args))
                (mandatory (mapcar #'car spec-args))
                (apo (assq :argument-precedence-order options)))
-    (setf (cl--generic-dispatches generic) nil)
+    (unless (fboundp name)
+      ;; If the generic function was fmakunbound, throw away previous methods.
+      (setf (cl--generic-dispatches generic) nil)
+      (setf (cl--generic-method-table generic) nil))
     (when apo
       (dolist (arg (cdr apo))
         (let ((pos (memq arg mandatory)))
           (unless pos (error "%S is not a mandatory argument" arg))
-          (push (list (- (length mandatory) (length pos)))
-                (cl--generic-dispatches generic)))))
-    (setf (cl--generic-method-table generic) nil)
+          (let* ((argno (- (length mandatory) (length pos)))
+                 (dispatches (cl--generic-dispatches generic))
+                 (dispatch (or (assq argno dispatches) (list argno))))
+            (setf (cl--generic-dispatches generic)
+                  (cons dispatch (delq dispatch dispatches)))))))
     (setf (cl--generic-options generic) options)
     (cl--generic-make-function generic)))
 
@@ -438,16 +443,14 @@ which case this method will be invoked when the argument 
is `eql' to VAL.
           ;; the generic function.
           current-load-list)
       ;; For aliases, cl--generic-name gives us the actual name.
-      (funcall
-       (if purify-flag
-           ;; BEWARE!  Don't purify this function definition, since that leads
-           ;; to memory corruption if the hash-tables it holds are modified
-           ;; (the GC doesn't trace those pointers).
-           #'fset
-         ;; But do use `defalias' in the normal case, so that it interacts
-         ;; properly with nadvice, e.g. for tracing/debug-on-entry.
-         #'defalias)
-       (cl--generic-name generic) gfun))))
+      (let ((purify-flag
+             ;; BEWARE!  Don't purify this function definition, since that 
leads
+             ;; to memory corruption if the hash-tables it holds are modified
+             ;; (the GC doesn't trace those pointers).
+             nil))
+        ;; But do use `defalias', so that it interacts properly with nadvice,
+        ;; e.g. for tracing/debug-on-entry.
+        (defalias (cl--generic-name generic) gfun)))))
 
 (defmacro cl--generic-with-memoization (place &rest code)
   (declare (indent 1) (debug t))
@@ -525,7 +528,7 @@ which case this method will be invoked when the argument is 
`eql' to VAL.
           (progn
             (while (and dispatches
                         (let ((x (nth 1 (car dispatches))))
-                          ;; No need to dispatch for `t' specializers.
+                          ;; No need to dispatch for t specializers.
                           (or (null x) (equal x cl--generic-t-generalizer))))
               (setq dispatches (cdr dispatches)))
             (pop dispatches))))
@@ -701,10 +704,15 @@ methods.")
       #'cl--generic-standard-method-combination)
 
 (cl-defmethod cl-generic-generalizers (specializer)
-  "Support for the catch-all `t' specializer."
+  "Support for the catch-all t specializer."
   (if (eq specializer t) (list cl--generic-t-generalizer)
     (error "Unknown specializer %S" specializer)))
 
+(eval-when-compile
+  ;; This macro is brittle and only really important in order to be
+  ;; able to preload cl-generic without also preloading the byte-compiler,
+  ;; So we use `eval-when-compile' so as not keep it available longer than
+  ;; strictly needed.
 (defmacro cl--generic-prefill-dispatchers (arg-or-context specializer)
   (unless (integerp arg-or-context)
     (setq arg-or-context `(&context . ,arg-or-context)))
@@ -722,7 +730,7 @@ methods.")
                        ,@(cl-generic-generalizers ',specializer)
                        ,cl--generic-t-generalizer)))
        ;; (message "Prefilling for %S with \n%S" dispatch ',fun)
-       (puthash dispatch ',fun cl--generic-dispatchers))))
+       (puthash dispatch ',fun cl--generic-dispatchers)))))
 
 (cl-defmethod cl-generic-combine-methods (generic methods)
   "Standard support for :after, :before, :around, and `:extra NAME' 
qualifiers."
@@ -796,8 +804,6 @@ Can only be used from within the lexical body of a primary 
or around method."
         specializers qualifiers
         (cl--generic-method-table (cl--generic generic)))))
 
-(defalias 'cl-method-qualifiers 'cl--generic-method-qualifiers)
-
 ;;; Add support for describe-function
 
 (defun cl--generic-search-method (met-name)
@@ -850,6 +856,9 @@ Can only be used from within the lexical body of a primary 
or around method."
 
 (add-hook 'help-fns-describe-function-functions #'cl--generic-describe)
 (defun cl--generic-describe (function)
+  ;; Supposedly this is called from help-fns, so help-fns should be loaded at
+  ;; this point.
+  (declare-function help-fns-short-filename "help-fns" (filename))
   (let ((generic (if (symbolp function) (cl--generic function))))
     (when generic
       (require 'help-mode)              ;Needed for `help-function-def' button!
diff --git a/lisp/emacs-lisp/cl-indent.el b/lisp/emacs-lisp/cl-indent.el
index 5e75406..57da715 100644
--- a/lisp/emacs-lisp/cl-indent.el
+++ b/lisp/emacs-lisp/cl-indent.el
@@ -140,13 +140,13 @@ If non-nil, alignment is done with the first parameter
 
 (defcustom lisp-indent-backquote-substitution-mode t
   "How to indent substitutions in backquotes.
-If `t', the default, indent substituted forms normally.
-If `nil', do not apply special indentation rule to substituted
+If t, the default, indent substituted forms normally.
+If nil, do not apply special indentation rule to substituted
 forms.  If `corrected', subtract the `,' or `,@' from the form
 column, indenting as if this character sequence were not present.
 In any case, do not backtrack beyond a backquote substitution.
 
-Until Emacs 25.1, the `nil' behavior was hard-wired."
+Until Emacs 25.1, the nil behavior was hard-wired."
   :version "25.1"
   :type '(choice (const corrected) (const nil) (const t))
   :group 'lisp-indent)
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 5bab84e..27d3da3 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -294,7 +294,6 @@ FORM is of the form (ARGS . BODY)."
                       ;; apparently harmless computation, so it should not
                       ;; touch the match-data.
                       (save-match-data
-                        (require 'help-fns)
                         (cons (help-add-fundoc-usage
                                (if (stringp (car header)) (pop header))
                                ;; Be careful with make-symbol and (back)quote,
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index 9d32ba2..77d6332 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -54,7 +54,7 @@ the middle is discarded, and just the beginning and end are 
displayed."
 The value affects the behavior of operations on any window
 previously showing the debugger buffer.
 
-`nil' means that if its window is not deleted when exiting the
+nil means that if its window is not deleted when exiting the
   debugger, invoking `switch-to-prev-buffer' will usually show
   the debugger buffer again.
 
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 98fb7e9..b5da3cc 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -600,7 +600,7 @@ list of a symbol.")
 (defun edebug-get-form-data-entry (pnt &optional end-point)
   ;; Find the edebug form data entry which is closest to PNT.
   ;; If END-POINT is supplied, match must be exact.
-  ;; Return `nil' if none found.
+  ;; Return nil if none found.
   (let ((rest edebug-form-data)
        closest-entry
        (closest-dist 999999))  ;; Need maxint here.
diff --git a/lisp/emacs-lisp/elint.el b/lisp/emacs-lisp/elint.el
index 317e5a6..fc66c82 100644
--- a/lisp/emacs-lisp/elint.el
+++ b/lisp/emacs-lisp/elint.el
@@ -46,8 +46,6 @@
 
 ;;; Code:
 
-(require 'help-fns)
-
 (defgroup elint nil
   "Linting for Emacs Lisp."
   :prefix "elint-"
diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el
index 8251682..08e1b7c 100644
--- a/lisp/emacs-lisp/generator.el
+++ b/lisp/emacs-lisp/generator.el
@@ -90,7 +90,7 @@
   ;; Change this function to use `cl-gensym' if you want the generated
   ;; code to be easier to read and debug.
   ;; (cl-gensym (apply #'format fmt args))
-  `(make-symbol ,fmt))
+  `(progn (ignore ,@args) (make-symbol ,fmt)))
 
 (defvar cps--dynamic-wrappers '(identity)
   "List of transformer functions to apply to atomic forms we
@@ -308,14 +308,14 @@ don't yield.")
                           collect (if (symbolp binding)
                                       (list binding nil)
                                     binding)))
-             (temps (cl-loop for (var value-form) in bindings
+             (temps (cl-loop for (var _value-form) in bindings
                        collect (cps--add-binding var))))
         (cps--transform-1
          `(let* ,(append
-                  (cl-loop for (var value-form) in bindings
+                  (cl-loop for (_var value-form) in bindings
                      for temp in temps
                      collect (list temp value-form))
-                  (cl-loop for (var binding) in bindings
+                  (cl-loop for (var _binding) in bindings
                      for temp in temps
                      collect (list var temp)))
             ,@body)
@@ -704,7 +704,7 @@ of values.  Callers can retrieve each value using 
`iter-next'."
 
 (defun iter-next (iterator &optional yield-result)
   "Extract a value from an iterator.
-YIELD-RESULT becomes the return value of `iter-yield` in the
+YIELD-RESULT becomes the return value of `iter-yield' in the
 context of the generator.
 
 This routine raises the `iter-end-of-sequence' condition if the
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 108d5cc..6facf57 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -229,248 +229,246 @@
                              (match-beginning 0)))))
          (throw 'found t))))))
 
-(pcase-let
-    ((`(,vdefs ,tdefs
-        ,el-defs-re ,cl-defs-re
-        ,el-kws-re  ,cl-kws-re
-        ,el-errs-re ,cl-errs-re)
-      (eval-when-compile
-        (let ((lisp-fdefs '("defmacro" "defsubst" "defun"))
-              (lisp-vdefs '("defvar"))
-              (lisp-kw '("cond" "if" "while" "let" "let*" "progn" "prog1"
-                         "prog2" "lambda" "unwind-protect" "condition-case"
-                         "when" "unless" "with-output-to-string"
-                         "ignore-errors" "dotimes" "dolist" "declare"))
-              (lisp-errs '("warn" "error" "signal"))
-              ;; Elisp constructs.  Now they are update dynamically
-              ;; from obarray but they are also used for setting up
-              ;; the keywords for Common Lisp.
-              (el-fdefs '("define-advice" "defadvice" "defalias"
-                          "define-derived-mode" "define-minor-mode"
-                          "define-generic-mode" "define-global-minor-mode"
-                          "define-globalized-minor-mode" "define-skeleton"
-                          "define-widget"))
-              (el-vdefs '("defconst" "defcustom" "defvaralias" "defvar-local"
-                          "defface"))
-              (el-tdefs '("defgroup" "deftheme"))
-              (el-kw '("while-no-input" "letrec" "pcase" "pcase-exhaustive"
-                       "pcase-lambda" "pcase-let" "pcase-let*" 
"save-restriction"
-                       "save-excursion" "save-selected-window"
-                       ;; "eval-after-load" "eval-next-after-load"
-                       "save-window-excursion" "save-current-buffer"
-                       "save-match-data" "combine-after-change-calls"
-                       "condition-case-unless-debug" "track-mouse"
-                       "eval-and-compile" "eval-when-compile" "with-case-table"
-                       "with-category-table" "with-coding-priority"
-                       "with-current-buffer" "with-demoted-errors"
-                       "with-electric-help" "with-eval-after-load"
-                       "with-file-modes"
-                       "with-local-quit" "with-no-warnings"
-                       "with-output-to-temp-buffer" "with-selected-window"
-                       "with-selected-frame" "with-silent-modifications"
-                       "with-syntax-table" "with-temp-buffer" "with-temp-file"
-                       "with-temp-message" "with-timeout"
-                       "with-timeout-handler"))
-              (el-errs '("user-error"))
-              ;; Common-Lisp constructs supported by EIEIO.  FIXME: namespace.
-              (eieio-fdefs '("defgeneric" "defmethod"))
-              (eieio-tdefs '("defclass"))
-              (eieio-kw '("with-slots"))
-              ;; Common-Lisp constructs supported by cl-lib.
-              (cl-lib-fdefs '("defmacro" "defsubst" "defun" "defmethod"))
-              (cl-lib-tdefs '("defstruct" "deftype"))
-              (cl-lib-kw '("progv" "eval-when" "case" "ecase" "typecase"
-                           "etypecase" "ccase" "ctypecase" "loop" "do" "do*"
-                           "the" "locally" "proclaim" "declaim" "letf" "go"
-                           ;; "lexical-let" "lexical-let*"
-                           "symbol-macrolet" "flet" "flet*" 
"destructuring-bind"
-                           "labels" "macrolet" "tagbody" "multiple-value-bind"
-                           "block" "return" "return-from"))
-              (cl-lib-errs '("assert" "check-type"))
-              ;; Common-Lisp constructs not supported by cl-lib.
-              (cl-fdefs '("defsetf" "define-method-combination"
-                          "define-condition" "define-setf-expander"
-                          ;; "define-function"??
-                          "define-compiler-macro" "define-modify-macro"))
-              (cl-vdefs '("define-symbol-macro" "defconstant" "defparameter"))
-              (cl-tdefs '("defpackage" "defstruct" "deftype"))
-              (cl-kw '("prog" "prog*" "handler-case" "handler-bind"
-                       "in-package" "restart-case" ;; "inline"
-                       "restart-bind" "break" "multiple-value-prog1"
-                       "compiler-let" "with-accessors" "with-compilation-unit"
-                       "with-condition-restarts" "with-hash-table-iterator"
-                       "with-input-from-string" "with-open-file"
-                       "with-open-stream" "with-package-iterator"
-                       "with-simple-restart" "with-standard-io-syntax"))
-              (cl-errs '("abort" "cerror")))
-
-          (list (append lisp-vdefs el-vdefs cl-vdefs)
-                (append el-tdefs eieio-tdefs cl-tdefs cl-lib-tdefs
-                        (mapcar (lambda (s) (concat "cl-" s)) cl-lib-tdefs))
-
-                ;; Elisp and Common Lisp definers.
-                (regexp-opt (append lisp-fdefs lisp-vdefs
-                                    el-fdefs el-vdefs el-tdefs
-                                    (mapcar (lambda (s) (concat "cl-" s))
-                                            (append cl-lib-fdefs cl-lib-tdefs))
-                                    eieio-fdefs eieio-tdefs)
-                            t)
-                (regexp-opt (append lisp-fdefs lisp-vdefs
-                                    cl-lib-fdefs cl-lib-tdefs
-                                    eieio-fdefs eieio-tdefs
-                                    cl-fdefs cl-vdefs cl-tdefs)
-                            t)
-
-                ;; Elisp and Common Lisp keywords.
-                (regexp-opt (append
-                             lisp-kw el-kw eieio-kw
-                             (cons "go" (mapcar (lambda (s) (concat "cl-" s))
-                                                (remove "go" cl-lib-kw))))
-                            t)
-                (regexp-opt (append lisp-kw cl-kw eieio-kw cl-lib-kw)
-                            t)
-
-                ;; Elisp and Common Lisp "errors".
-                (regexp-opt (append (mapcar (lambda (s) (concat "cl-" s))
-                                            cl-lib-errs)
-                                    lisp-errs el-errs)
-                            t)
-                (regexp-opt (append lisp-errs cl-lib-errs cl-errs) t))))))
-
-  (dolist (v vdefs)
-    (put (intern v) 'lisp-define-type 'var))
-  (dolist (v tdefs)
-    (put (intern v) 'lisp-define-type 'type))
-
-  (define-obsolete-variable-alias 'lisp-font-lock-keywords-1
-    'lisp-el-font-lock-keywords-1 "24.4")
-  (defconst lisp-el-font-lock-keywords-1
-    `( ;; Definitions.
-      (,(concat "(" el-defs-re "\\_>"
-                ;; Any whitespace and defined object.
-                "[ \t']*"
-               "\\(([ \t']*\\)?" ;; An opening paren.
-                "\\(\\(setf\\)[ 
\t]+\\(?:\\sw\\|\\s_\\)+\\|\\(?:\\sw\\|\\s_\\)+\\)?")
-       (1 font-lock-keyword-face)
-       (3 (let ((type (get (intern-soft (match-string 1)) 'lisp-define-type)))
-           (cond ((eq type 'var) font-lock-variable-name-face)
-                 ((eq type 'type) font-lock-type-face)
-                 ;; If match-string 2 is non-nil, we encountered a
-                 ;; form like (defalias (intern (concat s "-p"))),
-                 ;; unless match-string 4 is also there.  Then its a
-                 ;; defmethod with (setf foo) as name.
-                 ((or (not (match-string 2))  ;; Normal defun.
-                      (and (match-string 2)   ;; Setf method.
-                           (match-string 4))) font-lock-function-name-face)))
-         nil t))
-      ;; Emacs Lisp autoload cookies.  Supports the slightly different
-      ;; forms used by mh-e, calendar, etc.
-      ("^;;;###\\([-a-z]*autoload\\)" 1 font-lock-warning-face prepend))
-    "Subdued level highlighting for Emacs Lisp mode.")
-
-  (defconst lisp-cl-font-lock-keywords-1
-    `( ;; Definitions.
-      (,(concat "(" cl-defs-re "\\_>"
-                ;; Any whitespace and defined object.
-                "[ \t']*"
-               "\\(([ \t']*\\)?" ;; An opening paren.
-                "\\(\\(setf\\)[ 
\t]+\\(?:\\sw\\|\\s_\\)+\\|\\(?:\\sw\\|\\s_\\)+\\)?")
-       (1 font-lock-keyword-face)
-       (3 (let ((type (get (intern-soft (match-string 1)) 'lisp-define-type)))
-            (cond ((eq type 'var) font-lock-variable-name-face)
-                  ((eq type 'type) font-lock-type-face)
-                  ((or (not (match-string 2))  ;; Normal defun.
-                      (and (match-string 2)   ;; Setf function.
-                           (match-string 4))) font-lock-function-name-face)))
-          nil t)))
-    "Subdued level highlighting for Lisp modes.")
-
-  (define-obsolete-variable-alias 'lisp-font-lock-keywords-2
-    'lisp-el-font-lock-keywords-2 "24.4")
-  (defconst lisp-el-font-lock-keywords-2
-    (append
-     lisp-el-font-lock-keywords-1
-     `( ;; Regexp negated char group.
-       ("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)
-       ;; Control structures.  Common Lisp forms.
-       (lisp--el-match-keyword . 1)
-       ;; Exit/Feature symbols as constants.
-       (,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\_>"
-                 "[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
-        (1 font-lock-keyword-face)
-        (2 font-lock-constant-face nil t))
-       ;; Erroneous structures.
-       (,(concat "(" el-errs-re "\\_>")
-        (1 font-lock-warning-face))
-       ;; Words inside \\[] tend to be for `substitute-command-keys'.
-       ("\\\\\\\\\\[\\(\\(?:\\sw\\|\\s_\\)+\\)\\]"
-        (1 font-lock-constant-face prepend))
-       ;; Words inside `' tend to be symbol names.
-       ("`\\(\\(?:\\sw\\|\\s_\\)\\(?:\\sw\\|\\s_\\)+\\)'"
-        (1 font-lock-constant-face prepend))
-       ;; Constant values.
-       ("\\_<:\\(?:\\sw\\|\\s_\\)+\\_>" 0 font-lock-builtin-face)
-       ;; ELisp and CLisp `&' keywords as types.
-       ("\\_<\\&\\(?:\\sw\\|\\s_\\)+\\_>" . font-lock-type-face)
-       ;; ELisp regexp grouping constructs
-       (,(lambda (bound)
-           (catch 'found
-             ;; The following loop is needed to continue searching after 
matches
-             ;; that do not occur in strings.  The associated regexp matches 
one
-             ;; of `\\\\' `\\(' `\\(?:' `\\|' `\\)'.  `\\\\' has been included 
to
-             ;; avoid highlighting, for example, `\\(' in `\\\\('.
-             (while (re-search-forward 
"\\(\\\\\\\\\\)\\(?:\\(\\\\\\\\\\)\\|\\((\\(?:\\?[0-9]*:\\)?\\|[|)]\\)\\)" 
bound t)
-               (unless (match-beginning 2)
-                 (let ((face (get-text-property (1- (point)) 'face)))
-                   (when (or (and (listp face)
-                                  (memq 'font-lock-string-face face))
-                             (eq 'font-lock-string-face face))
-                     (throw 'found t)))))))
-        (1 'font-lock-regexp-grouping-backslash prepend)
-        (3 'font-lock-regexp-grouping-construct prepend))
-       ;; This is too general -- rms.
-       ;; A user complained that he has functions whose names start with `do'
-       ;; and that they get the wrong color.
-       ;; ;; CL `with-' and `do-' constructs
-       ;;("(\\(\\(do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face)
-       (lisp--match-hidden-arg
-        (0 '(face font-lock-warning-face
-             help-echo "Hidden behind deeper element; move to another line?")))
-       ))
-    "Gaudy level highlighting for Emacs Lisp mode.")
-
-  (defconst lisp-cl-font-lock-keywords-2
-    (append
-     lisp-cl-font-lock-keywords-1
-     `( ;; Regexp negated char group.
-       ("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)
-       ;; Control structures.  Common Lisp forms.
-       (,(concat "(" cl-kws-re "\\_>") . 1)
-       ;; Exit/Feature symbols as constants.
-       (,(concat "(\\(catch\\|throw\\|provide\\|require\\)\\_>"
-                 "[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
-        (1 font-lock-keyword-face)
-        (2 font-lock-constant-face nil t))
-       ;; Erroneous structures.
-       (,(concat "(" cl-errs-re "\\_>")
-        (1 font-lock-warning-face))
-       ;; Words inside `' tend to be symbol names.
-       ("`\\(\\(?:\\sw\\|\\s_\\)\\(?:\\sw\\|\\s_\\)+\\)'"
-        (1 font-lock-constant-face prepend))
-       ;; Constant values.
-       ("\\_<:\\(?:\\sw\\|\\s_\\)+\\_>" 0 font-lock-builtin-face)
-       ;; ELisp and CLisp `&' keywords as types.
-       ("\\_<\\&\\(?:\\sw\\|\\s_\\)+\\_>" . font-lock-type-face)
-       ;; This is too general -- rms.
-       ;; A user complained that he has functions whose names start with `do'
-       ;; and that they get the wrong color.
-       ;; ;; CL `with-' and `do-' constructs
-       ;;("(\\(\\(do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face)
-       (lisp--match-hidden-arg
-        (0 '(face font-lock-warning-face
-             help-echo "Hidden behind deeper element; move to another line?")))
-       ))
-    "Gaudy level highlighting for Lisp modes."))
+(let-when-compile
+    ((lisp-fdefs '("defmacro" "defsubst" "defun"))
+     (lisp-vdefs '("defvar"))
+     (lisp-kw '("cond" "if" "while" "let" "let*" "progn" "prog1"
+                "prog2" "lambda" "unwind-protect" "condition-case"
+                "when" "unless" "with-output-to-string"
+                "ignore-errors" "dotimes" "dolist" "declare"))
+     (lisp-errs '("warn" "error" "signal"))
+     ;; Elisp constructs.  Now they are update dynamically
+     ;; from obarray but they are also used for setting up
+     ;; the keywords for Common Lisp.
+     (el-fdefs '("define-advice" "defadvice" "defalias"
+                 "define-derived-mode" "define-minor-mode"
+                 "define-generic-mode" "define-global-minor-mode"
+                 "define-globalized-minor-mode" "define-skeleton"
+                 "define-widget"))
+     (el-vdefs '("defconst" "defcustom" "defvaralias" "defvar-local"
+                 "defface"))
+     (el-tdefs '("defgroup" "deftheme"))
+     (el-kw '("while-no-input" "letrec" "pcase" "pcase-exhaustive"
+              "pcase-lambda" "pcase-let" "pcase-let*" "save-restriction"
+              "save-excursion" "save-selected-window"
+              ;; "eval-after-load" "eval-next-after-load"
+              "save-window-excursion" "save-current-buffer"
+              "save-match-data" "combine-after-change-calls"
+              "condition-case-unless-debug" "track-mouse"
+              "eval-and-compile" "eval-when-compile" "with-case-table"
+              "with-category-table" "with-coding-priority"
+              "with-current-buffer" "with-demoted-errors"
+              "with-electric-help" "with-eval-after-load"
+              "with-file-modes"
+              "with-local-quit" "with-no-warnings"
+              "with-output-to-temp-buffer" "with-selected-window"
+              "with-selected-frame" "with-silent-modifications"
+              "with-syntax-table" "with-temp-buffer" "with-temp-file"
+              "with-temp-message" "with-timeout"
+              "with-timeout-handler"))
+     (el-errs '("user-error"))
+     ;; Common-Lisp constructs supported by EIEIO.  FIXME: namespace.
+     (eieio-fdefs '("defgeneric" "defmethod"))
+     (eieio-tdefs '("defclass"))
+     (eieio-kw '("with-slots"))
+     ;; Common-Lisp constructs supported by cl-lib.
+     (cl-lib-fdefs '("defmacro" "defsubst" "defun" "defmethod"))
+     (cl-lib-tdefs '("defstruct" "deftype"))
+     (cl-lib-kw '("progv" "eval-when" "case" "ecase" "typecase"
+                  "etypecase" "ccase" "ctypecase" "loop" "do" "do*"
+                  "the" "locally" "proclaim" "declaim" "letf" "go"
+                  ;; "lexical-let" "lexical-let*"
+                  "symbol-macrolet" "flet" "flet*" "destructuring-bind"
+                  "labels" "macrolet" "tagbody" "multiple-value-bind"
+                  "block" "return" "return-from"))
+     (cl-lib-errs '("assert" "check-type"))
+     ;; Common-Lisp constructs not supported by cl-lib.
+     (cl-fdefs '("defsetf" "define-method-combination"
+                 "define-condition" "define-setf-expander"
+                 ;; "define-function"??
+                 "define-compiler-macro" "define-modify-macro"))
+     (cl-vdefs '("define-symbol-macro" "defconstant" "defparameter"))
+     (cl-tdefs '("defpackage" "defstruct" "deftype"))
+     (cl-kw '("prog" "prog*" "handler-case" "handler-bind"
+              "in-package" "restart-case" ;; "inline"
+              "restart-bind" "break" "multiple-value-prog1"
+              "compiler-let" "with-accessors" "with-compilation-unit"
+              "with-condition-restarts" "with-hash-table-iterator"
+              "with-input-from-string" "with-open-file"
+              "with-open-stream" "with-package-iterator"
+              "with-simple-restart" "with-standard-io-syntax"))
+     (cl-errs '("abort" "cerror")))
+  (let ((vdefs (eval-when-compile
+                 (append lisp-vdefs el-vdefs cl-vdefs)))
+        (tdefs (eval-when-compile
+                 (append el-tdefs eieio-tdefs cl-tdefs cl-lib-tdefs
+                         (mapcar (lambda (s) (concat "cl-" s)) cl-lib-tdefs))))
+        ;; Elisp and Common Lisp definers.
+        (el-defs-re (eval-when-compile
+                      (regexp-opt (append lisp-fdefs lisp-vdefs
+                                          el-fdefs el-vdefs el-tdefs
+                                          (mapcar (lambda (s) (concat "cl-" s))
+                                                  (append cl-lib-fdefs 
cl-lib-tdefs))
+                                          eieio-fdefs eieio-tdefs)
+                                  t)))
+        (cl-defs-re (eval-when-compile
+                      (regexp-opt (append lisp-fdefs lisp-vdefs
+                                          cl-lib-fdefs cl-lib-tdefs
+                                          eieio-fdefs eieio-tdefs
+                                          cl-fdefs cl-vdefs cl-tdefs)
+                                  t)))
+        ;; Elisp and Common Lisp keywords.
+        ;; (el-kws-re (eval-when-compile
+        ;;              (regexp-opt (append
+        ;;                           lisp-kw el-kw eieio-kw
+        ;;                           (cons "go" (mapcar (lambda (s) (concat 
"cl-" s))
+        ;;                                              (remove "go" 
cl-lib-kw))))
+        ;;                          t)))
+        (cl-kws-re (eval-when-compile
+                     (regexp-opt (append lisp-kw cl-kw eieio-kw cl-lib-kw)
+                                 t)))
+        ;; Elisp and Common Lisp "errors".
+        (el-errs-re (eval-when-compile
+                      (regexp-opt (append (mapcar (lambda (s) (concat "cl-" s))
+                                                  cl-lib-errs)
+                                          lisp-errs el-errs)
+                                  t)))
+        (cl-errs-re (eval-when-compile
+                      (regexp-opt (append lisp-errs cl-lib-errs cl-errs) t))))
+    (dolist (v vdefs)
+      (put (intern v) 'lisp-define-type 'var))
+    (dolist (v tdefs)
+      (put (intern v) 'lisp-define-type 'type))
+
+    (define-obsolete-variable-alias 'lisp-font-lock-keywords-1
+        'lisp-el-font-lock-keywords-1 "24.4")
+    (defconst lisp-el-font-lock-keywords-1
+      `( ;; Definitions.
+        (,(concat "(" el-defs-re "\\_>"
+                  ;; Any whitespace and defined object.
+                  "[ \t']*"
+                  "\\(([ \t']*\\)?" ;; An opening paren.
+                  "\\(\\(setf\\)[ 
\t]+\\(?:\\sw\\|\\s_\\)+\\|\\(?:\\sw\\|\\s_\\)+\\)?")
+          (1 font-lock-keyword-face)
+          (3 (let ((type (get (intern-soft (match-string 1)) 
'lisp-define-type)))
+               (cond ((eq type 'var) font-lock-variable-name-face)
+                     ((eq type 'type) font-lock-type-face)
+                     ;; If match-string 2 is non-nil, we encountered a
+                     ;; form like (defalias (intern (concat s "-p"))),
+                     ;; unless match-string 4 is also there.  Then its a
+                     ;; defmethod with (setf foo) as name.
+                     ((or (not (match-string 2)) ;; Normal defun.
+                          (and (match-string 2)  ;; Setf method.
+                               (match-string 4))) 
font-lock-function-name-face)))
+             nil t))
+        ;; Emacs Lisp autoload cookies.  Supports the slightly different
+        ;; forms used by mh-e, calendar, etc.
+        ("^;;;###\\([-a-z]*autoload\\)" 1 font-lock-warning-face prepend))
+      "Subdued level highlighting for Emacs Lisp mode.")
+
+    (defconst lisp-cl-font-lock-keywords-1
+      `( ;; Definitions.
+        (,(concat "(" cl-defs-re "\\_>"
+                  ;; Any whitespace and defined object.
+                  "[ \t']*"
+                  "\\(([ \t']*\\)?" ;; An opening paren.
+                  "\\(\\(setf\\)[ 
\t]+\\(?:\\sw\\|\\s_\\)+\\|\\(?:\\sw\\|\\s_\\)+\\)?")
+          (1 font-lock-keyword-face)
+          (3 (let ((type (get (intern-soft (match-string 1)) 
'lisp-define-type)))
+               (cond ((eq type 'var) font-lock-variable-name-face)
+                     ((eq type 'type) font-lock-type-face)
+                     ((or (not (match-string 2)) ;; Normal defun.
+                          (and (match-string 2)  ;; Setf function.
+                               (match-string 4))) 
font-lock-function-name-face)))
+             nil t)))
+      "Subdued level highlighting for Lisp modes.")
+
+    (define-obsolete-variable-alias 'lisp-font-lock-keywords-2
+        'lisp-el-font-lock-keywords-2 "24.4")
+    (defconst lisp-el-font-lock-keywords-2
+      (append
+       lisp-el-font-lock-keywords-1
+       `( ;; Regexp negated char group.
+         ("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)
+         ;; Control structures.  Common Lisp forms.
+         (lisp--el-match-keyword . 1)
+         ;; Exit/Feature symbols as constants.
+         (,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\_>"
+                   "[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
+           (1 font-lock-keyword-face)
+           (2 font-lock-constant-face nil t))
+         ;; Erroneous structures.
+         (,(concat "(" el-errs-re "\\_>")
+           (1 font-lock-warning-face))
+         ;; Words inside \\[] tend to be for `substitute-command-keys'.
+         ("\\\\\\\\\\[\\(\\(?:\\sw\\|\\s_\\)+\\)\\]"
+          (1 font-lock-constant-face prepend))
+         ;; Words inside `' tend to be symbol names.
+         ("`\\(\\(?:\\sw\\|\\s_\\)\\(?:\\sw\\|\\s_\\)+\\)'"
+          (1 font-lock-constant-face prepend))
+         ;; Constant values.
+         ("\\_<:\\(?:\\sw\\|\\s_\\)+\\_>" 0 font-lock-builtin-face)
+         ;; ELisp and CLisp `&' keywords as types.
+         ("\\_<\\&\\(?:\\sw\\|\\s_\\)+\\_>" . font-lock-type-face)
+         ;; ELisp regexp grouping constructs
+         (,(lambda (bound)
+             (catch 'found
+               ;; The following loop is needed to continue searching after 
matches
+               ;; that do not occur in strings.  The associated regexp matches 
one
+               ;; of `\\\\' `\\(' `\\(?:' `\\|' `\\)'.  `\\\\' has been 
included to
+               ;; avoid highlighting, for example, `\\(' in `\\\\('.
+               (while (re-search-forward 
"\\(\\\\\\\\\\)\\(?:\\(\\\\\\\\\\)\\|\\((\\(?:\\?[0-9]*:\\)?\\|[|)]\\)\\)" 
bound t)
+                 (unless (match-beginning 2)
+                   (let ((face (get-text-property (1- (point)) 'face)))
+                     (when (or (and (listp face)
+                                    (memq 'font-lock-string-face face))
+                               (eq 'font-lock-string-face face))
+                       (throw 'found t)))))))
+           (1 'font-lock-regexp-grouping-backslash prepend)
+           (3 'font-lock-regexp-grouping-construct prepend))
+         ;; This is too general -- rms.
+         ;; A user complained that he has functions whose names start with `do'
+         ;; and that they get the wrong color.
+         ;; ;; CL `with-' and `do-' constructs
+         ;;("(\\(\\(do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 
font-lock-keyword-face)
+         (lisp--match-hidden-arg
+          (0 '(face font-lock-warning-face
+               help-echo "Hidden behind deeper element; move to another 
line?")))
+         ))
+      "Gaudy level highlighting for Emacs Lisp mode.")
+
+    (defconst lisp-cl-font-lock-keywords-2
+      (append
+       lisp-cl-font-lock-keywords-1
+       `( ;; Regexp negated char group.
+         ("\\[\\(\\^\\)" 1 font-lock-negation-char-face prepend)
+         ;; Control structures.  Common Lisp forms.
+         (,(concat "(" cl-kws-re "\\_>") . 1)
+         ;; Exit/Feature symbols as constants.
+         (,(concat "(\\(catch\\|throw\\|provide\\|require\\)\\_>"
+                   "[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
+           (1 font-lock-keyword-face)
+           (2 font-lock-constant-face nil t))
+         ;; Erroneous structures.
+         (,(concat "(" cl-errs-re "\\_>")
+           (1 font-lock-warning-face))
+         ;; Words inside `' tend to be symbol names.
+         ("`\\(\\(?:\\sw\\|\\s_\\)\\(?:\\sw\\|\\s_\\)+\\)'"
+          (1 font-lock-constant-face prepend))
+         ;; Constant values.
+         ("\\_<:\\(?:\\sw\\|\\s_\\)+\\_>" 0 font-lock-builtin-face)
+         ;; ELisp and CLisp `&' keywords as types.
+         ("\\_<\\&\\(?:\\sw\\|\\s_\\)+\\_>" . font-lock-type-face)
+         ;; This is too general -- rms.
+         ;; A user complained that he has functions whose names start with `do'
+         ;; and that they get the wrong color.
+         ;; ;; CL `with-' and `do-' constructs
+         ;;("(\\(\\(do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 
font-lock-keyword-face)
+         (lisp--match-hidden-arg
+          (0 '(face font-lock-warning-face
+               help-echo "Hidden behind deeper element; move to another 
line?")))
+         ))
+      "Gaudy level highlighting for Lisp modes.")))
 
 (define-obsolete-variable-alias 'lisp-font-lock-keywords
   'lisp-el-font-lock-keywords "24.4")
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index d401b31..7b7b48c 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -746,9 +746,10 @@ The context determines which symbols are considered.  If 
the
 symbol starts just after an open-parenthesis, only symbols with
 function definitions are considered.  Otherwise, all symbols with
 function definitions, values or properties are considered."
-  (declare (obsolete completion-at-point "24.4"))
+  (declare (obsolete completion-at-point "24.4")
+           (advertised-calling-convention () "25.1"))
   (interactive)
-  (let* ((data (lisp-completion-at-point))
+  (let* ((data (elisp-completion-at-point))
          (plist (nthcdr 3 data)))
     (if (null data)
         (minibuffer-message "Nothing to complete")
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 55fa962..b96518d 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -341,7 +341,7 @@ This variable is fed automatically by Emacs when installing 
a new package.
 This variable is used by `package-autoremove' to decide
 which packages are no longer needed.
 You can use it to (re)install packages on other machines
-by running `package-user-selected-packages-install'.
+by running `package-install-selected-packages'.
 
 To check if a package is contained in this list here, use
 `package--user-selected-p', as it may populate the variable with
@@ -350,8 +350,9 @@ a sane initial value."
 
 (defcustom package-menu-async t
   "If non-nil, package-menu will use async operations when possible.
-This includes refreshing archive contents as well as installing
-packages."
+Currently, only the refreshing of archive contents supports
+asynchronous operations.  Package transactions are still done
+synchronously."
   :type 'boolean
   :version "25.1")
 
@@ -1646,21 +1647,25 @@ These are packages which are neither contained in
              unless (memq p needed)
              collect p)))
 
-(defun package--used-elsewhere-p (pkg-desc &optional pkg-list)
+(defun package--used-elsewhere-p (pkg-desc &optional pkg-list all)
   "Non-nil if PKG-DESC is a dependency of a package in PKG-LIST.
 Return the first package found in PKG-LIST of which PKG is a
-dependency.
+dependency.  If ALL is non-nil, return all such packages instead.
 
 When not specified, PKG-LIST defaults to `package-alist'
 with PKG-DESC entry removed."
   (unless (string= (package-desc-status pkg-desc) "obsolete")
-    (let ((pkg (package-desc-name pkg-desc)))
-      (cl-loop with alist = (or pkg-list
-                                (remove (assq pkg package-alist)
-                                        package-alist))
-               for p in alist thereis
-               (and (memq pkg (mapcar #'car (package-desc-reqs (cadr p))))
-                    (car p))))))
+    (let* ((pkg (package-desc-name pkg-desc))
+           (alist (or pkg-list
+                      (remove (assq pkg package-alist)
+                              package-alist))))
+      (if all
+          (cl-loop for p in alist
+                   if (assq pkg (package-desc-reqs (cadr p)))
+                   collect (cadr p))
+        (cl-loop for p in alist thereis
+                 (and (assq pkg (package-desc-reqs (cadr p)))
+                      (cadr p)))))))
 
 (defun package--sort-deps-in-alist (package only)
   "Return a list of dependencies for PACKAGE sorted by dependency.
@@ -1708,31 +1713,26 @@ if all the in-between dependencies are also in 
PACKAGE-LIST."
   "Return the archive containing the package NAME."
   (cdr (assoc (package-desc-archive desc) package-archives)))
 
-(defun package-install-from-archive (pkg-desc &optional async callback)
-  "Download and install a tar package.
-If ASYNC is non-nil, perform the download asynchronously.
-If CALLBACK is non-nil, call it with no arguments once the
-operation is done."
+(defun package-install-from-archive (pkg-desc)
+  "Download and install a tar package."
   ;; This won't happen, unless the archive is doing something wrong.
   (when (eq (package-desc-kind pkg-desc) 'dir)
     (error "Can't install directory package from archive"))
   (let* ((location (package-archive-base pkg-desc))
          (file (concat (package-desc-full-name pkg-desc)
                        (package-desc-suffix pkg-desc))))
-    (package--with-work-buffer-async location file async
+    (package--with-work-buffer location file
       (if (or (not package-check-signature)
               (member (package-desc-archive pkg-desc)
                       package-unsigned-archives))
           ;; If we don't care about the signature, unpack and we're
           ;; done.
-          (progn (let ((save-silently    async)
-                       (inhibit-message  async))
-                   (package-unpack pkg-desc))
-                 (funcall callback))
+          (let ((save-silently t))
+            (package-unpack pkg-desc))
         ;; If we care, check it and *then* write the file.
         (let ((content (buffer-string)))
           (package--check-signature
-           location file content async
+           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))
@@ -1742,8 +1742,7 @@ operation is done."
                  (package-desc-name pkg-desc)))
              ;; Signature checked, unpack now.
              (with-temp-buffer (insert content)
-                               (let ((save-silently    async)
-                                     (inhibit-message  async))
+                               (let ((save-silently t))
                                  (package-unpack pkg-desc)))
              ;; Here the package has been installed successfully, mark it as
              ;; signed if appropriate.
@@ -1759,9 +1758,7 @@ operation is done."
                (setf (package-desc-signed pkg-desc) t)
                ;; Update the new (activated) pkg-desc as well.
                (when-let ((pkg-descs (cdr (assq (package-desc-name pkg-desc) 
package-alist))))
-                 (setf (package-desc-signed (car pkg-descs)) t)))
-             (when (functionp callback)
-               (funcall callback)))))))))
+                 (setf (package-desc-signed (car pkg-descs)) t))))))))))
 
 (defun package-installed-p (package &optional min-version)
   "Return true if PACKAGE, of MIN-VERSION or newer, is installed.
@@ -1782,25 +1779,13 @@ If PACKAGE is a package-desc object, MIN-VERSION is 
ignored."
      ;; Also check built-in packages.
      (package-built-in-p package min-version))))
 
-(defun package-download-transaction (packages &optional async callback)
+(defun package-download-transaction (packages)
   "Download and install all the packages in PACKAGES.
 PACKAGES should be a list of package-desc.
-If ASYNC is non-nil, perform the downloads asynchronously.
-If CALLBACK is non-nil, call it with no arguments once the
-entire operation is done.
-
 This function assumes that all package requirements in
 PACKAGES are satisfied, i.e. that PACKAGES is computed
 using `package-compute-transaction'."
-  (cond
-   (packages (package-install-from-archive
-              (car packages)
-              async
-              (lambda ()
-                (package-download-transaction (cdr packages))
-                (when (functionp callback)
-                  (funcall callback)))))
-   (callback (funcall callback))))
+  (mapc #'package-install-from-archive packages))
 
 (defun package--ensure-init-file ()
   "Ensure that the user's init file has `package-initialize'.
@@ -1853,16 +1838,13 @@ add a call to it along with some explanatory comments."
   (setq package--init-file-ensured t))
 
 ;;;###autoload
-(defun package-install (pkg &optional dont-select async callback)
+(defun package-install (pkg &optional dont-select)
   "Install the package PKG.
 PKG can be a package-desc or the package name of one the available packages
 in an archive in `package-archives'.  Interactively, prompt for its name.
 
 If called interactively or if DONT-SELECT nil, add PKG to
 `package-selected-packages'.
-If ASYNC is non-nil, perform the downloads asynchronously.
-If CALLBACK is non-nil, call it with no arguments once the
-entire operation is done.
 
 If PKG is a package-desc and it is already installed, don't try
 to install it but still mark it as selected."
@@ -1895,9 +1877,8 @@ to install it but still mark it as selected."
                   (package-compute-transaction (list pkg)
                                                (package-desc-reqs pkg)))
               (package-compute-transaction () (list (list pkg))))))
-      (package-download-transaction transaction async callback)
-    (message "`%s' is already installed" (package-desc-full-name pkg))
-    (funcall callback)))
+      (package-download-transaction transaction)
+    (message "`%s' is already installed" (package-desc-full-name pkg))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.
@@ -2027,7 +2008,7 @@ If NOSAVE is non-nil, the package is not removed from
            ;; Don't delete packages used as dependency elsewhere.
            (error "Package `%s' is used by `%s' as dependency, not deleting"
                   (package-desc-full-name pkg-desc)
-                  pkg-used-elsewhere-by))
+                  (package-desc-name pkg-used-elsewhere-by)))
           (t
            (delete-directory dir t t)
            ;; Remove NAME-VERSION.signed file.
@@ -2127,6 +2108,7 @@ will be deleted."
          (name (if desc (package-desc-name desc) pkg))
          (pkg-dir (if desc (package-desc-dir desc)))
          (reqs (if desc (package-desc-reqs desc)))
+         (required-by (if desc (package--used-elsewhere-p desc nil 'all)))
          (version (if desc (package-desc-version desc)))
          (archive (if desc (package-desc-archive desc)))
          (extras (and desc (package-desc-extras desc)))
@@ -2168,7 +2150,14 @@ will be deleted."
              (insert "'"))
            (if signed
                (insert ".")
-             (insert " (unsigned).")))
+             (insert " (unsigned)."))
+           (when (and (package-desc-p desc)
+                      (not required-by)
+                      (package-installed-p desc))
+             (insert " ")
+             (package-make-button "Delete"
+                                  'action #'package-delete-button-action
+                                  'package-desc desc)))
           (incompatible-reason
            (insert (propertize "Incompatible" 'face font-lock-warning-face)
                    " because it depends on ")
@@ -2212,6 +2201,19 @@ will be deleted."
             (help-insert-xref-button text 'help-package name)
             (insert reason)))
         (insert "\n")))
+    (when required-by
+      (insert (propertize "Required by" 'font-lock-face 'bold) ": ")
+      (let ((first t))
+        (dolist (pkg required-by)
+          (let ((text (package-desc-full-name pkg)))
+            (cond (first (setq first nil))
+                  ((>= (+ 2 (current-column) (length text))
+                       (window-width))
+                   (insert ",\n               "))
+                  (t (insert ", ")))
+            (help-insert-xref-button text 'help-package
+                                     (package-desc-name pkg))))
+        (insert "\n")))
     (insert "    " (propertize "Summary" 'font-lock-face 'bold)
             ": " (if desc (package-desc-summary desc)) "\n")
     (when homepage
@@ -2299,6 +2301,14 @@ will be deleted."
       (revert-buffer nil t)
       (goto-char (point-min)))))
 
+(defun package-delete-button-action (button)
+  (let ((pkg-desc (button-get button 'package-desc)))
+    (when (y-or-n-p (format "Delete package `%s'? "
+                      (package-desc-full-name pkg-desc)))
+      (package-delete pkg-desc)
+      (revert-buffer nil t)
+      (goto-char (point-min)))))
+
 (defun package-keyword-button-action (button)
   (let ((pkg-keyword (button-get button 'package-keyword)))
     (package-show-package-list t (list pkg-keyword))))
@@ -2390,12 +2400,17 @@ will be deleted."
 (defvar package-menu--new-package-list nil
   "List of newly-available packages since `list-packages' was last called.")
 
+(defvar package-menu--transaction-status nil
+  "Mode-line status of ongoing package transaction.")
+
 (define-derived-mode package-menu-mode tabulated-list-mode "Package Menu"
   "Major mode for browsing a list of packages.
 Letters do not insert themselves; instead, they are commands.
 \\<package-menu-mode-map>
 \\{package-menu-mode-map}"
-  (setq mode-line-process '(package--downloads-in-progress ":Loading"))
+  (setq mode-line-process '((package--downloads-in-progress ":Loading")
+                            (package-menu--transaction-status
+                             package-menu--transaction-status)))
   (setq tabulated-list-format
         `[("Package" 18 package-menu--name-predicate)
           ("Version" 13 nil)
@@ -2885,57 +2900,77 @@ prompt (see `package-menu--prompt-transaction-p')."
    (t (format "package `%s'"
         (package-desc-full-name (car packages))))))
 
-(defun package-menu--prompt-transaction-p (install delete)
-  "Prompt the user about installing INSTALL and deleting DELETE.
-INSTALL and DELETE are lists of `package-desc'.  Either may be
-nil, but not both."
+(defun package-menu--prompt-transaction-p (delete install upgrade)
+  "Prompt the user about DELETE, INSTALL, and UPGRADE.
+DELETE, INSTALL, and UPGRADE are lists of `package-desc' objects.
+Either may be nil, but not all."
+  (y-or-n-p
+   (concat
+    (when delete "Delete ")
+    (package-menu--list-to-prompt delete)
+    (when (and delete install)
+      (if upgrade "; " "; and "))
+    (when install "Install ")
+    (package-menu--list-to-prompt install)
+    (when (and upgrade (or install delete)) "; and ")
+    (when upgrade "Upgrade ")
+    (package-menu--list-to-prompt upgrade)
+    "? ")))
+
+(defun package-menu--partition-transaction (install delete)
+  "Return an alist describing an INSTALL DELETE transaction.
+Alist contains three entries, upgrade, delete, and install, each
+with a list of package names.
+
+The upgrade entry contains any `package-desc' objects in INSTALL
+whose name coincides with an object in DELETE.  The delete and
+the install entries are the same as DELETE and INSTALL with such
+objects removed."
   (let* ((upg (cl-intersection install delete :key #'package-desc-name))
          (ins (cl-set-difference install upg :key #'package-desc-name))
          (del (cl-set-difference delete upg :key #'package-desc-name)))
-    (y-or-n-p
-     (concat
-      (when del "Delete ")
-      (package-menu--list-to-prompt del)
-      (when (and del ins)
-        (if upg "; " "; and "))
-      (when ins "Install ")
-      (package-menu--list-to-prompt ins)
-      (when (and upg (or ins del)) "; and ")
-      (when upg "Upgrade ")
-      (package-menu--list-to-prompt upg)
-      "? "))))
-
-(defun package-menu--perform-transaction (install-list delete-list &optional 
async)
-  "Install packages in INSTALL-LIST and delete DELETE-LIST.
-If ASYNC is non-nil, perform the installation downloads
-asynchronously."
-  ;; While there are packages to install, call `package-install' on
-  ;; the next one and defer deletion to the callback function.
+    `((delete . ,del) (install . ,ins) (upgrade . ,upg))))
+
+(defun package-menu--perform-transaction (install-list delete-list)
+  "Install packages in INSTALL-LIST and delete DELETE-LIST."
   (if install-list
-      (let* ((pkg (car install-list))
-             (rest (cdr install-list))
-             ;; Don't mark as selected if it's a new version of an
-             ;; installed package.
-             (dont-mark (and (not (package-installed-p pkg))
-                             (package-installed-p
-                              (package-desc-name pkg)))))
-        (package-install
-         pkg dont-mark async
-         (lambda () (package-menu--perform-transaction rest delete-list 
async))))
-    (let ((inhibit-message async))
-      ;; Once there are no more packages to install, proceed to
-      ;; deletion.
+      (let ((status-format (format ":Installing %%d/%d"
+                             (length install-list)))
+            (i 0)
+            (package-menu--transaction-status))
+        (dolist (pkg install-list)
+          (setq package-menu--transaction-status
+                (format status-format (cl-incf i)))
+          (force-mode-line-update)
+          (redisplay 'force)
+          ;; Don't mark as selected, `package-menu-execute' already
+          ;; does that.
+          (package-install pkg 'dont-select)))
+    ;; Once there are no more packages to install, proceed to
+    ;; deletion.
+    (let ((package-menu--transaction-status ":Deleting"))
+      (force-mode-line-update)
+      (redisplay 'force)
       (dolist (elt (package--sort-by-dependence delete-list))
         (condition-case-unless-debug err
-            (package-delete elt)
-          (error (message (cadr err))))))
-    (message "Transaction done")
-    (when package-selected-packages
-      (when-let ((removable (package--removable-packages)))
-        (message "These %d packages are no longer needed, type `M-x 
package-autoremove' to remove them (%s)"
-          (length removable)
-          (mapconcat #'symbol-name removable ", "))))
-    (package-menu--post-refresh)))
+            (let ((inhibit-message t))
+              (package-delete elt nil 'nosave))
+          (error (message (cadr err))))))))
+
+(defun package--update-selected-packages (add remove)
+  "Update the `package-selected-packages' list according to ADD and REMOVE.
+ADD and REMOVE must be disjoint lists of package names (or
+`package-desc' objects) to be added and removed to the selected
+packages list, respectively."
+  (dolist (p add)
+    (cl-pushnew (if (package-desc-p p) (package-desc-name p) p)
+                package-selected-packages))
+  (dolist (p remove)
+    (setq package-selected-packages
+          (remove (if (package-desc-p p) (package-desc-name p) p)
+                  package-selected-packages)))
+  (when (or add remove)
+    (package--save-selected-packages package-selected-packages)))
 
 (defun package-menu-execute (&optional noquery)
   "Perform marked Package Menu actions.
@@ -2960,12 +2995,30 @@ Optional argument NOQUERY non-nil means do not ask the 
user to confirm."
         (forward-line)))
     (unless (or delete-list install-list)
       (user-error "No operations specified"))
-    (when (or noquery
-              (package-menu--prompt-transaction-p install-list delete-list))
-      (message "Transaction started")
-      ;; This calls `package-menu--generate' after everything's done.
-      (package-menu--perform-transaction
-       install-list delete-list package-menu-async))))
+    (let-alist (package-menu--partition-transaction install-list delete-list)
+      (when (or noquery
+                (package-menu--prompt-transaction-p .delete .install .upgrade))
+        (let ((message-template
+               (concat "Package menu: Operation %s ["
+                       (when .delete  (format "Delet__ %s" (length .delete)))
+                       (when (and .delete .install) "; ")
+                       (when .install (format "Install__ %s" (length 
.install)))
+                       (when (and .upgrade (or .install .delete)) "; ")
+                       (when .upgrade (format "Upgrad__ %s" (length .upgrade)))
+                       "]")))
+          (message (replace-regexp-in-string "__" "ing" message-template) 
"started")
+          ;; Packages being upgraded are not marked as selected.
+          (package--update-selected-packages .install .delete)
+          (package-menu--perform-transaction install-list delete-list)
+          (when package-selected-packages
+            (if-let ((removable (package--removable-packages)))
+                (message "Package menu: Operation finished.  %d packages %s"
+                  (length removable)
+                  "are no longer needed, type `M-x package-autoremove' to 
remove them")
+              (message (replace-regexp-in-string "__" "ed" message-template)
+                "finished"))))
+        ;; This calls `package-menu--generate'.
+        (package-menu--post-refresh)))))
 
 (defun package-menu--version-predicate (A B)
   (let ((vA (or (aref (cadr A) 1)  '(0)))
diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el
index bd178fa..e6d451a 100644
--- a/lisp/emacs-lisp/subr-x.el
+++ b/lisp/emacs-lisp/subr-x.el
@@ -140,6 +140,10 @@ to bind a single value, BINDINGS can just be a plain 
tuple."
   (declare (indent 1) (debug if-let))
   (list 'if-let bindings (macroexp-progn body)))
 
+(defsubst hash-table-empty-p (hash-table)
+  "Check whether HASH-TABLE is empty (has 0 elements)."
+  (zerop (hash-table-count hash-table)))
+
 (defsubst hash-table-keys (hash-table)
   "Return a list of keys in HASH-TABLE."
   (let ((keys '()))
diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el
index 81ef7a6..05dd7d5 100644
--- a/lisp/emacs-lisp/syntax.el
+++ b/lisp/emacs-lisp/syntax.el
@@ -574,7 +574,7 @@ running the hook."
 
 ;; (defun buffer-syntactic-context (&optional buffer)
 ;;   "Syntactic context at point in BUFFER.
-;; Either of `string', `comment' or `nil'.
+;; Either of `string', `comment' or nil.
 ;; This is an XEmacs compatibility function."
 ;;   (with-current-buffer (or buffer (current-buffer))
 ;;     (syntax-ppss-context (syntax-ppss))))
diff --git a/lisp/emulation/viper-util.el b/lisp/emulation/viper-util.el
index 59f4752..c4dc569 100644
--- a/lisp/emulation/viper-util.el
+++ b/lisp/emulation/viper-util.el
@@ -1301,7 +1301,7 @@ Usually contains ` ', linefeed, TAB or formfeed.")
     ))
 
 ;; SYMBOL is used because customize requires it, but it is ignored, unless it
-;; is `nil'.  If nil, use setq.
+;; is nil.  If nil, use setq.
 (defun viper-set-syntax-preference (&optional symbol value)
   "Set Viper syntax preference.
 If called interactively or if SYMBOL is nil, sets syntax preference in current
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index 8ce199f..ee81113 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -652,7 +652,7 @@ EVENT is the message received from the closed connection 
process."
                          (run-at-time erc-server-reconnect-timeout nil
                                       #'erc-process-sentinel-2
                                       event buffer)
-                       (error (concat "`erc-server-reconnect-timeout`"
+                       (error (concat "`erc-server-reconnect-timeout'"
                                       " must be a number")))))))))))
 
 (defun erc-process-sentinel-1 (event buffer)
diff --git a/lisp/erc/erc-ezbounce.el b/lisp/erc/erc-ezbounce.el
index 5f91be8..de2a2ff 100644
--- a/lisp/erc/erc-ezbounce.el
+++ b/lisp/erc/erc-ezbounce.el
@@ -78,7 +78,7 @@ The alist's format is as follows:
 (defun erc-ezb-get-login (server port)
   "Return an appropriate EZBounce login for SERVER and PORT.
 Look up entries in `erc-ezb-login-alist'. If the username or password
-in the alist is `nil', prompt for the appropriate values."
+in the alist is nil, prompt for the appropriate values."
   (let ((login (cdr (assoc (cons server port) erc-ezb-login-alist))))
     (when login
       (let ((username (car login))
diff --git a/lisp/erc/erc-pcomplete.el b/lisp/erc/erc-pcomplete.el
index 7f901ed..e46ac68 100644
--- a/lisp/erc/erc-pcomplete.el
+++ b/lisp/erc/erc-pcomplete.el
@@ -33,7 +33,7 @@
 ;;
 ;; If you want nickname completions ordered such that the most recent
 ;; speakers are listed first, set
-;; `erc-pcomplete-order-nickname-completions' to `t'.
+;; `erc-pcomplete-order-nickname-completions' to t.
 ;;
 ;; See CREDITS for other contributors.
 ;;
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index cf422f1..ad5e1a2 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -1,3 +1,4 @@
+
 ;; erc.el --- An Emacs Internet Relay Chat client  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1997-2015 Free Software Foundation, Inc.
@@ -12,6 +13,7 @@
 ;;               Kelvin White (address@hidden)
 ;; Maintainer: address@hidden
 ;; Keywords: IRC, chat, client, Internet
+
 ;; Version: 5.3
 
 ;; This file is part of GNU Emacs.
@@ -37,15 +39,13 @@
 ;; * http://sv.gnu.org/projects/erc/
 ;; * http://www.emacswiki.org/cgi-bin/wiki/ERC
 
+
+
 ;; As of 2006-06-13, ERC development is now hosted on Savannah
 ;; (http://sv.gnu.org/projects/erc).  I invite everyone who wants to
 ;; hack on it to contact me <address@hidden> in order to get write
 ;; access to the shared Arch archive.
 
-;; Installation:
-
-;; Put erc.el in your load-path, and put (require 'erc) in your .emacs.
-
 ;; Configuration:
 
 ;; Use M-x customize-group RET erc RET to get an overview
@@ -258,11 +258,25 @@ If nil, only \"> \" will be shown."
           (repeat :inline t :tag "Others" (string :tag "IRC Message Type"))))
 
 (defcustom erc-hide-list nil
-  "List of IRC type messages to hide.
+  "A global list of IRC message types to hide.
 A typical value would be '(\"JOIN\" \"PART\" \"QUIT\")."
   :group 'erc-ignore
   :type 'erc-message-type)
 
+(defcustom erc-network-hide-list nil
+  "A list of IRC networks to hide message types from.
+A typical value would be '((\"freenode\" \"MODE\")
+(\"OFTC\" \"JOIN\" \"QUIT\"))."
+  :group 'erc-ignore
+  :type 'erc-message-type)
+
+(defcustom erc-channel-hide-list nil
+  "A list of IRC channels to hide message types from.
+A typical value would be '((\"#emacs\" \"QUIT\" \JOIN\")
+(\"#erc\" \"NICK\")."
+  :group 'erc-ignore
+  :type 'erc-message-type)
+
 (defvar erc-session-password nil
   "The password used for the current session.")
 (make-variable-buffer-local 'erc-session-password)
@@ -2616,15 +2630,36 @@ otherwise `erc-server-announced-name'.  SERVER is 
matched against
                erc-common-server-suffixes))
         erc-server-announced-name)))
 
+(defun erc-add-targets (scope target-list)
+  (let ((targets
+        (mapcar (lambda (targets) (member scope targets)) target-list)))
+    (cdr (apply 'append (delete nil targets)))))
+
 (defun erc-hide-current-message-p (parsed)
   "Predicate indicating whether the parsed ERC response PARSED should be 
hidden.
 
 Messages are always hidden if the message type of PARSED appears in
-`erc-hide-list'.  In addition, messages whose type is a member of
-`erc-lurker-hide-list' are hidden if `erc-lurker-p' returns true."
+`erc-hide-list'. Message types that appear in `erc-network-hide-list'
+or `erc-channel-hide-list' are are only hidden if the target matches
+the network or channel in the list. In addition, messages whose type
+is a member of `erc-lurker-hide-list' are hidden if `erc-lurker-p'
+returns non-nil."
   (let* ((command (erc-response.command parsed))
-         (sender (car (erc-parse-user (erc-response.sender parsed)))))
+         (sender (car (erc-parse-user (erc-response.sender parsed))))
+         (channel (nth 1 (erc-response.command-args parsed)))
+         (network (or (and (fboundp 'erc-network-name) (erc-network-name))
+                     (erc-shorten-server-name
+                      (or erc-server-announced-name
+                          erc-session-server))))
+        (current-hide-list
+         (when erc-network-hide-list
+           (erc-add-targets network erc-network-hide-list)))
+        (current-hide-list
+         (apply 'append current-hide-list
+                (when erc-channel-hide-list
+                  (erc-add-targets channel erc-channel-hide-list)))))
     (or (member command erc-hide-list)
+        (member command current-hide-list)
         (and (member command erc-lurker-hide-list) (erc-lurker-p sender)))))
 
 (defun erc-display-message (parsed type buffer msg &rest args)
@@ -4150,7 +4185,7 @@ See also `erc-display-error-notice'."
                                    ;; server's setting if we haven't
                                    ;; established a connection yet
                                    (- 9 (length erc-nick-uniquifier))))
-                                erc-nick-uniquifier)))
+                               erc-nick-uniqifier)))
       (erc-cmd-NICK newnick)
       (erc-display-error-notice
        nil
diff --git a/lisp/eshell/em-term.el b/lisp/eshell/em-term.el
index 4a6ac23..9ac2813 100644
--- a/lisp/eshell/em-term.el
+++ b/lisp/eshell/em-term.el
@@ -132,6 +132,13 @@ character to the invoked process."
   :type 'boolean
   :group 'eshell-term)
 
+(defcustom eshell-destroy-buffer-when-process-dies nil
+  "If non-nil, term buffers are destroyed after their processes die.
+WARNING: Setting this to non-nil may result in unexpected
+behavior for short-lived processes, see bug#18108."
+  :type 'boolean
+  :group 'eshell-term)
+
 ;;; Internal Variables:
 
 (defvar eshell-parent-buffer)
@@ -190,20 +197,24 @@ allowed."
   nil)
 
 ;; Process sentinels receive two arguments.
-(defun eshell-term-sentinel (proc _string)
-  "Destroy the buffer visiting PROC."
-  (let ((proc-buf (process-buffer proc)))
-    (when (and proc-buf (buffer-live-p proc-buf)
-              (not (eq 'run (process-status proc)))
-              (= (process-exit-status proc) 0))
-      (if (eq (current-buffer) proc-buf)
-         (let ((buf (and (boundp 'eshell-parent-buffer)
-                         eshell-parent-buffer
-                         (buffer-live-p eshell-parent-buffer)
-                         eshell-parent-buffer)))
-           (if buf
-               (switch-to-buffer buf))))
-      (kill-buffer proc-buf))))
+(defun eshell-term-sentinel (proc msg)
+  "Clean up the buffer visiting PROC.
+If `eshell-destroy-buffer-when-process-dies' is non-nil, destroy
+the buffer."
+  (term-sentinel proc msg) ;; First call the normal term sentinel.
+  (when eshell-destroy-buffer-when-process-dies
+    (let ((proc-buf (process-buffer proc)))
+      (when (and proc-buf (buffer-live-p proc-buf)
+                 (not (eq 'run (process-status proc)))
+                 (= (process-exit-status proc) 0))
+        (if (eq (current-buffer) proc-buf)
+            (let ((buf (and (boundp 'eshell-parent-buffer)
+                            eshell-parent-buffer
+                            (buffer-live-p eshell-parent-buffer)
+                            eshell-parent-buffer)))
+              (if buf
+                  (switch-to-buffer buf))))
+        (kill-buffer proc-buf)))))
 
 ;; jww (1999-09-17): The code below will allow Eshell to send input
 ;; characters directly to the currently running interactive process.
diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el
index a5f697f..49ba727 100644
--- a/lisp/eshell/esh-arg.el
+++ b/lisp/eshell/esh-arg.el
@@ -357,22 +357,31 @@ after are both returned."
          (goto-char (1+ end)))))))
 
 (defun eshell-parse-special-reference ()
-  "Parse a special syntax reference, of the form '#<type arg>'."
-  (if (and (not eshell-current-argument)
-          (not eshell-current-quoted)
-          (looking-at "#<\\(buffer\\|process\\)\\s-"))
-      (let ((here (point)))
-       (goto-char (match-end 0))
-       (let* ((buffer-p (string= (match-string 1) "buffer"))
-              (end (eshell-find-delimiter ?\< ?\>)))
-         (if (not end)
-             (throw 'eshell-incomplete ?\<)
-           (if (eshell-arg-delimiter (1+ end))
-               (prog1
-                   (list (if buffer-p 'get-buffer-create 'get-process)
-                         (buffer-substring-no-properties (point) end))
-                 (goto-char (1+ end)))
-             (ignore (goto-char here))))))))
+  "Parse a special syntax reference, of the form '#<args>'.
+
+args           := `type' `whitespace' `arbitrary-args' | `arbitrary-args'
+type           := \"buffer\" or \"process\"
+arbitrary-args := any string of characters.
+
+If the form has no 'type', the syntax is parsed as if 'type' were
+\"buffer\"."
+  (when (and (not eshell-current-argument)
+             (not eshell-current-quoted)
+             (looking-at "#<\\(\\(buffer\\|process\\)\\s-\\)?"))
+    (let ((here (point)))
+      (goto-char (match-end 0)) ;; Go to the end of the match.
+      (let ((buffer-p (if (match-string 1)
+                          (string= (match-string 2) "buffer")
+                        t)) ;; buffer-p is non-nil by default.
+            (end (eshell-find-delimiter ?\< ?\>)))
+        (when (not end)
+          (throw 'eshell-incomplete ?\<))
+        (if (eshell-arg-delimiter (1+ end))
+            (prog1
+                (list (if buffer-p 'get-buffer-create 'get-process)
+                      (buffer-substring-no-properties (point) end))
+              (goto-char (1+ end)))
+          (ignore (goto-char here)))))))
 
 (defun eshell-parse-delimiter ()
   "Parse an argument delimiter, which is essentially a command operator."
diff --git a/lisp/eshell/esh-io.el b/lisp/eshell/esh-io.el
index 7dfc39f..dc731bc 100644
--- a/lisp/eshell/esh-io.el
+++ b/lisp/eshell/esh-io.el
@@ -31,6 +31,18 @@
 ;; consistent with most shells.  Therefore, only unique features are
 ;; mentioned here.
 ;;
+;;;_* Redirect to a Buffer or Process
+;;
+;; Buffers and processes can be named with '#<buffer buffer-name>' and
+;; '#<process process-name>', respectively. As a shorthand,
+;; '#<buffer-name>' without the explicit "buffer" arg is equivalent to
+;; '#<buffer buffer-name>'.
+;;
+;;   echo hello > #<buffer *scratch*> # Overwrite '*scratch*' with 'hello'.
+;;   echo hello > #<*scratch*>        # Same as the command above.
+;;
+;;   echo hello > #<process shell> # Pipe "hello" into the shell process.
+;;
 ;;;_* Insertion
 ;;
 ;; To insert at the location of point in a buffer, use '>>>':
@@ -98,19 +110,6 @@ other buffers) ."
   :type 'integer
   :group 'eshell-io)
 
-(defcustom eshell-buffer-shorthand nil
-  "If non-nil, a symbol name can be used for a buffer in redirection.
-If nil, redirecting to a buffer requires buffer name syntax.  If this
-variable is set, redirection directly to Lisp symbols will be
-impossible.
-
-Example:
-
-  echo hello > '*scratch*  ; works if `eshell-buffer-shorthand' is t
-  echo hello > #<buffer *scratch*>  ; always works"
-  :type 'boolean
-  :group 'eshell-io)
-
 (defcustom eshell-print-queue-size 5
   "The size of the print queue, for doing buffered printing.
 This is basically a speed enhancement, to avoid blocking the Lisp code
@@ -355,21 +354,14 @@ it defaults to `insert'."
                   (goto-char (point-max))))
            (point-marker))))))
 
-   ((or (bufferp target)
-       (and (boundp 'eshell-buffer-shorthand)
-            (symbol-value 'eshell-buffer-shorthand)
-            (symbolp target)
-            (not (memq target '(t nil)))))
-    (let ((buf (if (bufferp target)
-                  target
-                (get-buffer-create
-                 (symbol-name target)))))
-      (with-current-buffer buf
-       (cond ((eq mode 'overwrite)
-              (erase-buffer))
-             ((eq mode 'append)
-              (goto-char (point-max))))
-       (point-marker))))
+
+   ((bufferp target)
+    (with-current-buffer target
+      (cond ((eq mode 'overwrite)
+             (erase-buffer))
+            ((eq mode 'append)
+             (goto-char (point-max))))
+      (point-marker)))
 
    ((functionp target) nil)
 
diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el
index 222e801..0dac478 100644
--- a/lisp/eshell/esh-mode.el
+++ b/lisp/eshell/esh-mode.el
@@ -206,7 +206,7 @@ This is used by `eshell-watch-for-password-prompt'."
 
 ;; Internal Variables:
 
-;; these are only set to `nil' initially for the sake of the
+;; these are only set to nil initially for the sake of the
 ;; byte-compiler, when compiling other files which `require' this one
 (defvar eshell-mode nil)
 (defvar eshell-mode-map nil)
diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el
index 697f97e..170779f 100644
--- a/lisp/eshell/esh-util.el
+++ b/lisp/eshell/esh-util.el
@@ -33,7 +33,7 @@
 ;;; User Variables:
 
 (defcustom eshell-stringify-t t
-  "If non-nil, the string representation of t is 't'.
+  "If non-nil, the string representation of t is \"t\".
 If nil, t will be represented only in the exit code of the function,
 and not printed as a string.  This causes Lisp functions to behave
 similarly to external commands, as far as successful result output."
diff --git a/lisp/face-remap.el b/lisp/face-remap.el
index 3ec074b..93eec5b 100644
--- a/lisp/face-remap.el
+++ b/lisp/face-remap.el
@@ -187,7 +187,7 @@ of face attribute/value pairs, like in a `face' text 
property.
 
 If SPECS is empty, call `face-remap-reset-base' to use the normal
 definition of FACE as the base remapping; note that this is
-different from SPECS containing a single value `nil', which means
+different from SPECS containing a single value nil, which means
 not to inherit from the global definition of FACE at all."
   (while (and (consp specs) (not (null (car specs))) (null (cdr specs)))
     (setq specs (car specs)))
diff --git a/lisp/facemenu.el b/lisp/facemenu.el
index 2c246b4..3d58943 100644
--- a/lisp/facemenu.el
+++ b/lisp/facemenu.el
@@ -458,7 +458,7 @@ These special properties include `invisible', `intangible' 
and `read-only'."
 
 (defcustom list-colors-sort nil
   "Color sort order for `list-colors-display'.
-`nil' means default implementation-dependent order (defined in `x-colors').
+nil means default implementation-dependent order (defined in `x-colors').
 `name' sorts by color name.
 `rgb' sorts by red, green, blue components.
 `(rgb-dist . COLOR)' sorts by the RGB distance to the specified color.
diff --git a/lisp/faces.el b/lisp/faces.el
index 54e444b..9c087c9 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -619,7 +619,7 @@ VALUE must be a string specifying the font family
 `:foundry'
 
 VALUE must be a string specifying the font foundry,
-e.g. ``adobe''.  If a font foundry is specified, wild-cards `*'
+e.g., \"adobe\".  If a font foundry is specified, wild-cards `*'
 and `?' are allowed.
 
 `:width'
@@ -892,7 +892,7 @@ where COLOR is a string or `foreground-color', and STYLE is 
either
 foreground color.  :style may be omitted, which means to use a line.
 
 FRAME nil or not specified means change face on all frames.
-Use `set-face-attribute' to ``unspecify'' underlining."
+Use `set-face-attribute' to \"unspecify\" underlining."
   (interactive (read-face-and-attribute :underline))
   (set-face-attribute face frame :underline underline))
 
@@ -905,7 +905,7 @@ Use `set-face-attribute' to ``unspecify'' underlining."
 INVERSE-VIDEO-P non-nil means FACE displays explicitly in inverse video.
 INVERSE-VIDEO-P nil means FACE explicitly is not in inverse video.
 FRAME nil or not specified means change face on all frames.
-Use `set-face-attribute' to ``unspecify'' the inverse video attribute."
+Use `set-face-attribute' to \"unspecify\" the inverse video attribute."
   (interactive
    (let ((list (read-face-and-attribute :inverse-video)))
      (list (car list) (if (cadr list) t))))
@@ -2042,7 +2042,7 @@ Value is the new parameter list."
   "Create and return a frame with frame parameters PARAMETERS.
 If PARAMETERS specify a frame name, handle X geometry resources
 for that name.  If PARAMETERS includes a `reverse' parameter, or
-the X resource ``reverseVideo'' is present, handle that."
+the X resource \"reverseVideo\" is present, handle that."
   (setq parameters (x-handle-named-frame-geometry parameters))
   (let* ((params (copy-tree parameters))
         (visibility-spec (assq 'visibility parameters))
diff --git a/lisp/files.el b/lisp/files.el
index ef6ac7b..d82ff5e 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1092,14 +1092,14 @@ Tip: You can use this expansion of remote identifier 
components
 
 (defcustom remote-file-name-inhibit-cache 10
   "Whether to use the remote file-name cache for read access.
-When `nil', never expire cached values (caution)
-When `t', never use the cache (safe, but may be slow)
+When nil, never expire cached values (caution)
+When t, never use the cache (safe, but may be slow)
 A number means use cached values for that amount of seconds since caching.
 
 The attributes of remote files are cached for better performance.
 If they are changed outside of Emacs's control, the cached values
 become invalid, and must be reread.  If you are sure that nothing
-other than Emacs changes the files, you can set this variable to `nil'.
+other than Emacs changes the files, you can set this variable to nil.
 
 If a remote file is checked regularly, it might be a good idea to
 let-bind this variable to a value less than the interval between
diff --git a/lisp/forms.el b/lisp/forms.el
index aa57a66..bccb4a0 100644
--- a/lisp/forms.el
+++ b/lisp/forms.el
@@ -1755,7 +1755,7 @@ Otherwise enables edit mode if the visited file is 
writable."
 With ARG: store the record after the current one.
 If `forms-new-record-filter' contains the name of a function,
 it is called to fill (some of) the fields with default values.
-If `forms-insert-after is non-nil, the default behavior is to insert
+If `forms-insert-after' is non-nil, the default behavior is to insert
 after the current record."
 
   (interactive "P")
diff --git a/lisp/gnus/canlock.el b/lisp/gnus/canlock.el
index 4082b87..6ebd533 100644
--- a/lisp/gnus/canlock.el
+++ b/lisp/gnus/canlock.el
@@ -35,8 +35,9 @@
 ;; Verifying Cancel-Lock is mainly a function of news servers, however,
 ;; you can verify your own article using the command `canlock-verify' in
 ;; the (raw) article buffer.  You will be prompted for the password for
-;; each time if the option `canlock-password' or `canlock-password-for-
-;; verify' is nil.  Note that setting these options is a bit unsafe.
+;; each time if the option `canlock-password' or
+;; `canlock-password-for-verify' is nil.  Note that setting these
+;; options is a bit unsafe.
 
 ;;; Code:
 
diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 331b99b..b2a725b 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -78,7 +78,7 @@
 ;; `gnus-outlook-deuglify-unwrap-stop-chars'.  Setting this to ".?!"
 ;; inhibits unwrapping if the cited line ends with a full stop,
 ;; question mark or exclamation mark.  Note that this variable
-;; defaults to `nil', triggering a few false positives but generally
+;; defaults to nil, triggering a few false positives but generally
 ;; giving you better results.
 ;;
 ;; Unwrapping works on every level of citation.  Thus you will be able
@@ -110,7 +110,7 @@
 ;; > Bye, John
 ;;
 ;; Repairing the attribution line will be done by function
-;; `gnus-article-outlook-repair-attribution which calls other function that
+;; `gnus-article-outlook-repair-attribution' which calls other function that
 ;; try to recognize and repair broken attribution lines.  See variable
 ;; `gnus-outlook-deuglify-attrib-cut-regexp' for stuff that should be
 ;; cut off from the beginning of an attribution line and variable
@@ -121,7 +121,7 @@
 ;; Rearranging the article so that the cited text appears above the
 ;; new text will be done by function
 ;; `gnus-article-outlook-rearrange-citation'.  This function calls
-;; `gnus-article-outlook-repair-attribution to find and repair an attribution
+;; `gnus-article-outlook-repair-attribution' to find and repair an attribution
 ;; line.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -177,14 +177,14 @@
 ;; As I said before there may (or will) be a few false positives on
 ;; unwrapping cited lines with `gnus-article-outlook-unwrap-lines'.
 ;;
-;; `gnus-article-outlook-repair-attribution will only fix the first
+;; `gnus-article-outlook-repair-attribution' will only fix the first
 ;; attribution line found in the article.  Furthermore it fixed to
 ;; certain kinds of attributions.  And there may be horribly many
 ;; false positives, vanishing lines and so on -- so don't trust your
 ;; eyes.  Again I recommend manual invocation.
 ;;
 ;; `gnus-article-outlook-rearrange-citation' carries all the limitations of
-;; `gnus-article-outlook-repair-attribution.
+;; `gnus-article-outlook-repair-attribution'.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index 989a424..7630afb 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -1256,7 +1256,7 @@ how to control what it hides."
   :type gnus-article-treat-custom)
 
 (defcustom gnus-treat-strip-list-identifiers 'head
-  "Strip list identifiers from `gnus-list-identifiers`.
+  "Strip list identifiers from `gnus-list-identifiers'.
 Valid values are nil, t, `head', `first', `last', an integer or a
 predicate.  See Info node `(gnus)Customizing Articles'."
   :version "21.1"
@@ -1735,7 +1735,7 @@ regexp."
     (modify-syntax-entry ?` " " table)
     table)
   "Syntax table used in article mode buffers.
-Initialized from `text-mode-syntax-table.")
+Initialized from `text-mode-syntax-table'.")
 
 (defvar gnus-save-article-buffer nil)
 
diff --git a/lisp/gnus/gnus-cus.el b/lisp/gnus/gnus-cus.el
index 9271322..93b7a1b 100644
--- a/lisp/gnus/gnus-cus.el
+++ b/lisp/gnus/gnus-cus.el
@@ -272,7 +272,7 @@ DOC is a documentation string for the parameter.")
                (repeat (list (string :format "%v" :tag "File name"))))
        "Which score files to use when using score to select articles to fetch.
 
-    `nil'
+    nil
          All articles will be scored to zero (0).
 
     `file'
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index ff839d7..dbeada2 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -3285,7 +3285,7 @@ mail messages or news articles in files that have numeric 
names."
 
    Rights is a string listing a (possibly empty) set of alphanumeric
    characters, each character listing a set of operations which is being
-   controlled.  Letters are reserved for ``standard'' rights, listed
+   controlled.  Letters are reserved for \"standard\" rights, listed
    below.  Digits are reserved for implementation or site defined rights.
 
    l - lookup (mailbox is visible to LIST/LSUB commands)
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 1d8ad8e..37a707e 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -4376,7 +4376,7 @@ Returns HEADER if it was entered in the DEPENDENCIES.  
Returns nil otherwise."
      ;; The last case ignores an existing entry, except it adds any
      ;; additional Xrefs (in case the two articles came from different
      ;; servers.
-     ;; Also sets `header' to `nil' meaning that the `dependencies'
+     ;; Also sets `header' to nil meaning that the `dependencies'
      ;; table was *not* modified.
      (t
       (mail-header-set-xref
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 8bb0a78..9e813e6 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -1123,7 +1123,7 @@ e.g. using `gnus-posting-styles':
 
 (defcustom message-cite-style nil
   "*The overall style to be used when yanking cited text.
-Value is either `nil' (no variable overrides) or a let-style list
+Value is either nil (no variable overrides) or a let-style list
 of pairs (VARIABLE VALUE) that will be bound in
 `message-yank-original' to do the quoting.
 
diff --git a/lisp/gnus/nndoc.el b/lisp/gnus/nndoc.el
index c62697b..70d803f 100644
--- a/lisp/gnus/nndoc.el
+++ b/lisp/gnus/nndoc.el
@@ -199,7 +199,7 @@ from the document.")
 ;; lines in the body.  For MIME dissections only, ARTICLE-INSERT [5] and
 ;; SUMMARY-INSERT [6] give headers to insert for full article or summary line
 ;; generation, respectively.  Other headers usually follow directly from the
-;; buffer.  Value `nil' means no insert.
+;; buffer.  Value nil means no insert.
 (defvoo nndoc-dissection-alist nil)
 (defvoo nndoc-prepare-body-function nil)
 (defvoo nndoc-generate-head-function nil)
diff --git a/lisp/gnus/nnmaildir.el b/lisp/gnus/nnmaildir.el
index 21fa5b3..da3d546 100644
--- a/lisp/gnus/nnmaildir.el
+++ b/lisp/gnus/nnmaildir.el
@@ -84,13 +84,13 @@ Some of the FLAGS correspond to Gnus marks.")
 
 (defsubst nnmaildir--mark-to-flag (mark)
   "Find the Maildir flag that corresponds to MARK (an atom).
-Return a character, or `nil' if not found.
+Return a character, or nil if not found.
 See `nnmaildir-flag-mark-mapping'."
   (car (rassq mark nnmaildir-flag-mark-mapping)))
 
 (defsubst nnmaildir--flag-to-mark (flag)
   "Find the Gnus mark that corresponds to FLAG (a character).
-Return an atom, or `nil' if not found.
+Return an atom, or nil if not found.
 See `nnmaildir-flag-mark-mapping'."
   (cdr (assq flag nnmaildir-flag-mark-mapping)))
 
diff --git a/lisp/gnus/rfc2047.el b/lisp/gnus/rfc2047.el
index b2520b2..ea558d7 100644
--- a/lisp/gnus/rfc2047.el
+++ b/lisp/gnus/rfc2047.el
@@ -1136,7 +1136,7 @@ other than `\"' and `\\' in quoted strings."
          ;; `decode-coding-string' in Emacs offers a third optional
          ;; arg NOCOPY to avoid consing a new string if the decoding
          ;; is "trivial".  Unfortunately it currently doesn't
-         ;; consider anything else than a `nil' coding system
+         ;; consider anything else than a nil coding system
          ;; trivial.
          ;; `rfc2047-decode-string' is called multiple times for each
          ;; article during summary buffer generation, and we really
diff --git a/lisp/hippie-exp.el b/lisp/hippie-exp.el
index b167671..a19ff32 100644
--- a/lisp/hippie-exp.el
+++ b/lisp/hippie-exp.el
@@ -99,10 +99,10 @@
 ;;      from the kill ring.  May be good if you don't know how far up in
 ;;      the kill-ring the required entry is, and don't want to mess with
 ;;      "Choose Next Paste".
-;;    `try-complete-lisp-symbol' : like `lisp-complete-symbol', but goes
+;;    `try-complete-lisp-symbol' : like `elisp-completion-at-point', but goes
 ;;      through all possibilities instead of completing what is unique.
 ;;      Might be tedious (usually a lot of possible completions) and
-;;      since its function is much like `lisp-complete-symbol', which
+;;      since its function is much like `completion-at-point', which
 ;;      already has a key of its own, you might want to remove this.
 ;;    `try-complete-lisp-symbol-partially' : To insert in the list just
 ;;      before `try-complete-lisp-symbol' for those who first want to get
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index f15e150..c426976 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -1908,9 +1908,9 @@ the buffer object itself and the current mark symbol."
                     ;; Kill the line if the buffer is dead
                     'kill)))
              ;; A given mapping function should return:
-             ;; `nil' if it chose not to affect the buffer
+             ;; nil if it chose not to affect the buffer
              ;; `kill' means the remove line from the buffer list
-             ;; `t' otherwise
+             ;; t otherwise
              (cl-incf ibuffer-map-lines-total)
              (cond ((null result)
                     (forward-line 1))
diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index ee28112..b1894ca 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -149,16 +149,26 @@ icompletion is occurring."
 (defvar icomplete-minibuffer-map
   (let ((map (make-sparse-keymap)))
     (define-key map [?\M-\t] 'minibuffer-force-complete)
-    (define-key map [?\C-j]  'minibuffer-force-complete-and-exit)
+    (define-key map [?\C-j]  'icomplete-force-complete-and-exit)
     (define-key map [?\C-.]  'icomplete-forward-completions)
     (define-key map [?\C-,]  'icomplete-backward-completions)
     map)
   "Keymap used by `icomplete-mode' in the minibuffer.")
 
+(defun icomplete-force-complete-and-exit ()
+  "Complete the minibuffer and exit.
+Use the first of the matches if there are any displayed, and use
+the default otherwise."
+  (interactive)
+  (if (or icomplete-show-matches-on-no-input
+          (> (icomplete--field-end) (icomplete--field-beg)))
+      (minibuffer-force-complete-and-exit)
+    (minibuffer-complete-and-exit)))
+
 (defun icomplete-forward-completions ()
   "Step forward completions by one entry.
 Second entry becomes the first and can be selected with
-`minibuffer-force-complete-and-exit'."
+`icomplete-force-complete-and-exit'."
   (interactive)
   (let* ((beg (icomplete--field-beg))
          (end (icomplete--field-end))
@@ -171,7 +181,7 @@ Second entry becomes the first and can be selected with
 (defun icomplete-backward-completions ()
   "Step backward completions by one entry.
 Last entry becomes the first and can be selected with
-`minibuffer-force-complete-and-exit'."
+`icomplete-force-complete-and-exit'."
   (interactive)
   (let* ((beg (icomplete--field-beg))
          (end (icomplete--field-end))
diff --git a/lisp/ido.el b/lisp/ido.el
index 60a59d6..b97f72c 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -377,7 +377,7 @@ use either \\[customize] or the function `ido-mode'."
   '("\\` ")
   "List of regexps or functions matching buffer names to ignore.
 For example, traditional behavior is not to list buffers whose names begin
-with a space, for which the regexp is `\\` '.  See the source file for
+with a space, for which the regexp is ‘\\` ’.  See the source file for
 example functions that filter buffer names."
   :type '(repeat (choice regexp function))
   :group 'ido)
@@ -386,7 +386,7 @@ example functions that filter buffer names."
   '("\\`CVS/" "\\`#" "\\`.#" "\\`\\.\\./" "\\`\\./")
   "List of regexps or functions matching file names to ignore.
 For example, traditional behavior is not to list files whose names begin
-with a #, for which the regexp is `\\`#'.  See the source file for
+with a #, for which the regexp is ‘\\`#’.  See the source file for
 example functions that filter filenames."
   :type '(repeat (choice regexp function))
   :group 'ido)
diff --git a/lisp/ielm.el b/lisp/ielm.el
index be877eb..3c9908a 100644
--- a/lisp/ielm.el
+++ b/lisp/ielm.el
@@ -511,7 +511,7 @@ evaluations respectively.  If the working buffer is another 
IELM
 buffer, then the values in the working buffer are used.  The variables
 `*1', `*2' and `*3', yield the process buffer values.
 
-If, at the start of evaluation, `standard-output' is `t' (the
+If, at the start of evaluation, `standard-output' is t (the
 default), `standard-output' is set to a special function that
 causes output to be directed to the ielm buffer.
 `standard-output' is restored after evaluation unless explicitly
diff --git a/lisp/info.el b/lisp/info.el
index 05574ae..d635819 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -303,7 +303,7 @@ when you hit the end of the current node."
   "If non-nil, hide the tag and section reference in *note and * menu items.
 If value is non-nil but not `hide', also replaces the \"*note\" with \"see\".
 If value is non-nil but not t or `hide', the reference section is still shown.
-`nil' completely disables this feature.  If this is non-nil, you might
+nil completely disables this feature.  If this is non-nil, you might
 want to set `Info-refill-paragraphs'."
   :version "22.1"
   :type '(choice (const :tag "No hiding" nil)
diff --git a/lisp/language/tv-util.el b/lisp/language/tv-util.el
index 400856d..ba1ee66 100644
--- a/lisp/language/tv-util.el
+++ b/lisp/language/tv-util.el
@@ -34,7 +34,7 @@
                    (combining-vowel . "ꪴꪰꪲꪳꪷꪸꪾ")
                    (combining-tone . "꪿꫁")
                    (misc . "-"))))
-    ;; Set all TaiViet characters to `t'.
+    ;; Set all TaiViet characters to t.
     (set-char-table-range table (cons #xaa80 #xaac2) t)
     (set-char-table-range table (cons #xaadb #xaadf) t)
     ;; Overwrite it for special characters.
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 0d1940c..a52a19e 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -27708,7 +27708,7 @@ Convert space before point into a hard space if the 
context is right.
 
 If
  * character before point is a space character,
- * character before that has “w” character syntax (i.e. it's a word
+ * character before that has \"w\" character syntax (i.e. it's a word
    constituent),
  * `tildify-space-pattern' matches when `looking-back' (no more than 10
    characters) from before the space character, and
diff --git a/lisp/leim/quail/cyrillic.el b/lisp/leim/quail/cyrillic.el
index 08d53ea..7caa5ec 100644
--- a/lisp/leim/quail/cyrillic.el
+++ b/lisp/leim/quail/cyrillic.el
@@ -1244,8 +1244,8 @@ Unicode based."
 This phonetic layout replaces all the Latin letters with Bulgarian
 \(Cyrillic) letters based on similarities in their pronunciation or look.
 
-Note that, since the letters 'щ', 'ь', 'ю' and 'я' are attached to the
-']', '\', '`' and '[' keys respectively, Caps Lock does not affect them."
+Note that, since the letters ‘щ’, ‘ь’, ‘ю’ and ‘я’ are attached to the
+‘]’, ‘\’, ‘`’ and ‘[’ keys respectively, Caps Lock does not affect them."
 nil t t t t nil nil nil nil nil t)
 
 ;;  Ю  1! 2@ 3№ 4$ 5% 6€ 7§ 8* 9( 0) -– =+ ьѝ
diff --git a/lisp/leim/quail/ethiopic.el b/lisp/leim/quail/ethiopic.el
index d99f649..7a1cddf 100644
--- a/lisp/leim/quail/ethiopic.el
+++ b/lisp/leim/quail/ethiopic.el
@@ -49,8 +49,8 @@ C-F9 or `M-x ethio-toggle-space'
   Toggles space characters for keyboard input.  The current mode is
   indicated in mode-line, whether by `_' (ASCII space) or `፡'
   (Ethiopic colon-like word separator).  Even in the `፡' mode, an
-  ASCII space is inserted if the point is preceded by `an Ethiopic
-  punctuation followed by zero or more ASCII spaces'.
+  ASCII space is inserted if the point is preceded by an Ethiopic
+  punctuation char that is followed by zero or more ASCII spaces.
 
 S-F5 or `M-x ethio-toggle-punctuation'
   Toggles ASCII punctuation and Ethiopic punctuation for keyboard input.
diff --git a/lisp/leim/quail/hebrew.el b/lisp/leim/quail/hebrew.el
index fe06b27..5d63e40 100644
--- a/lisp/leim/quail/hebrew.el
+++ b/lisp/leim/quail/hebrew.el
@@ -113,8 +113,8 @@ Only Hebrew-related characters are considered.
 
 Based on latest draft of SI-1452 keyboard layout.
 Only Hebrew-related characters are considered.
- '`' is used to switch levels instead of Alt-Gr.
-Geresh is mapped to '`k'.
+ ‘`’ is used to switch levels instead of Alt-Gr.
+Geresh is mapped to ‘`k’.
 " nil t t t t nil nil nil nil nil t)
 
 (quail-define-rules
@@ -603,8 +603,8 @@ Not suitable for modern Hebrew input.
 
 Based on Society of Biblical Literature's SIL keyboard layout.
 Phonetic and not suitable for modern Hebrew input.
- '`' is used to switch levels instead of Alt-Gr.
- Euro Sign (€) is mapped to 'Z'.
+ ‘`’ is used to switch levels instead of Alt-Gr.
+ Euro Sign (€) is mapped to ‘Z’.
 " nil t t t t nil nil nil nil nil t)
 
 (quail-define-rules
diff --git a/lisp/leim/quail/thai.el b/lisp/leim/quail/thai.el
index 3717104..2554686 100644
--- a/lisp/leim/quail/thai.el
+++ b/lisp/leim/quail/thai.el
@@ -46,9 +46,9 @@
  "Thai Kesmanee input method with TIS620 keyboard layout
 
 The difference from the ordinal Thai keyboard:
-    '฿' and '๏' are assigned to '\\' and '|' respectively,
-    'ฃ' and 'ฅ' are assigned to '`' and '~' respectively,
-    Don't know where to assign characters '๚' and '๛'."
+    ‘฿’ and ‘๏’ are assigned to ‘\\’ and ‘|’ respectively,
+    ‘ฃ’ and ‘ฅ’ are assigned to ‘`’ and ‘~’ respectively,
+    Don't know where to assign characters ‘๚’ and ‘๛’."
  nil t t t t nil nil nil nil nil t)
 
 (thai-generate-quail-map
diff --git a/lisp/linum.el b/lisp/linum.el
index 2aac13a..7b6a3ea 100644
--- a/lisp/linum.el
+++ b/lisp/linum.el
@@ -62,7 +62,7 @@ See also `linum-before-numbering-hook'."
 
 (defcustom linum-eager t
   "Whether line numbers should be updated after each command.
-The conservative setting `nil' might miss some buffer changes,
+The conservative setting nil might miss some buffer changes,
 and you have to scroll or press \\[recenter-top-bottom] to update the numbers."
   :group 'linum
   :type 'boolean)
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el
index c3d5705..0ddae24 100644
--- a/lisp/ls-lisp.el
+++ b/lisp/ls-lisp.el
@@ -669,7 +669,7 @@ SWITCHES is a list of characters.  Default sorting is 
alphabetic."
                ))))
   ;; Finally reverse file alist if necessary.
   ;; (eq below MUST compare `(not (memq ...))' to force comparison of
-  ;; `t' or `nil', rather than list tails!)
+  ;; t or nil, rather than list tails!)
   (if (eq (eq (not (memq ?U switches)) ; unsorted order is reversed
              (not (memq ?r switches))) ; reversed sort order requested
          ls-lisp-dirs-first)           ; already reversed
diff --git a/lisp/mail/mailabbrev.el b/lisp/mail/mailabbrev.el
index 2f349b9..f974f20 100644
--- a/lisp/mail/mailabbrev.el
+++ b/lisp/mail/mailabbrev.el
@@ -603,7 +603,7 @@ In other respects, this behaves like `end-of-buffer', which 
see."
 (eval-after-load "sendmail"
   '(progn
      (define-key mail-mode-map "\C-c\C-a" 'mail-abbrev-insert-alias)
-     (define-key mail-mode-map "\e\t"  ; like lisp-complete-symbol
+     (define-key mail-mode-map "\e\t"  ; like completion-at-point
        'mail-abbrev-complete-alias)))
 
 ;;(define-key mail-mode-map "\C-n" 'mail-abbrev-next-line)
diff --git a/lisp/mail/mailalias.el b/lisp/mail/mailalias.el
index 4832916..577cec0 100644
--- a/lisp/mail/mailalias.el
+++ b/lisp/mail/mailalias.el
@@ -77,7 +77,7 @@ If not on matching header, `mail-complete-function' gets 
called instead."
 ;;;###autoload
 (defcustom mail-complete-style 'angles
   "Specifies how \\[mail-complete] formats the full name when it completes.
-If `nil', they contain just the return address like:
+If nil, they contain just the return address like:
        address@hidden
 If `parens', they look like:
        address@hidden (Elvis Parsley)
diff --git a/lisp/mail/sendmail.el b/lisp/mail/sendmail.el
index 9fa7aa5..ddd8697 100644
--- a/lisp/mail/sendmail.el
+++ b/lisp/mail/sendmail.el
@@ -58,7 +58,7 @@
 (defcustom mail-from-style 'default
   "Specifies how \"From:\" fields look.
 
-If `nil', they contain just the return address like:
+If nil, they contain just the return address like:
        address@hidden
 If `parens', they look like:
        address@hidden (Elvis Parsley)
diff --git a/lisp/mail/supercite.el b/lisp/mail/supercite.el
index cf3aac1..56158cc 100644
--- a/lisp/mail/supercite.el
+++ b/lisp/mail/supercite.el
@@ -886,10 +886,10 @@ Action can be one of: View, Modify, Add, or Delete."
 
 (defun address@hidden (from &optional delim)
   "Extract the author's email terminus from email address FROM.
-Match addresses of the style ``name%[stuff].'' when called with DELIM
-of \"%\" and addresses of the style address@hidden'' when
+Match addresses of the style \"name%[stuff].\" when called with DELIM
+of \"%\" and addresses of the style \"address@hidden" when
 called with DELIM \"@\".  If DELIM is nil or not provided, matches
-addresses of the style ``name''."
+addresses of the style \"name\"."
   (and (string-match (concat "[-[:alnum:]_.]+" delim) from 0)
        (substring from
                  (match-beginning 0)
@@ -897,7 +897,7 @@ addresses of the style ``name''."
 
 (defun sc-attribs-!-addresses (from)
   "Extract the author's email terminus from email address FROM.
-Match addresses of the style ``[stuff]![stuff]...!name[stuff].''"
+Match addresses of the style \"[stuff]![stuff]...!name[stuff].\""
   (let ((eos (length from))
        (mstart (string-match "![-[:alnum:]_.]+\\([^-![:alnum:]_.]\\|$\\)"
                              from 0))
@@ -907,7 +907,7 @@ Match addresses of the style 
``[stuff]![stuff]...!name[stuff].''"
 
 (defun sc-attribs-<>-addresses (from)
   "Extract the author's email terminus from email address FROM.
-Match addresses of the style ``<name[stuff]>.''"
+Match addresses of the style \"<name[stuff]>.\""
   (and (string-match "<\\(.*\\)>" from)
        (match-string 1 from)))
 
diff --git a/lisp/mail/uudecode.el b/lisp/mail/uudecode.el
index 419aefb..c1e3439 100644
--- a/lisp/mail/uudecode.el
+++ b/lisp/mail/uudecode.el
@@ -102,7 +102,7 @@ used is specified by `uudecode-decoder-program'."
        (let ((cdir default-directory)
              (default-process-coding-system
                (if (featurep 'xemacs)
-                   ;; In XEmacs, `nil' is not a valid coding system.
+                   ;; In XEmacs, nil is not a valid coding system.
                    '(binary . binary)
                  nil)))
          (unwind-protect
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 538bd97..60b89b6 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -1241,16 +1241,12 @@ scroll the window of possible completions."
 (defun minibuffer-force-complete-and-exit ()
   "Complete the minibuffer with first of the matches and exit."
   (interactive)
-  (if (and (eq (minibuffer-prompt-end) (point-max))
-           minibuffer-default)
-      ;; Use the provided default if there's one (bug#17545).
-      (minibuffer-complete-and-exit)
-    (minibuffer-force-complete)
-    (completion--complete-and-exit
-     (minibuffer-prompt-end) (point-max) #'exit-minibuffer
-     ;; If the previous completion completed to an element which fails
-     ;; test-completion, then we shouldn't exit, but that should be rare.
-     (lambda () (minibuffer-message "Incomplete")))))
+  (minibuffer-force-complete)
+  (completion--complete-and-exit
+   (minibuffer-prompt-end) (point-max) #'exit-minibuffer
+   ;; If the previous completion completed to an element which fails
+   ;; test-completion, then we shouldn't exit, but that should be rare.
+   (lambda () (minibuffer-message "Incomplete"))))
 
 (defun minibuffer-force-complete (&optional start end)
   "Complete the minibuffer to an exact match.
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 52153ad..1f893a7 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -193,7 +193,7 @@
 ;;
 ;;    "^$*$ *"
 ;;
-;; 9) Set the variable ange-ftp-gateway-program-interactive to 't' to let
+;; 9) Set the variable ange-ftp-gateway-program-interactive to t to let
 ;;    ange-ftp know that it has to "hand-hold" the login to the gateway
 ;;    machine.
 ;;
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
index 474a48f..8f77541 100644
--- a/lisp/net/dbus.el
+++ b/lisp/net/dbus.el
@@ -813,7 +813,7 @@ discovering the still incomplete interface."
   "Unregister OBJECT from D-Bus.
 OBJECT must be the result of a preceding `dbus-register-method',
 `dbus-register-property' or `dbus-register-signal' call.  It
-returns `t' if OBJECT has been unregistered, `nil' otherwise.
+returns t if OBJECT has been unregistered, nil otherwise.
 
 When OBJECT identifies the last method or property, which is
 registered for the respective service, Emacs releases its
@@ -1092,7 +1092,7 @@ well formed."
 (defun dbus-list-activatable-names (&optional bus)
   "Return the D-Bus service names which can be activated as list.
 If BUS is left nil, `:system' is assumed.  The result is a list
-of strings, which is `nil' when there are no activatable service
+of strings, which is nil when there are no activatable service
 names at all."
   (dbus-ignore-errors
     (dbus-call-method
@@ -1101,7 +1101,7 @@ names at all."
 
 (defun dbus-list-names (bus)
   "Return the service names registered at D-Bus BUS.
-The result is a list of strings, which is `nil' when there are no
+The result is a list of strings, which is nil when there are no
 registered service names at all.  Well known names are strings
 like \"org.freedesktop.DBus\".  Names starting with \":\" are
 unique names for services."
@@ -1119,7 +1119,7 @@ A service has a known name if it doesn't start with 
\":\"."
 
 (defun dbus-list-queued-owners (bus service)
   "Return the unique names registered at D-Bus BUS and queued for SERVICE.
-The result is a list of strings, or `nil' when there are no
+The result is a list of strings, or nil when there are no
 queued name owners service names at all."
   (dbus-ignore-errors
     (dbus-call-method
@@ -1128,7 +1128,7 @@ queued name owners service names at all."
 
 (defun dbus-get-name-owner (bus service)
   "Return the name owner of SERVICE registered at D-Bus BUS.
-The result is either a string, or `nil' if there is no name owner."
+The result is either a string, or nil if there is no name owner."
   (dbus-ignore-errors
     (dbus-call-method
      bus dbus-service-dbus dbus-path-dbus
@@ -1145,7 +1145,7 @@ apply
 
   \(member service \(dbus-list-known-names bus))"
   ;; "Ping" raises a D-Bus error if SERVICE does not exist.
-  ;; Otherwise, it returns silently with `nil'.
+  ;; Otherwise, it returns silently with nil.
   (condition-case nil
       (not
        (if (natnump timeout)
@@ -1335,7 +1335,7 @@ object can contain \"annotation\" children."
 (defun dbus-introspect-get-annotation-names
   (bus service path interface &optional name)
   "Return all annotation names as list of strings.
-If NAME is `nil', the annotations are children of INTERFACE,
+If NAME is nil, the annotations are children of INTERFACE,
 otherwise NAME must be a \"method\", \"signal\", or \"property\"
 object, where the annotations belong to."
   (let ((object
@@ -1352,7 +1352,7 @@ object, where the annotations belong to."
 (defun dbus-introspect-get-annotation
   (bus service path interface name annotation)
   "Return ANNOTATION as XML object.
-If NAME is `nil', ANNOTATION is a child of INTERFACE, otherwise
+If NAME is nil, ANNOTATION is a child of INTERFACE, otherwise
 NAME must be the name of a \"method\", \"signal\", or
 \"property\" object, where the ANNOTATION belongs to."
   (let ((elt (xml-get-children
@@ -1376,7 +1376,7 @@ NAME must be the name of a \"method\", \"signal\", or
   "Return a list of all argument names as list of strings.
 NAME must be a \"method\" or \"signal\" object.
 
-Argument names are optional, the function can return `nil'
+Argument names are optional, the function can return nil
 therefore, even if the method or signal has arguments."
   (let ((object
         (or (dbus-introspect-get-method bus service path interface name)
@@ -1404,9 +1404,9 @@ element of the list returned by 
`dbus-introspect-get-argument-names'."
   (bus service path interface name &optional direction)
   "Return signature of a `method' or `signal', represented by NAME, as string.
 If NAME is a `method', DIRECTION can be either \"in\" or \"out\".
-If DIRECTION is `nil', \"in\" is assumed.
+If DIRECTION is nil, \"in\" is assumed.
 
-If NAME is a `signal', and DIRECTION is non-`nil', DIRECTION must
+If NAME is a `signal', and DIRECTION is non-nil, DIRECTION must
 be \"out\"."
   ;; For methods, we use "in" as default direction.
   (let ((object (or (dbus-introspect-get-method
@@ -1440,7 +1440,7 @@ be \"out\"."
 (defun dbus-get-property (bus service path interface property)
   "Return the value of PROPERTY of INTERFACE.
 It will be checked at BUS, SERVICE, PATH.  The result can be any
-valid D-Bus value, or `nil' if there is no PROPERTY."
+valid D-Bus value, or nil if there is no PROPERTY."
   (dbus-ignore-errors
    ;; "Get" returns a variant, so we must use the `car'.
    (car
@@ -1451,7 +1451,7 @@ valid D-Bus value, or `nil' if there is no PROPERTY."
 (defun dbus-set-property (bus service path interface property value)
   "Set value of PROPERTY of INTERFACE to VALUE.
 It will be checked at BUS, SERVICE, PATH.  When the value has
-been set successful, the result is VALUE.  Otherwise, `nil' is
+been set successful, the result is VALUE.  Otherwise, nil is
 returned."
   (dbus-ignore-errors
    ;; "Set" requires a variant.
@@ -1465,7 +1465,7 @@ returned."
   "Return all properties of INTERFACE at BUS, SERVICE, PATH.
 The result is a list of entries.  Every entry is a cons of the
 name of the property, and its value.  If there are no properties,
-`nil' is returned."
+nil is returned."
   (dbus-ignore-errors
     ;; "GetAll" returns "a{sv}".
     (let (result)
diff --git a/lisp/net/network-stream.el b/lisp/net/network-stream.el
index 0104fa7..1eb5342 100644
--- a/lisp/net/network-stream.el
+++ b/lisp/net/network-stream.el
@@ -121,7 +121,7 @@ values:
 
 :client-certificate should either be a list where the first
   element is the certificate key file name, and the second
-  element is the certificate file name itself, or `t', which
+  element is the certificate file name itself, or t, which
   means that `auth-source' will be queried for the key and the
   certificate.  This parameter will only be used when doing TLS
   or STARTTLS connections.
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 11db7a2..852d294 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -1372,7 +1372,7 @@ if ARG is omitted or nil."
     (t         . "%fp*** %fs%n %r %m"))
   "An alist of formats used for printing responses.
 The format is looked up using the response-type as a key;
-if no match is found, the default entry (with a key of `t') is used.
+if no match is found, the default entry (with a key of t) is used.
 
 The entry's value part should be a string, which is inserted with
 the of the following escape sequences replaced by the described values:
diff --git a/lisp/net/rlogin.el b/lisp/net/rlogin.el
index d075820..e71179b 100644
--- a/lisp/net/rlogin.el
+++ b/lisp/net/rlogin.el
@@ -235,14 +235,14 @@ variable."
   "Do remote or local directory tracking, or disable entirely.
 
 If called with no prefix argument or a unspecified prefix argument (just
-``\\[universal-argument]'' with no number) do remote directory tracking via
+`\\[universal-argument]' with no number) do remote directory tracking via
 ange-ftp.  If called as a function, give it no argument.
 
 If called with a negative prefix argument, disable directory tracking
 entirely.
 
 If called with a positive, numeric prefix argument, e.g.
-``\\[universal-argument] 1 M-x rlogin-directory-tracking-mode\'',
+`\\[universal-argument] 1 M-x rlogin-directory-tracking-mode',
 then do directory tracking but assume the remote filesystem is the same as
 the local system.  This only works in general if the remote machine and the
 local one share the same directories (e.g. through NFS)."
diff --git a/lisp/net/secrets.el b/lisp/net/secrets.el
index 56cbec4..c4102a1 100644
--- a/lisp/net/secrets.el
+++ b/lisp/net/secrets.el
@@ -85,7 +85,7 @@
 ;; temporarily.  This shall be preferred over creation of a persistent
 ;; collection, when the information shall not live longer than Emacs.
 ;; The session collection can be addressed either by the string
-;; "session", or by `nil', whenever a collection parameter is needed.
+;; "session", or by nil, whenever a collection parameter is needed.
 
 ;; As already said, a collection is a group of secret items.  A secret
 ;; item has a label, the "secret" (which is a string), and a set of
@@ -418,7 +418,7 @@ returned, and it will be stored in `secrets-session-path'."
 (defun secrets-prompt-handler (&rest args)
   "Handler for signals emitted by `secrets-interface-prompt'."
   ;; An empty object path is always identified as `secrets-empty-path'
-  ;; or `nil'.  Either we set it explicitly, or it is returned by the
+  ;; or nil.  Either we set it explicitly, or it is returned by the
   ;; "Completed" signal.
   (if (car args) ;; dismissed
       (setq secrets-prompt-signal (list secrets-empty-path))
diff --git a/lisp/net/soap-client.el b/lisp/net/soap-client.el
index b19a432..7740574 100644
--- a/lisp/net/soap-client.el
+++ b/lisp/net/soap-client.el
@@ -490,7 +490,7 @@ elements named \"foo\" exist in the WSDL you could use:
 
   (soap-wsdl-get \"foo\" WSDL 'soap-message-p)
 
-If USE-LOCAL-ALIAS-TABLE is not nil, `soap-local-xmlns` will be
+If USE-LOCAL-ALIAS-TABLE is not nil, `soap-local-xmlns' will be
 used to resolve the namespace alias."
   (let ((alias-table (soap-wsdl-alias-table wsdl))
         namespace element-name element)
diff --git a/lisp/net/telnet.el b/lisp/net/telnet.el
index f844f83..6d9f408 100644
--- a/lisp/net/telnet.el
+++ b/lisp/net/telnet.el
@@ -237,7 +237,7 @@ Normally input is edited in Emacs and sent a line at a 
time."
 (define-derived-mode telnet-mode comint-mode "Telnet"
   "This mode is for using telnet (or rsh) from a buffer to another host.
 It has most of the same commands as comint-mode.
-There is a variable ``telnet-interrupt-string'' which is the character
+There is a variable `telnet-interrupt-string' which is the character
 sent to try to stop execution of a job on the remote host.
 Data is sent to the remote host when RET is typed."
   (set (make-local-variable 'window-point-insertion-type) t)
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index a92ca4d..7c509e1 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -850,9 +850,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
       (when tmpinput (delete-file tmpinput))
 
       ;; `process-file-side-effects' has been introduced with GNU
-      ;; Emacs 23.2.  If set to `nil', no remote file will be changed
+      ;; Emacs 23.2.  If set to nil, no remote file will be changed
       ;; by `program'.  If it doesn't exist, we assume its default
-      ;; value 't'.
+      ;; value t.
       (unless (and (boundp 'process-file-side-effects)
                   (not (symbol-value 'process-file-side-effects)))
         (tramp-flush-directory-property v ""))
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index d45c0aa..89baaa4 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -157,7 +157,7 @@ This includes password cache, file cache, connection cache, 
buffers."
   (interactive "P")
   (if arg (insert tramp-version) (message tramp-version)))
 
-;; Make the `reporter` functionality available for making bug reports about
+;; Make the "reporter" functionality available for making bug reports about
 ;; the package. A most useful piece of code.
 
 (autoload 'reporter-submit-bug-report "reporter")
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index 3ec90ca..e68c81c 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -100,7 +100,7 @@
     (setq byte-compile-not-obsolete-vars '(directory-sep-char)))
 
   ;; `remote-file-name-inhibit-cache' has been introduced with Emacs 24.1.
-  ;; Besides `t', `nil', and integer, we use also timestamps (as
+  ;; Besides t, nil, and integer, we use also timestamps (as
   ;; returned by `current-time') internally.
   (unless (boundp 'remote-file-name-inhibit-cache)
     (defvar remote-file-name-inhibit-cache nil))
@@ -459,7 +459,7 @@ element is not omitted."
   (delete "" (split-string string pattern)))
 
 (defun tramp-compat-process-running-p (process-name)
-  "Returns `t' if system process PROCESS-NAME is running for 
`user-login-name'."
+  "Returns t if system process PROCESS-NAME is running for `user-login-name'."
   (when (stringp process-name)
     (cond
      ;; GNU Emacs 22 on w32.
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 5988a28..215e39d 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -1563,7 +1563,7 @@ connection if a previous connection has died for some 
reason."
 (defun tramp-gvfs-send-command (vec command &rest args)
   "Send the COMMAND with its ARGS to connection VEC.
 COMMAND is usually a command from the gvfs-* utilities.
-`call-process' is applied, and it returns `t' if the return code is zero."
+`call-process' is applied, and it returns t if the return code is zero."
   (with-current-buffer (tramp-get-connection-buffer vec)
     (tramp-gvfs-maybe-open-connection vec)
     (erase-buffer)
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 3f006e8..acb97e8 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -1558,7 +1558,7 @@ be non-negative integers."
        (progn
          (tramp-set-file-property v localname "file-acl" acl-string)
          t)
-      ;; In case of errors, we return `nil'.
+      ;; In case of errors, we return nil.
       (tramp-set-file-property v localname "file-acl-string" 'undef)
       nil)))
 
@@ -3103,9 +3103,9 @@ the result will be a local, non-Tramp, file name."
       (when tmpinput (delete-file tmpinput))
 
       ;; `process-file-side-effects' has been introduced with GNU
-      ;; Emacs 23.2.  If set to `nil', no remote file will be changed
+      ;; Emacs 23.2.  If set to nil, no remote file will be changed
       ;; by `program'.  If it doesn't exist, we assume its default
-      ;; value `t'.
+      ;; value t.
       (unless (and (boundp 'process-file-side-effects)
                   (not (symbol-value 'process-file-side-effects)))
         (tramp-flush-directory-property v ""))
@@ -4973,8 +4973,8 @@ function waits for output unless NOOUTPUT is set."
   (vec command &optional subshell dont-suppress-err)
   "Run COMMAND and check its exit status.
 Sends `echo $?' along with the COMMAND for checking the exit status.
-If COMMAND is nil, just sends `echo $?'.  Returns `t' if the exit
-status is 0, and `nil' otherwise.
+If COMMAND is nil, just sends `echo $?'.  Returns t if the exit
+status is 0, and nil otherwise.
 
 If the optional argument SUBSHELL is non-nil, the command is
 executed in a subshell, ie surrounded by parentheses.  If
@@ -5551,7 +5551,7 @@ If no corresponding command is found, nil is returned.
 Otherwise, either a string is returned which contains a `%s' mark
 to be used for the respective input or output file; or a Lisp
 function cell is returned to be applied on a buffer."
-  ;; We must catch the errors, because we want to return `nil', when
+  ;; We must catch the errors, because we want to return nil, when
   ;; no inline coding is found.
   (ignore-errors
     (let ((coding
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 14360b9..c4f0f1f 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -1242,9 +1242,9 @@ target of the symlink differ."
        (kill-buffer (tramp-get-connection-property v "process-buffer" nil)))
 
       ;; `process-file-side-effects' has been introduced with GNU
-      ;; Emacs 23.2.  If set to `nil', no remote file will be changed
+      ;; Emacs 23.2.  If set to nil, no remote file will be changed
       ;; by `program'.  If it doesn't exist, we assume its default
-      ;; value `t'.
+      ;; value t.
       (unless (and (boundp 'process-file-side-effects)
                   (not (symbol-value 'process-file-side-effects)))
        (tramp-flush-directory-property v ""))
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 10bb769..95f5449 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -300,8 +300,8 @@ are fit for gateways must have `tramp-default-port' at 
least.
 
 Notes:
 
-When using `su' or `sudo' the phrase `open connection to a remote
-host' sounds strange, but it is used nevertheless, for consistency.
+When using `su' or `sudo' the phrase \"open connection to a remote
+host\" sounds strange, but it is used nevertheless, for consistency.
 No connection is opened to a remote host, but `su' or `sudo' is
 started on the local host.  You should specify a remote host
 `localhost' or the name of the local host.  Another host name is
@@ -1034,7 +1034,7 @@ The timeout does not include the time reading a password."
 This is necessary as self defense mechanism, in order to avoid
 yo-yo connection attempts when the remote host is unavailable.
 
-A value of 0 or `nil' suppresses this check.  This might be
+A value of 0 or nil suppresses this check.  This might be
 necessary, when several out-of-order copy operations are
 performed, or when several asynchronous processes will be started
 in a short time frame.  In those cases it is recommended to
@@ -1049,8 +1049,8 @@ A remote directory might have changed its contents.  In 
order to
 make it visible during file name completion in the minibuffer,
 Tramp flushes its cache and rereads the directory contents when
 more than `tramp-completion-reread-directory-timeout' seconds
-have been gone since last remote command execution.  A value of `t'
-would require an immediate reread during filename completion, `nil'
+have been gone since last remote command execution.  A value of t
+would require an immediate reread during filename completion, nil
 means to use always cached values for the directory contents."
   :group 'tramp
   :type '(choice (const nil) (const t) integer))
@@ -3314,7 +3314,7 @@ User is always nil."
 
 (defun tramp-handle-unhandled-file-name-directory (_filename)
   "Like `unhandled-file-name-directory' for Tramp files."
-  ;; Starting with Emacs 23, we must simply return `nil'.  But we must
+  ;; Starting with Emacs 23, we must simply return nil.  But we must
   ;; keep backward compatibility, also with XEmacs.  "~/" cannot be
   ;; returned, because there might be machines without a HOME
   ;; directory (like hydra).
@@ -3737,7 +3737,7 @@ Example:
 
   (tramp-equal-remote \"/ssh::/etc\" \"/<your host name>:/home\")
 
-would yield `t'.  On the other hand, the following check results in nil:
+would yield t.  On the other hand, the following check results in nil:
 
   (tramp-equal-remote \"/sudo::/etc\" \"/su::/etc\")"
   (and (tramp-tramp-file-p file1)
diff --git a/lisp/obsolete/xesam.el b/lisp/obsolete/xesam.el
index 4ee8c6f..39dd6a2 100644
--- a/lisp/obsolete/xesam.el
+++ b/lisp/obsolete/xesam.el
@@ -378,7 +378,7 @@ If PROPERTY is not existing, retrieve it from ENGINE first."
 (defun xesam-search-engines ()
   "Return Xesam search engines, stored in `xesam-search-engines'.
 The first search engine is the name owner of `xesam-service-search'.
-If there is no registered search engine at all, the function returns `nil'."
+If there is no registered search engine at all, the function returns nil."
   (let ((services (dbus-ignore-errors
                    (dbus-list-queued-owners
                     :session xesam-service-search)))
diff --git a/lisp/org/ob-ruby.el b/lisp/org/ob-ruby.el
index 7e09d6d..8dee01a 100644
--- a/lisp/org/ob-ruby.el
+++ b/lisp/org/ob-ruby.el
@@ -58,7 +58,7 @@
   :type 'string)
 
 (defcustom org-babel-ruby-nil-to 'hline
-  "Replace 'nil' in ruby tables with this before returning."
+  "Replace nil in ruby tables with this before returning."
   :group 'org-babel
   :version "24.4"
   :package-version '(Org . "8.0")
diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el
index 8f7611f..65696b2 100644
--- a/lisp/org/org-agenda.el
+++ b/lisp/org/org-agenda.el
@@ -6642,7 +6642,7 @@ The modified list may contain inherited tags, and tags 
matched by
 
 LIST is the list of agenda items formatted by `org-agenda-list'.
 NDAYS is the span of the current agenda view.
-TODAYP is `t' when the current agenda view is on today."
+TODAYP is t when the current agenda view is on today."
   (catch 'exit
     (cond ((not org-agenda-use-time-grid) (throw 'exit list))
          ((and todayp (member 'today (car org-agenda-time-grid))))
diff --git a/lisp/org/org-bbdb.el b/lisp/org/org-bbdb.el
index a0711cc..c489385 100644
--- a/lisp/org/org-bbdb.el
+++ b/lisp/org/org-bbdb.el
@@ -37,7 +37,7 @@
 ;; the diary using bbdb-anniv.el.
 ;;
 ;; Put the following in /somewhere/at/home/diary.org and make sure
-;; that this file is in `org-agenda-files`
+;; that this file is in `org-agenda-files'.
 ;;
 ;; %%(org-bbdb-anniversaries)
 ;;
diff --git a/lisp/org/org-capture.el b/lisp/org/org-capture.el
index 7f1f7ed..64e3015 100644
--- a/lisp/org/org-capture.el
+++ b/lisp/org/org-capture.el
@@ -201,7 +201,7 @@ properties are:
 
  :clock-resume       Start the interrupted clock when finishing the capture.
                      Note that :clock-keep has precedence over :clock-resume.
-                     When setting both to `t', the current clock will run and
+                     When setting both to t, the current clock will run and
                      the previous one will not be resumed.
 
  :unnarrowed         Do not narrow the target buffer, simply show the
diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el
index 9c92903..d3c477e 100644
--- a/lisp/org/org-compat.el
+++ b/lisp/org/org-compat.el
@@ -241,7 +241,7 @@ ignored in this case."
   (or window (selected-window)))
 
 (defun org-number-sequence (from &optional to inc)
-  "Call `number-sequence or emulate it."
+  "Call `number-sequence' or emulate it."
   (if (fboundp 'number-sequence)
       (number-sequence from to inc)
     (if (or (not to) (= from to))
diff --git a/lisp/org/org-gnus.el b/lisp/org/org-gnus.el
index 880994a..8b616f0 100644
--- a/lisp/org/org-gnus.el
+++ b/lisp/org/org-gnus.el
@@ -60,7 +60,7 @@ Normally, this translation is done by querying the IMAP 
server,
 which is usually very fast.  Unfortunately, some (maybe badly
 configured) IMAP servers don't support this operation quickly.
 So if following a link to a Gnus article takes ages, try setting
-this variable to `t'."
+this variable to t."
   :group 'org-link-store
   :version "24.1"
   :type 'boolean)
diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el
index db09909..ea8e7b5 100644
--- a/lisp/org/org-macs.el
+++ b/lisp/org/org-macs.el
@@ -55,7 +55,7 @@
      ,@body))
 
 (defmacro org-called-interactively-p (&optional kind)
-  (declare (debug (&optional ("quote" symbolp)))) ;Why not just `t'?
+  (declare (debug (&optional ("quote" symbolp)))) ;Why not just t?
   (if (featurep 'xemacs)
       `(interactive-p)
     (if (or (> emacs-major-version 23)
diff --git a/lisp/org/org-protocol.el b/lisp/org/org-protocol.el
index eeefc8d..d0750f7 100644
--- a/lisp/org/org-protocol.el
+++ b/lisp/org/org-protocol.el
@@ -561,7 +561,7 @@ as filename."
         (let ((fname  (expand-file-name (car var))))
           (setq fname (org-protocol-check-filename-for-protocol
                       fname (member var flist)  client))
-          (if (eq fname t) ;; greedy? We need the `t' return value.
+          (if (eq fname t) ;; greedy? We need the t return value.
               (progn
                 (ad-set-arg 0 nil)
                 (throw 'greedy t))
diff --git a/lisp/org/org.el b/lisp/org/org.el
index 54924a9..29ef8ef 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -595,7 +595,7 @@ XEmacs user should have this variable set to nil, because
 (defcustom org-loop-over-headlines-in-active-region nil
   "Shall some commands act upon headlines in the active region?
 
-When set to `t', some commands will be performed in all headlines
+When set to t, some commands will be performed in all headlines
 within the active region.
 
 When set to `start-level', some commands will be performed in all
@@ -1452,7 +1452,7 @@ changed by an edit command."
 (defcustom org-remove-highlights-with-change t
   "Non-nil means any change to the buffer will remove temporary highlights.
 Such highlights are created by `org-occur' and `org-clock-display'.
-When nil, `C-c C-c needs to be used to get rid of the highlights.
+When nil, `C-c C-c' needs to be used to get rid of the highlights.
 The highlights created by `org-preview-latex-fragment' always need
 `C-c C-c' to be removed."
   :group 'org-sparse-trees
@@ -1575,7 +1575,7 @@ See the manual for examples."
   "Non-nil means Org will display descriptive links.
 E.g. [[http://orgmode.org][Org website]] will be displayed as
 \"Org Website\", hiding the link itself and just displaying its
-description.  When set to `nil', Org will display the full links
+description.  When set to nil, Org will display the full links
 literally.
 
 You can interactively set the value of this variable by calling
@@ -11558,7 +11558,7 @@ go to the location where the last refiling operation 
has put the subtree.
 With a numeric prefix argument of `2', refile to the running clock.
 
 With a numeric prefix argument of `3', emulate `org-refile-keep'
-being set to `t' and copy to the target location, don't move it.
+being set to t and copy to the target location, don't move it.
 Beware that keeping refiled entries may result in duplicated ID
 properties.
 
@@ -12077,7 +12077,7 @@ This is a list of abbreviation keys and values.  The 
value gets inserted
 if you type `<' followed by the key and then press the completion key,
 usually `M-TAB'.  %file will be replaced by a file name after prompting
 for the file using completion.  The cursor will be placed at the position
-of the `?` in the template.
+of the `?' in the template.
 There are two templates for each key, the first uses the original Org syntax,
 the second uses Emacs Muse-like syntax tags.  These Muse-like tags become
 the default when the /org-mtags.el/ module has been loaded.  See also the
@@ -15541,7 +15541,7 @@ and the new value.")
 
 (defun org-entry-put (pom property value)
   "Set PROPERTY to VALUE for entry at point-or-marker POM.
-If the value is `nil', it is converted to the empty string.
+If the value is nil, it is converted to the empty string.
 If it is not a string, an error is raised."
   (cond ((null value) (setq value ""))
        ((not (stringp value))
@@ -17749,7 +17749,7 @@ If no number is found, the return value is 0."
 (defcustom org-image-actual-width t
   "Should we use the actual width of images when inlining them?
 
-When set to `t', always use the image width.
+When set to t, always use the image width.
 
 When set to a number, use imagemagick (when available) to set
 the image's width to this value.
@@ -17776,7 +17776,7 @@ This requires Emacs >= 24.1, build with imagemagick 
support."
 
 (defcustom org-agenda-inhibit-startup nil
   "Inhibit startup when preparing agenda buffers.
-When this variable is `t', the initialization of the Org agenda
+When this variable is t, the initialization of the Org agenda
 buffers is inhibited: e.g. the visibility state is not set, the
 tables are not re-aligned, etc."
   :type 'boolean
diff --git a/lisp/org/ox-html.el b/lisp/org/ox-html.el
index 36984b5..144b58b 100644
--- a/lisp/org/ox-html.el
+++ b/lisp/org/ox-html.el
@@ -711,7 +711,7 @@ t              Synonym for `mathjax'."
 When `org-mode' is exporting an `org-mode' file to HTML, links to
 non-html files are directly put into a href tag in HTML.
 However, links to other Org-mode files (recognized by the
-extension `.org.) should become links to the corresponding html
+extension `.org') should become links to the corresponding html
 file, assuming that the linked `org-mode' file will also be
 converted to HTML.
 When nil, the links still point to the plain `.org' file."
diff --git a/lisp/org/ox-odt.el b/lisp/org/ox-odt.el
index 6c74fb3..f1ef90e 100644
--- a/lisp/org/ox-odt.el
+++ b/lisp/org/ox-odt.el
@@ -847,7 +847,7 @@ TABLE-CELL-STYLE-SELECTOR := `use-first-row-styles'       |
                              `use-banding-rows-styles'    |
                              `use-banding-columns-styles' |
                              `use-first-row-styles'
-ON-OR-OFF                 := `t' | `nil'
+ON-OR-OFF                 := t | nil
 
 For example, with the following configuration
 
@@ -3261,7 +3261,7 @@ contextual information."
   "Retrieve styles applicable to a table cell.
 R and C are (zero-based) row and column numbers of the table
 cell.  STYLE-SPEC is an entry in `org-odt-table-styles'
-applicable to the current table.  It is `nil' if the table is not
+applicable to the current table.  It is nil if the table is not
 associated with any style attributes.
 
 Return a cons of (TABLE-CELL-STYLE-NAME . PARAGRAPH-STYLE-NAME).
diff --git a/lisp/org/ox-texinfo.el b/lisp/org/ox-texinfo.el
index 0c81b62..26f58ad 100644
--- a/lisp/org/ox-texinfo.el
+++ b/lisp/org/ox-texinfo.el
@@ -117,7 +117,7 @@
 (defcustom org-texinfo-coding-system nil
   "Default document encoding for Texinfo output.
 
-If `nil' it will default to `buffer-file-coding-system'."
+If nil it will default to `buffer-file-coding-system'."
   :group 'org-export-texinfo
   :type 'coding-system)
 
diff --git a/lisp/play/handwrite.el b/lisp/play/handwrite.el
index 32ea663..62a8fe4 100644
--- a/lisp/play/handwrite.el
+++ b/lisp/play/handwrite.el
@@ -279,7 +279,7 @@ Variables: `handwrite-linespace'     (default 12)
     (handwrite-set-pagenumber-on)))
 
 (defun handwrite-10pt ()
-  "Specify 10-point output for `handwrite.
+  "Specify 10-point output for `handwrite'.
 This sets `handwrite-fontsize' to 10 and finds correct
 values for `handwrite-linespace' and `handwrite-numlines'."
   (interactive)
@@ -290,7 +290,7 @@ values for `handwrite-linespace' and `handwrite-numlines'."
 
 
 (defun handwrite-11pt ()
-  "Specify 11-point output for `handwrite.
+  "Specify 11-point output for `handwrite'.
 This sets `handwrite-fontsize' to 11 and finds correct
 values for `handwrite-linespace' and `handwrite-numlines'."
   (interactive)
@@ -300,7 +300,7 @@ values for `handwrite-linespace' and `handwrite-numlines'."
   (message "Handwrite output size set to 11 points"))
 
 (defun handwrite-12pt ()
-  "Specify 12-point output for `handwrite.
+  "Specify 12-point output for `handwrite'.
 This sets `handwrite-fontsize' to 12 and finds correct
 values for `handwrite-linespace' and `handwrite-numlines'."
   (interactive)
@@ -310,7 +310,7 @@ values for `handwrite-linespace' and `handwrite-numlines'."
   (message "Handwrite output size set to 12 points"))
 
 (defun handwrite-13pt ()
-  "Specify 13-point output for `handwrite.
+  "Specify 13-point output for `handwrite'.
 This sets `handwrite-fontsize' to 13 and finds correct
 values for `handwrite-linespace' and `handwrite-numlines'."
   (interactive)
diff --git a/lisp/progmodes/ada-xref.el b/lisp/progmodes/ada-xref.el
index 6b611e6..771dc2a 100644
--- a/lisp/progmodes/ada-xref.el
+++ b/lisp/progmodes/ada-xref.el
@@ -954,7 +954,7 @@ Return new value of PROJECT."
        (append (mapcar 'directory-file-name compilation-search-path)
                ada-search-directories))
 
-  ;; return 't', for decent display in message buffer when called interactively
+  ;; return t, for decent display in message buffer when called interactively
   t)
 
 (defun ada-find-references (&optional pos arg local-only)
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index d0beab1..fd4bfb3 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -1983,7 +1983,7 @@ system."
 
 (defvar c-lang-const-expansion nil)
 
-;; Ugly hack to pull in the definition of `cc-bytecomp-compiling-or-loading`
+;; Ugly hack to pull in the definition of `cc-bytecomp-compiling-or-loading'
 ;; from cc-bytecomp to make it available at loadtime.  This is the same
 ;; mechanism used in cc-mode.el for `c-populate-syntax-table'.
 (defalias 'cc-bytecomp-compiling-or-loading
@@ -2017,10 +2017,10 @@ The second argument can optionally be a docstring.  The 
rest of the
 arguments are one or more repetitions of LANG VAL where LANG specifies
 the language(s) that VAL applies to.  LANG is the name of the
 language, i.e. the mode name without the \"-mode\" suffix, or a list
-of such language names, or `t' for all languages.  VAL is a form to
+of such language names, or t for all languages.  VAL is a form to
 evaluate to get the value.
 
-If LANG isn't `t' or one of the core languages in CC Mode, it must
+If LANG isn't t or one of the core languages in CC Mode, it must
 have been declared with `c-add-language'.
 
 Neither NAME, LANG nor VAL are evaluated directly - they should not be
@@ -2030,7 +2030,7 @@ VAL to evaluate parts of it directly.
 When VAL is evaluated for some language, that language is temporarily
 made current so that `c-lang-const' without an explicit language can
 be used inside VAL to refer to the value of a language constant in the
-same language.  That is particularly useful if LANG is `t'.
+same language.  That is particularly useful if LANG is t.
 
 VAL is not evaluated right away but rather when the value is requested
 with `c-lang-const'.  Thus it's possible to use `c-lang-const' inside
@@ -2365,7 +2365,7 @@ fallback definition for all modes, to break the cycle).")
 
 (defun c-find-assignment-for-mode (source-pos mode match-any-lang _name)
   ;; Find the first assignment entry that applies to MODE at or after
-  ;; SOURCE-POS.  If MATCH-ANY-LANG is non-nil, entries with `t' as
+  ;; SOURCE-POS.  If MATCH-ANY-LANG is non-nil, entries with t as
   ;; the language list are considered to match, otherwise they don't.
   ;; On return SOURCE-POS is updated to point to the next assignment
   ;; after the returned one.  If no assignment is found,
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 823d795..06b03a2 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -7972,7 +7972,7 @@ comment at the start of cc-engine.el for more info."
   ;; This should be called with point inside an argument list.
   ;;
   ;; Only one level of enclosing parentheses is considered, so for
-  ;; instance `nil' is returned when in a function call within an asm
+  ;; instance nil is returned when in a function call within an asm
   ;; operand.
   ;;
   ;; This function might do hidden buffer changes.
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 44172b0..ad564f7 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -1772,8 +1772,8 @@ on level 2 only and so aren't combined with 
`c-complex-decl-matchers'."
 ;;                    "\\|"
 ;;                    (c-lang-const c-symbol-key)
 ;;                    "\\)")
-;;            `((c-font-lock-declarators limit t nil) ; That `nil' says use 
`font-lock-variable-name-face';
-;;                                     ; `t' would mean 
`font-lock-function-name-face'.
+;;            `((c-font-lock-declarators limit t nil) ; That nil says use 
`font-lock-variable-name-face';
+;;                                     ; t would mean 
`font-lock-function-name-face'.
 ;;              (progn
 ;;                (c-put-char-property (match-beginning 0) 'c-type
 ;;                                     'c-decl-id-start)
diff --git a/lisp/progmodes/cc-guess.el b/lisp/progmodes/cc-guess.el
index 2053473..ba23a75 100644
--- a/lisp/progmodes/cc-guess.el
+++ b/lisp/progmodes/cc-guess.el
@@ -91,7 +91,7 @@ The offset of a line included in the indent information 
returned by
 (defcustom c-guess-region-max 50000
   "The maximum region size for examining indent information with `c-guess'.
 It takes a long time to examine indent information from a large region;
-this option helps you limit that time. `nil' means no limit."
+this option helps you limit that time. nil means no limit."
   :version "24.1"
   :type 'integer
   :group 'c)
@@ -465,7 +465,7 @@ the absolute file name of the file if STYLE-NAME is nil."
 (defun c-guess-dump-guessed-style (&optional printer)
   "Show the guessed style.
 `pp' is used to print the style but if PRINTER is given,
-PRINTER is used instead. If PRINTER is not `nil', it
+PRINTER is used instead. If PRINTER is not nil, it
 is called with one argument, the guessed style."
   (interactive)
   (let ((style (c-guess-make-style c-guess-guessed-basic-offset
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 9d36e91..a58e393 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -216,7 +216,7 @@ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1))
     ;; due to matching filenames via \\(.*?\\).  This might be faster.
     (maven
      ;; Maven is a popular free software build tool for Java.
-     "\\([^ \n]\\(?:[^\n :]\\| [^-/\n]\\|:[^ 
\n]\\)*?\\):\\[\\([0-9]+\\),\\([0-9]+\\)\\] " 1 2 3)
+     "\\(\\[WARNING\\] *\\)?\\([^ \n]\\(?:[^\n :]\\| [^-/\n]\\|:[^ 
\n]\\)*?\\):\\[\\([0-9]+\\),\\([0-9]+\\)\\] " 2 3 4 (1))
 
     (jikes-line
      "^ *\\([0-9]+\\)\\.[ \t]+.*\n +\\(<-*>\n\\*\\*\\* 
\\(?:Error\\|Warnin\\(g\\)\\)\\)"
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 2acfc10..d6f6f3b 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -282,7 +282,7 @@ This is in addition to cperl-continued-statement-offset."
 
 (defcustom cperl-indent-wrt-brace t
   "*Non-nil means indent statements in if/etc block relative brace, not if/etc.
-Versions 5.2 ... 5.20 behaved as if this were `nil'."
+Versions 5.2 ... 5.20 behaved as if this were nil."
   :type 'boolean
   :group 'cperl-indentation-details)
 
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 486d672..4af8ac6 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -2376,9 +2376,9 @@ Sets `gdb-thread-number' to new id."
   (let* ((result (gdb-json-string output-field))
          (thread-id (bindat-get-field result 'id)))
     (gdb-setq-thread-number thread-id)
-    ;; Typing `thread N` in GUD buffer makes GDB emit `^done` followed
-    ;; by `=thread-selected` notification. `^done` causes `gdb-update`
-    ;; as usually. Things happen to fast and second call (from
+    ;; Typing `thread N' in GUD buffer makes GDB emit `^done' followed
+    ;; by `=thread-selected' notification. `^done' causes `gdb-update'
+    ;; as usually. Things happen too fast and second call (from
     ;; gdb-thread-selected handler) gets cut off by our beloved
     ;; pending triggers.
     ;; Solution is `gdb-wait-for-pending' macro: it guarantees that its
diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el
index 02a8ec8..23f9d4a 100644
--- a/lisp/progmodes/idlw-shell.el
+++ b/lisp/progmodes/idlw-shell.el
@@ -229,7 +229,7 @@ to set this option to nil."
 
 (defcustom idlwave-shell-file-name-chars "~/A-Za-z0-9+:_.$#%={}\\- "
   "The characters allowed in file names, as a string.
-Used for file name completion.  Must not contain `'', `,' and `\"'
+Used for file name completion.  Must not contain ‘'’, ‘,’ and ‘\"’
 because these are used as separators by IDL."
   :group 'idlwave-shell-general-setup
   :type 'string)
@@ -2638,7 +2638,7 @@ If ENABLE is non-nil, enable them instead."
 (defun idlwave-shell-break-in ()
   "Look for a module name near point and set a break point for it.
 The command looks for an identifier near point and sets a breakpoint
-for the first line of the corresponding module.  If MODULE is `t', set
+for the first line of the corresponding module.  If MODULE is t, set
 in the current routine."
   (interactive)
   (let* ((module (idlwave-fix-module-if-obj_new (idlwave-what-module)))
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index 7e269cb..44d84d6 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -1837,7 +1837,7 @@ The main features of this mode are
 5. Code Templates and Abbreviations
    --------------------------------
    Many Abbreviations are predefined to expand to code fragments and templates.
-   The abbreviations start generally with a `\\`.  Some examples:
+   The abbreviations start generally with a `\\'.  Some examples:
 
    \\pr        PROCEDURE template
    \\fu        FUNCTION template
@@ -2047,7 +2047,7 @@ If optional argument RESERVED is non-nil then the 
expansion
 consists of reserved words, which will be capitalized if
 `idlwave-reserved-word-upcase' is non-nil.
 Otherwise, the abbrev will be capitalized if `idlwave-abbrev-change-case'
-is non-nil, unless its value is \`down in which case the abbrev will be
+is non-nil, unless its value is `down' in which case the abbrev will be
 made into all lowercase.
 Returns non-nil if abbrev is left expanded."
   (if (idlwave-quoted)
@@ -8162,7 +8162,7 @@ demand _EXTRA in the keyword list."
                               class
                               (idlwave-routines)) 'do-link))))))
 
-    ;; If the class is `t', combine all keywords of all methods NAME
+    ;; If the class is t, combine all keywords of all methods NAME
     (when (eq class t)
       (mapc (lambda (entry)
              (and
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 4b0a028..d45d082 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -3216,7 +3216,7 @@ With argument MSG show activation/deactivation message."
            (concat
             "Your `python-shell-interpreter' doesn't seem to "
             "support readline, yet `python-shell-completion-native' "
-            (format "was `t' and %S is not part of the "
+            (format "was t and %S is not part of the "
                     (file-name-nondirectory python-shell-interpreter))
             "`python-shell-completion-native-disabled-interpreters' "
             "list.  Native completions have been disabled locally. "))
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 0e2f66e..21ad102 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -287,7 +287,7 @@ Only has effect when `ruby-use-smie' is nil."
   :group 'ruby
   :safe 'booleanp)
 
-;; FIXME Woefully under documented.  What is the point of the last `t'?.
+;; FIXME Woefully under documented.  What is the point of the last t?.
 (defcustom ruby-deep-indent-paren '(?\( ?\[ ?\] t)
   "Deep indent lists in parenthesis when non-nil.
 The value t means continuous line.
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index a1ad49e..4b0cb0f 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -519,8 +519,8 @@ take you to the next lint error."
 
 (defvar verilog-tool 'verilog-linter
   "Which tool to use for building compiler-command.
-Either nil, `verilog-linter, `verilog-compiler,
-`verilog-coverage, `verilog-preprocessor, or `verilog-simulator.
+Either nil, `verilog-linter', `verilog-compiler',
+`verilog-coverage', `verilog-preprocessor', or `verilog-simulator'.
 Alternatively use the \"Choose Compilation Action\" menu.  See
 `verilog-set-compile-command' for more information.")
 
@@ -1674,7 +1674,7 @@ If third arg START is non-nil, start search at that index 
in STRING."
 
 (defsubst verilog-string-replace-matches (from-string to-string fixedcase 
literal string)
   "Replace occurrences of FROM-STRING with TO-STRING.
-FIXEDCASE and LITERAL as in `replace-match`.  STRING is what to replace.
+FIXEDCASE and LITERAL as in `replace-match'.  STRING is what to replace.
 The case (verilog-string-replace-matches \"o\" \"oo\" nil nil \"foobar\")
 will break, as the o's continuously replace.  xa -> x works ok though."
   ;; Hopefully soon to an Emacs built-in
@@ -5201,7 +5201,7 @@ becomes:
 (defun verilog-preprocess (&optional command filename)
   "Preprocess the buffer, similar to `compile', but put output in Verilog-Mode.
 Takes optional COMMAND or defaults to `verilog-preprocessor', and
-FILENAME to find directory to run in, or defaults to `buffer-file-name`."
+FILENAME to find directory to run in, or defaults to `buffer-file-name'."
   (interactive
    (list
     (let ((default (verilog-expand-command verilog-preprocessor)))
@@ -12648,7 +12648,7 @@ driver/monitor using AUTOINST in the testbench."
 (defun verilog-auto-insert-lisp ()
   "Expand AUTOINSERTLISP statements, as part of \\[verilog-auto].
 The Lisp code provided is called before other AUTOS are expanded,
-and the Lisp code generally will call `insert` to insert text
+and the Lisp code generally will call `insert' to insert text
 into the current file beginning on the line after the
 AUTOINSERTLISP.
 
@@ -12713,7 +12713,7 @@ text:
 (defun verilog-auto-insert-last ()
   "Expand AUTOINSERTLAST statements, as part of \\[verilog-auto].
 The Lisp code provided is called after all other AUTOS have been
-expanded, and the Lisp code generally will call `insert` to
+expanded, and the Lisp code generally will call `insert' to
 insert text into the current file beginning on the line after the
 AUTOINSERTLAST.
 
diff --git a/lisp/ps-print.el b/lisp/ps-print.el
index 0a2c214..e76b332 100644
--- a/lisp/ps-print.el
+++ b/lisp/ps-print.el
@@ -809,7 +809,7 @@ Please send all bug fixes and enhancements to
 ;; on next page.  Visually, valid values are (the character `+' at right of
 ;; each column indicates that a line is printed):
 ;;
-;;                `nil'        `follow'        `full'        `full-follow'
+;;                 nil         `follow'        `full'        `full-follow'
 ;; Current Page --------     -----------     ---------     ----------------
 ;;             1  XXXXX +   1  XXXXXXXX +   1  XXXXXX +   1  XXXXXXXXXXXXX +
 ;;             2  XXXXX +   2  XXXXXXXX +   2  XXXXXX +   2  XXXXXXXXXXXXX +
@@ -2117,7 +2117,7 @@ See also documentation for `ps-zebra-stripes' and 
`ps-zebra-stripe-height'."
 Visually, valid values are (the character `+' at right of each column indicates
 that a line is printed):
 
-                  `nil'        `follow'        `full'        `full-follow'
+                   nil         `follow'        `full'        `full-follow'
    Current Page --------     -----------     ---------     ----------------
                1  XXXXX +   1  XXXXXXXX +   1  XXXXXX +   1  XXXXXXXXXXXXX +
                2  XXXXX +   2  XXXXXXXX +   2  XXXXXX +   2  XXXXXXXXXXXXX +
diff --git a/lisp/recentf.el b/lisp/recentf.el
index 37937ec..89c1517 100644
--- a/lisp/recentf.el
+++ b/lisp/recentf.el
@@ -294,7 +294,7 @@ They are successively passed a file name to transform it."
             (function :tag "Other function")))))
 
 (defcustom recentf-show-file-shortcuts-flag t
-  "Whether to show ``[N]'' for the Nth item up to 10.
+  "Whether to show \"[N]\" for the Nth item up to 10.
 If non-nil, `recentf-open-files' will show labels for keys that can be
 used as shortcuts to open the Nth file."
   :group 'recentf
diff --git a/lisp/ses.el b/lisp/ses.el
index e986015..e625e4e 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -172,7 +172,7 @@ Each function is called with ARG=1."
                "\C-c\C-s"    ses-insert-ses-range
                [S-mouse-3]   ses-insert-range-click
                [C-S-mouse-3] ses-insert-ses-range-click
-               "\M-\C-i"     lisp-complete-symbol))
+               "\M-\C-i"     lisp-complete-symbol)) ; FIXME obsolete
        (newmap (make-sparse-keymap)))
     (set-keymap-parent newmap minibuffer-local-map)
     (while keys
@@ -2276,7 +2276,7 @@ to are recalculated first."
     (when (and (< col (1- ses--numcols)) ;;Last column can't spill over, anyway
               (eq (ses-cell-value row (1+ col)) '*skip*))
       ;; This cell has spill-over.  We'll momentarily pretend the following 
cell
-      ;; has a `t' in it.
+      ;; has a t in it.
       (cl-progv
          (list (ses-cell-symbol row (1+ col)))
          '(t)
@@ -3528,11 +3528,11 @@ execution anyway.  Always returns t if `safe-functions' 
is t."
 ;;----------------------------------------------------------------------------
 
 (defun ses--clean-! (&rest x)
-  "Clean by `delq' list X from any occurrence of `nil' or `*skip*'."
+  "Clean by `delq' list X from any occurrence of nil or `*skip*'."
   (delq nil (delq '*skip* x)))
 
 (defun ses--clean-_ (x y)
-  "Clean list X  by replacing by Y any occurrence of `nil' or `*skip*'.
+  "Clean list X  by replacing by Y any occurrence of nil or `*skip*'.
 
 This will change X by making `setcar' on its cons cells."
   (let ((ret x) ret-elt)
diff --git a/lisp/simple.el b/lisp/simple.el
index dfd92dc..49a95ae 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3488,9 +3488,9 @@ value passed."
 (defvar process-file-side-effects t
   "Whether a call of `process-file' changes remote files.
 
-By default, this variable is always set to `t', meaning that a
+By default, this variable is always set to t, meaning that a
 call of `process-file' could potentially change any file on a
-remote host.  When set to `nil', a file handler could optimize
+remote host.  When set to nil, a file handler could optimize
 its behavior with respect to remote file attribute caching.
 
 You should only ever change this variable with a let-binding;
@@ -6675,7 +6675,7 @@ beyond `current-fill-column' automatically breaks the 
line at a
 previous space.
 
 When `auto-fill-mode' is on, the `auto-fill-function' variable is
-non-`nil'.
+non-nil.
 
 The value of `normal-auto-fill-function' specifies the function to use
 for `auto-fill-function' when turning Auto Fill mode on."
@@ -8232,7 +8232,7 @@ version and use the one distributed with Emacs."))
 Each element has the form (PACKAGE SYMBOL REGEXP STRING).
 PACKAGE is either a regular expression to match file names, or a
 symbol (a feature name), like for `with-eval-after-load'.
-SYMBOL is either the name of a string variable, or `t'.  Upon
+SYMBOL is either the name of a string variable, or t.  Upon
 loading PACKAGE, if SYMBOL is t or matches REGEXP, display a
 warning using STRING as the message.")
 
diff --git a/lisp/skeleton.el b/lisp/skeleton.el
index 84b0e0a..1363422 100644
--- a/lisp/skeleton.el
+++ b/lisp/skeleton.el
@@ -502,8 +502,9 @@ Pairing is also prohibited if we are right after a quoting 
character
 such as backslash.
 
 If a match is found in `skeleton-pair-alist', that is inserted, else
-the defaults are used.  These are (), [], {}, <> and `' for the
-symmetrical ones, and the same character twice for the others."
+the defaults are used.  These are (), [], {}, <> and (grave
+accent, apostrophe) for the paired ones, and the same character
+twice for the others."
   (interactive "*P")
   (if (or arg (not skeleton-pair))
       (self-insert-command (prefix-numeric-value arg))
diff --git a/lisp/subr.el b/lisp/subr.el
index 9c56e51..b9a847d 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1502,6 +1502,19 @@ All symbols are bound before the VALUEFORMs are evalled."
      ,@(mapcar (lambda (binder) `(setq ,@binder)) binders)
      ,@body))
 
+(defmacro let-when-compile (bindings &rest body)
+  "Like `let', but allow for compile time optimization.
+Use BINDINGS as in regular `let', but in BODY each usage should
+be wrapped in `eval-when-compile'.
+This will generate compile-time constants from BINDINGS."
+  (declare (indent 1) (debug let))
+  (cl-progv (mapcar #'car bindings)
+      (mapcar (lambda (x) (eval (cadr x))) bindings)
+    (macroexpand-all
+     (macroexp-progn
+      body)
+     macroexpand-all-environment)))
+
 (defmacro with-wrapper-hook (hook args &rest body)
   "Run BODY, using wrapper functions from HOOK with additional ARGS.
 HOOK is an abnormal hook.  Each hook function in HOOK \"wraps\"
diff --git a/lisp/term/tvi970.el b/lisp/term/tvi970.el
index 3571b48..c1f5928 100644
--- a/lisp/term/tvi970.el
+++ b/lisp/term/tvi970.el
@@ -105,11 +105,11 @@ With a prefix argument ARG, enable the mode if ARG is 
positive,
 and disable it otherwise.  If called from Lisp, enable the mode
 if ARG is omitted or nil.
 
-In ``alternate keypad mode'', the keys send distinct escape
+In alternate keypad mode, the keys send distinct escape
 sequences, meaning that they can have their own bindings,
 independent of the normal number keys.
 
-When disabled, the terminal enters ``numeric keypad mode'', in
+When disabled, the terminal enters numeric keypad mode, in
 which the keypad's keys act as ordinary digits."
   :variable (terminal-parameter nil 'tvi970-keypad-numeric)
   (send-string-to-terminal
diff --git a/lisp/term/w32console.el b/lisp/term/w32console.el
index a7056cd..29ab2f1 100644
--- a/lisp/term/w32console.el
+++ b/lisp/term/w32console.el
@@ -65,7 +65,15 @@
        (when oem-cs-p
          (set-keyboard-coding-system oem-code-page-coding)
          (set-terminal-coding-system
-          (if oem-o-cs-p oem-code-page-output-coding oem-code-page-coding))))
+          (if oem-o-cs-p oem-code-page-output-coding oem-code-page-coding))
+          ;; Since we changed the terminal encoding, we need to repeat
+          ;; the test for Unicode quotes being displayable.
+          (dolist (char-repl
+                   '((?‘ . [?\']) (?’ . [?\']) (?“ . [?\"]) (?” . [?\"])))
+            (when (not (char-displayable-p (car char-repl)))
+              (or standard-display-table
+                  (setq standard-display-table (make-display-table)))
+              (aset standard-display-table (car char-repl) (cdr char-repl))))))
   (let* ((colors w32-tty-standard-colors)
          (color (car colors)))
     (tty-color-clear)
diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index 930c39c..14cf402 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -298,7 +298,7 @@ during the flood-fill."
 (defcustom artist-ellipse-right-char ?\)
   "Character to use at the rightmost position when drawing narrow ellipses.
 
-In this figure, it is the right parenthesis (the ``)'' character):
+In this figure, it is the right parenthesis (the \")\" character):
              -----
             (     )
              -----"
@@ -309,7 +309,7 @@ In this figure, it is the right parenthesis (the ``)'' 
character):
 (defcustom artist-ellipse-left-char ?\(
   "Character to use at the leftmost position when drawing narrow ellipses.
 
-In this figure, it is the left parenthesis (the ``('' character):
+In this figure, it is the left parenthesis (the \"(\" character):
              -----
             (     )
              -----"
@@ -331,7 +331,7 @@ Accept this many characters cutting off a line and still 
treat
 it as one line.
 Example:
  If `artist-vaporize-fuzziness' is 2, then those will be recognized as
- lines from A to B (provided you start vaporizing them at the ``*''):
+ lines from A to B (provided you start vaporizing them at the \"*\"):
                          /
             A----*------/-----------B
                       \\/
@@ -342,7 +342,7 @@ Example:
                       \\/ /
             A----*----/\\/----------B
                      / /\\
- (in fact, only the left part [between the A and the leftmost ``/''
+ (in fact, only the left part [between the A and the leftmost \"/\"
  crossing the line] will be vaporized)."
   :group 'artist
   :type 'integer)
@@ -397,8 +397,8 @@ Example:
   ;; This is a defvar, not a defcustom, since the custom
   ;; package shows lists of characters as a lists of integers,
   ;; which is confusing
-  "Characters (``color'') to use when spraying.
-They should be ordered from the ``lightest'' to the ``heaviest''
+  "Characters (\"color\") to use when spraying.
+They should be ordered from the \"lightest\" to the \"heaviest\"
 since spraying replaces a light character with the next heavier one.")
 
 
@@ -1275,7 +1275,7 @@ Drawing with the mouse:
                * Cut copies, then clears the rectangle/square.
 
                * When drawing lines or poly-lines, you can set arrows.
-                 See below under ``Arrows'' for more info.
+                 See below under \"Arrows\" for more info.
 
                * The mode line shows the currently selected drawing operation.
                  In addition, if it has an asterisk (*) at the end, you
@@ -1383,8 +1383,8 @@ Variables
  artist-vaporize-fuzziness      Tolerance when recognizing lines
  artist-spray-interval          Seconds between repeated sprayings
  artist-spray-radius            Size of the spray-area
- artist-spray-chars             The spray-``color''
- artist-spray-new-chars         Initial spray-``color''
+ artist-spray-chars             The spray-\"color\"
+ artist-spray-new-chars         Initial spray-\"color\"
 
 Hooks
 
@@ -2020,7 +2020,7 @@ The replacement is used to convert tabs and new-lines to 
spaces."
 (defsubst artist-replace-string (string &optional see-thru)
   "Replace contents at point with STRING.
 With optional argument SEE-THRU set to non-nil, text in the buffer
-``shines thru'' blanks in the STRING."
+\"shines thru\" blanks in the STRING."
   (let ((char-list (append string nil))        ; convert the string to a list
        (overwrite-mode 'overwrite-mode-textual)
        (fill-column 32765)             ; Large :-)
@@ -2385,7 +2385,7 @@ in the coord."
 ;; Pretend we are plotting a pixel. Instead we just list it
 ;;
 (defmacro artist-put-pixel (point-list x y)
-  "In POINT-LIST, store a ``pixel'' at coord X,Y."
+  "In POINT-LIST, store a \"pixel\" at coord X,Y."
   `(setq ,point-list
         (append ,point-list (list (artist-new-coord ,x ,y)))))
 
@@ -2928,7 +2928,7 @@ This is done by calling the function specified by
 `artist-text-renderer-function', which must return a list of strings,
 to be inserted in the buffer.
 
-Text already in the buffer ``shines thru'' blanks in the rendered text."
+Text already in the buffer \"shines thru\" blanks in the rendered text."
   (let* ((input-text (read-string "Type text to render: "))
         (rendered-text (artist-funcall artist-text-renderer-function 
input-text)))
     (artist-text-insert-see-thru x y rendered-text)))
@@ -2958,7 +2958,7 @@ Blanks in the rendered text overwrite any text in the 
buffer."
 Returns a list of points.  Each point is on the form (X1 . Y1)."
   (let ((points))
     (while (> n 0)
-      (let* ((angle (* (random 359) (/ float-pi 180)))
+      (let* ((angle (degrees-to-radians (random 359)))
             (dist  (random radius))
             (point (cons (round (* dist (cos angle)))
                          (round (* dist (sin angle))))))
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 10edefc..9d6d19e 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -4338,10 +4338,10 @@ Correct and validate again.\n"
             (goto-char (point-min))
             (forward-line 2)) ; first error message
           (display-buffer err-buf)
-          nil) ; return `nil' (i.e., buffer is invalid)
+          nil) ; return nil (i.e., buffer is invalid)
       (message "%s is syntactically correct"
                (if mark-active "Region" "Buffer"))
-      t))) ; return `t' (i.e., buffer is valid)
+      t))) ; return t (i.e., buffer is valid)
 
 (defun bibtex-validate-globally (&optional strings)
   "Check for duplicate keys in `bibtex-files'.
@@ -4395,9 +4395,9 @@ Return t if test was successful, nil otherwise."
             (goto-char (point-min))
             (forward-line 2)) ; first error message
           (display-buffer err-buf)
-          nil) ; return `nil' (i.e., buffer is invalid)
+          nil) ; return nil (i.e., buffer is invalid)
       (message "No duplicate keys.")
-      t))) ; return `t' (i.e., buffer is valid)
+      t))) ; return t (i.e., buffer is valid)
 
 (defun bibtex-next-field (begin &optional comma)
   "Move point to end of text of next BibTeX field or entry head.
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index f67fae8..b0fcb17 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -1076,7 +1076,7 @@ of `ispell-dictionary-base-alist' elements."
                                    ispell-aspell-data-dir ))
             ;; Try xx.dat first, strip out variant, country code, etc,
             ;; then try xx_YY.dat (without stripping country code),
-             ;; then try xx-alt.dat, for deu-alt etc.
+            ;; then try xx-alt.dat, for de-alt etc.
             (dolist (tmp-regexp (list "^[[:alpha:]]+"
                                       "^[[:alpha:]_]+"
                                        "^[[:alpha:]]+-\\(alt\\|old\\)"))
@@ -3402,7 +3402,7 @@ Must be called after `ispell-buffer-local-parsing' due to 
dependence on mode."
 
 (defun ispell-ignore-fcc (start end)
   "Delete the Fcc: message header when large attachments are included.
-Return value `nil' if file with large attachments is saved.
+Return value nil if file with large attachments is saved.
 This can be used to avoid multiple questions for multiple large attachments.
 Returns point to starting location afterwards."
   (let ((result t))
@@ -3900,7 +3900,7 @@ Otherwise, it must be a function which is called to get 
the limit.")
 
 (defun ispell-mime-multipartp (&optional limit)
   "Return multipart message start boundary or nil if none."
-  ;; caller must ensure `case-fold-search' is set to `t'
+  ;; caller must ensure `case-fold-search' is set to t
   (and
    (re-search-forward
     "Content-Type: *multipart/\\([^ \t\n]*;[ \t]*[\n]?[ \t]*\\)+boundary="
diff --git a/lisp/textmodes/makeinfo.el b/lisp/textmodes/makeinfo.el
index d62929b..b9b72ea 100644
--- a/lisp/textmodes/makeinfo.el
+++ b/lisp/textmodes/makeinfo.el
@@ -66,7 +66,7 @@ The name of the file is appended to this string, separated by 
a space."
   "String containing options for running `makeinfo'.
 Do not include `--footnote-style' or `--paragraph-indent';
 the proper way to specify those is with the Texinfo commands
address@hidden and address@hidden'."
address@hidden' and address@hidden'."
   :type 'string
   :group 'makeinfo)
 
diff --git a/lisp/textmodes/rst.el b/lisp/textmodes/rst.el
index cda9703..9d3f2a9 100644
--- a/lisp/textmodes/rst.el
+++ b/lisp/textmodes/rst.el
@@ -528,7 +528,7 @@ argument list for `rst-re'.")
 
 (defvar rst-re-alist) ; Forward declare to use it in `rst-re'.
 
-;; FIXME: Use `sregex` or `rx` instead of re-inventing the wheel.
+;; FIXME: Use `sregex' or `rx' instead of re-inventing the wheel.
 (rst-testcover-add-compose 'rst-re)
 ;; testcover: ok.
 (defun rst-re (&rest args)
@@ -1512,8 +1512,8 @@ PFXARG (alternate behavior).
 
 This function is a bit of a swiss knife.  It is meant to adjust
 the adornments of a section title in reStructuredText.  It tries
-to deal with all the possible cases gracefully and to do `the
-right thing' in all cases.
+to deal with all the possible cases gracefully and to do \"the
+right thing\" in all cases.
 
 See the documentations of `rst-adjust-adornment-work' and
 `rst-promote-region' for full details.
@@ -3571,8 +3571,8 @@ of your own."
     ;;        properties on comments and literal blocks so they are *not*
     ;;        inline fontified.  See (elisp)Search-based Fontification.
 
-    ;; FIXME: And / or use `syntax-propertize` functions as in `octave-mod.el`
-    ;;        and other V24 modes.  May make `font-lock-extend-region`
+    ;; FIXME: And / or use `syntax-propertize' functions as in `octave-mod.el'
+    ;;        and other V24 modes.  May make `font-lock-extend-region'
     ;;        superfluous.
 
     ;; `Comments`_
@@ -3952,11 +3952,11 @@ string)) to be used for converting the document."
   :package-version "1.2.0")
 (rst-testcover-defcustom)
 
-;; FIXME: Must be `defcustom`.
+;; FIXME: Must be defcustom.
 (defvar rst-compile-primary-toolset 'html
   "The default tool-set for `rst-compile'.")
 
-;; FIXME: Must be `defcustom`.
+;; FIXME: Must be defcustom.
 (defvar rst-compile-secondary-toolset 'latex
   "The default tool-set for `rst-compile' with a prefix argument.")
 
@@ -4035,7 +4035,7 @@ buffer, if the region is not selected."
      (cadr (assq 'pseudoxml rst-compile-toolsets))
      standard-output)))
 
-;; FIXME: Should be `defcustom`.
+;; FIXME: Should be defcustom.
 (defvar rst-pdf-program "xpdf"
   "Program used to preview PDF files.")
 
@@ -4052,7 +4052,7 @@ buffer, if the region is not selected."
     ;; output.
     ))
 
-;; FIXME: Should be `defcustom` or use something like `browse-url`.
+;; FIXME: Should be defcustom or use something like `browse-url'.
 (defvar rst-slides-program "firefox"
   "Program used to preview S5 slides.")
 
diff --git a/lisp/textmodes/tildify.el b/lisp/textmodes/tildify.el
index 0eae67a..4e385a0 100644
--- a/lisp/textmodes/tildify.el
+++ b/lisp/textmodes/tildify.el
@@ -431,7 +431,7 @@ current `case-fold-search' setting."
 
 If
  * character before point is a space character,
- * character before that has “w” character syntax (i.e. it's a word
+ * character before that has \"w\" character syntax (i.e. it's a word
    constituent),
  * `tildify-space-pattern' matches when `looking-back' (no more than 10
    characters) from before the space character, and
diff --git a/lisp/type-break.el b/lisp/type-break.el
index a5a31c9..5a12f02 100644
--- a/lisp/type-break.el
+++ b/lisp/type-break.el
@@ -45,7 +45,7 @@
 
 ;; If you find echo area messages annoying and would prefer to see messages
 ;; in the mode line instead, do M-x type-break-mode-line-message-mode
-;; or set the variable of the same name to `t'.
+;; or set the variable of the same name to t.
 
 ;; This program can truly cons up a storm because of all the calls to
 ;; `current-time' (which always returns fresh conses).  I'm dismayed by
diff --git a/lisp/vc/compare-w.el b/lisp/vc/compare-w.el
index 07c0768..5b92369 100644
--- a/lisp/vc/compare-w.el
+++ b/lisp/vc/compare-w.el
@@ -88,7 +88,7 @@ regexp containing some field separator or a newline, 
depending on
 the nature of the difference units separator.  The variable can
 be made buffer-local.
 
-If the value of this variable is `nil' (option \"No sync\"), then
+If the value of this variable is nil (option \"No sync\"), then
 no synchronization is performed, and the function `ding' is called
 to beep or flash the screen when points are mismatched."
   :type '(choice function regexp (const :tag "No sync" nil))
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 260366e..26bba40 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -3988,7 +3988,7 @@ and mail it to the address above.
 Please read this first:
 ----------------------
 
-Some ``bugs'' may actually be no bugs at all.  For instance, if you are
+Some \"bugs\" may actually be no bugs at all.  For instance, if you are
 reporting that certain difference regions are not matched as you think they
 should, this is most likely due to the way Unix diff program decides what
 constitutes a difference region.  Ediff is an Emacs interface to diff, and
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index 08ae998..d595497 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -167,7 +167,7 @@ can be obtained from `log-edit-files'."
 
 (defvar log-edit-changelog-full-paragraphs t
   "If non-nil, include full ChangeLog paragraphs in the log.
-This may be set in the ``local variables'' section of a ChangeLog, to
+This may be set in the \"local variables\" section of a ChangeLog, to
 indicate the policy for that ChangeLog.
 
 A ChangeLog paragraph is a bunch of log text containing no blank lines;
diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el
index 042ea13..19bbc45 100644
--- a/lisp/vc/log-view.el
+++ b/lisp/vc/log-view.el
@@ -404,7 +404,9 @@ This calls `log-view-expanded-log-entry-function' to do the 
work."
              (unless (and pos (log-view-inside-comment-p pos))
                (error "Broken markup in `log-view-toggle-entry-display'"))
              (delete-region pos
-                            (next-single-property-change pos 
'log-view-comment))
+                             (or
+                              (next-single-property-change pos 
'log-view-comment)
+                              (point-max)))
              (put-text-property beg (1+ beg) 'log-view-entry-expanded nil)
              (if (< opoint pos)
                  (goto-char opoint)))
@@ -469,7 +471,10 @@ It assumes that a log entry starts with a line matching
        ((looking-back "Show 2X entries    Show unlimited entries"
                       (line-beginning-position))
        (setq looping nil)
-       (forward-line -1))))))
+       (forward-line -1))
+       ;; There are no buttons if we've turned on unlimited entries.
+       ((eobp)
+        (setq looping nil))))))
 
 (defun log-view-end-of-defun (&optional arg)
   "Move forward to the next Log View entry.
diff --git a/lisp/vc/vc-annotate.el b/lisp/vc/vc-annotate.el
index 8bcea5f..3a50c9b 100644
--- a/lisp/vc/vc-annotate.el
+++ b/lisp/vc/vc-annotate.el
@@ -175,7 +175,6 @@ List of factors, used to expand/compress the time scale.  
See `vc-annotate'."
     (define-key m "p" 'vc-annotate-prev-revision)
     (define-key m "w" 'vc-annotate-working-revision)
     (define-key m "v" 'vc-annotate-toggle-annotation-visibility)
-    (define-key m "v" 'vc-annotate-toggle-annotation-visibility)
     (define-key m "\C-m" 'vc-annotate-goto-line)
     m)
   "Local keymap used for VC-Annotate mode.")
@@ -583,17 +582,15 @@ the file in question, search for the log entry required 
and move point."
        (setq prev-rev
              (vc-call-backend vc-annotate-backend 'previous-revision
                                (if filediff fname nil) rev))
-       (if (not prev-rev)
-           (message "Cannot diff from any revision prior to %s" rev)
-          (vc-diff-internal
-           t
-           ;; The value passed here should follow what
-           ;; `vc-deduce-fileset' returns.
-           (list vc-annotate-backend
-                 (if filediff
-                     (list fname)
-                   nil))
-           prev-rev rev))))))
+       (vc-diff-internal
+         t
+         ;; The value passed here should follow what
+         ;; `vc-deduce-fileset' returns.
+         (list vc-annotate-backend
+               (if filediff
+                   (list fname)
+                 nil))
+         prev-rev rev)))))
 
 (defun vc-annotate-show-diff-revision-at-line ()
   "Visit the diff of the revision at line from its previous revision."
@@ -605,7 +602,10 @@ the file in question, search for the log entry required 
and move point."
   (interactive)
   (when (eq 'file (vc-call-backend vc-annotate-backend 'revision-granularity))
     (error "The %s backend does not support changeset diffs" 
vc-annotate-backend))
-  (vc-annotate-show-diff-revision-at-line-internal nil))
+  ;; Make sure `diff-goto-source' will be able to find all files.
+  (let ((default-directory (vc-call-backend vc-annotate-backend
+                                            'root default-directory)))
+    (vc-annotate-show-diff-revision-at-line-internal nil)))
 
 (defun vc-annotate-warp-revision (revspec &optional file)
   "Annotate the revision described by REVSPEC.
diff --git a/lisp/vc/vc-bzr.el b/lisp/vc/vc-bzr.el
index c950825..5f8dd0b 100644
--- a/lisp/vc/vc-bzr.el
+++ b/lisp/vc/vc-bzr.el
@@ -34,7 +34,7 @@
 ;; ==========
 
 ;; When editing a symlink and *both* the symlink and its target
-;; are bzr-versioned, `vc-bzr` presently runs `bzr status` on the
+;; are bzr-versioned, `vc-bzr' presently runs `bzr status' on the
 ;; symlink, thereby not detecting whether the actual contents
 ;; (that is, the target contents) are changed.
 
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index cbf3da3..e3cd5d4 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -960,14 +960,13 @@ or BRANCH^ (where \"^\" can be repeated)."
 
 (defun vc-git-expanded-log-entry (revision)
   (with-temp-buffer
-    (apply 'vc-git-command t nil nil (list "log" revision "-1"))
+    (apply 'vc-git-command t nil nil (list "log" revision "-1" "--"))
     (goto-char (point-min))
     (unless (eobp)
       ;; Indent the expanded log entry.
       (indent-region (point-min) (point-max) 2)
       (buffer-string))))
 
-
 (defun vc-git-region-history (file buffer lfrom lto)
   (vc-git-command buffer 'async nil "log" "-p" ;"--follow" ;FIXME: not 
supported?
                   (format "-L%d,%d:%s" lfrom lto (file-relative-name file))))
@@ -1019,12 +1018,18 @@ or BRANCH^ (where \"^\" can be repeated)."
 
 (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)
+  (let (process-file-side-effects
+        (command "diff-tree"))
+    (if rev2
+        ;; Diffing against the empty tree.
+        (unless rev1 (setq rev1 "4b825dc642cb6eb9a060e54bf8d69288fbee4904"))
+      (setq command "diff-index")
+      (unless rev1 (setq rev1 "HEAD")))
     (if vc-git-diff-switches
         (apply #'vc-git-command (or buffer "*vc-diff*")
               (if async 'async 1)
               files
-               (if (and rev1 rev2) "diff-tree" "diff-index")
+               command
                "--exit-code"
                (append (vc-switches 'git 'diff)
                        (list "-p" (or rev1 "HEAD") rev2 "--")))
@@ -1033,7 +1038,7 @@ or BRANCH^ (where \"^\" can be repeated)."
                       (concat "diff "
                               (mapconcat 'identity
                                          (vc-switches nil 'diff) " "))
-                      (or rev1 "HEAD") rev2 "--"))))
+                      rev1 rev2 "--"))))
 
 (defun vc-git-revision-table (_files)
   ;; What about `files'?!?  --Stef
@@ -1061,7 +1066,7 @@ or BRANCH^ (where \"^\" can be repeated)."
 (declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
 
 (defun vc-git-annotate-time ()
-  (and (re-search-forward 
"^[0-9a-f]+[^()]+(.*?\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) 
\\(:?\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\)\\)? *[0-9]+) " nil t)
+  (and (re-search-forward 
"^[0-9a-f^]+[^()]+(.*?\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) 
\\(:?\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\)\\)? *[0-9]+) " nil t)
        (vc-annotate-convert-time
         (apply #'encode-time (mapcar (lambda (match)
                                        (if (match-beginning match)
@@ -1072,7 +1077,7 @@ or BRANCH^ (where \"^\" can be repeated)."
 (defun vc-git-annotate-extract-revision-at-line ()
   (save-excursion
     (beginning-of-line)
-    (when (looking-at "\\([0-9a-f^][0-9a-f]+\\) \\(\\([^(]+\\) \\)?")
+    (when (looking-at "\\^?\\([0-9a-f]+\\) \\(\\([^(]+\\) \\)?")
       (let ((revision (match-string-no-properties 1)))
        (if (match-beginning 2)
            (let ((fname (match-string-no-properties 3)))
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index d5d0abe..1bd04e1 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -367,7 +367,8 @@
 ;;   BUFFER is nil.  If ASYNC is non-nil, run asynchronously.  If REV1
 ;;   and REV2 are non-nil, report differences from REV1 to REV2.  If
 ;;   REV1 is nil, use the working revision (as found in the
-;;   repository) as the older revision; if REV2 is nil, use the
+;;   repository) as the older revision if REV2 is nil as well;
+;;   otherwise, diff against an empty tree.  If REV2 is nil, use the
 ;;   current working-copy contents as the newer revision.  This
 ;;   function should pass the value of (vc-switches BACKEND 'diff) to
 ;;   the backend command.  It should return a status of either 0 (no
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 0a95783..d09214b 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -3319,7 +3319,7 @@ It reads a directory name from an editable text field."
            ;; Avoid a confusing end-of-file error.
            (skip-syntax-forward "\\s-")
            (if (eobp)
-               (setq err "Empty sexp -- use `nil'?")
+               (setq err "Empty sexp -- use nil?")
              (unless (widget-apply widget :match (read (current-buffer)))
                (setq err (widget-get widget :type-error))))
            ;; Allow whitespace after expression.
diff --git a/lisp/widget.el b/lisp/widget.el
index 539f91e..d62f7ff 100644
--- a/lisp/widget.el
+++ b/lisp/widget.el
@@ -85,7 +85,7 @@ create identical widgets:
 The third argument DOC is a documentation string for the widget."
   ;;
   (unless (or (null doc) (stringp doc))
-    (error "widget documentation must be `nil' or a string."))
+    (error "widget documentation must be nil or a string."))
   (put name 'widget-type (cons class args))
   (put name 'widget-documentation (purecopy doc))
   name)
diff --git a/lisp/windmove.el b/lisp/windmove.el
index c461a00..1df74a2 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -488,8 +488,8 @@ If no window is at direction DIR, an error is signaled."
 
 
 ;;; end-user functions
-;; these are all simple interactive wrappers to `windmove-do-
-;; window-select', meant to be bound to keys.
+;; these are all simple interactive wrappers to
+;; `windmove-do-window-select', meant to be bound to keys.
 
 ;;;###autoload
 (defun windmove-left (&optional arg)
diff --git a/lisp/window.el b/lisp/window.el
index 49b7e2c..fad9b2f 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -4311,7 +4311,7 @@ one.  If non-nil, reset `quit-restore' parameter to nil.
 Optional second argument BURY-OR-KILL tells how to proceed with
 the buffer of WINDOW.  The following values are handled:
 
-`nil' means to not handle the buffer in a particular way.  This
+nil means to not handle the buffer in a particular way.  This
   means that if WINDOW is not deleted by this function, invoking
   `switch-to-prev-buffer' will usually show the buffer again.
 
@@ -6884,6 +6884,33 @@ the selected window or never appeared in it before, or if
   :group 'windows
   :version "24.3")
 
+(defcustom switch-to-buffer-in-dedicated-window nil
+  "Allow switching to buffer in strongly dedicated windows.
+If non-nil, allow `switch-to-buffer' to proceed when called
+interactively and the selected window is strongly dedicated to
+its buffer.
+
+The following values are recognized:
+
+nil - disallow switching; signal an error
+
+prompt - prompt user whether to allow switching
+
+pop - perform `pop-to-buffer' instead
+
+t - undedicate selected window and switch
+
+When called non-interactively, `switch-to-buffer' always signals
+an error when the selected window is dedicated to its buffer and
+FORCE-SAME-WINDOW is non-nil."
+  :type '(choice
+         (const :tag "Disallow" nil)
+         (const :tag "Prompt" prompt)
+         (const :tag "Pop" pop)
+         (const :tag "Allow" t))
+  :group 'windows
+  :version "25.1")
+
 (defun switch-to-buffer (buffer-or-name &optional norecord force-same-window)
   "Display buffer BUFFER-OR-NAME in the selected window.
 
@@ -6891,10 +6918,12 @@ WARNING: This is NOT the way to work on another buffer 
temporarily
 within a Lisp program!  Use `set-buffer' instead.  That avoids
 messing with the window-buffer correspondences.
 
-If the selected window cannot display the specified
-buffer (e.g. if it is a minibuffer window or strongly dedicated
-to another buffer), call `pop-to-buffer' to select the buffer in
-another window.
+If the selected window cannot display the specified buffer
+because it is a minibuffer window or strongly dedicated to
+another buffer, call `pop-to-buffer' to select the buffer in
+another window.  In interactive use, if the selected window is
+strongly dedicated to its buffer, the value of the option
+`switch-to-buffer-in-dedicated-window' specifies how to proceed.
 
 If called interactively, read the buffer name using the
 minibuffer.  The variable `confirm-nonexistent-file-or-buffer'
@@ -6911,8 +6940,9 @@ at the front of the buffer list, and do not make the 
window
 displaying it the most recently selected one.
 
 If optional argument FORCE-SAME-WINDOW is non-nil, the buffer
-must be displayed in the selected window; if that is impossible,
-signal an error rather than calling `pop-to-buffer'.
+must be displayed in the selected window when called
+non-interactively; if that is impossible, signal an error rather
+than calling `pop-to-buffer'.
 
 The option `switch-to-buffer-preserve-window-point' can be used
 to make the buffer appear at its last position in the selected
@@ -6920,7 +6950,25 @@ window.
 
 Return the buffer switched to."
   (interactive
-   (list (read-buffer-to-switch "Switch to buffer: ") nil 'force-same-window))
+   (let ((force-same-window
+          (cond
+           ((window-minibuffer-p) nil)
+           ((not (eq (window-dedicated-p) t)) 'force-same-window)
+           ((pcase switch-to-buffer-in-dedicated-window
+              (`nil (user-error
+                     "Cannot switch buffers in a dedicated window"))
+              (`prompt
+               (if (y-or-n-p
+                    (format "Window is dedicated to %s; undedicate it"
+                            (window-buffer)))
+                   (progn
+                     (set-window-dedicated-p nil nil)
+                     'force-same-window)
+                 (user-error
+                  "Cannot switch buffers in a dedicated window")))
+              (`pop nil)
+              (_ (set-window-dedicated-p nil nil) 'force-same-window))))))
+     (list (read-buffer-to-switch "Switch to buffer: ") nil 
force-same-window)))
   (let ((buffer (window-normalize-buffer-to-switch-to buffer-or-name)))
     (cond
      ;; Don't call set-window-buffer if it's not needed since it
@@ -8059,7 +8107,7 @@ This function is responsible for combining the sizes of 
the
 displayed windows and returning a cons (WIDTH . HEIGHT)
 describing the width and height with which Emacs will call
 `set-process-window-size' for that process.  If the function
-returns `nil', Emacs does not call `set-process-window-size'.
+returns nil, Emacs does not call `set-process-window-size'.
 
 This function is called with the process buffer as the current
 buffer and with two arguments: the process and a list of windows
diff --git a/lisp/woman.el b/lisp/woman.el
index 611ba74..75c3d2e 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -161,7 +161,7 @@
 
 ;; The WoMan menu provides an option to make a contents menu for the
 ;; current man page (using imenu).  Alternatively, if you set the
-;; variable `woman-imenu' to `t' then WoMan will do it automatically
+;; variable `woman-imenu' to t then WoMan will do it automatically
 ;; for every man page.  The menu title is the value of the variable
 ;; `woman-imenu-title', which is "CONTENTS" by default.  By default,
 ;; the menu shows manual sections and subsections, but you can change
@@ -179,7 +179,7 @@
 ;; Howard Melman made (essentially) the following suggestions, which
 ;; are slightly different from the expression that I currently use.
 ;; You may prefer one of Howard's suggestions, which I think assume
-;; that `case-fold-search' is `t' (which it is by default):
+;; that `case-fold-search' is t (which it is by default):
 
 ;; (setq woman-imenu-generic-expression
 ;;       '((nil "^\\(   \\)?\\([A-Z][A-Z ]+[A-Z]\\)[ \t]*$" 2)))
@@ -217,7 +217,7 @@
 ;; This is modeled on the byte-compiler.  It logs all files formatted
 ;; by WoMan, and if WoMan finds anything that it cannot handle then it
 ;; writes a warning to this buffer.  If the variable `woman-show-log'
-;; is non-nil (by default it is `nil') then WoMan automatically
+;; is non-nil (by default it is nil) then WoMan automatically
 ;; displays this buffer.  Many WoMan warnings can be completely
 ;; ignored, because they are reporting the fact that WoMan has ignored
 ;; requests that it is correct to ignore.  In some future version this
@@ -228,8 +228,8 @@
 
 ;; Uninterpreted ?roff requests can optionally be left in the
 ;; formatted buffer to indicate precisely where they occur by
-;; resetting the variable `woman-ignore' to `nil' (by default it is
-;; `t').
+;; resetting the variable `woman-ignore' to nil (by default it is
+;; t).
 
 ;; Automatic initiation of woman decoding
 
@@ -278,7 +278,7 @@
 ;; CASE-DEPENDENCE OF FILENAMES.  By default, WoMan ignores case in
 ;; file pathnames only when it seems appropriate.  MS-Windows users
 ;; who want complete case independence should set the NTEmacs variable
-;; `w32-downcase-file-names' to `t' and use all lower case when
+;; `w32-downcase-file-names' to t and use all lower case when
 ;; setting WoMan file paths.
 
 ;; (1) INCOMPATIBLE CHANGE!  WoMan no longer uses a persistent topic
diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el
index f8ae73c..2bb7154 100644
--- a/lisp/xt-mouse.el
+++ b/lisp/xt-mouse.el
@@ -321,21 +321,21 @@ Enables basic mouse tracking, mouse motion events and 
finally
 extended tracking on terminals that support it. The following
 escape sequences are understood by modern xterms:
 
-\"\\e[?1000h\" `Basic mouse mode´: Enables reports for mouse
+\"\\e[?1000h\" \"Basic mouse mode\": Enables reports for mouse
             clicks. There is a limit to the maximum row/column
             position (<= 223), which can be reported in this
             basic mode.
 
-\"\\e[?1002h\" `Mouse motion mode´: Enables reports for mouse
+\"\\e[?1002h\" \"Mouse motion mode\": Enables reports for mouse
             motion events during dragging operations.
 
-\"\\e[?1005h\" `UTF-8 coordinate extension`: Enables an extension
+\"\\e[?1005h\" \"UTF-8 coordinate extension\": Enables an extension
             to the basic mouse mode, which uses UTF-8
             characters to overcome the 223 row/column limit. This
             extension may conflict with non UTF-8 applications or
             non UTF-8 locales.
 
-\"\\e[?1006h\" `SGR coordinate extension´: Enables a newer
+\"\\e[?1006h\" \"SGR coordinate extension\": Enables a newer
             alternative extension to the basic mouse mode, which
             overcomes the 223 row/column limit without the
             drawbacks of the UTF-8 coordinate extension.
diff --git a/src/buffer.c b/src/buffer.c
index b09676c..c78d08c 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1467,15 +1467,15 @@ DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 
3, 0,
 Buffers not visible in windows are preferred to visible buffers, unless
 optional second argument VISIBLE-OK is non-nil.  Ignore the argument
 BUFFER unless it denotes a live buffer.  If the optional third argument
-FRAME is non-nil, use that frame's buffer list instead of the selected
-frame's buffer list.
+FRAME specifies a live frame, then use that frame's buffer list instead
+of the selected frame's buffer list.
 
 The buffer is found by scanning the selected or specified frame's buffer
 list first, followed by the list of all buffers.  If no other buffer
 exists, return the buffer `*scratch*' (creating it if necessary).  */)
   (Lisp_Object buffer, Lisp_Object visible_ok, Lisp_Object frame)
 {
-  struct frame *f = decode_any_frame (frame);
+  struct frame *f = decode_live_frame (frame);
   Lisp_Object tail = f->buffer_list, pred = f->buffer_predicate;
   Lisp_Object buf, notsogood = Qnil;
 
@@ -6106,7 +6106,7 @@ An entry of the form POSITION indicates that point was at 
the buffer
 location given by the integer.  Undoing an entry of this form places
 point at POSITION.
 
-Entries with value `nil' mark undo boundaries.  The undo command treats
+Entries with value nil mark undo boundaries.  The undo command treats
 the changes between two undo boundaries as a single step to be undone.
 
 If the value of the variable is t, undo information is not recorded.  */);
diff --git a/src/cmds.c b/src/cmds.c
index b590805..6f9982e 100644
--- a/src/cmds.c
+++ b/src/cmds.c
@@ -110,10 +110,17 @@ DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 
1, "^p",
 Precisely, if point is on line I, move to the start of line I + N
 \("start of line" in the logical order).
 If there isn't room, go as far as possible (no error).
+
 Returns the count of lines left to move.  If moving forward,
-that is N - number of lines moved; if backward, N + number moved.
-With positive N, a non-empty line at the end counts as one line
-successfully moved (for the return value).  */)
+that is N minus number of lines moved; if backward, N plus number
+moved.
+
+Exception: With positive N, a non-empty line at the end of the
+buffer, or of its accessible portion, counts as one line
+successfully moved (for the return value).  This means that the
+function will move point to the end of such a line and will count
+it as a line moved across, even though there is no next line to
+go to its beginning.  */)
   (Lisp_Object n)
 {
   ptrdiff_t opoint = PT, pos, pos_byte, shortage, count;
diff --git a/src/font.c b/src/font.c
index 603e998..2ccfd15 100644
--- a/src/font.c
+++ b/src/font.c
@@ -3822,17 +3822,17 @@ They are the same as face attributes of the same name.  
See
 
 `:foundry'
 
-VALUE must be a string or a symbol specifying the font foundry, e.g. ``misc''.
+VALUE must be a string or a symbol specifying the font foundry, e.g. `misc'.
 
 `:adstyle'
 
 VALUE must be a string or a symbol specifying the additional
-typographic style information of a font, e.g. ``sans''.
+typographic style information of a font, e.g. `sans'.
 
 `:registry'
 
 VALUE must be a string or a symbol specifying the charset registry and
-encoding of a font, e.g. ``iso8859-1''.
+encoding of a font, e.g. `iso8859-1'.
 
 `:size'
 
@@ -3866,7 +3866,7 @@ required OpenType features.
   GSUB: List of OpenType GSUB feature tag symbols, or nil if none required.
   GPOS: List of OpenType GPOS feature tag symbols, or nil if none required.
 
-GSUB and GPOS may contain `nil' element.  In such a case, the font
+GSUB and GPOS may contain nil elements.  In such a case, the font
 must not have any of the remaining elements.
 
 For instance, if the VALUE is `(thai nil nil (mark))', the font must
@@ -5011,7 +5011,7 @@ build_style_table (const struct table_entry *entry, int 
nelement)
 static Lisp_Object Vfont_log_deferred;
 
 /* Prepend the font-related logging data in Vfont_log if it is not
-   `t'.  ACTION describes a kind of font-related action (e.g. listing,
+   t.  ACTION describes a kind of font-related action (e.g. listing,
    opening), ARG is the argument for the action, and RESULT is the
    result of the action.  */
 void
diff --git a/src/frame.c b/src/frame.c
index 2208655..478bb00 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1823,9 +1823,10 @@ DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 
2, "",
        doc: /* Delete FRAME, permanently eliminating it from use.
 FRAME defaults to the selected frame.
 
-A frame may not be deleted if its minibuffer is used by other frames.
-Normally, you may not delete a frame if all other frames are invisible,
-but if the second optional argument FORCE is non-nil, you may do so.
+A frame may not be deleted if its minibuffer serves as surrogate
+minibuffer for another frame.  Normally, you may not delete a frame if
+all other frames are invisible, but if the second optional argument
+FORCE is non-nil, you may do so.
 
 This function runs `delete-frame-functions' before actually
 deleting the frame, unless the frame is a tooltip.
@@ -5151,7 +5152,7 @@ a non-nil value in your init file.  */);
 If this option is nil, setting font, menu bar, tool bar, internal
 borders, fringes or scroll bars of a specific frame may resize the frame
 in order to preserve the number of columns or lines it displays.  If
-this option is `t', no such resizing is done.  Note that the size of
+this option is t, no such resizing is done.  Note that the size of
 fullscreen and maximized frames, the height of fullheight frames and the
 width of fullwidth frames never change implicitly.
 
@@ -5167,14 +5168,14 @@ Changing any of the parameters `scroll-bar-width', 
`scroll-bar-height',
 window.  This means, for example, that removing vertical scroll bars on
 a frame containing several side by side windows will shrink the frame
 width by the width of one scroll bar provided this option is nil and
-keep it unchanged if this option is either `t' or a list containing
+keep it unchanged if this option is either t or a list containing
 `vertical-scroll-bars'.
 
 The default value is '(tool-bar-lines) on Lucid, Motif and Windows
 \(which means that adding/removing a tool bar does not change the frame
 height), nil on all other window systems including GTK+ (which means
 that changing any of the parameters listed above may change the size of
-the frame), and `t' otherwise (which means the frame size never changes
+the frame), and t otherwise (which means the frame size never changes
 implicitly when there's no window system support).
 
 Note that when a frame is not large enough to accommodate a change of
diff --git a/src/gnutls.c b/src/gnutls.c
index 9b8ae2b..9c2d86e 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -1181,7 +1181,7 @@ gnutls_certificate_set_verify_flags.
 instead.
 
 :verify-error is a list of symbols to express verification checks or
-`t' to do all checks.  Currently it can contain `:trustfiles' and
+t to do all checks.  Currently it can contain `:trustfiles' and
 `:hostname' to verify the certificate or the hostname respectively.
 
 :min-prime-bits is the minimum accepted number of bits the client will
diff --git a/src/keyboard.c b/src/keyboard.c
index 77f7fb9..eb66c44 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1702,7 +1702,8 @@ adjust_point_for_property (ptrdiff_t last_pt, bool 
modified)
       if (check_display
          && PT > BEGV && PT < ZV
          && !NILP (val = get_char_property_and_overlay
-                             (make_number (PT), Qdisplay, Qnil, &overlay))
+                             (make_number (PT), Qdisplay, selected_window,
+                              &overlay))
          && display_prop_intangible_p (val, overlay, PT, PT_BYTE)
          && (!OVERLAYP (overlay)
              ? get_property_and_range (PT, Qdisplay, &val, &beg, &end, Qnil)
diff --git a/src/keymap.c b/src/keymap.c
index d10c004..e989805 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -498,7 +498,7 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
            if (INTEGERP (idx) && (XFASTINT (idx) & CHAR_MODIFIER_MASK) == 0)
              {
                val = Faref (binding, idx);
-               /* `nil' has a special meaning for char-tables, so
+               /* nil has a special meaning for char-tables, so
                   we use something else to record an explicitly
                   unbound entry.  */
                if (NILP (val))
@@ -849,7 +849,7 @@ store_in_keymap (Lisp_Object keymap, register Lisp_Object 
idx, Lisp_Object def)
            if (NATNUMP (idx) && !(XFASTINT (idx) & CHAR_MODIFIER_MASK))
              {
                Faset (elt, idx,
-                      /* `nil' has a special meaning for char-tables, so
+                      /* nil has a special meaning for char-tables, so
                          we use something else to record an explicitly
                          unbound entry.  */
                       NILP (def) ? Qt : def);
diff --git a/src/nsfns.m b/src/nsfns.m
index 8a3c6cc..6a2e2ff 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -749,7 +749,7 @@ ns_implicitly_set_icon_type (struct frame *f)
        chain = XCDR (chain))
     {
       elt = XCAR (chain);
-      /* special case: 't' means go by file type */
+      /* special case: t means go by file type */
       if (SYMBOLP (elt) && EQ (elt, Qt) && SSDATA (f->name)[0] == '/')
         {
           NSString *str
@@ -2836,13 +2836,13 @@ elements (all size values are in pixels).
 
 - `title-bar-height' is the height of the title bar of FRAME.
 
-- `menu-bar-external' if `t' means the menu bar is external (not
+- `menu-bar-external' if t means the menu bar is external (not
   included in the inner edges of FRAME).
 
 - `menu-bar-size' is a cons of the width and height of the menu bar of
   FRAME.
 
-- `tool-bar-external' if `t' means the tool bar is external (not
+- `tool-bar-external' if t means the tool bar is external (not
   included in the inner edges of FRAME).
 
 - `tool-bar-side' tells tells on which side the tool bar on FRAME is and
diff --git a/src/w32fns.c b/src/w32fns.c
index b9d7bd4..3a6fa62 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -7535,13 +7535,13 @@ elements (all size values are in pixels).
 
 - `title-bar-height' is the height of the title bar of FRAME.
 
-- `menu-bar-external' if `t' means the menu bar is by default external
+- `menu-bar-external' if t means the menu bar is by default external
   (not included in the inner size of FRAME).
 
 - `menu-bar-size' is a cons of the width and height of the menu bar of
   FRAME.
 
-- `tool-bar-external' if `t' means the tool bar is by default external
+- `tool-bar-external' if t means the tool bar is by default external
   (not included in the inner size of FRAME).
 
 - `tool-bar-side' tells tells on which side the tool bar on FRAME is by
diff --git a/src/w32heap.c b/src/w32heap.c
index ee0eb16..47ffec1 100644
--- a/src/w32heap.c
+++ b/src/w32heap.c
@@ -115,9 +115,9 @@ typedef struct _RTL_HEAP_PARAMETERS {
    to build only the first bootstrap-emacs.exe with the large size,
    and reset that to a lower value afterwards.  */
 #if defined _WIN64 || defined WIDE_EMACS_INT
-# define DUMPED_HEAP_SIZE (18*1024*1024)
+# define DUMPED_HEAP_SIZE (19*1024*1024)
 #else
-# define DUMPED_HEAP_SIZE (11*1024*1024)
+# define DUMPED_HEAP_SIZE (12*1024*1024)
 #endif
 
 static unsigned char dumped_data[DUMPED_HEAP_SIZE];
diff --git a/src/w32term.c b/src/w32term.c
index d415b13..089c43c 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1410,7 +1410,7 @@ x_draw_glyphless_glyph_string_foreground (struct 
glyph_string *s)
 
       if (glyph->u.glyphless.method == GLYPHLESS_DISPLAY_ACRONYM)
        {
-         if (len > 1
+         if (len > 0
              && CHAR_TABLE_P (Vglyphless_char_display)
              && (CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (Vglyphless_char_display))
                  >= 1))
diff --git a/src/xdisp.c b/src/xdisp.c
index c2f0b74..87f110e 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4899,6 +4899,20 @@ handle_single_display_spec (struct it *it, Lisp_Object 
spec, Lisp_Object object,
     {
       start_pos = *position;
       *position = display_prop_end (it, object, start_pos);
+      /* If the display property comes from an overlay, don't consider
+        any potential stop_charpos values before the end of that
+        overlay.  Since display_prop_end will happily find another
+        'display' property coming from some other overlay or text
+        property on buffer positions before this overlay's end, we
+        need to ignore them, or else we risk displaying this
+        overlay's display string/image twice.  */
+      if (!NILP (overlay))
+       {
+         ptrdiff_t ovendpos = OVERLAY_POSITION (OVERLAY_END (overlay));
+
+         if (ovendpos > CHARPOS (*position))
+           SET_TEXT_POS (*position, ovendpos, CHAR_TO_BYTE (ovendpos));
+       }
     }
   value = Qnil;
 
@@ -29145,6 +29159,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, 
int x, int y,
     }
 
   /* Change the mouse face according to what is under X/Y.  */
+  bool mouse_face_shown = false;
   if (STRINGP (string))
     {
       mouse_face = Fget_text_property (pos, Qmouse_face, string);
@@ -29267,13 +29282,18 @@ note_mode_line_or_margin_highlight (Lisp_Object 
window, int x, int y,
                                                                glyph->face_id,
                                                                true);
          show_mouse_face (hlinfo, DRAW_MOUSE_FACE);
+         mouse_face_shown = true;
 
          if (NILP (pointer))
            pointer = Qhand;
        }
-      else if ((area == ON_MODE_LINE) || (area == ON_HEADER_LINE))
-       clear_mouse_face (hlinfo);
     }
+
+  /* If mouse-face doesn't need to be shown, clear any existing
+     mouse-face.  */
+  if ((area == ON_MODE_LINE || area == ON_HEADER_LINE) && !mouse_face_shown)
+    clear_mouse_face (hlinfo);
+
 #ifdef HAVE_WINDOW_SYSTEM
   if (FRAME_WINDOW_P (f))
     define_frame_cursor1 (f, cursor, pointer);
diff --git a/src/xfns.c b/src/xfns.c
index 80c214a..5ac58e9 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -4320,13 +4320,13 @@ elements (all size values are in pixels).
 
 - `title-bar-height' is the height of the title bar of FRAME.
 
-- `menu-bar-external' if `t' means the menu bar is external (not
+- `menu-bar-external' if t means the menu bar is external (not
   included in the inner edges of FRAME).
 
 - `menu-bar-size' is a cons of the width and height of the menu bar of
   FRAME.
 
-- `tool-bar-external' if `t' means the tool bar is external (not
+- `tool-bar-external' if t means the tool bar is external (not
   included in the inner edges of FRAME).
 
 - `tool-bar-side' tells tells on which side the tool bar on FRAME is and
diff --git a/src/xterm.c b/src/xterm.c
index 4590e34..3734fbf 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -7847,17 +7847,18 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
       f = any;
 
-#if ! defined (USE_GTK)
       /* If mouse-highlight is an integer, input clears out
         mouse highlighting.  */
       if (!hlinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight)
+#if ! defined (USE_GTK)
          && (f == 0
-             || !EQ (f->tool_bar_window, hlinfo->mouse_face_window)))
+             || !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
+#endif
+         )
         {
           clear_mouse_face (hlinfo);
           hlinfo->mouse_face_hidden = true;
         }
-#endif
 
 #if defined USE_MOTIF && defined USE_TOOLKIT_SCROLL_BARS
       if (f == 0)
@@ -12256,7 +12257,7 @@ static struct redisplay_interface x_redisplay_interface 
=
     x_draw_window_cursor,
     x_draw_vertical_window_border,
     x_draw_window_divider,
-    x_shift_glyphs_for_insert, /* Never called, se comment in function.  */
+    x_shift_glyphs_for_insert, /* Never called; see comment in function.  */
     x_show_hourglass,
     x_hide_hourglass
   };
diff --git a/test/automated/cl-generic-tests.el 
b/test/automated/cl-generic-tests.el
index a6035d1..2703b44 100644
--- a/test/automated/cl-generic-tests.el
+++ b/test/automated/cl-generic-tests.el
@@ -26,15 +26,18 @@
 (eval-when-compile (require 'ert)) ;Don't indirectly require cl-lib at 
run-time.
 (require 'cl-generic)
 
+(fmakunbound 'cl--generic-1)
 (cl-defgeneric cl--generic-1 (x y))
 (cl-defgeneric (setf cl--generic-1) (v y z) "My generic doc.")
 
 (ert-deftest cl-generic-test-00 ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y))
   (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
   (should (equal (cl--generic-1 'a 'b) '(a . b))))
 
 (ert-deftest cl-generic-test-01-eql ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y))
   (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
   (cl-defmethod cl--generic-1 ((_x (eql 4)) _y)
@@ -54,6 +57,7 @@
 (cl-defstruct (cl-generic-struct-child2 (:include cl-generic-struct-parent)) e)
 
 (ert-deftest cl-generic-test-02-struct ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y) "My doc.")
   (cl-defmethod cl--generic-1 ((x t) y) "Doc 1." (cons x y))
   (cl-defmethod cl--generic-1 ((_x cl-generic-struct-parent) y)
@@ -91,6 +95,7 @@
     (should (equal x '(3 2 1)))))
 
 (ert-deftest cl-generic-test-04-overlapping-tagcodes ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y) "My doc.")
   (cl-defmethod cl--generic-1 ((y t) z) (list y z))
   (cl-defmethod cl--generic-1 ((_y (eql 4)) _z)
@@ -104,6 +109,7 @@
   (should (equal (cl--generic-1 4 'b) '("four" "integer" "number" 4 b))))
 
 (ert-deftest cl-generic-test-05-alias ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y) "My doc.")
   (defalias 'cl--generic-2 #'cl--generic-1)
   (cl-defmethod cl--generic-1 ((y t) z) (list y z))
@@ -112,6 +118,7 @@
   (should (equal (cl--generic-1 4 'b) '("four" 4 b))))
 
 (ert-deftest cl-generic-test-06-multiple-dispatch ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y) "My doc.")
   (cl-defmethod cl--generic-1 (x y) (list x y))
   (cl-defmethod cl--generic-1 (_x (_y integer))
@@ -123,6 +130,7 @@
   (should (equal (cl--generic-1 1 2) '("x&y-int" "x-int" "y-int" 1 2))))
 
 (ert-deftest cl-generic-test-07-apo ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y)
     (:documentation "My doc.") (:argument-precedence-order y x))
   (cl-defmethod cl--generic-1 (x y) (list x y))
@@ -136,6 +144,7 @@
 
 (ert-deftest cl-generic-test-08-after/before ()
   (let ((log ()))
+    (fmakunbound 'cl--generic-1)
     (cl-defgeneric cl--generic-1 (x y))
     (cl-defmethod cl--generic-1 ((_x t) y) (cons y log))
     (cl-defmethod cl--generic-1 ((_x (eql 4)) _y)
@@ -150,6 +159,7 @@
 (defun cl--generic-test-advice (&rest args) (cons "advice" (apply args)))
 
 (ert-deftest cl-generic-test-09-advice ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y) "My doc.")
   (cl-defmethod cl--generic-1 (x y) (list x y))
   (advice-add 'cl--generic-1 :around #'cl--generic-test-advice)
@@ -161,6 +171,7 @@
   (should (equal (cl--generic-1 4 5) '("integer" 4 5))))
 
 (ert-deftest cl-generic-test-10-weird ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x &rest r) "My doc.")
   (cl-defmethod cl--generic-1 (x &rest r) (cons x r))
   ;; This kind of definition is not valid according to CLHS, but it does show
@@ -172,6 +183,7 @@
   (should (equal (cl--generic-1 1 2) '("integer" 2 1))))
 
 (ert-deftest cl-generic-test-11-next-method-p ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 (x y))
   (cl-defmethod cl--generic-1 ((x t) y)
     (list x y (cl-next-method-p)))
@@ -179,15 +191,33 @@
     (cl-list* "quatre" (cl-next-method-p) (cl-call-next-method)))
   (should (equal (cl--generic-1 4 5) '("quatre" t 4 5 nil))))
 
-(ert-deftest sm-generic-test-12-context ()
+(ert-deftest cl-generic-test-12-context ()
+  (fmakunbound 'cl--generic-1)
   (cl-defgeneric cl--generic-1 ())
-  (cl-defmethod cl--generic-1 (&context (overwrite-mode (eql t)))   'is-t)
-  (cl-defmethod cl--generic-1 (&context (overwrite-mode (eql nil))) 'is-nil)
-  (cl-defmethod cl--generic-1 () 'other)
+  (cl-defmethod cl--generic-1 (&context (overwrite-mode (eql t)))
+    (list 'is-t (cl-call-next-method)))
+  (cl-defmethod cl--generic-1 (&context (overwrite-mode (eql nil)))
+    (list 'is-nil (cl-call-next-method)))
+  (cl-defmethod cl--generic-1 () 'any)
   (should (equal (list (let ((overwrite-mode t))   (cl--generic-1))
                        (let ((overwrite-mode nil)) (cl--generic-1))
                        (let ((overwrite-mode 1))   (cl--generic-1)))
-                 '(is-t is-nil other))))
+                 '((is-t any) (is-nil any) any))))
+
+(ert-deftest cl-generic-test-13-head ()
+  (fmakunbound 'cl--generic-1)
+  (cl-defgeneric cl--generic-1 (x y))
+  (cl-defmethod cl--generic-1 ((x t) y) (cons x y))
+  (cl-defmethod cl--generic-1 ((_x (head 4)) _y)
+    (cons "quatre" (cl-call-next-method)))
+  (cl-defmethod cl--generic-1 ((_x (head 5)) _y)
+    (cons "cinq" (cl-call-next-method)))
+  (cl-defmethod cl--generic-1 ((_x (head 6)) y)
+    (cons "six" (cl-call-next-method 'a y)))
+  (should (equal (cl--generic-1 'a nil) '(a)))
+  (should (equal (cl--generic-1 '(4) nil) '("quatre" (4))))
+  (should (equal (cl--generic-1 '(5) nil) '("cinq" (5))))
+  (should (equal (cl--generic-1 '(6) nil) '("six" a))))
 
 (provide 'cl-generic-tests)
 ;;; cl-generic-tests.el ends here
diff --git a/test/automated/compile-tests.el b/test/automated/compile-tests.el
index 24c4fde..0c383f7 100644
--- a/test/automated/compile-tests.el
+++ b/test/automated/compile-tests.el
@@ -204,9 +204,11 @@
     ("makepp: bla bla `/foo/bar.c' and `/foo/bar.h'" 35 nil nil "/foo/bar.h")
     ;; maven
     ("FooBar.java:[111,53] no interface expected here"
-     1 53 111 "FooBar.java")
+     1 53 111 "FooBar.java" 2)
     ("  [ERROR] /Users/cinsk/hello.java:[651,96] ';' expected"
-     15 96 651 "/Users/cinsk/hello.java") ;Bug#11517.
+     15 96 651 "/Users/cinsk/hello.java" 2) ;Bug#11517.
+    ("[WARNING] /foo/bar/Test.java:[27,43] unchecked conversion"
+     11 43 27 "/foo/bar/Test.java" 1) ;Bug#20556
     ;; mips-1 mips-2
     ("TrimMask (255) in solomon.c may be indistinguishable from TrimMasks (93) 
in solomo.c due to truncation"
      11 nil 255 "solomon.c")
@@ -335,6 +337,7 @@ END-LINE, if that matched.")
            (col  (nth 2 test))
            (line (nth 3 test))
            (file (nth 4 test))
+            (type (nth 5 test))
            end-col end-line)
        (if (consp col)
            (setq end-col (cdr col) col (car col)))
@@ -342,13 +345,15 @@ END-LINE, if that matched.")
            (setq end-line (cdr line) line (car line)))
        (and (equal (compilation--loc->col loc) col)
             (equal (compilation--loc->line loc) line)
-            (or (not file) 
+             (or (not file)
                  (equal (caar (compilation--loc->file-struct loc)) file))
             (or (null end-col)
                 (equal (car (cadr (nth 2 (compilation--loc->file-struct loc))))
                        end-col))
             (equal (car (nth 2 (compilation--loc->file-struct loc)))
-                   (or end-line line)))))))
+                    (or end-line line))
+             (or (null type)
+                 (equal type (compilation--message->type msg))))))))
 
 (ert-deftest compile-test-error-regexps ()
   "Test the `compilation-error-regexp-alist' regexps.
diff --git a/test/automated/data/decompress/foo-gzipped 
b/test/automated/data/decompress/foo.gz
similarity index 100%
rename from test/automated/data/decompress/foo-gzipped
rename to test/automated/data/decompress/foo.gz
diff --git a/test/automated/data/package/newer-versions/simple-single-1.4.el 
b/test/automated/data/package/newer-versions/simple-single-1.4.el
index 7d8178c..7b1c00c 100644
--- a/test/automated/data/package/newer-versions/simple-single-1.4.el
+++ b/test/automated/data/package/newer-versions/simple-single-1.4.el
@@ -19,7 +19,7 @@
 
 (defcustom simple-single-super-sunday nil
   "How great is this?
-Default changed to `nil'."
+Default changed to nil."
   :type 'boolean
   :group 'simple-single
   :package-version "1.4")
diff --git a/test/automated/file-notify-tests.el 
b/test/automated/file-notify-tests.el
index 8e3a791..46d287f 100644
--- a/test/automated/file-notify-tests.el
+++ b/test/automated/file-notify-tests.el
@@ -72,7 +72,7 @@
 (defun file-notify--test-local-enabled ()
   "Whether local file notification is enabled.
 This is needed for local `temporary-file-directory' only, in the
-remote case we return always `t'."
+remote case we return always t."
   (or file-notify--library
       (file-remote-p temporary-file-directory)))
 
diff --git a/test/automated/package-test.el b/test/automated/package-test.el
index ed2e3cf..677bfa6 100644
--- a/test/automated/package-test.el
+++ b/test/automated/package-test.el
@@ -124,7 +124,7 @@
           ,@(if upload-base
                 '((package-test-archive-upload-base (make-temp-file 
"pkg-archive-base-" t))
                   (package-archive-upload-base 
package-test-archive-upload-base))
-              (list (cl-gensym)))) ;; Dummy value so `let' doesn't try to bind 
`nil'
+              (list (cl-gensym)))) ;; Dummy value so `let' doesn't try to bind 
nil
      (let ((buf (get-buffer "*Packages*")))
        (when (buffer-live-p buf)
          (kill-buffer buf)))
diff --git a/test/automated/sgml-mode-tests.el 
b/test/automated/sgml-mode-tests.el
new file mode 100644
index 0000000..eeb5c7d
--- /dev/null
+++ b/test/automated/sgml-mode-tests.el
@@ -0,0 +1,135 @@
+;;; sgml-mode-tests.el --- Tests for sgml-mode
+
+;; Copyright (C) 2015 Free Software Foundation, Inc.
+
+;; Author: Przemysław Wojnowski <address@hidden>
+;; Keywords: tests
+
+;; 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:
+
+;;; Code:
+
+(require 'sgml-mode)
+(require 'ert)
+
+(defmacro sgml-with-content (content &rest body)
+  "Insert CONTENT into a temporary `sgml-mode' buffer and execute BODY on it.
+The point is set to the beginning of the buffer."
+  `(with-temp-buffer
+     (sgml-mode)
+     (insert ,content)
+     (goto-char (point-min))
+     ,@body))
+
+;;; sgml-delete-tag
+
+(ert-deftest sgml-delete-tag-should-not-delete-tags-when-wrong-args ()
+  "Don't delete tag, when number of tags to delete is not positive number."
+  (let ((content "<p>Valar Morghulis</p>"))
+    (sgml-with-content
+     content
+     (sgml-delete-tag -1)
+     (should (string= content (buffer-string)))
+     (sgml-delete-tag 0)
+     (should (string= content (buffer-string))))))
+
+(ert-deftest sgml-delete-tag-should-delete-tags-n-times ()
+  ;; Delete only 1, when 1 available:
+  (sgml-with-content
+   "<br />"
+   (sgml-delete-tag 1)
+   (should (string= "" (buffer-string))))
+  ;; Delete from position on whitespaces before tag:
+  (sgml-with-content
+   " \t\n<br />"
+   (sgml-delete-tag 1)
+   (should (string= "" (buffer-string))))
+  ;; Delete from position on tag:
+  (sgml-with-content
+   "<br />"
+   (goto-char 3)
+   (sgml-delete-tag 1)
+   (should (string= "" (buffer-string))))
+  ;; Delete one by one:
+  (sgml-with-content
+   "<h1><p>You know nothing, Jon Snow.</p></h1>"
+   (sgml-delete-tag 1)
+   (should (string= "<p>You know nothing, Jon Snow.</p>" (buffer-string)))
+   (sgml-delete-tag 1)
+   (should (string= "You know nothing, Jon Snow." (buffer-string))))
+  ;; Delete 2 at a time, when 2 available:
+  (sgml-with-content
+   "<h1><p>You know nothing, Jon Snow.</p></h1>"
+   (sgml-delete-tag 2)
+   (should (string= "You know nothing, Jon Snow." (buffer-string)))))
+
+(ert-deftest sgml-delete-tag-should-delete-unclosed-tag ()
+  (sgml-with-content
+   "<ul><li>Keep your stones connected.</ul>"
+   (goto-char 5)                   ; position on "li" tag
+   (sgml-delete-tag 1)
+   (should (string= "<ul>Keep your stones connected.</ul>" (buffer-string)))))
+
+(ert-deftest sgml-delete-tag-should-signal-error-for-malformed-tags ()
+  (let ((content "<h1><h2>Drakaris!</h1></h2>"))
+    ;; Delete outside tag:
+    (sgml-with-content
+     content
+     (sgml-delete-tag 1)
+     (should (string= "<h2>Drakaris!</h2>" (buffer-string))))
+    ;; Delete inner tag:
+    (sgml-with-content
+     content
+     (goto-char 5)                   ; position the inner tag
+     (sgml-delete-tag 1)
+     (should (string= "<h1>Drakaris!</h1>" (buffer-string))))))
+
+(ert-deftest sgml-delete-tag-should-signal-error-when-deleting-too-much ()
+  (let ((content "<emph>Drakaris!</emph>"))
+    ;; No tags to delete:
+    (sgml-with-content
+     "Drakaris!"
+     (should-error (sgml-delete-tag 1) :type 'error)
+     (should (string= "Drakaris!" (buffer-string))))
+    ;; Trying to delete 2 tags, when only 1 available:
+    (sgml-with-content
+     content
+     (should-error (sgml-delete-tag 2) :type 'error)
+     (should (string= "Drakaris!" (buffer-string))))
+    ;; Trying to delete a tag, but not on/before a tag:
+    (sgml-with-content
+     content
+     (goto-char 7)                     ; D in Drakaris
+     (should-error (sgml-delete-tag 1) :type 'error)
+     (should (string= content (buffer-string))))
+    ;; Trying to delete a tag from position outside tag:
+    (sgml-with-content
+     content
+     (goto-char (point-max))
+     (should-error (sgml-delete-tag 1) :type 'error)
+     (should (string= content (buffer-string))))))
+
+(ert-deftest sgml-delete-tag-bug-8203-should-not-delete-apostrophe ()
+  :expected-result :failed
+  (sgml-with-content
+   "<title>Winter is comin'</title>"
+   (sgml-delete-tag 1)
+   (should (string= "Winter is comin'" (buffer-string)))))
+
+(provide 'sgml-mode-tests)
+;;; sgml-mode-tests.el ends here
diff --git a/test/automated/subr-tests.el b/test/automated/subr-tests.el
new file mode 100644
index 0000000..d29efc6
--- /dev/null
+++ b/test/automated/subr-tests.el
@@ -0,0 +1,64 @@
+;;; subr-tests.el --- Tests for subr.el
+
+;; Copyright (C) 2015 Free Software Foundation, Inc.
+
+;; Author: Oleh Krehel <address@hidden>
+;; Keywords:
+
+;; 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:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+
+(ert-deftest let-when-compile ()
+  ;; good case
+  (should (equal (macroexpand '(let-when-compile ((foo (+ 2 3)))
+                                (setq bar (eval-when-compile (+ foo foo)))
+                                (setq boo (eval-when-compile (* foo foo)))))
+                 '(progn
+                   (setq bar (quote 10))
+                   (setq boo (quote 25)))))
+  ;; bad case: `eval-when-compile' omitted, byte compiler should catch this
+  (should (equal (macroexpand
+                  '(let-when-compile ((foo (+ 2 3)))
+                    (setq bar (+ foo foo))
+                    (setq boo (eval-when-compile (* foo foo)))))
+                 '(progn
+                   (setq bar (+ foo foo))
+                   (setq boo (quote 25)))))
+  ;; something practical
+  (should (equal (macroexpand
+                  '(let-when-compile ((keywords '("true" "false")))
+                    (font-lock-add-keywords
+                     'c++-mode
+                     `((,(eval-when-compile
+                           (format "\\<%s\\>" (regexp-opt keywords)))
+                         0 font-lock-keyword-face)))))
+                 '(font-lock-add-keywords
+                   (quote c++-mode)
+                   (list
+                    (cons (quote
+                           "\\<\\(?:\\(?:fals\\|tru\\)e\\)\\>")
+                     (quote
+                      (0 font-lock-keyword-face))))))))
+
+(provide 'subr-tests)
+;;; subr-tests.el ends here
diff --git a/test/automated/zlib-tests.el b/test/automated/zlib-tests.el
index 6718601..c6c084d 100644
--- a/test/automated/zlib-tests.el
+++ b/test/automated/zlib-tests.el
@@ -35,7 +35,7 @@
             (with-temp-buffer
               (set-buffer-multibyte nil)
               (insert-file-contents-literally
-               (expand-file-name "foo-gzipped" zlib-tests-data-directory))
+               (expand-file-name "foo.gz" zlib-tests-data-directory))
               (zlib-decompress-region (point-min) (point-max))
               (buffer-string))
             "foo\n"))))
diff --git a/test/etags/CTAGS.good b/test/etags/CTAGS.good
index 1a885cc..d747265 100644
--- a/test/etags/CTAGS.good
+++ b/test/etags/CTAGS.good
@@ -47,7 +47,6 @@ $user_comment_lc      php-src/lce_functions.php       115
 (a-forth-constant      forth-src/test-forth.fth        /^constant 
(a-forth-constant$/
 (another-forth-word    forth-src/test-forth.fth        /^: 
(another-forth-word) ( -- )$/
 +      tex-src/texinfo.tex     /^\\def+{{\\tt \\char 43}}$/
-.PRECIOUS      Makefile        /^.PRECIOUS: ETAGS.good CTAGS.good$/
 /.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
 /.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
 /.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
@@ -244,7 +243,6 @@ A::operator+        cp-src/c.C      /^  A operator+(A& a) 
{};$/
 A::rosso       cp-src/c.C      40
 A::verde       cp-src/c.C      40
 A::~A  cp-src/c.C      /^A::~A() {}$/
-ADASRC Makefile        /^ADASRC=$(addprefix .\/ada-src\/,etags-test-for.ada 2/
 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) \\$/
@@ -254,7 +252,6 @@ AND y-src/cccp.c    11
 ANSIC  c-src/h.h       84
 ANSIC  c-src/h.h       85
 AREF   c-src/emacs/src/lisp.h  /^AREF (Lisp_Object array, ptrdiff_t idx)$/
-ARGS   Makefile        /^ARGS=- < srclist$/
 ARITH_EQUAL    c-src/emacs/src/lisp.h  3498
 ARITH_GRTR     c-src/emacs/src/lisp.h  3501
 ARITH_GRTR_OR_EQUAL    c-src/emacs/src/lisp.h  3503
@@ -267,7 +264,6 @@ ARRAY_MARK_FLAG     c-src/emacs/src/lisp.h  768
 ASCII_CHAR_P   c-src/emacs/src/lisp.h  /^#define ASCII_CHAR_P(c) UNSIGNED_CMP 
(c, <, 0x80)$/
 ASET   c-src/emacs/src/lisp.h  /^ASET (Lisp_Object array, ptrdiff_t idx, 
Lisp_Objec/
 ASIZE  c-src/emacs/src/lisp.h  /^ASIZE (Lisp_Object array)$/
-ASRC   Makefile        /^ASRC=$(addprefix .\/a-src\/,empty.zz empty.zz.gz)$/
 AST_Array::AST_Array   cp-src/c.C      /^AST_Array::AST_Array(UTL_ScopedName 
*n, unsigned l/
 AST_ConcreteType::AST_ConcreteType     cp-src/c.C      
/^AST_ConcreteType::AST_ConcreteType(AST_Decl::NodeT/
 AST_Root       cp-src/c.C      92
@@ -465,13 +461,9 @@ CONSTYPE_PURE      c-src/emacs/src/lisp.h  3739
 CONS_TO_INTEGER        c-src/emacs/src/lisp.h  /^#define CONS_TO_INTEGER(cons, 
type, var)                              \\$/
 CONVERT_CHARSTRING_TO_VALUE    pas-src/common.pas      /^procedure 
CONVERT_CHARSTRING_TO_VALUE;(*($/
 CPPFLAGS       make-src/Makefile       49
-CPSRC  Makefile        /^CPSRC=$(addprefix .\/cp-src\/,c.C burton.cpp burton./
-CSRC   Makefile        /^CSRC=$(addprefix .\/c-src\/,abbrev.c .\/\/c.c 
torture./
-CTAGS  Makefile        /^CTAGS: FRC ${infiles}$/
 CTAGS  c-src/etags.c   146
 CTAGS  c-src/etags.c   147
 CTAGS  c-src/etags.c   149
-CTAGS_PROG     Makefile        /^CTAGS_PROG=..\/..\/lib-src\/ctags$/
 C_AUTO c-src/etags.c   2198
 C_EXT  c-src/etags.c   2193
 C_JAVA c-src/etags.c   2197
@@ -580,7 +572,6 @@ Debug       cp-src/functions.cpp    /^void Debug ( int 
lineno, int level, char* func , c/
 DisposeANameList       pas-src/common.pas      /^procedure DisposeANameList( $/
 DisposeNameList        pas-src/common.pas      /^procedure DisposeNameList;$/
 ELEM_I c-src/h.h       3
-ELSRC  Makefile        /^ELSRC=$(addprefix .\/el-src\/,TAGTEST.EL 
emacs\/lisp\//
 EMACS_INT      c-src/emacs/src/lisp.h  91
 EMACS_INT      c-src/emacs/src/lisp.h  96
 EMACS_INT      c-src/emacs/src/lisp.h  103
@@ -610,12 +601,9 @@ ENUM_BF    c-src/emacs/src/lisp.h  /^      ENUM_BF 
(specbind_tag) kind : CHAR_BIT;$/
 ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
 EQ     c-src/emacs/src/lisp.h  /^# define EQ(x, y) lisp_h_EQ (x, y)$/
 EQUAL  y-src/cccp.c    12
-ERLSRC Makefile        /^ERLSRC=$(addprefix .\/erl-src\/,gs_dialog.erl)$/
 ERROR  y-src/parse.y   303
 ERROR  parse.y 303
 ERROR  y-src/cccp.c    9
-ETAGS  Makefile        /^ETAGS: FRC ${infiles}$/
-ETAGS_PROG     Makefile        /^ETAGS_PROG=..\/..\/lib-src\/etags$/
 EXFUN  c-src/emacs/src/lisp.h  /^#define EXFUN(fnname, maxargs) \\$/
 EXTERNALLY_VISIBLE     c-src/emacs/src/keyboard.c      3497
 EXTERNALLY_VISIBLE     c-src/emacs/src/keyboard.c      4372
@@ -638,13 +626,10 @@ FIXNUM_OVERFLOW_P c-src/emacs/src/lisp.h  /^#define 
FIXNUM_OVERFLOW_P(i) \\$/
 FIXNUM_OVERFLOW_P      c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (EQ, bool, 
(Lisp_Object x, Lisp_O/
 FLOATP c-src/emacs/src/lisp.h  /^# define FLOATP(x) lisp_h_FLOATP (x)$/
 FLOAT_TO_STRING_BUFSIZE        c-src/emacs/src/lisp.h  3927
-FORTHSRC       Makefile        /^FORTHSRC=$(addprefix 
.\/forth-src\/,test-forth.fth)$/
 FOR_EACH_ALIST_VALUE   c-src/emacs/src/lisp.h  /^#define 
FOR_EACH_ALIST_VALUE(head_var, list_var, v/
 FOR_EACH_TAIL  c-src/emacs/src/lisp.h  /^#define FOR_EACH_TAIL(hare, list, 
tortoise, n)        \\$/
 FRAMEP c-src/emacs/src/lisp.h  /^FRAMEP (Lisp_Object a)$/
-FRC    Makefile        /^FRC:;$/
 FREEFLOOD      c-src/emacs/src/gmalloc.c       1858
-FSRC   Makefile        /^FSRC=$(addprefix .\/f-src\/,entry.for entry.strange_/
 FUN0   y-src/parse.y   /^yylex FUN0()$/
 FUN0   parse.y /^yylex FUN0()$/
 FUN1   y-src/parse.y   /^yyerror FUN1(char *, s)$/
@@ -735,7 +720,6 @@ HASH_TABLE_SIZE     c-src/emacs/src/lisp.h  
/^HASH_TABLE_SIZE (struct Lisp_Hash_Table
 HASH_VALUE     c-src/emacs/src/lisp.h  /^HASH_VALUE (struct Lisp_Hash_Table 
*h, ptrdiff_t i/
 HAVE_NTGUI     c-src/etags.c   116
 HEAP   c-src/emacs/src/gmalloc.c       131
-HTMLSRC        Makefile        /^HTMLSRC=$(addprefix 
.\/html-src\/,softwarelibero.htm/
 HTML_help      c-src/etags.c   584
 HTML_labels    c-src/etags.c   /^HTML_labels (FILE *inf)$/
 HTML_suffixes  c-src/etags.c   582
@@ -851,7 +835,6 @@ LTGT        cp-src/MDiagArray2.h    35
 LTGT   cp-src/MDiagArray2.h    39
 LTGT   cp-src/MDiagArray2.h    42
 LTGT   cp-src/MDiagArray2.h    144
-LUASRC Makefile        /^LUASRC=$(addprefix .\/lua-src\/,allegro.lua)$/
 L_CELL y-src/parse.c   10
 L_CONST        y-src/parse.c   13
 L_FN0  y-src/parse.c   14
@@ -938,7 +921,6 @@ Lua_suffixes        c-src/etags.c   598
 MAGICBYTE      c-src/emacs/src/gmalloc.c       1856
 MAGICFREE      c-src/emacs/src/gmalloc.c       1855
 MAGICWORD      c-src/emacs/src/gmalloc.c       1854
-MAKESRC        Makefile        /^MAKESRC=$(addprefix .\/make-src\/,Makefile)$/
 MALLOCFLOOD    c-src/emacs/src/gmalloc.c       1857
 MANY   c-src/emacs/src/lisp.h  2833
 MARKERP        c-src/emacs/src/lisp.h  /^# define MARKERP(x) lisp_h_MARKERP 
(x)$/
@@ -1016,7 +998,6 @@ NILP       c-src/emacs/src/lisp.h  /^# define NILP(x) 
lisp_h_NILP (x)$/
 NIL_IS_ZERO    c-src/emacs/src/lisp.h  1515
 NONPOINTER_BITS        c-src/emacs/src/lisp.h  78
 NONPOINTER_BITS        c-src/emacs/src/lisp.h  80
-NONSRCS        Makefile        /^NONSRCS=.\/f-src\/entry.strange 
.\/erl-src\/lists.erl /
 NONSRCS        make-src/Makefile       35
 NOTEQUAL       y-src/cccp.c    13
 NULL   cccp.y  51
@@ -1033,20 +1014,14 @@ NewLayerSet     lua-src/allegro.lua     /^function 
NewLayerSet (name)$/
 NewNameString  pas-src/common.pas      /^procedure NewNameString; (* (var NSP: 
NameStringPo/
 NmStrToErrStr  pas-src/common.pas      /^function NmStrToErrStr;(*($/
 NmStrToInteger pas-src/common.pas      /^function NmStrToInteger; (* (Str : 
NameString) : i/
-OBJCPPSRC      Makefile        /^OBJCPPSRC=$(addprefix 
.\/objcpp-src\/,SimpleCalc.H S/
-OBJCSRC        Makefile        /^OBJCSRC=$(addprefix 
.\/objc-src\/,Subprocess.h Subpr/
 OPENBUTTON     objc-src/PackInsp.m     47
-OPTIONS        Makefile        /^OPTIONS=--members --declarations 
address@hidden/
 OR     y-src/cccp.c    10
 OVERLAYP       c-src/emacs/src/lisp.h  /^OVERLAYP (Lisp_Object x)$/
 Objc_help      c-src/etags.c   613
 Objc_suffixes  c-src/etags.c   609
 OperatorFun    c-src/h.h       88
 Overview       tex-src/gzip.texi       /address@hidden Overview, Sample, 
Copying, Top$/
-PASSRC Makefile        /^PASSRC=$(addprefix .\/pas-src\/,common.pas)$/
 PDT    c-src/h.h       /^  Date 04 May 87 235311 PDT (Mon)$/
-PERLSRC        Makefile        /^PERLSRC=$(addprefix 
.\/perl-src\/,htlmify-cystic yag/
-PHPSRC Makefile        /^PHPSRC=$(addprefix .\/php-src\/,lce_functions.php pt/
 PHP_functions  c-src/etags.c   /^PHP_functions (FILE *inf)$/
 PHP_help       c-src/etags.c   639
 PHP_suffixes   c-src/etags.c   637
@@ -1059,13 +1034,13 @@ POReader        php-src/lce_functions.php       163
 POReader       php-src/lce_functions.php       /^      function 
POReader($domain, $filename)$/
 PRINT_UNDOCUMENTED_OPTIONS_HELP        c-src/etags.c   804
 PROCESSP       c-src/emacs/src/lisp.h  /^PROCESSP (Lisp_Object a)$/
-PROLSRC        Makefile        /^PROLSRC=$(addprefix 
.\/prol-src\/,ordsets.prolog nat/
 PROP   c-src/emacs/src/keyboard.c      /^#define PROP(IDX) AREF 
(tool_bar_item_properties, /
 PROP   c-src/emacs/src/keyboard.c      8379
 PROTECT_MALLOC_STATE   c-src/emacs/src/gmalloc.c       /^#define 
PROTECT_MALLOC_STATE(PROT) protect_malloc_/
 PROTECT_MALLOC_STATE   c-src/emacs/src/gmalloc.c       /^#define 
PROTECT_MALLOC_STATE(PROT)    \/* empty *\/$/
 PRTPKG f-src/entry.for /^      LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL,/
 PRTPKG f-src/entry.strange_suffix      /^      LOGICAL FUNCTION PRTPKG ( 
SHORT, LONG, EXPL,/
+PRTPKG f-src/entry.strange     /^      LOGICAL FUNCTION PRTPKG ( SHORT, LONG, 
EXPL,/
 PSEUDO c-src/sysdep.h  /^#define       PSEUDO(name, syscall_name, args)        
                              /
 PSEUDOVECSIZE  c-src/emacs/src/lisp.h  /^#define PSEUDOVECSIZE(type, 
nonlispfield)                     \\$/
 PSEUDOVECTORP  c-src/emacs/src/lisp.h  /^PSEUDOVECTORP (Lisp_Object a, int 
code)$/
@@ -1076,7 +1051,6 @@ PSEUDOVECTOR_REST_MASK    c-src/emacs/src/lisp.h  814
 PSEUDOVECTOR_SIZE_BITS c-src/emacs/src/lisp.h  808
 PSEUDOVECTOR_SIZE_MASK c-src/emacs/src/lisp.h  809
 PSEUDOVECTOR_TYPEP     c-src/emacs/src/lisp.h  /^PSEUDOVECTOR_TYPEP (struct 
vectorlike_header *a, i/
-PSSRC  Makefile        /^PSSRC=$(addprefix .\/ps-src\/,rfc1245.ps)$/
 PS_functions   c-src/etags.c   /^PS_functions (FILE *inf)$/
 PS_help        c-src/etags.c   649
 PS_suffixes    c-src/etags.c   647
@@ -1101,7 +1075,6 @@ PVEC_TERMINAL     c-src/emacs/src/lisp.h  790
 PVEC_TYPE_MASK c-src/emacs/src/lisp.h  819
 PVEC_WINDOW    c-src/emacs/src/lisp.h  786
 PVEC_WINDOW_CONFIGURATION      c-src/emacs/src/lisp.h  791
-PYTSRC Makefile        /^PYTSRC=$(addprefix .\/pyt-src\/,server.py)$/
 PackageInspector       objc-src/PackInsp.h     /address@hidden 
PackageInspector:WMInspector$/
 Pascal_functions       c-src/etags.c   /^Pascal_functions (FILE *inf)$/
 Pascal_help    c-src/etags.c   621
@@ -1192,7 +1165,6 @@ RECC_UNIBYTE      c-src/emacs/src/regex.h 617
 RECC_UPPER     c-src/emacs/src/regex.h 612
 RECC_WORD      c-src/emacs/src/regex.h 610
 RECC_XDIGIT    c-src/emacs/src/regex.h 614
-REGEX  Makefile        /^REGEX=\/[ \\t]*DEFVAR_[A-Z_ \\t\\n(]+"\\([^"]+\\)"\/$/
 REGS_FIXED     c-src/emacs/src/regex.h 378
 REGS_REALLOCATE        c-src/emacs/src/regex.h 377
 REGS_UNALLOCATED       c-src/emacs/src/regex.h 376
@@ -1267,7 +1239,6 @@ RE_TRANSLATE_TYPE c-src/emacs/src/regex.h 332
 RE_UNMATCHED_RIGHT_PAREN_ORD   c-src/emacs/src/regex.h 136
 RSH    y-src/cccp.c    17
 RTE/s  ada-src/2ataspri.adb    /^   package RTE renames 
Interfaces.C.POSIX_RTE;$/
-RUN    Makefile        /^RUN=$/
 Range  cp-src/Range.h  35
 Range::Range   cp-src/Range.h  /^  Range (void)$/
 Range::Range   cp-src/Range.h  /^  Range (const Range& r)$/
@@ -1328,6 +1299,7 @@ SDTrefSkipSpaces  pas-src/common.pas      /^procedure 
SDTrefSkipSpaces;$/
 SDTrefStringToRec      pas-src/common.pas      /^procedure SDTrefStringToRec 
(* ($/
 SETPRT f-src/entry.for /^       ENTRY  SETPRT ( SHORT, EXPL, LONG, TRACE, D/
 SETPRT f-src/entry.strange_suffix      /^       ENTRY  SETPRT ( SHORT, EXPL, 
LONG, TRACE, D/
+SETPRT f-src/entry.strange     /^       ENTRY  SETPRT ( SHORT, EXPL, LONG, 
TRACE, D/
 SET_SYMBOL_BLV c-src/emacs/src/lisp.h  /^SET_SYMBOL_BLV (struct Lisp_Symbol 
*sym, struct Li/
 SET_SYMBOL_FWD c-src/emacs/src/lisp.h  /^SET_SYMBOL_FWD (struct Lisp_Symbol 
*sym, union Lis/
 SET_SYMBOL_VAL c-src/emacs/src/lisp.h  /^# define SET_SYMBOL_VAL(sym, v) 
lisp_h_SET_SYMBOL_/
@@ -1344,7 +1316,6 @@ SPECPDL_UNWIND    c-src/emacs/src/lisp.h  2944
 SPECPDL_UNWIND_INT     c-src/emacs/src/lisp.h  2946
 SPECPDL_UNWIND_PTR     c-src/emacs/src/lisp.h  2945
 SPECPDL_UNWIND_VOID    c-src/emacs/src/lisp.h  2947
-SRCS   Makefile        /^SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} $/
 SREF   c-src/emacs/src/lisp.h  /^SREF (Lisp_Object string, ptrdiff_t index)$/
 SSDATA c-src/emacs/src/lisp.h  /^SSDATA (Lisp_Object string)$/
 SSET   c-src/emacs/src/lisp.h  /^SSET (Lisp_Object string, ptrdiff_t index, 
unsigne/
@@ -1419,7 +1390,6 @@ TAS_Cell/t        ada-src/2ataspri.ads    /^   type 
TAS_Cell is$/
 TCB_Ptr/t      ada-src/2ataspri.ads    /^   type TCB_Ptr is access all 
Task_Control_Block;$/
 TERMINALP      c-src/emacs/src/lisp.h  /^TERMINALP (Lisp_Object a)$/
 TEST   php-src/ptest.php       1
-TEXSRC Makefile        /^TEXSRC=$(addprefix .\/tex-src\/,testenv.tex gzip.tex/
 TEXTAGS        make-src/Makefile       204
 TEXTAGS        make-src/Makefile       219
 TEX_LESC       c-src/etags.c   4986
@@ -1604,7 +1574,6 @@ XUNTAG    c-src/emacs/src/lisp.h  /^XUNTAG (Lisp_Object 
a, int type)$/
 XWINDOW        c-src/emacs/src/lisp.h  /^XWINDOW (Lisp_Object a)$/
 Y      c-src/h.h       100
 YACC   c-src/etags.c   2199
-YSRC   Makefile        /^YSRC=$(addprefix .\/y-src\/,parse.y parse.c atest.y /
 YYABORT        /usr/share/bison/bison.simple   153
 YYABORT        /usr/share/bison/bison.simple   153
 YYACCEPT       /usr/share/bison/bison.simple   152
@@ -2574,7 +2543,7 @@ b c-src/h.h       41
 b      c-src/h.h       103
 b      c-src/h.h       104
 backslash=0    tex-src/texinfo.tex     /^\\let\\indexbackslash=0  %overridden 
during \\printin/
-bar    c-src//c.c      /^void bar() {while(0) {}}$/
+bar    c-src/c.c       /^void bar() {while(0) {}}$/
 bar    c.c     143
 bar    c-src/h.h       19
 bas_syn        prol-src/natded.prolog  /^bas_syn(n(_)).$/
@@ -2667,7 +2636,6 @@ cat       c-src/h.h       81
 cat    prol-src/natded.prolog  /^cat(A, address@hidden, Ass3, Qs3, 
tree(fe,A:address@hidden/
 cat_atoms      prol-src/natded.prolog  /^cat_atoms(A1,A2,A3):-$/
 cccccccccc     c-src/h.h       115
-cdiff  Makefile        /^cdiff: CTAGS.good CTAGS ${infiles}$/
 cdr    c-src/emacs/src/lisp.h  1159
 cell   y-src/parse.y   278
 cgrep  html-src/software.html  /^cgrep$/
@@ -2677,7 +2645,6 @@ char_bits c-src/emacs/src/lisp.h  2443
 char_table_specials    c-src/emacs/src/lisp.h  1692
 charset_unibyte        c-src/emacs/src/regex.h 410
 chartonmstr    pas-src/common.pas      /^function chartonmstr; (*($/
-check  Makefile        /^check:$/
 checkQuotation php-src/lce_functions.php       /^      function 
checkQuotation($str)$/
 check_cons_list        c-src/emacs/src/lisp.h  /^#  define check_cons_list() 
lisp_h_check_cons_list/
 checkhdr       c-src/emacs/src/gmalloc.c       /^checkhdr (const struct hdr 
*hdr)$/
@@ -2846,7 +2813,6 @@ echo_message_buffer       c-src/emacs/src/keyboard.c      
171
 echo_now       c-src/emacs/src/keyboard.c      /^echo_now (void)$/
 echo_truncate  c-src/emacs/src/keyboard.c      /^echo_truncate (ptrdiff_t 
nchars)$/
 echoing        c-src/emacs/src/keyboard.c      154
-ediff% Makefile        /^ediff%: ETAGS.good% ETAGS ${infiles}$/
 editItem       pyt-src/server.py       /^    def editItem(self):$/
 editsite       pyt-src/server.py       /^    def editsite(self, site):$/
 edituser       pyt-src/server.py       /^    def edituser(self, user):$/
@@ -2918,7 +2884,7 @@ expression_value  cccp.y  68
 expression_value       y-src/cccp.y    68
 extras c-src/emacs/src/lisp.h  1603
 extvar c-src/h.h       109
-f      c-src//c.c      /^T f(){if(x){}$/
+f      c-src/c.c       /^T f(){if(x){}$/
 f      c.c     145
 f      c.c     156
 f      c.c     168
@@ -3002,7 +2968,7 @@ foo       f-src/entry.strange     /^       character*(*) 
function foo()$/
 foo    php-src/ptest.php       /^foo()$/
 foo::f cp-src/c.C      /^     void f() {}$/
 foo::x cp-src/c.C      80
-foobar c-src//c.c      /^int foobar() {;}$/
+foobar c-src/c.c       /^int foobar() {;}$/
 foobar c.c     /^extern void foobar (void) __attribute__ ((section /
 foobar2        c-src/h.h       20
 foobar2_       c-src/h.h       16
@@ -3124,7 +3090,7 @@ hybrid_get_current_dir_name       
c-src/emacs/src/gmalloc.c       /^hybrid_get_current_dir_n
 hybrid_malloc  c-src/emacs/src/gmalloc.c       /^hybrid_malloc (size_t size)$/
 hybrid_realloc c-src/emacs/src/gmalloc.c       /^hybrid_realloc (void *ptr, 
size_t size)$/
 hypothetical_mem       prol-src/natded.prolog  
/^hypothetical_mem(fi(N),Ass,_):-$/
-i      c-src//c.c      2
+i      c-src/c.c       2
 i      c.c     169
 i      c-src/emacs/src/lisp.h  567
 i      c-src/emacs/src/lisp.h  4673
@@ -3145,7 +3111,6 @@ inattribute       c-src/etags.c   2400
 index  c-src/emacs/src/lisp.h  1856
 infabsdir      c-src/etags.c   206
 infabsname     c-src/etags.c   205
-infiles        Makefile        /^infiles = $(filter-out ${NONSRCS},${SRCS}) 
srclist/
 infname        c-src/etags.c   204
 info   c-src/emacs/src/gmalloc.c       157
 infoPanel:     objcpp-src/SimpleCalc.M /^- infoPanel:sender$/
@@ -3183,7 +3148,7 @@ integertonmstr    pas-src/common.pas      /^function 
integertonmstr; (* (TheInteger : in
 intensity1     f-src/entry.for /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
 intensity1     f-src/entry.strange_suffix      /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
 intensity1     f-src/entry.strange     /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
-interface_locate       c-src//c.c      /^interface_locate(void)$/
+interface_locate       c-src/c.c       /^interface_locate(void)$/
 intern c-src/emacs/src/lisp.h  /^intern (const char *str)$/
 intern_c_string        c-src/emacs/src/lisp.h  /^intern_c_string (const char 
*str)$/
 internal_last_event_frame      c-src/emacs/src/keyboard.c      228
@@ -3615,9 +3580,7 @@ not_bol   c-src/emacs/src/regex.h 391
 not_eol        c-src/emacs/src/regex.h 394
 not_single_kboard_state        c-src/emacs/src/keyboard.c      
/^not_single_kboard_state (KBOARD *kboard)$/
 notag2 c-src/torture.c 26
-notag2 c-src/dostorture.c      26
 notag4 c-src/torture.c 45
-notag4 c-src/dostorture.c      45
 notinname      c-src/etags.c   /^#define notinname(c)  (_nin[CHAR (c)]) \/* c 
is not /
 npending       c-src/emacs/src/keyboard.c      7244
 ntool_bar_items        c-src/emacs/src/keyboard.c      7974
@@ -3772,11 +3735,8 @@ post     pyt-src/server.py       /^    def post(self):$/
 post   pyt-src/server.py       /^    def post(self):$/
 pot_etags_version      c-src/etags.c   81
 pp1    c-src/torture.c /^int pp1($/
-pp1    c-src/dostorture.c      /^int pp1($/
 pp2    c-src/torture.c /^pp2$/
-pp2    c-src/dostorture.c      /^pp2$/
 pp3    c-src/torture.c /^pp3(int bar)$/
-pp3    c-src/dostorture.c      /^pp3(int bar)$/
 pp_bas_cat     prol-src/natded.prolog  /^pp_bas_cat(Cat):-$/
 pp_cat prol-src/natded.prolog  /^pp_cat(Syn:Sem):-$/
 pp_exp prol-src/natded.prolog  /^pp_exp('NIL'):-$/
@@ -3901,7 +3861,6 @@ regex     make-src/Makefile       216
 regex  make-src/Makefile       219
 regex_t        c-src/emacs/src/regex.h 416
 regex_tag_multiline    c-src/etags.c   /^regex_tag_multiline (void)$/
-regexfile      Makefile        /^regexfile: Makefile$/
 regexp c-src/etags.c   256
 regexp c-src/etags.c   268
 registerAction:        objcpp-src/SimpleCalc.M /^- registerAction:(SEL)action$/
@@ -4053,7 +4012,6 @@ specbind_tag      c-src/emacs/src/lisp.h  2943
 specbinding    c-src/emacs/src/lisp.h  2955
 specialsymbol  prol-src/natded.prolog  /^specialsymbol(C1,C2,S):-$/
 splitexp       prol-src/natded.prolog  /^splitexp(E,E,('NIL','NIL')):-!.$/
-srclist        Makefile        /^srclist: Makefile$/
 ss3    c.c     255
 sss1   c.c     252
 sss2   c.c     253
@@ -4155,18 +4113,12 @@ tag-re-match-p  el-src/emacs/lisp/progmodes/etags.el    
/^(defun tag-re-match-p (re)
 tag-symbol-match-p     el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-symbol-match-p (tag)$/
 tag-word-match-p       el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-word-match-p (tag)$/
 tag1   c-src/torture.c /^(*tag1 (sig, handler)) ()$/
-tag1   c-src/dostorture.c      /^(*tag1 (sig, handler)) ()$/
 tag1   c-src/h.h       110
 tag2   c-src/torture.c /^(*tag2 (sig, handler)) ()$/
-tag2   c-src/dostorture.c      /^(*tag2 (sig, handler)) ()$/
 tag3   c-src/torture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/
-tag3   c-src/dostorture.c      /^(*tag3 (int sig, void (*handler) (int))) 
(int)$/
 tag4   c-src/torture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/
-tag4   c-src/dostorture.c      /^(*tag4 (int sig, void (*handler) (int))) 
(int)$/
 tag5   c-src/torture.c /^tag5 (handler, arg)$/
-tag5   c-src/dostorture.c      /^tag5 (handler, arg)$/
 tag6   c-src/torture.c /^tag6 (void (*handler) (void *), void *arg)$/
-tag6   c-src/dostorture.c      /^tag6 (void (*handler) (void *), void *arg)$/
 tag_or_ch      c-src/emacs/src/lisp.h  3026
 taggedfname    c-src/etags.c   207
 tags-add-tables        el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
tags-add-tables 'ask-user$/
@@ -4419,7 +4371,6 @@ xref-location-line        
el-src/emacs/lisp/progmodes/etags.el    /^(cl-defmethod xref-loc
 xref-location-marker   el-src/emacs/lisp/progmodes/etags.el    /^(cl-defmethod 
xref-location-marker ((l xref-etags-/
 xref-make-etags-location       el-src/emacs/lisp/progmodes/etags.el    
/^(defun xref-make-etags-location (tag-info file)$/
 xrnew  c-src/etags.c   /^#define xrnew(op, n, Type) ((op) = (Type *) xreall/
-xx     Makefile        /^xx="this line is here because of a fontlock bug$/
 y-get-selection-internal       c.c     /^      Fy_get_selection_internal, 
Sy_get_selection_/
 yyalloc        /usr/share/bison/bison.simple   83
 yyalloc        /usr/share/bison/bison.simple   83
diff --git a/test/etags/ETAGS.good_1 b/test/etags/ETAGS.good_1
index 6762bf3..cabcd2c 100644
--- a/test/etags/ETAGS.good_1
+++ b/test/etags/ETAGS.good_1
@@ -1,46 +1,4 @@
 
-Makefile,683
-ADASRC=1,0
-ASRC=2,91
-CSRC=3,139
-CPSRC=7,410
-ELSRC=10,584
-ERLSRC=11,654
-FORTHSRC=12,699
-FSRC=13,749
-HTMLSRC=14,821
-LUASRC=16,950
-MAKESRC=17,993
-OBJCSRC=18,1035
-OBJCPPSRC=19,1116
-PASSRC=20,1179
-PERLSRC=21,1221
-PHPSRC=22,1291
-PSSRC=23,1363
-PROLSRC=24,1403
-PYTSRC=25,1465
-TEXSRC=26,1506
-YSRC=27,1585
-SRCS=28,1650
-NONSRCS=32,1902
-ETAGS_PROG=34,1976
-CTAGS_PROG=35,2007
-REGEX=37,2039
-xx=38,2085
-RUN=40,2134
-OPTIONS=42,2140
-ARGS=43,2192
-infiles 45,2210
-check:check47,2272
-ediff%:ediff%55,2575
-cdiff:cdiff58,2676
-ETAGS:ETAGS61,2773
-CTAGS:CTAGS64,2843
-srclist:srclist67,2921
-regexfile:regexfile71,3012
-.PRECIOUS:.PRECIOUS77,3189
-FRC:FRC79,3223
-
 ada-src/etags-test-for.ada,1969
    type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
    function Body_RequiredBody_Required/f3,78
@@ -621,19 +579,6 @@ char                       **tab_fill(tab_fill70,1129
 int                    tab_delete_first(91,1638
 int                    tab_count_words(103,1820
 
-c-src/dostorture.c,197
-(*tag1 tag118,451
-#define notag2 26,552
-(*tag2 tag229,629
-(*tag3 tag339,771
-#define notag4 45,860
-(*tag4 tag448,954
-tag5 57,1080
-tag6 66,1207
-int pp1(74,1316
-pp287,1418
-pp3(100,1517
-
 c-src/emacs/src/gmalloc.c,3539
 #define USE_PTHREAD25,1002
 #undef get_current_dir_name33,1126
@@ -2298,10 +2243,12 @@ f-src/entry.strange_suffix,172
      & intensity1(577,12231
        character*(*) function foo(579,12307
 
-f-src/entry.strange,103
-       ENTRY  MSGSEL 193,4382
-     & intensity1(375,8135
-       character*(*) function foo(377,8211
+f-src/entry.strange,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
 
 forth-src/test-forth.fth,408
 : a-forth-word 20,301
@@ -2317,44 +2264,44 @@ constant (a-forth-constant(a-forth-constant38,628
 code assemby-code-word 43,685
 : a-forth-word 50,870
 
-html-src/softwarelibero.html,198
-Cos'� il software libero?4,38
-Licenze d'uso di un programmalicenze65,2474
-Sfatiamo alcuni miti138,6064
-Il movimento open sourceoss191,7968
-Impatto pratico del software liberoimpatto231,9986
+html-src/softwarelibero.html,200
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2500
+Sfatiamo alcuni miti138,6118
+Il movimento open sourceoss191,8037
+Impatto pratico del software liberoimpatto231,10066
 
 html-src/index.shtml,104
 &nbsp;8,281
-In evidenza15,446
-Comunicati e iniziative32,974
-Ultime notizie dall'associazione63,2027
+In evidenza15,447
+Comunicati e iniziative32,976
+Ultime notizie dall'associazione63,2030
 
 html-src/algrthms.html,467
-Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
-Descriptionalgorithms10,477
-Generating the Datagenalgorithm48,1953
-Convolutionallyconalgorithm55,2463
-Nextstatetable262,11331
-Outputoutputtable350,13571
-Mapping the Channel Symbolsmapping433,15786
-Adding Noise to theaddnoise439,16174
-Quantizing the Receivedquantizing469,18637
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,271
+Descriptionalgorithms10,472
+Generating the Datagenalgorithm48,1948
+Convolutionallyconalgorithm55,2458
+Nextstatetable262,11326
+Outputoutputtable350,13566
+Mapping the Channel Symbolsmapping433,15781
+Adding Noise to theaddnoise439,16169
+Quantizing the Receivedquantizing469,18632
 
-html-src/software.html,438
-Francesco Potort� Software Page9,280
-Software that I wrote for supporting my research activitysimulation36,1400
-MTGmtg41,1484
-Fracasfracas65,2626
-GaliLEOgalileo101,4234
-Leasqrleasqr114,4679
-Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
-Etagsetags148,6182
-checkiso161,6731
-cgrep178,7549
-debian-bug.eldebian-bug190,7981
-tcpdump205,8566
-Links to interesting softwarelinks216,8893
+html-src/software.html,439
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1398
+MTGmtg41,1482
+Fracasfracas65,2624
+GaliLEOgalileo101,4232
+Leasqrleasqr114,4677
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6065
+Etagsetags148,6180
+checkiso161,6729
+cgrep178,7547
+debian-bug.eldebian-bug190,7979
+tcpdump205,8564
+Links to interesting softwarelinks216,8891
 
 lua-src/allegro.lua,400
 local function get_layer_by_name 7,175
@@ -3730,7 +3677,7 @@ 
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\def={=3306,107486
 \def\normalbackslash{\normalbackslash3320,107868
 
-c-src//c.c,76
+c-src/c.c,76
 T f(1,0
 }T i;2,14
 void bar(5,69
diff --git a/test/etags/ETAGS.good_2 b/test/etags/ETAGS.good_2
index 32b58d8..5d4f706 100644
--- a/test/etags/ETAGS.good_2
+++ b/test/etags/ETAGS.good_2
@@ -1,46 +1,4 @@
 
-Makefile,683
-ADASRC=1,0
-ASRC=2,91
-CSRC=3,139
-CPSRC=7,410
-ELSRC=10,584
-ERLSRC=11,654
-FORTHSRC=12,699
-FSRC=13,749
-HTMLSRC=14,821
-LUASRC=16,950
-MAKESRC=17,993
-OBJCSRC=18,1035
-OBJCPPSRC=19,1116
-PASSRC=20,1179
-PERLSRC=21,1221
-PHPSRC=22,1291
-PSSRC=23,1363
-PROLSRC=24,1403
-PYTSRC=25,1465
-TEXSRC=26,1506
-YSRC=27,1585
-SRCS=28,1650
-NONSRCS=32,1902
-ETAGS_PROG=34,1976
-CTAGS_PROG=35,2007
-REGEX=37,2039
-xx=38,2085
-RUN=40,2134
-OPTIONS=42,2140
-ARGS=43,2192
-infiles 45,2210
-check:check47,2272
-ediff%:ediff%55,2575
-cdiff:cdiff58,2676
-ETAGS:ETAGS61,2773
-CTAGS:CTAGS64,2843
-srclist:srclist67,2921
-regexfile:regexfile71,3012
-.PRECIOUS:.PRECIOUS77,3189
-FRC:FRC79,3223
-
 ada-src/etags-test-for.ada,1969
    type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
    function Body_RequiredBody_Required/f3,78
@@ -688,19 +646,6 @@ char                       **tab_fill(tab_fill70,1129
 int                    tab_delete_first(91,1638
 int                    tab_count_words(103,1820
 
-c-src/dostorture.c,197
-(*tag1 tag118,451
-#define notag2 26,552
-(*tag2 tag229,629
-(*tag3 tag339,771
-#define notag4 45,860
-(*tag4 tag448,954
-tag5 57,1080
-tag6 66,1207
-int pp1(74,1316
-pp287,1418
-pp3(100,1517
-
 c-src/emacs/src/gmalloc.c,6643
 #define USE_PTHREAD25,1002
 #undef get_current_dir_name33,1126
@@ -2865,10 +2810,12 @@ f-src/entry.strange_suffix,172
      & intensity1(577,12231
        character*(*) function foo(579,12307
 
-f-src/entry.strange,103
-       ENTRY  MSGSEL 193,4382
-     & intensity1(375,8135
-       character*(*) function foo(377,8211
+f-src/entry.strange,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
 
 forth-src/test-forth.fth,408
 : a-forth-word 20,301
@@ -2884,44 +2831,44 @@ constant (a-forth-constant(a-forth-constant38,628
 code assemby-code-word 43,685
 : a-forth-word 50,870
 
-html-src/softwarelibero.html,198
-Cos'� il software libero?4,38
-Licenze d'uso di un programmalicenze65,2474
-Sfatiamo alcuni miti138,6064
-Il movimento open sourceoss191,7968
-Impatto pratico del software liberoimpatto231,9986
+html-src/softwarelibero.html,200
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2500
+Sfatiamo alcuni miti138,6118
+Il movimento open sourceoss191,8037
+Impatto pratico del software liberoimpatto231,10066
 
 html-src/index.shtml,104
 &nbsp;8,281
-In evidenza15,446
-Comunicati e iniziative32,974
-Ultime notizie dall'associazione63,2027
+In evidenza15,447
+Comunicati e iniziative32,976
+Ultime notizie dall'associazione63,2030
 
 html-src/algrthms.html,467
-Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
-Descriptionalgorithms10,477
-Generating the Datagenalgorithm48,1953
-Convolutionallyconalgorithm55,2463
-Nextstatetable262,11331
-Outputoutputtable350,13571
-Mapping the Channel Symbolsmapping433,15786
-Adding Noise to theaddnoise439,16174
-Quantizing the Receivedquantizing469,18637
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,271
+Descriptionalgorithms10,472
+Generating the Datagenalgorithm48,1948
+Convolutionallyconalgorithm55,2458
+Nextstatetable262,11326
+Outputoutputtable350,13566
+Mapping the Channel Symbolsmapping433,15781
+Adding Noise to theaddnoise439,16169
+Quantizing the Receivedquantizing469,18632
 
-html-src/software.html,438
-Francesco Potort� Software Page9,280
-Software that I wrote for supporting my research activitysimulation36,1400
-MTGmtg41,1484
-Fracasfracas65,2626
-GaliLEOgalileo101,4234
-Leasqrleasqr114,4679
-Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
-Etagsetags148,6182
-checkiso161,6731
-cgrep178,7549
-debian-bug.eldebian-bug190,7981
-tcpdump205,8566
-Links to interesting softwarelinks216,8893
+html-src/software.html,439
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1398
+MTGmtg41,1482
+Fracasfracas65,2624
+GaliLEOgalileo101,4232
+Leasqrleasqr114,4677
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6065
+Etagsetags148,6180
+checkiso161,6729
+cgrep178,7547
+debian-bug.eldebian-bug190,7979
+tcpdump205,8564
+Links to interesting softwarelinks216,8891
 
 lua-src/allegro.lua,400
 local function get_layer_by_name 7,175
@@ -4299,7 +4246,7 @@ 
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\def={=3306,107486
 \def\normalbackslash{\normalbackslash3320,107868
 
-c-src//c.c,76
+c-src/c.c,76
 T f(1,0
 }T i;2,14
 void bar(5,69
diff --git a/test/etags/ETAGS.good_3 b/test/etags/ETAGS.good_3
index 644ffe4..1d8e34a 100644
--- a/test/etags/ETAGS.good_3
+++ b/test/etags/ETAGS.good_3
@@ -1,46 +1,4 @@
 
-Makefile,683
-ADASRC=1,0
-ASRC=2,91
-CSRC=3,139
-CPSRC=7,410
-ELSRC=10,584
-ERLSRC=11,654
-FORTHSRC=12,699
-FSRC=13,749
-HTMLSRC=14,821
-LUASRC=16,950
-MAKESRC=17,993
-OBJCSRC=18,1035
-OBJCPPSRC=19,1116
-PASSRC=20,1179
-PERLSRC=21,1221
-PHPSRC=22,1291
-PSSRC=23,1363
-PROLSRC=24,1403
-PYTSRC=25,1465
-TEXSRC=26,1506
-YSRC=27,1585
-SRCS=28,1650
-NONSRCS=32,1902
-ETAGS_PROG=34,1976
-CTAGS_PROG=35,2007
-REGEX=37,2039
-xx=38,2085
-RUN=40,2134
-OPTIONS=42,2140
-ARGS=43,2192
-infiles 45,2210
-check:check47,2272
-ediff%:ediff%55,2575
-cdiff:cdiff58,2676
-ETAGS:ETAGS61,2773
-CTAGS:CTAGS64,2843
-srclist:srclist67,2921
-regexfile:regexfile71,3012
-.PRECIOUS:.PRECIOUS77,3189
-FRC:FRC79,3223
-
 ada-src/etags-test-for.ada,1969
    type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
    function Body_RequiredBody_Required/f3,78
@@ -690,19 +648,6 @@ char                       **tab_fill(tab_fill70,1129
 int                    tab_delete_first(91,1638
 int                    tab_count_words(103,1820
 
-c-src/dostorture.c,197
-(*tag1 tag118,451
-#define notag2 26,552
-(*tag2 tag229,629
-(*tag3 tag339,771
-#define notag4 45,860
-(*tag4 tag448,954
-tag5 57,1080
-tag6 66,1207
-int pp1(74,1316
-pp287,1418
-pp3(100,1517
-
 c-src/emacs/src/gmalloc.c,4207
 #define USE_PTHREAD25,1002
 #undef get_current_dir_name33,1126
@@ -2615,10 +2560,12 @@ f-src/entry.strange_suffix,172
      & intensity1(577,12231
        character*(*) function foo(579,12307
 
-f-src/entry.strange,103
-       ENTRY  MSGSEL 193,4382
-     & intensity1(375,8135
-       character*(*) function foo(377,8211
+f-src/entry.strange,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
 
 forth-src/test-forth.fth,408
 : a-forth-word 20,301
@@ -2634,44 +2581,44 @@ constant (a-forth-constant(a-forth-constant38,628
 code assemby-code-word 43,685
 : a-forth-word 50,870
 
-html-src/softwarelibero.html,198
-Cos'� il software libero?4,38
-Licenze d'uso di un programmalicenze65,2474
-Sfatiamo alcuni miti138,6064
-Il movimento open sourceoss191,7968
-Impatto pratico del software liberoimpatto231,9986
+html-src/softwarelibero.html,200
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2500
+Sfatiamo alcuni miti138,6118
+Il movimento open sourceoss191,8037
+Impatto pratico del software liberoimpatto231,10066
 
 html-src/index.shtml,104
 &nbsp;8,281
-In evidenza15,446
-Comunicati e iniziative32,974
-Ultime notizie dall'associazione63,2027
+In evidenza15,447
+Comunicati e iniziative32,976
+Ultime notizie dall'associazione63,2030
 
 html-src/algrthms.html,467
-Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
-Descriptionalgorithms10,477
-Generating the Datagenalgorithm48,1953
-Convolutionallyconalgorithm55,2463
-Nextstatetable262,11331
-Outputoutputtable350,13571
-Mapping the Channel Symbolsmapping433,15786
-Adding Noise to theaddnoise439,16174
-Quantizing the Receivedquantizing469,18637
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,271
+Descriptionalgorithms10,472
+Generating the Datagenalgorithm48,1948
+Convolutionallyconalgorithm55,2458
+Nextstatetable262,11326
+Outputoutputtable350,13566
+Mapping the Channel Symbolsmapping433,15781
+Adding Noise to theaddnoise439,16169
+Quantizing the Receivedquantizing469,18632
 
-html-src/software.html,438
-Francesco Potort� Software Page9,280
-Software that I wrote for supporting my research activitysimulation36,1400
-MTGmtg41,1484
-Fracasfracas65,2626
-GaliLEOgalileo101,4234
-Leasqrleasqr114,4679
-Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
-Etagsetags148,6182
-checkiso161,6731
-cgrep178,7549
-debian-bug.eldebian-bug190,7981
-tcpdump205,8566
-Links to interesting softwarelinks216,8893
+html-src/software.html,439
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1398
+MTGmtg41,1482
+Fracasfracas65,2624
+GaliLEOgalileo101,4232
+Leasqrleasqr114,4677
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6065
+Etagsetags148,6180
+checkiso161,6729
+cgrep178,7547
+debian-bug.eldebian-bug190,7979
+tcpdump205,8564
+Links to interesting softwarelinks216,8891
 
 lua-src/allegro.lua,400
 local function get_layer_by_name 7,175
@@ -4074,7 +4021,7 @@ 
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\def={=3306,107486
 \def\normalbackslash{\normalbackslash3320,107868
 
-c-src//c.c,76
+c-src/c.c,76
 T f(1,0
 }T i;2,14
 void bar(5,69
diff --git a/test/etags/ETAGS.good_4 b/test/etags/ETAGS.good_4
index 5d31c36..30ea7dc 100644
--- a/test/etags/ETAGS.good_4
+++ b/test/etags/ETAGS.good_4
@@ -1,46 +1,4 @@
 
-Makefile,683
-ADASRC=1,0
-ASRC=2,91
-CSRC=3,139
-CPSRC=7,410
-ELSRC=10,584
-ERLSRC=11,654
-FORTHSRC=12,699
-FSRC=13,749
-HTMLSRC=14,821
-LUASRC=16,950
-MAKESRC=17,993
-OBJCSRC=18,1035
-OBJCPPSRC=19,1116
-PASSRC=20,1179
-PERLSRC=21,1221
-PHPSRC=22,1291
-PSSRC=23,1363
-PROLSRC=24,1403
-PYTSRC=25,1465
-TEXSRC=26,1506
-YSRC=27,1585
-SRCS=28,1650
-NONSRCS=32,1902
-ETAGS_PROG=34,1976
-CTAGS_PROG=35,2007
-REGEX=37,2039
-xx=38,2085
-RUN=40,2134
-OPTIONS=42,2140
-ARGS=43,2192
-infiles 45,2210
-check:check47,2272
-ediff%:ediff%55,2575
-cdiff:cdiff58,2676
-ETAGS:ETAGS61,2773
-CTAGS:CTAGS64,2843
-srclist:srclist67,2921
-regexfile:regexfile71,3012
-.PRECIOUS:.PRECIOUS77,3189
-FRC:FRC79,3223
-
 ada-src/etags-test-for.ada,1969
    type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
    function Body_RequiredBody_Required/f3,78
@@ -645,19 +603,6 @@ char                       **tab_fill(tab_fill70,1129
 int                    tab_delete_first(91,1638
 int                    tab_count_words(103,1820
 
-c-src/dostorture.c,197
-(*tag1 tag118,451
-#define notag2 26,552
-(*tag2 tag229,629
-(*tag3 tag339,771
-#define notag4 45,860
-(*tag4 tag448,954
-tag5 57,1080
-tag6 66,1207
-int pp1(74,1316
-pp287,1418
-pp3(100,1517
-
 c-src/emacs/src/gmalloc.c,3539
 #define USE_PTHREAD25,1002
 #undef get_current_dir_name33,1126
@@ -2462,10 +2407,12 @@ f-src/entry.strange_suffix,172
      & intensity1(577,12231
        character*(*) function foo(579,12307
 
-f-src/entry.strange,103
-       ENTRY  MSGSEL 193,4382
-     & intensity1(375,8135
-       character*(*) function foo(377,8211
+f-src/entry.strange,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
 
 forth-src/test-forth.fth,408
 : a-forth-word 20,301
@@ -2481,44 +2428,44 @@ constant (a-forth-constant(a-forth-constant38,628
 code assemby-code-word 43,685
 : a-forth-word 50,870
 
-html-src/softwarelibero.html,198
-Cos'� il software libero?4,38
-Licenze d'uso di un programmalicenze65,2474
-Sfatiamo alcuni miti138,6064
-Il movimento open sourceoss191,7968
-Impatto pratico del software liberoimpatto231,9986
+html-src/softwarelibero.html,200
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2500
+Sfatiamo alcuni miti138,6118
+Il movimento open sourceoss191,8037
+Impatto pratico del software liberoimpatto231,10066
 
 html-src/index.shtml,104
 &nbsp;8,281
-In evidenza15,446
-Comunicati e iniziative32,974
-Ultime notizie dall'associazione63,2027
+In evidenza15,447
+Comunicati e iniziative32,976
+Ultime notizie dall'associazione63,2030
 
 html-src/algrthms.html,467
-Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
-Descriptionalgorithms10,477
-Generating the Datagenalgorithm48,1953
-Convolutionallyconalgorithm55,2463
-Nextstatetable262,11331
-Outputoutputtable350,13571
-Mapping the Channel Symbolsmapping433,15786
-Adding Noise to theaddnoise439,16174
-Quantizing the Receivedquantizing469,18637
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,271
+Descriptionalgorithms10,472
+Generating the Datagenalgorithm48,1948
+Convolutionallyconalgorithm55,2458
+Nextstatetable262,11326
+Outputoutputtable350,13566
+Mapping the Channel Symbolsmapping433,15781
+Adding Noise to theaddnoise439,16169
+Quantizing the Receivedquantizing469,18632
 
-html-src/software.html,438
-Francesco Potort� Software Page9,280
-Software that I wrote for supporting my research activitysimulation36,1400
-MTGmtg41,1484
-Fracasfracas65,2626
-GaliLEOgalileo101,4234
-Leasqrleasqr114,4679
-Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
-Etagsetags148,6182
-checkiso161,6731
-cgrep178,7549
-debian-bug.eldebian-bug190,7981
-tcpdump205,8566
-Links to interesting softwarelinks216,8893
+html-src/software.html,439
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1398
+MTGmtg41,1482
+Fracasfracas65,2624
+GaliLEOgalileo101,4232
+Leasqrleasqr114,4677
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6065
+Etagsetags148,6180
+checkiso161,6729
+cgrep178,7547
+debian-bug.eldebian-bug190,7979
+tcpdump205,8564
+Links to interesting softwarelinks216,8891
 
 lua-src/allegro.lua,400
 local function get_layer_by_name 7,175
@@ -3894,7 +3841,7 @@ 
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\def={=3306,107486
 \def\normalbackslash{\normalbackslash3320,107868
 
-c-src//c.c,76
+c-src/c.c,76
 T f(1,0
 }T i;2,14
 void bar(5,69
diff --git a/test/etags/ETAGS.good_5 b/test/etags/ETAGS.good_5
index c7357d0..dfa261b 100644
--- a/test/etags/ETAGS.good_5
+++ b/test/etags/ETAGS.good_5
@@ -1,46 +1,4 @@
 
-Makefile,683
-ADASRC=1,0
-ASRC=2,91
-CSRC=3,139
-CPSRC=7,410
-ELSRC=10,584
-ERLSRC=11,654
-FORTHSRC=12,699
-FSRC=13,749
-HTMLSRC=14,821
-LUASRC=16,950
-MAKESRC=17,993
-OBJCSRC=18,1035
-OBJCPPSRC=19,1116
-PASSRC=20,1179
-PERLSRC=21,1221
-PHPSRC=22,1291
-PSSRC=23,1363
-PROLSRC=24,1403
-PYTSRC=25,1465
-TEXSRC=26,1506
-YSRC=27,1585
-SRCS=28,1650
-NONSRCS=32,1902
-ETAGS_PROG=34,1976
-CTAGS_PROG=35,2007
-REGEX=37,2039
-xx=38,2085
-RUN=40,2134
-OPTIONS=42,2140
-ARGS=43,2192
-infiles 45,2210
-check:check47,2272
-ediff%:ediff%55,2575
-cdiff:cdiff58,2676
-ETAGS:ETAGS61,2773
-CTAGS:CTAGS64,2843
-srclist:srclist67,2921
-regexfile:regexfile71,3012
-.PRECIOUS:.PRECIOUS77,3189
-FRC:FRC79,3223
-
 ada-src/etags-test-for.ada,1969
    type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
    function Body_RequiredBody_Required/f3,78
@@ -781,19 +739,6 @@ char                       **tab_fill(tab_fill70,1129
 int                    tab_delete_first(91,1638
 int                    tab_count_words(103,1820
 
-c-src/dostorture.c,197
-(*tag1 tag118,451
-#define notag2 26,552
-(*tag2 tag229,629
-(*tag3 tag339,771
-#define notag4 45,860
-(*tag4 tag448,954
-tag5 57,1080
-tag6 66,1207
-int pp1(74,1316
-pp287,1418
-pp3(100,1517
-
 c-src/emacs/src/gmalloc.c,7311
 #define USE_PTHREAD25,1002
 #undef get_current_dir_name33,1126
@@ -3346,10 +3291,12 @@ f-src/entry.strange_suffix,172
      & intensity1(577,12231
        character*(*) function foo(579,12307
 
-f-src/entry.strange,103
-       ENTRY  MSGSEL 193,4382
-     & intensity1(375,8135
-       character*(*) function foo(377,8211
+f-src/entry.strange,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
 
 forth-src/test-forth.fth,408
 : a-forth-word 20,301
@@ -3365,44 +3312,44 @@ constant (a-forth-constant(a-forth-constant38,628
 code assemby-code-word 43,685
 : a-forth-word 50,870
 
-html-src/softwarelibero.html,198
-Cos'� il software libero?4,38
-Licenze d'uso di un programmalicenze65,2474
-Sfatiamo alcuni miti138,6064
-Il movimento open sourceoss191,7968
-Impatto pratico del software liberoimpatto231,9986
+html-src/softwarelibero.html,200
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2500
+Sfatiamo alcuni miti138,6118
+Il movimento open sourceoss191,8037
+Impatto pratico del software liberoimpatto231,10066
 
 html-src/index.shtml,104
 &nbsp;8,281
-In evidenza15,446
-Comunicati e iniziative32,974
-Ultime notizie dall'associazione63,2027
+In evidenza15,447
+Comunicati e iniziative32,976
+Ultime notizie dall'associazione63,2030
 
 html-src/algrthms.html,467
-Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
-Descriptionalgorithms10,477
-Generating the Datagenalgorithm48,1953
-Convolutionallyconalgorithm55,2463
-Nextstatetable262,11331
-Outputoutputtable350,13571
-Mapping the Channel Symbolsmapping433,15786
-Adding Noise to theaddnoise439,16174
-Quantizing the Receivedquantizing469,18637
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,271
+Descriptionalgorithms10,472
+Generating the Datagenalgorithm48,1948
+Convolutionallyconalgorithm55,2458
+Nextstatetable262,11326
+Outputoutputtable350,13566
+Mapping the Channel Symbolsmapping433,15781
+Adding Noise to theaddnoise439,16169
+Quantizing the Receivedquantizing469,18632
 
-html-src/software.html,438
-Francesco Potort� Software Page9,280
-Software that I wrote for supporting my research activitysimulation36,1400
-MTGmtg41,1484
-Fracasfracas65,2626
-GaliLEOgalileo101,4234
-Leasqrleasqr114,4679
-Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
-Etagsetags148,6182
-checkiso161,6731
-cgrep178,7549
-debian-bug.eldebian-bug190,7981
-tcpdump205,8566
-Links to interesting softwarelinks216,8893
+html-src/software.html,439
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1398
+MTGmtg41,1482
+Fracasfracas65,2624
+GaliLEOgalileo101,4232
+Leasqrleasqr114,4677
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6065
+Etagsetags148,6180
+checkiso161,6729
+cgrep178,7547
+debian-bug.eldebian-bug190,7979
+tcpdump205,8564
+Links to interesting softwarelinks216,8891
 
 lua-src/allegro.lua,400
 local function get_layer_by_name 7,175
@@ -4807,7 +4754,7 @@ 
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\def={=3306,107486
 \def\normalbackslash{\normalbackslash3320,107868
 
-c-src//c.c,76
+c-src/c.c,76
 T f(1,0
 }T i;2,14
 void bar(5,69
diff --git a/test/etags/Makefile b/test/etags/Makefile
index a0914e4..99ad41e 100644
--- a/test/etags/Makefile
+++ b/test/etags/Makefile
@@ -1,7 +1,7 @@
 ADASRC=$(addprefix ./ada-src/,etags-test-for.ada 2ataspri.adb 2ataspri.ads 
waroquiers.ada)
 ASRC=$(addprefix ./a-src/,empty.zz empty.zz.gz)
 CSRC=$(addprefix ./c-src/,abbrev.c .//c.c torture.c getopt.h etags.c\
- exit.c exit.strange_suffix sysdep.h tab.c dostorture.c\
+ exit.c exit.strange_suffix sysdep.h tab.c\
  emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c emacs/src/lisp.h\
  machsyscalls.c machsyscalls.h fail.c a/b/b.c) ../etags/c-src/h.h
 CPSRC=$(addprefix ./cp-src/,c.C burton.cpp burton.cpp\
@@ -25,7 +25,7 @@ PROLSRC=$(addprefix ./prol-src/,ordsets.prolog natded.prolog)
 PYTSRC=$(addprefix ./pyt-src/,server.py)
 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=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
+SRCS=${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
      ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\
      ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\
      ${TEXSRC} ${YSRC}
@@ -44,6 +44,9 @@ ARGS=- < srclist
 
 infiles = $(filter-out ${NONSRCS},${SRCS}) srclist regexfile
 
+.PHONY: check cdiff ETAGS CTAGS
+# Can't make ediff_1 through ediff_5 .PHONY, as they're implicit.
+
 check:
        @$(MAKE) OPTIONS='--no-members' ediff_1
        @$(MAKE) OPTIONS='--declarations --no-members' ediff_2
@@ -58,10 +61,10 @@ ediff%: ETAGS.good% ETAGS ${infiles}
 cdiff: CTAGS.good CTAGS ${infiles}
        diff -u --suppress-common-lines --width=80 CTAGS.good CTAGS
 
-ETAGS: FRC ${infiles}
+ETAGS: ${infiles}
        ${RUN} ${ETAGS_PROG} ${OPTIONS} -o $@ ${ARGS}
 
-CTAGS: FRC ${infiles}
+CTAGS: ${infiles}
        ${RUN} ${CTAGS_PROG} -o $@ address@hidden ${ARGS}
 
 srclist: Makefile
@@ -70,10 +73,6 @@ srclist: Makefile
 
 regexfile: Makefile
        @echo ' -- This is for GNU Emacs source files' > regexfile
-       @echo '${REGEX}' >> regexfile
-       @echo '{c}${REGEX}\\1/m' >> regexfile
+       @printf '%s\n' '${REGEX}' >> regexfile
+       @printf '%s\n' '{c}${REGEX}\\1/m' >> regexfile
        @echo "regexfile remade"
-
-.PRECIOUS: ETAGS.good CTAGS.good
-
-FRC:;
diff --git a/test/etags/c-src/dostorture.c b/test/etags/c-src/dostorture.c
deleted file mode 100644
index 5190734..0000000
--- a/test/etags/c-src/dostorture.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Date: Thu, 05 Aug 1993 20:28:03 +0200
-   From: "Tom R.Hageman" <address@hidden>
-   Subject: more etags torture;-) [etags 7.3 patch#3]
-   To: address@hidden
-
-   Hi,
-
-   This test file illustrates some more problems with etags (7.3):
-
-
-   1. parentheses are confusing,
-   2. preprocessor directives can disrupt other state machines. */
-
-/* A small torture test for etags. */
-
-/* The classic parenthesis nightmare, based on signal(). */
-void
-(*tag1 (sig, handler)) ()
-  int sig;
-  void (*handler) ();
-{
-  (*handler)(sig);
-  return handler;
-}
-
-#define notag2 void
-/* The classic, with user-defined return type. */
-notag2
-(*tag2 (sig, handler)) ()
-  int sig;
-  void (*handler) ();
-{
-  (*handler)(sig);
-  return handler;
-}
-
-/* The classic, in ANSI C style. */
-void
-(*tag3 (int sig, void (*handler) (int))) (int)
-{
-  (*handler)(sig);
-  return handler;
-}
-
-#define notag4 void
-/* The classic, with user-defined return type, in ANSI C style. */
-notag4
-(*tag4 (int sig, void (*handler) (int))) (int)
-{
-  (*handler)(sig);
-  return handler;
-}
-
-
-/* A less tortuous example. */
-void
-tag5 (handler, arg)
-void (*handler)();
-void *arg;
-{
-  (*handler)(arg);
-}
-
-/* A less tortuous example, in ANSI C style. */
-void
-tag6 (void (*handler) (void *), void *arg)
-{
-  (*handler)(arg);
-}
-
-
-/* Interfering preprocessing torture */
-
-int pp1(
-#if (__STDC__)
-       int
-#endif
-       bar)
-#if (!__STDC__)
-     int bar;
-#endif
-{
-  return bar;
-}
-
-int
-pp2
-#if __STDC__
-  (int bar)
-#else
-  (bar)
-    int bar;
-#endif
-{
-  return bar;
-}
-
-int
-#if __STDC__
-pp3(int bar)
-#else
-pp3(bar)
-  int bar;
-#endif
-{
-  return bar;
-}
diff --git a/test/etags/cp-src/c.C b/test/etags/cp-src/c.C
index 2c5f7e0..dae933a 100644
--- a/test/etags/cp-src/c.C
+++ b/test/etags/cp-src/c.C
@@ -51,7 +51,7 @@ int A<int>::f(A<int>* x) {}
 A<float,B<int> > A<B<float>,int>::f(A<int>* x) {}
 template <class C, int n> class AT { C t[n]; };
 class AU { T x; };
-class B<int> { void f() {} };
+class B<int> { void f() {} };
 const A::B::T& abt = abc;
 class A { class B { int f(); }; };
 class A {
diff --git a/test/etags/html-src/algrthms.html 
b/test/etags/html-src/algrthms.html
index 322dafa..f051505 100644
--- a/test/etags/html-src/algrthms.html
+++ b/test/etags/html-src/algrthms.html
@@ -1,519 +1,519 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="Chip Fleming">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (Win95; U) [Netscape]">
-   <title>Tutorial on Convolutional Coding with Viterbi Decoding--Description 
of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms</title>
-</head>
-<body>
-<a NAME="algorithms"></a><b><font face="Arial"><font size=+1>Description
-of the Algorithms&nbsp; (Part 1)</font></font></b>
-<p>&nbsp;The steps involved in simulating a communication channel using
-convolutional encoding and Viterbi decoding are as follows:
-<ul>
-<li>
-<a href="#genalgorithm">Generate the data</a> to be transmitted through
-the channel-result is binary data bits</li>
-
-<li>
-<a href="#conalgorithm">Convolutionally encode</a> the data-result is channel
-symbols</li>
-
-<li>
-<a href="#mapping">Map the one/zero channel symbols</a> onto an antipodal
-baseband signal, producing transmitted channel symbols</li>
-
-<li>
-<a href="#addnoise">Add noise</a> to the transmitted channel symbols-result
-is received channel symbols</li>
-
-<li>
-<a href="#quantizing">Quantize</a> the received channel levels-one bit
-quantization is called hard-decision, and two to n bit quantization is
-called soft-decision (n is usually three or four)</li>
-
-<li>
-<a href="algrthms2.html">Perform Viterbi decoding</a> on the quantized
-received channel symbols-result is again binary data bits</li>
-
-<li>
-Compare the decoded data bits to the transmitted data bits and count the
-number of errors.</li>
-</ul>
-<i>Many of you will notice that I left out the steps of modulating the
-channel symbols onto a transmitted carrier, and then demodulating the received
-carrier to recover the channel symbols. You're right, but we can accurately
-model the effects of AWGN even though we bypass those steps.</i>
-<p><a NAME="genalgorithm"></a><b><i><font face="Arial">Generating the 
Data</font></i></b>
-<p>Generating the data to be transmitted through the channel can be 
accomplished
-quite simply by using a random number generator. One that produces a uniform
-distribution of numbers on the interval 0 to a maximum value is provided
-in C: <tt>rand ()</tt>. Using this function, we can say that any value
-less than half of the maximum value is a zero; any value greater than or
-equal to half of the maximum value is a one.
-<p><a NAME="conalgorithm"></a><b><i><font face="Arial">Convolutionally
-Encoding the Data</font></i></b>
-<p>Convolutionally encoding the data is accomplished using a shift register
-and associated combinatorial logic that performs modulo-two addition. (A
-shift register is merely a chain of flip-flops wherein the output of the
-nth flip-flop is tied to the input of the (n+1)th flip-flop. Every time
-the active edge of the clock occurs, the input to the flip-flop is clocked
-through to the output, and thus the data are shifted over one stage.) The
-combinatorial logic is often in the form of cascaded exclusive-or gates.
-As a reminder, exclusive-or gates are two-input, one-output gates often
-represented by the logic symbol shown below,
-<center>
-<p><img SRC="figs/xor_gate.gif" ALT="exclusive-or gate symbol" height=64 
width=93></center>
-
-<p>that implement the following truth-table:
-<br>&nbsp;
-<br>&nbsp;
-<center><table BORDER CELLPADDING=7 WIDTH="218" >
-<tr>
-<td VALIGN=TOP WIDTH="28%">
-<center><b><tt>Input A</tt></b></center>
-</td>
-
-<td VALIGN=TOP WIDTH="27%">
-<center><b><tt>Input B</tt></b></center>
-</td>
-
-<td VALIGN=TOP WIDTH="45%">
-<center><b><tt>Output</tt></b>
-<p><b><tt>(A xor B)</tt></b></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="28%">
-<center><tt>0</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="27%">
-<center><tt>0</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="45%">
-<center><tt>0</tt></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="28%">
-<center><tt>0</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="27%">
-<center><tt>1</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="45%">
-<center><tt>1</tt></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="28%">
-<center><tt>1</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="27%">
-<center><tt>0</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="45%">
-<center><tt>1</tt></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="28%">
-<center><tt>1</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="27%">
-<center><tt>1</tt></center>
-</td>
-
-<td VALIGN=TOP WIDTH="45%">
-<center><tt>0</tt></center>
-</td>
-</tr>
-</table></center>
-
-<p>The exclusive-or gate performs modulo-two addition of its inputs. When
-you cascade q two-input exclusive-or gates, with the output of the first
-one feeding one of the inputs of the second one, the output of the second
-one feeding one of the inputs of the third one, etc., the output of the
-last one in the chain is the modulo-two sum of the q + 1 inputs.
-<p>Another way to illustrate the modulo-two adder, and the way that is
-most commonly used in textbooks, is as a circle with a + symbol inside,
-thus:
-<center>
-<p><img SRC="figs/ringsum.gif" ALT="modulo-two adder symbol" height=48 
width=48></center>
-
-<p>Now that we have the two basic components of the convolutional encoder
-(flip-flops comprising the shift register and exclusive-or gates comprising
-the associated modulo-two adders) defined, let's look at a picture of a
-convolutional encoder for a rate 1/2, K = 3, m = 2 code:
-<br>&nbsp;
-<br>&nbsp;
-<br>
-<center>
-<p><img SRC="figs/ce_7_5_a.gif" ALT="rate 1/2 K = 3 (7, 5) convolutional 
encoder" height=232 width=600></center>
-
-<p>In this encoder, data bits are provided at a rate of k bits per second.
-Channel symbols are output at a rate of n = 2k symbols per second. The
-input bit is stable during the encoder cycle. The encoder cycle starts
-when an input clock edge occurs. When the input clock edge occurs, the
-output of the left-hand flip-flop is clocked into the right-hand flip-flop,
-the previous input bit is clocked into the left-hand flip-flop, and a new
-input bit becomes available. Then the outputs of the upper and lower modulo-two
-adders become stable. The output selector (SEL A/B block) cycles through
-two states-in the first state, it selects and outputs the output of the
-upper modulo-two adder; in the second state, it selects and outputs the
-output of the lower modulo-two adder.
-<p>The encoder shown above encodes the K = 3, (7, 5) convolutional code.
-The octal numbers 7 and 5 represent the code generator polynomials, which
-when read in binary (111<sub>2</sub> and 101<sub>2</sub>) correspond to
-the shift register connections to the upper and lower modulo-two adders,
-respectively. This code has been determined to be the "best" code for rate
-1/2, K = 3. It is the code I will use for the remaining discussion and
-examples, for reasons that will become readily apparent when we get into
-the Viterbi decoder algorithm.
-<p>Let's look at an example input data stream, and the corresponding output
-data stream:
-<p>Let the input sequence be 010111001010001<sub>2</sub>.
-<p>Assume that the outputs of both of the flip-flops in the shift register
-are initially cleared, i.e. their outputs are zeroes. The first clock cycle
-makes the first input bit, a zero, available to the encoder. The flip-flop
-outputs are both zeroes. The inputs to the modulo-two adders are all zeroes,
-so the output of the encoder is 00<sub>2</sub>.
-<p>The second clock cycle makes the second input bit available to the encoder.
-The left-hand flip-flop clocks in the previous bit, which was a zero, and
-the right-hand flip-flop clocks in the zero output by the left-hand flip-flop.
-The inputs to the top modulo-two adder are 100<sub>2</sub>, so the output
-is a one. The inputs to the bottom modulo-two adder are 10<sub>2</sub>,
-so the output is also a one. So the encoder outputs 11<sub>2</sub> for
-the channel symbols.
-<p>The third clock cycle makes the third input bit, a zero, available to
-the encoder. The left-hand flip-flop clocks in the previous bit, which
-was a one, and the right-hand flip-flop clocks in the zero from two bit-times
-ago. The inputs to the top modulo-two adder are 010<sub>2</sub>, so the
-output is a one. The inputs to the bottom modulo-two adder are 00<sub>2</sub>,
-so the output is zero. So the encoder outputs 10<sub>2</sub> for the channel
-symbols.
-<p>And so on. The timing diagram shown below illustrates the process:
-<br>&nbsp;
-<br>&nbsp;
-<br>
-<center>
-<p><img SRC="figs/ce_td.gif" ALT="timing diagram for rate 1/2 convolutional 
encoder" height=322 width=600></center>
-
-<p><br>
-<br>
-<br>
-<p>After all of the inputs have been presented to the encoder, the output
-sequence will be:
-<p>00 11 10 00 01 10 01 11 11 10 00 10 11 00 11<sub>2</sub>.
-<p>Notice that I have paired the encoder outputs-the first bit in each
-pair is the output of the upper modulo-two adder; the second bit in each
-pair is the output of the lower modulo-two adder.
-<p>You can see from the structure of the rate 1/2 K = 3 convolutional encoder
-and from the example given above that each input bit has an effect on three
-successive pairs of output symbols. That is an extremely important point
-and that is what gives the convolutional code its error-correcting power.
-The reason why will become evident when we get into the Viterbi decoder
-algorithm.
-<p>Now if we are only going to send the 15 data bits given above, in order
-for the last bit to affect three pairs of output symbols, we need to output
-two more pairs of symbols. This is accomplished in our example encoder
-by clocking the convolutional encoder flip-flops two ( = m) more times,
-while holding the input at zero. This is called "flushing" the encoder,
-and results in two more pairs of output symbols. The final binary output
-of the encoder is thus 00 11 10 00 01 10 01 11 11 10 00 10 11 00 11 10
-11<sub>2</sub>. If we don't perform the flushing operation, the last m
-bits of the message have less error-correction capability than the first
-through (m - 1)th bits had. This is a pretty important thing to remember
-if you're going to use this FEC technique in a burst-mode environment.
-So's the step of clearing the shift register at the beginning of each burst.
-The encoder must start in a known state and end in a known state for the
-decoder to be able to reconstruct the input data sequence properly.
-<p>Now, let's look at the encoder from another perspective. You can think
-of the encoder as a simple state machine. The example encoder has two bits
-of memory, so there are four possible states. Let's give the left-hand
-flip-flop a binary weight of 2<sup>1</sup>, and the right-hand flip-flop
-a binary weight of 2<sup>0</sup>. Initially, the encoder is in the all-zeroes
-state. If the first input bit is a zero, the encoder stays in the all zeroes
-state at the next clock edge. But if the input bit is a one, the encoder
-transitions to the 10<sub>2</sub> state at the next clock edge. Then, if
-the next input bit is zero, the encoder transitions to the 01<sub>2</sub>
-state, otherwise, it transitions to the 11<sub>2</sub> state. The following
-table gives the next state given the current state and the input, with
-the states given in binary:
-<br>&nbsp;
-<br>&nbsp;
-<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
-<tr>
-<td VALIGN=TOP WIDTH="33%"><font face="Arial"><font 
size=-1>&nbsp;</font></font></td>
-
-<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
-<center><a NAME="statetable"></a><b><font face="Arial"><font size=-1>Next
-State, if&nbsp;</font></font></b></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><b><font face="Arial"><font size=-1>Current 
State</font></font></b></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><b><font face="Arial"><font size=-1>Input = 
0:</font></font></b></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><b><font face="Arial"><font size=-1>Input = 
1:</font></font></b></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>00</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>00</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>10</font></font></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>01</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>00</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>10</font></font></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>10</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>01</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>11</font></font></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>11</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>01</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>11</font></font></center>
-</td>
-</tr>
-</table></center>
-
-<br>&nbsp;
-<p>The above table is often called a state transition table. We'll refer
-to it as the <tt>next state</tt> table.<tt> </tt>Now let us look at a table
-that lists the channel output symbols, given the current state and the
-input data, which we'll refer to as the <tt>output</tt> table:
-<br>&nbsp;
-<br>&nbsp;
-<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
-<tr>
-<td VALIGN=TOP WIDTH="33%"></td>
-
-<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
-<center><a NAME="outputtable"></a><b><font face="Arial"><font size=-1>Output
-Symbols, if</font></font></b></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><b><font face="Arial"><font size=-1>Current 
State</font></font></b></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><b><font face="Arial"><font size=-1>Input = 
0:</font></font></b></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><b><font face="Arial"><font size=-1>Input = 
1:</font></font></b></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>00</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>00</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>11</font></font></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>01</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>11</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>00</font></font></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>10</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>10</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>01</font></font></center>
-</td>
-</tr>
-
-<tr>
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>11</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>01</font></font></center>
-</td>
-
-<td VALIGN=TOP WIDTH="33%">
-<center><font face="Arial"><font size=-1>10</font></font></center>
-</td>
-</tr>
-</table></center>
-
-<br>&nbsp;
-<p>You should now see that with these two tables, you can completely describe
-the behavior of the example rate 1/2, K = 3 convolutional encoder. Note
-that both of these tables have 2<sup>(K - 1)</sup> rows, and 2<sup>k</sup>
-columns, where K is the constraint length and k is the number of bits input
-to the encoder for each cycle. These two tables will come in handy when
-we start discussing the Viterbi decoder algorithm.
-<p><a NAME="mapping"></a><b><i><font face="Arial">Mapping the Channel Symbols
-to Signal Levels</font></i></b>
-<p>Mapping the one/zero output of the convolutional encoder onto an antipodal
-baseband signaling scheme is simply a matter of translating zeroes to +1s
-and ones to -1s. This can be accomplished by performing the operation y
-= 1 - 2x on each convolutional encoder output symbol.
-<p><a NAME="addnoise"></a><b><i><font face="Arial">Adding Noise to the
-Transmitted Symbols</font></i></b>
-<p>Adding noise to the transmitted channel symbols produced by the 
convolutional
-encoder involves generating Gaussian random numbers, scaling the numbers
-according to the desired energy per symbol to noise density ratio, 
E<sub>s</sub>/N<sub>0</sub>,
-and adding the scaled Gaussian random numbers to the channel symbol values.
-<p>For the uncoded channel, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>,
-since there is one channel symbol per bit.&nbsp; However, for the coded
-channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> + 
10log<sub>10</sub>(k/n).&nbsp;
-For example, for rate 1/2 coding, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>
-+ 10log<sub>10</sub>(1/2) = E<sub>b</sub>/N<sub>0</sub> - 3.01 dB.&nbsp;
-Similarly, for rate 2/3 coding, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>
-+ 10log<sub>10</sub>(2/3) = E<sub>b</sub>/N<sub>0</sub> - 1.76 dB.
-<p>The Gaussian random number generator is the only interesting part of
-this task. C only provides a uniform random number generator, <tt>rand()</tt>.
-In order to obtain Gaussian random numbers, we take advantage of relationships
-between uniform, Rayleigh, and Gaussian distributions:
-<p>Given a uniform random variable U, a Rayleigh random variable R can
-be obtained by:
-<p><img SRC="figs/eqn01.gif" ALT="equation for Rayleigh random deviate given 
uniform random deviate" height=30 width=297 align=ABSCENTER>
-<p>where&nbsp;<img SRC="figs/eqn02.gif" height=24 width=24 align=ABSCENTER>is
-the variance of the Rayleigh random variable, and given R and a second
-uniform random variable V, two Gaussian random variables G and H can be
-obtained by
-<p><i>G</i> = <i>R</i> cos <i>U</i> and <i>H</i> = <i>R</i> sin <i>V</i>.
-<p>In the AWGN channel, the signal is corrupted by additive noise, n(t),
-which has the power spectrum <i>No</i>/2 watts/Hz. The variance&nbsp;<img 
SRC="figs/eqn02.gif" ALT="variance" height=24 width=24 align=ABSBOTTOM>of
-this noise is equal to&nbsp;<img SRC="figs/eqn03.gif" ALT="noise density div 
by two" height=22 width=38 align=TEXTTOP>.
-If we set the energy per symbol <i>E<sub>s</sub></i> equal to 1, 
then&nbsp;<img SRC="figs/eqn04.gif" ALT="equation relating variance to SNR" 
height=28 width=110 align=ABSBOTTOM>.
-So&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" 
height=28 width=139 align=ABSCENTER>.
-<p><a NAME="quantizing"></a><b><i><font face="Arial">Quantizing the Received
-Channel Symbols</font></i></b>
-<p>An ideal Viterbi decoder would work with infinite precision, or at least
-with floating-point numbers. In practical systems, we quantize the received
-channel symbols with one or a few bits of precision in order to reduce
-the complexity of the Viterbi decoder, not to mention the circuits that
-precede it. If the received channel symbols are quantized to one-bit precision
-(&lt; 0V = 1, <u>></u> 0V = 0), the result is called hard-decision data.
-If the received channel symbols are quantized with more than one bit of
-precision, the result is called soft-decision data. A Viterbi decoder with
-soft decision data inputs quantized to three or four bits of precision
-can perform about 2 dB better than one working with hard-decision inputs.
-The usual quantization precision is three bits. More bits provide little
-additional improvement.
-<p>The selection of the quantizing levels is an important design decision
-because it can have a significant effect on the performance of the link.
-The following is a very brief explanation of one way to set those levels.
-Let's assume our received signal levels in the absence of noise are -1V
-= 1, +1V = 0. With noise, our received signal has mean +/- 1 and standard
-deviation&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given 
SNR" height=28 width=139 align=ABSCENTER>.
-Let's use a uniform, three-bit quantizer having the input/output relationship
-shown in the figure below, where D is a decision level that we will calculate
-shortly:
-<center>
-<p><img SRC="figs/quantize.gif" ALT="8-level quantizer function plot" 
height=342 width=384></center>
-
-<p>The decision level, D, can be calculated according to the formula&nbsp;<img 
SRC="figs/eqn06.gif" ALT="equation for quantizer decision level" height=28 
width=228 align=ABSCENTER>,
-where E<sub>s</sub>/N<sub>0</sub> is the energy per symbol to noise density
-ratio<i>. (The above figure was redrawn from Figure 2 of Advanced Hardware
-Architecture's ANRS07-0795, "Soft Decision Thresholds and Effects on Viterbi
-Performance". See the </i><a href="fecbiblio.html">bibliography</a><i>&nbsp;
-for a link to their web pages.)</i>
-<p>Click <a href="algrthms2.html">here</a> to proceed to the description
-of the Viterbi decoding algorithm itself...
-<p>Or click on one of the links below to go to the beginning of that section:
-<p>&nbsp;<a href="tutorial.html">Introduction</a>
-<br>&nbsp;<a href="algrthms2.html">Description of the Algorithms&nbsp;
-(Part 2)</a>
-<br>&nbsp;<a href="examples.html">Simulation Source Code Examples</a>
-<br>&nbsp;<a href="simrslts.html">Example Simulation Results</a>
-<br>&nbsp;<a href="fecbiblio.html">Bibliography</a>
-<br>&nbsp;<a href="tutorial.html#specapps">About Spectrum Applications...</a>
-<br>&nbsp;
-<br>&nbsp;
-<br>
-<br>
-<center>
-<p><img SRC="figs/stripe.gif" height=6 width=600></center>
-
-</body>
-</html>
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+   <meta name="Author" content="Chip Fleming">
+   <meta name="GENERATOR" content="Mozilla/4.7 [en] (Win95; U) [Netscape]">
+   <title>Tutorial on Convolutional Coding with Viterbi Decoding--Description 
of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms</title>
+</head>
+<body>
+<a NAME="algorithms"></a><b><font face="Arial"><font size=+1>Description
+of the Algorithms&nbsp; (Part 1)</font></font></b>
+<p>&nbsp;The steps involved in simulating a communication channel using
+convolutional encoding and Viterbi decoding are as follows:
+<ul>
+<li>
+<a href="#genalgorithm">Generate the data</a> to be transmitted through
+the channel-result is binary data bits</li>
+
+<li>
+<a href="#conalgorithm">Convolutionally encode</a> the data-result is channel
+symbols</li>
+
+<li>
+<a href="#mapping">Map the one/zero channel symbols</a> onto an antipodal
+baseband signal, producing transmitted channel symbols</li>
+
+<li>
+<a href="#addnoise">Add noise</a> to the transmitted channel symbols-result
+is received channel symbols</li>
+
+<li>
+<a href="#quantizing">Quantize</a> the received channel levels-one bit
+quantization is called hard-decision, and two to n bit quantization is
+called soft-decision (n is usually three or four)</li>
+
+<li>
+<a href="algrthms2.html">Perform Viterbi decoding</a> on the quantized
+received channel symbols-result is again binary data bits</li>
+
+<li>
+Compare the decoded data bits to the transmitted data bits and count the
+number of errors.</li>
+</ul>
+<i>Many of you will notice that I left out the steps of modulating the
+channel symbols onto a transmitted carrier, and then demodulating the received
+carrier to recover the channel symbols. You're right, but we can accurately
+model the effects of AWGN even though we bypass those steps.</i>
+<p><a NAME="genalgorithm"></a><b><i><font face="Arial">Generating the 
Data</font></i></b>
+<p>Generating the data to be transmitted through the channel can be 
accomplished
+quite simply by using a random number generator. One that produces a uniform
+distribution of numbers on the interval 0 to a maximum value is provided
+in C: <tt>rand ()</tt>. Using this function, we can say that any value
+less than half of the maximum value is a zero; any value greater than or
+equal to half of the maximum value is a one.
+<p><a NAME="conalgorithm"></a><b><i><font face="Arial">Convolutionally
+Encoding the Data</font></i></b>
+<p>Convolutionally encoding the data is accomplished using a shift register
+and associated combinatorial logic that performs modulo-two addition. (A
+shift register is merely a chain of flip-flops wherein the output of the
+nth flip-flop is tied to the input of the (n+1)th flip-flop. Every time
+the active edge of the clock occurs, the input to the flip-flop is clocked
+through to the output, and thus the data are shifted over one stage.) The
+combinatorial logic is often in the form of cascaded exclusive-or gates.
+As a reminder, exclusive-or gates are two-input, one-output gates often
+represented by the logic symbol shown below,
+<center>
+<p><img SRC="figs/xor_gate.gif" ALT="exclusive-or gate symbol" height=64 
width=93></center>
+
+<p>that implement the following truth-table:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLPADDING=7 WIDTH="218" >
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><b><tt>Input A</tt></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><b><tt>Input B</tt></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><b><tt>Output</tt></b>
+<p><b><tt>(A xor B)</tt></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>0</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>1</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>1</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>0</tt></center>
+</td>
+</tr>
+</table></center>
+
+<p>The exclusive-or gate performs modulo-two addition of its inputs. When
+you cascade q two-input exclusive-or gates, with the output of the first
+one feeding one of the inputs of the second one, the output of the second
+one feeding one of the inputs of the third one, etc., the output of the
+last one in the chain is the modulo-two sum of the q + 1 inputs.
+<p>Another way to illustrate the modulo-two adder, and the way that is
+most commonly used in textbooks, is as a circle with a + symbol inside,
+thus:
+<center>
+<p><img SRC="figs/ringsum.gif" ALT="modulo-two adder symbol" height=48 
width=48></center>
+
+<p>Now that we have the two basic components of the convolutional encoder
+(flip-flops comprising the shift register and exclusive-or gates comprising
+the associated modulo-two adders) defined, let's look at a picture of a
+convolutional encoder for a rate 1/2, K = 3, m = 2 code:
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<center>
+<p><img SRC="figs/ce_7_5_a.gif" ALT="rate 1/2 K = 3 (7, 5) convolutional 
encoder" height=232 width=600></center>
+
+<p>In this encoder, data bits are provided at a rate of k bits per second.
+Channel symbols are output at a rate of n = 2k symbols per second. The
+input bit is stable during the encoder cycle. The encoder cycle starts
+when an input clock edge occurs. When the input clock edge occurs, the
+output of the left-hand flip-flop is clocked into the right-hand flip-flop,
+the previous input bit is clocked into the left-hand flip-flop, and a new
+input bit becomes available. Then the outputs of the upper and lower modulo-two
+adders become stable. The output selector (SEL A/B block) cycles through
+two states-in the first state, it selects and outputs the output of the
+upper modulo-two adder; in the second state, it selects and outputs the
+output of the lower modulo-two adder.
+<p>The encoder shown above encodes the K = 3, (7, 5) convolutional code.
+The octal numbers 7 and 5 represent the code generator polynomials, which
+when read in binary (111<sub>2</sub> and 101<sub>2</sub>) correspond to
+the shift register connections to the upper and lower modulo-two adders,
+respectively. This code has been determined to be the "best" code for rate
+1/2, K = 3. It is the code I will use for the remaining discussion and
+examples, for reasons that will become readily apparent when we get into
+the Viterbi decoder algorithm.
+<p>Let's look at an example input data stream, and the corresponding output
+data stream:
+<p>Let the input sequence be 010111001010001<sub>2</sub>.
+<p>Assume that the outputs of both of the flip-flops in the shift register
+are initially cleared, i.e. their outputs are zeroes. The first clock cycle
+makes the first input bit, a zero, available to the encoder. The flip-flop
+outputs are both zeroes. The inputs to the modulo-two adders are all zeroes,
+so the output of the encoder is 00<sub>2</sub>.
+<p>The second clock cycle makes the second input bit available to the encoder.
+The left-hand flip-flop clocks in the previous bit, which was a zero, and
+the right-hand flip-flop clocks in the zero output by the left-hand flip-flop.
+The inputs to the top modulo-two adder are 100<sub>2</sub>, so the output
+is a one. The inputs to the bottom modulo-two adder are 10<sub>2</sub>,
+so the output is also a one. So the encoder outputs 11<sub>2</sub> for
+the channel symbols.
+<p>The third clock cycle makes the third input bit, a zero, available to
+the encoder. The left-hand flip-flop clocks in the previous bit, which
+was a one, and the right-hand flip-flop clocks in the zero from two bit-times
+ago. The inputs to the top modulo-two adder are 010<sub>2</sub>, so the
+output is a one. The inputs to the bottom modulo-two adder are 00<sub>2</sub>,
+so the output is zero. So the encoder outputs 10<sub>2</sub> for the channel
+symbols.
+<p>And so on. The timing diagram shown below illustrates the process:
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<center>
+<p><img SRC="figs/ce_td.gif" ALT="timing diagram for rate 1/2 convolutional 
encoder" height=322 width=600></center>
+
+<p><br>
+<br>
+<br>
+<p>After all of the inputs have been presented to the encoder, the output
+sequence will be:
+<p>00 11 10 00 01 10 01 11 11 10 00 10 11 00 11<sub>2</sub>.
+<p>Notice that I have paired the encoder outputs-the first bit in each
+pair is the output of the upper modulo-two adder; the second bit in each
+pair is the output of the lower modulo-two adder.
+<p>You can see from the structure of the rate 1/2 K = 3 convolutional encoder
+and from the example given above that each input bit has an effect on three
+successive pairs of output symbols. That is an extremely important point
+and that is what gives the convolutional code its error-correcting power.
+The reason why will become evident when we get into the Viterbi decoder
+algorithm.
+<p>Now if we are only going to send the 15 data bits given above, in order
+for the last bit to affect three pairs of output symbols, we need to output
+two more pairs of symbols. This is accomplished in our example encoder
+by clocking the convolutional encoder flip-flops two ( = m) more times,
+while holding the input at zero. This is called "flushing" the encoder,
+and results in two more pairs of output symbols. The final binary output
+of the encoder is thus 00 11 10 00 01 10 01 11 11 10 00 10 11 00 11 10
+11<sub>2</sub>. If we don't perform the flushing operation, the last m
+bits of the message have less error-correction capability than the first
+through (m - 1)th bits had. This is a pretty important thing to remember
+if you're going to use this FEC technique in a burst-mode environment.
+So's the step of clearing the shift register at the beginning of each burst.
+The encoder must start in a known state and end in a known state for the
+decoder to be able to reconstruct the input data sequence properly.
+<p>Now, let's look at the encoder from another perspective. You can think
+of the encoder as a simple state machine. The example encoder has two bits
+of memory, so there are four possible states. Let's give the left-hand
+flip-flop a binary weight of 2<sup>1</sup>, and the right-hand flip-flop
+a binary weight of 2<sup>0</sup>. Initially, the encoder is in the all-zeroes
+state. If the first input bit is a zero, the encoder stays in the all zeroes
+state at the next clock edge. But if the input bit is a one, the encoder
+transitions to the 10<sub>2</sub> state at the next clock edge. Then, if
+the next input bit is zero, the encoder transitions to the 01<sub>2</sub>
+state, otherwise, it transitions to the 11<sub>2</sub> state. The following
+table gives the next state given the current state and the input, with
+the states given in binary:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
+<tr>
+<td VALIGN=TOP WIDTH="33%"><font face="Arial"><font 
size=-1>&nbsp;</font></font></td>
+
+<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
+<center><a NAME="statetable"></a><b><font face="Arial"><font size=-1>Next
+State, if&nbsp;</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Current 
State</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
0:</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
1:</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+</table></center>
+
+<br>&nbsp;
+<p>The above table is often called a state transition table. We'll refer
+to it as the <tt>next state</tt> table.<tt> </tt>Now let us look at a table
+that lists the channel output symbols, given the current state and the
+input data, which we'll refer to as the <tt>output</tt> table:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
+<tr>
+<td VALIGN=TOP WIDTH="33%"></td>
+
+<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
+<center><a NAME="outputtable"></a><b><font face="Arial"><font size=-1>Output
+Symbols, if</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Current 
State</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
0:</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
1:</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+</table></center>
+
+<br>&nbsp;
+<p>You should now see that with these two tables, you can completely describe
+the behavior of the example rate 1/2, K = 3 convolutional encoder. Note
+that both of these tables have 2<sup>(K - 1)</sup> rows, and 2<sup>k</sup>
+columns, where K is the constraint length and k is the number of bits input
+to the encoder for each cycle. These two tables will come in handy when
+we start discussing the Viterbi decoder algorithm.
+<p><a NAME="mapping"></a><b><i><font face="Arial">Mapping the Channel Symbols
+to Signal Levels</font></i></b>
+<p>Mapping the one/zero output of the convolutional encoder onto an antipodal
+baseband signaling scheme is simply a matter of translating zeroes to +1s
+and ones to -1s. This can be accomplished by performing the operation y
+= 1 - 2x on each convolutional encoder output symbol.
+<p><a NAME="addnoise"></a><b><i><font face="Arial">Adding Noise to the
+Transmitted Symbols</font></i></b>
+<p>Adding noise to the transmitted channel symbols produced by the 
convolutional
+encoder involves generating Gaussian random numbers, scaling the numbers
+according to the desired energy per symbol to noise density ratio, 
E<sub>s</sub>/N<sub>0</sub>,
+and adding the scaled Gaussian random numbers to the channel symbol values.
+<p>For the uncoded channel, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>,
+since there is one channel symbol per bit.&nbsp; However, for the coded
+channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> + 
10log<sub>10</sub>(k/n).&nbsp;
+For example, for rate 1/2 coding, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>
++ 10log<sub>10</sub>(1/2) = E<sub>b</sub>/N<sub>0</sub> - 3.01 dB.&nbsp;
+Similarly, for rate 2/3 coding, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>
++ 10log<sub>10</sub>(2/3) = E<sub>b</sub>/N<sub>0</sub> - 1.76 dB.
+<p>The Gaussian random number generator is the only interesting part of
+this task. C only provides a uniform random number generator, <tt>rand()</tt>.
+In order to obtain Gaussian random numbers, we take advantage of relationships
+between uniform, Rayleigh, and Gaussian distributions:
+<p>Given a uniform random variable U, a Rayleigh random variable R can
+be obtained by:
+<p><img SRC="figs/eqn01.gif" ALT="equation for Rayleigh random deviate given 
uniform random deviate" height=30 width=297 align=ABSCENTER>
+<p>where&nbsp;<img SRC="figs/eqn02.gif" height=24 width=24 align=ABSCENTER>is
+the variance of the Rayleigh random variable, and given R and a second
+uniform random variable V, two Gaussian random variables G and H can be
+obtained by
+<p><i>G</i> = <i>R</i> cos <i>U</i> and <i>H</i> = <i>R</i> sin <i>V</i>.
+<p>In the AWGN channel, the signal is corrupted by additive noise, n(t),
+which has the power spectrum <i>No</i>/2 watts/Hz. The variance&nbsp;<img 
SRC="figs/eqn02.gif" ALT="variance" height=24 width=24 align=ABSBOTTOM>of
+this noise is equal to&nbsp;<img SRC="figs/eqn03.gif" ALT="noise density div 
by two" height=22 width=38 align=TEXTTOP>.
+If we set the energy per symbol <i>E<sub>s</sub></i> equal to 1, 
then&nbsp;<img SRC="figs/eqn04.gif" ALT="equation relating variance to SNR" 
height=28 width=110 align=ABSBOTTOM>.
+So&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" 
height=28 width=139 align=ABSCENTER>.
+<p><a NAME="quantizing"></a><b><i><font face="Arial">Quantizing the Received
+Channel Symbols</font></i></b>
+<p>An ideal Viterbi decoder would work with infinite precision, or at least
+with floating-point numbers. In practical systems, we quantize the received
+channel symbols with one or a few bits of precision in order to reduce
+the complexity of the Viterbi decoder, not to mention the circuits that
+precede it. If the received channel symbols are quantized to one-bit precision
+(&lt; 0V = 1, <u>></u> 0V = 0), the result is called hard-decision data.
+If the received channel symbols are quantized with more than one bit of
+precision, the result is called soft-decision data. A Viterbi decoder with
+soft decision data inputs quantized to three or four bits of precision
+can perform about 2 dB better than one working with hard-decision inputs.
+The usual quantization precision is three bits. More bits provide little
+additional improvement.
+<p>The selection of the quantizing levels is an important design decision
+because it can have a significant effect on the performance of the link.
+The following is a very brief explanation of one way to set those levels.
+Let's assume our received signal levels in the absence of noise are -1V
+= 1, +1V = 0. With noise, our received signal has mean +/- 1 and standard
+deviation&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given 
SNR" height=28 width=139 align=ABSCENTER>.
+Let's use a uniform, three-bit quantizer having the input/output relationship
+shown in the figure below, where D is a decision level that we will calculate
+shortly:
+<center>
+<p><img SRC="figs/quantize.gif" ALT="8-level quantizer function plot" 
height=342 width=384></center>
+
+<p>The decision level, D, can be calculated according to the formula&nbsp;<img 
SRC="figs/eqn06.gif" ALT="equation for quantizer decision level" height=28 
width=228 align=ABSCENTER>,
+where E<sub>s</sub>/N<sub>0</sub> is the energy per symbol to noise density
+ratio<i>. (The above figure was redrawn from Figure 2 of Advanced Hardware
+Architecture's ANRS07-0795, "Soft Decision Thresholds and Effects on Viterbi
+Performance". See the </i><a href="fecbiblio.html">bibliography</a><i>&nbsp;
+for a link to their web pages.)</i>
+<p>Click <a href="algrthms2.html">here</a> to proceed to the description
+of the Viterbi decoding algorithm itself...
+<p>Or click on one of the links below to go to the beginning of that section:
+<p>&nbsp;<a href="tutorial.html">Introduction</a>
+<br>&nbsp;<a href="algrthms2.html">Description of the Algorithms&nbsp;
+(Part 2)</a>
+<br>&nbsp;<a href="examples.html">Simulation Source Code Examples</a>
+<br>&nbsp;<a href="simrslts.html">Example Simulation Results</a>
+<br>&nbsp;<a href="fecbiblio.html">Bibliography</a>
+<br>&nbsp;<a href="tutorial.html#specapps">About Spectrum Applications...</a>
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<br>
+<center>
+<p><img SRC="figs/stripe.gif" height=6 width=600></center>
+
+</body>
+</html>
diff --git a/test/etags/html-src/index.shtml b/test/etags/html-src/index.shtml
index 24f269f..6d8cd85 100644
--- a/test/etags/html-src/index.shtml
+++ b/test/etags/html-src/index.shtml
@@ -8,7 +8,7 @@
 <H3>&nbsp;</H3>        <!-- un po' di spazio in cima -->
 
 <!--
-     La rubrica "in evidenza" va commentata se non c'� niente di serio
+     La rubrica "in evidenza" va commentata se non c'è niente di serio
      da mettere in evidenza
  -->
 <H2>
@@ -23,7 +23,7 @@
   sostenere il <a href="/altri/cortiana.shtml">disegno di legge</a> sul
   software libero dal titolo "<i>Norme in materia di pluralismo
   informatico sulla adozione e la diffusione del software libero e sulla
-  portabilit� dei documenti informatici nella Pubblica
+  portabilità dei documenti informatici nella Pubblica
   Amministrazione</i>" (XIV Legislatura Atto Senato n. 1188).<P>
 
 </ul>
@@ -42,7 +42,7 @@
     ottenere l'esenzione dal bollilno SIAE per la distribuzione di
     software libero a titolo oneroso o gratuito.  <A
     HREF="/altri/semenzato-pieroni.shtml">Qui</A> il disegno di legge
-    Semenzato Pieroni sul diritto d'autore.  E non � finita.
+    Semenzato Pieroni sul diritto d'autore.  E non è finita.
 
   <p></p><li>
     <a href="/altri/adeos.shtml">Salutiamo</a> l'arrivo di ADEOS, kernel
diff --git a/test/etags/html-src/software.html 
b/test/etags/html-src/software.html
index 4d174c6..b5de1e6 100644
--- a/test/etags/html-src/software.html
+++ b/test/etags/html-src/software.html
@@ -6,14 +6,14 @@
     P    { text-indent: 0; text-align: justify }
     DD   { text-indent: 0; text-align: justify }
   --></STYLE>
-  <TITLE>Francesco Potort� Software Page</TITLE>
+  <TITLE>Francesco Potortì Software Page</TITLE>
   <LINK  REV="made" HREF="mailto:address@hidden";>
-  <META NAME="description" CONTENT="Home page of Francesco Potort�.">
+  <META NAME="description" CONTENT="Home page of Francesco Potortì.">
   <META NAME="keywords"
-        CONTENT="Potorti Potort� Potorti' Potorti`
+        CONTENT="Potorti Potortì Potorti' Potorti`
                 satellites MTG fracas simulator LEO MEO GEO
                 GNU emacs etags checkiso debian-bug">
-  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
 </HEAD><BODY>
 
 <CENTER>
diff --git a/test/etags/html-src/softwarelibero.html 
b/test/etags/html-src/softwarelibero.html
index 7aa74c5..1594329 100644
--- a/test/etags/html-src/softwarelibero.html
+++ b/test/etags/html-src/softwarelibero.html
@@ -1,27 +1,27 @@
 <DIV LANG="it" ALIGN="justify">
 
 <H2>
-  Cos'� il software libero?
+  Cos'è il software libero?
 </H2>
 
 <P>
   Il concetto di software libero discende naturalmente da quello di
-  libert� di scambio di idee e di informazioni.  Negli ambienti
-  scientifici, quest'ultimo principio � tenuto in alta considerazione
-  per la fecondit� che ha dimostrato; ad esso infatti � generalmente
+  libertà di scambio di idee e di informazioni.  Negli ambienti
+  scientifici, quest'ultimo principio è tenuto in alta considerazione
+  per la fecondità che ha dimostrato; ad esso infatti è generalmente
   attribuita molta parte dell'eccezionale ed imprevedibile crescita del
   sapere negli ultimi tre secoli.
 </P>
 <P>
-  La libert� di scambio di idee non � tuttavia una questione puramente
-  pratica: essa � anche alla base dei concetti di libert� di pensiero e
-  di espressione.  Analogamente alle idee, il software � immateriale, e
-  pu� essere riprodotto e trasmesso facilmente.  In modo simile a quanto
+  La libertà di scambio di idee non è tuttavia una questione puramente
+  pratica: essa è anche alla base dei concetti di libertà di pensiero e
+  di espressione.  Analogamente alle idee, il software è immateriale, e
+  può essere riprodotto e trasmesso facilmente.  In modo simile a quanto
   avviene per le idee, parte essenziale del processo che sostiene la
-  crescita e l'evoluzione del software � la sua libera diffusione.  Ed
-  ogni giorno di pi�, come le idee, il software permea il tessuto
+  crescita e l'evoluzione del software è la sua libera diffusione.  Ed
+  ogni giorno di più, come le idee, il software permea il tessuto
   sociale e lo influenza, produce effetti etici, economici, politici e
-  in un senso pi� generale culturali.
+  in un senso più generale culturali.
 </P>
 <P>
   Fu Richard M. Stallman, nei primi anni Ottanta, a formalizzare per la
@@ -30,34 +30,34 @@
   href="http://www.it.gnu.org/philosophy/free-sw.it.html";>definizione</A>
   di Stallman, che da subito assurse al ruolo di definizione per
   eccellenza di software libero, assume la forma di quattro principi di
-  libert�:
+  libertà:
 </P>
 <P>
 <DL>
-  <DT>Libert� 0, o libert� fondamentale:
-    <DD>La libert� di eseguire il programma per qualunque scopo, senza
+  <DT>Libertà 0, o libertà fondamentale:
+    <DD>La libertà di eseguire il programma per qualunque scopo, senza
     vincoli sul suo utilizzo.
 
-  <DT>Libert� 1:
-    <DD>La libert� di studiare il funzionamento del programma, e
+  <DT>Libertà 1:
+    <DD>La libertà di studiare il funzionamento del programma, e
     di adattarlo alle proprie esigenze.
 
-  <DT>Libert� 2:
-    <DD>La libert� di redistribuire copie del programma.
+  <DT>Libertà 2:
+    <DD>La libertà di redistribuire copie del programma.
 
-  <DT>Libert� 3:
-    <DD>La libert� di migliorare il programma, e di distribuirne
+  <DT>Libertà 3:
+    <DD>La libertà di migliorare il programma, e di distribuirne
     i miglioramenti.
 </DL>
 </P>
 <P>
-  Il software distribuito con una licenza che rispetti questi principi �
+  Il software distribuito con una licenza che rispetti questi principi è
   detto <Q><EM>software libero</EM></Q> (in inglese <Q><EM>free
   software</EM></Q>).  Nel 1984 Richard M. Stallman <A TITLE="storia
   del progetto GNU"
   HREF="http://www.it.gnu.org/gnu/thegnuproject.it.html";>diede vita al
   progetto GNU</A>, con lo scopo di tradurre in pratica il concetto di
-  software libero, e cre� la <Q>Free Software Foundation</Q> per
+  software libero, e creò la <Q>Free Software Foundation</Q> per
   dare supporto logistico, legale ed economico al progetto GNU.
 </P>
 
@@ -66,19 +66,19 @@
 </A></H3>
 
 <P>
-  La <EM>licenza d'uso</EM> � un documento legale generalmente
+  La <EM>licenza d'uso</EM> è un documento legale generalmente
   distribuito assieme a ogni programma. Essa, appoggiandosi alle norme
   sul diritto d'autore, specifica diritti e doveri di chi riceve tale
   programma.
 </P>
 <P>
   Gran parte delle licenze comunemente usate sono <EM>proprietarie</EM>,
-  cio� non libere, in quanto non garantiscono le quattro libert�. Quasi
+  cioè non libere, in quanto non garantiscono le quattro libertà. Quasi
   sempre tali licenze non consentono infatti la libera copia del
-  programma, n� la sua modifica.  Spesso, se il programma � installato
+  programma, né la sua modifica.  Spesso, se il programma è installato
   sul computer di casa, la licenza impedisce persino di installarlo sul
   proprio portatile (per utilizzare il programma fuori casa); se il
-  programma � utilizzato in uno studio professionale, non consente di
+  programma è utilizzato in uno studio professionale, non consente di
   tenerlo installato su un computer di riserva, nel caso che quello
   principale si guasti.
 </P>
@@ -87,50 +87,50 @@
   TITLE="traduzione della licenza GNU GPL"
   HREF="http://softwarelibero.it/gnudoc/gpl.it.txt";>GNU GPL</A>)</EM>,
   al contrario, concede all'utente del programma tutte e quattro le
-  libert� suddette.  Inoltre si occupa anche di proteggerle: chi
+  libertà suddette.  Inoltre si occupa anche di proteggerle: chi
   modifichi un programma protetto da GPL e lo distribuisca con tali
-  modifiche, deve distribuirlo sotto licenza GPL.  � grazie a questo
-  tipo di protezione che la GPL � attualmente la licenza pi� usata per
+  modifiche, deve distribuirlo sotto licenza GPL.  È grazie a questo
+  tipo di protezione che la GPL è attualmente la licenza più usata per
   il software libero.
 </P>
 <P>
   Con un gioco di parole, il nome dato a questo tipo di protezione
-  � <EM>permesso d'autore</EM> (in inglese <A TITLE="definizione di
+  è <EM>permesso d'autore</EM> (in inglese <A TITLE="definizione di
   copyleft (inglese)" LANG="en"
   HREF="http://www.it.gnu.org/copyleft/copyleft.html";><EM>copyleft</EM></A>):
-  � il criterio che prevede che le modifiche ad un programma possano
+  è il criterio che prevede che le modifiche ad un programma possano
   essere distribuite solo con la stessa licenza del programma originale.
   Le licenze proprietarie usano le norme sul diritto d'autore (copyright
-  in inglese) per togliere libert� agli utenti di un programma; il
-  permesso d'autore usa le stesse norme per garantire quelle libert� e
+  in inglese) per togliere libertà agli utenti di un programma; il
+  permesso d'autore usa le stesse norme per garantire quelle libertà e
   per proteggerle.
 </P>
 <P>
-  La GNU GPL non � unica nel suo genere.  Diverse <A TITLE="lista di
+  La GNU GPL non è unica nel suo genere.  Diverse <A TITLE="lista di
   licenze libere e non"
   HREF="http://www.it.gnu.org/licenses/license-list.it.html";>altre
-  licenze</A> garantiscono le quattro libert� e si possono pertanto
+  licenze</A> garantiscono le quattro libertà e si possono pertanto
   qualificare come licenze per il software libero.  Fra queste, merita
   una speciale menzione per la sua diffusione la <A TITLE="la licenza
   BSD (in inglese)" LANG="en"
   HREF="http://www.freebsd.org/copyright/license.html";>licenza BSD</A>,
-  la cui principale differenza dalla GPL � che, non essendo basata sul
+  la cui principale differenza dalla GPL è che, non essendo basata sul
   permesso d'autore, non ha fra i propri obiettivi quello di proteggere
-  la libert� del software cui � applicata.  Chi infatti modifichi un
-  programma protetto da BSD, pu� distribuirlo con le modifiche usando
+  la libertà del software cui è applicata.  Chi infatti modifichi un
+  programma protetto da BSD, può distribuirlo con le modifiche usando
   qualunque licenza.
 </P>
 <P>
   Sia BSD che GPL hanno pro e contro.  La licenza GPL riflette l'idea
-  della cooperazione: se io concedo ad altri la libert� di modificare e
+  della cooperazione: se io concedo ad altri la libertà di modificare e
   redistribuire il mio programma, costoro sono tenuti a concedere le
-  stesse libert� sulle loro modifiche.  Il problema � che alcuni vedono
+  stesse libertà sulle loro modifiche.  Il problema è che alcuni vedono
   questo vincolo come un'imposizione ingenerosa, se non addirittura una
   restrizione insopportabile.  La licenza BSD riflette l'idea del dono
-  liberale: chiunque pu� fare ci� che meglio crede del mio programma.
-  Il problema � che questo significa che chiunque pu� redistribuire
+  liberale: chiunque può fare ciò che meglio crede del mio programma.
+  Il problema è che questo significa che chiunque può redistribuire
   anche in forma chiusa con una licenza proprietaria un programma BSD
-  modificato, impedendo cos� ai propri acquirenti di modificarlo e
+  modificato, impedendo così ai propri acquirenti di modificarlo e
   redistribuirlo a loro volta.
 </P>
 
@@ -141,24 +141,24 @@
 <P>
 <DL>
 
-  <DT>Il software libero � gratuito
+  <DT>Il software libero è gratuito
 
-    <DD>� falso: la libert� del software non ha nulla a che vedere con
-    il suo prezzo.  Bench� gran parte del software libero pi� diffuso
+    <DD>È falso: la libertà del software non ha nulla a che vedere con
+    il suo prezzo.  Benché gran parte del software libero più diffuso
     sia distribuito gratuitamente, ci sono programmatori che vivono
     della vendita e della manutenzione dei programmi liberi da loro
     creati.
 
-  <DT>Il software gratuito � libero
+  <DT>Il software gratuito è libero
 
-    <DD>� falso.  Molti programmi proprietari vengono distribuiti
+    <DD>È falso.  Molti programmi proprietari vengono distribuiti
     gratuitamente.
 
-  <DT>Il software libero � privo di copyright
+  <DT>Il software libero è privo di copyright
 
-    <DD>� falso.  Bench� si possa rinunciare al copyright su un proprio
-    programma e renderlo cos� di pubblico dominio, la gran parte del
-    software libero � distribuito con una licenza.  Per esempio, sono
+    <DD>È falso.  Benché si possa rinunciare al copyright su un proprio
+    programma e renderlo così di pubblico dominio, la gran parte del
+    software libero è distribuito con una licenza.  Per esempio, sono
     licenze di copyright la licenza BSD e la GNU GPL, anche se per
     qualificare quest'ultima spesso si parla di permesso d'autore
     (copyleft).
@@ -167,17 +167,17 @@
   amministrazione, ma anche nei paesi poveri, ridurrebbe i costi
   relativi al software
 
-    <DD>Potrebbe essere vero, ma una seria valutazione dei costi � molto
+    <DD>Potrebbe essere vero, ma una seria valutazione dei costi è molto
     difficile.  Qualunque tipo di software, se usato in ambito non
     domestico, ha dei costi di manutenzione che sono solitamente
     maggiori del suo prezzo di acquisto.  I motivi per sostenere l'uso
     del software libero, specie in ambiti pubblici, riguardano anzitutto
-    la libert�, non il prezzo.
+    la libertà, non il prezzo.
 
 <!-- Discorso inadatto ad un documento introduttivo
   <DT>Chi scrive un programma libero lo deve pubblicare su Internet
 
-    <DD>� una falsa argomentazione spesso usata per scoraggiare
+    <DD>È una falsa argomentazione spesso usata per scoraggiare
     un'azienda dall'uso di una licenza libera per i suoi programmi.
     Sia gli autori che gli acquirenti di un programma libero hanno il
     diritto di distribuirlo a titolo oneroso o gratuito, ma non hanno
@@ -192,16 +192,16 @@
 </A></H3>
 
 <P>
-  Nel 1998 Bruce Perens, Eric Raymond e altre personalit� nel campo del
-  software libero si convinsero che i principi di libert� associati ad
+  Nel 1998 Bruce Perens, Eric Raymond e altre personalità nel campo del
+  software libero si convinsero che i principi di libertà associati ad
   esso fossero malvisti nel mondo degli affari, a causa della loro
-  carica ideologica.  Decisero perci� di evitare accuratamente ogni
+  carica ideologica.  Decisero perciò di evitare accuratamente ogni
   riferimento a considerazioni politiche o di principio, e di lanciare
   una campagna di promozione del software libero che ne mettesse in luce
   i numerosi <A TITLE="un discorso di Robert Chassell di FSF"
   HREF="http://softwarelibero.it/altri/economia-sl.shtml";>vantaggi
-  pratici</A>, come la facilit� di adattamento, l'affidabilit�, la
-  sicurezza, la conformit� agli standard, l'indipendenza dai singoli
+  pratici</A>, come la facilità di adattamento, l'affidabilità, la
+  sicurezza, la conformità agli standard, l'indipendenza dai singoli
   fornitori.  A tal fine scrissero la <Q><A TITLE="la definizione di
   Open Source (in inglese)" LANG="en"
   HREF="http://www.opensource.org/docs/definition.html";>Open Source
@@ -210,19 +210,19 @@
   HREF="http://opensource.org/";><EM>open source</EM></A>.
 </P>
 <P>
-  Il movimento open source fu un successo, e contribu� a sdoganare il
+  Il movimento open source fu un successo, e contribuì a sdoganare il
   concetto di software libero in campo aziendale, dove era guardato con
-  sospetto o condiscendenza.  Un esempio di questo successo �
+  sospetto o condiscendenza.  Un esempio di questo successo è
   l'atteggiamento dell'IBM, l'azienda che ha fatto di gran lunga i
   maggiori investimenti nel campo del software libero, la quale parla
   esclusivamente di open source, mai di software libero.
 </P>
 <P>
-  La voluta neutralit� del movimento open source verso gli aspetti
-  etici e politici del software libero � la caratteristica sostanziale
+  La voluta neutralità del movimento open source verso gli aspetti
+  etici e politici del software libero è la caratteristica sostanziale
   che lo distingue dalla filosofia del software libero, che al contrario
   pone l'accento sulle motivazioni ideali.  Parlare di software libero
-  piuttosto che di open source � una questione politica piuttosto che
+  piuttosto che di open source è una questione politica piuttosto che
   pratica; i due movimenti concordano infatti sulle licenze considerate
   accettabili, ed hanno obiettivi e mezzi comuni.
 </P>
@@ -235,7 +235,7 @@
   La <A TITLE="usi commerciali del software libero, di Alessandro
   Rubini"
   
HREF="http://www.it.gnu.org/philosophy/software-libre-commercial-viability.it.html";>rilevanza
-  economica</A> del software libero � ancora molto ridotta, ma � in
+  economica</A> del software libero è ancora molto ridotta, ma è in
   fortissima crescita ormai da alcuni anni, e tutto consente di supporre
   che tale crescita <A TITLE="prospettive del software libero, gruppo di
   studio dell'UE"
@@ -246,7 +246,7 @@
   tecnici ed economici</A> del software libero.
 </P>
 <P>
-  Ad oggi, il software libero � ampiamente diffuso in ambito accademico,
+  Ad oggi, il software libero è ampiamente diffuso in ambito accademico,
   industriale e fra gli appassionati di calcolatori, soprattutto grazie
   ai sistemi GNU/Linux.  Questi sistemi liberi sono disponibili a costi
   molto bassi, ben inferiori a quelli di analoghi sistemi proprietari.
@@ -254,40 +254,40 @@
   buona cultura di base nel campo del software.
 </P>
 <P>
-  In ambito accademico viene molto apprezzata la possibilit� di
+  In ambito accademico viene molto apprezzata la possibilità di
   personalizzare ogni parte del sistema, visto che i programmi liberi
-  sono liberamente modificabili (libert� numero uno).  In ambito
-  industriale, si apprezza l'affidabilit� dei sistemi liberi, dovuta al
+  sono liberamente modificabili (libertà numero uno).  In ambito
+  industriale, si apprezza l'affidabilità dei sistemi liberi, dovuta al
   fatto che quando un utente corregge un errore in un programma
-  solitamente rende disponibile la correzione agli altri utenti (libert�
+  solitamente rende disponibile la correzione agli altri utenti (libertà
   numero tre).  Gli appassionati di calcolatori apprezzano lo spirito di
   condivisione esistente fra gli utenti di software libero.
 </P>
 <P>
   Ma le implicazioni dell'uso del software libero non sono soltanto
-  tecniche ed economiche, perch� il software da tempo ormai � avviato ad
-  occupare un ruolo di primo piano nella nostra vita quotidiana, ed �
-  destinato a cambiare in maniera profonda la societ�.
+  tecniche ed economiche, perché il software da tempo ormai è avviato ad
+  occupare un ruolo di primo piano nella nostra vita quotidiana, ed è
+  destinato a cambiare in maniera profonda la società.
 </P>
 <P>
-  � per queste ragioni che la nostra libert� futura dipender� anche
-  dalla capacit� di ognuno di noi di controllare il software.  � per
-  queste ragioni che ai tradizionali principi di libert� sessuale, di
-  culto, di movimento, di espressione deve essere affiancata la libert�
-  del software.  � per queste ragioni che la nostra libert� futura
-  dipender� anche dall'uso di software libero.
+  È per queste ragioni che la nostra libertà futura dipenderà anche
+  dalla capacità di ognuno di noi di controllare il software.  È per
+  queste ragioni che ai tradizionali principi di libertà sessuale, di
+  culto, di movimento, di espressione deve essere affiancata la libertà
+  del software.  È per queste ragioni che la nostra libertà futura
+  dipenderà anche dall'uso di software libero.
 </P>
 
 <P>
   <EM>scritto da <A TITLE="address@hidden"
-  HREF="mailto:address@hidden";>Francesco Potort�</A> per l'<A
+  HREF="mailto:address@hidden";>Francesco Potortì</A> per l'<A
   TITLE="il sito dell'Associazione Software Libero"
   HREF="http://softwarelibero.it/";>Associazione Software
   Libero</A></EM>
 </P>
 <HR NOSHADE>
 <P>
-  Copyright &copy; 2002 Francesco Potort�
+  Copyright &copy; 2002 Francesco Potortì
   <BR>
   Ultima versione ipertestuale disponibile su <A TITLE="versione
   stampabile"
@@ -305,7 +305,7 @@ time-stamp-active: t
 time-stamp-time-zone: "GMT"
 time-stamp-format: "%:y-%02m-%02d"
 time-stamp-line-limit: 30
-time-stamp-start: "ultima\\s-+modifica\\s-+�\\s-+del\\s-+"
+time-stamp-start: "ultima\\s-+modifica\\s-+è\\s-+del\\s-+"
 time-stamp-end: "\\."
 End:
 -->



reply via email to

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