texlive[56785] Master/texmf-dist: l3 (27oct20)

commits+karl at tug.org commits+karl at tug.org
Tue Oct 27 21:55:43 CET 2020


Revision: 56785
          http://tug.org/svn/texlive?view=revision&revision=56785
Author:   karl
Date:     2020-10-27 21:55:42 +0100 (Tue, 27 Oct 2020)
Log Message:
-----------
l3 (27oct20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3packages/README.md
    trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
    trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2020-10-27 20:55:42 UTC (rev 56785)
@@ -7,6 +7,8 @@
 
 ## [Unreleased]
 
+## [2020-10-27]
+
 ### Changed
 - Use Lua pseudo-primitives instead of `\directlua`
 
@@ -182,7 +184,8 @@
 - New `l3color` module using `xcolor`-like expression syntax
 - New `l3draw` module, based on `pgf` layer of the TikZ system
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-09-24...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-10-27...HEAD
+[2020-10-27]: https://github.com/latex3/latex3/compare/2020-09-24...2020-10-27
 [2020-09-24]: https://github.com/latex3/latex3/compare/2020-09-11...2020-09-24
 [2020-09-11]: https://github.com/latex3/latex3/compare/2020-09-01...2020-09-11
 [2020-09-01]: https://github.com/latex3/latex3/compare/2020-08-07...2020-09-01

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2020-10-27 20:55:42 UTC (rev 56785)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2020-09-24
+Release 2020-10-27
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2020-10-27 20:55:42 UTC (rev 56785)
@@ -7,13 +7,26 @@
 
 ## [Unreleased]
 
+## [2020-10-27]
+
+### Added
+
+-  `\token_if_font_selection:N(TF)` (see #806)
+
 ### Fixed
-- Correctly detect LaTeX when pre-loading expl3 and setting up
-  case changer
+- Avoid relying on braced `\input` primitive syntax
+- Correct expansion of environments in `\text_purify:n`
+- Some aspects of `cctab` setup with 8-bit engines(issue #814)
 
+### Changed
+- Improved performance for `tl` functions
+- Extend case changer to cover all of Greek with pdfTeX
+
 ## [2020-10-05]
 
 ### Fixed
+- Correctly detect LaTeX when pre-loading expl3 and setting up
+  case changer
 - Lua emulation of \strcmp (issue #813)
 
 ## [2020-09-24]
@@ -780,7 +793,8 @@
 - Step func­tions have been added for dim vari­ables,
   e.g. `\dim_step_in­line:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-10-05...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-10-27...HEAD
+[2020-10-27]: https://github.com/latex3/latex3/compare/2020-10-05...2020-10-27
 [2020-10-05]: https://github.com/latex3/latex3/compare/2020-09-24...2020-10-05
 [2020-09-24]: https://github.com/latex3/latex3/compare/2020-09-06...2020-09-24
 [2020-09-06]: https://github.com/latex3/latex3/compare/2020-09-03...2020-09-06

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2020-10-27 20:55:42 UTC (rev 56785)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2020-10-05
+Release 2020-10-27
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2020-10-05}
+\date{Released 2020-10-27}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-10-05}
+\date{Released 2020-10-27}
 
 \begin{document}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-10-05}
+\date{Released 2020-10-27}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-10-05}
+\date{Released 2020-10-27}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2020-10-05}
+\date{Released 2020-10-27}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2020-10-27 20:55:42 UTC (rev 56785)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2020-10-27]
+
+### Changed
+- Avoid relying on braced `\input` primitive syntax
+
 ## [2020-10-05]
 
 ### Changed
@@ -108,7 +113,8 @@
 - Switch to ISO date format
 - Improve cross-module use of internal functions
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-10-05...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-10-27...HEAD
+[2020-10-27]: https://github.com/latex3/latex3/compare/2020-10-05...2020-10-27
 [2020-10-05]: https://github.com/latex3/latex3/compare/2020-05-15...2020-10-05
 [2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15
 [2020-05-14]: https://github.com/latex3/latex3/compare/2020-03-06...2020-05-14

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2020-10-27 20:55:42 UTC (rev 56785)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2020-10-05
+Release 2020-10-27
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -129,7 +129,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2020-09-24}{}
+\ProvidesExplPackage{l3benchmark}{2020-10-27}{}
   {L3 Experimental benchmarking}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -421,7 +421,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3color}{2020-09-24}{}
+\ProvidesExplPackage{l3color}{2020-10-27}{}
   {L3 Experimental color support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -110,7 +110,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1136,7 +1136,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2020-09-24}{}
+\ProvidesExplPackage{l3draw}{2020-10-27}{}
   {L3 Experimental core drawing support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -240,7 +240,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2020-09-24}{}
+\ProvidesExplPackage{l3graphics}{2020-10-27}{}
   {L3 Experimental graphics inclusion support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -190,7 +190,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3pdf}{2020-09-24}{}
+\ProvidesExplPackage{l3pdf}{2020-10-27}{}
   {L3 Experimental core PDF support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -48,7 +48,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -166,7 +166,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2020-09-24}{}
+\ProvidesExplPackage{l3str-format}{2020-10-27}{}
   {L3 Experimental string formatting}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -135,7 +135,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2020-09-24}{}
+\ProvidesExplPackage{l3sys-shell}{2020-10-27}{}
   {L3 Experimental system shell functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -56,7 +56,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -675,7 +675,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2020-09-24}{}
+\ProvidesExplPackage{xcoffins}{2020-10-27}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -686,7 +686,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2020-09-24}{}
+\ProvidesExplPackage{l3galley}{2020-10-27}{}
   {L3 Experimental galley code}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-09-24}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -734,7 +734,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2020-09-24}{}
+\ProvidesExplPackage{xgalley}{2020-10-27}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-10-05}%
+\def\ExplFileDate{2020-10-27}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1242,7 +1242,7 @@
 \else
   \expandafter\@gobble
 \fi
-  {\input{expl3-code.tex}}%
+  {\input expl3-code.tex }%
 %    \end{macrocode}
 %
 % A check that the bootstrap code did not abort loading: if it did,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1115,9 +1115,9 @@
 %   hence in the \texttt{x}-expanding assignment.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_filter:NNn
-  { \@@_set_filter:NNNn \tl_set:Nx }
+  { \@@_set_filter:NNNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_filter:NNn
-  { \@@_set_filter:NNNn \tl_gset:Nx }
+  { \@@_set_filter:NNNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_set_filter:NNNn #1#2#3#4
   {
     \@@_push_item_def:n { \bool_if:nT {#4} { \@@_wrap_item:n {##1} } }
@@ -1133,9 +1133,9 @@
 %   Set \cs{@@_item:n} then map it using the loop code.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_from_inline_x:Nnn
-  { \@@_set_from_inline_x:NNnn \tl_set:Nx }
+  { \@@_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
-  { \@@_set_from_inline_x:NNnn \tl_gset:Nx }
+  { \@@_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_set_from_inline_x:NNnn #1#2#3#4
   {
     \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
@@ -1438,7 +1438,7 @@
 %   trick to wrap all the \meta{right} parts together.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_build_get:NN
-  { \@@_build_get:NNN \tl_set:Nx }
+  { \@@_build_get:NNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \@@_build_get:NNN #1#2#3
   { #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
 \cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
@@ -1463,12 +1463,12 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_build_end:N #1
   {
-    \@@_build_get:NNN \tl_set:Nx #1 #1
+    \@@_build_get:NNN \__kernel_tl_set:Nx #1 #1
     \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
   }
 \cs_new_protected:Npn \tl_build_gend:N #1
   {
-    \@@_build_get:NNN \tl_gset:Nx #1 #1
+    \@@_build_get:NNN \__kernel_tl_gset:Nx #1 #1
     \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
   }
 \cs_new_protected:Npn \@@_build_end_loop:NN #1#2

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -766,7 +766,7 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_document_cctab, \c_other_cctab}
+% \begin{variable}{\c_code_cctab, \c_document_cctab}
 %  To pick up document-level category codes, we need to delay set up to the
 %  end of the format, where that's possible. Also, as there are a \emph{lot}
 %  of category codes to set, we avoid using the official interface and store the
@@ -808,6 +808,9 @@
       \char_set_catcode_group_end:n        { 125 } % right brace
       \char_set_catcode_space:n            { 126 } % tilde
       \char_set_catcode_invalid:n          { 127 } % ^^?
+      \bool_lazy_or:nnF
+        { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+        { \int_step_function:nnN { 128 } { 255 } \char_set_catcode_active:n }
       \@@_gset:n { \c_code_cctab }
     \group_end:
     \cctab_const:Nn \c_document_cctab

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1026,9 +1026,9 @@
 %   in the case of an empty comma-list.
 %    \begin{macrocode}
 \cs_new_protected:Npn \clist_set_from_seq:NN
-  { \@@_set_from_seq:NNNN \clist_clear:N  \tl_set:Nx  }
+  { \@@_set_from_seq:NNNN \clist_clear:N  \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \clist_gset_from_seq:NN
-  { \@@_set_from_seq:NNNN \clist_gclear:N \tl_gset:Nx }
+  { \@@_set_from_seq:NNNN \clist_gclear:N \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_set_from_seq:NNNN #1#2#3#4
   {
     \seq_if_empty:NTF #4
@@ -1067,9 +1067,9 @@
 %   a little work to do.
 %    \begin{macrocode}
 \cs_new_protected:Npn \clist_concat:NNN
-  { \@@_concat:NNNN \tl_set:Nx }
+  { \@@_concat:NNNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \clist_gconcat:NNN
-  { \@@_concat:NNNN \tl_gset:Nx }
+  { \@@_concat:NNNN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_concat:NNNN #1#2#3#4
   {
     #1 #2
@@ -1114,9 +1114,9 @@
 %   }
 %    \begin{macrocode}
 \cs_new_protected:Npn \clist_set:Nn #1#2
-  { \tl_set:Nx #1 { \@@_sanitize:n {#2} } }
+  { \__kernel_tl_set:Nx #1 { \@@_sanitize:n {#2} } }
 \cs_new_protected:Npn \clist_gset:Nn #1#2
-  { \tl_gset:Nx #1 { \@@_sanitize:n {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \@@_sanitize:n {#2} } }
 \cs_generate_variant:Nn \clist_set:Nn  { NV , No , Nx , c , cV , co , cx }
 \cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx }
 %    \end{macrocode}
@@ -1240,9 +1240,9 @@
 %   result can safely be an empty comma list.
 %    \begin{macrocode}
 \cs_new_protected:Npn \clist_pop:NN
-  { \@@_pop:NNN \tl_set:Nx }
+  { \@@_pop:NNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \clist_gpop:NN
-  { \@@_pop:NNN \tl_gset:Nx }
+  { \@@_pop:NNN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_pop:NNN #1#2#3
   {
     \if_meaning:w #2 \c_empty_clist
@@ -1287,9 +1287,9 @@
   }
 \prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF }
-  { \@@_pop_TF:NNN \tl_set:Nx #1 #2 }
+  { \@@_pop_TF:NNN \__kernel_tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF }
-  { \@@_pop_TF:NNN \tl_gset:Nx #1 #2 }
+  { \@@_pop_TF:NNN \__kernel_tl_gset:Nx #1 #2 }
 \cs_new_protected:Npn \@@_pop_TF:NNN #1#2#3
   {
     \if_meaning:w #2 \c_empty_clist
@@ -1416,9 +1416,9 @@
 %   the second step removes it.
 %    \begin{macrocode}
 \cs_new_protected:Npn \clist_remove_all:Nn
-  { \@@_remove_all:NNNn \clist_set_from_seq:NN \tl_set:Nx }
+  { \@@_remove_all:NNNn \clist_set_from_seq:NN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \clist_gremove_all:Nn
-  { \@@_remove_all:NNNn \clist_gset_from_seq:NN \tl_gset:Nx }
+  { \@@_remove_all:NNNn \clist_gset_from_seq:NN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_remove_all:NNNn #1#2#3#4
   {
     \@@_if_wrap:nTF {#4}
@@ -1472,9 +1472,9 @@
 %   \texttt{N}-type comma lists, but the slow-down is not too bad.
 %    \begin{macrocode}
 \cs_new_protected:Npn \clist_reverse:N #1
-  { \tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
+  { \__kernel_tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
 \cs_new_protected:Npn \clist_greverse:N #1
-  { \tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
+  { \__kernel_tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
 \cs_generate_variant:Nn \clist_reverse:N { c }
 \cs_generate_variant:Nn \clist_greverse:N { c }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -2240,7 +2240,7 @@
   { \AtBeginDocument }
   { \use:n }
   {
-    \tl_set:Nx \l_@@_display_font_tl
+    \__kernel_tl_set:Nx \l_@@_display_font_tl
       {
         \cs_if_exist:NT \sffamily { \exp_not:N \sffamily }
         \cs_if_exist:NT \tiny { \exp_not:N \tiny }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -220,7 +220,7 @@
   }
 \cs_set_protected:Npn \debug_resume:
   {
-    \tl_set:Nx \l_@@_suspended_tl
+    \__kernel_tl_set:Nx \l_@@_suspended_tl
       { \tl_tail:N \l_@@_suspended_tl }
     \tl_if_empty:NT \l_@@_suspended_tl
       {
@@ -510,11 +510,11 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_generate_parameter_list:NNN #1#2#3
   {
-    \tl_set:Nx \l_@@_internal_tl
+    \__kernel_tl_set:Nx \l_@@_internal_tl
       { \exp_last_unbraced:Nf \use_ii:nnn \cs_split_function:N #1 }
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       { \exp_args:NV \@@_build_parm_text:n \l_@@_internal_tl }
-    \tl_set:Nx #3
+    \__kernel_tl_set:Nx #3
       { \exp_args:NV \@@_build_arg_list:n \l_@@_internal_tl }
   }
 \cs_new:Npn \@@_build_parm_text:n #1
@@ -788,6 +788,12 @@
 % \tracingnone
 %    \end{macrocode}
 %
+%
+%    \begin{macrocode}
+\cs_gset_protected:Npn \__kernel_tl_set:Nx  { \cs_set_nopar:Npx }
+\cs_gset_protected:Npn \__kernel_tl_gset:Nx { \cs_gset_nopar:Npx }
+%    \end{macrocode}
+%
 % Patching where the first argument to a function needs scope-checking:
 % either local or global (so two lists).
 %    \begin{macrocode}
@@ -831,9 +837,7 @@
       \skip_set_eq:NN
       \skip_add:Nn
       \skip_sub:Nn
-      \tl_set:Nn
-      \tl_set:No
-      \tl_set:Nx
+      \__kernel_tl_set:Nx
       \tl_set_eq:NN
       \tl_put_left:Nn
       \tl_put_left:NV
@@ -895,9 +899,7 @@
       \skip_gset_eq:NN
       \skip_gadd:Nn
       \skip_gsub:Nn
-      \tl_gset:Nn
-      \tl_gset:No
-      \tl_gset:Nx
+      \__kernel_tl_gset:Nx
       \tl_gset_eq:NN
       \tl_gput_left:Nn
       \tl_gput_left:NV
@@ -1053,7 +1055,7 @@
     {
       \@@_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn
       \group_begin:
-        \tl_set:Nx \l_@@_internal_a_tl
+        \__kernel_tl_set:Nx \l_@@_internal_a_tl
           { \@@_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
         \use_none:nnn
     }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -747,7 +747,7 @@
     \group_begin:
       \file_get:nnN {#3} {#2} \l_@@_internal_a_tl
       #2 \scan_stop:
-      \tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
+      \__kernel_tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
     \exp_args:NNNo \group_end:
     \tl_set:Nn #1 \l_@@_internal_a_tl
   }
@@ -758,7 +758,7 @@
     \group_begin:
       \file_get:nnN {#3} {#2} \l_@@_internal_a_tl
       #2 \scan_stop:
-      \tl_gset:Nx #1 { \l_@@_internal_a_tl }
+      \__kernel_tl_gset:Nx #1 { \l_@@_internal_a_tl }
     \group_end:
   }
 \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 % \maketitle
 % \tableofcontents
 %
@@ -1008,7 +1008,7 @@
 \cs_new_protected:Npn \@@_trim_right:Nn #1#2
   {
     \cs_set:Npn \@@_tmp:w ##1 #2 ##2 \q_stop { \exp_not:n {##1} }
-    \tl_set:Nx #1 { \exp_after:wN \@@_tmp:w #1 #2 \q_stop }
+    \__kernel_tl_set:Nx #1 { \exp_after:wN \@@_tmp:w #1 #2 \q_stop }
   }
 \cs_generate_variant:Nn \@@_trim_right:Nn { No }
 %    \end{macrocode}
@@ -1228,7 +1228,7 @@
     \@@_if_almost_str:nTF {#1}
       {
         \@@_key_get_base_TF:nN {#1} \l_@@_tmpa_tl
-        \tl_set:Nx #2
+        \__kernel_tl_set:Nx #2
           { \@@_split_function_do:on \l_@@_tmpa_tl { \@@_base_form_aux:nnN } }
       }
       { \tl_set:Nn #2 {#1} }
@@ -1235,7 +1235,7 @@
   }
 \cs_new:Npx \@@_key_get_base_TF:nN #1#2
   {
-    \tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
+    \__kernel_tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
     \tl_if_in:NoF #2 { \tl_to_str:n {:} }
       { \exp_not:N \prg_break: }
     \tl_if_in:onT { #2 z } { \tl_to_str:n {TF} z }
@@ -1992,7 +1992,7 @@
         \verbatim at font
         \@@_if_almost_str:VT \l_@@_cmd_tl
           {
-            \tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl }
+            \__kernel_tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl }
             \bool_if:NT \g_@@_cs_break_bool
               {
                 \regex_replace_all:nnN
@@ -2012,7 +2012,7 @@
       {
         \quark_if_no_value:NF \l_@@_cmd_index_tl
           {
-            \tl_set:Nx \l_@@_cmd_tl
+            \__kernel_tl_set:Nx \l_@@_cmd_tl
               { \c_backslash_str \exp_not:o { \l_@@_cmd_index_tl } }
           }
 
@@ -2019,7 +2019,7 @@
         \exp_args:No \@@_key_get:n { \l_@@_cmd_tl }
         \quark_if_no_value:NF \l_@@_cmd_module_tl
           {
-            \tl_set:Nx \l_@@_index_module_tl
+            \__kernel_tl_set:Nx \l_@@_index_module_tl
               { \tl_to_str:N \l_@@_cmd_module_tl }
           }
         \@@_special_index_module:ooonN
@@ -2134,7 +2134,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_get_hyper_target:nN #1#2
   {
-    \tl_set:Nx #2 { \tl_to_str:n {#1} }
+    \__kernel_tl_set:Nx #2 { \tl_to_str:n {#1} }
     \tl_replace_all:Nxn #2 { \c_underscore_str } { / }
     \tl_remove_all:Nx   #2 { \c_backslash_str }
     \tl_put_left:Nn #2 { doc/function// }
@@ -2157,7 +2157,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_names_get_seq:nN #1#2
   {
-    \tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:n {#1} }
+    \__kernel_tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:n {#1} }
     \bool_if:NTF \l_@@_names_verb_bool
       {
         \seq_clear:N #2
@@ -3045,7 +3045,7 @@
           \l_@@_macro_do_not_index_tl
         \exp_args:NNV \seq_set_from_clist:Nn
           \l_@@_tmpa_seq \l_@@_macro_do_not_index_tl
-        \tl_set:Nx \l_@@_macro_do_not_index_tl
+        \__kernel_tl_set:Nx \l_@@_macro_do_not_index_tl
           { \seq_use:Nn \l_@@_tmpa_seq { , } }
         \exp_args:NV \DoNotIndex \l_@@_macro_do_not_index_tl
       }
@@ -4228,7 +4228,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_special_index_set:Nn #1#2
   {
-    \tl_set:Nx #1 { \tl_to_str:n {#2} }
+    \__kernel_tl_set:Nx #1 { \tl_to_str:n {#2} }
     \@@_if_almost_str:nTF {#2}
       {
         \tl_replace_all:Non #1 { \tl_to_str:n { __ } }
@@ -4246,7 +4246,7 @@
                 \token_to_str:N \verb * \verbatimchar
               }
           }
-        \tl_set:Nx #1
+        \__kernel_tl_set:Nx #1
           {
             \token_to_str:N \verb * \verbatimchar
             #1 \verbatimchar
@@ -4297,7 +4297,7 @@
 \cs_new_protected:Npn \@@_key_get:n #1
   {
     \@@_key_get_base:nN {#1} \l_@@_index_macro_tl
-    \tl_set:Nx \l_@@_index_key_tl
+    \__kernel_tl_set:Nx \l_@@_index_key_tl
       { \tl_to_str:N \l_@@_index_macro_tl }
     \tl_clear:N \l_@@_index_module_tl
     \tl_if_in:NoTF \l_@@_index_key_tl { \tl_to_str:n { __ } }
@@ -4320,7 +4320,7 @@
   }
 \cs_new_protected:Npn \@@_key_pop:
   {
-    \tl_set:Nx \l_@@_index_key_tl
+    \__kernel_tl_set:Nx \l_@@_index_key_tl
       { \tl_tail:N \l_@@_index_key_tl }
   }
 %    \end{macrocode}
@@ -4335,7 +4335,7 @@
   {
     \cs_set:Npn \@@_tmpa:w ##1 #1 ##2 \q_stop
       { \exp_not:n {##1} }
-    \tl_set:Nx \l_@@_index_module_tl
+    \__kernel_tl_set:Nx \l_@@_index_module_tl
       { \exp_after:wN \@@_tmpa:w \l_@@_index_module_tl #1 \q_stop }
   }
 \cs_new_protected:Npn \@@_key_drop_underscores:
@@ -4396,7 +4396,7 @@
           {
             \seq_set_split:NoV \l_@@_tmpa_seq
               { \token_to_str:N _ } \l_@@_index_key_tl
-            \tl_set:Nx \l_@@_index_module_tl
+            \__kernel_tl_set:Nx \l_@@_index_module_tl
               {
                 \int_case:nnF { \seq_count:N \l_@@_tmpa_seq }
                   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1074,7 +1074,7 @@
       { \@@_open_stream:Nn #1 {#2} }
       {
         \@@_new:N #1
-        \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
+        \__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
         \@@_open_stream:Nn #1 {#2}
       }
   }
@@ -1475,7 +1475,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \iow_open:Nn #1#2
   {
-    \tl_set:Nx \l_@@_file_name_tl
+    \__kernel_tl_set:Nx \l_@@_file_name_tl
       { \__kernel_file_name_sanitize:n {#2} }
     \iow_close:N #1
     \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
@@ -1482,7 +1482,7 @@
       { \@@_open_stream:NV #1 \l_@@_file_name_tl }
       {
         \@@_new:N #1
-        \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
+        \__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
         \@@_open_stream:NV #1 \l_@@_file_name_tl
       }
   }
@@ -1684,7 +1684,7 @@
 \cs_new:Npn \@@_unindent:w { }
 \cs_new_protected:Npn \@@_set_indent:n #1
   {
-    \tl_set:Nx \l_@@_one_indent_tl
+    \__kernel_tl_set:Nx \l_@@_one_indent_tl
       { \exp_args:No \__kernel_str_to_other_fast:n { \tl_to_str:n {#1} } }
     \int_set:Nn \l_@@_one_indent_int
       { \str_count:N \l_@@_one_indent_tl }
@@ -1861,7 +1861,7 @@
 %   \cs{iow_wrap:nnnN}.
 %    \begin{macrocode}
       \cs_set_eq:NN \protect \token_to_str:N
-      \tl_set:Nx \l_@@_wrap_tl {#1}
+      \__kernel_tl_set:Nx \l_@@_wrap_tl {#1}
       \cs_set_eq:NN \iow_allow_break: \@@_allow_break_error:
       \cs_set_eq:NN \iow_indent:n \@@_indent_error:n
 %    \end{macrocode}
@@ -1869,8 +1869,8 @@
 %   then convert to a string) and initialize the target count for lines
 %   (the first line has target count \cs{l_iow_line_count_int} instead).
 %    \begin{macrocode}
-      \tl_set:Nx \l_@@_newline_tl { \iow_newline: #2 }
-      \tl_set:Nx \l_@@_newline_tl { \tl_to_str:N \l_@@_newline_tl }
+      \__kernel_tl_set:Nx \l_@@_newline_tl { \iow_newline: #2 }
+      \__kernel_tl_set:Nx \l_@@_newline_tl { \tl_to_str:N \l_@@_newline_tl }
       \int_set:Nn \l_@@_line_target_int
         { \l_iow_line_count_int - \str_count:N \l_@@_newline_tl + 1 }
 %    \end{macrocode}
@@ -1910,12 +1910,12 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_wrap_do:
   {
-    \tl_set:Nx \l_@@_wrap_tl
+    \__kernel_tl_set:Nx \l_@@_wrap_tl
       {
         \exp_args:No \__kernel_str_to_other_fast:n \l_@@_wrap_tl
         \c_@@_wrap_end_marker_tl
       }
-    \tl_set:Nx \l_@@_wrap_tl
+    \__kernel_tl_set:Nx \l_@@_wrap_tl
       {
         \exp_after:wN \@@_wrap_fix_newline:w \l_@@_wrap_tl
           ^^J \q_@@_nil ^^J \s_@@_stop
@@ -2179,7 +2179,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_wrap_allow_break:n #1
   {
-    \tl_set:Nx \l_@@_line_tl
+    \__kernel_tl_set:Nx \l_@@_line_tl
       { \l_@@_line_tl \@@_wrap_trim:N \l_@@_line_part_tl }
     \bool_set_false:N \l_@@_line_break_bool
     \tl_if_empty:NTF \l_@@_line_part_tl
@@ -2210,7 +2210,7 @@
     \tl_put_right:Nx \l_@@_line_tl { \l_@@_line_part_tl }
     \bool_set_false:N \l_@@_line_break_bool
     \int_sub:Nn \l_@@_indent_int { \l_@@_one_indent_int }
-    \tl_set:Nx \l_@@_indent_tl
+    \__kernel_tl_set:Nx \l_@@_indent_tl
       { \exp_after:wN \@@_unindent:w \l_@@_indent_tl }
     \@@_wrap_chunk:nw {#1}
   }
@@ -2249,9 +2249,9 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_wrap_store_do:n #1
   {
-    \tl_set:Nx \l_@@_line_tl
+    \__kernel_tl_set:Nx \l_@@_line_tl
       { \l_@@_line_tl \l_@@_line_part_tl }
-    \tl_set:Nx \l_@@_wrap_tl
+    \__kernel_tl_set:Nx \l_@@_wrap_tl
       {
         \l_@@_wrap_tl
         \l_@@_newline_tl
@@ -2785,7 +2785,7 @@
 \cs_generate_variant:Nn \file_get_full_name:nN { V }
 \prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
   {
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       { \file_full_name:n {#1} }
     \tl_if_empty:NTF #2
       { \prg_return_false: }
@@ -2810,7 +2810,7 @@
   {
     \prg_set_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
       {
-        \tl_set:Nx \l_@@_base_name_tl
+        \__kernel_tl_set:Nx \l_@@_base_name_tl
           { \__kernel_file_name_sanitize:n {#1} }
         \@@_get_full_name_search:nN { } \use:n
         \seq_map_inline:Nn \l_file_search_path_seq
@@ -2845,7 +2845,7 @@
   }
 \cs_new_protected:Npn \@@_get_full_name_search:nN #1#2
   {
-    \tl_set:Nx \l_@@_full_name_tl
+    \__kernel_tl_set:Nx \l_@@_full_name_tl
       { \tl_to_str:n {#1} \l_@@_base_name_tl }
     \__kernel_ior_open:No \g_@@_internal_ior \l_@@_full_name_tl
     \ior_if_eof:NF \g_@@_internal_ior { #2 { \prg_break: } }
@@ -3000,7 +3000,7 @@
   { \@@_get_details:nnN {#1} { timestamp } #2 }
 \cs_new_protected:Npn \@@_get_details:nnN #1#2#3
   {
-    \tl_set:Nx #3
+    \__kernel_tl_set:Nx #3
       { \use:c { file_ #2 :n } {#1} }
     \tl_if_empty:NTF #3
       { \prg_return_false: }
@@ -3045,7 +3045,7 @@
 \prg_new_protected_conditional:Npnn \file_get_hex_dump:nnnN #1#2#3#4
   { T , F , TF }
   {
-    \tl_set:Nx #4
+    \__kernel_tl_set:Nx #4
       { \file_hex_dump:nnn {#1} {#2} {#3} }
     \tl_if_empty:NTF #4
       { \prg_return_false: }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 % \maketitle
 %
 % \begin{documentation}
@@ -80,9 +80,9 @@
 %   assignments.
 %    \begin{macrocode}
 \cs_new_protected:Npn \fp_set:Nn   #1#2
-  { \tl_set:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
+  { \__kernel_tl_set:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
 \cs_new_protected:Npn \fp_gset:Nn  #1#2
-  { \tl_gset:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
+  { \__kernel_tl_gset:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
 \cs_new_protected:Npn \fp_const:Nn #1#2
   { \tl_const:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
 \cs_generate_variant:Nn \fp_set:Nn {c}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1364,7 +1364,7 @@
 %
 % \begin{variable}[tested = m3fp-parse001]
 %   {em, ex, in, pt, pc, cm, mm, dd, cc, nd, nc, bp, sp}
-%   \newcommand{\unit}[1]{\text{\texttt{#1}}}
+%   \newcommand{\unit}[1]{\ifmmode\,\fi\text{\texttt{#1}}}
 %   Those units of measurement are equal to their values in \unit{pt},
 %   namely
 %   \begin{align*}
@@ -1378,7 +1378,7 @@
 %     1 \unit{nd} & = 0.375 \unit{mm} = 1.066978346456693 \unit{pt} \\
 %     1 \unit{nc} & = 12 \unit{nd} = 12.80374015748031 \unit{pt} \\
 %     1 \unit{bp} & = \frac{1}{72} \unit{in} = 1.00375 \unit{pt} \\
-%     1 \unit{sp} & = 2^{-16} \unit{pt} = 1.52587890625e-5 \unit{pt}.
+%     1 \unit{sp} & = 2^{-16} \unit{pt} = 1.52587890625 \times 10^{-5} \unit{pt}.
 %   \end{align*}
 %   The values of the (font-dependent) units \unit{em} and \unit{ex} are
 %   gathered from \TeX{} when the surrounding floating point expression

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -569,6 +569,15 @@
 %   only a single expansion.
 % \end{function}
 %
+% \begin{function}{\__kernel_tl_set:Nx, \__kernel_tl_gset:Nx}
+%   \begin{syntax}
+%     \cs{__kernel_tl_set:Nx} \meta{tl~var} \Arg{tokens}
+%   \end{syntax}
+%   Fully expands \meta{tokens} and assigns the result to \meta{tl~var}.
+%   \meta{tokens} must be given in braces and there must be no token between
+%   \meta{tl~var} and \meta{tokens}.
+% \end{function}
+%
 % \section{Kernel backend functions}
 %
 % These functions are required to pass information to the backend. The nature

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -2445,7 +2445,7 @@
   {
     \clist_clear:N \l_@@_unused_clist
     \@@_set_known:nnn {#2} {#3} {#4}
-    \tl_set:Nx #5 { \exp_not:o \l_@@_unused_clist }
+    \__kernel_tl_set:Nx #5 { \exp_not:o \l_@@_unused_clist }
     \tl_set:Nn \l_@@_unused_clist {#1}
   }
 \cs_new_protected:Npn \keys_set_known:nn #1#2
@@ -2523,7 +2523,7 @@
   {
     \clist_clear:N \l_@@_unused_clist
     \@@_set_filter:nnnn {#2} {#3} {#4} {#5}
-    \tl_set:Nx #6 { \exp_not:o \l_@@_unused_clist }
+    \__kernel_tl_set:Nx #6 { \exp_not:o \l_@@_unused_clist }
     \tl_set:Nn \l_@@_unused_clist {#1}
   }
 \cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
@@ -2622,7 +2622,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_set_keyval:nnn #1#2#3
   {
-    \tl_set:Nx \l_keys_path_str
+    \__kernel_tl_set:Nx \l_keys_path_str
       {
         \tl_if_blank:nF {#1}
           { #1 / }
@@ -2887,7 +2887,7 @@
   }
 \cs_new_protected:Npn \@@_store_unused_aux:
   {
-    \tl_set:Nx \l_@@_relative_tl
+    \__kernel_tl_set:Nx \l_@@_relative_tl
       { \exp_args:No \@@_trim_spaces:n \l_@@_relative_tl }
     \use:x
       {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1071,8 +1071,8 @@
 %   updated entry is placed at the same spot as the original \meta{key}
 %   in the property list, preserving the order of entries.
 %    \begin{macrocode}
-\cs_new_protected:Npn \prop_put:Nnn  { \@@_put:NNnn \tl_set:Nx }
-\cs_new_protected:Npn \prop_gput:Nnn { \@@_put:NNnn \tl_gset:Nx }
+\cs_new_protected:Npn \prop_put:Nnn  { \@@_put:NNnn \__kernel_tl_set:Nx }
+\cs_new_protected:Npn \prop_gput:Nnn { \@@_put:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_put:NNnn #1#2#3#4
   {
     \tl_set:Nn \l_@@_internal_tl
@@ -1108,9 +1108,9 @@
 %   convert the key to a string using \cs{tl_to_str:n}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \prop_put_if_new:Nnn
-  { \@@_put_if_new:NNnn \tl_set:Nx }
+  { \@@_put_if_new:NNnn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \prop_gput_if_new:Nnn
-  { \@@_put_if_new:NNnn \tl_gset:Nx }
+  { \@@_put_if_new:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_put_if_new:NNnn #1#2#3#4
   {
     \tl_set:Nn \l_@@_internal_tl

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1322,7 +1322,7 @@
   {
     \int_compare:nNnTF \l_@@_curr_catcode_int = 0
       {
-        \tl_set:Nx \l_@@_internal_a_tl
+        \__kernel_tl_set:Nx \l_@@_internal_a_tl
           { \scan_stop: \@@_curr_cs_to_str: \scan_stop: }
         \tl_if_in:noTF { \scan_stop: #1 \scan_stop: }
           \l_@@_internal_a_tl
@@ -1348,7 +1348,7 @@
     \int_compare:nNnT \l_@@_curr_catcode_int = 0
       {
         \group_begin:
-          \tl_set:Nx \l_@@_cs_name_tl { \@@_curr_cs_to_str: }
+          \__kernel_tl_set:Nx \l_@@_cs_name_tl { \@@_curr_cs_to_str: }
           \@@_single_match:
           \@@_disable_submatches:
           \@@_build_for_cs:n {#1}
@@ -1515,7 +1515,7 @@
       \cs_set:Npn \@@_escape_escaped:N ##1 { #2 }
       \cs_set:Npn \@@_escape_raw:N ##1 { #3 }
       \@@_standard_escapechar:
-      \tl_gset:Nx \g_@@_internal_tl
+      \__kernel_tl_gset:Nx \g_@@_internal_tl
         { \__kernel_str_to_other_fast:n {#4} }
       \tl_put_right:Nx \l_@@_internal_a_tl
         {
@@ -2888,12 +2888,12 @@
     \@@_two_if_eq:NNNNTF #5 #6 \@@_compile_special:N ^
       {
         \bool_set_false:N \l_@@_internal_bool
-        \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
+        \__kernel_tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
           \@@_compile_class_posix_loop:w
       }
       {
         \bool_set_true:N \l_@@_internal_bool
-        \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
+        \__kernel_tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
           \@@_compile_class_posix_loop:w #5 #6
       }
   }
@@ -3274,7 +3274,7 @@
   {
     \@@_compile_end:
     \flag_clear:n { @@_cs }
-    \tl_set:Nx \l_@@_internal_a_tl
+    \__kernel_tl_set:Nx \l_@@_internal_a_tl
       {
         \exp_after:wN \@@_compile_cs_aux:Nn \l_@@_internal_regex
         \q_@@_nil \q_@@_nil \q_@@_recursion_stop
@@ -3354,7 +3354,7 @@
       {
         \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N \c_left_brace_str
           {
-            \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
+            \__kernel_tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
             \@@_compile_u_loop:NN
           }
           {
@@ -3411,7 +3411,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compile_u_in_cs:
   {
-    \tl_gset:Nx \g_@@_internal_tl
+    \__kernel_tl_gset:Nx \g_@@_internal_tl
       {
         \exp_args:No \__kernel_str_to_other_fast:n
           { \l_@@_internal_a_tl }
@@ -6225,7 +6225,7 @@
             \@@_replacement_balance_one_match:n
               { \l_@@_zeroth_submatch_int }
           }
-        \tl_set:Nx \l_@@_internal_a_tl
+        \__kernel_tl_set:Nx \l_@@_internal_a_tl
           {
             \@@_replacement_do_one_match:n
               { \l_@@_zeroth_submatch_int }
@@ -6270,7 +6270,7 @@
             { \l_@@_submatch_int - 1 }
             \@@_replacement_balance_one_match:n
         }
-      \tl_set:Nx \l_@@_internal_a_tl
+      \__kernel_tl_set:Nx \l_@@_internal_a_tl
         {
           \int_step_function:nnnN
             { \l_@@_min_submatch_int }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1165,22 +1165,22 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_from_clist:NN #1#2
   {
-    \tl_set:Nx #1
+    \__kernel_tl_set:Nx #1
       { \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n }
   }
 \cs_new_protected:Npn \seq_set_from_clist:Nn #1#2
   {
-    \tl_set:Nx #1
+    \__kernel_tl_set:Nx #1
       { \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n }
   }
 \cs_new_protected:Npn \seq_gset_from_clist:NN #1#2
   {
-    \tl_gset:Nx #1
+    \__kernel_tl_gset:Nx #1
       { \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n }
   }
 \cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2
   {
-    \tl_gset:Nx #1
+    \__kernel_tl_gset:Nx #1
       { \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n }
   }
 \cs_generate_variant:Nn \seq_set_from_clist:NN  {     Nc }
@@ -1238,9 +1238,9 @@
 %   braces which are outermost after space trimming.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_split:Nnn
-  { \@@_set_split:NNnn \tl_set:Nx }
+  { \@@_set_split:NNnn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_split:Nnn
-  { \@@_set_split:NNnn \tl_gset:Nx }
+  { \@@_set_split:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_set_split:NNnn #1#2#3#4
   {
     \tl_if_empty:nTF {#3}
@@ -1260,7 +1260,7 @@
             \@@_set_split_end:
             \@@_set_split_auxi:w \prg_do_nothing:
           }
-        \tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
+        \__kernel_tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
       }
     #1 #2 { \s_@@ \l_@@_internal_a_tl }
   }
@@ -1329,7 +1329,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_put_left:Nn #1#2
   {
-    \tl_set:Nx #1
+    \__kernel_tl_set:Nx #1
       {
         \exp_not:n { \s_@@ \@@_item:n {#2} }
         \exp_not:f { \exp_after:wN \@@_put_left_aux:w #1 }
@@ -1337,7 +1337,7 @@
   }
 \cs_new_protected:Npn \seq_gput_left:Nn #1#2
   {
-    \tl_gset:Nx #1
+    \__kernel_tl_gset:Nx #1
       {
         \exp_not:n { \s_@@ \@@_item:n {#2} }
         \exp_not:f { \exp_after:wN \@@_put_left_aux:w #1 }
@@ -1448,9 +1448,9 @@
 %   \texttt{x}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_remove_all:Nn
-  { \@@_remove_all_aux:NNn \tl_set:Nx }
+  { \@@_remove_all_aux:NNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gremove_all:Nn
-  { \@@_remove_all_aux:NNn \tl_gset:Nx }
+  { \@@_remove_all_aux:NNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_remove_all_aux:NNn #1#2#3
   {
     \@@_push_item_def:n
@@ -1515,9 +1515,9 @@
 %   from the stack, and the memory consumption becomes linear.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_reverse:N
-  { \@@_reverse:NN \tl_set:Nx }
+  { \@@_reverse:NN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_greverse:N
-  { \@@_reverse:NN \tl_gset:Nx }
+  { \@@_reverse:NN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_reverse:NN #1 #2
   {
     \cs_set_eq:NN \@@_tmp:w \@@_item:n
@@ -1704,7 +1704,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_get_left:NN #1#2
   {
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       {
         \exp_after:wN \@@_get_left:wnw
         #1 \@@_item:n { \q_no_value } \s_@@_stop
@@ -1756,7 +1756,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_get_right:NN #1#2
   {
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       {
         \exp_after:wN \use_i_ii:nnn
         \exp_after:wN \@@_get_right_loop:nw
@@ -1797,9 +1797,9 @@
 %   finally stops the loop.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_pop_right:NN
-  { \@@_pop:NNNN \@@_pop_right:NNN \tl_set:Nx }
+  { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gpop_right:NN
-  { \@@_pop:NNNN \@@_pop_right:NNN \tl_gset:Nx }
+  { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_pop_right:NNN #1#2#3
   {
     \cs_set_eq:NN \@@_tmp:w \@@_item:n
@@ -1811,7 +1811,7 @@
         #2
         {
           \if_false: { \fi: }
-          \tl_set:Nx #3
+          \__kernel_tl_set:Nx #3
         }
         { } \use_none:nn
     \cs_set_eq:NN \@@_item:n \@@_tmp:w
@@ -1859,10 +1859,10 @@
   { \@@_pop_TF:NNNN \@@_pop_left:NNN \tl_gset:Nn #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2
   { T , F , TF }
-  { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_set:Nx #1 #2 }
+  { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2
   { T , F , TF }
-  { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_gset:Nx #1 #2 }
+  { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Nx #1 #2 }
 \prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c }
   { T , F , TF }
 \prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c }
@@ -2123,9 +2123,9 @@
 %   semantics.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_map_x:NNn
-  { \@@_set_map_x:NNNn \tl_set:Nx }
+  { \@@_set_map_x:NNNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_map_x:NNn
-  { \@@_set_map_x:NNNn \tl_gset:Nx }
+  { \@@_set_map_x:NNNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
   {
     \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
@@ -2142,9 +2142,9 @@
 %   <inline function>.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_map:NNn
-  { \@@_set_map:NNNn \tl_set:Nx }
+  { \@@_set_map:NNNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_map:NNn
-  { \@@_set_map:NNNn \tl_gset:Nx }
+  { \@@_set_map:NNNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
   {
     \@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -376,7 +376,7 @@
   {
     \group_begin:
       \@@_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3}
-      \tl_gset:Nx \g_@@_internal_tl
+      \__kernel_tl_gset:Nx \g_@@_internal_tl
         { \@@_tl_toks:w \l_@@_min_int ; }
     \group_end:
     #1 #2 \g_@@_internal_tl

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -455,7 +455,7 @@
 %   an empty result for the input $-1$.
 %    \begin{macrocode}
 \group_begin:
-  \tl_set:Nx \l_@@_internal_tl { \tl_to_str:n { 0123456789ABCDEF } }
+  \__kernel_tl_set:Nx \l_@@_internal_tl { \tl_to_str:n { 0123456789ABCDEF } }
    \tl_map_inline:Nn \l_@@_internal_tl
      {
         \tl_map_inline:Nn \l_@@_internal_tl
@@ -541,7 +541,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_convert_gmap:N #1
   {
-    \tl_gset:Nx \g_@@_result_tl
+    \__kernel_tl_gset:Nx \g_@@_result_tl
       {
         \exp_after:wN \@@_convert_gmap_loop:NN
         \exp_after:wN #1
@@ -566,7 +566,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_convert_gmap_internal:N #1
   {
-    \tl_gset:Nx \g_@@_result_tl
+    \__kernel_tl_gset:Nx \g_@@_result_tl
       {
         \exp_after:wN \@@_convert_gmap_internal_loop:Nww
         \exp_after:wN #1
@@ -690,7 +690,7 @@
   {
     \group_begin:
       #1
-      \tl_gset:Nx \g_@@_result_tl { \__kernel_str_to_other_fast:n {#4} }
+      \__kernel_tl_gset:Nx \g_@@_result_tl { \__kernel_str_to_other_fast:n {#4} }
       \exp_after:wN \@@_convert:wwwnn
         \tl_to_str:n {#5} /// \s_@@_stop
         { decode } { unescape }
@@ -949,7 +949,7 @@
     \cs_new_protected:Npn \@@_convert_unescape_:
       {
         \flag_clear:n { str_byte }
-        \tl_gset:Nx \g_@@_result_tl
+        \__kernel_tl_gset:Nx \g_@@_result_tl
           { \exp_args:No \@@_filter_bytes:n \g_@@_result_tl }
         \@@_if_flag_error:nnx { str_byte } { non-byte } { bytes }
       }
@@ -1045,7 +1045,7 @@
 \cs_new_protected:Npn \@@_convert_decode_clist:
   {
     \clist_gset:No \g_@@_result_tl \g_@@_result_tl
-    \tl_gset:Nx \g_@@_result_tl
+    \__kernel_tl_gset:Nx \g_@@_result_tl
       {
         \exp_args:No \clist_map_function:nN
           \g_@@_result_tl \@@_decode_clist_char:n
@@ -1068,7 +1068,7 @@
 \cs_new_protected:Npn \@@_convert_encode_clist:
   {
     \@@_convert_gmap_internal:N \@@_encode_clist_char:n
-    \tl_gset:Nx \g_@@_result_tl { \tl_tail:N \g_@@_result_tl }
+    \__kernel_tl_gset:Nx \g_@@_result_tl { \tl_tail:N \g_@@_result_tl }
   }
 \cs_new:Npn \@@_encode_clist_char:n #1 { , #1 }
 %    \end{macrocode}
@@ -1362,7 +1362,7 @@
     \group_begin:
       \flag_clear:n { str_error }
       \int_set:Nn \tex_escapechar:D { 92 }
-      \tl_gset:Nx \g_@@_result_tl
+      \__kernel_tl_gset:Nx \g_@@_result_tl
         {
           \@@_output_byte:w "
             \exp_last_unbraced:Nf \@@_unescape_hex_auxi:N
@@ -1441,7 +1441,7 @@
           \flag_clear:n { str_byte }
           \flag_clear:n { str_error }
           \int_set:Nn \tex_escapechar:D { 92 }
-          \tl_gset:Nx \g_@@_result_tl
+          \__kernel_tl_gset:Nx \g_@@_result_tl
             {
               \exp_after:wN #3 \g_@@_result_tl
                 #1 ? { ? \prg_break: }
@@ -1527,13 +1527,13 @@
             \flag_clear:n { str_byte }
             \flag_clear:n { str_error }
             \int_set:Nn \tex_escapechar:D { 92 }
-            \tl_gset:Nx \g_@@_result_tl
+            \__kernel_tl_gset:Nx \g_@@_result_tl
               {
                 \exp_after:wN \@@_unescape_string_newlines:wN
                   \g_@@_result_tl \prg_break: ^^M ?
                 \prg_break_point:
               }
-            \tl_gset:Nx \g_@@_result_tl
+            \__kernel_tl_gset:Nx \g_@@_result_tl
               {
                 \exp_after:wN \@@_unescape_string_loop:wNNN
                   \g_@@_result_tl #1 ?? { ? \prg_break: }
@@ -1984,7 +1984,7 @@
     \flag_clear:n { str_extra }
     \flag_clear:n { str_overlong }
     \flag_clear:n { str_overflow }
-    \tl_gset:Nx \g_@@_result_tl
+    \__kernel_tl_gset:Nx \g_@@_result_tl
       {
         \exp_after:wN \@@_decode_utf_viii_start:N \g_@@_result_tl
           { \prg_break: \@@_decode_utf_viii_end: }
@@ -2274,7 +2274,7 @@
       \flag_clear:n { str_extra }
       \flag_clear:n { str_end }
       \cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
-      \tl_gset:Nx \g_@@_result_tl
+      \__kernel_tl_gset:Nx \g_@@_result_tl
         {
           \exp_after:wN \@@_decode_utf_xvi_pair:NN
             #2 \q_@@_nil \q_@@_nil
@@ -2562,7 +2562,7 @@
       \flag_clear:n { str_end }
       \flag_clear:n { str_error }
       \cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
-      \tl_gset:Nx \g_@@_result_tl
+      \__kernel_tl_gset:Nx \g_@@_result_tl
         {
           \exp_after:wN \@@_decode_utf_xxxii_loop:NNNN
             #2 \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1027,13 +1027,13 @@
 %   hide in braces.
 %    \begin{macrocode}
 \cs_new_protected:Npn \str_replace_once:Nnn
-  { \@@_replace:NNNnn \prg_do_nothing: \tl_set:Nx  }
+  { \@@_replace:NNNnn \prg_do_nothing: \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \str_greplace_once:Nnn
-  { \@@_replace:NNNnn \prg_do_nothing: \tl_gset:Nx }
+  { \@@_replace:NNNnn \prg_do_nothing: \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \str_replace_all:Nnn
-  { \@@_replace:NNNnn \@@_replace_next:w \tl_set:Nx  }
+  { \@@_replace:NNNnn \@@_replace_next:w \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \str_greplace_all:Nnn
-  { \@@_replace:NNNnn \@@_replace_next:w \tl_gset:Nx }
+  { \@@_replace:NNNnn \@@_replace_next:w \__kernel_tl_gset:Nx }
 \cs_generate_variant:Nn \str_replace_once:Nnn  { c }
 \cs_generate_variant:Nn \str_greplace_once:Nnn { c }
 \cs_generate_variant:Nn \str_replace_all:Nnn   { c }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -972,7 +972,7 @@
 \tl_new:N \g_@@_backend_tl
 \@@_finalise:n
   {
-    \tl_gset:Nx \g_@@_backend_tl
+    \__kernel_tl_gset:Nx \g_@@_backend_tl
       {
         \sys_if_engine_xetex:TF
           { xdvipdfmx }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -155,6 +155,9 @@
 % \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnN}
 % \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnNw}
 % \begin{macro}[EXP]{\@@_change_case_lower_sigma:NnnN}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnNN}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnw}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnN}
 % \begin{macro}[EXP]
 %   {\@@_change_case_char_title:nnN, \@@_change_case_char_titleonly:nnN}
 % \begin{macro}[EXP]
@@ -206,6 +209,7 @@
 \cs_new:Npn \@@_change_case_aux:nnn #1#2#3
   {
     \group_align_safe_begin:
+    \cs_if_exist_use:c { @@_change_case_boundary_ #2 _ #3 :Nnnw }
     \@@_change_case_loop:nnw {#2} {#3} #1
       \q_@@_recursion_tail \q_@@_recursion_stop
     \@@_change_case_result:n { }
@@ -296,6 +300,7 @@
   }
   {
     \@@_change_case_store:n { ~ }
+    \cs_if_exist_use:c { @@_change_case_boundary_ #1 _ #2 :Nnnw }
     \@@_change_case_loop:nnw {#1} {#2}
   }
 %    \end{macrocode}
@@ -461,16 +466,10 @@
 %   is there the special case of a terminal sigma. If not, then we pass to
 %   a simple character mapping.
 %    \begin{macrocode}
-\cs_new:Npx \@@_change_case_char_lower:nnN #1#2#3
+\cs_new:Npn \@@_change_case_char_lower:nnN #1#2#3
   {
-    \exp_not:N \cs_if_exist_use:cF { @@_change_case_lower_ #2 :nnnN }
-      {
-        \bool_lazy_or:nnTF
-          { \sys_if_engine_luatex_p: }
-          { \sys_if_engine_xetex_p: }
-          { \exp_not:N \@@_change_case_lower_sigma:nnnN }
-          { \exp_not:N \@@_change_case_char:nnnN }
-       }
+    \cs_if_exist_use:cF { @@_change_case_lower_ #2 :nnnN }
+      { \@@_change_case_lower_sigma:nnnN }
         {#1} {#1} {#2} #3
   }
 \cs_new:Npn \@@_change_case_char_upper:nnN #1#2#3
@@ -485,7 +484,7 @@
 %   then there is a look-ahead phase: the logic here is simply based on letters.
 %   The one exception is Dutch: see below.
 %    \begin{macrocode}
-\bool_lazy_or:nnT
+\bool_lazy_or:nnTF
   { \sys_if_engine_luatex_p: }
   { \sys_if_engine_xetex_p: }
   {
@@ -518,6 +517,48 @@
       }
   }
 %    \end{macrocode}
+%   In the $8$-bit engines, we have to look ahead once we find the first byte of the 
+%   possible hit.
+%    \begin{macrocode}
+  {
+    \cs_new:Npn \@@_change_case_lower_sigma:nnnN #1#2#3#4
+      {
+        \int_compare:nNnTF { `#4 } = { "CE }
+          { \@@_change_case_lower_sigma:nnnNN  }
+          { \@@_change_case_char:nnnN }
+            {#1} {#2} {#3} #4
+      }
+    \cs_new:Npn \@@_change_case_lower_sigma:nnnNN #1#2#3#4#5
+      {
+        \int_compare:nNnTF { `#5 } = { "A3 }
+          { \@@_change_case_lower_sigma:nnw {#2} {#3}  }
+          { \@@_change_case_char:nnnN {#1} {#2} {#3} #4#5 }
+      }
+    \cs_new:Npn \@@_change_case_lower_sigma:nnw #1#2#3 \q_@@_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#3}
+          { \@@_change_case_lower_sigma:nnN }
+          {
+            \@@_change_case_store:V \c_@@_final_sigma_tl
+            \@@_change_case_loop:nnw
+          }
+        {#1} {#2} #3 \q_@@_recursion_stop
+      }
+    \cs_new:Npn \@@_change_case_lower_sigma:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_letter_p:N #3 }
+          {
+            \bool_lazy_and_p:nn
+              { \token_if_active_p:N #3 }
+              { \int_compare_p:nNn { `#3 } > { "80 } }
+          }
+          { \@@_change_case_store:V \c_@@_sigma_tl }
+          { \@@_change_case_store:V \c_@@_final_sigma_tl }
+        \@@_change_case_loop:nnw {#1} {#2} #3
+      }
+  }
+%    \end{macrocode}
 %   For titlecasing, we need to fully expand the new character to see if it
 %   is a letter (or active) But that means looking ahead in the $8$-bit case, so
 %   we have to grab the required tokens up-front. Life is a lot easier for Unicode
@@ -664,6 +705,9 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[EXP]{\@@_change_case_upper_de-alt:nnnN}
 % \begin{macro}[EXP]{\@@_change_case_upper_de-alt:nnnNN}
@@ -710,16 +754,28 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_change_case_upper_el:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnn}
-% \begin{macro}[EXP]{\@@_change_case_upper_el_aux:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_upper_el_loop:nnw}
-% \begin{macro}[EXP]{\@@_change_case_upper_el:nnN}
-% \begin{macro}[EXP]{\@@_change_case_if_greek:nTF}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnn}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:NnnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:nnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:N}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnN}
+% \begin{macro}[EXP,TF]{\@@_change_case_if_greek:n}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek:n}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek_accent:n}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek_diacritic:n}
+% \begin{macro}[EXP,TF]{\@@_change_case_if_takes_dialytika:n}
 %   For Greek uppercasing, we need to know if characters \emph{in the Greek
 %   range} have accents. That means doing a \textsc{nfd} conversion first, then
 %   starting a search. As described by the Unicode \textsc{cldr}, Greek accents
 %   need to be found \emph{after} any U+0308 (diaeresis) and are done in two
-%   groups to allow for the canonical ordering.
+%   groups to allow for the canonical ordering. The implementation here follows
+%   the data and examples from ICU
+%   (\url{https://sites.google.com/site/icusite/design/case/greek-upper}),
+%   although necessarily the implementation is somewhat different.
 %    \begin{macrocode}
 \bool_lazy_or:nnT
   { \sys_if_engine_luatex_p: }
@@ -729,96 +785,304 @@
       {
         \@@_change_case_if_greek:nTF { `#4 }
           {
-            \exp_args:Ne \@@_change_case_upper_el:nnnn
-              { \char_to_nfd:N #4 } {#1} {#2} {#3}
+            \exp_args:Ne \@@_change_case_upper_el:nnn
+              { \char_to_nfd:N #4 } {#2} {#3}
           }
           { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
       }
-    \cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4
-      { \@@_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 }
-    \cs_new:Npn \@@_change_case_upper_el_aux:nnnN #1#2#3#4
+    \cs_new:Npn \@@_change_case_upper_el:nnn #1#2#3
+      { \@@_change_case_upper_el:nnNw {#2} {#3} #1 }
+%    \end{macrocode}
+%   At this stage we have the first NFD codepoint as |#3|. What we need to know
+%   is whether after that we have another character token, either from the NFD or
+%   directly in the input. If not, we store the changed character at this stage.
+%    \begin{macrocode}
+    \cs_new:Npn \@@_change_case_upper_el:nnNw #1#2#3#4 \q_@@_recursion_stop
       {
-        \@@_change_case_store:e { \use:c { char_ #1 case:N } #4 }
-        \@@_change_case_upper_el_loop:nnw {#2} {#3}
+        \tl_if_head_is_N_type:nTF {#4}
+          { \@@_change_case_upper_el:NnnN #3 }
+          {
+            \@@_change_case_store:e { \char_uppercase:N #3 }
+            \@@_change_case_loop:nnw
+          }
+            {#1} {#2} #4 \q_@@_recursion_stop
       }
-    \cs_new:Npn \@@_change_case_upper_el_loop:nnw
-      #1#2#3 \q_@@_recursion_stop
-      {
-        \tl_if_head_is_N_type:nTF {#3}
-          { \@@_change_case_upper_el:nnN }
-          { \@@_change_case_loop:nnw }
-            {#1} {#2} #3 \q_@@_recursion_stop
-      }
 %    \end{macrocode}
-%   In addition to the Greek accents, we list three cases here where an
-%   accent outside the Greek range has a \text{nfd} that would make it
-%   equivalent. That includes U+0344, which has to insert U+0308.
+%   Now, we check the detail of the next codepoint: again we filter out the
+%   not-a-char cases, before checking if it's an dialytika, accent or diacritic.
+%   (The latter do not have the same hiatus behavior as accents.)
 %    \begin{macrocode}
-    \cs_new:Npn \@@_change_case_upper_el:nnN #1#2#3
+    \cs_new:Npn \@@_change_case_upper_el:NnnN #1#2#3#4
       {
-        \token_if_cs:NTF #3
-          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+        \token_if_cs:NTF #4
           {
-            \int_compare:nNnTF { `#3 } = { "0308 }
+            \@@_change_case_store:e { \char_uppercase:N #1 }
+            \@@_change_case_loop:nnw {#2} {#3} #4
+          }
+          {
+            \int_compare:nNnTF { `#4 } = { "0308 }
+              { \@@_change_case_upper_el_dialytika:nnN {#2} {#3} #1 }
               {
-                \@@_change_case_store:n {#3}
-                \@@_change_case_upper_el_loop:nnw {#1} {#2}
-              }
-              {
-                \bool_lazy_any:nTF
+                 \@@_change_case_if_greek_accent:nTF { `#4 }
+                  { \@@_change_case_upper_el_hiatus:nnNw {#2} {#3} #1 }
                   {
-                    { \int_compare_p:nNn { `#3 } = { "0300 } }
-                    { \int_compare_p:nNn { `#3 } = { "0301 } }
-                    { \int_compare_p:nNn { `#3 } = { "0304 } }
-                    { \int_compare_p:nNn { `#3 } = { "0306 } }
-                    { \int_compare_p:nNn { `#3 } = { "0308 } }
-                    { \int_compare_p:nNn { `#3 } = { "0313 } }
-                    { \int_compare_p:nNn { `#3 } = { "0314 } }
-                    { \int_compare_p:nNn { `#3 } = { "0342 } }
-                    { \int_compare_p:nNn { `#3 } = { "0340 } }
-                    { \int_compare_p:nNn { `#3 } = { "0341 } }
-                    { \int_compare_p:nNn { `#3 } = { "0343 } }
-                  }
-                  { \@@_change_case_upper_el_loop:nnw {#1} {#2} }
-                  {
-                    \int_compare:nNnTF { `#3 } = { "0344 }
+                    \@@_change_case_if_greek_diacritic:nTF { `#4 }
                       {
-                        \@@_change_case_store:e
-                          {
-                            \char_generate:nn { "0308 }
-                              { \@@_char_catcode:N #3 }
-                          }
-                        \@@_change_case_upper_el_loop:nnw {#1} {#2}
+                        \@@_change_case_store:e { \char_uppercase:N #1 }
+                        \@@_change_case_loop:nnw {#2} {#3}
                       }
                       {
-                        \int_compare:nNnTF { `#3 } = { "0345 }
-                          { \@@_change_case_loop:nnw {#1} {#2} }
-                          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+                        \@@_change_case_store:e { \char_uppercase:N #1 }
+                        \@@_change_case_loop:nnw {#2} {#3} #4
                       }
                   }
               }
           }
       }
-    \prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF }
+%    \end{macrocode}
+%   We handle \emph{dialytika} in parts as it's also needed for the hiatus.
+%   We know only two letters take it, so we can shortcut here on the second
+%   part of the tests.
+%    \begin{macrocode}
+    \cs_new:Npn \@@_change_case_upper_el_dialytika:nnN #1#2#3
       {
-        \if_int_compare:w #1 < "0370 \exp_stop_f:
+        \@@_change_case_if_takes_dialytika:nTF { `#3 }
+          { \@@_change_case_upper_el_dialytika:N #3 }
+          { \@@_change_case_store:e { \char_uppercase:N #3 } }
+        \@@_change_case_upper_el_gobble:nnw {#1} {#2}
+      }
+    \cs_new:Npn \@@_change_case_upper_el_dialytika:N #1
+      {
+        \@@_change_case_store:e
+          {
+            \bool_lazy_or:nnTF
+              { \int_compare_p:nNn { `#1 } = { "0399 } }
+              { \int_compare_p:nNn { `#1 } = { "03B9 } }
+              { \char_generate:nn { "03AA } { \@@_char_catcode:N #1 } }
+              { \char_generate:nn { "03AB } { \@@_char_catcode:N #1 } }
+          }
+      }
+%    \end{macrocode}
+%   Adding a hiatus needs some of the same ideas, but if there is not one we
+%   skip this code point, hence needing a separate function.
+%    \begin{macrocode}
+    \cs_new:Npn \@@_change_case_upper_el_hiatus:nnNw
+      #1#2#3#4 \q_@@_recursion_stop
+      {
+        \@@_change_case_store:e { \char_uppercase:N #3 }
+        \tl_if_head_is_N_type:nTF {#4}
+          { \@@_change_case_upper_el_hiatus:nnN }
+          { \@@_change_case_loop:nnw }
+            {#1} {#2} #4 \q_@@_recursion_stop
+      }
+    \cs_new:Npn \@@_change_case_upper_el_hiatus:nnN #1#2#3
+      {
+        \token_if_cs:NTF #3
+          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+          {
+            \@@_change_case_if_takes_dialytika:nTF { `#3 }
+              {
+                \@@_change_case_upper_el_dialytika:N #3
+                \@@_change_case_upper_el_gobble:nnw {#1} {#2}
+              }
+              { \@@_change_case_loop:nnw {#1} {#2} #3 }
+          }
+      }
+%    \end{macrocode}
+%   For clearing out trailing combining marks after we have dealt with
+%   the first one.
+%    \begin{macrocode}
+    \cs_new:Npn \@@_change_case_upper_el_gobble:nnw
+      #1#2#3 \q_@@_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#3}
+          { \@@_change_case_upper_el_gobble:nnN }
+          { \@@_change_case_loop:nnw }
+            {#1} {#2} #3 \q_@@_recursion_stop
+      }
+    \cs_new:Npn \@@_change_case_upper_el_gobble:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_cs_p:N #3 }
+          {
+            ! \bool_lazy_or_p:nn
+              { \@@_change_case_if_greek_accent_p:n { `#3 } }
+              { \@@_change_case_if_greek_diacritic_p:n { `#3 } }
+          }
+          { \@@_change_case_loop:nnw {#1} {#2} #3 }
+          { \@@_change_case_upper_el_gobble:nnw {#1} {#2} }
+      }
+  }
+%    \end{macrocode}
+%   Luckily the Greek range is limited and clear.
+%    \begin{macrocode}
+\prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF }
+  {
+    \if_int_compare:w #1 < "0370 \exp_stop_f:
+      \prg_return_false:
+    \else:
+      \if_int_compare:w #1 > "03FF \exp_stop_f:
+        \if_int_compare:w #1 < "1F00 \exp_stop_f:
           \prg_return_false:
         \else:
-          \if_int_compare:w #1 > "03FF \exp_stop_f:
-            \if_int_compare:w #1 < "1F00 \exp_stop_f:
-              \prg_return_false:
+          \if_int_compare:w #1 > "1FFF \exp_stop_f:
+            \prg_return_false:
+          \else:
+            \prg_return_true:
+          \fi:
+        \fi:
+      \else:
+        \prg_return_true:
+      \fi:
+    \fi:
+  }
+%    \end{macrocode}
+%   We follow ICU in adding a few extras to the accent list here.
+%    \begin{macrocode}
+\prg_new_conditional:Npnn \@@_change_case_if_greek_accent:n #1 { TF , p }
+  {
+    \if_int_compare:w #1 = "0300 \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \if_int_compare:w #1 = "0301 \exp_stop_f:
+        \prg_return_true:
+      \else:
+        \if_int_compare:w #1 = "0342 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "0302 \exp_stop_f:
+            \prg_return_true:
+          \else:
+            \if_int_compare:w #1 = "0303 \exp_stop_f:
+              \prg_return_true:
             \else:
-              \if_int_compare:w #1 > "1FFF \exp_stop_f:
+              \if_int_compare:w #1 = "0311 \exp_stop_f:
+                \prg_return_true:
+              \else:
                 \prg_return_false:
-              \else:
-                \prg_return_true:
               \fi:
             \fi:
+          \fi:
+        \fi:
+      \fi:
+    \fi:
+  }
+\prg_new_conditional:Npnn \@@_change_case_if_greek_diacritic:n
+  #1 { TF , p }
+  {
+    \if_int_compare:w #1 = "0304 \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \if_int_compare:w #1 = "0306 \exp_stop_f:
+        \prg_return_true:
+      \else:
+        \if_int_compare:w #1 = "0313 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "0314 \exp_stop_f:
+            \prg_return_true:
           \else:
+            \if_int_compare:w #1 = "0343 \exp_stop_f:
+              \prg_return_true:
+            \else:
+              \prg_return_false:
+            \fi:
+          \fi:
+        \fi:
+      \fi:
+    \fi:
+  }
+\prg_new_conditional:Npnn \@@_change_case_if_takes_dialytika:n #1 { TF }
+  {
+    \if_int_compare:w #1 = "0399 \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \if_int_compare:w #1 = "03B9 \exp_stop_f:
+        \prg_return_true:
+      \else:
+        \if_int_compare:w #1 = "03A5 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "03C5 \exp_stop_f:
             \prg_return_true:
+          \else:
+            \prg_return_false:
           \fi:
         \fi:
+      \fi:
+    \fi:
+   }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:Nnnw}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnN}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:NnnN}
+%   There is one special case in Greek that needs to be picked up based on
+%   being an isolated letter. We do that using a test similar to final sigma,
+%   but it has to fire off from the space grabber.
+%    \begin{macrocode}
+\bool_lazy_or:nnT
+  { \sys_if_engine_luatex_p: }
+  { \sys_if_engine_xetex_p: }
+  {
+    \cs_new:Npn \@@_change_case_boundary_upper_el:Nnnw
+      #1#2#3#4 \q_@@_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#4}
+          { \@@_change_case_boundary_upper_el:nnN }
+          { \@@_change_case_loop:nnw }
+            {#2} {#3} #4 \q_@@_recursion_stop
       }
+    \cs_new:Npn \@@_change_case_boundary_upper_el:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_cs_p:N #3 }
+          {
+            ! \bool_lazy_or_p:nn
+              { \int_compare_p:nNn { `#3 } = { "03AE } }
+              { \int_compare_p:nNn { `#3 } = { "1F22 } }
+          }
+          { \@@_change_case_loop:nnw }
+          { \@@_change_case_boundary_upper_el:nnNw }
+            {#1} {#2} #3
+      }
+    \cs_new:Npn \@@_change_case_boundary_upper_el:nnNw
+      #1#2#3#4 \q_@@_recursion_stop
+       {
+        \tl_if_head_is_N_type:nTF {#4}
+          { \@@_change_case_boundary_upper_el:NnnN #3 }
+          {
+            \@@_change_case_store:e
+              { \char_generate:nn { "0389 } { \@@_char_catcode:N #3 } }
+            \@@_change_case_loop:nnw
+          }
+            {#1} {#2} #4 \q_@@_recursion_stop
+      }
+    \cs_new:Npn \@@_change_case_boundary_upper_el:NnnN #1#2#3#4
+      {
+        \token_if_letter:NTF #4
+          { \@@_change_case_loop:nnw {#2} {#3} #1#4 }
+          {
+            \@@_change_case_store:e
+              { \char_generate:nn { "0389 } { \@@_char_catcode:N #1 } }
+            \@@_change_case_loop:nnw {#2} {#3} #4
+          }
+      }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -825,8 +1089,6 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
-% \end{macro}
 % \begin{macro}[EXP]{\@@_change_case_title_el:nnnN}
 %   Titlecasing retains accents, but to prevent the uppercasing code
 %   from kicking in, there has to be an explicit function here.
@@ -1198,14 +1460,17 @@
 %
 % \begin{variable}
 %   {
-%     \c_@@_dotless_i_tl ,
-%     \c_@@_dotted_I_tl  ,
-%     \c_@@_i_ogonek_tl  ,
-%     \c_@@_I_ogonek_tl  ,
+%     \c_@@_dotless_i_tl   ,
+%     \c_@@_dotted_I_tl    ,
+%     \c_@@_i_ogonek_tl    ,
+%     \c_@@_I_ogonek_tl    ,
+%     \c_@@_final_sigma_tl ,
+%     \c_@@_sigma_tl       ,
 %     \c_@@_grosses_Eszett_tl
 %   }
 %  For cases where there is an $8$-bit option in the |T1| font set up,
-%  a variant is provided in both cases.
+%  a variant is provided in both cases. There are also a few extras for
+%  |LGR|.
 %    \begin{macrocode}
 \group_begin:
   \bool_lazy_or:nnF
@@ -1238,6 +1503,8 @@
       \@@_tmp:w \c_@@_dotted_I_tl       { 0130 }
       \@@_tmp:w \c_@@_i_ogonek_tl       { 012F }
       \@@_tmp:w \c_@@_I_ogonek_tl       { 012E }
+      \@@_tmp:w \c_@@_final_sigma_tl    { 03C2 }
+      \@@_tmp:w \c_@@_sigma_tl          { 03C3 }
       \@@_tmp:w \c_@@_grosses_Eszett_tl { 1E9E }
     }
 \group_end:
@@ -1245,7 +1512,9 @@
 % \end{variable}
 %
 % For $8$-bit engines we now need to define the case-change data for
-% the multi-octet mappings. These need a list of what code points are
+% the multi-octet mappings. This data is here not in the \pkg{char} module
+% as the multi-byte nature means they are never |N|-type.
+% These need a list of what code points are
 % doable in |T1| so the list is hard coded (there's no saving in loading
 % the mappings dynamically). All of the straight-forward ones have two
 % octets, so that is taken as read.
@@ -1454,9 +1723,18 @@
         { 042E } { 044E }
         { 042F } { 044F }
 %    \end{macrocode}
-% Core Greek support: there may need to be a little more work here to
-% deal completely with accents.
+% Greek support: everything in the two-octet range.
 %    \begin{macrocode}
+        { 0370 } { 0371 }
+        { 0372 } { 0373 }
+        { 0376 } { 0377 }
+        { 03FD } { 037B }
+        { 03FE } { 037C }
+        { 03FF } { 037D }
+        { 0386 } { 03AC }
+        { 0388 } { 03AD }
+        { 0389 } { 03AE }
+        { 038A } { 03AF }
         { 0391 } { 03B1 }
         { 0392 } { 03B2 }
         { 0393 } { 03B3 }
@@ -1481,17 +1759,39 @@
         { 03A7 } { 03C7 }
         { 03A8 } { 03C8 }
         { 03A9 } { 03C9 }
+        { 03AA } { 03CA }
+        { 03AB } { 03CB }
+        { 038C } { 03CC }
+        { 038E } { 03CD }
+        { 038F } { 03CE }
+        { 03CF } { 03D7 }
         { 03D8 } { 03D9 }
         { 03DA } { 03DB }
         { 03DC } { 03DD }
         { 03DE } { 03DF }
         { 03E0 } { 03E1 }
+        { 03E2 } { 03E3 }
+        { 03E4 } { 03E5 }
+        { 03E6 } { 03E7 }
+        { 03E8 } { 03E9 }
+        { 03EA } { 03EB }
+        { 03EC } { 03ED }
+        { 03EE } { 03EF }
+        { 03F9 } { 03F2 }
+        { 037F } { 03F3 }
+        { 03F7 } { 03F8 }
+        { 03FA } { 03FB }
         \q_recursion_tail ?
         \q_recursion_stop
+%    \end{macrocode}
+% Odds and ends for Greek; mainly symbols that are for compatibility,
+% but also things like the terminal sigma. Almost all are uppercase
+% mappings, but there is one that is not!
+%    \begin{macrocode}
       \cs_set_protected:Npn \@@_tmp:w #1#2#3
         {
           \group_begin:
-            \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
+            \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4##5##6##7##8
               {
                 \tl_const:cx
                   {
@@ -1500,6 +1800,47 @@
                     \char_generate:nn {##2} { 12 }
                     _tl
                   }
+                  {
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##5} { 13 }
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##6} { 13 }
+                  }
+              }
+            \use:x
+              {
+                \@@_tmp:w
+                  \char_to_utfviii_bytes:n { "#1 }
+                  \char_to_utfviii_bytes:n { "#2 }
+              }
+          \group_end:
+        }
+      \@@_tmp:w { 0345 } { 0399 } { upper }
+      \@@_tmp:w { 03C2 } { 03A3 } { upper }
+      \@@_tmp:w { 03D0 } { 0392 } { upper }
+      \@@_tmp:w { 03D1 } { 0398 } { upper }
+      \@@_tmp:w { 03D5 } { 03A6 } { upper }
+      \@@_tmp:w { 03D6 } { 03A0 } { upper }
+      \@@_tmp:w { 03F0 } { 039A } { upper }
+      \@@_tmp:w { 03F1 } { 03A1 } { upper }
+      \@@_tmp:w { 03F4 } { 03B8 } { lower }
+      \@@_tmp:w { 03F5 } { 0395 } { upper }
+%    \end{macrocode}
+% Odds and ends that are not simple one-to-one mappings. These
+% are still two-octet code points.
+%    \begin{macrocode}
+      \cs_set_protected:Npn \@@_tmp:w #1#2#3
+        {
+          \group_begin:
+            \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
+              {
+                \tl_const:cn
+                  {
+                    c_@@_ #3 case_
+                    \char_generate:nn {##1} { 12 }
+                    \char_generate:nn {##2} { 12 }
+                    _tl
+                  }
                     {#2}
               }
             \use:x
@@ -1509,9 +1850,183 @@
       \@@_tmp:w { 00DF } { SS } { upper }
       \@@_tmp:w { 00DF } { Ss } { title }
       \@@_tmp:w { 0131 } { I }  { upper }
-    }
-  \group_end:
 %    \end{macrocode}
+% Greek support: the three-octet code points.
+%    \begin{macrocode}
+      \cs_set_protected:Npn \@@_tmp:nnnnnn #1#2#3#4#5#6#7
+        {
+          \tl_const:cx
+            {
+              c_@@_ #1 case_
+              \char_generate:nn {#2} { 12 }
+              \char_generate:nn {#3} { 12 }
+              \char_generate:nn {#4} { 12 }
+              _tl
+            }
+            {
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#5} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#6} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#7} { 13 }
+            }
+        }
+      \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6#7#8
+        {
+          \tl_const:cx
+            {
+              c_@@_lowercase_
+              \char_generate:nn {#1} { 12 }
+              \char_generate:nn {#2} { 12 }
+              \char_generate:nn {#3} { 12 }
+              _tl
+            }
+            {
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#5} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#6} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#7} { 13 }
+            }
+          \@@_tmp:nnnnnn { upper } {#5} {#6} {#7} {#1} {#2} {#3}
+          \@@_tmp:nnnnnn { title } {#5} {#6} {#7} {#1} {#2} {#3}
+        }
+      \@@_loop:nn
+        { 1F08 } { 1F00 }
+        { 1F09 } { 1F01 }
+        { 1F0A } { 1F02 }
+        { 1F0B } { 1F03 }
+        { 1F0C } { 1F04 }
+        { 1F0D } { 1F05 }
+        { 1F0E } { 1F06 }
+        { 1F0F } { 1F07 }
+        { 1F18 } { 1F10 }
+        { 1F19 } { 1F11 }
+        { 1F1A } { 1F12 }
+        { 1F1B } { 1F13 }
+        { 1F1C } { 1F14 }
+        { 1F1D } { 1F15 }
+        { 1F28 } { 1F20 }
+        { 1F29 } { 1F21 }
+        { 1F2A } { 1F22 }
+        { 1F2B } { 1F23 }
+        { 1F2C } { 1F24 }
+        { 1F2D } { 1F25 }
+        { 1F2E } { 1F26 }
+        { 1F2F } { 1F27 }
+        { 1F38 } { 1F30 }
+        { 1F39 } { 1F31 }
+        { 1F3A } { 1F32 }
+        { 1F3B } { 1F33 }
+        { 1F3C } { 1F34 }
+        { 1F3D } { 1F35 }
+        { 1F3E } { 1F36 }
+        { 1F3F } { 1F37 }
+        { 1F48 } { 1F40 }
+        { 1F49 } { 1F41 }
+        { 1F4A } { 1F42 }
+        { 1F4B } { 1F43 }
+        { 1F4C } { 1F44 }
+        { 1F4D } { 1F45 }
+        { 1F59 } { 1F51 }
+        { 1F5B } { 1F53 }
+        { 1F5D } { 1F55 }
+        { 1F5F } { 1F57 }
+        { 1F68 } { 1F60 }
+        { 1F69 } { 1F61 }
+        { 1F6A } { 1F62 }
+        { 1F6B } { 1F63 }
+        { 1F6C } { 1F64 }
+        { 1F6D } { 1F65 }
+        { 1F6E } { 1F66 }
+        { 1F6F } { 1F67 }
+        { 1FBA } { 1F70 }
+        { 1FBB } { 1F71 }
+        { 1FC8 } { 1F72 }
+        { 1FC9 } { 1F73 }
+        { 1FCA } { 1F74 }
+        { 1FCB } { 1F75 }
+        { 1FDA } { 1F76 }
+        { 1FDB } { 1F77 }
+        { 1FF8 } { 1F78 }
+        { 1FF9 } { 1F79 }
+        { 1FEA } { 1F7A }
+        { 1FEB } { 1F7B }
+        { 1FFA } { 1F7C }
+        { 1FFB } { 1F7D }
+        { 1F88 } { 1F80 }
+        { 1F89 } { 1F81 }
+        { 1F8A } { 1F82 }
+        { 1F8B } { 1F83 }
+        { 1F8C } { 1F84 }
+        { 1F8D } { 1F85 }
+        { 1F8E } { 1F86 }
+        { 1F8F } { 1F87 }
+        { 1F98 } { 1F90 }
+        { 1F99 } { 1F91 }
+        { 1F9A } { 1F92 }
+        { 1F9B } { 1F93 }
+        { 1F9C } { 1F94 }
+        { 1F9D } { 1F95 }
+        { 1F9E } { 1F96 }
+        { 1F9F } { 1F97 }
+        { 1FA8 } { 1FA0 }
+        { 1FA9 } { 1FA1 }
+        { 1FAA } { 1FA2 }
+        { 1FAB } { 1FA3 }
+        { 1FAC } { 1FA4 }
+        { 1FAD } { 1FA5 }
+        { 1FAE } { 1FA6 }
+        { 1FAF } { 1FA7 }
+        { 1FB8 } { 1FB0 }
+        { 1FB9 } { 1FB1 }
+        { 1FBC } { 1FB3 }
+        { 1FCC } { 1FC3 }
+        { 1FD8 } { 1FD0 }
+        { 1FD9 } { 1FD1 }
+        { 1FE8 } { 1FE0 }
+        { 1FE9 } { 1FE1 }
+        { 1FEC } { 1FE5 }
+        { 1FFC } { 1FF3 }
+        \q_recursion_tail ?
+        \q_recursion_stop
+%    \end{macrocode}
+% One three-octet special case for Greek: it also moves to two-octets!
+%    \begin{macrocode}
+      \cs_set_protected:Npn \@@_tmp:w #1#2#3
+        {
+          \group_begin:
+            \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4##5##6##7##8
+              {
+                \tl_const:cx
+                  {
+                    c_@@_ #3 case_
+                    \char_generate:nn {##1} { 12 }
+                    \char_generate:nn {##2} { 12 }
+                    \char_generate:nn {##3} { 12 }
+                    _tl
+                  }
+                  {
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##5} { 13 }
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##6} { 13 }
+                  }
+              }
+            \use:x
+              {
+                \@@_tmp:w
+                  \char_to_utfviii_bytes:n { "#1 }
+                  \char_to_utfviii_bytes:n { "#2 }
+              }
+          \group_end:
+        }
+    \@@_tmp:w { 1FBE } { 0399 } { upper }
+  }
+\group_end:
+%    \end{macrocode}
 %
 % The (fixed) look-up mappings for letter-like control sequences.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -398,10 +398,15 @@
   { \text_declare_purify_equivalent:Nn #1 { } }
 %    \end{macrocode}
 % Environments have to be handled by pure expansion.
+%
+% \begin{macro}{\@@_end_env:n}
 %    \begin{macrocode}
 \text_declare_purify_equivalent:Nn \begin { \use:c }
-\text_declare_purify_equivalent:Nn \end { \use:c }
+\text_declare_purify_equivalent:Nn \end { \@@_end_env:n }
+\cs_new:Npn \@@_end_env:n #1 { \cs:w end #1 \cs_end: }
 %    \end{macrocode}
+% \end{macro}
+%
 % Some common symbols and similar ideas.
 %    \begin{macrocode}
 \text_declare_purify_equivalent:Nn \\ { }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -163,7 +163,8 @@
 %       Unicode \TeX{} engines.
 %     \item Greek (\texttt{el}).
 %       Removes accents from Greek letters when uppercasing; titlecasing
-%       leaves accents in place.
+%       leaves accents in place. (At present this is implemented only
+%       for Unicode engines.)
 %     \item Lithuanian (\texttt{lt}).
 %       The lowercase letters i and j should retain a dot above when the
 %       accents grave, acute or tilde are present. This is implemented for

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -721,7 +721,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_analysis_b:n #1
   {
-    \tl_gset:Nx \g_@@_analysis_result_tl
+    \__kernel_tl_gset:Nx \g_@@_analysis_result_tl
       {
         \@@_analysis_b_loop:w 0; #1
         \prg_break_point:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -1269,6 +1269,15 @@
 %
 % \subsection{Functions}
 %
+% \begin{macro}{\__kernel_tl_set:Nx,\__kernel_tl_gset:Nx}
+%   These two are supplied to get better performance for macros which would
+%   otherwise use \cs{tl_set:Nx} or \cs{tl_gset:Nx} internally.
+%    \begin{macrocode}
+\cs_new_eq:NN \__kernel_tl_set:Nx  \cs_set_nopar:Npx
+\cs_new_eq:NN \__kernel_tl_gset:Nx \cs_gset_nopar:Npx
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\tl_new:N, \tl_new:c}
 %   Creating new token list variables is a case of checking for an
 %   existing definition and doing the definition.
@@ -1283,12 +1292,14 @@
 % \end{macro}
 %
 % \begin{macro}{\tl_const:Nn, \tl_const:Nx, \tl_const:cn, \tl_const:cx}
-%   Constants are also easy to generate.
+%   Constants are also easy to generate. They use \cs{cs_gset_nopar:Npx} instead
+%   of \cs{__kernel_tl_gset:Nx} so that the correct scope checking is applied if
+%   \pkg{l3debug} is used.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_const:Nn #1#2
   {
     \__kernel_chk_if_free_cs:N #1
-    \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
+    \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} }
   }
 \cs_new_protected:Npn \tl_const:Nx #1#2
   {
@@ -1350,9 +1361,21 @@
 %   \cs{scan_stop:} would lead to problems later on.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
-  { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+  {
+    \__kernel_tl_set:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#3}
+      }
+  }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
-  { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+  {
+    \__kernel_tl_gset:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#3}
+      }
+  }
 \cs_generate_variant:Nn \tl_concat:NNN  { ccc }
 \cs_generate_variant:Nn \tl_gconcat:NNN { ccc }
 %    \end{macrocode}
@@ -1419,17 +1442,17 @@
 %   \enquote{by hand} as it is used quite a lot.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_set:Nn #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w {#2} } }
 \cs_new_protected:Npn \tl_set:No #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
 \cs_new_protected:Npn \tl_set:Nx #1#2
-  { \cs_set_nopar:Npx #1 {#2} }
+  { \__kernel_tl_set:Nx #1 {#2} }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w {#2} } }
 \cs_new_protected:Npn \tl_gset:No #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
-  { \cs_gset_nopar:Npx #1 {#2} }
+  { \__kernel_tl_gset:Nx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
 \cs_generate_variant:Nn \tl_set:Nx  { c }
 \cs_generate_variant:Nn \tl_set:Nn  { c, co , cV , cv , cf }
@@ -1453,21 +1476,45 @@
 % Adding to the left is done directly to gain a little performance.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_set:Nx #1
+      { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+  {
+    \__kernel_tl_set:Nx #1
+      { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_put_left:No #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_set:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#1}
+      }
+  }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
-  { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
+  { \__kernel_tl_set:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#1}
+      }
+  }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
-  { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
+  { \__kernel_tl_gset:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
 \cs_generate_variant:Nn \tl_put_left:NV  { c }
 \cs_generate_variant:Nn \tl_put_left:No  { c }
@@ -1495,21 +1542,39 @@
 % The same on the right.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+  {
+    \__kernel_tl_set:Nx #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 }
+  }
 \cs_new_protected:Npn \tl_put_right:No #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+  {
+    \__kernel_tl_set:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#1}
+        \__kernel_exp_not:w \exp_after:wN {#2}
+      }
+  }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 }
+  }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+  {
+    \__kernel_tl_gset:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#1}
+        \__kernel_exp_not:w \exp_after:wN {#2}
+      }
+  }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
 \cs_generate_variant:Nn \tl_put_right:NV  { c }
 \cs_generate_variant:Nn \tl_put_right:No  { c }
@@ -1574,6 +1639,7 @@
 %     \tl_gset_rescan:cnn, \tl_gset_rescan:cno, \tl_gset_rescan:cnx
 %   }
 % \begin{macro}{\tl_rescan:nn}
+% \begin{macro}{\@@_rescan_aux:}
 % \begin{macro}{\@@_set_rescan:NNnn, \@@_set_rescan_multi:nNN}
 % \begin{macro}[EXP]{\@@_rescan:NNw}
 %   In a group, after some initial setup explained below and the user
@@ -1632,9 +1698,11 @@
 \cs_new_protected:Npn \tl_rescan:nn #1#2
   {
     \tl_set_rescan:Nnn \l_@@_internal_a_tl {#1} {#2}
-    \exp_after:wN \tl_clear:N \exp_after:wN \l_@@_internal_a_tl
+    \exp_after:wN \@@_rescan_aux:
     \l_@@_internal_a_tl
   }
+\exp_args:NNo \cs_new_protected:Npn \@@_rescan_aux:
+  { \tl_clear:N \l_@@_internal_a_tl }
 \cs_new_protected:Npn \tl_set_rescan:Nnn
   { \@@_set_rescan:NNnn \tl_set:No }
 \cs_new_protected:Npn \tl_gset_rescan:Nnn
@@ -1653,7 +1721,7 @@
   }
 \cs_new_protected:Npn \@@_set_rescan_multi:nNN #1#2#3
   {
-    \exp_args:No \tex_everyeof:D { \c_@@_rescan_marker_tl }
+    \tex_everyeof:D \exp_after:wN { \c_@@_rescan_marker_tl }
     \exp_after:wN \@@_rescan:NNw
     \exp_after:wN #2
     \exp_after:wN #3
@@ -1676,6 +1744,7 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}{\@@_set_rescan:nNN}
 % \begin{macro}{\@@_set_rescan_single:nnNN, \@@_set_rescan_single_aux:nnnNN}
@@ -1802,13 +1871,13 @@
 %   the \meta{tl~var} by \meta{token list}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_replace_once:Nnn
-  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \tl_set:Nx  }
+  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \tl_greplace_once:Nnn
-  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \tl_gset:Nx }
+  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \tl_replace_all:Nnn
-  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \tl_set:Nx  }
+  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \tl_greplace_all:Nnn
-  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \tl_gset:Nx }
+  { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \__kernel_tl_gset:Nx }
 \cs_generate_variant:Nn \tl_replace_once:Nnn  { c }
 \cs_generate_variant:Nn \tl_greplace_once:Nnn { c }
 \cs_generate_variant:Nn \tl_replace_all:Nnn   { c }
@@ -1825,6 +1894,7 @@
 %     \@@_replace_auxi:NnnNNNnn,
 %     \@@_replace_auxii:nNNNnn,
 %     \@@_replace_next:w,
+%     \@@_replace_next_aux:w,
 %     \@@_replace_wrap:w,
 %   }
 %   To implement the actual replacement auxiliary
@@ -1969,7 +2039,7 @@
   {
     \group_align_safe_begin:
     \cs_set:Npn \@@_replace_wrap:w ##1 #1 ##2
-      { \exp_not:o { \use_none:nn ##1 } ##2 }
+      { \__kernel_exp_not:w \exp_after:wN { \use_none:nn ##1 } ##2 }
     \cs_set:Npx \@@_replace_next:w ##1 #5
       {
         \exp_not:N \@@_replace_wrap:w ##1
@@ -1979,9 +2049,7 @@
       }
     #3 #4
       {
-        \exp_after:wN \@@_replace_next:w
-        \exp_after:wN { \exp_after:wN }
-        \exp_after:wN { \exp_after:wN }
+        \exp_after:wN \@@_replace_next_aux:w
         #4
         #1
         {
@@ -1992,6 +2060,7 @@
       }
     \group_align_safe_end:
   }
+\cs_new:Npn \@@_replace_next_aux:w { \@@_replace_next:w { } { } }
 \cs_new_eq:NN \@@_replace_wrap:w ?
 \cs_new_eq:NN \@@_replace_next:w ?
 %    \end{macrocode}
@@ -2027,29 +2096,6 @@
 %
 % \subsection{Token list conditionals}
 %
-% \begin{macro}[pTF]{\tl_if_blank:n, \tl_if_blank:V, \tl_if_blank:o}
-% \begin{macro}{\@@_if_blank_p:NNw}
-%   \TeX{} skips spaces when reading a non-delimited arguments. Thus,
-%   a \meta{token list} is blank if and only if \cs{use_none:n}
-%   \meta{token list} |?| is empty after one expansion.  The auxiliary
-%   \cs{@@_if_empty_if:o} is a fast emptyness test, converting its
-%   argument to a string (after one expansion) and using the test
-%   \cs{if_meaning:w} \cs{q_@@_nil} |...| \cs{q_@@_nil}.
-%    \begin{macrocode}
-\prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
-  {
-    \@@_if_empty_if:o { \use_none:n #1 ? }
-      \prg_return_true:
-    \else:
-      \prg_return_false:
-    \fi:
-  }
-\prg_generate_conditional_variant:Nnn \tl_if_blank:n
-  { e , V , o } { p , T , F , TF }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \begin{macro}[pTF]{\tl_if_empty:N, \tl_if_empty:c}
 %    These functions check whether the token list in the argument is
 %    empty and execute the proper code from their argument(s).
@@ -2068,23 +2114,17 @@
 % \end{macro}
 %
 % \begin{macro}[pTF]{\tl_if_empty:n, \tl_if_empty:V}
-%   Convert the argument to a string: this is empty if and only if
-%   the argument is.  Then |\if_meaning:w \q_@@_nil ... \q_@@_nil| is
-%   \texttt{true} if and only if the string |...| is empty.
-%   It could be tempting to use |\if_meaning:w \q_@@_nil #1 \q_@@_nil| directly.
-%   This fails on a token
-%   list starting with \cs{q_@@_nil} of course but more troubling is the
-%   case where argument is a complete conditional such as \cs{if_true:}
-%   a \cs{else:} b \cs{fi:} because then \cs{if_true:} is used by
-%   \cs{if_meaning:w}, the test turns out \texttt{false}, the \cs{else:}
-%   executes the \texttt{false} branch, the \cs{fi:} ends it and the
-%   \cs{q_@@_nil} at the end
-%   starts executing\dots{}
+%   The \cs{if:w} triggers the expansion of \cs{tl_to_str:n} which converts the
+%   argument to a string: this is empty if and only if the argument is.  Then
+%   |\if:w \scan_stop: ... \scan_stop:| is \texttt{true} if and only if the
+%   string |...| is empty.
+%   It could be tempting to use |\if:w \scan_stop: #1 \scan_stop:| directly.
+%   But this fails on a token list expanding to anything starting with
+%   \cs{scan_stop:} leaving everything that follows in the input stream.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F }
   {
-    \exp_after:wN \if_meaning:w \exp_after:wN \q_@@_nil
-        \tl_to_str:n {#1} \q_@@_nil
+    \if:w \scan_stop: \tl_to_str:n {#1} \scan_stop:
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -2107,13 +2147,15 @@
 %   We don't put \cs{prg_return_true:} and so on in the definition of
 %   the auxiliary, because that would prevent an optimization applied to
 %   conditionals that end with this code.
+%   Also the |\@@_if_empty_if:o| is expanded once in |\tl_if_empty:oTF| for
+%   efficiency as well (and to reduce code doubling).
 %    \begin{macrocode}
 \cs_new:Npn \@@_if_empty_if:o #1
   {
-    \exp_after:wN \if_meaning:w \exp_after:wN \q_@@_nil
-      \__kernel_tl_to_str:w \exp_after:wN {#1} \q_@@_nil
+    \if:w \scan_stop: \__kernel_tl_to_str:w \exp_after:wN {#1} \scan_stop:
   }
-\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
+\exp_args:Nno \use:n
+  { \prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } }
   {
     \@@_if_empty_if:o {#1}
       \prg_return_true:
@@ -2125,6 +2167,30 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[pTF]{\tl_if_blank:n, \tl_if_blank:V, \tl_if_blank:o}
+% \begin{macro}{\@@_if_blank_p:NNw}
+%   \TeX{} skips spaces when reading a non-delimited arguments. Thus,
+%   a \meta{token list} is blank if and only if \cs{use_none:n}
+%   \meta{token list} |?| is empty after one expansion.  The auxiliary
+%   \cs{@@_if_empty_if:o} is a fast emptyness test, converting its
+%   argument to a string (after one expansion) and using the test
+%   \cs{if:w} \cs{scan_stop:} |...| \cs{scan_stop:}.
+%    \begin{macrocode}
+\exp_args:Nno \use:n
+  { \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF } }
+  {
+    \@@_if_empty_if:o { \use_none:n #1 ? }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\prg_generate_conditional_variant:Nnn \tl_if_blank:n
+  { e , V , o } { p , T , F , TF }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}[pTF]{\tl_if_eq:NN, \tl_if_eq:Nc, \tl_if_eq:cN, \tl_if_eq:cc}
 %   Returns \cs{c_true_bool} if and only if the two token list variables are
 %   equal.
@@ -2269,28 +2335,28 @@
 % \end{macro}
 %
 % \begin{macro}[EXP,pTF]{\tl_if_single:n}
-% \begin{macro}[EXP,pTF]{\@@_if_single:n}
+% \begin{macro}[EXP]{\@@_if_single:nnw}
 %   This test is similar to \cs{tl_if_empty:nTF}.  Expanding
 %   \cs{use_none:nn} |#1| |??| once yields an empty result if |#1| is
 %   blank, a single~|?| if |#1| has a single item, and otherwise yields
-%   some tokens ending with |??|.  Then, \cs{tl_to_str:n} makes sure
+%   some tokens ending with |??|.  Then, \cs{__kernel_tl_to_str:w} makes sure
 %   there are no odd category codes.  An earlier version would compare
 %   the result to a single~|?| using string comparison, but the Lua call
 %   is slow in \LuaTeX{}.  Instead, \cs{@@_if_single:nnw} picks the
 %   second token in front of it.  If |#1| is empty, this token is
-%   the trailing~|?| and the catcode test yields \texttt{false}.  If
-%   |#1| has a single item, the token is~|^| and the catcode test
+%   the trailing~|?| and the |\if:w| test yields \texttt{false}.  If
+%   |#1| has a single item, the token is~|\scan_stop:| and the |\if:w| test
 %   yields \texttt{true}.  Otherwise, it is one of the characters
-%   resulting from \cs{tl_to_str:n}, and the catcode test yields
-%   \texttt{false}.  Note that \cs{if_catcode:w} and
+%   resulting from \cs{tl_to_str:n}, and the |\if:w| test yields
+%   \texttt{false}.  Note that \cs{if:w} and
 %   \cs{__kernel_tl_to_str:w} are primitives that take care of
 %   expansion.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF }
   {
-    \if_catcode:w ^ \exp_after:wN \@@_if_single:nnw
+    \if:w \scan_stop: \exp_after:wN \@@_if_single:nnw
         \__kernel_tl_to_str:w
-          \exp_after:wN { \use_none:nn #1 ?? } ^ ? \s_@@_stop
+          \exp_after:wN { \use_none:nn #1 ?? } \scan_stop: ? \s_@@_stop
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -2587,18 +2653,16 @@
   {
     \int_eval:n
       {
-        \@@_act:NNNnn
-          \@@_act_count_normal:nN
-          \@@_act_count_group:nn
-          \@@_act_count_space:n
-          { }
+        \@@_act:NNNn
+          \@@_act_count_normal:N
+          \@@_act_count_group:n
+          \@@_act_count_space:
           {#1}
       }
   }
-\cs_new:Npn \@@_act_count_normal:nN #1 #2 { 1 + }
-\cs_new:Npn \@@_act_count_space:n #1 { 1 + }
-\cs_new:Npn \@@_act_count_group:nn #1 #2
-  { 2 + \tl_count_tokens:n {#2} + }
+\cs_new:Npn \@@_act_count_normal:N #1 { 1 + }
+\cs_new:Npn \@@_act_count_space: { 1 + }
+\cs_new:Npn \@@_act_count_group:n #1 { 2 + \tl_count_tokens:n {#1} + }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2624,7 +2688,7 @@
       \s_@@_stop { {#1} #5 }
   }
 \cs_new:Npn \@@_reverse_items:wn #1 \s_@@_stop #2
-  { \exp_not:o { \use_none:nn #2 } }
+  { \__kernel_exp_not:w \exp_after:wN { \use_none:nn #2 } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2639,22 +2703,28 @@
 %   }
 %   Trimming spaces from around the input is deferred to an internal
 %   function whose first argument is the token list to trim, augmented
-%   by an initial \cs{s_@@_mark}, and whose second argument is a
+%   by an initial \cs{@@_trim_mark:}, and whose second argument is a
 %   \meta{continuation}, which receives as a braced argument
-%   \cs{use_none:n} \cs{s_@@_mark} \meta{trimmed token list}.  In the case
-%   at hand, we take \cs{exp_not:o} as our continuation, so that space
-%   trimming behaves correctly within an \texttt{x}-type expansion.
+%   \cs{@@_trim_mark:} \meta{trimmed token list}.  The control sequence
+%   \cs{@@_trim_mark:} expands to nothing in a single expansion.  In the case
+%   at hand, we take \cs{__kernel_exp_not:w} \cs{exp_after:wN} as our
+%   continuation, so that space trimming behaves correctly within an
+%   \texttt{x}-type expansion.
 %    \begin{macrocode}
 \cs_new:Npn \tl_trim_spaces:n #1
-  { \@@_trim_spaces:nn { \s_@@_mark #1 } \exp_not:o }
+  {
+    \@@_trim_spaces:nn
+      { \@@_trim_mark: #1 }
+      { \__kernel_exp_not:w \exp_after:wN }
+  }
 \cs_generate_variant:Nn \tl_trim_spaces:n { o }
 \cs_new:Npn \tl_trim_spaces_apply:nN #1#2
-  { \@@_trim_spaces:nn { \s_@@_mark #1 } { \exp_args:No #2 } }
+  { \@@_trim_spaces:nn { \@@_trim_mark: #1 } { \exp_args:No #2 } }
 \cs_generate_variant:Nn \tl_trim_spaces_apply:nN { o }
 \cs_new_protected:Npn \tl_trim_spaces:N #1
-  { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
+  { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
 \cs_new_protected:Npn \tl_gtrim_spaces:N #1
-  { \tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
+  { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
 \cs_generate_variant:Nn \tl_trim_spaces:N  { c }
 \cs_generate_variant:Nn \tl_gtrim_spaces:N { c }
 %    \end{macrocode}
@@ -2667,22 +2737,24 @@
 %     \@@_trim_spaces_auxi:w, \@@_trim_spaces_auxii:w,
 %     \@@_trim_spaces_auxiii:w, \@@_trim_spaces_auxiv:w
 %   }
+% \begin{macro}{\@@_trim_mark:}
 %   Trimming spaces from around the input is done using delimited
 %   arguments and quarks, and to get spaces at odd places in the
 %   definitions, we nest those in \cs{@@_tmp:w}, which then receives
 %   a single space as its argument: |#1| is \verb*+ +.
 %   Removing leading spaces is done with \cs{@@_trim_spaces_auxi:w},
-%   which loops until \cs{s_@@_mark}\verb*+ + matches the end of the token
+%   which loops until \cs{@@_trim_mark:}\verb*+ + matches the end of the token
 %   list: then |##1| is the token list and |##3| is
 %   \cs{@@_trim_spaces_auxii:w}. This hands the relevant tokens to the
 %   loop \cs{@@_trim_spaces_auxiii:w}, responsible for trimming
 %   trailing spaces. The end is reached when \verb*+ + \cs{s_@@_nil}
-%   matches the one present in the definition of \cs{tl_trim_spacs:n}.
+%   matches the one present in the definition of \cs{tl_trim_spaces:n}.
 %   Then \cs{@@_trim_spaces_auxiv:w} puts the token list into a group,
-%   with \cs{use_none:n} placed there to gobble a lingering \cs{s_@@_mark},
-%   and feeds this to the \meta{continuation}.
+%   with a lingering \cs{@@_trim_mark:} at the start (which will expand to
+%   nothing in one step of expansion), and feeds this to the
+%   \meta{continuation}.
 %    \begin{macrocode}
-\cs_set:Npn \@@_tmp:w #1
+\cs_set_protected:Npn \@@_tmp:w #1
   {
     \cs_new:Npn \@@_trim_spaces:nn ##1
       {
@@ -2689,23 +2761,24 @@
         \@@_trim_spaces_auxi:w
           ##1
           \s_@@_nil
-          \s_@@_mark #1 { }
-          \s_@@_mark \@@_trim_spaces_auxii:w
+          \@@_trim_mark: #1 { }
+          \@@_trim_mark: \@@_trim_spaces_auxii:w
           \@@_trim_spaces_auxiii:w
           #1 \s_@@_nil
           \@@_trim_spaces_auxiv:w
         \s_@@_stop
       }
-    \cs_new:Npn \@@_trim_spaces_auxi:w ##1 \s_@@_mark #1 ##2 \s_@@_mark ##3
+    \cs_new:Npn
+        \@@_trim_spaces_auxi:w ##1 \@@_trim_mark: #1 ##2 \@@_trim_mark: ##3
       {
         ##3
         \@@_trim_spaces_auxi:w
-        \s_@@_mark
+        \@@_trim_mark:
         ##2
-        \s_@@_mark #1 {##1}
+        \@@_trim_mark: #1 {##1}
       }
     \cs_new:Npn \@@_trim_spaces_auxii:w
-        \@@_trim_spaces_auxi:w \s_@@_mark \s_@@_mark ##1
+        \@@_trim_spaces_auxi:w \@@_trim_mark: \@@_trim_mark: ##1
       {
         \@@_trim_spaces_auxiii:w
         ##1
@@ -2717,7 +2790,8 @@
         \@@_trim_spaces_auxiii:w
       }
     \cs_new:Npn \@@_trim_spaces_auxiv:w ##1 \s_@@_nil ##2 \s_@@_stop ##3
-      { ##3 { \use_none:n ##1 } }
+      { ##3 { ##1 } }
+    \cs_new:Npn \@@_trim_mark: {}
   }
 \@@_tmp:w { ~ }
 %    \end{macrocode}
@@ -2724,6 +2798,7 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}
 %   {\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn, \tl_sort:nN}
@@ -2730,159 +2805,6 @@
 %   Implemented in \pkg{l3sort}.
 % \end{macro}
 %
-% \subsection{Token by token changes}
-%
-% \begin{variable}{\q_@@_act_mark, \q_@@_act_stop}
-%   The \cs[no-index]{@@_act_\ldots{}} functions may be applied to any token list.
-%   Hence, we use two private quarks, to allow any token, even quarks,
-%   in the token list.
-%   Only \cs{q_@@_act_mark} and \cs{q_@@_act_stop} may not appear
-%   in the token lists manipulated by \cs{@@_act:NNNnn} functions.
-%    \begin{macrocode}
-\quark_new:N \q_@@_act_mark
-\quark_new:N \q_@@_act_stop
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP]{\@@_act:NNNnn}
-% \begin{macro}[EXP]{\@@_act_output:n, \@@_act_reverse_output:n}
-% \begin{macro}[EXP]{\@@_act_loop:w}
-% \begin{macro}[EXP]{\@@_act_normal:NwnNNN}
-% \begin{macro}[EXP]{\@@_act_group:nwnNNN}
-% \begin{macro}[EXP]{\@@_act_space:wwnNNN}
-% \begin{macro}[EXP]{\@@_act_end:w}
-%   To help control the expansion, \cs{@@_act:NNNnn} should always
-%   be proceeded by \cs{exp:w} and ends by producing \cs{exp_end:}
-%   once the result has been obtained. Then loop over tokens,
-%   groups, and spaces in |#5|. The marker \cs{q_@@_act_mark}
-%   is used both to avoid losing outer braces and to detect the
-%   end of the token list more easily. The result is stored
-%   as an argument for the dummy function \cs{@@_act_result:n}.
-%    \begin{macrocode}
-\cs_new:Npn \@@_act:NNNnn #1#2#3#4#5
-  {
-    \group_align_safe_begin:
-    \@@_act_loop:w #5 \q_@@_act_mark \q_@@_act_stop
-    {#4} #1 #2 #3
-    \@@_act_result:n { }
-  }
-%    \end{macrocode}
-%   In the loop, we check how the token list begins and act
-%   accordingly. In the \enquote{normal} case, we may have
-%   reached \cs{q_@@_act_mark}, the end of the list. Then
-%   leave \cs{exp_end:} and the result in the input stream,
-%   to terminate the expansion of \cs{exp:w}.
-%   Otherwise, apply the relevant function to the
-%   \enquote{arguments}, |#3|
-%   and to the head of the token list. Then repeat the loop.
-%   The scheme is the same if the token list starts with a
-%   group or with a space. Some extra work is needed to
-%   make \cs{@@_act_space:wwnNNN} gobble the space.
-%    \begin{macrocode}
-\cs_new:Npn \@@_act_loop:w #1 \q_@@_act_stop
-  {
-    \tl_if_head_is_N_type:nTF {#1}
-      { \@@_act_normal:NwnNNN }
-      {
-        \tl_if_head_is_group:nTF {#1}
-          { \@@_act_group:nwnNNN }
-          { \@@_act_space:wwnNNN }
-      }
-    #1 \q_@@_act_stop
-  }
-\cs_new:Npn \@@_act_normal:NwnNNN #1 #2 \q_@@_act_stop #3#4
-  {
-    \if_meaning:w \q_@@_act_mark #1
-      \exp_after:wN \@@_act_end:wn
-    \fi:
-    #4 {#3} #1
-    \@@_act_loop:w #2 \q_@@_act_stop
-    {#3} #4
-  }
-\cs_new:Npn \@@_act_end:wn #1 \@@_act_result:n #2
-  { \group_align_safe_end: \exp_end: #2 }
-\cs_new:Npn \@@_act_group:nwnNNN #1 #2 \q_@@_act_stop #3#4#5
-  {
-    #5 {#3} {#1}
-    \@@_act_loop:w #2 \q_@@_act_stop
-    {#3} #4 #5
-  }
-\exp_last_unbraced:NNo
-  \cs_new:Npn \@@_act_space:wwnNNN \c_space_tl #1 \q_@@_act_stop #2#3#4#5
-  {
-    #5 {#2}
-    \@@_act_loop:w #1 \q_@@_act_stop
-    {#2} #3 #4 #5
-  }
-%    \end{macrocode}
-%   Typically, the output is done to the right of what was already output,
-%   using \cs{@@_act_output:n}, but for the \cs{@@_act_reverse} functions,
-%   it should be done to the left.
-%    \begin{macrocode}
-\cs_new:Npn \@@_act_output:n #1 #2 \@@_act_result:n #3
-  { #2 \@@_act_result:n { #3 #1 } }
-\cs_new:Npn \@@_act_reverse_output:n #1 #2 \@@_act_result:n #3
-  { #2 \@@_act_result:n { #1 #3 } }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\tl_reverse:n, \tl_reverse:o, \tl_reverse:V}
-% \begin{macro}[EXP]{\@@_reverse_normal:nN}
-% \begin{macro}[EXP]{\@@_reverse_group_preserve:nn}
-% \begin{macro}[EXP]{\@@_reverse_space:n}
-%   The goal here is to reverse without losing spaces nor braces.
-%   This is done using the general internal function \cs{@@_act:NNNnn}.
-%   Spaces and \enquote{normal} tokens are output on the left of the current
-%   output. Grouped tokens are output to the left but without any reversal
-%   within the group. All of the internal functions here drop one argument:
-%   this is needed by \cs{@@_act:NNNnn} when changing case (to record
-%   which direction the change is in), but not when reversing the tokens.
-%    \begin{macrocode}
-\cs_new:Npn \tl_reverse:n #1
-  {
-    \__kernel_exp_not:w \exp_after:wN
-      {
-        \exp:w
-        \@@_act:NNNnn
-          \@@_reverse_normal:nN
-          \@@_reverse_group_preserve:nn
-          \@@_reverse_space:n
-          { }
-          {#1}
-      }
-  }
-\cs_generate_variant:Nn \tl_reverse:n { o , V }
-\cs_new:Npn \@@_reverse_normal:nN #1#2
-  { \@@_act_reverse_output:n {#2} }
-\cs_new:Npn \@@_reverse_group_preserve:nn #1#2
-  { \@@_act_reverse_output:n { {#2} } }
-\cs_new:Npn \@@_reverse_space:n #1
-  { \@@_act_reverse_output:n { ~ } }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tl_reverse:N, \tl_reverse:c, \tl_greverse:N, \tl_greverse:c}
-%   This reverses the list, leaving \cs{exp_stop_f:} in front,
-%   which stops the \texttt{f}-expansion.
-%    \begin{macrocode}
-\cs_new_protected:Npn \tl_reverse:N #1
-  { \tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
-\cs_new_protected:Npn \tl_greverse:N #1
-  { \tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
-\cs_generate_variant:Nn \tl_reverse:N  { c }
-\cs_generate_variant:Nn \tl_greverse:N { c }
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsection{The first token from a token list}
 %
 % \begin{macro}{\tl_head:N, \tl_head:n, \tl_head:V, \tl_head:v, \tl_head:f}
@@ -2895,33 +2817,50 @@
 %   empty result. The result is returned within the \tn{unexpanded} primitive.
 %   The approach here is to use \cs{if_false:} to allow us to use |}| as
 %   the closing delimiter: this is the only safe choice, as any other token
-%   would not be able to parse it's own code. Using a marker, we can see if
-%   what we are grabbing is exactly the marker, or there is anything else to
-%   deal with. Is there is, there is a loop. If not, tidy up and leave the
-%   item in the output stream. More detail in
+%   would not be able to parse it's own code. If the \tn{expanded} primitive
+%   is available it is used to get a fast and safe code variant in which we
+%   don't have to ensure that the left-most token is an internal to not break
+%   in an |f|-type expansion. If \tn{expanded} isn't available, using a marker,
+%   we can see if what we are grabbing is exactly the marker, or there is
+%   anything else to deal with. If there is, there is a loop. If not, tidy up
+%   and leave the item in the output stream. More detail in
 %   \url{http://tex.stackexchange.com/a/70168}.
 %    \begin{macrocode}
-\cs_new:Npn \tl_head:n #1
+\cs_if_exist:NTF \tex_expanded:D
   {
-    \__kernel_exp_not:w
-      \if_false: { \fi: \@@_head_auxi:nw #1 { } \s_@@_stop }
+    \cs_new:Npn \tl_head:n #1
+      {
+        \__kernel_exp_not:w \tex_expanded:D
+          { { \if_false: { \fi: \@@_head_aux:n #1 { } } } }
+      }
+    \cs_new:Npn \@@_head_aux:n #1
+      {
+        \__kernel_exp_not:w {#1}
+        \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+      }
   }
-\cs_new:Npn \@@_head_auxi:nw #1#2 \s_@@_stop
   {
-    \exp_after:wN \@@_head_auxii:n \exp_after:wN {
-      \if_false: } \fi: {#1}
+    \cs_new:Npn \tl_head:n #1
+      {
+        \__kernel_exp_not:w
+          \if_false: { \fi: \@@_head_auxi:nw #1 { } \s_@@_stop }
+      }
+    \cs_new:Npn \@@_head_auxi:nw #1#2 \s_@@_stop
+      {
+        \exp_after:wN \@@_head_auxii:n \exp_after:wN {
+          \if_false: } \fi: {#1}
+      }
+    \exp_args:Nno \use:n
+      { \cs_new:Npn \@@_head_auxii:n #1 }
+      {
+        \@@_if_empty_if:o { \use_none:n #1 }
+          \exp_after:wN \use_ii:nnn
+        \fi:
+        \use_ii:nn
+          {#1}
+          { \if_false: { \fi: \@@_head_auxi:nw #1 } }
+      }
   }
-\cs_new:Npn \@@_head_auxii:n #1
-  {
-    \exp_after:wN \if_meaning:w \exp_after:wN \q_@@_nil
-      \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q_@@_nil
-      \exp_after:wN \use_i:nn
-    \else:
-      \exp_after:wN \use_ii:nn
-    \fi:
-      {#1}
-      { \if_false: { \fi: \@@_head_auxi:nw #1 } }
-  }
 \cs_generate_variant:Nn \tl_head:n { V , v , f }
 \cs_new:Npn \tl_head:w #1#2 \q_stop {#1}
 \cs_new:Npn \@@_tl_head:w #1#2 \s_@@_stop {#1}
@@ -2942,9 +2881,9 @@
 %   While we could optimise the test here, this would leave some tokens
 %   \enquote{banned} in the input, which we do not have with this definition.
 %    \begin{macrocode}
-\cs_new:Npn \tl_tail:n #1
+\exp_args:Nno \use:n { \cs_new:Npn \tl_tail:n #1 }
   {
-    \__kernel_exp_not:w
+    \exp_after:wN \__kernel_exp_not:w
       \tl_if_blank:nTF {#1}
         { { } }
         { \exp_after:wN { \use_none:n #1 } }
@@ -2961,6 +2900,9 @@
 % \begin{macro}[pTF]{\tl_if_head_eq_charcode:nN}
 % \begin{macro}[pTF]{\tl_if_head_eq_charcode:fN}
 % \begin{macro}[pTF]{\tl_if_head_eq_catcode:nN}
+% \begin{macro}[pTF]{\tl_if_head_eq_catcode:oN}
+% \begin{macro}[EXP]{\@@_head_exp_not:w}
+% \begin{macro}[EXP]{\@@_if_head_eq_empty_arg:w}
 %   Accessing the first token of a token list is tricky in three cases:
 %   when it has category code $1$ (begin-group token), when it is an
 %   explicit space, with category code $10$ and character code $32$, or
@@ -2980,21 +2922,17 @@
 %   cases, the first token is a character, and since we only care about
 %   its character code, we can use \cs{str_head:n} to access it (this
 %   works even if it is a space character).  An empty argument
-%   results in \cs{tl_head:w} leaving two tokens: |?| which is taken in
-%   the \cs{if_charcode:w} test, and \cs{use_none:nn}, which ensures
-%   that \cs{prg_return_false:} is returned regardless of whether the
-%   charcode test was \texttt{true} or \texttt{false}.
+%   results in \cs{tl_head:w} leaving two token: |^| and
+%   \cs{@@_if_head_eq_empty_arg:w} which will result in the \cs{if_charcode:w}
+%   test being false and remove \cs{exp_not:N} and |#2|.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_head_eq_charcode:nN #1#2 { p , T , F , TF }
   {
     \if_charcode:w
-        \exp_not:N #2
         \tl_if_head_is_N_type:nTF { #1 ? }
-          {
-            \exp_after:wN \exp_not:N
-            \@@_tl_head:w #1 { ? \use_none:nn } \s_@@_stop
-          }
+          { \@@_head_exp_not:w #1 { ^ \@@_if_head_eq_empty_arg:w } \s_@@_stop }
           { \str_head:n {#1} }
+        \exp_not:N #2
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -3008,24 +2946,20 @@
 %   first token is a begin-group token or an explicit space token, and
 %   produce the relevant token, either \cs{c_group_begin_token} or
 %   \cs{c_space_token}.  Again, for an empty argument, a hack is used,
-%   removing \cs{prg_return_true:} and \cs{else:} with \cs{use_none:nn}
-%   in case the catcode test with the (arbitrarily chosen) |?| is
-%   \texttt{true}.
+%   removing the token given by the user and leaving two tokens in the input
+%   stream which will make the \cs{if_catcode:w} test return \texttt{false}.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF }
   {
     \if_catcode:w
-        \exp_not:N #2
         \tl_if_head_is_N_type:nTF { #1 ? }
+          { \@@_head_exp_not:w #1 { ^ \@@_if_head_eq_empty_arg:w } \s_@@_stop }
           {
-            \exp_after:wN \exp_not:N
-            \@@_tl_head:w #1 { ? \use_none:nn } \s_@@_stop
-          }
-          {
             \tl_if_head_is_group:nTF {#1}
-              { \c_group_begin_token }
-              { \c_space_token }
+              \c_group_begin_token
+              \c_space_token
           }
+        \exp_not:N #2
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -3038,7 +2972,8 @@
 %   the normal case, use \cs{tl_head:w}, with no \cs{exp_not:N} this
 %   time, since \cs{if_meaning:w} causes no expansion.  With an empty
 %   argument, the test is \texttt{true}, and \cs{use_none:nnn} removes
-%   |#2| and the usual \cs{prg_return_true:} and \cs{else:}.
+%   |#2| and \cs{prg_return_true:} and \cs{else:} (it is safe this way here as
+%   in this case \cs{prg_new_conditional:Npnn} didn't optimize these two away).
 %   In the special cases, we know that the first token is a character,
 %   hence \cs{if_charcode:w} and \cs{if_catcode:w} together are enough.
 %   We combine them in some order, hopefully faster than the reverse.
@@ -3048,8 +2983,8 @@
 \prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF }
   {
     \tl_if_head_is_N_type:nTF { #1 ? }
-      { \@@_if_head_eq_meaning_normal:nN }
-      { \@@_if_head_eq_meaning_special:nN }
+      \@@_if_head_eq_meaning_normal:nN
+      \@@_if_head_eq_meaning_special:nN
     {#1} #2
   }
 \cs_new:Npn \@@_if_head_eq_meaning_normal:nN #1 #2
@@ -3064,11 +2999,11 @@
 \cs_new:Npn \@@_if_head_eq_meaning_special:nN #1 #2
   {
     \if_charcode:w \str_head:n {#1} \exp_not:N #2
-      \exp_after:wN \use:n
+      \exp_after:wN \use_ii:nn
     \else:
       \prg_return_false:
-      \exp_after:wN \use_none:n
     \fi:
+    \use_none:n
     {
       \if_catcode:w \exp_not:N #2
                     \tl_if_head_is_group:nTF {#1}
@@ -3081,48 +3016,79 @@
     }
   }
 %    \end{macrocode}
+%
+%   Both \cs{tl_if_head_eq_charcode:nN} and \cs{tl_if_head_eq_catcode:nN} will
+%   need to get the first token of their argument and apply \cs{exp_not:N} to
+%   it. \cs{@@_head_exp_not:w} does exactly that.
+%    \begin{macrocode}
+\cs_new:Npn \@@_head_exp_not:w #1 #2 \s_@@_stop
+  { \exp_not:N #1 }
+%    \end{macrocode}
+%
+%   If the argument of \cs{tl_if_head_eq_charcode:nN} and
+%   \cs{tl_if_head_eq_catcode:nN} was empty \cs{@@_if_head_eq_empty_arg:w} will
+%   be left in the input stream. This macro has to remove \cs{exp_not:N} and
+%   the following token from the input stream to make sure no unbalanced
+%   if-construct is created and leave tokens there which make the two tests
+%   return \texttt{false}.
+%    \begin{macrocode}
+\cs_new:Npn \@@_if_head_eq_empty_arg:w \exp_not:N #1
+  { ? }
+%    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[pTF]{\tl_if_head_is_N_type:n}
-% \begin{macro}[EXP]{\@@_if_head_is_N_type:w}
+% \begin{macro}[EXP]
+%   {
+%     \@@_if_head_is_N_type_auxi:w   ,
+%     \@@_if_head_is_N_type_auxii:nn ,
+%     \@@_if_head_is_N_type_auxiii:n
+%   }
 %   A token list can be empty, can start with an explicit space
 %   character (catcode 10 and charcode 32), can start with a begin-group
 %   token (catcode 1), or start with an \texttt{N}-type argument.  In
-%   the first two cases, the line involving \cs{@@_if_head_is_N_type:w}
-%   produces~|^| (and otherwise nothing).  In the third case
-%   (begin-group token), the lines involving \cs{exp_after:wN} produce a
+%   the first two cases, the line involving \cs{@@_if_head_is_N_type_auxi:w}
+%   produces~|f| (and otherwise nothing).  In the third case
+%   (begin-group token), the lines involving \cs{token_to_str:N} produce a
 %   single closing brace.  The category code test is thus true exactly
 %   in the fourth case, which is what we want.  One cannot optimize by
-%   moving one of the |*| to the beginning: if |#1| contains primitive
-%   conditionals, all of its occurrences must be dealt with before the
-%   \cs{if_catcode:w} tries to skip the \texttt{true} branch of the
+%   moving one of the \cs{scan_stop:} to the beginning: if |#1| contains
+%   primitive conditionals, all of its occurrences must be dealt with before
+%   the \cs{if:w} tries to skip the \texttt{true} branch of the
 %   conditional.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF }
   {
-    \if_catcode:w
-        \if_false: { \fi: \@@_if_head_is_N_type:w ? #1 ~ }
-        \exp_after:wN \use_none:n
-          \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
-        * *
+    \if:w
+        \if_false: { \fi: \@@_if_head_is_N_type_auxi:w \prg_do_nothing: #1 ~ }
+        { \exp_after:wN { \token_to_str:N #1 } }
+        \scan_stop: \scan_stop:
       \prg_return_true:
     \else:
       \prg_return_false:
     \fi:
   }
-\cs_new:Npn \@@_if_head_is_N_type:w #1 ~
+\exp_args:Nno \use:n { \cs_new:Npn \@@_if_head_is_N_type_auxi:w #1 ~ }
   {
-    \tl_if_empty:oTF { \use_none:n #1 } { ^ } { }
-    \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+    \tl_if_empty:oTF { #1 }
+      { f \exp_after:wN \use_none:nn }
+      { \exp_after:wN \@@_if_head_is_N_type_auxii:n }
+    \exp_after:wN { \if_false: } \fi:
   }
+\cs_new:Npn \@@_if_head_is_N_type_auxii:n #1
+  { \exp_after:wN \use_none:n \exp_after:wN }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 %
 % \begin{macro}[EXP,pTF]{\tl_if_head_is_group:n}
+% \begin{macro}[EXP]{\@@_if_head_is_group_fi_false:w}
 %   Pass the first token of |#1| through \cs{token_to_str:N}, then check
 %   for the brace balance.  The extra \texttt{?} caters for an empty
 %   argument.  This could be made faster, but we need all brace tricks
@@ -3131,41 +3097,48 @@
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF }
   {
-    \if_catcode:w
+    \if:w
         \exp_after:wN \use_none:n
           \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
-        * *
+        \scan_stop: \scan_stop:
+      \@@_if_head_is_group_fi_false:w
+    \fi:
+    \if_true:
+      \prg_return_true:
+    \else:
       \prg_return_false:
-    \else:
-      \prg_return_true:
     \fi:
   }
+\cs_new:Npn \@@_if_head_is_group_fi_false:w \fi: \if_true: { \fi: \if_false: }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}[EXP,pTF]{\tl_if_head_is_space:n}
 % \begin{macro}[EXP]{\@@_if_head_is_space:w}
 %   The auxiliary's argument is all that is before the first explicit
-%   space in |?#1?~|.  If that is a single~|?| the test yields
-%   \texttt{true}.  Otherwise, that is more than one token, and the test
-%   yields \texttt{false}.  The work is done within braces (with an
+%   space in |\prg_do_nothing:#1?~|.  If that is a single~|\prg_do_nothing:| the
+%   test yields \texttt{true}.  Otherwise, that is more than one token, and the
+%   test yields \texttt{false}.  The work is done within braces (with an
 %   |\if_false: { \fi: ... }| construction) both to hide potential
 %   alignment tab characters from \TeX{} in a table, and to allow for
-%   removing what remains of the token list after its first space.  The
-%   \cs{exp:w} and \cs{exp_end:} ensure that the result of a
-%   single step of expansion directly yields a balanced token list (no
-%   trailing closing brace).
+%   removing what remains of the token list after its first space.  The use of
+%   \cs{if:w} ensures that the result of a single step of expansion directly
+%   yields a balanced token list (no trailing closing brace).
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_head_is_space:n #1 { p , T , F , TF }
   {
-    \exp:w \if_false: { \fi:
-      \@@_if_head_is_space:w ? #1 ? ~ }
+    \if:w
+        \if_false: { \fi: \@@_if_head_is_space:w \prg_do_nothing: #1 ? ~ }
+        \scan_stop: \scan_stop:
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
-\cs_new:Npn \@@_if_head_is_space:w #1 ~
+\exp_args:Nno \use:n { \cs_new:Npn \@@_if_head_is_space:w #1 ~ }
   {
-    \tl_if_empty:oTF { \use_none:n #1 }
-      { \exp_after:wN \exp_end: \exp_after:wN \prg_return_true: }
-      { \exp_after:wN \exp_end: \exp_after:wN \prg_return_false: }
+    \@@_if_empty_if:o {#1} \else: f \fi:
     \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
   }
 %    \end{macrocode}
@@ -3172,6 +3145,188 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Token by token changes}
+%
+% \begin{variable}{\s_@@_act_stop}
+%   The \cs[no-index]{@@_act_\ldots{}} functions may be applied to any token list.
+%   Hence, we use a private quark, to allow any token, even quarks,
+%   in the token list.
+%   Only \cs{s_@@_act_stop} may not appear in the token lists manipulated by
+%   \cs{@@_act:NNNn} functions.
+%    \begin{macrocode}
+\scan_new:N \s_@@_act_stop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_act:NNNn}
+% \begin{macro}[EXP]{\@@_act_output:n, \@@_act_reverse_output:n}
+% \begin{macro}[EXP]{\@@_act_loop:w}
+% \begin{macro}[EXP]{\@@_act_normal:NwNNN}
+% \begin{macro}[EXP]{\@@_act_group:nwNNN}
+% \begin{macro}[EXP]{\@@_act_space:wwNNN}
+% \begin{macro}[EXP]{\@@_act_end:w}
+% \begin{macro}[EXP]
+%   {
+%     \@@_act_if_head_is_space:nTF,
+%     \@@_act_if_head_is_space:w,
+%     \@@_act_if_head_is_space_true:w
+%   }
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_q_act_stop:w}
+%   To help control the expansion, \cs{@@_act:NNNn} should always
+%   be preceeded by \cs{exp:w} and ends by producing \cs{exp_end:}
+%   once the result has been obtained. This way no internal token of it can be
+%   accidentally end up in the input stream.
+%   Because \cs{s_@@_act_stop} can't appear without braces around it in the
+%   argument~|#1| of \cs{@@_act_loop:w}, we can use this marker to set up a fast
+%   test for leading spaces.
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_tmp:w #1
+  {
+    \cs_new:Npn \@@_act_if_head_is_space:nTF ##1
+      {
+        \@@_act_if_head_is_space:w
+          \s_@@_act_stop ##1 \s_@@_act_stop \@@_act_if_head_is_space_true:w
+          \s_@@_act_stop #1  \s_@@_act_stop \use_ii:nn
+      }
+    \cs_new:Npn \@@_act_if_head_is_space:w
+        ##1 \s_@@_act_stop #1 ##2 \s_@@_act_stop
+      {}
+    \cs_new:Npn \@@_act_if_head_is_space_true:w
+        \s_@@_act_stop #1 \s_@@_act_stop \use_ii:nn ##1 ##2
+      {##1}
+  }
+\@@_tmp:w { ~ }
+%    \end{macrocode}
+%   (We expand the definition \cs{@@_act_if_head_is_space:nTF} when
+%   setting up \cs{@@_act_loop:w}, so we can then undefine the auxiliary.)
+%   In the loop, we check how the token list begins and act
+%   accordingly. In the \enquote{group} case, we may have
+%   reached \cs{s_@@_act_stop}, the end of the list. Then
+%   leave \cs{exp_end:} and the result in the input stream,
+%   to terminate the expansion of \cs{exp:w}.
+%   Otherwise, apply the relevant function to the
+%   \enquote{arguments}, |#3|
+%   and to the head of the token list. Then repeat the loop.
+%   The scheme is the same if the token list starts with an |N|-type
+%   or with a space, making sure that
+%   \cs{@@_act_space:wwNNN} gobbles the space.
+%    \begin{macrocode}
+\exp_args:Nnx \use:n { \cs_new:Npn \@@_act_loop:w #1 \s_@@_act_stop }
+  {
+    \exp_not:o { \@@_act_if_head_is_space:nTF {#1} }
+      \exp_not:N \@@_act_space:wwNNN
+      {
+        \exp_not:o { \tl_if_head_is_group:nTF {#1} }
+          \exp_not:N \@@_act_group:nwNNN
+          \exp_not:N \@@_act_normal:NwNNN
+      }
+    \exp_not:n {#1} \s_@@_act_stop
+  }
+\cs_undefine:N \@@_act_if_head_is_space:nTF
+\cs_new:Npn \@@_act_normal:NwNNN #1 #2 \s_@@_act_stop #3
+  {
+    #3 #1
+    \@@_act_loop:w #2 \s_@@_act_stop
+    #3
+  }
+\cs_new:Npn \@@_use_none_delimit_by_s_act_stop:w #1 \s_@@_act_stop { }
+\cs_new:Npn \@@_act_end:wn #1 \@@_act_result:n #2
+  { \group_align_safe_end: \exp_end: #2 }
+\cs_new:Npn \@@_act_group:nwNNN #1 #2 \s_@@_act_stop #3#4#5
+  {
+    \@@_use_none_delimit_by_s_act_stop:w #1 \@@_act_end:wn \s_@@_act_stop
+    #5 {#1}
+    \@@_act_loop:w #2 \s_@@_act_stop
+    #3 #4 #5
+  }
+\exp_last_unbraced:NNo
+  \cs_new:Npn \@@_act_space:wwNNN \c_space_tl #1 \s_@@_act_stop #2#3
+  {
+    #3
+    \@@_act_loop:w #1 \s_@@_act_stop
+    #2 #3
+  }
+%    \end{macrocode}
+%   \cs{@@_act:NNNn} loops over tokens, groups, and spaces in |#4|.
+%   |{\s_@@_act_stop}| serves as the end of token list marker, the |?| after it
+%   avoids losing outer braces. The result is stored as an argument for the
+%   dummy function \cs{@@_act_result:n}.
+%    \begin{macrocode}
+\cs_new:Npn \@@_act:NNNn #1#2#3#4
+  {
+    \group_align_safe_begin:
+    \@@_act_loop:w #4 { \s_@@_act_stop } ? \s_@@_act_stop
+    #1 #3 #2
+    \@@_act_result:n { }
+  }
+%    \end{macrocode}
+%   Typically, the output is done to the right of what was already output,
+%   using \cs{@@_act_output:n}, but for the \cs{@@_act_reverse} functions,
+%   it should be done to the left.
+%    \begin{macrocode}
+\cs_new:Npn \@@_act_output:n #1 #2 \@@_act_result:n #3
+  { #2 \@@_act_result:n { #3 #1 } }
+\cs_new:Npn \@@_act_reverse_output:n #1 #2 \@@_act_result:n #3
+  { #2 \@@_act_result:n { #1 #3 } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\tl_reverse:n, \tl_reverse:o, \tl_reverse:V}
+% \begin{macro}[EXP]{\@@_reverse_normal:nN}
+% \begin{macro}[EXP]{\@@_reverse_group_preserve:nn}
+% \begin{macro}[EXP]{\@@_reverse_space:n}
+%   The goal here is to reverse without losing spaces nor braces.
+%   This is done using the general internal function \cs{@@_act:NNNn}.
+%   Spaces and \enquote{normal} tokens are output on the left of the current
+%   output. Grouped tokens are output to the left but without any reversal
+%   within the group.
+%    \begin{macrocode}
+\cs_new:Npn \tl_reverse:n #1
+  {
+    \__kernel_exp_not:w \exp_after:wN
+      {
+        \exp:w
+        \@@_act:NNNn
+          \@@_reverse_normal:N
+          \@@_reverse_group_preserve:n
+          \@@_reverse_space:
+          {#1}
+      }
+  }
+\cs_generate_variant:Nn \tl_reverse:n { o , V }
+\cs_new:Npn \@@_reverse_normal:N
+  { \@@_act_reverse_output:n }
+\cs_new:Npn \@@_reverse_group_preserve:n #1
+  { \@@_act_reverse_output:n { {#1} } }
+\cs_new:Npn \@@_reverse_space:
+  { \@@_act_reverse_output:n { ~ } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tl_reverse:N, \tl_reverse:c, \tl_greverse:N, \tl_greverse:c}
+%   This reverses the list, leaving \cs{exp_stop_f:} in front,
+%   which stops the \texttt{f}-expansion.
+%    \begin{macrocode}
+\cs_new_protected:Npn \tl_reverse:N #1
+  { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
+\cs_new_protected:Npn \tl_greverse:N #1
+  { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
+\cs_generate_variant:Nn \tl_reverse:N  { c }
+\cs_generate_variant:Nn \tl_greverse:N { c }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Using a single item}
 %
 % \begin{macro}{\tl_item:nn, \tl_item:Nn, \tl_item:cn}
@@ -3373,7 +3528,10 @@
 \cs_new_protected:Npn \@@_show:NN #1#2
   {
     \__kernel_chk_defined:NT #2
-      { \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } }
+      {
+        \exp_args:Ne #1
+          { \token_to_str:N #2 = \__kernel_exp_not:w \exp_after:wN {#2} }
+      }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -3459,7 +3617,13 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% We finally clean up a temporary control sequence that we have used at
+% various points to set up some definitions.
 %    \begin{macrocode}
+\cs_undefine:N \@@_tmp:w
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -692,6 +692,14 @@
 %   Tests if the \meta{token} is defined to be a mathchardef.
 % \end{function}
 %
+% \begin{function}[EXP,pTF, added=2020-10-27]{\token_if_font_selection:N}
+%   \begin{syntax}
+%     \cs{token_if_font_selection_p:N} \meta{token} \\
+%     \cs{token_if_font_selection:NTF} \meta{token} \Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Tests if the \meta{token} is defined to be a font selection command.
+% \end{function}
+%
 % \begin{function}[EXP,pTF, updated=2012-01-20]{\token_if_dim_register:N}
 %   \begin{syntax}
 %     \cs{token_if_dim_register_p:N} \meta{token} \\
@@ -1496,7 +1504,7 @@
       \tl_put_right:Nn \l_@@_tmp_tl { ^^@ \if_false: } }
       \char_set_catcode_group_end:n { 0 }
       \tl_put_right:Nn \l_@@_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % }
-      \tl_set:Nx \l_@@_tmp_tl { \l_@@_tmp_tl }
+      \__kernel_tl_set:Nx \l_@@_tmp_tl { \l_@@_tmp_tl }
       \char_set_catcode_math_toggle:n { 0 }
       \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
       \char_set_catcode_alignment:n { 0 }
@@ -2222,6 +2230,7 @@
 %     \@@_delimit_by_char":w,
 %     \@@_delimit_by_count:w,
 %     \@@_delimit_by_dimen:w,
+%     \@@_delimit_by_ font:w,
 %     \@@_delimit_by_macro:w,
 %     \@@_delimit_by_muskip:w,
 %     \@@_delimit_by_skip:w,
@@ -2233,6 +2242,9 @@
 %   argument delimited by a string, a second one delimited by
 %   \cs{s_@@_stop}, and returns the first one and its delimiter.
 %   This result is eventually compared to another string.
+%   Note that the ``font'' auxiliary is delimited by a space followed by
+%   ``\texttt{font}''.  This avoids an unnecessary check for the
+%   \tn{font} primitive below.
 %    \begin{macrocode}
 \group_begin:
 \cs_set_protected:Npn \@@_tmp:w #1
@@ -2247,6 +2259,7 @@
 \@@_tmp:w { char" }
 \@@_tmp:w { count }
 \@@_tmp:w { dimen }
+\@@_tmp:w { ~ font }
 \@@_tmp:w { macro }
 \@@_tmp:w { muskip }
 \@@_tmp:w { skip }
@@ -2260,6 +2273,7 @@
 %     \token_if_chardef:N,               \token_if_mathchardef:N,
 %                                        \token_if_long_macro:N,
 %     \token_if_protected_macro:N,       \token_if_protected_long_macro:N,
+%     \token_if_font_selection:N,
 %     \token_if_dim_register:N,          \token_if_int_register:N,
 %     \token_if_muskip_register:N,
 %     \token_if_skip_register:N,         \token_if_toks_register:N,
@@ -2292,8 +2306,9 @@
 %   space after |\protected| but a space after |\long|, hence the
 %   mixture of \cs{token_to_str:N} and \cs{tl_to_str:n}.
 %
-%   For the first five conditionals, \cs{cs_if_exist:cT} turns out to
-%   be \texttt{false}, and the code boils down to a string comparison
+%   For the first six conditionals, \cs{cs_if_exist:cT} turns out to
+%   be \texttt{false} (thanks to the leading space for \texttt{font}),
+%   and the code boils down to a string comparison
 %   between the result of the auxiliary on the \tn{meaning} of the
 %   conditional's argument~|####1|, and~|#3|.  Both are evaluated at
 %   run-time, as this is important to get the correct escape character.
@@ -2348,6 +2363,7 @@
   { \tl_to_str:n { \protected } macro }
 \@@_tmp:w { protected_long_macro } { macro }
   { \token_to_str:N \protected \tl_to_str:n { \long } macro }
+\@@_tmp:w { font_selection } { ~ font } { select ~ font }
 \@@_tmp:w { dim_register } { dimen } { \token_to_str:N \dimen }
 \@@_tmp:w { int_register } { count } { \token_to_str:N \count }
 \@@_tmp:w { muskip_register } { muskip } { \token_to_str:N \muskip }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -139,7 +139,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2020-10-05}{}
+\ProvidesExplPackage{l3keys2e}{2020-10-27}{}
   {LaTeX2e option processing using LaTeX3 keys}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -64,7 +64,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -167,7 +167,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2020-10-05}{}
+\ProvidesExplPackage{xfp}{2020-10-27}{}
   {L3 Floating point unit}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -65,7 +65,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -535,7 +535,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2020-10-05}{}
+\ProvidesExplPackage{xfrac}{2020-10-27}{}
   {L3 Experimental split-level fractions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -984,7 +984,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{xparse}{2020-10-05}{}
+\ProvidesExplPackage{xparse}{2020-10-27}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %
@@ -1038,7 +1038,7 @@
 %  an issue if the user has |openin_any = p| with older binaries.
 %    \begin{macrocode}
 %<*2ekernel|package>
-\input { xparse-generic.tex }
+\input xparse-generic.tex ~
 %</2ekernel|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-10-05}
+% \date{Released 2020-10-27}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2020-10-05}{}
+\ProvidesExplPackage{xtemplate}{2020-10-27}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3benchmark.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3benchmark}{2020-09-24}{}
+\ProvidesExplPackage{l3benchmark}{2020-10-27}{}
   {L3 Experimental benchmarking}
 \sys_if_engine_luatex:TF
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3color.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3color}{2020-09-24}{}
+\ProvidesExplPackage{l3color}{2020-10-27}{}
   {L3 Experimental color support}
 \int_new:N \l__color_internal_int
 \tl_new:N \l__color_internal_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -28,7 +28,7 @@
 %% 
 %% File: l3draw.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2020-09-24}{}
+\ProvidesExplPackage{l3draw}{2020-10-27}{}
   {L3 Experimental core drawing support}
 \RequirePackage { l3color }
 \scan_new:N \s__draw_mark

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3graphics.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3graphics}{2020-09-24}{}
+\ProvidesExplPackage{l3graphics}{2020-10-27}{}
   {L3 Experimental graphics inclusion support}
 \ior_new:N \l__graphics_tmp_ior
 \tl_new:N  \l__graphics_tmp_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3pdf.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3pdf}{2020-09-24}{}
+\ProvidesExplPackage{l3pdf}{2020-10-27}{}
   {L3 Experimental core PDF support}
 \scan_new:N \s__pdf_stop
 \bool_new:N \g__pdf_init_bool

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2020-09-24}{}
+\ProvidesExplPackage{l3str-format}{2020-10-27}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3sys-shell.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3sys-shell}{2020-09-24}{}
+\ProvidesExplPackage{l3sys-shell}{2020-10-27}{}
   {L3 Experimental system shell functions}
 \scan_new:N \s__sys_stop
 \quark_new:N \q__sys_nil

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2020-09-24}{}
+\ProvidesExplPackage{xcoffins}{2020-10-27}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2020-09-24}{}
+\ProvidesExplPackage{l3galley}{2020-10-27}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -20,7 +20,7 @@
 %% 
 %% File: xgalley.dtx
 \RequirePackage{xparse}
-\ProvidesExplPackage{xgalley}{2020-09-24}{}
+\ProvidesExplPackage{xgalley}{2020-10-27}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -69,7 +69,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-10-05}%
+\def\ExplFileDate{2020-10-27}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -3626,6 +3626,8 @@
   }
 \cs_new:Npn \use_none_delimit_by_s_stop:w #1 \s_stop { }
 %% File: l3tl.dtx
+\cs_new_eq:NN \__kernel_tl_set:Nx  \cs_set_nopar:Npx
+\cs_new_eq:NN \__kernel_tl_gset:Nx \cs_gset_nopar:Npx
 \cs_new_protected:Npn \tl_new:N #1
   {
     \__kernel_chk_if_free_cs:N #1
@@ -3635,7 +3637,7 @@
 \cs_new_protected:Npn \tl_const:Nn #1#2
   {
     \__kernel_chk_if_free_cs:N #1
-    \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
+    \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} }
   }
 \cs_new_protected:Npn \tl_const:Nx #1#2
   {
@@ -3661,9 +3663,21 @@
 \cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
 \cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
-  { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+  {
+    \__kernel_tl_set:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#3}
+      }
+  }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
-  { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+  {
+    \__kernel_tl_gset:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#3}
+      }
+  }
 \cs_generate_variant:Nn \tl_concat:NNN  { ccc }
 \cs_generate_variant:Nn \tl_gconcat:NNN { ccc }
 \prg_new_eq_conditional:NNn \tl_if_exist:N \cs_if_exist:N { TF , T , F , p }
@@ -3680,17 +3694,17 @@
   }
 \tl_const:Nn \c_space_tl { ~ }
 \cs_new_protected:Npn \tl_set:Nn #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w {#2} } }
 \cs_new_protected:Npn \tl_set:No #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
 \cs_new_protected:Npn \tl_set:Nx #1#2
-  { \cs_set_nopar:Npx #1 {#2} }
+  { \__kernel_tl_set:Nx #1 {#2} }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w {#2} } }
 \cs_new_protected:Npn \tl_gset:No #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
-  { \cs_gset_nopar:Npx #1 {#2} }
+  { \__kernel_tl_gset:Nx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
 \cs_generate_variant:Nn \tl_set:Nx  { c }
 \cs_generate_variant:Nn \tl_set:Nn  { c, co , cV , cv , cf }
@@ -3698,21 +3712,45 @@
 \cs_generate_variant:Nn \tl_gset:Nx { c }
 \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_set:Nx #1
+      { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+  {
+    \__kernel_tl_set:Nx #1
+      { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_put_left:No #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_set:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#1}
+      }
+  }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
-  { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
+  { \__kernel_tl_set:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#2}
+        \__kernel_exp_not:w \exp_after:wN {#1}
+      }
+  }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
-  { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
+  { \__kernel_tl_gset:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
 \cs_generate_variant:Nn \tl_put_left:NV  { c }
 \cs_generate_variant:Nn \tl_put_left:No  { c }
@@ -3722,21 +3760,39 @@
 \cs_generate_variant:Nn \tl_gput_left:No { c }
 \cs_generate_variant:Nn \tl_gput_left:Nx { c }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+  {
+    \__kernel_tl_set:Nx #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 }
+  }
 \cs_new_protected:Npn \tl_put_right:No #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+  {
+    \__kernel_tl_set:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#1}
+        \__kernel_exp_not:w \exp_after:wN {#2}
+      }
+  }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
-  { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
+  { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+  {
+    \__kernel_tl_gset:Nx #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 }
+  }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+  {
+    \__kernel_tl_gset:Nx #1
+      {
+        \__kernel_exp_not:w \exp_after:wN {#1}
+        \__kernel_exp_not:w \exp_after:wN {#2}
+      }
+  }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
-  { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
+  { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
 \cs_generate_variant:Nn \tl_put_right:NV  { c }
 \cs_generate_variant:Nn \tl_put_right:No  { c }
@@ -3756,9 +3812,11 @@
 \cs_new_protected:Npn \tl_rescan:nn #1#2
   {
     \tl_set_rescan:Nnn \l__tl_internal_a_tl {#1} {#2}
-    \exp_after:wN \tl_clear:N \exp_after:wN \l__tl_internal_a_tl
+    \exp_after:wN \__tl_rescan_aux:
     \l__tl_internal_a_tl
   }
+\exp_args:NNo \cs_new_protected:Npn \__tl_rescan_aux:
+  { \tl_clear:N \l__tl_internal_a_tl }
 \cs_new_protected:Npn \tl_set_rescan:Nnn
   { \__tl_set_rescan:NNnn \tl_set:No }
 \cs_new_protected:Npn \tl_gset_rescan:Nnn
@@ -3777,7 +3835,7 @@
   }
 \cs_new_protected:Npn \__tl_set_rescan_multi:nNN #1#2#3
   {
-    \exp_args:No \tex_everyeof:D { \c__tl_rescan_marker_tl }
+    \tex_everyeof:D \exp_after:wN { \c__tl_rescan_marker_tl }
     \exp_after:wN \__tl_rescan:NNw
     \exp_after:wN #2
     \exp_after:wN #3
@@ -3850,13 +3908,13 @@
   \c__tl_rescan_marker_tl #2
   { \use_i:nn \exp_end: #1 }
 \cs_new_protected:Npn \tl_replace_once:Nnn
-  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \tl_set:Nx  }
+  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \tl_greplace_once:Nnn
-  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \tl_gset:Nx }
+  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \tl_replace_all:Nnn
-  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \tl_set:Nx  }
+  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \tl_greplace_all:Nnn
-  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \tl_gset:Nx }
+  { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \__kernel_tl_gset:Nx }
 \cs_generate_variant:Nn \tl_replace_once:Nnn  { c }
 \cs_generate_variant:Nn \tl_greplace_once:Nnn { c }
 \cs_generate_variant:Nn \tl_replace_all:Nnn   { c }
@@ -3893,7 +3951,7 @@
   {
     \group_align_safe_begin:
     \cs_set:Npn \__tl_replace_wrap:w ##1 #1 ##2
-      { \exp_not:o { \use_none:nn ##1 } ##2 }
+      { \__kernel_exp_not:w \exp_after:wN { \use_none:nn ##1 } ##2 }
     \cs_set:Npx \__tl_replace_next:w ##1 #5
       {
         \exp_not:N \__tl_replace_wrap:w ##1
@@ -3903,9 +3961,7 @@
       }
     #3 #4
       {
-        \exp_after:wN \__tl_replace_next:w
-        \exp_after:wN { \exp_after:wN }
-        \exp_after:wN { \exp_after:wN }
+        \exp_after:wN \__tl_replace_next_aux:w
         #4
         #1
         {
@@ -3916,6 +3972,7 @@
       }
     \group_align_safe_end:
   }
+\cs_new:Npn \__tl_replace_next_aux:w { \__tl_replace_next:w { } { } }
 \cs_new_eq:NN \__tl_replace_wrap:w ?
 \cs_new_eq:NN \__tl_replace_next:w ?
 \cs_new_protected:Npn \tl_remove_once:Nn #1#2
@@ -3930,16 +3987,6 @@
   { \tl_greplace_all:Nnn #1 {#2} { } }
 \cs_generate_variant:Nn \tl_remove_all:Nn  { c }
 \cs_generate_variant:Nn \tl_gremove_all:Nn { c }
-\prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
-  {
-    \__tl_if_empty_if:o { \use_none:n #1 ? }
-      \prg_return_true:
-    \else:
-      \prg_return_false:
-    \fi:
-  }
-\prg_generate_conditional_variant:Nnn \tl_if_blank:n
-  { e , V , o } { p , T , F , TF }
 \prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF }
   {
     \if_meaning:w #1 \c_empty_tl
@@ -3952,8 +3999,7 @@
   { c } { p , T , F , TF }
 \prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F }
   {
-    \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil
-        \tl_to_str:n {#1} \q__tl_nil
+    \if:w \scan_stop: \tl_to_str:n {#1} \scan_stop:
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -3963,10 +4009,10 @@
   { V } { p , TF , T , F }
 \cs_new:Npn \__tl_if_empty_if:o #1
   {
-    \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil
-      \__kernel_tl_to_str:w \exp_after:wN {#1} \q__tl_nil
+    \if:w \scan_stop: \__kernel_tl_to_str:w \exp_after:wN {#1} \scan_stop:
   }
-\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
+\exp_args:Nno \use:n
+  { \prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } }
   {
     \__tl_if_empty_if:o {#1}
       \prg_return_true:
@@ -3974,6 +4020,17 @@
       \prg_return_false:
     \fi:
  }
+\exp_args:Nno \use:n
+  { \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF } }
+  {
+    \__tl_if_empty_if:o { \use_none:n #1 ? }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\prg_generate_conditional_variant:Nnn \tl_if_blank:n
+  { e , V , o } { p , T , F , TF }
 \prg_new_conditional:Npnn \tl_if_eq:NN #1#2 { p , T , F , TF }
   {
     \if_meaning:w #1 #2
@@ -4048,9 +4105,9 @@
 \cs_new:Npn \tl_if_single:NTF { \exp_args:No \tl_if_single:nTF }
 \prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF }
   {
-    \if_catcode:w ^ \exp_after:wN \__tl_if_single:nnw
+    \if:w \scan_stop: \exp_after:wN \__tl_if_single:nnw
         \__kernel_tl_to_str:w
-          \exp_after:wN { \use_none:nn #1 ?? } ^ ? \s__tl_stop
+          \exp_after:wN { \use_none:nn #1 ?? } \scan_stop: ? \s__tl_stop
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -4196,18 +4253,16 @@
   {
     \int_eval:n
       {
-        \__tl_act:NNNnn
-          \__tl_act_count_normal:nN
-          \__tl_act_count_group:nn
-          \__tl_act_count_space:n
-          { }
+        \__tl_act:NNNn
+          \__tl_act_count_normal:N
+          \__tl_act_count_group:n
+          \__tl_act_count_space:
           {#1}
       }
   }
-\cs_new:Npn \__tl_act_count_normal:nN #1 #2 { 1 + }
-\cs_new:Npn \__tl_act_count_space:n #1 { 1 + }
-\cs_new:Npn \__tl_act_count_group:nn #1 #2
-  { 2 + \tl_count_tokens:n {#2} + }
+\cs_new:Npn \__tl_act_count_normal:N #1 { 1 + }
+\cs_new:Npn \__tl_act_count_space: { 1 + }
+\cs_new:Npn \__tl_act_count_group:n #1 { 2 + \tl_count_tokens:n {#1} + }
 \cs_new:Npn \tl_reverse_items:n #1
   {
     \__tl_reverse_items:nwNwn #1 ?
@@ -4223,20 +4278,24 @@
       \s__tl_stop { {#1} #5 }
   }
 \cs_new:Npn \__tl_reverse_items:wn #1 \s__tl_stop #2
-  { \exp_not:o { \use_none:nn #2 } }
+  { \__kernel_exp_not:w \exp_after:wN { \use_none:nn #2 } }
 \cs_new:Npn \tl_trim_spaces:n #1
-  { \__tl_trim_spaces:nn { \s__tl_mark #1 } \exp_not:o }
+  {
+    \__tl_trim_spaces:nn
+      { \__tl_trim_mark: #1 }
+      { \__kernel_exp_not:w \exp_after:wN }
+  }
 \cs_generate_variant:Nn \tl_trim_spaces:n { o }
 \cs_new:Npn \tl_trim_spaces_apply:nN #1#2
-  { \__tl_trim_spaces:nn { \s__tl_mark #1 } { \exp_args:No #2 } }
+  { \__tl_trim_spaces:nn { \__tl_trim_mark: #1 } { \exp_args:No #2 } }
 \cs_generate_variant:Nn \tl_trim_spaces_apply:nN { o }
 \cs_new_protected:Npn \tl_trim_spaces:N #1
-  { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
+  { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
 \cs_new_protected:Npn \tl_gtrim_spaces:N #1
-  { \tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
+  { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
 \cs_generate_variant:Nn \tl_trim_spaces:N  { c }
 \cs_generate_variant:Nn \tl_gtrim_spaces:N { c }
-\cs_set:Npn \__tl_tmp:w #1
+\cs_set_protected:Npn \__tl_tmp:w #1
   {
     \cs_new:Npn \__tl_trim_spaces:nn ##1
       {
@@ -4243,23 +4302,24 @@
         \__tl_trim_spaces_auxi:w
           ##1
           \s__tl_nil
-          \s__tl_mark #1 { }
-          \s__tl_mark \__tl_trim_spaces_auxii:w
+          \__tl_trim_mark: #1 { }
+          \__tl_trim_mark: \__tl_trim_spaces_auxii:w
           \__tl_trim_spaces_auxiii:w
           #1 \s__tl_nil
           \__tl_trim_spaces_auxiv:w
         \s__tl_stop
       }
-    \cs_new:Npn \__tl_trim_spaces_auxi:w ##1 \s__tl_mark #1 ##2 \s__tl_mark ##3
+    \cs_new:Npn
+        \__tl_trim_spaces_auxi:w ##1 \__tl_trim_mark: #1 ##2 \__tl_trim_mark: ##3
       {
         ##3
         \__tl_trim_spaces_auxi:w
-        \s__tl_mark
+        \__tl_trim_mark:
         ##2
-        \s__tl_mark #1 {##1}
+        \__tl_trim_mark: #1 {##1}
       }
     \cs_new:Npn \__tl_trim_spaces_auxii:w
-        \__tl_trim_spaces_auxi:w \s__tl_mark \s__tl_mark ##1
+        \__tl_trim_spaces_auxi:w \__tl_trim_mark: \__tl_trim_mark: ##1
       {
         \__tl_trim_spaces_auxiii:w
         ##1
@@ -4271,111 +4331,52 @@
         \__tl_trim_spaces_auxiii:w
       }
     \cs_new:Npn \__tl_trim_spaces_auxiv:w ##1 \s__tl_nil ##2 \s__tl_stop ##3
-      { ##3 { \use_none:n ##1 } }
+      { ##3 { ##1 } }
+    \cs_new:Npn \__tl_trim_mark: {}
   }
 \__tl_tmp:w { ~ }
-\quark_new:N \q__tl_act_mark
-\quark_new:N \q__tl_act_stop
-\cs_new:Npn \__tl_act:NNNnn #1#2#3#4#5
+\cs_if_exist:NTF \tex_expanded:D
   {
-    \group_align_safe_begin:
-    \__tl_act_loop:w #5 \q__tl_act_mark \q__tl_act_stop
-    {#4} #1 #2 #3
-    \__tl_act_result:n { }
-  }
-\cs_new:Npn \__tl_act_loop:w #1 \q__tl_act_stop
-  {
-    \tl_if_head_is_N_type:nTF {#1}
-      { \__tl_act_normal:NwnNNN }
+    \cs_new:Npn \tl_head:n #1
       {
-        \tl_if_head_is_group:nTF {#1}
-          { \__tl_act_group:nwnNNN }
-          { \__tl_act_space:wwnNNN }
+        \__kernel_exp_not:w \tex_expanded:D
+          { { \if_false: { \fi: \__tl_head_aux:n #1 { } } } }
       }
-    #1 \q__tl_act_stop
+    \cs_new:Npn \__tl_head_aux:n #1
+      {
+        \__kernel_exp_not:w {#1}
+        \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+      }
   }
-\cs_new:Npn \__tl_act_normal:NwnNNN #1 #2 \q__tl_act_stop #3#4
   {
-    \if_meaning:w \q__tl_act_mark #1
-      \exp_after:wN \__tl_act_end:wn
-    \fi:
-    #4 {#3} #1
-    \__tl_act_loop:w #2 \q__tl_act_stop
-    {#3} #4
-  }
-\cs_new:Npn \__tl_act_end:wn #1 \__tl_act_result:n #2
-  { \group_align_safe_end: \exp_end: #2 }
-\cs_new:Npn \__tl_act_group:nwnNNN #1 #2 \q__tl_act_stop #3#4#5
-  {
-    #5 {#3} {#1}
-    \__tl_act_loop:w #2 \q__tl_act_stop
-    {#3} #4 #5
-  }
-\exp_last_unbraced:NNo
-  \cs_new:Npn \__tl_act_space:wwnNNN \c_space_tl #1 \q__tl_act_stop #2#3#4#5
-  {
-    #5 {#2}
-    \__tl_act_loop:w #1 \q__tl_act_stop
-    {#2} #3 #4 #5
-  }
-\cs_new:Npn \__tl_act_output:n #1 #2 \__tl_act_result:n #3
-  { #2 \__tl_act_result:n { #3 #1 } }
-\cs_new:Npn \__tl_act_reverse_output:n #1 #2 \__tl_act_result:n #3
-  { #2 \__tl_act_result:n { #1 #3 } }
-\cs_new:Npn \tl_reverse:n #1
-  {
-    \__kernel_exp_not:w \exp_after:wN
+    \cs_new:Npn \tl_head:n #1
       {
-        \exp:w
-        \__tl_act:NNNnn
-          \__tl_reverse_normal:nN
-          \__tl_reverse_group_preserve:nn
-          \__tl_reverse_space:n
-          { }
+        \__kernel_exp_not:w
+          \if_false: { \fi: \__tl_head_auxi:nw #1 { } \s__tl_stop }
+      }
+    \cs_new:Npn \__tl_head_auxi:nw #1#2 \s__tl_stop
+      {
+        \exp_after:wN \__tl_head_auxii:n \exp_after:wN {
+          \if_false: } \fi: {#1}
+      }
+    \exp_args:Nno \use:n
+      { \cs_new:Npn \__tl_head_auxii:n #1 }
+      {
+        \__tl_if_empty_if:o { \use_none:n #1 }
+          \exp_after:wN \use_ii:nnn
+        \fi:
+        \use_ii:nn
           {#1}
+          { \if_false: { \fi: \__tl_head_auxi:nw #1 } }
       }
   }
-\cs_generate_variant:Nn \tl_reverse:n { o , V }
-\cs_new:Npn \__tl_reverse_normal:nN #1#2
-  { \__tl_act_reverse_output:n {#2} }
-\cs_new:Npn \__tl_reverse_group_preserve:nn #1#2
-  { \__tl_act_reverse_output:n { {#2} } }
-\cs_new:Npn \__tl_reverse_space:n #1
-  { \__tl_act_reverse_output:n { ~ } }
-\cs_new_protected:Npn \tl_reverse:N #1
-  { \tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
-\cs_new_protected:Npn \tl_greverse:N #1
-  { \tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
-\cs_generate_variant:Nn \tl_reverse:N  { c }
-\cs_generate_variant:Nn \tl_greverse:N { c }
-\cs_new:Npn \tl_head:n #1
-  {
-    \__kernel_exp_not:w
-      \if_false: { \fi: \__tl_head_auxi:nw #1 { } \s__tl_stop }
-  }
-\cs_new:Npn \__tl_head_auxi:nw #1#2 \s__tl_stop
-  {
-    \exp_after:wN \__tl_head_auxii:n \exp_after:wN {
-      \if_false: } \fi: {#1}
-  }
-\cs_new:Npn \__tl_head_auxii:n #1
-  {
-    \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil
-      \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q__tl_nil
-      \exp_after:wN \use_i:nn
-    \else:
-      \exp_after:wN \use_ii:nn
-    \fi:
-      {#1}
-      { \if_false: { \fi: \__tl_head_auxi:nw #1 } }
-  }
 \cs_generate_variant:Nn \tl_head:n { V , v , f }
 \cs_new:Npn \tl_head:w #1#2 \q_stop {#1}
 \cs_new:Npn \__tl_tl_head:w #1#2 \s__tl_stop {#1}
 \cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n }
-\cs_new:Npn \tl_tail:n #1
+\exp_args:Nno \use:n { \cs_new:Npn \tl_tail:n #1 }
   {
-    \__kernel_exp_not:w
+    \exp_after:wN \__kernel_exp_not:w
       \tl_if_blank:nTF {#1}
         { { } }
         { \exp_after:wN { \use_none:n #1 } }
@@ -4385,13 +4386,10 @@
 \prg_new_conditional:Npnn \tl_if_head_eq_charcode:nN #1#2 { p , T , F , TF }
   {
     \if_charcode:w
-        \exp_not:N #2
         \tl_if_head_is_N_type:nTF { #1 ? }
-          {
-            \exp_after:wN \exp_not:N
-            \__tl_tl_head:w #1 { ? \use_none:nn } \s__tl_stop
-          }
+          { \__tl_head_exp_not:w #1 { ^ \__tl_if_head_eq_empty_arg:w } \s__tl_stop }
           { \str_head:n {#1} }
+        \exp_not:N #2
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -4402,17 +4400,14 @@
 \prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF }
   {
     \if_catcode:w
-        \exp_not:N #2
         \tl_if_head_is_N_type:nTF { #1 ? }
+          { \__tl_head_exp_not:w #1 { ^ \__tl_if_head_eq_empty_arg:w } \s__tl_stop }
           {
-            \exp_after:wN \exp_not:N
-            \__tl_tl_head:w #1 { ? \use_none:nn } \s__tl_stop
-          }
-          {
             \tl_if_head_is_group:nTF {#1}
-              { \c_group_begin_token }
-              { \c_space_token }
+              \c_group_begin_token
+              \c_space_token
           }
+        \exp_not:N #2
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -4423,8 +4418,8 @@
 \prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF }
   {
     \tl_if_head_is_N_type:nTF { #1 ? }
-      { \__tl_if_head_eq_meaning_normal:nN }
-      { \__tl_if_head_eq_meaning_special:nN }
+      \__tl_if_head_eq_meaning_normal:nN
+      \__tl_if_head_eq_meaning_special:nN
     {#1} #2
   }
 \cs_new:Npn \__tl_if_head_eq_meaning_normal:nN #1 #2
@@ -4439,11 +4434,11 @@
 \cs_new:Npn \__tl_if_head_eq_meaning_special:nN #1 #2
   {
     \if_charcode:w \str_head:n {#1} \exp_not:N #2
-      \exp_after:wN \use:n
+      \exp_after:wN \use_ii:nn
     \else:
       \prg_return_false:
-      \exp_after:wN \use_none:n
     \fi:
+    \use_none:n
     {
       \if_catcode:w \exp_not:N #2
                     \tl_if_head_is_group:nTF {#1}
@@ -4455,46 +4450,148 @@
       \fi:
     }
   }
+\cs_new:Npn \__tl_head_exp_not:w #1 #2 \s__tl_stop
+  { \exp_not:N #1 }
+\cs_new:Npn \__tl_if_head_eq_empty_arg:w \exp_not:N #1
+  { ? }
 \prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF }
   {
-    \if_catcode:w
-        \if_false: { \fi: \__tl_if_head_is_N_type:w ? #1 ~ }
-        \exp_after:wN \use_none:n
-          \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
-        * *
+    \if:w
+        \if_false: { \fi: \__tl_if_head_is_N_type_auxi:w \prg_do_nothing: #1 ~ }
+        { \exp_after:wN { \token_to_str:N #1 } }
+        \scan_stop: \scan_stop:
       \prg_return_true:
     \else:
       \prg_return_false:
     \fi:
   }
-\cs_new:Npn \__tl_if_head_is_N_type:w #1 ~
+\exp_args:Nno \use:n { \cs_new:Npn \__tl_if_head_is_N_type_auxi:w #1 ~ }
   {
-    \tl_if_empty:oTF { \use_none:n #1 } { ^ } { }
-    \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+    \tl_if_empty:oTF { #1 }
+      { f \exp_after:wN \use_none:nn }
+      { \exp_after:wN \__tl_if_head_is_N_type_auxii:n }
+    \exp_after:wN { \if_false: } \fi:
   }
+\cs_new:Npn \__tl_if_head_is_N_type_auxii:n #1
+  { \exp_after:wN \use_none:n \exp_after:wN }
 \prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF }
   {
-    \if_catcode:w
+    \if:w
         \exp_after:wN \use_none:n
           \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
-        * *
+        \scan_stop: \scan_stop:
+      \__tl_if_head_is_group_fi_false:w
+    \fi:
+    \if_true:
+      \prg_return_true:
+    \else:
       \prg_return_false:
-    \else:
-      \prg_return_true:
     \fi:
   }
+\cs_new:Npn \__tl_if_head_is_group_fi_false:w \fi: \if_true: { \fi: \if_false: }
 \prg_new_conditional:Npnn \tl_if_head_is_space:n #1 { p , T , F , TF }
   {
-    \exp:w \if_false: { \fi:
-      \__tl_if_head_is_space:w ? #1 ? ~ }
+    \if:w
+        \if_false: { \fi: \__tl_if_head_is_space:w \prg_do_nothing: #1 ? ~ }
+        \scan_stop: \scan_stop:
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
-\cs_new:Npn \__tl_if_head_is_space:w #1 ~
+\exp_args:Nno \use:n { \cs_new:Npn \__tl_if_head_is_space:w #1 ~ }
   {
-    \tl_if_empty:oTF { \use_none:n #1 }
-      { \exp_after:wN \exp_end: \exp_after:wN \prg_return_true: }
-      { \exp_after:wN \exp_end: \exp_after:wN \prg_return_false: }
+    \__tl_if_empty_if:o {#1} \else: f \fi:
     \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
   }
+\scan_new:N \s__tl_act_stop
+\cs_set_protected:Npn \__tl_tmp:w #1
+  {
+    \cs_new:Npn \__tl_act_if_head_is_space:nTF ##1
+      {
+        \__tl_act_if_head_is_space:w
+          \s__tl_act_stop ##1 \s__tl_act_stop \__tl_act_if_head_is_space_true:w
+          \s__tl_act_stop #1  \s__tl_act_stop \use_ii:nn
+      }
+    \cs_new:Npn \__tl_act_if_head_is_space:w
+        ##1 \s__tl_act_stop #1 ##2 \s__tl_act_stop
+      {}
+    \cs_new:Npn \__tl_act_if_head_is_space_true:w
+        \s__tl_act_stop #1 \s__tl_act_stop \use_ii:nn ##1 ##2
+      {##1}
+  }
+\__tl_tmp:w { ~ }
+\exp_args:Nnx \use:n { \cs_new:Npn \__tl_act_loop:w #1 \s__tl_act_stop }
+  {
+    \exp_not:o { \__tl_act_if_head_is_space:nTF {#1} }
+      \exp_not:N \__tl_act_space:wwNNN
+      {
+        \exp_not:o { \tl_if_head_is_group:nTF {#1} }
+          \exp_not:N \__tl_act_group:nwNNN
+          \exp_not:N \__tl_act_normal:NwNNN
+      }
+    \exp_not:n {#1} \s__tl_act_stop
+  }
+\cs_undefine:N \__tl_act_if_head_is_space:nTF
+\cs_new:Npn \__tl_act_normal:NwNNN #1 #2 \s__tl_act_stop #3
+  {
+    #3 #1
+    \__tl_act_loop:w #2 \s__tl_act_stop
+    #3
+  }
+\cs_new:Npn \__tl_use_none_delimit_by_s_act_stop:w #1 \s__tl_act_stop { }
+\cs_new:Npn \__tl_act_end:wn #1 \__tl_act_result:n #2
+  { \group_align_safe_end: \exp_end: #2 }
+\cs_new:Npn \__tl_act_group:nwNNN #1 #2 \s__tl_act_stop #3#4#5
+  {
+    \__tl_use_none_delimit_by_s_act_stop:w #1 \__tl_act_end:wn \s__tl_act_stop
+    #5 {#1}
+    \__tl_act_loop:w #2 \s__tl_act_stop
+    #3 #4 #5
+  }
+\exp_last_unbraced:NNo
+  \cs_new:Npn \__tl_act_space:wwNNN \c_space_tl #1 \s__tl_act_stop #2#3
+  {
+    #3
+    \__tl_act_loop:w #1 \s__tl_act_stop
+    #2 #3
+  }
+\cs_new:Npn \__tl_act:NNNn #1#2#3#4
+  {
+    \group_align_safe_begin:
+    \__tl_act_loop:w #4 { \s__tl_act_stop } ? \s__tl_act_stop
+    #1 #3 #2
+    \__tl_act_result:n { }
+  }
+\cs_new:Npn \__tl_act_output:n #1 #2 \__tl_act_result:n #3
+  { #2 \__tl_act_result:n { #3 #1 } }
+\cs_new:Npn \__tl_act_reverse_output:n #1 #2 \__tl_act_result:n #3
+  { #2 \__tl_act_result:n { #1 #3 } }
+\cs_new:Npn \tl_reverse:n #1
+  {
+    \__kernel_exp_not:w \exp_after:wN
+      {
+        \exp:w
+        \__tl_act:NNNn
+          \__tl_reverse_normal:N
+          \__tl_reverse_group_preserve:n
+          \__tl_reverse_space:
+          {#1}
+      }
+  }
+\cs_generate_variant:Nn \tl_reverse:n { o , V }
+\cs_new:Npn \__tl_reverse_normal:N
+  { \__tl_act_reverse_output:n }
+\cs_new:Npn \__tl_reverse_group_preserve:n #1
+  { \__tl_act_reverse_output:n { {#1} } }
+\cs_new:Npn \__tl_reverse_space:
+  { \__tl_act_reverse_output:n { ~ } }
+\cs_new_protected:Npn \tl_reverse:N #1
+  { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
+\cs_new_protected:Npn \tl_greverse:N #1
+  { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
+\cs_generate_variant:Nn \tl_reverse:N  { c }
+\cs_generate_variant:Nn \tl_greverse:N { c }
 \cs_new:Npn \tl_item:nn #1#2
   {
     \exp_args:Nf \__tl_item:nn
@@ -4630,7 +4727,10 @@
 \cs_new_protected:Npn \__tl_show:NN #1#2
   {
     \__kernel_chk_defined:NT #2
-      { \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } }
+      {
+        \exp_args:Ne #1
+          { \token_to_str:N #2 = \__kernel_exp_not:w \exp_after:wN {#2} }
+      }
   }
 \cs_new_protected:Npn \tl_show:n #1
   { \iow_wrap:nnnN { >~ \tl_to_str:n {#1} . } { } { } \__tl_show:n }
@@ -4656,6 +4756,7 @@
 \tl_new:N \g_tmpb_tl
 \tl_new:N \l_tmpa_tl
 \tl_new:N \l_tmpb_tl
+\cs_undefine:N \__tl_tmp:w
 %% File: l3str.dtx
 \scan_new:N \s__str_mark
 \scan_new:N \s__str_stop
@@ -4717,13 +4818,13 @@
     { }
 \group_end:
 \cs_new_protected:Npn \str_replace_once:Nnn
-  { \__str_replace:NNNnn \prg_do_nothing: \tl_set:Nx  }
+  { \__str_replace:NNNnn \prg_do_nothing: \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \str_greplace_once:Nnn
-  { \__str_replace:NNNnn \prg_do_nothing: \tl_gset:Nx }
+  { \__str_replace:NNNnn \prg_do_nothing: \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \str_replace_all:Nnn
-  { \__str_replace:NNNnn \__str_replace_next:w \tl_set:Nx  }
+  { \__str_replace:NNNnn \__str_replace_next:w \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \str_greplace_all:Nnn
-  { \__str_replace:NNNnn \__str_replace_next:w \tl_gset:Nx }
+  { \__str_replace:NNNnn \__str_replace_next:w \__kernel_tl_gset:Nx }
 \cs_generate_variant:Nn \str_replace_once:Nnn  { c }
 \cs_generate_variant:Nn \str_greplace_once:Nnn { c }
 \cs_generate_variant:Nn \str_replace_all:Nnn   { c }
@@ -5318,22 +5419,22 @@
 \cs_new_eq:NN \seq_gset_eq:cc \tl_gset_eq:cc
 \cs_new_protected:Npn \seq_set_from_clist:NN #1#2
   {
-    \tl_set:Nx #1
+    \__kernel_tl_set:Nx #1
       { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n }
   }
 \cs_new_protected:Npn \seq_set_from_clist:Nn #1#2
   {
-    \tl_set:Nx #1
+    \__kernel_tl_set:Nx #1
       { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n }
   }
 \cs_new_protected:Npn \seq_gset_from_clist:NN #1#2
   {
-    \tl_gset:Nx #1
+    \__kernel_tl_gset:Nx #1
       { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n }
   }
 \cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2
   {
-    \tl_gset:Nx #1
+    \__kernel_tl_gset:Nx #1
       { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n }
   }
 \cs_generate_variant:Nn \seq_set_from_clist:NN  {     Nc }
@@ -5349,9 +5450,9 @@
   }
 \cs_generate_variant:Nn \seq_const_from_clist:Nn { c }
 \cs_new_protected:Npn \seq_set_split:Nnn
-  { \__seq_set_split:NNnn \tl_set:Nx }
+  { \__seq_set_split:NNnn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_split:Nnn
-  { \__seq_set_split:NNnn \tl_gset:Nx }
+  { \__seq_set_split:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_set_split:NNnn #1#2#3#4
   {
     \tl_if_empty:nTF {#3}
@@ -5371,7 +5472,7 @@
             \__seq_set_split_end:
             \__seq_set_split_auxi:w \prg_do_nothing:
           }
-        \tl_set:Nx \l__seq_internal_a_tl { \l__seq_internal_a_tl }
+        \__kernel_tl_set:Nx \l__seq_internal_a_tl { \l__seq_internal_a_tl }
       }
     #1 #2 { \s__seq \l__seq_internal_a_tl }
   }
@@ -5397,7 +5498,7 @@
   { TF , T , F , p }
 \cs_new_protected:Npn \seq_put_left:Nn #1#2
   {
-    \tl_set:Nx #1
+    \__kernel_tl_set:Nx #1
       {
         \exp_not:n { \s__seq \__seq_item:n {#2} }
         \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 }
@@ -5405,7 +5506,7 @@
   }
 \cs_new_protected:Npn \seq_gput_left:Nn #1#2
   {
-    \tl_gset:Nx #1
+    \__kernel_tl_gset:Nx #1
       {
         \exp_not:n { \s__seq \__seq_item:n {#2} }
         \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 }
@@ -5443,9 +5544,9 @@
 \cs_generate_variant:Nn \seq_remove_duplicates:N  { c }
 \cs_generate_variant:Nn \seq_gremove_duplicates:N { c }
 \cs_new_protected:Npn \seq_remove_all:Nn
-  { \__seq_remove_all_aux:NNn \tl_set:Nx }
+  { \__seq_remove_all_aux:NNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gremove_all:Nn
-  { \__seq_remove_all_aux:NNn \tl_gset:Nx }
+  { \__seq_remove_all_aux:NNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_remove_all_aux:NNn #1#2#3
   {
     \__seq_push_item_def:n
@@ -5469,9 +5570,9 @@
 \cs_generate_variant:Nn \seq_remove_all:Nn  { c }
 \cs_generate_variant:Nn \seq_gremove_all:Nn { c }
 \cs_new_protected:Npn \seq_reverse:N
-  { \__seq_reverse:NN \tl_set:Nx }
+  { \__seq_reverse:NN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_greverse:N
-  { \__seq_reverse:NN \tl_gset:Nx }
+  { \__seq_reverse:NN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_reverse:NN #1 #2
   {
     \cs_set_eq:NN \__seq_tmp:w \__seq_item:n
@@ -5584,7 +5685,7 @@
   }
 \cs_new_protected:Npn \seq_get_left:NN #1#2
   {
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       {
         \exp_after:wN \__seq_get_left:wnw
         #1 \__seq_item:n { \q_no_value } \s__seq_stop
@@ -5609,7 +5710,7 @@
 \cs_generate_variant:Nn \seq_gpop_left:NN { c }
 \cs_new_protected:Npn \seq_get_right:NN #1#2
   {
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       {
         \exp_after:wN \use_i_ii:nnn
         \exp_after:wN \__seq_get_right_loop:nw
@@ -5626,9 +5727,9 @@
 \cs_new:Npn \__seq_get_right_end:NnN #1#2#3 { \exp_not:n {#2} }
 \cs_generate_variant:Nn \seq_get_right:NN { c }
 \cs_new_protected:Npn \seq_pop_right:NN
-  { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_set:Nx }
+  { \__seq_pop:NNNN \__seq_pop_right:NNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gpop_right:NN
-  { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_gset:Nx }
+  { \__seq_pop:NNNN \__seq_pop_right:NNN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_pop_right:NNN #1#2#3
   {
     \cs_set_eq:NN \__seq_tmp:w \__seq_item:n
@@ -5640,7 +5741,7 @@
         #2
         {
           \if_false: { \fi: }
-          \tl_set:Nx #3
+          \__kernel_tl_set:Nx #3
         }
         { } \use_none:nn
     \cs_set_eq:NN \__seq_item:n \__seq_tmp:w
@@ -5668,10 +5769,10 @@
   { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_gset:Nn #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2
   { T , F , TF }
-  { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_set:Nx #1 #2 }
+  { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \__kernel_tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2
   { T , F , TF }
-  { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_gset:Nx #1 #2 }
+  { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \__kernel_tl_gset:Nx #1 #2 }
 \prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c }
   { T , F , TF }
 \prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c }
@@ -5819,9 +5920,9 @@
     \int_value:w \int_eval:w 1 + #2 ;
   }
 \cs_new_protected:Npn \seq_set_map_x:NNn
-  { \__seq_set_map_x:NNNn \tl_set:Nx }
+  { \__seq_set_map_x:NNNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_map_x:NNn
-  { \__seq_set_map_x:NNNn \tl_gset:Nx }
+  { \__seq_set_map_x:NNNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_set_map_x:NNNn #1#2#3#4
   {
     \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
@@ -5829,9 +5930,9 @@
     \__seq_pop_item_def:
   }
 \cs_new_protected:Npn \seq_set_map:NNn
-  { \__seq_set_map:NNNn \tl_set:Nx }
+  { \__seq_set_map:NNNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_map:NNn
-  { \__seq_set_map:NNNn \tl_gset:Nx }
+  { \__seq_set_map:NNNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4
   {
     \__seq_push_item_def:n { \exp_not:n { \__seq_item:n {#4} } }
@@ -7478,7 +7579,7 @@
 \tl_new:N \g__sys_backend_tl
 \__sys_finalise:n
   {
-    \tl_gset:Nx \g__sys_backend_tl
+    \__kernel_tl_gset:Nx \g__sys_backend_tl
       {
         \sys_if_engine_xetex:TF
           { xdvipdfmx }
@@ -7594,9 +7695,9 @@
 \cs_new_eq:NN \clist_gset_eq:cN \tl_gset_eq:cN
 \cs_new_eq:NN \clist_gset_eq:cc \tl_gset_eq:cc
 \cs_new_protected:Npn \clist_set_from_seq:NN
-  { \__clist_set_from_seq:NNNN \clist_clear:N  \tl_set:Nx  }
+  { \__clist_set_from_seq:NNNN \clist_clear:N  \__kernel_tl_set:Nx  }
 \cs_new_protected:Npn \clist_gset_from_seq:NN
-  { \__clist_set_from_seq:NNNN \clist_gclear:N \tl_gset:Nx }
+  { \__clist_set_from_seq:NNNN \clist_gclear:N \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__clist_set_from_seq:NNNN #1#2#3#4
   {
     \seq_if_empty:NTF #4
@@ -7621,9 +7722,9 @@
 \cs_generate_variant:Nn \clist_gset_from_seq:NN {     Nc }
 \cs_generate_variant:Nn \clist_gset_from_seq:NN { c , cc }
 \cs_new_protected:Npn \clist_concat:NNN
-  { \__clist_concat:NNNN \tl_set:Nx }
+  { \__clist_concat:NNNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \clist_gconcat:NNN
-  { \__clist_concat:NNNN \tl_gset:Nx }
+  { \__clist_concat:NNNN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__clist_concat:NNNN #1#2#3#4
   {
     #1 #2
@@ -7640,9 +7741,9 @@
 \prg_new_eq_conditional:NNn \clist_if_exist:c \cs_if_exist:c
   { TF , T , F , p }
 \cs_new_protected:Npn \clist_set:Nn #1#2
-  { \tl_set:Nx #1 { \__clist_sanitize:n {#2} } }
+  { \__kernel_tl_set:Nx #1 { \__clist_sanitize:n {#2} } }
 \cs_new_protected:Npn \clist_gset:Nn #1#2
-  { \tl_gset:Nx #1 { \__clist_sanitize:n {#2} } }
+  { \__kernel_tl_gset:Nx #1 { \__clist_sanitize:n {#2} } }
 \cs_generate_variant:Nn \clist_set:Nn  { NV , No , Nx , c , cV , co , cx }
 \cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx }
 \cs_new_protected:Npn \clist_put_left:Nn
@@ -7683,9 +7784,9 @@
   { \tl_set:Nn #3 {#1} }
 \cs_generate_variant:Nn \clist_get:NN { c }
 \cs_new_protected:Npn \clist_pop:NN
-  { \__clist_pop:NNN \tl_set:Nx }
+  { \__clist_pop:NNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \clist_gpop:NN
-  { \__clist_pop:NNN \tl_gset:Nx }
+  { \__clist_pop:NNN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__clist_pop:NNN #1#2#3
   {
     \if_meaning:w #2 \c_empty_clist
@@ -7719,9 +7820,9 @@
   }
 \prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF }
-  { \__clist_pop_TF:NNN \tl_set:Nx #1 #2 }
+  { \__clist_pop_TF:NNN \__kernel_tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF }
-  { \__clist_pop_TF:NNN \tl_gset:Nx #1 #2 }
+  { \__clist_pop_TF:NNN \__kernel_tl_gset:Nx #1 #2 }
 \cs_new_protected:Npn \__clist_pop_TF:NNN #1#2#3
   {
     \if_meaning:w #2 \c_empty_clist
@@ -7768,9 +7869,9 @@
 \cs_generate_variant:Nn \clist_remove_duplicates:N  { c }
 \cs_generate_variant:Nn \clist_gremove_duplicates:N { c }
 \cs_new_protected:Npn \clist_remove_all:Nn
-  { \__clist_remove_all:NNNn \clist_set_from_seq:NN \tl_set:Nx }
+  { \__clist_remove_all:NNNn \clist_set_from_seq:NN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \clist_gremove_all:Nn
-  { \__clist_remove_all:NNNn \clist_gset_from_seq:NN \tl_gset:Nx }
+  { \__clist_remove_all:NNNn \clist_gset_from_seq:NN \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__clist_remove_all:NNNn #1#2#3#4
   {
     \__clist_if_wrap:nTF {#4}
@@ -7807,9 +7908,9 @@
 \cs_generate_variant:Nn \clist_remove_all:Nn  { c }
 \cs_generate_variant:Nn \clist_gremove_all:Nn { c }
 \cs_new_protected:Npn \clist_reverse:N #1
-  { \tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
+  { \__kernel_tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
 \cs_new_protected:Npn \clist_greverse:N #1
-  { \tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
+  { \__kernel_tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
 \cs_generate_variant:Nn \clist_reverse:N { c }
 \cs_generate_variant:Nn \clist_greverse:N { c }
 \cs_new:Npn \clist_reverse:n #1
@@ -8306,7 +8407,7 @@
       \tl_put_right:Nn \l__char_tmp_tl { ^^@ \if_false: } }
       \char_set_catcode_group_end:n { 0 }
       \tl_put_right:Nn \l__char_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % }
-      \tl_set:Nx \l__char_tmp_tl { \l__char_tmp_tl }
+      \__kernel_tl_set:Nx \l__char_tmp_tl { \l__char_tmp_tl }
       \char_set_catcode_math_toggle:n { 0 }
       \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
       \char_set_catcode_alignment:n { 0 }
@@ -8725,6 +8826,7 @@
 \__token_tmp:w { char" }
 \__token_tmp:w { count }
 \__token_tmp:w { dimen }
+\__token_tmp:w { ~ font }
 \__token_tmp:w { macro }
 \__token_tmp:w { muskip }
 \__token_tmp:w { skip }
@@ -8772,6 +8874,7 @@
   { \tl_to_str:n { \protected } macro }
 \__token_tmp:w { protected_long_macro } { macro }
   { \token_to_str:N \protected \tl_to_str:n { \long } macro }
+\__token_tmp:w { font_selection } { ~ font } { select ~ font }
 \__token_tmp:w { dim_register } { dimen } { \token_to_str:N \dimen }
 \__token_tmp:w { int_register } { count } { \token_to_str:N \count }
 \__token_tmp:w { muskip_register } { muskip } { \token_to_str:N \muskip }
@@ -9237,8 +9340,8 @@
   }
 \prg_generate_conditional_variant:Nnn \prop_pop:NnN { c } { T , F , TF }
 \prg_generate_conditional_variant:Nnn \prop_gpop:NnN { c } { T , F , TF }
-\cs_new_protected:Npn \prop_put:Nnn  { \__prop_put:NNnn \tl_set:Nx }
-\cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \tl_gset:Nx }
+\cs_new_protected:Npn \prop_put:Nnn  { \__prop_put:NNnn \__kernel_tl_set:Nx }
+\cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__prop_put:NNnn #1#2#3#4
   {
     \tl_set:Nn \l__prop_internal_tl
@@ -9259,9 +9362,9 @@
 \cs_generate_variant:Nn \prop_gput:Nnn
   { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
 \cs_new_protected:Npn \prop_put_if_new:Nnn
-  { \__prop_put_if_new:NNnn \tl_set:Nx }
+  { \__prop_put_if_new:NNnn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \prop_gput_if_new:Nnn
-  { \__prop_put_if_new:NNnn \tl_gset:Nx }
+  { \__prop_put_if_new:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__prop_put_if_new:NNnn #1#2#3#4
   {
     \tl_set:Nn \l__prop_internal_tl
@@ -10402,7 +10505,7 @@
       { \__ior_open_stream:Nn #1 {#2} }
       {
         \__ior_new:N #1
-        \tl_set:Nx \l__ior_stream_tl { \int_eval:n {#1} }
+        \__kernel_tl_set:Nx \l__ior_stream_tl { \int_eval:n {#1} }
         \__ior_open_stream:Nn #1 {#2}
       }
   }
@@ -10592,7 +10695,7 @@
 \tl_new:N \l__iow_file_name_tl
 \cs_new_protected:Npn \iow_open:Nn #1#2
   {
-    \tl_set:Nx \l__iow_file_name_tl
+    \__kernel_tl_set:Nx \l__iow_file_name_tl
       { \__kernel_file_name_sanitize:n {#2} }
     \iow_close:N #1
     \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl
@@ -10599,7 +10702,7 @@
       { \__iow_open_stream:NV #1 \l__iow_file_name_tl }
       {
         \__iow_new:N #1
-        \tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} }
+        \__kernel_tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} }
         \__iow_open_stream:NV #1 \l__iow_file_name_tl
       }
   }
@@ -10675,7 +10778,7 @@
 \cs_new:Npn \__iow_unindent:w { }
 \cs_new_protected:Npn \__iow_set_indent:n #1
   {
-    \tl_set:Nx \l__iow_one_indent_tl
+    \__kernel_tl_set:Nx \l__iow_one_indent_tl
       { \exp_args:No \__kernel_str_to_other_fast:n { \tl_to_str:n {#1} } }
     \int_set:Nn \l__iow_one_indent_int
       { \str_count:N \l__iow_one_indent_tl }
@@ -10750,11 +10853,11 @@
       \cs_set_eq:NN \iow_indent:n \__iow_indent:n
       #3
       \cs_set_eq:NN \protect \token_to_str:N
-      \tl_set:Nx \l__iow_wrap_tl {#1}
+      \__kernel_tl_set:Nx \l__iow_wrap_tl {#1}
       \cs_set_eq:NN \iow_allow_break: \__iow_allow_break_error:
       \cs_set_eq:NN \iow_indent:n \__iow_indent_error:n
-      \tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
-      \tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
+      \__kernel_tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
+      \__kernel_tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
       \int_set:Nn \l__iow_line_target_int
         { \l_iow_line_count_int - \str_count:N \l__iow_newline_tl + 1 }
        \int_compare:nNnT { \l__iow_line_target_int } < 0
@@ -10770,12 +10873,12 @@
 \cs_generate_variant:Nn \iow_wrap:nnnN { nx }
 \cs_new_protected:Npn \__iow_wrap_do:
   {
-    \tl_set:Nx \l__iow_wrap_tl
+    \__kernel_tl_set:Nx \l__iow_wrap_tl
       {
         \exp_args:No \__kernel_str_to_other_fast:n \l__iow_wrap_tl
         \c__iow_wrap_end_marker_tl
       }
-    \tl_set:Nx \l__iow_wrap_tl
+    \__kernel_tl_set:Nx \l__iow_wrap_tl
       {
         \exp_after:wN \__iow_wrap_fix_newline:w \l__iow_wrap_tl
           ^^J \q__iow_nil ^^J \s__iow_stop
@@ -10933,7 +11036,7 @@
   }
 \cs_new_protected:Npn \__iow_wrap_allow_break:n #1
   {
-    \tl_set:Nx \l__iow_line_tl
+    \__kernel_tl_set:Nx \l__iow_line_tl
       { \l__iow_line_tl \__iow_wrap_trim:N \l__iow_line_part_tl }
     \bool_set_false:N \l__iow_line_break_bool
     \tl_if_empty:NTF \l__iow_line_part_tl
@@ -10953,7 +11056,7 @@
     \tl_put_right:Nx \l__iow_line_tl { \l__iow_line_part_tl }
     \bool_set_false:N \l__iow_line_break_bool
     \int_sub:Nn \l__iow_indent_int { \l__iow_one_indent_int }
-    \tl_set:Nx \l__iow_indent_tl
+    \__kernel_tl_set:Nx \l__iow_indent_tl
       { \exp_after:wN \__iow_unindent:w \l__iow_indent_tl }
     \__iow_wrap_chunk:nw {#1}
   }
@@ -10972,9 +11075,9 @@
   }
 \cs_new_protected:Npn \__iow_wrap_store_do:n #1
   {
-    \tl_set:Nx \l__iow_line_tl
+    \__kernel_tl_set:Nx \l__iow_line_tl
       { \l__iow_line_tl \l__iow_line_part_tl }
-    \tl_set:Nx \l__iow_wrap_tl
+    \__kernel_tl_set:Nx \l__iow_wrap_tl
       {
         \l__iow_wrap_tl
         \l__iow_newline_tl
@@ -11268,7 +11371,7 @@
 \cs_generate_variant:Nn \file_get_full_name:nN { V }
 \prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
   {
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       { \file_full_name:n {#1} }
     \tl_if_empty:NTF #2
       { \prg_return_false: }
@@ -11281,7 +11384,7 @@
   {
     \prg_set_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
       {
-        \tl_set:Nx \l__file_base_name_tl
+        \__kernel_tl_set:Nx \l__file_base_name_tl
           { \__kernel_file_name_sanitize:n {#1} }
         \__file_get_full_name_search:nN { } \use:n
         \seq_map_inline:Nn \l_file_search_path_seq
@@ -11316,7 +11419,7 @@
   }
 \cs_new_protected:Npn \__file_get_full_name_search:nN #1#2
   {
-    \tl_set:Nx \l__file_full_name_tl
+    \__kernel_tl_set:Nx \l__file_full_name_tl
       { \tl_to_str:n {#1} \l__file_base_name_tl }
     \__kernel_ior_open:No \g__file_internal_ior \l__file_full_name_tl
     \ior_if_eof:NF \g__file_internal_ior { #2 { \prg_break: } }
@@ -11423,7 +11526,7 @@
   { \__file_get_details:nnN {#1} { timestamp } #2 }
 \cs_new_protected:Npn \__file_get_details:nnN #1#2#3
   {
-    \tl_set:Nx #3
+    \__kernel_tl_set:Nx #3
       { \use:c { file_ #2 :n } {#1} }
     \tl_if_empty:NTF #3
       { \prg_return_false: }
@@ -11457,7 +11560,7 @@
 \prg_new_protected_conditional:Npnn \file_get_hex_dump:nnnN #1#2#3#4
   { T , F , TF }
   {
-    \tl_set:Nx #4
+    \__kernel_tl_set:Nx #4
       { \file_hex_dump:nnn {#1} {#2} {#3} }
     \tl_if_empty:NTF #4
       { \prg_return_false: }
@@ -13083,7 +13186,7 @@
   {
     \clist_clear:N \l__keys_unused_clist
     \__keys_set_known:nnn {#2} {#3} {#4}
-    \tl_set:Nx #5 { \exp_not:o \l__keys_unused_clist }
+    \__kernel_tl_set:Nx #5 { \exp_not:o \l__keys_unused_clist }
     \tl_set:Nn \l__keys_unused_clist {#1}
   }
 \cs_new_protected:Npn \keys_set_known:nn #1#2
@@ -13125,7 +13228,7 @@
   {
     \clist_clear:N \l__keys_unused_clist
     \__keys_set_filter:nnnn {#2} {#3} {#4} {#5}
-    \tl_set:Nx #6 { \exp_not:o \l__keys_unused_clist }
+    \__kernel_tl_set:Nx #6 { \exp_not:o \l__keys_unused_clist }
     \tl_set:Nn \l__keys_unused_clist {#1}
   }
 \cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
@@ -13191,7 +13294,7 @@
   }
 \cs_new_protected:Npn \__keys_set_keyval:nnn #1#2#3
   {
-    \tl_set:Nx \l_keys_path_str
+    \__kernel_tl_set:Nx \l_keys_path_str
       {
         \tl_if_blank:nF {#1}
           { #1 / }
@@ -13389,7 +13492,7 @@
   }
 \cs_new_protected:Npn \__keys_store_unused_aux:
   {
-    \tl_set:Nx \l__keys_relative_tl
+    \__kernel_tl_set:Nx \l__keys_relative_tl
       { \exp_args:No \__keys_trim_spaces:n \l__keys_relative_tl }
     \use:x
       {
@@ -16027,9 +16130,9 @@
   { \cs_new_eq:NN #1 \c_zero_fp }
 \cs_generate_variant:Nn \fp_new:N {c}
 \cs_new_protected:Npn \fp_set:Nn   #1#2
-  { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
+  { \__kernel_tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
 \cs_new_protected:Npn \fp_gset:Nn  #1#2
-  { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
+  { \__kernel_tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
 \cs_new_protected:Npn \fp_const:Nn #1#2
   { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
 \cs_generate_variant:Nn \fp_set:Nn {c}
@@ -20461,6 +20564,9 @@
       \char_set_catcode_group_end:n        { 125 } % right brace
       \char_set_catcode_space:n            { 126 } % tilde
       \char_set_catcode_invalid:n          { 127 } % ^^?
+      \bool_lazy_or:nnF
+        { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+        { \int_step_function:nnN { 128 } { 255 } \char_set_catcode_active:n }
       \__cctab_gset:n { \c_code_cctab }
     \group_end:
     \cctab_const:Nn \c_document_cctab
@@ -20629,7 +20735,7 @@
   {
     \group_begin:
       \__sort_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3}
-      \tl_gset:Nx \g__sort_internal_tl
+      \__kernel_tl_gset:Nx \g__sort_internal_tl
         { \__sort_tl_toks:w \l__sort_min_int ; }
     \group_end:
     #1 #2 \g__sort_internal_tl
@@ -21012,7 +21118,7 @@
     \fi:
   }
 \group_begin:
-  \tl_set:Nx \l__str_internal_tl { \tl_to_str:n { 0123456789ABCDEF } }
+  \__kernel_tl_set:Nx \l__str_internal_tl { \tl_to_str:n { 0123456789ABCDEF } }
    \tl_map_inline:Nn \l__str_internal_tl
      {
         \tl_map_inline:Nn \l__str_internal_tl
@@ -21057,7 +21163,7 @@
   }
 \cs_new_protected:Npn \__str_convert_gmap:N #1
   {
-    \tl_gset:Nx \g__str_result_tl
+    \__kernel_tl_gset:Nx \g__str_result_tl
       {
         \exp_after:wN \__str_convert_gmap_loop:NN
         \exp_after:wN #1
@@ -21073,7 +21179,7 @@
   }
 \cs_new_protected:Npn \__str_convert_gmap_internal:N #1
   {
-    \tl_gset:Nx \g__str_result_tl
+    \__kernel_tl_gset:Nx \g__str_result_tl
       {
         \exp_after:wN \__str_convert_gmap_internal_loop:Nww
         \exp_after:wN #1
@@ -21123,7 +21229,7 @@
   {
     \group_begin:
       #1
-      \tl_gset:Nx \g__str_result_tl { \__kernel_str_to_other_fast:n {#4} }
+      \__kernel_tl_gset:Nx \g__str_result_tl { \__kernel_str_to_other_fast:n {#4} }
       \exp_after:wN \__str_convert:wwwnn
         \tl_to_str:n {#5} /// \s__str_stop
         { decode } { unescape }
@@ -21269,7 +21375,7 @@
     \cs_new_protected:Npn \__str_convert_unescape_:
       {
         \flag_clear:n { str_byte }
-        \tl_gset:Nx \g__str_result_tl
+        \__kernel_tl_gset:Nx \g__str_result_tl
           { \exp_args:No \__str_filter_bytes:n \g__str_result_tl }
         \__str_if_flag_error:nnx { str_byte } { non-byte } { bytes }
       }
@@ -21321,7 +21427,7 @@
 \cs_new_protected:Npn \__str_convert_decode_clist:
   {
     \clist_gset:No \g__str_result_tl \g__str_result_tl
-    \tl_gset:Nx \g__str_result_tl
+    \__kernel_tl_gset:Nx \g__str_result_tl
       {
         \exp_args:No \clist_map_function:nN
           \g__str_result_tl \__str_decode_clist_char:n
@@ -21332,7 +21438,7 @@
 \cs_new_protected:Npn \__str_convert_encode_clist:
   {
     \__str_convert_gmap_internal:N \__str_encode_clist_char:n
-    \tl_gset:Nx \g__str_result_tl { \tl_tail:N \g__str_result_tl }
+    \__kernel_tl_gset:Nx \g__str_result_tl { \tl_tail:N \g__str_result_tl }
   }
 \cs_new:Npn \__str_encode_clist_char:n #1 { , #1 }
 \cs_new_protected:Npn \__str_declare_eight_bit_encoding:nnnn #1
@@ -21490,7 +21596,7 @@
     \group_begin:
       \flag_clear:n { str_error }
       \int_set:Nn \tex_escapechar:D { 92 }
-      \tl_gset:Nx \g__str_result_tl
+      \__kernel_tl_gset:Nx \g__str_result_tl
         {
           \__str_output_byte:w "
             \exp_last_unbraced:Nf \__str_unescape_hex_auxi:N
@@ -21539,7 +21645,7 @@
           \flag_clear:n { str_byte }
           \flag_clear:n { str_error }
           \int_set:Nn \tex_escapechar:D { 92 }
-          \tl_gset:Nx \g__str_result_tl
+          \__kernel_tl_gset:Nx \g__str_result_tl
             {
               \exp_after:wN #3 \g__str_result_tl
                 #1 ? { ? \prg_break: }
@@ -21592,13 +21698,13 @@
             \flag_clear:n { str_byte }
             \flag_clear:n { str_error }
             \int_set:Nn \tex_escapechar:D { 92 }
-            \tl_gset:Nx \g__str_result_tl
+            \__kernel_tl_gset:Nx \g__str_result_tl
               {
                 \exp_after:wN \__str_unescape_string_newlines:wN
                   \g__str_result_tl \prg_break: ^^M ?
                 \prg_break_point:
               }
-            \tl_gset:Nx \g__str_result_tl
+            \__kernel_tl_gset:Nx \g__str_result_tl
               {
                 \exp_after:wN \__str_unescape_string_loop:wNNN
                   \g__str_result_tl #1 ?? { ? \prg_break: }
@@ -21829,7 +21935,7 @@
     \flag_clear:n { str_extra }
     \flag_clear:n { str_overlong }
     \flag_clear:n { str_overflow }
-    \tl_gset:Nx \g__str_result_tl
+    \__kernel_tl_gset:Nx \g__str_result_tl
       {
         \exp_after:wN \__str_decode_utf_viii_start:N \g__str_result_tl
           { \prg_break: \__str_decode_utf_viii_end: }
@@ -22029,7 +22135,7 @@
       \flag_clear:n { str_extra }
       \flag_clear:n { str_end }
       \cs_set:Npn \__str_tmp:w ##1 ##2 { ` ## #1 }
-      \tl_gset:Nx \g__str_result_tl
+      \__kernel_tl_gset:Nx \g__str_result_tl
         {
           \exp_after:wN \__str_decode_utf_xvi_pair:NN
             #2 \q__str_nil \q__str_nil
@@ -22186,7 +22292,7 @@
       \flag_clear:n { str_end }
       \flag_clear:n { str_error }
       \cs_set:Npn \__str_tmp:w ##1 ##2 { ` ## #1 }
-      \tl_gset:Nx \g__str_result_tl
+      \__kernel_tl_gset:Nx \g__str_result_tl
         {
           \exp_after:wN \__str_decode_utf_xxxii_loop:NNNN
             #2 \s__str_stop \s__str_stop \s__str_stop \s__str_stop
@@ -22466,7 +22572,7 @@
   }
 \cs_new_protected:Npn \__tl_analysis_b:n #1
   {
-    \tl_gset:Nx \g__tl_analysis_result_tl
+    \__kernel_tl_gset:Nx \g__tl_analysis_result_tl
       {
         \__tl_analysis_b_loop:w 0; #1
         \prg_break_point:
@@ -22867,7 +22973,7 @@
   {
     \int_compare:nNnTF \l__regex_curr_catcode_int = 0
       {
-        \tl_set:Nx \l__regex_internal_a_tl
+        \__kernel_tl_set:Nx \l__regex_internal_a_tl
           { \scan_stop: \__regex_curr_cs_to_str: \scan_stop: }
         \tl_if_in:noTF { \scan_stop: #1 \scan_stop: }
           \l__regex_internal_a_tl
@@ -22880,7 +22986,7 @@
     \int_compare:nNnT \l__regex_curr_catcode_int = 0
       {
         \group_begin:
-          \tl_set:Nx \l__regex_cs_name_tl { \__regex_curr_cs_to_str: }
+          \__kernel_tl_set:Nx \l__regex_cs_name_tl { \__regex_curr_cs_to_str: }
           \__regex_single_match:
           \__regex_disable_submatches:
           \__regex_build_for_cs:n {#1}
@@ -22978,7 +23084,7 @@
       \cs_set:Npn \__regex_escape_escaped:N ##1 { #2 }
       \cs_set:Npn \__regex_escape_raw:N ##1 { #3 }
       \__regex_standard_escapechar:
-      \tl_gset:Nx \g__regex_internal_tl
+      \__kernel_tl_gset:Nx \g__regex_internal_tl
         { \__kernel_str_to_other_fast:n {#4} }
       \tl_put_right:Nx \l__regex_internal_a_tl
         {
@@ -23736,12 +23842,12 @@
     \__regex_two_if_eq:NNNNTF #5 #6 \__regex_compile_special:N ^
       {
         \bool_set_false:N \l__regex_internal_bool
-        \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
+        \__kernel_tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
           \__regex_compile_class_posix_loop:w
       }
       {
         \bool_set_true:N \l__regex_internal_bool
-        \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
+        \__kernel_tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
           \__regex_compile_class_posix_loop:w #5 #6
       }
   }
@@ -24006,7 +24112,7 @@
   {
     \__regex_compile_end:
     \flag_clear:n { __regex_cs }
-    \tl_set:Nx \l__regex_internal_a_tl
+    \__kernel_tl_set:Nx \l__regex_internal_a_tl
       {
         \exp_after:wN \__regex_compile_cs_aux:Nn \l__regex_internal_regex
         \q__regex_nil \q__regex_nil \q__regex_recursion_stop
@@ -24067,7 +24173,7 @@
       {
         \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N \c_left_brace_str
           {
-            \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
+            \__kernel_tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
             \__regex_compile_u_loop:NN
           }
           {
@@ -24106,7 +24212,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_u_in_cs:
   {
-    \tl_gset:Nx \g__regex_internal_tl
+    \__kernel_tl_gset:Nx \g__regex_internal_tl
       {
         \exp_args:No \__kernel_str_to_other_fast:n
           { \l__regex_internal_a_tl }
@@ -25531,7 +25637,7 @@
             \__regex_replacement_balance_one_match:n
               { \l__regex_zeroth_submatch_int }
           }
-        \tl_set:Nx \l__regex_internal_a_tl
+        \__kernel_tl_set:Nx \l__regex_internal_a_tl
           {
             \__regex_replacement_do_one_match:n
               { \l__regex_zeroth_submatch_int }
@@ -25561,7 +25667,7 @@
             { \l__regex_submatch_int - 1 }
             \__regex_replacement_balance_one_match:n
         }
-      \tl_set:Nx \l__regex_internal_a_tl
+      \__kernel_tl_set:Nx \l__regex_internal_a_tl
         {
           \int_step_function:nnnN
             { \l__regex_min_submatch_int }
@@ -27635,7 +27741,7 @@
   { \AtBeginDocument }
   { \use:n }
   {
-    \tl_set:Nx \l__coffin_display_font_tl
+    \__kernel_tl_set:Nx \l__coffin_display_font_tl
       {
         \cs_if_exist:NT \sffamily { \exp_not:N \sffamily }
         \cs_if_exist:NT \tiny { \exp_not:N \tiny }
@@ -28554,6 +28660,7 @@
 \cs_new:Npn \__text_change_case_aux:nnn #1#2#3
   {
     \group_align_safe_begin:
+    \cs_if_exist_use:c { __text_change_case_boundary_ #2 _ #3 :Nnnw }
     \__text_change_case_loop:nnw {#2} {#3} #1
       \q__text_recursion_tail \q__text_recursion_stop
     \__text_change_case_result:n { }
@@ -28629,6 +28736,7 @@
   }
   {
     \__text_change_case_store:n { ~ }
+    \cs_if_exist_use:c { __text_change_case_boundary_ #1 _ #2 :Nnnw }
     \__text_change_case_loop:nnw {#1} {#2}
   }
 \cs_new:Npn \__text_change_case_N_type:nnN #1#2#3
@@ -28761,16 +28869,10 @@
           { \__text_change_case_loop:nnw {#3} {#4} }
       }
   }
-\cs_new:Npx \__text_change_case_char_lower:nnN #1#2#3
+\cs_new:Npn \__text_change_case_char_lower:nnN #1#2#3
   {
-    \exp_not:N \cs_if_exist_use:cF { __text_change_case_lower_ #2 :nnnN }
-      {
-        \bool_lazy_or:nnTF
-          { \sys_if_engine_luatex_p: }
-          { \sys_if_engine_xetex_p: }
-          { \exp_not:N \__text_change_case_lower_sigma:nnnN }
-          { \exp_not:N \__text_change_case_char:nnnN }
-       }
+    \cs_if_exist_use:cF { __text_change_case_lower_ #2 :nnnN }
+      { \__text_change_case_lower_sigma:nnnN }
         {#1} {#1} {#2} #3
   }
 \cs_new:Npn \__text_change_case_char_upper:nnN #1#2#3
@@ -28779,7 +28881,7 @@
       { \__text_change_case_char:nnnN }
         {#1} {#1} {#2} #3
   }
-\bool_lazy_or:nnT
+\bool_lazy_or:nnTF
   { \sys_if_engine_luatex_p: }
   { \sys_if_engine_xetex_p: }
   {
@@ -28811,6 +28913,44 @@
         \__text_change_case_loop:nnw {#2} {#3} #4
       }
   }
+  {
+    \cs_new:Npn \__text_change_case_lower_sigma:nnnN #1#2#3#4
+      {
+        \int_compare:nNnTF { `#4 } = { "CE }
+          { \__text_change_case_lower_sigma:nnnNN  }
+          { \__text_change_case_char:nnnN }
+            {#1} {#2} {#3} #4
+      }
+    \cs_new:Npn \__text_change_case_lower_sigma:nnnNN #1#2#3#4#5
+      {
+        \int_compare:nNnTF { `#5 } = { "A3 }
+          { \__text_change_case_lower_sigma:nnw {#2} {#3}  }
+          { \__text_change_case_char:nnnN {#1} {#2} {#3} #4#5 }
+      }
+    \cs_new:Npn \__text_change_case_lower_sigma:nnw #1#2#3 \q__text_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#3}
+          { \__text_change_case_lower_sigma:nnN }
+          {
+            \__text_change_case_store:V \c__text_final_sigma_tl
+            \__text_change_case_loop:nnw
+          }
+        {#1} {#2} #3 \q__text_recursion_stop
+      }
+    \cs_new:Npn \__text_change_case_lower_sigma:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_letter_p:N #3 }
+          {
+            \bool_lazy_and_p:nn
+              { \token_if_active_p:N #3 }
+              { \int_compare_p:nNn { `#3 } > { "80 } }
+          }
+          { \__text_change_case_store:V \c__text_sigma_tl }
+          { \__text_change_case_store:V \c__text_final_sigma_tl }
+        \__text_change_case_loop:nnw {#1} {#2} #3
+      }
+  }
 \cs_new:Npx \__text_change_case_char_title:nnN #1#2#3
   {
     \exp_not:N \bool_if:NTF \l_text_titlecase_check_letter_bool
@@ -28947,91 +29087,251 @@
       {
         \__text_change_case_if_greek:nTF { `#4 }
           {
-            \exp_args:Ne \__text_change_case_upper_el:nnnn
-              { \char_to_nfd:N #4 } {#1} {#2} {#3}
+            \exp_args:Ne \__text_change_case_upper_el:nnn
+              { \char_to_nfd:N #4 } {#2} {#3}
           }
           { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 }
       }
-    \cs_new:Npn \__text_change_case_upper_el:nnnn #1#2#3#4
-      { \__text_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 }
-    \cs_new:Npn \__text_change_case_upper_el_aux:nnnN #1#2#3#4
+    \cs_new:Npn \__text_change_case_upper_el:nnn #1#2#3
+      { \__text_change_case_upper_el:nnNw {#2} {#3} #1 }
+    \cs_new:Npn \__text_change_case_upper_el:nnNw #1#2#3#4 \q__text_recursion_stop
       {
-        \__text_change_case_store:e { \use:c { char_ #1 case:N } #4 }
-        \__text_change_case_upper_el_loop:nnw {#2} {#3}
+        \tl_if_head_is_N_type:nTF {#4}
+          { \__text_change_case_upper_el:NnnN #3 }
+          {
+            \__text_change_case_store:e { \char_uppercase:N #3 }
+            \__text_change_case_loop:nnw
+          }
+            {#1} {#2} #4 \q__text_recursion_stop
       }
-    \cs_new:Npn \__text_change_case_upper_el_loop:nnw
-      #1#2#3 \q__text_recursion_stop
+    \cs_new:Npn \__text_change_case_upper_el:NnnN #1#2#3#4
       {
-        \tl_if_head_is_N_type:nTF {#3}
-          { \__text_change_case_upper_el:nnN }
-          { \__text_change_case_loop:nnw }
-            {#1} {#2} #3 \q__text_recursion_stop
-      }
-    \cs_new:Npn \__text_change_case_upper_el:nnN #1#2#3
-      {
-        \token_if_cs:NTF #3
-          { \__text_change_case_loop:nnw {#1} {#2} #3 }
+        \token_if_cs:NTF #4
           {
-            \int_compare:nNnTF { `#3 } = { "0308 }
+            \__text_change_case_store:e { \char_uppercase:N #1 }
+            \__text_change_case_loop:nnw {#2} {#3} #4
+          }
+          {
+            \int_compare:nNnTF { `#4 } = { "0308 }
+              { \__text_change_case_upper_el_dialytika:nnN {#2} {#3} #1 }
               {
-                \__text_change_case_store:n {#3}
-                \__text_change_case_upper_el_loop:nnw {#1} {#2}
-              }
-              {
-                \bool_lazy_any:nTF
+                 \__text_change_case_if_greek_accent:nTF { `#4 }
+                  { \__text_change_case_upper_el_hiatus:nnNw {#2} {#3} #1 }
                   {
-                    { \int_compare_p:nNn { `#3 } = { "0300 } }
-                    { \int_compare_p:nNn { `#3 } = { "0301 } }
-                    { \int_compare_p:nNn { `#3 } = { "0304 } }
-                    { \int_compare_p:nNn { `#3 } = { "0306 } }
-                    { \int_compare_p:nNn { `#3 } = { "0308 } }
-                    { \int_compare_p:nNn { `#3 } = { "0313 } }
-                    { \int_compare_p:nNn { `#3 } = { "0314 } }
-                    { \int_compare_p:nNn { `#3 } = { "0342 } }
-                    { \int_compare_p:nNn { `#3 } = { "0340 } }
-                    { \int_compare_p:nNn { `#3 } = { "0341 } }
-                    { \int_compare_p:nNn { `#3 } = { "0343 } }
-                  }
-                  { \__text_change_case_upper_el_loop:nnw {#1} {#2} }
-                  {
-                    \int_compare:nNnTF { `#3 } = { "0344 }
+                    \__text_change_case_if_greek_diacritic:nTF { `#4 }
                       {
-                        \__text_change_case_store:e
-                          {
-                            \char_generate:nn { "0308 }
-                              { \__text_char_catcode:N #3 }
-                          }
-                        \__text_change_case_upper_el_loop:nnw {#1} {#2}
+                        \__text_change_case_store:e { \char_uppercase:N #1 }
+                        \__text_change_case_loop:nnw {#2} {#3}
                       }
                       {
-                        \int_compare:nNnTF { `#3 } = { "0345 }
-                          { \__text_change_case_loop:nnw {#1} {#2} }
-                          { \__text_change_case_loop:nnw {#1} {#2} #3 }
+                        \__text_change_case_store:e { \char_uppercase:N #1 }
+                        \__text_change_case_loop:nnw {#2} {#3} #4
                       }
                   }
               }
           }
       }
-    \prg_new_conditional:Npnn \__text_change_case_if_greek:n #1 { TF }
+    \cs_new:Npn \__text_change_case_upper_el_dialytika:nnN #1#2#3
       {
-        \if_int_compare:w #1 < "0370 \exp_stop_f:
+        \__text_change_case_if_takes_dialytika:nTF { `#3 }
+          { \__text_change_case_upper_el_dialytika:N #3 }
+          { \__text_change_case_store:e { \char_uppercase:N #3 } }
+        \__text_change_case_upper_el_gobble:nnw {#1} {#2}
+      }
+    \cs_new:Npn \__text_change_case_upper_el_dialytika:N #1
+      {
+        \__text_change_case_store:e
+          {
+            \bool_lazy_or:nnTF
+              { \int_compare_p:nNn { `#1 } = { "0399 } }
+              { \int_compare_p:nNn { `#1 } = { "03B9 } }
+              { \char_generate:nn { "03AA } { \__text_char_catcode:N #1 } }
+              { \char_generate:nn { "03AB } { \__text_char_catcode:N #1 } }
+          }
+      }
+    \cs_new:Npn \__text_change_case_upper_el_hiatus:nnNw
+      #1#2#3#4 \q__text_recursion_stop
+      {
+        \__text_change_case_store:e { \char_uppercase:N #3 }
+        \tl_if_head_is_N_type:nTF {#4}
+          { \__text_change_case_upper_el_hiatus:nnN }
+          { \__text_change_case_loop:nnw }
+            {#1} {#2} #4 \q__text_recursion_stop
+      }
+    \cs_new:Npn \__text_change_case_upper_el_hiatus:nnN #1#2#3
+      {
+        \token_if_cs:NTF #3
+          { \__text_change_case_loop:nnw {#1} {#2} #3 }
+          {
+            \__text_change_case_if_takes_dialytika:nTF { `#3 }
+              {
+                \__text_change_case_upper_el_dialytika:N #3
+                \__text_change_case_upper_el_gobble:nnw {#1} {#2}
+              }
+              { \__text_change_case_loop:nnw {#1} {#2} #3 }
+          }
+      }
+    \cs_new:Npn \__text_change_case_upper_el_gobble:nnw
+      #1#2#3 \q__text_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#3}
+          { \__text_change_case_upper_el_gobble:nnN }
+          { \__text_change_case_loop:nnw }
+            {#1} {#2} #3 \q__text_recursion_stop
+      }
+    \cs_new:Npn \__text_change_case_upper_el_gobble:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_cs_p:N #3 }
+          {
+            ! \bool_lazy_or_p:nn
+              { \__text_change_case_if_greek_accent_p:n { `#3 } }
+              { \__text_change_case_if_greek_diacritic_p:n { `#3 } }
+          }
+          { \__text_change_case_loop:nnw {#1} {#2} #3 }
+          { \__text_change_case_upper_el_gobble:nnw {#1} {#2} }
+      }
+  }
+\prg_new_conditional:Npnn \__text_change_case_if_greek:n #1 { TF }
+  {
+    \if_int_compare:w #1 < "0370 \exp_stop_f:
+      \prg_return_false:
+    \else:
+      \if_int_compare:w #1 > "03FF \exp_stop_f:
+        \if_int_compare:w #1 < "1F00 \exp_stop_f:
           \prg_return_false:
         \else:
-          \if_int_compare:w #1 > "03FF \exp_stop_f:
-            \if_int_compare:w #1 < "1F00 \exp_stop_f:
-              \prg_return_false:
+          \if_int_compare:w #1 > "1FFF \exp_stop_f:
+            \prg_return_false:
+          \else:
+            \prg_return_true:
+          \fi:
+        \fi:
+      \else:
+        \prg_return_true:
+      \fi:
+    \fi:
+  }
+\prg_new_conditional:Npnn \__text_change_case_if_greek_accent:n #1 { TF , p }
+  {
+    \if_int_compare:w #1 = "0300 \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \if_int_compare:w #1 = "0301 \exp_stop_f:
+        \prg_return_true:
+      \else:
+        \if_int_compare:w #1 = "0342 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "0302 \exp_stop_f:
+            \prg_return_true:
+          \else:
+            \if_int_compare:w #1 = "0303 \exp_stop_f:
+              \prg_return_true:
             \else:
-              \if_int_compare:w #1 > "1FFF \exp_stop_f:
+              \if_int_compare:w #1 = "0311 \exp_stop_f:
+                \prg_return_true:
+              \else:
                 \prg_return_false:
-              \else:
-                \prg_return_true:
               \fi:
             \fi:
+          \fi:
+        \fi:
+      \fi:
+    \fi:
+  }
+\prg_new_conditional:Npnn \__text_change_case_if_greek_diacritic:n
+  #1 { TF , p }
+  {
+    \if_int_compare:w #1 = "0304 \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \if_int_compare:w #1 = "0306 \exp_stop_f:
+        \prg_return_true:
+      \else:
+        \if_int_compare:w #1 = "0313 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "0314 \exp_stop_f:
+            \prg_return_true:
           \else:
+            \if_int_compare:w #1 = "0343 \exp_stop_f:
+              \prg_return_true:
+            \else:
+              \prg_return_false:
+            \fi:
+          \fi:
+        \fi:
+      \fi:
+    \fi:
+  }
+\prg_new_conditional:Npnn \__text_change_case_if_takes_dialytika:n #1 { TF }
+  {
+    \if_int_compare:w #1 = "0399 \exp_stop_f:
+      \prg_return_true:
+    \else:
+      \if_int_compare:w #1 = "03B9 \exp_stop_f:
+        \prg_return_true:
+      \else:
+        \if_int_compare:w #1 = "03A5 \exp_stop_f:
+          \prg_return_true:
+        \else:
+          \if_int_compare:w #1 = "03C5 \exp_stop_f:
             \prg_return_true:
+          \else:
+            \prg_return_false:
           \fi:
         \fi:
+      \fi:
+    \fi:
+   }
+\bool_lazy_or:nnT
+  { \sys_if_engine_luatex_p: }
+  { \sys_if_engine_xetex_p: }
+  {
+    \cs_new:Npn \__text_change_case_boundary_upper_el:Nnnw
+      #1#2#3#4 \q__text_recursion_stop
+      {
+        \tl_if_head_is_N_type:nTF {#4}
+          { \__text_change_case_boundary_upper_el:nnN }
+          { \__text_change_case_loop:nnw }
+            {#2} {#3} #4 \q__text_recursion_stop
       }
+    \cs_new:Npn \__text_change_case_boundary_upper_el:nnN #1#2#3
+      {
+        \bool_lazy_or:nnTF
+          { \token_if_cs_p:N #3 }
+          {
+            ! \bool_lazy_or_p:nn
+              { \int_compare_p:nNn { `#3 } = { "03AE } }
+              { \int_compare_p:nNn { `#3 } = { "1F22 } }
+          }
+          { \__text_change_case_loop:nnw }
+          { \__text_change_case_boundary_upper_el:nnNw }
+            {#1} {#2} #3
+      }
+    \cs_new:Npn \__text_change_case_boundary_upper_el:nnNw
+      #1#2#3#4 \q__text_recursion_stop
+       {
+        \tl_if_head_is_N_type:nTF {#4}
+          { \__text_change_case_boundary_upper_el:NnnN #3 }
+          {
+            \__text_change_case_store:e
+              { \char_generate:nn { "0389 } { \__text_char_catcode:N #3 } }
+            \__text_change_case_loop:nnw
+          }
+            {#1} {#2} #4 \q__text_recursion_stop
+      }
+    \cs_new:Npn \__text_change_case_boundary_upper_el:NnnN #1#2#3#4
+      {
+        \token_if_letter:NTF #4
+          { \__text_change_case_loop:nnw {#2} {#3} #1#4 }
+          {
+            \__text_change_case_store:e
+              { \char_generate:nn { "0389 } { \__text_char_catcode:N #1 } }
+            \__text_change_case_loop:nnw {#2} {#3} #4
+          }
+      }
   }
 \bool_lazy_or:nnT
   { \sys_if_engine_luatex_p: }
@@ -29327,6 +29627,8 @@
       \__text_tmp:w \c__text_dotted_I_tl       { 0130 }
       \__text_tmp:w \c__text_i_ogonek_tl       { 012F }
       \__text_tmp:w \c__text_I_ogonek_tl       { 012E }
+      \__text_tmp:w \c__text_final_sigma_tl    { 03C2 }
+      \__text_tmp:w \c__text_sigma_tl          { 03C3 }
       \__text_tmp:w \c__text_grosses_Eszett_tl { 1E9E }
     }
 \group_end:
@@ -29529,6 +29831,16 @@
         { 042D } { 044D }
         { 042E } { 044E }
         { 042F } { 044F }
+        { 0370 } { 0371 }
+        { 0372 } { 0373 }
+        { 0376 } { 0377 }
+        { 03FD } { 037B }
+        { 03FE } { 037C }
+        { 03FF } { 037D }
+        { 0386 } { 03AC }
+        { 0388 } { 03AD }
+        { 0389 } { 03AE }
+        { 038A } { 03AF }
         { 0391 } { 03B1 }
         { 0392 } { 03B2 }
         { 0393 } { 03B3 }
@@ -29553,17 +29865,34 @@
         { 03A7 } { 03C7 }
         { 03A8 } { 03C8 }
         { 03A9 } { 03C9 }
+        { 03AA } { 03CA }
+        { 03AB } { 03CB }
+        { 038C } { 03CC }
+        { 038E } { 03CD }
+        { 038F } { 03CE }
+        { 03CF } { 03D7 }
         { 03D8 } { 03D9 }
         { 03DA } { 03DB }
         { 03DC } { 03DD }
         { 03DE } { 03DF }
         { 03E0 } { 03E1 }
+        { 03E2 } { 03E3 }
+        { 03E4 } { 03E5 }
+        { 03E6 } { 03E7 }
+        { 03E8 } { 03E9 }
+        { 03EA } { 03EB }
+        { 03EC } { 03ED }
+        { 03EE } { 03EF }
+        { 03F9 } { 03F2 }
+        { 037F } { 03F3 }
+        { 03F7 } { 03F8 }
+        { 03FA } { 03FB }
         \q_recursion_tail ?
         \q_recursion_stop
       \cs_set_protected:Npn \__text_tmp:w #1#2#3
         {
           \group_begin:
-            \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4
+            \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4##5##6##7##8
               {
                 \tl_const:cx
                   {
@@ -29572,6 +29901,43 @@
                     \char_generate:nn {##2} { 12 }
                     _tl
                   }
+                  {
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##5} { 13 }
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##6} { 13 }
+                  }
+              }
+            \use:x
+              {
+                \__text_tmp:w
+                  \char_to_utfviii_bytes:n { "#1 }
+                  \char_to_utfviii_bytes:n { "#2 }
+              }
+          \group_end:
+        }
+      \__text_tmp:w { 0345 } { 0399 } { upper }
+      \__text_tmp:w { 03C2 } { 03A3 } { upper }
+      \__text_tmp:w { 03D0 } { 0392 } { upper }
+      \__text_tmp:w { 03D1 } { 0398 } { upper }
+      \__text_tmp:w { 03D5 } { 03A6 } { upper }
+      \__text_tmp:w { 03D6 } { 03A0 } { upper }
+      \__text_tmp:w { 03F0 } { 039A } { upper }
+      \__text_tmp:w { 03F1 } { 03A1 } { upper }
+      \__text_tmp:w { 03F4 } { 03B8 } { lower }
+      \__text_tmp:w { 03F5 } { 0395 } { upper }
+      \cs_set_protected:Npn \__text_tmp:w #1#2#3
+        {
+          \group_begin:
+            \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4
+              {
+                \tl_const:cn
+                  {
+                    c__text_ #3 case_
+                    \char_generate:nn {##1} { 12 }
+                    \char_generate:nn {##2} { 12 }
+                    _tl
+                  }
                     {#2}
               }
             \use:x
@@ -29581,8 +29947,176 @@
       \__text_tmp:w { 00DF } { SS } { upper }
       \__text_tmp:w { 00DF } { Ss } { title }
       \__text_tmp:w { 0131 } { I }  { upper }
-    }
-  \group_end:
+      \cs_set_protected:Npn \__text_tmp:nnnnnn #1#2#3#4#5#6#7
+        {
+          \tl_const:cx
+            {
+              c__text_ #1 case_
+              \char_generate:nn {#2} { 12 }
+              \char_generate:nn {#3} { 12 }
+              \char_generate:nn {#4} { 12 }
+              _tl
+            }
+            {
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#5} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#6} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#7} { 13 }
+            }
+        }
+      \cs_set_protected:Npn \__text_tmp:w #1#2#3#4#5#6#7#8
+        {
+          \tl_const:cx
+            {
+              c__text_lowercase_
+              \char_generate:nn {#1} { 12 }
+              \char_generate:nn {#2} { 12 }
+              \char_generate:nn {#3} { 12 }
+              _tl
+            }
+            {
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#5} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#6} { 13 }
+              \exp_after:wN \exp_after:wN \exp_after:wN
+                \exp_not:N \char_generate:nn {#7} { 13 }
+            }
+          \__text_tmp:nnnnnn { upper } {#5} {#6} {#7} {#1} {#2} {#3}
+          \__text_tmp:nnnnnn { title } {#5} {#6} {#7} {#1} {#2} {#3}
+        }
+      \__text_loop:nn
+        { 1F08 } { 1F00 }
+        { 1F09 } { 1F01 }
+        { 1F0A } { 1F02 }
+        { 1F0B } { 1F03 }
+        { 1F0C } { 1F04 }
+        { 1F0D } { 1F05 }
+        { 1F0E } { 1F06 }
+        { 1F0F } { 1F07 }
+        { 1F18 } { 1F10 }
+        { 1F19 } { 1F11 }
+        { 1F1A } { 1F12 }
+        { 1F1B } { 1F13 }
+        { 1F1C } { 1F14 }
+        { 1F1D } { 1F15 }
+        { 1F28 } { 1F20 }
+        { 1F29 } { 1F21 }
+        { 1F2A } { 1F22 }
+        { 1F2B } { 1F23 }
+        { 1F2C } { 1F24 }
+        { 1F2D } { 1F25 }
+        { 1F2E } { 1F26 }
+        { 1F2F } { 1F27 }
+        { 1F38 } { 1F30 }
+        { 1F39 } { 1F31 }
+        { 1F3A } { 1F32 }
+        { 1F3B } { 1F33 }
+        { 1F3C } { 1F34 }
+        { 1F3D } { 1F35 }
+        { 1F3E } { 1F36 }
+        { 1F3F } { 1F37 }
+        { 1F48 } { 1F40 }
+        { 1F49 } { 1F41 }
+        { 1F4A } { 1F42 }
+        { 1F4B } { 1F43 }
+        { 1F4C } { 1F44 }
+        { 1F4D } { 1F45 }
+        { 1F59 } { 1F51 }
+        { 1F5B } { 1F53 }
+        { 1F5D } { 1F55 }
+        { 1F5F } { 1F57 }
+        { 1F68 } { 1F60 }
+        { 1F69 } { 1F61 }
+        { 1F6A } { 1F62 }
+        { 1F6B } { 1F63 }
+        { 1F6C } { 1F64 }
+        { 1F6D } { 1F65 }
+        { 1F6E } { 1F66 }
+        { 1F6F } { 1F67 }
+        { 1FBA } { 1F70 }
+        { 1FBB } { 1F71 }
+        { 1FC8 } { 1F72 }
+        { 1FC9 } { 1F73 }
+        { 1FCA } { 1F74 }
+        { 1FCB } { 1F75 }
+        { 1FDA } { 1F76 }
+        { 1FDB } { 1F77 }
+        { 1FF8 } { 1F78 }
+        { 1FF9 } { 1F79 }
+        { 1FEA } { 1F7A }
+        { 1FEB } { 1F7B }
+        { 1FFA } { 1F7C }
+        { 1FFB } { 1F7D }
+        { 1F88 } { 1F80 }
+        { 1F89 } { 1F81 }
+        { 1F8A } { 1F82 }
+        { 1F8B } { 1F83 }
+        { 1F8C } { 1F84 }
+        { 1F8D } { 1F85 }
+        { 1F8E } { 1F86 }
+        { 1F8F } { 1F87 }
+        { 1F98 } { 1F90 }
+        { 1F99 } { 1F91 }
+        { 1F9A } { 1F92 }
+        { 1F9B } { 1F93 }
+        { 1F9C } { 1F94 }
+        { 1F9D } { 1F95 }
+        { 1F9E } { 1F96 }
+        { 1F9F } { 1F97 }
+        { 1FA8 } { 1FA0 }
+        { 1FA9 } { 1FA1 }
+        { 1FAA } { 1FA2 }
+        { 1FAB } { 1FA3 }
+        { 1FAC } { 1FA4 }
+        { 1FAD } { 1FA5 }
+        { 1FAE } { 1FA6 }
+        { 1FAF } { 1FA7 }
+        { 1FB8 } { 1FB0 }
+        { 1FB9 } { 1FB1 }
+        { 1FBC } { 1FB3 }
+        { 1FCC } { 1FC3 }
+        { 1FD8 } { 1FD0 }
+        { 1FD9 } { 1FD1 }
+        { 1FE8 } { 1FE0 }
+        { 1FE9 } { 1FE1 }
+        { 1FEC } { 1FE5 }
+        { 1FFC } { 1FF3 }
+        \q_recursion_tail ?
+        \q_recursion_stop
+      \cs_set_protected:Npn \__text_tmp:w #1#2#3
+        {
+          \group_begin:
+            \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4##5##6##7##8
+              {
+                \tl_const:cx
+                  {
+                    c__text_ #3 case_
+                    \char_generate:nn {##1} { 12 }
+                    \char_generate:nn {##2} { 12 }
+                    \char_generate:nn {##3} { 12 }
+                    _tl
+                  }
+                  {
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##5} { 13 }
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                      \exp_not:N \char_generate:nn {##6} { 13 }
+                  }
+              }
+            \use:x
+              {
+                \__text_tmp:w
+                  \char_to_utfviii_bytes:n { "#1 }
+                  \char_to_utfviii_bytes:n { "#2 }
+              }
+          \group_end:
+        }
+    \__text_tmp:w { 1FBE } { 0399 } { upper }
+  }
+\group_end:
 \group_begin:
   \cs_set_protected:Npn \__text_change_case_setup:NN #1#2
     {
@@ -29881,7 +30415,8 @@
   }
   { \text_declare_purify_equivalent:Nn #1 { } }
 \text_declare_purify_equivalent:Nn \begin { \use:c }
-\text_declare_purify_equivalent:Nn \end { \use:c }
+\text_declare_purify_equivalent:Nn \end { \__text_end_env:n }
+\cs_new:Npn \__text_end_env:n #1 { \cs:w end #1 \cs_end: }
 \text_declare_purify_equivalent:Nn \\ { }
 \tl_map_inline:nn
   { \{ \} \# \$ \% \_ }
@@ -30469,9 +31004,9 @@
   }
 \cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc }
 \cs_new_protected:Npn \seq_set_filter:NNn
-  { \__seq_set_filter:NNNn \tl_set:Nx }
+  { \__seq_set_filter:NNNn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_filter:NNn
-  { \__seq_set_filter:NNNn \tl_gset:Nx }
+  { \__seq_set_filter:NNNn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_set_filter:NNNn #1#2#3#4
   {
     \__seq_push_item_def:n { \bool_if:nT {#4} { \__seq_wrap_item:n {##1} } }
@@ -30479,9 +31014,9 @@
     \__seq_pop_item_def:
   }
 \cs_new_protected:Npn \seq_set_from_inline_x:Nnn
-  { \__seq_set_from_inline_x:NNnn \tl_set:Nx }
+  { \__seq_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
-  { \__seq_set_from_inline_x:NNnn \tl_gset:Nx }
+  { \__seq_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
 \cs_new_protected:Npn \__seq_set_from_inline_x:NNnn #1#2#3#4
   {
     \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
@@ -30641,7 +31176,7 @@
       }
   }
 \cs_new_protected:Npn \tl_build_get:NN
-  { \__tl_build_get:NNN \tl_set:Nx }
+  { \__tl_build_get:NNN \__kernel_tl_set:Nx }
 \cs_new_protected:Npn \__tl_build_get:NNN #1#2#3
   { #1 #3 { \if_false: { \fi: \exp_after:wN \__tl_build_get:w #2 } } }
 \cs_new:Npn \__tl_build_get:w #1 \__tl_build_last:NNn #2#3#4
@@ -30656,12 +31191,12 @@
   { \exp_after:wN \exp_not:n \exp_after:wN { \if_false: } \fi: }
 \cs_new_protected:Npn \tl_build_end:N #1
   {
-    \__tl_build_get:NNN \tl_set:Nx #1 #1
+    \__tl_build_get:NNN \__kernel_tl_set:Nx #1 #1
     \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
   }
 \cs_new_protected:Npn \tl_build_gend:N #1
   {
-    \__tl_build_get:NNN \tl_gset:Nx #1 #1
+    \__tl_build_get:NNN \__kernel_tl_gset:Nx #1 #1
     \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
   }
 \cs_new_protected:Npn \__tl_build_end_loop:NN #1#2

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2020-10-27 20:55:42 UTC (rev 56785)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-10-05}%
+\def\ExplFileDate{2020-10-27}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\>=12

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-10-05}%
+\def\ExplFileDate{2020-10-27}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\>=12
@@ -63,7 +63,7 @@
 \else
   \expandafter\@gobble
 \fi
-  {\input{expl3-code.tex}}%
+  {\input expl3-code.tex }%
 \begingroup\expandafter\expandafter\expandafter\endgroup
 \expandafter\ifx\csname tex\string _let:D\endcsname\relax
   \expandafter\endinput

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2020-10-05}%
+\def\ExplFileDate{2020-10-27}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%
@@ -55,7 +55,7 @@
 \else
   \expandafter\@gobble
 \fi
-  {\input{expl3-code.tex}}%
+  {\input expl3-code.tex }%
 \begingroup\expandafter\expandafter\expandafter\endgroup
 \expandafter\ifx\csname tex\string _let:D\endcsname\relax
   \expandafter\endinput

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2020-10-27 20:55:42 UTC (rev 56785)
@@ -71,7 +71,7 @@
   }
 \cs_set_protected:Npn \debug_resume:
   {
-    \tl_set:Nx \l__debug_suspended_tl
+    \__kernel_tl_set:Nx \l__debug_suspended_tl
       { \tl_tail:N \l__debug_suspended_tl }
     \tl_if_empty:NT \l__debug_suspended_tl
       {
@@ -213,11 +213,11 @@
 \tl_new:N \l__debug_tmpb_tl
 \cs_new_protected:Npn \__debug_generate_parameter_list:NNN #1#2#3
   {
-    \tl_set:Nx \l__debug_internal_tl
+    \__kernel_tl_set:Nx \l__debug_internal_tl
       { \exp_last_unbraced:Nf \use_ii:nnn \cs_split_function:N #1 }
-    \tl_set:Nx #2
+    \__kernel_tl_set:Nx #2
       { \exp_args:NV \__debug_build_parm_text:n \l__debug_internal_tl }
-    \tl_set:Nx #3
+    \__kernel_tl_set:Nx #3
       { \exp_args:NV \__debug_build_arg_list:n \l__debug_internal_tl }
   }
 \cs_new:Npn \__debug_build_parm_text:n #1
@@ -423,6 +423,8 @@
       \tl_concat:NNN
       \tl_gconcat:NNN
     }
+\cs_gset_protected:Npn \__kernel_tl_set:Nx  { \cs_set_nopar:Npx }
+\cs_gset_protected:Npn \__kernel_tl_gset:Nx { \cs_gset_nopar:Npx }
   \__kernel_patch:nnn
     { \__kernel_chk_var_local:N #1 }
     { }
@@ -463,9 +465,7 @@
       \skip_set_eq:NN
       \skip_add:Nn
       \skip_sub:Nn
-      \tl_set:Nn
-      \tl_set:No
-      \tl_set:Nx
+      \__kernel_tl_set:Nx
       \tl_set_eq:NN
       \tl_put_left:Nn
       \tl_put_left:NV
@@ -527,9 +527,7 @@
       \skip_gset_eq:NN
       \skip_gadd:Nn
       \skip_gsub:Nn
-      \tl_gset:Nn
-      \tl_gset:No
-      \tl_gset:Nx
+      \__kernel_tl_gset:Nx
       \tl_gset_eq:NN
       \tl_gput_left:Nn
       \tl_gput_left:NV
@@ -650,7 +648,7 @@
     {
       \__regex_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn
       \group_begin:
-        \tl_set:Nx \l__regex_internal_a_tl
+        \__kernel_tl_set:Nx \l__regex_internal_a_tl
           { \__regex_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn }
         \use_none:nnn
     }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def	2020-10-27 20:55:42 UTC (rev 56785)
@@ -74,7 +74,7 @@
     \group_begin:
       \file_get:nnN {#3} {#2} \l__tl_internal_a_tl
       #2 \scan_stop:
-      \tl_set:Nx \l__tl_internal_a_tl { \l__tl_internal_a_tl }
+      \__kernel_tl_set:Nx \l__tl_internal_a_tl { \l__tl_internal_a_tl }
     \exp_args:NNNo \group_end:
     \tl_set:Nn #1 \l__tl_internal_a_tl
   }
@@ -85,7 +85,7 @@
     \group_begin:
       \file_get:nnN {#3} {#2} \l__tl_internal_a_tl
       #2 \scan_stop:
-      \tl_gset:Nx #1 { \l__tl_internal_a_tl }
+      \__kernel_tl_gset:Nx #1 { \l__tl_internal_a_tl }
     \group_end:
   }
 \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2020-10-27 20:55:42 UTC (rev 56785)
@@ -135,7 +135,7 @@
 \cs_new_protected:Npn \__codedoc_trim_right:Nn #1#2
   {
     \cs_set:Npn \__codedoc_tmp:w ##1 #2 ##2 \q_stop { \exp_not:n {##1} }
-    \tl_set:Nx #1 { \exp_after:wN \__codedoc_tmp:w #1 #2 \q_stop }
+    \__kernel_tl_set:Nx #1 { \exp_after:wN \__codedoc_tmp:w #1 #2 \q_stop }
   }
 \cs_generate_variant:Nn \__codedoc_trim_right:Nn { No }
 \prg_new_protected_conditional:Npnn \__codedoc_str_if_begin:nn #1#2 { TF , T , F }
@@ -270,7 +270,7 @@
     \__codedoc_if_almost_str:nTF {#1}
       {
         \__codedoc_key_get_base_TF:nN {#1} \l__codedoc_tmpa_tl
-        \tl_set:Nx #2
+        \__kernel_tl_set:Nx #2
           { \__codedoc_split_function_do:on \l__codedoc_tmpa_tl { \__codedoc_base_form_aux:nnN } }
       }
       { \tl_set:Nn #2 {#1} }
@@ -277,7 +277,7 @@
   }
 \cs_new:Npx \__codedoc_key_get_base_TF:nN #1#2
   {
-    \tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
+    \__kernel_tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
     \tl_if_in:NoF #2 { \tl_to_str:n {:} }
       { \exp_not:N \prg_break: }
     \tl_if_in:onT { #2 z } { \tl_to_str:n {TF} z }
@@ -709,7 +709,7 @@
         \verbatim at font
         \__codedoc_if_almost_str:VT \l__codedoc_cmd_tl
           {
-            \tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl }
+            \__kernel_tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl }
             \bool_if:NT \g__codedoc_cs_break_bool
               {
                 \regex_replace_all:nnN
@@ -726,7 +726,7 @@
       {
         \quark_if_no_value:NF \l__codedoc_cmd_index_tl
           {
-            \tl_set:Nx \l__codedoc_cmd_tl
+            \__kernel_tl_set:Nx \l__codedoc_cmd_tl
               { \c_backslash_str \exp_not:o { \l__codedoc_cmd_index_tl } }
           }
 
@@ -733,7 +733,7 @@
         \exp_args:No \__codedoc_key_get:n { \l__codedoc_cmd_tl }
         \quark_if_no_value:NF \l__codedoc_cmd_module_tl
           {
-            \tl_set:Nx \l__codedoc_index_module_tl
+            \__kernel_tl_set:Nx \l__codedoc_index_module_tl
               { \tl_to_str:N \l__codedoc_cmd_module_tl }
           }
         \__codedoc_special_index_module:ooonN
@@ -810,7 +810,7 @@
   }
 \cs_new_protected:Npn \__codedoc_get_hyper_target:nN #1#2
   {
-    \tl_set:Nx #2 { \tl_to_str:n {#1} }
+    \__kernel_tl_set:Nx #2 { \tl_to_str:n {#1} }
     \tl_replace_all:Nxn #2 { \c_underscore_str } { / }
     \tl_remove_all:Nx   #2 { \c_backslash_str }
     \tl_put_left:Nn #2 { doc/function// }
@@ -818,7 +818,7 @@
 \cs_generate_variant:Nn \__codedoc_get_hyper_target:nN { o , x }
 \cs_new_protected:Npn \__codedoc_names_get_seq:nN #1#2
   {
-    \tl_set:Nx \l__codedoc_tmpa_tl { \tl_to_str:n {#1} }
+    \__kernel_tl_set:Nx \l__codedoc_tmpa_tl { \tl_to_str:n {#1} }
     \bool_if:NTF \l__codedoc_names_verb_bool
       {
         \seq_clear:N #2
@@ -1417,7 +1417,7 @@
           \l__codedoc_macro_do_not_index_tl
         \exp_args:NNV \seq_set_from_clist:Nn
           \l__codedoc_tmpa_seq \l__codedoc_macro_do_not_index_tl
-        \tl_set:Nx \l__codedoc_macro_do_not_index_tl
+        \__kernel_tl_set:Nx \l__codedoc_macro_do_not_index_tl
           { \seq_use:Nn \l__codedoc_tmpa_seq { , } }
         \exp_args:NV \DoNotIndex \l__codedoc_macro_do_not_index_tl
       }
@@ -2207,7 +2207,7 @@
   }
 \cs_new_protected:Npn \__codedoc_special_index_set:Nn #1#2
   {
-    \tl_set:Nx #1 { \tl_to_str:n {#2} }
+    \__kernel_tl_set:Nx #1 { \tl_to_str:n {#2} }
     \__codedoc_if_almost_str:nTF {#2}
       {
         \tl_replace_all:Non #1 { \tl_to_str:n { __ } }
@@ -2225,7 +2225,7 @@
                 \token_to_str:N \verb * \verbatimchar
               }
           }
-        \tl_set:Nx #1
+        \__kernel_tl_set:Nx #1
           {
             \token_to_str:N \verb * \verbatimchar
             #1 \verbatimchar
@@ -2250,7 +2250,7 @@
 \cs_new_protected:Npn \__codedoc_key_get:n #1
   {
     \__codedoc_key_get_base:nN {#1} \l__codedoc_index_macro_tl
-    \tl_set:Nx \l__codedoc_index_key_tl
+    \__kernel_tl_set:Nx \l__codedoc_index_key_tl
       { \tl_to_str:N \l__codedoc_index_macro_tl }
     \tl_clear:N \l__codedoc_index_module_tl
     \tl_if_in:NoTF \l__codedoc_index_key_tl { \tl_to_str:n { __ } }
@@ -2273,7 +2273,7 @@
   }
 \cs_new_protected:Npn \__codedoc_key_pop:
   {
-    \tl_set:Nx \l__codedoc_index_key_tl
+    \__kernel_tl_set:Nx \l__codedoc_index_key_tl
       { \tl_tail:N \l__codedoc_index_key_tl }
   }
 \cs_new_protected:Npn \__codedoc_key_trim_module:n #1
@@ -2280,7 +2280,7 @@
   {
     \cs_set:Npn \__codedoc_tmpa:w ##1 #1 ##2 \q_stop
       { \exp_not:n {##1} }
-    \tl_set:Nx \l__codedoc_index_module_tl
+    \__kernel_tl_set:Nx \l__codedoc_index_module_tl
       { \exp_after:wN \__codedoc_tmpa:w \l__codedoc_index_module_tl #1 \q_stop }
   }
 \cs_new_protected:Npn \__codedoc_key_drop_underscores:
@@ -2314,7 +2314,7 @@
           {
             \seq_set_split:NoV \l__codedoc_tmpa_seq
               { \token_to_str:N _ } \l__codedoc_index_key_tl
-            \tl_set:Nx \l__codedoc_index_module_tl
+            \__kernel_tl_set:Nx \l__codedoc_index_module_tl
               {
                 \int_case:nnF { \seq_count:N \l__codedoc_tmpa_seq }
                   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2020-10-05}{}
+\ProvidesExplPackage{l3keys2e}{2020-10-27}{}
   {LaTeX2e option processing using LaTeX3 keys}
 \cs_generate_variant:Nn \clist_put_right:Nn { Nv }
 \cs_generate_variant:Nn \keys_if_exist:nnT  { nx }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -33,7 +33,7 @@
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2020-10-05}{}
+\ProvidesExplPackage{xfp}{2020-10-27}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
 \NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2020-10-05}{}
+\ProvidesExplPackage{xfrac}{2020-10-27}{}
   {L3 Experimental split-level fractions}
 \keys_define:nn { xfrac }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.ltx	2020-10-27 20:55:42 UTC (rev 56785)
@@ -23,7 +23,7 @@
   \message{xparse <2020-03-03>}%
 }
 \ExplSyntaxOn
-\input { xparse-generic.tex }
+\input xparse-generic.tex ~
 \ExplSyntaxOff
 %% 
 %%

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2020-10-05}{}
+\ProvidesExplPackage{xparse}{2020-10-27}{}
   {L3 Experimental document command parser}
 \clist_new:N \l__xparse_options_clist
 \DeclareOption* { \clist_put_right:NV \l__xparse_options_clist \CurrentOption }
@@ -45,7 +45,7 @@
 \keys_set:nV { xparse } \l__xparse_options_clist
 \bool_if:NF \l__xparse_log_bool
   { \msg_redirect_module:nnn { LaTeX / xparse } { info } { none } }
-\input { xparse-generic.tex }
+\input xparse-generic.tex ~
 \cs_gset_protected:Npn \__xparse_normalize_arg_spec_loop:n #1
   {
     \quark_if_recursion_tail_stop:n {#1}

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2020-10-27 20:53:05 UTC (rev 56784)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2020-10-27 20:55:42 UTC (rev 56785)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2020-10-05}{}
+\ProvidesExplPackage{xtemplate}{2020-10-27}{}
   {L3 Experimental prototype document functions}
 \tl_const:Nn \c__xtemplate_code_root_tl      { template~code~>~ }
 \tl_const:Nn \c__xtemplate_defaults_root_tl  { template~defaults~>~ }



More information about the tex-live-commits mailing list.