[latex3-commits] [l3svn] 02/02: New approach to UTF-8, accents and letter-like case changing

noreply at latex-project.org noreply at latex-project.org
Tue Jan 12 23:34:37 CET 2016


This is an automated email from the git hooks/post-receive script.

joseph pushed a commit to branch master
in repository l3svn.

commit a90c9851c2ead712fd9bd92dd89f3cc84f702325
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Tue Jan 12 22:31:36 2016 +0000

    New approach to UTF-8, accents and letter-like case changing
    
    This new approach works with the T1-subset of UTF-8 even with
    pdfTeX. The accent and letter-like code is also revised to be
    consistent across engines.
    
    As a result, pdfTeX input is assumed to be UTF-8. Currently this
    may cause errors if the last char of the input looks like the first
    octet of a UTF-8 sequence. That can be addressed with an extra
    set of tests, but this is a 'policy' question as much as anything.
    
    At present there are a few outstandings:
    - Treatment of ß as a start-of-work char with pdfTeX
    - Treatment of letter-like control sequences in mixed case
---
 l3kernel/l3candidates.dtx               |  578 +++++++++++++++++++++++++++----
 l3kernel/testfiles/m3expl001.luatex.tlg |   35 +-
 l3kernel/testfiles/m3expl001.ptex.tlg   |  241 ++++++++++++-
 l3kernel/testfiles/m3expl001.tlg        |  241 ++++++++++++-
 l3kernel/testfiles/m3expl001.uptex.tlg  |  241 ++++++++++++-
 l3kernel/testfiles/m3expl001.xetex.tlg  |   35 +-
 l3kernel/testfiles/m3expl003.luatex.tlg |   35 +-
 l3kernel/testfiles/m3expl003.ptex.tlg   |  241 ++++++++++++-
 l3kernel/testfiles/m3expl003.tlg        |  241 ++++++++++++-
 l3kernel/testfiles/m3expl003.uptex.tlg  |  241 ++++++++++++-
 l3kernel/testfiles/m3expl003.xetex.tlg  |   35 +-
 l3kernel/testfiles/m3tl013.luatex.tlg   |   14 +
 l3kernel/testfiles/m3tl013.lvt          |   11 +
 l3kernel/testfiles/m3tl013.tlg          |   52 ++-
 l3kernel/testfiles/m3tl013.uptex.tlg    |   52 ++-
 l3kernel/testfiles/m3tl013.xetex.tlg    |   14 +
 16 files changed, 2173 insertions(+), 134 deletions(-)

diff --git a/l3kernel/l3candidates.dtx b/l3kernel/l3candidates.dtx
index a4580d9..fff8614 100644
--- a/l3kernel/l3candidates.dtx
+++ b/l3kernel/l3candidates.dtx
@@ -860,7 +860,7 @@
 %   giving an \meta{integer denotation}.
 % \end{function}
 %
-% \begin{function}[EXP, added = 2014-06-30, updated = 2016-01-08]^^A
+% \begin{function}[EXP, added = 2014-06-30, updated = 2016-01-12]^^A
 %   {
 %     \tl_lower_case:n,  \tl_upper_case:n,  \tl_mixed_case:n,
 %     \tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn
@@ -958,6 +958,22 @@
 %   case changing.
 % \end{variable}
 %
+% \begin{variable}{\l_tl_case_change_accents_tl}
+%   This list specifies accent commands which should be left unexpanded
+%   in the output. This allows for example
+%   \begin{verbatim}
+%     \tl_upper_case:n { \" { a } }
+%   \end{verbatim}
+%   to yield
+%   \begin{verbatim}
+%     \" { A }
+%   \end{verbatim}
+%   irrespective of the expandability of |\"|.
+%
+%   The standard contents of this variable is |\"|, |\^|, |\'|,
+%   |\`|,  |\.|,  |\c|, |\u|, |\~|, |\H| and  |\v|
+% \end{variable}
+%
 % \enquote{Mixed} case conversion may be regarded informally as converting the
 % first character of the \meta{tokens} to upper case and the rest to lower
 % case. However, the process is more complex than this as there are some
@@ -991,16 +1007,15 @@
 % \end{variable}
 %
 %   As is generally true for \pkg{expl3}, these functions are designed to
-%   work with Unicode input only. As such, when used with \pdfTeX{}
-%   \emph{only} the characters \texttt{a}--\texttt{zA}--\texttt{Z} are
-%   modified. When used with \XeTeX{} or \LuaTeX{} a full range of Unicode
-%   transformations are enabled. Specifically, the standard mappings here
-%   follow those defined by the \href{http://www.unicode.org}^^A
+%   work with Unicode input only. As such, UTF-8 input is assumed for
+%   \emph{all} engines. When used with \XeTeX{} or \LuaTeX{} a full range of
+%   Unicode transformations are enabled. Specifically, the standard mappings
+%   here follow those defined by the \href{http://www.unicode.org}^^A
 %   {Unicode Consortium} in \texttt{UnicodeData.txt} and
-%   \texttt{SpecialCasing.txt}. Note that in some cases, \pdfTeX{} can
-%   interpret the input to a case change but not generate the correct output
-%   (for example in the mapping i to I-dot in Turkish): in these cases the
-%   input is left unchanged.
+%   \texttt{SpecialCasing.txt}. In the case of $8$-bit engines, mappings
+%   are provided for characters which can be represented in output typeset
+%   using the |T1| font encoding. Thus for example |ä| can be case-changed
+%   using \pdfTeX{}.
 %
 % Context-sensitive mappings are enabled: language-dependent cases are
 % discussed below. Context detection will expand input but treats any
@@ -3058,6 +3073,7 @@
 %     \@@_change_case_output:nwn ,
 %     \@@_change_case_output:Vwn ,
 %     \@@_change_case_output:own ,
+%     \@@_change_case_output:Vwn ,
 %     \@@_change_case_output:fwn ,
 %   }
 % \begin{macro}[aux, EXP]{\@@_change_case_end:wn}
@@ -3073,9 +3089,16 @@
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nnnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_char:Nnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_char:nN}
-% \begin{macro}[aux, EXP]{\@@_change_case_char_aux:nN}
+% \begin{macro}[aux, EXP]
+%   {\@@_change_case_char_auxi:nN, \@@_change_case_char_auxii:nN}
 % \begin{macro}[aux]
 %   {\@@_lookup_lower:N, \@@_lookup_upper:N, \@@_lookup_title:N}
+% \begin{macro}[aux, EXP]{\@@_change_case_char_UTFiix:nNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_char_UTFiix:nNNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_char_UTFiix:nNNNN}
+% \begin{macro}[aux, EXP]{\@@_change_case_char_UTFiix:nn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:Nn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_accents:NN}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:N}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:NN}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:NNn}
@@ -3127,7 +3150,7 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_output:nwn #1#2 \@@_change_case_result:n #3
   { #2 \@@_change_case_result:n { #3 #1 } }
-\cs_generate_variant:Nn \@@_change_case_output:nwn { V , o , f }
+\cs_generate_variant:Nn \@@_change_case_output:nwn { V , o , v , f }
 \cs_new:Npn \@@_change_case_end:wn #1 \@@_change_case_result:n #2
   {
     \group_align_safe_end:
@@ -3253,19 +3276,19 @@
 \cs_new:Npn \@@_change_case_N_type:Nnnn #1#2#3#4
   {
     \token_if_cs:NTF #1
-      { \@@_change_case_cs:N #1 }
+      { \@@_change_case_cs_letterlike:Nn #1 {#3} }
       { \@@_change_case_char:Nnn #1 {#3} {#4} }
     \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
 %    \end{macrocode}
-%   For character tokens there are a couple of potential special cases to
-%   handle then the core idea of the loop: a lookup table. The latter uses
-%   the character code to spilt what would otherwise be a very long list into
-%   $100$ manageable blocks (this is a balance between hash table usage and
-%   performance). Notice that the special case code may do a look-ahead so
-%   requires a final \texttt{w}-type argument whereas the core lookup table
-%   does not and also guarantees an output so \texttt{f}-type expansion may
-%   be used to obtain the case-changed result.
+%   For character tokens there are some special cases to deal with then
+%   the majority of changes are covered by using the \TeX{} data as a lookup
+%   along with expandable character generation. This avoids needing a very
+%   large number of macros or (as seen in earlier versions) a somewhat tricky
+%   split of the characters into various blocks. Notice that the special case
+%   code may do a look-ahead so requires a final \texttt{w}-type argument
+%   whereas the core lookup table does not and also guarantees an output so
+%   \texttt{f}-type expansion may be used to obtain the case-changed result.
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_char:Nnn #1#2#3
   {
@@ -3277,18 +3300,47 @@
             { \@@_change_case_char:nN {#2} #1 }
         }
   }
-\cs_new:Npn \@@_change_case_char:nN #1#2
+%    \end{macrocode}
+%   For Unicode engines we can handle all characters directly. However, for
+%   the $8$-bit engines the aim is to deal with (a subset of) Unicode (UTF-8)
+%   input. They deal with that by making the upper half of the range active,
+%   so we look for that and if found work out how many UTF-8 octets there
+%   are to deal with. Those can then be grabbed to reconstruct the full
+%   Unicode character, which is then used in a lookup. (As will become
+%   obvious below, there is no intention here of covering all of Unicode.)
+%    \begin{macrocode}
+\cs_if_exist:NTF \utex_char:D
+  {
+    \cs_new:Npn \@@_change_case_char:nN #1#2
+      { \@@_change_case_char_auxi:nN {#1} #2 }
+  }
+  {
+    \cs_new:Npn \@@_change_case_char:nN #1#2
+      {
+        \int_compare:nNnTF { `#2 } > { "80 }
+          {
+            \int_compare:nNnTF { `#2 } < { "E0 }
+              { \@@_change_case_char_UTFiix:nNNN {#1} #2 }
+              {
+                \int_compare:nNnTF { `#2 } < { "F0 }
+                  { \@@_change_case_char_UTFiix:nNNNN {#1} #2 }
+                  { \@@_change_case_char_UTFiix:nNNNNN {#1} #2 }
+              }
+          }
+          { \@@_change_case_char_auxi:nN {#1} #2 }
+       }
+  }
+\cs_new:Npn \@@_change_case_char_auxi:nN #1#2
   {
     \@@_change_case_output:fwn
       {
-        \cs_if_exist:cTF { c__unicode_ #1 _ #2 _tl }
-          { \tl_use:c { c__unicode_ #1 _ #2 _tl } }
-          { \@@_change_case_char_aux:nN {#1} #2 }
+        \cs_if_exist_use:cF { c__unicode_ #1 _ \token_to_str:N #2 _tl }
+          { \@@_change_case_char_auxii:nN {#1} #2 }
       }
   }
 \cs_if_exist:NTF \utex_char:D
   {
-    \cs_new:Npn \@@_change_case_char_aux:nN #1#2
+    \cs_new:Npn \@@_change_case_char_auxii:nN #1#2
       {
         \int_compare:nNnTF { \use:c { @@_lookup_ #1 :N } #2 } = { 0 }
           { \exp_stop_f: #2 }
@@ -3301,9 +3353,63 @@
     \cs_new_eq:NN \@@_lookup_title:N \@@_lookup_upper:N
   }
   {
-    \cs_new:Npn \@@_change_case_char_aux:nN #1#2 { \exp_stop_f: #2 }
+    \cs_new:Npn \@@_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 }
+    \cs_new:Npn \@@_change_case_char_UTFiix:nNNN #1#2#3#4
+      { \@@_change_case_char_UTFiix:nnN {#1} {#2#4} #3 }
+    \cs_new:Npn \@@_change_case_char_UTFiix:nNNNN #1#2#3#4#5
+      { \@@_change_case_char_UTFiix:nnN {#1} {#2#4#5} #3 }
+    \cs_new:Npn \@@_change_case_char_UTFiix:nNNNNN #1#2#3#4#5#6
+      { \@@_change_case_char_UTFiix:nnN {#1} {#2#4#5#6} #3 }
+    \cs_new:Npn \@@_change_case_char_UTFiix:nnN #1#2#3
+      {
+        \@@_change_case_output:fwn
+          {
+            \cs_if_exist_use:cF { c__unicode_ #1 _ \tl_to_str:n {#2} _tl }
+              { \exp_stop_f: #2 }
+          }
+        #3
+      }
   }
 %    \end{macrocode}
+%   Before dealing with general control sequences there are the special
+%   ones to deal with. Letter-like control sequences are a simple look-up,
+%   while for accents the loop is much as done elsewhere. Notice that
+%   we have a no-op test to make sure there is no unexpected expansion of
+%   letter-like input.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_cs_letterlike:Nn #1#2
+  {
+    \cs_if_exist:cTF { c_@@_change_case_ #2 _ \token_to_str:N #1 _tl }
+      {
+        \@@_change_case_output:vwn
+          { c_@@_change_case_ #2 _ \token_to_str:N #1 _tl } 
+      }
+      {
+        \cs_if_exist:cTF
+          {
+            c_@@_change_case_
+            \str_if_eq:nnTF {#2} { lower } { upper } { lower }
+            _ \token_to_str:N #1 _tl 
+          }
+          { \@@_change_case_output:nwn {#1} }
+          {
+            \exp_after:wN \@@_change_case_cs_accents:NN
+              \exp_after:wN #1 \l_tl_case_change_accents_tl
+              \q_recursion_tail \q_recursion_stop
+          }
+      }
+  }
+\cs_new:Npn \@@_change_case_cs_accents:NN #1#2
+  {
+    \quark_if_recursion_tail_stop_do:Nn #2
+      { \@@_change_case_cs:N #1 }
+    \str_if_eq:nnTF {#1} {#2}
+      {
+        \use_i_delimit_by_q_recursion_stop:nw
+          { \@@_change_case_output:nwn {#1} }
+      }
+      { \@@_change_case_cs_accents:NN #1 }
+  }
 %    \end{macrocode}
 %   To deal with a control sequence there is first a need to test if it is
 %   on the list which indicate that case changing should be skipped. That's
@@ -3394,6 +3500,12 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[aux, EXP]{\@@_change_case_lower_sigma:Nnw}
 % \begin{macro}[aux, EXP]{\@@_change_case_lower_sigma:w}
@@ -3453,16 +3565,18 @@
 %   either a dotless-I or a dotted-I. In the latter case the mapping is
 %   easy, but in the former there is a second stage search.
 %    \begin{macrocode}
-\cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
+\cs_if_exist:NTF \utex_char:D
   {
-    \int_compare:nNnTF { `#1 } = { "0049 }
-      { \@@_change_case_lower_tr_auxi:Nw }
+    \cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
       {
-        \int_compare:nNnTF { `#1 } = { "0130 }
-          { \@@_change_case_output:nwn { i } }
-          {#2}
+        \int_compare:nNnTF { `#1 } = { "0049 }
+          { \@@_change_case_lower_tr_auxi:Nw }
+          {
+            \int_compare:nNnTF { `#1 } = { "0130 }
+              { \@@_change_case_output:nwn { i } }
+              {#2}
+          }
       }
-  }
 %    \end{macrocode}
 %   After a dotless-I there may be a dot-above character. If there is then
 %   a dotted-i should be produced, otherwise output a dotless-i. When the
@@ -3471,30 +3585,61 @@
 %   (it grabs \cs{@@_change_case_loop:wn} and the dot-above char and
 %   discards the latter).
 %    \begin{macrocode}
-\cs_new:Npn \@@_change_case_lower_tr_auxi:Nw #1#2 \q_recursion_stop
-  {
-    \tl_if_head_is_N_type:nTF {#2}
-      { \@@_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop }
-      { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
-    #1 #2 \q_recursion_stop
-  }
-\cs_new:Npn \@@_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop
-  {
-    \@@_change_case_if_expandable:NTF #1
+    \cs_new:Npn \@@_change_case_lower_tr_auxi:Nw #1#2 \q_recursion_stop
       {
-        \exp_after:wN \@@_change_case_lower_tr_auxi:Nw #1
-          #2 \q_recursion_stop
+        \tl_if_head_is_N_type:nTF {#2}
+          { \@@_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop }
+          { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
+        #1 #2 \q_recursion_stop
       }
+    \cs_new:Npn \@@_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop
       {
-        \bool_if:nTF
+        \@@_change_case_if_expandable:NTF #1
           {
-               \token_if_cs_p:N #1
-            || ! ( \int_compare_p:nNn { `#1 } = { "0307 } )
+            \exp_after:wN \@@_change_case_lower_tr_auxi:Nw #1
+              #2 \q_recursion_stop
           }
+          {
+            \bool_if:nTF
+              {
+                   \token_if_cs_p:N #1
+                || ! ( \int_compare_p:nNn { `#1 } = { "0307 } )
+              }
+              { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
+              {
+                \@@_change_case_output:nwn { i }
+                \use_i:nn
+              }
+          }
+      }
+  }
+%    \end{macrocode}
+%   For $8$-bit engines, dot-above is not available so there is a simple
+%   test for an upper-case I. Then we can look for the UTF-8 representation of
+%   an upper case dotted-I without the combining char. If it's not there,
+%   preserve the UTF-8 sequence as-is.
+%    \begin{macrocode}
+  {
+    \cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
+      {
+        \int_compare:nNnTF { `#1 } = { "0049 }
           { \@@_change_case_output:Vwn \c__unicode_dotless_i_tl }
           {
+            \int_compare:nNnTF { `#1 } = { 196 }
+              { \@@_change_case_lower_tr_auxi:Nw #1 {#2} }
+              {#2}
+          }
+      }
+    \cs_new:Npn \@@_change_case_lower_tr_auxi:Nw #1#2#3#4
+      {
+        \int_compare:nNnTF { `#4 } = { 176 }
+          {
             \@@_change_case_output:nwn { i }
-            \use_i:nn
+            #3
+          }
+          {
+            #2
+            #3 #4
           }
       }
   }
@@ -3668,30 +3813,87 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\__tl_change_case_upper_de-alt:Nnw}
+% \begin{macro}{\@@_change_case_upper_de-alt:Nnw}
 %   A simple alternative version for German.
 %    \begin{macrocode}
 \cs_new:cpn { @@_change_case_upper_de-alt:Nnw } #1#2
   {
     \int_compare:nNnTF { `#1 } = { 223 }
-      { \__tl_change_case_output:Vwn \c__unicode_upper_Eszett_tl }
+      { \@@_change_case_output:Vwn \c__unicode_upper_Eszett_tl }
       {#2}
   }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP, int]{\__unicode_codepoint_to_UTFiix:n}
+% \begin{macro}[EXP, aux]{\__unicode_codepoint_to_UTFiix_auxi:n}
+% \begin{macro}[EXP, aux]{\__unicode_codepoint_to_UTFiix_auxii:Nnn}
+% \begin{macro}[EXP, aux]{\__unicode_codepoint_to_UTFiix_auxiii:n}
+%   This code will convert a codepoint into the correct UTF-8 represenation.
+%   As there are a variable number of octets, the result starts with the
+%   numeral |1|--|4| to indicate the nature of the returned value. Note that
+%   this code will cover the full range even though at this stage it is not
+%   required here. Also note that longer-term this is likely to need a public
+%   interface and/or moving to \pkg{l3str} (see experimental string
+%   conversions). In terms of the algoritm itself, see
+%   \url{https://en.wikipedia.org/wiki/UTF-8} for the octet pattern.
+%    \begin{macrocode}
+\cs_new:Npn \__unicode_codepoint_to_UTFiix:n #1
+  {
+    \exp_args:Nf \__unicode_codepoint_to_UTFiix_auxi:n
+      { \int_eval:n {#1} }
+  }
+\cs_new:Npn \__unicode_codepoint_to_UTFiix_auxi:n #1
+  {
+    \if_int_compare:w #1 > "80 ~
+      \if_int_compare:w #1 < "800 ~
+        2
+        \__unicode_codepoint_to_UTFiix_auxii:Nnn C {#1} { 64 }
+        \__unicode_codepoint_to_UTFiix_auxiii:n {#1}
+      \else:
+        \if_int_compare:w #1 < "10000 ~
+          3
+          \__unicode_codepoint_to_UTFiix_auxii:Nnn E {#1} { 64 * 64 }
+          \__unicode_codepoint_to_UTFiix_auxiii:n {#1}
+          \__unicode_codepoint_to_UTFiix_auxiii:n
+            { \int_div_truncate:nn {#1} { 64 } }
+        \else:
+          4
+          \__unicode_codepoint_to_UTFiix_auxii:Nnn F
+            {#1} { 64 * 64 * 64 }
+          \__unicode_codepoint_to_UTFiix_auxiii:n
+            { \int_div_truncate:nn {#1} { 64 * 64 } }
+          \__unicode_codepoint_to_UTFiix_auxiii:n
+            { \int_div_truncate:nn {#1} { 64 } }
+          \__unicode_codepoint_to_UTFiix_auxiii:n {#1}
+
+        \fi:
+      \fi:
+    \else:
+      1 {#1}
+    \fi:
+  }
+\cs_new:Npn \__unicode_codepoint_to_UTFiix_auxii:Nnn #1#2#3
+  { { \int_eval:n { "#10 + \int_div_truncate:nn {#2} {#3} } } }
+\cs_new:Npn \__unicode_codepoint_to_UTFiix_auxiii:n #1
+  { { \int_eval:n { \int_mod:nn {#1} { 64 } + 128 } } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{variable}
 %   {
 %     \c__unicode_std_sigma_tl    ,
 %     \c__unicode_final_sigma_tl  ,
 %     \c__unicode_accents_lt_tl   ,
 %     \c__unicode_dot_above_tl    ,
-%     \c__unicode_dotless_i_tl    ,
-%     \c__unicode_dotted_I_tl     ,
-%     \c__unicode_i_ogonek_tl     ,
-%     \c__unicode_I_ogonek_tl     ,
 %     \c__unicode_upper_Eszett_tl
 %   }
+%   The above needs various special token lists containg pre-formed characters.
+%   This set are only available in Unicode engines, with no-op definitions
+%   for $8$-bit use.
 %    \begin{macrocode}
 \cs_if_exist:NTF \utex_char:D
   {
@@ -3707,24 +3909,260 @@
           { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0303 ~ }
       }
     \tl_const:Nx \c__unicode_dot_above_tl    { \utex_char:D "0307 ~ }
-    \tl_const:Nx \c__unicode_dotless_i_tl    { \utex_char:D "0131 ~ }
-    \tl_const:Nx \c__unicode_dotted_I_tl     { \utex_char:D "0130 ~ }
-    \tl_const:Nx \c__unicode_i_ogonek_tl     { \utex_char:D "012F ~ }
-    \tl_const:Nx \c__unicode_I_ogonek_tl     { \utex_char:D "012E ~ }
     \tl_const:Nx \c__unicode_upper_Eszett_tl { \utex_char:D "1E9E ~}
   }
   {
-    \tl_const:Nn \c__unicode_std_sigma_tl    { }
-    \tl_const:Nn \c__unicode_final_sigma_tl  { }
-    \tl_const:Nn \c__unicode_accents_lt_tl   { }
-    \tl_const:Nn \c__unicode_dot_above_tl    { }
-    \tl_const:Nn \c__unicode_dotless_i_tl    { I }
-    \tl_const:Nn \c__unicode_dotted_I_tl     { i }
-    \tl_const:Nn \c__unicode_i_ogonek_tl     { }
-    \tl_const:Nn \c__unicode_I_ogonek_tl     { }
-    \tl_const:Nn \c__unicode_upper_Eszett_tl { }
+      \tl_const:Nn \c__unicode_std_sigma_tl    { }
+      \tl_const:Nn \c__unicode_final_sigma_tl  { }
+      \tl_const:Nn \c__unicode_accents_lt_tl   { }
+      \tl_const:Nn \c__unicode_dot_above_tl    { }
+      \tl_const:Nn \c__unicode_upper_Eszett_tl { }
+  }
+%    \end{macrocode}
+% \end{variable}
+% \begin{variable}
+%   {
+%     \c__unicode_dotless_i_tl    ,
+%     \c__unicode_dotted_I_tl     ,
+%     \c__unicode_i_ogonek_tl     ,
+%     \c__unicode_I_ogonek_tl     ,
+%   }
+%  For cases where there is an $8$-bit option in the |T1| font set up,
+%  a variant is provided in both cases.
+%    \begin{macrocode}
+\group_begin:
+  \cs_if_exist:NTF \utex_char:D
+    {
+      \cs_set_protected:Npn \@@_tmp:w #1#2
+        { \tl_const:Nx #1 { \utex_char:D "#2 ~ } }
+    }
+    {
+      \char_set_catcode_active:N .
+      \char_set_catcode_active:N !
+      \cs_set_protected:Npn \@@_tmp:w #1#2
+        {
+          \group_begin:
+            \cs_set_protected:Npn \@@_tmp:w ##1##2##3
+              {
+                \char_set_lccode:nn { `\. } {##2}
+                \char_set_lccode:nn { `\! } {##3}
+                \tex_lowercase:D
+                  { \tl_const:Nn #1 { . ! } }
+              }
+            \tl_set:Nx \l_@@_internal_a_tl
+              { \__unicode_codepoint_to_UTFiix:n {"#2} }
+            \exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
+          \group_end:
+        }
+    }
+  \@@_tmp:w \c__unicode_dotless_i_tl { 0131 }
+  \@@_tmp:w \c__unicode_dotted_I_tl  { 0130 }
+  \@@_tmp:w \c__unicode_i_ogonek_tl  { 012F }
+  \@@_tmp:w \c__unicode_I_ogonek_tl  { 012E }  
+\group_end:
+%    \end{macrocode}
+% \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
+% 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.
+%    \begin{macrocode}
+\cs_if_exist:NF \utex_char:D
+  {
+    \group_begin:
+      \char_set_catcode_active:N .
+      \char_set_catcode_active:N !
+      \char_set_catcode_active:N ;
+      \char_set_catcode_active:N ,
+      \cs_set_protected:Npn \@@_loop:nn #1#2
+        {
+          \quark_if_recursion_tail_stop:n {#1}
+          \tl_set:Nx \l_@@_internal_a_tl
+            {
+              \__unicode_codepoint_to_UTFiix:n {"#1}
+              \__unicode_codepoint_to_UTFiix:n {"#2}
+            }
+          \exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
+          \@@_loop:nn
+        }
+      \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6
+        {
+          \char_set_lccode:nn { `\. } {#2}
+          \char_set_lccode:nn { `\! } {#3}
+          \char_set_lccode:nn { `\; } {#5}
+          \char_set_lccode:nn { `\, } {#6}
+          \tex_lowercase:D
+            {
+              \tl_const:cn { c__unicode_lower_ \tl_to_str:n { . ! } _tl }
+                { ; , }
+              \tl_const:cn { c__unicode_upper_ \tl_to_str:n { ; , } _tl }
+                { . ! }
+            }
+        }
+      \@@_loop:nn
+        { 00C0 } { 00E0 }
+        { 00C2 } { 00E2 }
+        { 00C3 } { 00E3 }
+        { 00C4 } { 00E4 }
+        { 00C5 } { 00E5 }
+        { 00C6 } { 00E6 }
+        { 00C7 } { 00E7 }
+        { 00C8 } { 00E8 }
+        { 00C9 } { 00E9 }
+        { 00CA } { 00EA }
+        { 00CB } { 00EB }
+        { 00CC } { 00EC }
+        { 00CD } { 00ED }
+        { 00CE } { 00EE }
+        { 00CF } { 00EF }
+        { 00D0 } { 00F0 }
+        { 00D1 } { 00F1 }
+        { 00D2 } { 00F2 }
+        { 00D3 } { 00F3 }
+        { 00D4 } { 00F4 }
+        { 00D5 } { 00F5 }
+        { 00D6 } { 00F6 }
+        { 00D8 } { 00F8 }
+        { 00D9 } { 00F9 }
+        { 00DA } { 00FA }
+        { 00DB } { 00FB }
+        { 00DC } { 00FC }
+        { 00DD } { 00FD }
+        { 00DE } { 00FE }
+        { 0100 } { 0101 }
+        { 0102 } { 0103 }
+        { 0104 } { 0105 }
+        { 0106 } { 0107 }
+        { 0108 } { 0109 }
+        { 010A } { 010B }
+        { 010C } { 010D }
+        { 010E } { 010F }
+        { 0110 } { 0111 }
+        { 0112 } { 0113 }
+        { 0114 } { 0115 }
+        { 0116 } { 0117 }
+        { 0118 } { 0119 }
+        { 011A } { 011B }
+        { 011C } { 011D }
+        { 011E } { 011F }
+        { 0120 } { 0121 }
+        { 0122 } { 0123 }
+        { 0124 } { 0125 }
+        { 0128 } { 0129 }
+        { 012A } { 012B }
+        { 012C } { 012D }
+        { 012E } { 012F }
+        { 0132 } { 0133 }
+        { 0134 } { 0135 }
+        { 0136 } { 0137 }
+        { 0139 } { 013A }
+        { 013B } { 013C }
+        { 013E } { 013F }
+        { 0141 } { 0142 }
+        { 0143 } { 0144 }
+        { 0145 } { 0146 }
+        { 0147 } { 0148 }
+        { 014A } { 014B }
+        { 014C } { 014D }
+        { 014E } { 014F }
+        { 0150 } { 0151 }
+        { 0152 } { 0153 }
+        { 0154 } { 0155 }
+        { 0156 } { 0157 }
+        { 0158 } { 0159 }
+        { 015A } { 015B }
+        { 015C } { 015D }
+        { 015E } { 015F }
+        { 0160 } { 0161 }
+        { 0162 } { 0163 }
+        { 0164 } { 0165 }
+        { 0168 } { 0169 }
+        { 016A } { 016B }
+        { 016C } { 016D }
+        { 016E } { 016F }
+        { 0170 } { 0171 }
+        { 0172 } { 0173 }
+        { 0174 } { 0175 }
+        { 0176 } { 0177 }
+        { 0178 } { 00FF }
+        { 0179 } { 017A }
+        { 017B } { 017C }
+        { 017D } { 017E }
+        { 01CD } { 01CE }
+        { 01CF } { 01D0 }
+        { 01D1 } { 01D2 }
+        { 01D3 } { 01D4 }
+        { 01E2 } { 01E3 }
+        { 01E6 } { 01E7 }
+        { 01E8 } { 01E9 }
+        { 01EA } { 01EB }
+        { 01F4 } { 01F5 }
+        { 0218 } { 0219 }
+        { 021A } { 021B }
+        \q_recursion_tail ?
+        \q_recursion_stop
+      \cs_set_protected:Npn \@@_tmp:w #1#2#3
+        {
+          \group_begin:
+            \cs_set_protected:Npn \@@_tmp:w ##1##2##3
+              {
+                \char_set_lccode:nn { `\. } {##2}
+                \char_set_lccode:nn { `\! } {##3}
+                \tex_lowercase:D
+                  {
+                    \tl_const:cn
+                      { c__unicode_ #3 _ \tl_to_str:n { . ! } _tl }
+                  }
+                    { #2 }
+              }
+            \tl_set:Nx \l_@@_internal_a_tl
+              { \__unicode_codepoint_to_UTFiix:n { "#1 } }
+            \exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
+          \group_end:
+        }
+      \@@_tmp:w { 00DF } { SS } { upper }
+      \@@_tmp:w { 00DF } { Ss } { title }
+      \@@_tmp:w { 0131 } { I }  { upper }
+    \group_end:
   }
 %    \end{macrocode}
+%
+% The (fixed) look-up mappings for letter-like control sequences.
+%    \begin{macrocode}
+\group_begin:
+  \cs_set_protected:Npn \@@_change_case_setup:NN #1#2
+    {
+      \quark_if_recursion_tail_stop:N #1
+      \tl_const:cn  { c_@@_change_case_lower_ \token_to_str:N #1 _tl } { #2 }
+      \tl_const:cn  { c_@@_change_case_upper_ \token_to_str:N #2 _tl } { #1 }
+      \@@_change_case_setup:NN
+    }
+  \@@_change_case_setup:NN
+  \AA \aa
+  \AE \ae
+  \DH \dh
+  \DJ \dj
+  \L  \l
+  \NG \ng
+  \O  \o
+  \OE \oe
+  \SS \ss
+  \TH \th
+  \q_recursion_tail ?
+  \q_recursion_stop
+  \tl_const:cn  { c_@@_change_case_upper_ \token_to_str:N \i _tl } { I }
+  \tl_const:cn  { c_@@_change_case_upper_ \token_to_str:N \j _tl } { J }
+\group_end:
+%    \end{macrocode}
+%
+% \begin{variable}{\l_tl_case_change_accents_tl}
+%   A list of accents to leave alone.
+%    \begin{macrocode}
+\tl_new:N \l_tl_case_change_accents_tl
+\tl_set:Nn \l_tl_case_change_accents_tl { \" \^ \' \` \. \c \u \~ \H \v }
+%    \end{macrocode}
 % \end{variable}
 %
 % \begin{macro}[aux, EXP]{\@@_mixed_case:nn}
@@ -3831,7 +4269,7 @@
   {
     \token_if_cs:NTF #1
       {
-        \@@_change_case_cs:N #1
+        \@@_change_case_cs_letterlike:Nn #1 { upper }
         \@@_mixed_case_loop:wn #2 \q_recursion_stop {#3}
       }
       {
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index ba6f8e6..8926036 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -4585,6 +4585,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4599,10 +4600,13 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
 Defining \__tl_lookup_title:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4629,15 +4633,42 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 1aac91f..fcf3c1f 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -4317,6 +4317,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4331,7 +4332,14 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nnN on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4344,7 +4352,6 @@ Defining \__tl_change_case_lower_sigma:Nw on line ...
 Defining \__tl_change_case_upper_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_tr:Nnw on line ...
 Defining \__tl_change_case_lower_tr_auxi:Nw on line ...
-Defining \__tl_change_case_lower_tr_auxii:Nw on line ...
 Defining \__tl_change_case_upper_tr:Nnw on line ...
 Defining \__tl_change_case_lower_az:Nnw on line ...
 Defining \__tl_change_case_upper_az:Nnw on line ...
@@ -4358,15 +4365,243 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__unicode_lower_�^^80_tl on line ...
+Defining \c__unicode_upper_�^^a0_tl on line ...
+Defining \c__unicode_lower_�^^82_tl on line ...
+Defining \c__unicode_upper_但_tl on line ...
+Defining \c__unicode_lower_�^^83_tl on line ...
+Defining \c__unicode_upper_達_tl on line ...
+Defining \c__unicode_lower_�^^84_tl on line ...
+Defining \c__unicode_upper_辰_tl on line ...
+Defining \c__unicode_lower_�^^85_tl on line ...
+Defining \c__unicode_upper_奪_tl on line ...
+Defining \c__unicode_lower_�^^86_tl on line ...
+Defining \c__unicode_upper_脱_tl on line ...
+Defining \c__unicode_lower_�^^87_tl on line ...
+Defining \c__unicode_upper_巽_tl on line ...
+Defining \c__unicode_lower_�^^88_tl on line ...
+Defining \c__unicode_upper_竪_tl on line ...
+Defining \c__unicode_lower_�^^89_tl on line ...
+Defining \c__unicode_upper_辿_tl on line ...
+Defining \c__unicode_lower_�^^8a_tl on line ...
+Defining \c__unicode_upper_棚_tl on line ...
+Defining \c__unicode_lower_�^^8b_tl on line ...
+Defining \c__unicode_upper_谷_tl on line ...
+Defining \c__unicode_lower_�^^8c_tl on line ...
+Defining \c__unicode_upper_狸_tl on line ...
+Defining \c__unicode_lower_�^^8d_tl on line ...
+Defining \c__unicode_upper_鱈_tl on line ...
+Defining \c__unicode_lower_�^^8e_tl on line ...
+Defining \c__unicode_upper_樽_tl on line ...
+Defining \c__unicode_lower_�^^8f_tl on line ...
+Defining \c__unicode_upper_誰_tl on line ...
+Defining \c__unicode_lower_�^^90_tl on line ...
+Defining \c__unicode_upper_丹_tl on line ...
+Defining \c__unicode_lower_�^^91_tl on line ...
+Defining \c__unicode_upper_単_tl on line ...
+Defining \c__unicode_lower_�^^92_tl on line ...
+Defining \c__unicode_upper_嘆_tl on line ...
+Defining \c__unicode_lower_�^^93_tl on line ...
+Defining \c__unicode_upper_坦_tl on line ...
+Defining \c__unicode_lower_�^^94_tl on line ...
+Defining \c__unicode_upper_担_tl on line ...
+Defining \c__unicode_lower_�^^95_tl on line ...
+Defining \c__unicode_upper_探_tl on line ...
+Defining \c__unicode_lower_�^^96_tl on line ...
+Defining \c__unicode_upper_旦_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_淡_tl on line ...
+Defining \c__unicode_lower_�^^99_tl on line ...
+Defining \c__unicode_upper_湛_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_炭_tl on line ...
+Defining \c__unicode_lower_�^^9b_tl on line ...
+Defining \c__unicode_upper_短_tl on line ...
+Defining \c__unicode_lower_�^^9c_tl on line ...
+Defining \c__unicode_upper_端_tl on line ...
+Defining \c__unicode_lower_�^^9d_tl on line ...
+Defining \c__unicode_upper_箪_tl on line ...
+Defining \c__unicode_lower_�^^9e_tl on line ...
+Defining \c__unicode_upper_綻_tl on line ...
+Defining \c__unicode_lower_�^^80_tl on line ...
+Defining \c__unicode_upper_�^^81_tl on line ...
+Defining \c__unicode_lower_�^^82_tl on line ...
+Defining \c__unicode_upper_�^^83_tl on line ...
+Defining \c__unicode_lower_�^^84_tl on line ...
+Defining \c__unicode_upper_�^^85_tl on line ...
+Defining \c__unicode_lower_�^^86_tl on line ...
+Defining \c__unicode_upper_�^^87_tl on line ...
+Defining \c__unicode_lower_�^^88_tl on line ...
+Defining \c__unicode_upper_�^^89_tl on line ...
+Defining \c__unicode_lower_�^^8a_tl on line ...
+Defining \c__unicode_upper_�^^8b_tl on line ...
+Defining \c__unicode_lower_�^^8c_tl on line ...
+Defining \c__unicode_upper_�^^8d_tl on line ...
+Defining \c__unicode_lower_�^^8e_tl on line ...
+Defining \c__unicode_upper_�^^8f_tl on line ...
+Defining \c__unicode_lower_�^^90_tl on line ...
+Defining \c__unicode_upper_�^^91_tl on line ...
+Defining \c__unicode_lower_�^^92_tl on line ...
+Defining \c__unicode_upper_�^^93_tl on line ...
+Defining \c__unicode_lower_�^^94_tl on line ...
+Defining \c__unicode_upper_�^^95_tl on line ...
+Defining \c__unicode_lower_�^^96_tl on line ...
+Defining \c__unicode_upper_�^^97_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_�^^99_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_�^^9b_tl on line ...
+Defining \c__unicode_lower_�^^9c_tl on line ...
+Defining \c__unicode_upper_�^^9d_tl on line ...
+Defining \c__unicode_lower_�^^9e_tl on line ...
+Defining \c__unicode_upper_�^^9f_tl on line ...
+Defining \c__unicode_lower_�^^a0_tl on line ...
+Defining \c__unicode_upper_帖_tl on line ...
+Defining \c__unicode_lower_帳_tl on line ...
+Defining \c__unicode_upper_庁_tl on line ...
+Defining \c__unicode_lower_弔_tl on line ...
+Defining \c__unicode_upper_張_tl on line ...
+Defining \c__unicode_lower_懲_tl on line ...
+Defining \c__unicode_upper_挑_tl on line ...
+Defining \c__unicode_lower_暢_tl on line ...
+Defining \c__unicode_upper_朝_tl on line ...
+Defining \c__unicode_lower_潮_tl on line ...
+Defining \c__unicode_upper_牒_tl on line ...
+Defining \c__unicode_lower_町_tl on line ...
+Defining \c__unicode_upper_眺_tl on line ...
+Defining \c__unicode_lower_腸_tl on line ...
+Defining \c__unicode_upper_蝶_tl on line ...
+Defining \c__unicode_lower_調_tl on line ...
+Defining \c__unicode_upper_諜_tl on line ...
+Defining \c__unicode_lower_超_tl on line ...
+Defining \c__unicode_upper_跳_tl on line ...
+Defining \c__unicode_lower_長_tl on line ...
+Defining \c__unicode_upper_頂_tl on line ...
+Defining \c__unicode_lower_鳥_tl on line ...
+Defining \c__unicode_upper_勅_tl on line ...
+Defining \c__unicode_lower_直_tl on line ...
+Defining \c__unicode_upper_朕_tl on line ...
+Defining \c__unicode_lower_�^^81_tl on line ...
+Defining \c__unicode_upper_�^^82_tl on line ...
+Defining \c__unicode_lower_�^^83_tl on line ...
+Defining \c__unicode_upper_�^^84_tl on line ...
+Defining \c__unicode_lower_�^^85_tl on line ...
+Defining \c__unicode_upper_�^^86_tl on line ...
+Defining \c__unicode_lower_�^^87_tl on line ...
+Defining \c__unicode_upper_�^^88_tl on line ...
+Defining \c__unicode_lower_�^^8a_tl on line ...
+Defining \c__unicode_upper_�^^8b_tl on line ...
+Defining \c__unicode_lower_�^^8c_tl on line ...
+Defining \c__unicode_upper_�^^8d_tl on line ...
+Defining \c__unicode_lower_�^^8e_tl on line ...
+Defining \c__unicode_upper_�^^8f_tl on line ...
+Defining \c__unicode_lower_�^^90_tl on line ...
+Defining \c__unicode_upper_�^^91_tl on line ...
+Defining \c__unicode_lower_�^^92_tl on line ...
+Defining \c__unicode_upper_�^^93_tl on line ...
+Defining \c__unicode_lower_�^^94_tl on line ...
+Defining \c__unicode_upper_�^^95_tl on line ...
+Defining \c__unicode_lower_�^^96_tl on line ...
+Defining \c__unicode_upper_�^^97_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_�^^99_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_�^^9b_tl on line ...
+Defining \c__unicode_lower_�^^9c_tl on line ...
+Defining \c__unicode_upper_�^^9d_tl on line ...
+Defining \c__unicode_lower_�^^9e_tl on line ...
+Defining \c__unicode_upper_�^^9f_tl on line ...
+Defining \c__unicode_lower_�^^a0_tl on line ...
+Defining \c__unicode_upper_邸_tl on line ...
+Defining \c__unicode_lower_鄭_tl on line ...
+Defining \c__unicode_upper_釘_tl on line ...
+Defining \c__unicode_lower_鼎_tl on line ...
+Defining \c__unicode_upper_泥_tl on line ...
+Defining \c__unicode_lower_敵_tl on line ...
+Defining \c__unicode_upper_滴_tl on line ...
+Defining \c__unicode_lower_的_tl on line ...
+Defining \c__unicode_upper_笛_tl on line ...
+Defining \c__unicode_lower_適_tl on line ...
+Defining \c__unicode_upper_鏑_tl on line ...
+Defining \c__unicode_lower_溺_tl on line ...
+Defining \c__unicode_upper_哲_tl on line ...
+Defining \c__unicode_lower_徹_tl on line ...
+Defining \c__unicode_upper_撤_tl on line ...
+Defining \c__unicode_lower_轍_tl on line ...
+Defining \c__unicode_upper_迭_tl on line ...
+Defining \c__unicode_lower_鉄_tl on line ...
+Defining \c__unicode_upper_典_tl on line ...
+Defining \c__unicode_lower_填_tl on line ...
+Defining \c__unicode_upper_天_tl on line ...
+Defining \c__unicode_lower_展_tl on line ...
+Defining \c__unicode_upper_耽_tl on line ...
+Defining \c__unicode_lower_店_tl on line ...
+Defining \c__unicode_upper_添_tl on line ...
+Defining \c__unicode_lower_纏_tl on line ...
+Defining \c__unicode_upper_甜_tl on line ...
+Defining \c__unicode_lower_貼_tl on line ...
+Defining \c__unicode_upper_転_tl on line ...
+Defining \c__unicode_lower_�^^8d_tl on line ...
+Defining \c__unicode_upper_�^^8e_tl on line ...
+Defining \c__unicode_lower_�^^8f_tl on line ...
+Defining \c__unicode_upper_�^^90_tl on line ...
+Defining \c__unicode_lower_�^^91_tl on line ...
+Defining \c__unicode_upper_�^^92_tl on line ...
+Defining \c__unicode_lower_�^^93_tl on line ...
+Defining \c__unicode_upper_�^^94_tl on line ...
+Defining \c__unicode_lower_尿_tl on line ...
+Defining \c__unicode_upper_韮_tl on line ...
+Defining \c__unicode_lower_忍_tl on line ...
+Defining \c__unicode_upper_認_tl on line ...
+Defining \c__unicode_lower_濡_tl on line ...
+Defining \c__unicode_upper_禰_tl on line ...
+Defining \c__unicode_lower_祢_tl on line ...
+Defining \c__unicode_upper_寧_tl on line ...
+Defining \c__unicode_lower_粘_tl on line ...
+Defining \c__unicode_upper_乃_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_�^^99_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_�^^9b_tl on line ...
+Defining \c__unicode_upper_�^^9f_tl on line ...
+Defining \c__unicode_title_�^^9f_tl on line ...
+Defining \c__unicode_upper_脹_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 7fffacf..4a0f071 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -4317,6 +4317,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4331,7 +4332,14 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nnN on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4344,7 +4352,6 @@ Defining \__tl_change_case_lower_sigma:Nw on line ...
 Defining \__tl_change_case_upper_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_tr:Nnw on line ...
 Defining \__tl_change_case_lower_tr_auxi:Nw on line ...
-Defining \__tl_change_case_lower_tr_auxii:Nw on line ...
 Defining \__tl_change_case_upper_tr:Nnw on line ...
 Defining \__tl_change_case_lower_az:Nnw on line ...
 Defining \__tl_change_case_upper_az:Nnw on line ...
@@ -4358,15 +4365,243 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__unicode_lower_^^c3^^80_tl on line ...
+Defining \c__unicode_upper_^^c3^^a0_tl on line ...
+Defining \c__unicode_lower_^^c3^^82_tl on line ...
+Defining \c__unicode_upper_^^c3^^a2_tl on line ...
+Defining \c__unicode_lower_^^c3^^83_tl on line ...
+Defining \c__unicode_upper_^^c3^^a3_tl on line ...
+Defining \c__unicode_lower_^^c3^^84_tl on line ...
+Defining \c__unicode_upper_^^c3^^a4_tl on line ...
+Defining \c__unicode_lower_^^c3^^85_tl on line ...
+Defining \c__unicode_upper_^^c3^^a5_tl on line ...
+Defining \c__unicode_lower_^^c3^^86_tl on line ...
+Defining \c__unicode_upper_^^c3^^a6_tl on line ...
+Defining \c__unicode_lower_^^c3^^87_tl on line ...
+Defining \c__unicode_upper_^^c3^^a7_tl on line ...
+Defining \c__unicode_lower_^^c3^^88_tl on line ...
+Defining \c__unicode_upper_^^c3^^a8_tl on line ...
+Defining \c__unicode_lower_^^c3^^89_tl on line ...
+Defining \c__unicode_upper_^^c3^^a9_tl on line ...
+Defining \c__unicode_lower_^^c3^^8a_tl on line ...
+Defining \c__unicode_upper_^^c3^^aa_tl on line ...
+Defining \c__unicode_lower_^^c3^^8b_tl on line ...
+Defining \c__unicode_upper_^^c3^^ab_tl on line ...
+Defining \c__unicode_lower_^^c3^^8c_tl on line ...
+Defining \c__unicode_upper_^^c3^^ac_tl on line ...
+Defining \c__unicode_lower_^^c3^^8d_tl on line ...
+Defining \c__unicode_upper_^^c3^^ad_tl on line ...
+Defining \c__unicode_lower_^^c3^^8e_tl on line ...
+Defining \c__unicode_upper_^^c3^^ae_tl on line ...
+Defining \c__unicode_lower_^^c3^^8f_tl on line ...
+Defining \c__unicode_upper_^^c3^^af_tl on line ...
+Defining \c__unicode_lower_^^c3^^90_tl on line ...
+Defining \c__unicode_upper_^^c3^^b0_tl on line ...
+Defining \c__unicode_lower_^^c3^^91_tl on line ...
+Defining \c__unicode_upper_^^c3^^b1_tl on line ...
+Defining \c__unicode_lower_^^c3^^92_tl on line ...
+Defining \c__unicode_upper_^^c3^^b2_tl on line ...
+Defining \c__unicode_lower_^^c3^^93_tl on line ...
+Defining \c__unicode_upper_^^c3^^b3_tl on line ...
+Defining \c__unicode_lower_^^c3^^94_tl on line ...
+Defining \c__unicode_upper_^^c3^^b4_tl on line ...
+Defining \c__unicode_lower_^^c3^^95_tl on line ...
+Defining \c__unicode_upper_^^c3^^b5_tl on line ...
+Defining \c__unicode_lower_^^c3^^96_tl on line ...
+Defining \c__unicode_upper_^^c3^^b6_tl on line ...
+Defining \c__unicode_lower_^^c3^^98_tl on line ...
+Defining \c__unicode_upper_^^c3^^b8_tl on line ...
+Defining \c__unicode_lower_^^c3^^99_tl on line ...
+Defining \c__unicode_upper_^^c3^^b9_tl on line ...
+Defining \c__unicode_lower_^^c3^^9a_tl on line ...
+Defining \c__unicode_upper_^^c3^^ba_tl on line ...
+Defining \c__unicode_lower_^^c3^^9b_tl on line ...
+Defining \c__unicode_upper_^^c3^^bb_tl on line ...
+Defining \c__unicode_lower_^^c3^^9c_tl on line ...
+Defining \c__unicode_upper_^^c3^^bc_tl on line ...
+Defining \c__unicode_lower_^^c3^^9d_tl on line ...
+Defining \c__unicode_upper_^^c3^^bd_tl on line ...
+Defining \c__unicode_lower_^^c3^^9e_tl on line ...
+Defining \c__unicode_upper_^^c3^^be_tl on line ...
+Defining \c__unicode_lower_^^c4^^80_tl on line ...
+Defining \c__unicode_upper_^^c4^^81_tl on line ...
+Defining \c__unicode_lower_^^c4^^82_tl on line ...
+Defining \c__unicode_upper_^^c4^^83_tl on line ...
+Defining \c__unicode_lower_^^c4^^84_tl on line ...
+Defining \c__unicode_upper_^^c4^^85_tl on line ...
+Defining \c__unicode_lower_^^c4^^86_tl on line ...
+Defining \c__unicode_upper_^^c4^^87_tl on line ...
+Defining \c__unicode_lower_^^c4^^88_tl on line ...
+Defining \c__unicode_upper_^^c4^^89_tl on line ...
+Defining \c__unicode_lower_^^c4^^8a_tl on line ...
+Defining \c__unicode_upper_^^c4^^8b_tl on line ...
+Defining \c__unicode_lower_^^c4^^8c_tl on line ...
+Defining \c__unicode_upper_^^c4^^8d_tl on line ...
+Defining \c__unicode_lower_^^c4^^8e_tl on line ...
+Defining \c__unicode_upper_^^c4^^8f_tl on line ...
+Defining \c__unicode_lower_^^c4^^90_tl on line ...
+Defining \c__unicode_upper_^^c4^^91_tl on line ...
+Defining \c__unicode_lower_^^c4^^92_tl on line ...
+Defining \c__unicode_upper_^^c4^^93_tl on line ...
+Defining \c__unicode_lower_^^c4^^94_tl on line ...
+Defining \c__unicode_upper_^^c4^^95_tl on line ...
+Defining \c__unicode_lower_^^c4^^96_tl on line ...
+Defining \c__unicode_upper_^^c4^^97_tl on line ...
+Defining \c__unicode_lower_^^c4^^98_tl on line ...
+Defining \c__unicode_upper_^^c4^^99_tl on line ...
+Defining \c__unicode_lower_^^c4^^9a_tl on line ...
+Defining \c__unicode_upper_^^c4^^9b_tl on line ...
+Defining \c__unicode_lower_^^c4^^9c_tl on line ...
+Defining \c__unicode_upper_^^c4^^9d_tl on line ...
+Defining \c__unicode_lower_^^c4^^9e_tl on line ...
+Defining \c__unicode_upper_^^c4^^9f_tl on line ...
+Defining \c__unicode_lower_^^c4^^a0_tl on line ...
+Defining \c__unicode_upper_^^c4^^a1_tl on line ...
+Defining \c__unicode_lower_^^c4^^a2_tl on line ...
+Defining \c__unicode_upper_^^c4^^a3_tl on line ...
+Defining \c__unicode_lower_^^c4^^a4_tl on line ...
+Defining \c__unicode_upper_^^c4^^a5_tl on line ...
+Defining \c__unicode_lower_^^c4^^a8_tl on line ...
+Defining \c__unicode_upper_^^c4^^a9_tl on line ...
+Defining \c__unicode_lower_^^c4^^aa_tl on line ...
+Defining \c__unicode_upper_^^c4^^ab_tl on line ...
+Defining \c__unicode_lower_^^c4^^ac_tl on line ...
+Defining \c__unicode_upper_^^c4^^ad_tl on line ...
+Defining \c__unicode_lower_^^c4^^ae_tl on line ...
+Defining \c__unicode_upper_^^c4^^af_tl on line ...
+Defining \c__unicode_lower_^^c4^^b2_tl on line ...
+Defining \c__unicode_upper_^^c4^^b3_tl on line ...
+Defining \c__unicode_lower_^^c4^^b4_tl on line ...
+Defining \c__unicode_upper_^^c4^^b5_tl on line ...
+Defining \c__unicode_lower_^^c4^^b6_tl on line ...
+Defining \c__unicode_upper_^^c4^^b7_tl on line ...
+Defining \c__unicode_lower_^^c4^^b9_tl on line ...
+Defining \c__unicode_upper_^^c4^^ba_tl on line ...
+Defining \c__unicode_lower_^^c4^^bb_tl on line ...
+Defining \c__unicode_upper_^^c4^^bc_tl on line ...
+Defining \c__unicode_lower_^^c4^^be_tl on line ...
+Defining \c__unicode_upper_^^c4^^bf_tl on line ...
+Defining \c__unicode_lower_^^c5^^81_tl on line ...
+Defining \c__unicode_upper_^^c5^^82_tl on line ...
+Defining \c__unicode_lower_^^c5^^83_tl on line ...
+Defining \c__unicode_upper_^^c5^^84_tl on line ...
+Defining \c__unicode_lower_^^c5^^85_tl on line ...
+Defining \c__unicode_upper_^^c5^^86_tl on line ...
+Defining \c__unicode_lower_^^c5^^87_tl on line ...
+Defining \c__unicode_upper_^^c5^^88_tl on line ...
+Defining \c__unicode_lower_^^c5^^8a_tl on line ...
+Defining \c__unicode_upper_^^c5^^8b_tl on line ...
+Defining \c__unicode_lower_^^c5^^8c_tl on line ...
+Defining \c__unicode_upper_^^c5^^8d_tl on line ...
+Defining \c__unicode_lower_^^c5^^8e_tl on line ...
+Defining \c__unicode_upper_^^c5^^8f_tl on line ...
+Defining \c__unicode_lower_^^c5^^90_tl on line ...
+Defining \c__unicode_upper_^^c5^^91_tl on line ...
+Defining \c__unicode_lower_^^c5^^92_tl on line ...
+Defining \c__unicode_upper_^^c5^^93_tl on line ...
+Defining \c__unicode_lower_^^c5^^94_tl on line ...
+Defining \c__unicode_upper_^^c5^^95_tl on line ...
+Defining \c__unicode_lower_^^c5^^96_tl on line ...
+Defining \c__unicode_upper_^^c5^^97_tl on line ...
+Defining \c__unicode_lower_^^c5^^98_tl on line ...
+Defining \c__unicode_upper_^^c5^^99_tl on line ...
+Defining \c__unicode_lower_^^c5^^9a_tl on line ...
+Defining \c__unicode_upper_^^c5^^9b_tl on line ...
+Defining \c__unicode_lower_^^c5^^9c_tl on line ...
+Defining \c__unicode_upper_^^c5^^9d_tl on line ...
+Defining \c__unicode_lower_^^c5^^9e_tl on line ...
+Defining \c__unicode_upper_^^c5^^9f_tl on line ...
+Defining \c__unicode_lower_^^c5^^a0_tl on line ...
+Defining \c__unicode_upper_^^c5^^a1_tl on line ...
+Defining \c__unicode_lower_^^c5^^a2_tl on line ...
+Defining \c__unicode_upper_^^c5^^a3_tl on line ...
+Defining \c__unicode_lower_^^c5^^a4_tl on line ...
+Defining \c__unicode_upper_^^c5^^a5_tl on line ...
+Defining \c__unicode_lower_^^c5^^a8_tl on line ...
+Defining \c__unicode_upper_^^c5^^a9_tl on line ...
+Defining \c__unicode_lower_^^c5^^aa_tl on line ...
+Defining \c__unicode_upper_^^c5^^ab_tl on line ...
+Defining \c__unicode_lower_^^c5^^ac_tl on line ...
+Defining \c__unicode_upper_^^c5^^ad_tl on line ...
+Defining \c__unicode_lower_^^c5^^ae_tl on line ...
+Defining \c__unicode_upper_^^c5^^af_tl on line ...
+Defining \c__unicode_lower_^^c5^^b0_tl on line ...
+Defining \c__unicode_upper_^^c5^^b1_tl on line ...
+Defining \c__unicode_lower_^^c5^^b2_tl on line ...
+Defining \c__unicode_upper_^^c5^^b3_tl on line ...
+Defining \c__unicode_lower_^^c5^^b4_tl on line ...
+Defining \c__unicode_upper_^^c5^^b5_tl on line ...
+Defining \c__unicode_lower_^^c5^^b6_tl on line ...
+Defining \c__unicode_upper_^^c5^^b7_tl on line ...
+Defining \c__unicode_lower_^^c5^^b8_tl on line ...
+Defining \c__unicode_upper_^^c3^^bf_tl on line ...
+Defining \c__unicode_lower_^^c5^^b9_tl on line ...
+Defining \c__unicode_upper_^^c5^^ba_tl on line ...
+Defining \c__unicode_lower_^^c5^^bb_tl on line ...
+Defining \c__unicode_upper_^^c5^^bc_tl on line ...
+Defining \c__unicode_lower_^^c5^^bd_tl on line ...
+Defining \c__unicode_upper_^^c5^^be_tl on line ...
+Defining \c__unicode_lower_^^c7^^8d_tl on line ...
+Defining \c__unicode_upper_^^c7^^8e_tl on line ...
+Defining \c__unicode_lower_^^c7^^8f_tl on line ...
+Defining \c__unicode_upper_^^c7^^90_tl on line ...
+Defining \c__unicode_lower_^^c7^^91_tl on line ...
+Defining \c__unicode_upper_^^c7^^92_tl on line ...
+Defining \c__unicode_lower_^^c7^^93_tl on line ...
+Defining \c__unicode_upper_^^c7^^94_tl on line ...
+Defining \c__unicode_lower_^^c7^^a2_tl on line ...
+Defining \c__unicode_upper_^^c7^^a3_tl on line ...
+Defining \c__unicode_lower_^^c7^^a6_tl on line ...
+Defining \c__unicode_upper_^^c7^^a7_tl on line ...
+Defining \c__unicode_lower_^^c7^^a8_tl on line ...
+Defining \c__unicode_upper_^^c7^^a9_tl on line ...
+Defining \c__unicode_lower_^^c7^^aa_tl on line ...
+Defining \c__unicode_upper_^^c7^^ab_tl on line ...
+Defining \c__unicode_lower_^^c7^^b4_tl on line ...
+Defining \c__unicode_upper_^^c7^^b5_tl on line ...
+Defining \c__unicode_lower_^^c8^^98_tl on line ...
+Defining \c__unicode_upper_^^c8^^99_tl on line ...
+Defining \c__unicode_lower_^^c8^^9a_tl on line ...
+Defining \c__unicode_upper_^^c8^^9b_tl on line ...
+Defining \c__unicode_upper_^^c3^^9f_tl on line ...
+Defining \c__unicode_title_^^c3^^9f_tl on line ...
+Defining \c__unicode_upper_^^c4^^b1_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 1aac91f..bee8026 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -4317,6 +4317,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4331,7 +4332,14 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nnN on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4344,7 +4352,6 @@ Defining \__tl_change_case_lower_sigma:Nw on line ...
 Defining \__tl_change_case_upper_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_tr:Nnw on line ...
 Defining \__tl_change_case_lower_tr_auxi:Nw on line ...
-Defining \__tl_change_case_lower_tr_auxii:Nw on line ...
 Defining \__tl_change_case_upper_tr:Nnw on line ...
 Defining \__tl_change_case_lower_az:Nnw on line ...
 Defining \__tl_change_case_upper_az:Nnw on line ...
@@ -4358,15 +4365,243 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__unicode_lower_^^c0_tl on line ...
+Defining \c__unicode_upper_^^e0_tl on line ...
+Defining \c__unicode_lower_^^c2_tl on line ...
+Defining \c__unicode_upper_^^e2_tl on line ...
+Defining \c__unicode_lower_^^c3_tl on line ...
+Defining \c__unicode_upper_^^e3_tl on line ...
+Defining \c__unicode_lower_^^c4_tl on line ...
+Defining \c__unicode_upper_^^e4_tl on line ...
+Defining \c__unicode_lower_^^c5_tl on line ...
+Defining \c__unicode_upper_^^e5_tl on line ...
+Defining \c__unicode_lower_^^c6_tl on line ...
+Defining \c__unicode_upper_^^e6_tl on line ...
+Defining \c__unicode_lower_^^c7_tl on line ...
+Defining \c__unicode_upper_^^e7_tl on line ...
+Defining \c__unicode_lower_^^c8_tl on line ...
+Defining \c__unicode_upper_^^e8_tl on line ...
+Defining \c__unicode_lower_^^c9_tl on line ...
+Defining \c__unicode_upper_^^e9_tl on line ...
+Defining \c__unicode_lower_^^ca_tl on line ...
+Defining \c__unicode_upper_^^ea_tl on line ...
+Defining \c__unicode_lower_^^cb_tl on line ...
+Defining \c__unicode_upper_^^eb_tl on line ...
+Defining \c__unicode_lower_^^cc_tl on line ...
+Defining \c__unicode_upper_^^ec_tl on line ...
+Defining \c__unicode_lower_^^cd_tl on line ...
+Defining \c__unicode_upper_^^ed_tl on line ...
+Defining \c__unicode_lower_^^ce_tl on line ...
+Defining \c__unicode_upper_^^ee_tl on line ...
+Defining \c__unicode_lower_^^cf_tl on line ...
+Defining \c__unicode_upper_^^ef_tl on line ...
+Defining \c__unicode_lower_^^d0_tl on line ...
+Defining \c__unicode_upper_^^f0_tl on line ...
+Defining \c__unicode_lower_^^d1_tl on line ...
+Defining \c__unicode_upper_^^f1_tl on line ...
+Defining \c__unicode_lower_^^d2_tl on line ...
+Defining \c__unicode_upper_^^f2_tl on line ...
+Defining \c__unicode_lower_^^d3_tl on line ...
+Defining \c__unicode_upper_^^f3_tl on line ...
+Defining \c__unicode_lower_^^d4_tl on line ...
+Defining \c__unicode_upper_^^f4_tl on line ...
+Defining \c__unicode_lower_^^d5_tl on line ...
+Defining \c__unicode_upper_^^f5_tl on line ...
+Defining \c__unicode_lower_^^d6_tl on line ...
+Defining \c__unicode_upper_^^f6_tl on line ...
+Defining \c__unicode_lower_^^d8_tl on line ...
+Defining \c__unicode_upper_^^f8_tl on line ...
+Defining \c__unicode_lower_^^d9_tl on line ...
+Defining \c__unicode_upper_^^f9_tl on line ...
+Defining \c__unicode_lower_^^da_tl on line ...
+Defining \c__unicode_upper_^^fa_tl on line ...
+Defining \c__unicode_lower_^^db_tl on line ...
+Defining \c__unicode_upper_^^fb_tl on line ...
+Defining \c__unicode_lower_^^dc_tl on line ...
+Defining \c__unicode_upper_^^fc_tl on line ...
+Defining \c__unicode_lower_^^dd_tl on line ...
+Defining \c__unicode_upper_^^fd_tl on line ...
+Defining \c__unicode_lower_^^de_tl on line ...
+Defining \c__unicode_upper_^^fe_tl on line ...
+Defining \c__unicode_lower_Ā_tl on line ...
+Defining \c__unicode_upper_ā_tl on line ...
+Defining \c__unicode_lower_Ă_tl on line ...
+Defining \c__unicode_upper_ă_tl on line ...
+Defining \c__unicode_lower_Ą_tl on line ...
+Defining \c__unicode_upper_ą_tl on line ...
+Defining \c__unicode_lower_Ć_tl on line ...
+Defining \c__unicode_upper_ć_tl on line ...
+Defining \c__unicode_lower_Ĉ_tl on line ...
+Defining \c__unicode_upper_ĉ_tl on line ...
+Defining \c__unicode_lower_Ċ_tl on line ...
+Defining \c__unicode_upper_ċ_tl on line ...
+Defining \c__unicode_lower_Č_tl on line ...
+Defining \c__unicode_upper_č_tl on line ...
+Defining \c__unicode_lower_Ď_tl on line ...
+Defining \c__unicode_upper_ď_tl on line ...
+Defining \c__unicode_lower_Đ_tl on line ...
+Defining \c__unicode_upper_đ_tl on line ...
+Defining \c__unicode_lower_Ē_tl on line ...
+Defining \c__unicode_upper_ē_tl on line ...
+Defining \c__unicode_lower_Ĕ_tl on line ...
+Defining \c__unicode_upper_ĕ_tl on line ...
+Defining \c__unicode_lower_Ė_tl on line ...
+Defining \c__unicode_upper_ė_tl on line ...
+Defining \c__unicode_lower_Ę_tl on line ...
+Defining \c__unicode_upper_ę_tl on line ...
+Defining \c__unicode_lower_Ě_tl on line ...
+Defining \c__unicode_upper_ě_tl on line ...
+Defining \c__unicode_lower_Ĝ_tl on line ...
+Defining \c__unicode_upper_ĝ_tl on line ...
+Defining \c__unicode_lower_Ğ_tl on line ...
+Defining \c__unicode_upper_ğ_tl on line ...
+Defining \c__unicode_lower_Ġ_tl on line ...
+Defining \c__unicode_upper_ġ_tl on line ...
+Defining \c__unicode_lower_Ģ_tl on line ...
+Defining \c__unicode_upper_ģ_tl on line ...
+Defining \c__unicode_lower_Ĥ_tl on line ...
+Defining \c__unicode_upper_ĥ_tl on line ...
+Defining \c__unicode_lower_Ĩ_tl on line ...
+Defining \c__unicode_upper_ĩ_tl on line ...
+Defining \c__unicode_lower_Ī_tl on line ...
+Defining \c__unicode_upper_ī_tl on line ...
+Defining \c__unicode_lower_Ĭ_tl on line ...
+Defining \c__unicode_upper_ĭ_tl on line ...
+Defining \c__unicode_lower_Į_tl on line ...
+Defining \c__unicode_upper_į_tl on line ...
+Defining \c__unicode_lower_IJ_tl on line ...
+Defining \c__unicode_upper_ij_tl on line ...
+Defining \c__unicode_lower_Ĵ_tl on line ...
+Defining \c__unicode_upper_ĵ_tl on line ...
+Defining \c__unicode_lower_Ķ_tl on line ...
+Defining \c__unicode_upper_ķ_tl on line ...
+Defining \c__unicode_lower_Ĺ_tl on line ...
+Defining \c__unicode_upper_ĺ_tl on line ...
+Defining \c__unicode_lower_Ļ_tl on line ...
+Defining \c__unicode_upper_ļ_tl on line ...
+Defining \c__unicode_lower_ľ_tl on line ...
+Defining \c__unicode_upper_Ŀ_tl on line ...
+Defining \c__unicode_lower_Ł_tl on line ...
+Defining \c__unicode_upper_ł_tl on line ...
+Defining \c__unicode_lower_Ń_tl on line ...
+Defining \c__unicode_upper_ń_tl on line ...
+Defining \c__unicode_lower_Ņ_tl on line ...
+Defining \c__unicode_upper_ņ_tl on line ...
+Defining \c__unicode_lower_Ň_tl on line ...
+Defining \c__unicode_upper_ň_tl on line ...
+Defining \c__unicode_lower_Ŋ_tl on line ...
+Defining \c__unicode_upper_ŋ_tl on line ...
+Defining \c__unicode_lower_Ō_tl on line ...
+Defining \c__unicode_upper_ō_tl on line ...
+Defining \c__unicode_lower_Ŏ_tl on line ...
+Defining \c__unicode_upper_ŏ_tl on line ...
+Defining \c__unicode_lower_Ő_tl on line ...
+Defining \c__unicode_upper_ő_tl on line ...
+Defining \c__unicode_lower_Œ_tl on line ...
+Defining \c__unicode_upper_œ_tl on line ...
+Defining \c__unicode_lower_Ŕ_tl on line ...
+Defining \c__unicode_upper_ŕ_tl on line ...
+Defining \c__unicode_lower_Ŗ_tl on line ...
+Defining \c__unicode_upper_ŗ_tl on line ...
+Defining \c__unicode_lower_Ř_tl on line ...
+Defining \c__unicode_upper_ř_tl on line ...
+Defining \c__unicode_lower_Ś_tl on line ...
+Defining \c__unicode_upper_ś_tl on line ...
+Defining \c__unicode_lower_Ŝ_tl on line ...
+Defining \c__unicode_upper_ŝ_tl on line ...
+Defining \c__unicode_lower_Ş_tl on line ...
+Defining \c__unicode_upper_ş_tl on line ...
+Defining \c__unicode_lower_Š_tl on line ...
+Defining \c__unicode_upper_š_tl on line ...
+Defining \c__unicode_lower_Ţ_tl on line ...
+Defining \c__unicode_upper_ţ_tl on line ...
+Defining \c__unicode_lower_Ť_tl on line ...
+Defining \c__unicode_upper_ť_tl on line ...
+Defining \c__unicode_lower_Ũ_tl on line ...
+Defining \c__unicode_upper_ũ_tl on line ...
+Defining \c__unicode_lower_Ū_tl on line ...
+Defining \c__unicode_upper_ū_tl on line ...
+Defining \c__unicode_lower_Ŭ_tl on line ...
+Defining \c__unicode_upper_ŭ_tl on line ...
+Defining \c__unicode_lower_Ů_tl on line ...
+Defining \c__unicode_upper_ů_tl on line ...
+Defining \c__unicode_lower_Ű_tl on line ...
+Defining \c__unicode_upper_ű_tl on line ...
+Defining \c__unicode_lower_Ų_tl on line ...
+Defining \c__unicode_upper_ų_tl on line ...
+Defining \c__unicode_lower_Ŵ_tl on line ...
+Defining \c__unicode_upper_ŵ_tl on line ...
+Defining \c__unicode_lower_Ŷ_tl on line ...
+Defining \c__unicode_upper_ŷ_tl on line ...
+Defining \c__unicode_lower_Ÿ_tl on line ...
+Defining \c__unicode_upper_^^ff_tl on line ...
+Defining \c__unicode_lower_Ź_tl on line ...
+Defining \c__unicode_upper_ź_tl on line ...
+Defining \c__unicode_lower_Ż_tl on line ...
+Defining \c__unicode_upper_ż_tl on line ...
+Defining \c__unicode_lower_Ž_tl on line ...
+Defining \c__unicode_upper_ž_tl on line ...
+Defining \c__unicode_lower_Ǎ_tl on line ...
+Defining \c__unicode_upper_ǎ_tl on line ...
+Defining \c__unicode_lower_Ǐ_tl on line ...
+Defining \c__unicode_upper_ǐ_tl on line ...
+Defining \c__unicode_lower_Ǒ_tl on line ...
+Defining \c__unicode_upper_ǒ_tl on line ...
+Defining \c__unicode_lower_Ǔ_tl on line ...
+Defining \c__unicode_upper_ǔ_tl on line ...
+Defining \c__unicode_lower_Ǣ_tl on line ...
+Defining \c__unicode_upper_ǣ_tl on line ...
+Defining \c__unicode_lower_Ǧ_tl on line ...
+Defining \c__unicode_upper_ǧ_tl on line ...
+Defining \c__unicode_lower_Ǩ_tl on line ...
+Defining \c__unicode_upper_ǩ_tl on line ...
+Defining \c__unicode_lower_Ǫ_tl on line ...
+Defining \c__unicode_upper_ǫ_tl on line ...
+Defining \c__unicode_lower_Ǵ_tl on line ...
+Defining \c__unicode_upper_ǵ_tl on line ...
+Defining \c__unicode_lower_Ș_tl on line ...
+Defining \c__unicode_upper_ș_tl on line ...
+Defining \c__unicode_lower_Ț_tl on line ...
+Defining \c__unicode_upper_ț_tl on line ...
+Defining \c__unicode_upper_^^df_tl on line ...
+Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_upper_ı_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index a28c87f..2d5b2a1 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -4583,6 +4583,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4597,10 +4598,13 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
 Defining \__tl_lookup_title:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4627,15 +4631,42 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 50a2eed..625bf95 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -4586,6 +4586,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4600,10 +4601,13 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
 Defining \__tl_lookup_title:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4630,15 +4634,42 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index af2d711..9d20ac9 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -4318,6 +4318,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4332,7 +4333,14 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nnN on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4345,7 +4353,6 @@ Defining \__tl_change_case_lower_sigma:Nw on line ...
 Defining \__tl_change_case_upper_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_tr:Nnw on line ...
 Defining \__tl_change_case_lower_tr_auxi:Nw on line ...
-Defining \__tl_change_case_lower_tr_auxii:Nw on line ...
 Defining \__tl_change_case_upper_tr:Nnw on line ...
 Defining \__tl_change_case_lower_az:Nnw on line ...
 Defining \__tl_change_case_upper_az:Nnw on line ...
@@ -4359,15 +4366,243 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__unicode_lower_�^^80_tl on line ...
+Defining \c__unicode_upper_�^^a0_tl on line ...
+Defining \c__unicode_lower_�^^82_tl on line ...
+Defining \c__unicode_upper_但_tl on line ...
+Defining \c__unicode_lower_�^^83_tl on line ...
+Defining \c__unicode_upper_達_tl on line ...
+Defining \c__unicode_lower_�^^84_tl on line ...
+Defining \c__unicode_upper_辰_tl on line ...
+Defining \c__unicode_lower_�^^85_tl on line ...
+Defining \c__unicode_upper_奪_tl on line ...
+Defining \c__unicode_lower_�^^86_tl on line ...
+Defining \c__unicode_upper_脱_tl on line ...
+Defining \c__unicode_lower_�^^87_tl on line ...
+Defining \c__unicode_upper_巽_tl on line ...
+Defining \c__unicode_lower_�^^88_tl on line ...
+Defining \c__unicode_upper_竪_tl on line ...
+Defining \c__unicode_lower_�^^89_tl on line ...
+Defining \c__unicode_upper_辿_tl on line ...
+Defining \c__unicode_lower_�^^8a_tl on line ...
+Defining \c__unicode_upper_棚_tl on line ...
+Defining \c__unicode_lower_�^^8b_tl on line ...
+Defining \c__unicode_upper_谷_tl on line ...
+Defining \c__unicode_lower_�^^8c_tl on line ...
+Defining \c__unicode_upper_狸_tl on line ...
+Defining \c__unicode_lower_�^^8d_tl on line ...
+Defining \c__unicode_upper_鱈_tl on line ...
+Defining \c__unicode_lower_�^^8e_tl on line ...
+Defining \c__unicode_upper_樽_tl on line ...
+Defining \c__unicode_lower_�^^8f_tl on line ...
+Defining \c__unicode_upper_誰_tl on line ...
+Defining \c__unicode_lower_�^^90_tl on line ...
+Defining \c__unicode_upper_丹_tl on line ...
+Defining \c__unicode_lower_�^^91_tl on line ...
+Defining \c__unicode_upper_単_tl on line ...
+Defining \c__unicode_lower_�^^92_tl on line ...
+Defining \c__unicode_upper_嘆_tl on line ...
+Defining \c__unicode_lower_�^^93_tl on line ...
+Defining \c__unicode_upper_坦_tl on line ...
+Defining \c__unicode_lower_�^^94_tl on line ...
+Defining \c__unicode_upper_担_tl on line ...
+Defining \c__unicode_lower_�^^95_tl on line ...
+Defining \c__unicode_upper_探_tl on line ...
+Defining \c__unicode_lower_�^^96_tl on line ...
+Defining \c__unicode_upper_旦_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_淡_tl on line ...
+Defining \c__unicode_lower_�^^99_tl on line ...
+Defining \c__unicode_upper_湛_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_炭_tl on line ...
+Defining \c__unicode_lower_�^^9b_tl on line ...
+Defining \c__unicode_upper_短_tl on line ...
+Defining \c__unicode_lower_�^^9c_tl on line ...
+Defining \c__unicode_upper_端_tl on line ...
+Defining \c__unicode_lower_�^^9d_tl on line ...
+Defining \c__unicode_upper_箪_tl on line ...
+Defining \c__unicode_lower_�^^9e_tl on line ...
+Defining \c__unicode_upper_綻_tl on line ...
+Defining \c__unicode_lower_�^^80_tl on line ...
+Defining \c__unicode_upper_�^^81_tl on line ...
+Defining \c__unicode_lower_�^^82_tl on line ...
+Defining \c__unicode_upper_�^^83_tl on line ...
+Defining \c__unicode_lower_�^^84_tl on line ...
+Defining \c__unicode_upper_�^^85_tl on line ...
+Defining \c__unicode_lower_�^^86_tl on line ...
+Defining \c__unicode_upper_�^^87_tl on line ...
+Defining \c__unicode_lower_�^^88_tl on line ...
+Defining \c__unicode_upper_�^^89_tl on line ...
+Defining \c__unicode_lower_�^^8a_tl on line ...
+Defining \c__unicode_upper_�^^8b_tl on line ...
+Defining \c__unicode_lower_�^^8c_tl on line ...
+Defining \c__unicode_upper_�^^8d_tl on line ...
+Defining \c__unicode_lower_�^^8e_tl on line ...
+Defining \c__unicode_upper_�^^8f_tl on line ...
+Defining \c__unicode_lower_�^^90_tl on line ...
+Defining \c__unicode_upper_�^^91_tl on line ...
+Defining \c__unicode_lower_�^^92_tl on line ...
+Defining \c__unicode_upper_�^^93_tl on line ...
+Defining \c__unicode_lower_�^^94_tl on line ...
+Defining \c__unicode_upper_�^^95_tl on line ...
+Defining \c__unicode_lower_�^^96_tl on line ...
+Defining \c__unicode_upper_�^^97_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_�^^99_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_�^^9b_tl on line ...
+Defining \c__unicode_lower_�^^9c_tl on line ...
+Defining \c__unicode_upper_�^^9d_tl on line ...
+Defining \c__unicode_lower_�^^9e_tl on line ...
+Defining \c__unicode_upper_�^^9f_tl on line ...
+Defining \c__unicode_lower_�^^a0_tl on line ...
+Defining \c__unicode_upper_帖_tl on line ...
+Defining \c__unicode_lower_帳_tl on line ...
+Defining \c__unicode_upper_庁_tl on line ...
+Defining \c__unicode_lower_弔_tl on line ...
+Defining \c__unicode_upper_張_tl on line ...
+Defining \c__unicode_lower_懲_tl on line ...
+Defining \c__unicode_upper_挑_tl on line ...
+Defining \c__unicode_lower_暢_tl on line ...
+Defining \c__unicode_upper_朝_tl on line ...
+Defining \c__unicode_lower_潮_tl on line ...
+Defining \c__unicode_upper_牒_tl on line ...
+Defining \c__unicode_lower_町_tl on line ...
+Defining \c__unicode_upper_眺_tl on line ...
+Defining \c__unicode_lower_腸_tl on line ...
+Defining \c__unicode_upper_蝶_tl on line ...
+Defining \c__unicode_lower_調_tl on line ...
+Defining \c__unicode_upper_諜_tl on line ...
+Defining \c__unicode_lower_超_tl on line ...
+Defining \c__unicode_upper_跳_tl on line ...
+Defining \c__unicode_lower_長_tl on line ...
+Defining \c__unicode_upper_頂_tl on line ...
+Defining \c__unicode_lower_鳥_tl on line ...
+Defining \c__unicode_upper_勅_tl on line ...
+Defining \c__unicode_lower_直_tl on line ...
+Defining \c__unicode_upper_朕_tl on line ...
+Defining \c__unicode_lower_�^^81_tl on line ...
+Defining \c__unicode_upper_�^^82_tl on line ...
+Defining \c__unicode_lower_�^^83_tl on line ...
+Defining \c__unicode_upper_�^^84_tl on line ...
+Defining \c__unicode_lower_�^^85_tl on line ...
+Defining \c__unicode_upper_�^^86_tl on line ...
+Defining \c__unicode_lower_�^^87_tl on line ...
+Defining \c__unicode_upper_�^^88_tl on line ...
+Defining \c__unicode_lower_�^^8a_tl on line ...
+Defining \c__unicode_upper_�^^8b_tl on line ...
+Defining \c__unicode_lower_�^^8c_tl on line ...
+Defining \c__unicode_upper_�^^8d_tl on line ...
+Defining \c__unicode_lower_�^^8e_tl on line ...
+Defining \c__unicode_upper_�^^8f_tl on line ...
+Defining \c__unicode_lower_�^^90_tl on line ...
+Defining \c__unicode_upper_�^^91_tl on line ...
+Defining \c__unicode_lower_�^^92_tl on line ...
+Defining \c__unicode_upper_�^^93_tl on line ...
+Defining \c__unicode_lower_�^^94_tl on line ...
+Defining \c__unicode_upper_�^^95_tl on line ...
+Defining \c__unicode_lower_�^^96_tl on line ...
+Defining \c__unicode_upper_�^^97_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_�^^99_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_�^^9b_tl on line ...
+Defining \c__unicode_lower_�^^9c_tl on line ...
+Defining \c__unicode_upper_�^^9d_tl on line ...
+Defining \c__unicode_lower_�^^9e_tl on line ...
+Defining \c__unicode_upper_�^^9f_tl on line ...
+Defining \c__unicode_lower_�^^a0_tl on line ...
+Defining \c__unicode_upper_邸_tl on line ...
+Defining \c__unicode_lower_鄭_tl on line ...
+Defining \c__unicode_upper_釘_tl on line ...
+Defining \c__unicode_lower_鼎_tl on line ...
+Defining \c__unicode_upper_泥_tl on line ...
+Defining \c__unicode_lower_敵_tl on line ...
+Defining \c__unicode_upper_滴_tl on line ...
+Defining \c__unicode_lower_的_tl on line ...
+Defining \c__unicode_upper_笛_tl on line ...
+Defining \c__unicode_lower_適_tl on line ...
+Defining \c__unicode_upper_鏑_tl on line ...
+Defining \c__unicode_lower_溺_tl on line ...
+Defining \c__unicode_upper_哲_tl on line ...
+Defining \c__unicode_lower_徹_tl on line ...
+Defining \c__unicode_upper_撤_tl on line ...
+Defining \c__unicode_lower_轍_tl on line ...
+Defining \c__unicode_upper_迭_tl on line ...
+Defining \c__unicode_lower_鉄_tl on line ...
+Defining \c__unicode_upper_典_tl on line ...
+Defining \c__unicode_lower_填_tl on line ...
+Defining \c__unicode_upper_天_tl on line ...
+Defining \c__unicode_lower_展_tl on line ...
+Defining \c__unicode_upper_耽_tl on line ...
+Defining \c__unicode_lower_店_tl on line ...
+Defining \c__unicode_upper_添_tl on line ...
+Defining \c__unicode_lower_纏_tl on line ...
+Defining \c__unicode_upper_甜_tl on line ...
+Defining \c__unicode_lower_貼_tl on line ...
+Defining \c__unicode_upper_転_tl on line ...
+Defining \c__unicode_lower_�^^8d_tl on line ...
+Defining \c__unicode_upper_�^^8e_tl on line ...
+Defining \c__unicode_lower_�^^8f_tl on line ...
+Defining \c__unicode_upper_�^^90_tl on line ...
+Defining \c__unicode_lower_�^^91_tl on line ...
+Defining \c__unicode_upper_�^^92_tl on line ...
+Defining \c__unicode_lower_�^^93_tl on line ...
+Defining \c__unicode_upper_�^^94_tl on line ...
+Defining \c__unicode_lower_尿_tl on line ...
+Defining \c__unicode_upper_韮_tl on line ...
+Defining \c__unicode_lower_忍_tl on line ...
+Defining \c__unicode_upper_認_tl on line ...
+Defining \c__unicode_lower_濡_tl on line ...
+Defining \c__unicode_upper_禰_tl on line ...
+Defining \c__unicode_lower_祢_tl on line ...
+Defining \c__unicode_upper_寧_tl on line ...
+Defining \c__unicode_lower_粘_tl on line ...
+Defining \c__unicode_upper_乃_tl on line ...
+Defining \c__unicode_lower_�^^98_tl on line ...
+Defining \c__unicode_upper_�^^99_tl on line ...
+Defining \c__unicode_lower_�^^9a_tl on line ...
+Defining \c__unicode_upper_�^^9b_tl on line ...
+Defining \c__unicode_upper_�^^9f_tl on line ...
+Defining \c__unicode_title_�^^9f_tl on line ...
+Defining \c__unicode_upper_脹_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index b6ebd4d..4dcbfb9 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -4318,6 +4318,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4332,7 +4333,14 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nnN on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4345,7 +4353,6 @@ Defining \__tl_change_case_lower_sigma:Nw on line ...
 Defining \__tl_change_case_upper_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_tr:Nnw on line ...
 Defining \__tl_change_case_lower_tr_auxi:Nw on line ...
-Defining \__tl_change_case_lower_tr_auxii:Nw on line ...
 Defining \__tl_change_case_upper_tr:Nnw on line ...
 Defining \__tl_change_case_lower_az:Nnw on line ...
 Defining \__tl_change_case_upper_az:Nnw on line ...
@@ -4359,15 +4366,243 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__unicode_lower_^^c3^^80_tl on line ...
+Defining \c__unicode_upper_^^c3^^a0_tl on line ...
+Defining \c__unicode_lower_^^c3^^82_tl on line ...
+Defining \c__unicode_upper_^^c3^^a2_tl on line ...
+Defining \c__unicode_lower_^^c3^^83_tl on line ...
+Defining \c__unicode_upper_^^c3^^a3_tl on line ...
+Defining \c__unicode_lower_^^c3^^84_tl on line ...
+Defining \c__unicode_upper_^^c3^^a4_tl on line ...
+Defining \c__unicode_lower_^^c3^^85_tl on line ...
+Defining \c__unicode_upper_^^c3^^a5_tl on line ...
+Defining \c__unicode_lower_^^c3^^86_tl on line ...
+Defining \c__unicode_upper_^^c3^^a6_tl on line ...
+Defining \c__unicode_lower_^^c3^^87_tl on line ...
+Defining \c__unicode_upper_^^c3^^a7_tl on line ...
+Defining \c__unicode_lower_^^c3^^88_tl on line ...
+Defining \c__unicode_upper_^^c3^^a8_tl on line ...
+Defining \c__unicode_lower_^^c3^^89_tl on line ...
+Defining \c__unicode_upper_^^c3^^a9_tl on line ...
+Defining \c__unicode_lower_^^c3^^8a_tl on line ...
+Defining \c__unicode_upper_^^c3^^aa_tl on line ...
+Defining \c__unicode_lower_^^c3^^8b_tl on line ...
+Defining \c__unicode_upper_^^c3^^ab_tl on line ...
+Defining \c__unicode_lower_^^c3^^8c_tl on line ...
+Defining \c__unicode_upper_^^c3^^ac_tl on line ...
+Defining \c__unicode_lower_^^c3^^8d_tl on line ...
+Defining \c__unicode_upper_^^c3^^ad_tl on line ...
+Defining \c__unicode_lower_^^c3^^8e_tl on line ...
+Defining \c__unicode_upper_^^c3^^ae_tl on line ...
+Defining \c__unicode_lower_^^c3^^8f_tl on line ...
+Defining \c__unicode_upper_^^c3^^af_tl on line ...
+Defining \c__unicode_lower_^^c3^^90_tl on line ...
+Defining \c__unicode_upper_^^c3^^b0_tl on line ...
+Defining \c__unicode_lower_^^c3^^91_tl on line ...
+Defining \c__unicode_upper_^^c3^^b1_tl on line ...
+Defining \c__unicode_lower_^^c3^^92_tl on line ...
+Defining \c__unicode_upper_^^c3^^b2_tl on line ...
+Defining \c__unicode_lower_^^c3^^93_tl on line ...
+Defining \c__unicode_upper_^^c3^^b3_tl on line ...
+Defining \c__unicode_lower_^^c3^^94_tl on line ...
+Defining \c__unicode_upper_^^c3^^b4_tl on line ...
+Defining \c__unicode_lower_^^c3^^95_tl on line ...
+Defining \c__unicode_upper_^^c3^^b5_tl on line ...
+Defining \c__unicode_lower_^^c3^^96_tl on line ...
+Defining \c__unicode_upper_^^c3^^b6_tl on line ...
+Defining \c__unicode_lower_^^c3^^98_tl on line ...
+Defining \c__unicode_upper_^^c3^^b8_tl on line ...
+Defining \c__unicode_lower_^^c3^^99_tl on line ...
+Defining \c__unicode_upper_^^c3^^b9_tl on line ...
+Defining \c__unicode_lower_^^c3^^9a_tl on line ...
+Defining \c__unicode_upper_^^c3^^ba_tl on line ...
+Defining \c__unicode_lower_^^c3^^9b_tl on line ...
+Defining \c__unicode_upper_^^c3^^bb_tl on line ...
+Defining \c__unicode_lower_^^c3^^9c_tl on line ...
+Defining \c__unicode_upper_^^c3^^bc_tl on line ...
+Defining \c__unicode_lower_^^c3^^9d_tl on line ...
+Defining \c__unicode_upper_^^c3^^bd_tl on line ...
+Defining \c__unicode_lower_^^c3^^9e_tl on line ...
+Defining \c__unicode_upper_^^c3^^be_tl on line ...
+Defining \c__unicode_lower_^^c4^^80_tl on line ...
+Defining \c__unicode_upper_^^c4^^81_tl on line ...
+Defining \c__unicode_lower_^^c4^^82_tl on line ...
+Defining \c__unicode_upper_^^c4^^83_tl on line ...
+Defining \c__unicode_lower_^^c4^^84_tl on line ...
+Defining \c__unicode_upper_^^c4^^85_tl on line ...
+Defining \c__unicode_lower_^^c4^^86_tl on line ...
+Defining \c__unicode_upper_^^c4^^87_tl on line ...
+Defining \c__unicode_lower_^^c4^^88_tl on line ...
+Defining \c__unicode_upper_^^c4^^89_tl on line ...
+Defining \c__unicode_lower_^^c4^^8a_tl on line ...
+Defining \c__unicode_upper_^^c4^^8b_tl on line ...
+Defining \c__unicode_lower_^^c4^^8c_tl on line ...
+Defining \c__unicode_upper_^^c4^^8d_tl on line ...
+Defining \c__unicode_lower_^^c4^^8e_tl on line ...
+Defining \c__unicode_upper_^^c4^^8f_tl on line ...
+Defining \c__unicode_lower_^^c4^^90_tl on line ...
+Defining \c__unicode_upper_^^c4^^91_tl on line ...
+Defining \c__unicode_lower_^^c4^^92_tl on line ...
+Defining \c__unicode_upper_^^c4^^93_tl on line ...
+Defining \c__unicode_lower_^^c4^^94_tl on line ...
+Defining \c__unicode_upper_^^c4^^95_tl on line ...
+Defining \c__unicode_lower_^^c4^^96_tl on line ...
+Defining \c__unicode_upper_^^c4^^97_tl on line ...
+Defining \c__unicode_lower_^^c4^^98_tl on line ...
+Defining \c__unicode_upper_^^c4^^99_tl on line ...
+Defining \c__unicode_lower_^^c4^^9a_tl on line ...
+Defining \c__unicode_upper_^^c4^^9b_tl on line ...
+Defining \c__unicode_lower_^^c4^^9c_tl on line ...
+Defining \c__unicode_upper_^^c4^^9d_tl on line ...
+Defining \c__unicode_lower_^^c4^^9e_tl on line ...
+Defining \c__unicode_upper_^^c4^^9f_tl on line ...
+Defining \c__unicode_lower_^^c4^^a0_tl on line ...
+Defining \c__unicode_upper_^^c4^^a1_tl on line ...
+Defining \c__unicode_lower_^^c4^^a2_tl on line ...
+Defining \c__unicode_upper_^^c4^^a3_tl on line ...
+Defining \c__unicode_lower_^^c4^^a4_tl on line ...
+Defining \c__unicode_upper_^^c4^^a5_tl on line ...
+Defining \c__unicode_lower_^^c4^^a8_tl on line ...
+Defining \c__unicode_upper_^^c4^^a9_tl on line ...
+Defining \c__unicode_lower_^^c4^^aa_tl on line ...
+Defining \c__unicode_upper_^^c4^^ab_tl on line ...
+Defining \c__unicode_lower_^^c4^^ac_tl on line ...
+Defining \c__unicode_upper_^^c4^^ad_tl on line ...
+Defining \c__unicode_lower_^^c4^^ae_tl on line ...
+Defining \c__unicode_upper_^^c4^^af_tl on line ...
+Defining \c__unicode_lower_^^c4^^b2_tl on line ...
+Defining \c__unicode_upper_^^c4^^b3_tl on line ...
+Defining \c__unicode_lower_^^c4^^b4_tl on line ...
+Defining \c__unicode_upper_^^c4^^b5_tl on line ...
+Defining \c__unicode_lower_^^c4^^b6_tl on line ...
+Defining \c__unicode_upper_^^c4^^b7_tl on line ...
+Defining \c__unicode_lower_^^c4^^b9_tl on line ...
+Defining \c__unicode_upper_^^c4^^ba_tl on line ...
+Defining \c__unicode_lower_^^c4^^bb_tl on line ...
+Defining \c__unicode_upper_^^c4^^bc_tl on line ...
+Defining \c__unicode_lower_^^c4^^be_tl on line ...
+Defining \c__unicode_upper_^^c4^^bf_tl on line ...
+Defining \c__unicode_lower_^^c5^^81_tl on line ...
+Defining \c__unicode_upper_^^c5^^82_tl on line ...
+Defining \c__unicode_lower_^^c5^^83_tl on line ...
+Defining \c__unicode_upper_^^c5^^84_tl on line ...
+Defining \c__unicode_lower_^^c5^^85_tl on line ...
+Defining \c__unicode_upper_^^c5^^86_tl on line ...
+Defining \c__unicode_lower_^^c5^^87_tl on line ...
+Defining \c__unicode_upper_^^c5^^88_tl on line ...
+Defining \c__unicode_lower_^^c5^^8a_tl on line ...
+Defining \c__unicode_upper_^^c5^^8b_tl on line ...
+Defining \c__unicode_lower_^^c5^^8c_tl on line ...
+Defining \c__unicode_upper_^^c5^^8d_tl on line ...
+Defining \c__unicode_lower_^^c5^^8e_tl on line ...
+Defining \c__unicode_upper_^^c5^^8f_tl on line ...
+Defining \c__unicode_lower_^^c5^^90_tl on line ...
+Defining \c__unicode_upper_^^c5^^91_tl on line ...
+Defining \c__unicode_lower_^^c5^^92_tl on line ...
+Defining \c__unicode_upper_^^c5^^93_tl on line ...
+Defining \c__unicode_lower_^^c5^^94_tl on line ...
+Defining \c__unicode_upper_^^c5^^95_tl on line ...
+Defining \c__unicode_lower_^^c5^^96_tl on line ...
+Defining \c__unicode_upper_^^c5^^97_tl on line ...
+Defining \c__unicode_lower_^^c5^^98_tl on line ...
+Defining \c__unicode_upper_^^c5^^99_tl on line ...
+Defining \c__unicode_lower_^^c5^^9a_tl on line ...
+Defining \c__unicode_upper_^^c5^^9b_tl on line ...
+Defining \c__unicode_lower_^^c5^^9c_tl on line ...
+Defining \c__unicode_upper_^^c5^^9d_tl on line ...
+Defining \c__unicode_lower_^^c5^^9e_tl on line ...
+Defining \c__unicode_upper_^^c5^^9f_tl on line ...
+Defining \c__unicode_lower_^^c5^^a0_tl on line ...
+Defining \c__unicode_upper_^^c5^^a1_tl on line ...
+Defining \c__unicode_lower_^^c5^^a2_tl on line ...
+Defining \c__unicode_upper_^^c5^^a3_tl on line ...
+Defining \c__unicode_lower_^^c5^^a4_tl on line ...
+Defining \c__unicode_upper_^^c5^^a5_tl on line ...
+Defining \c__unicode_lower_^^c5^^a8_tl on line ...
+Defining \c__unicode_upper_^^c5^^a9_tl on line ...
+Defining \c__unicode_lower_^^c5^^aa_tl on line ...
+Defining \c__unicode_upper_^^c5^^ab_tl on line ...
+Defining \c__unicode_lower_^^c5^^ac_tl on line ...
+Defining \c__unicode_upper_^^c5^^ad_tl on line ...
+Defining \c__unicode_lower_^^c5^^ae_tl on line ...
+Defining \c__unicode_upper_^^c5^^af_tl on line ...
+Defining \c__unicode_lower_^^c5^^b0_tl on line ...
+Defining \c__unicode_upper_^^c5^^b1_tl on line ...
+Defining \c__unicode_lower_^^c5^^b2_tl on line ...
+Defining \c__unicode_upper_^^c5^^b3_tl on line ...
+Defining \c__unicode_lower_^^c5^^b4_tl on line ...
+Defining \c__unicode_upper_^^c5^^b5_tl on line ...
+Defining \c__unicode_lower_^^c5^^b6_tl on line ...
+Defining \c__unicode_upper_^^c5^^b7_tl on line ...
+Defining \c__unicode_lower_^^c5^^b8_tl on line ...
+Defining \c__unicode_upper_^^c3^^bf_tl on line ...
+Defining \c__unicode_lower_^^c5^^b9_tl on line ...
+Defining \c__unicode_upper_^^c5^^ba_tl on line ...
+Defining \c__unicode_lower_^^c5^^bb_tl on line ...
+Defining \c__unicode_upper_^^c5^^bc_tl on line ...
+Defining \c__unicode_lower_^^c5^^bd_tl on line ...
+Defining \c__unicode_upper_^^c5^^be_tl on line ...
+Defining \c__unicode_lower_^^c7^^8d_tl on line ...
+Defining \c__unicode_upper_^^c7^^8e_tl on line ...
+Defining \c__unicode_lower_^^c7^^8f_tl on line ...
+Defining \c__unicode_upper_^^c7^^90_tl on line ...
+Defining \c__unicode_lower_^^c7^^91_tl on line ...
+Defining \c__unicode_upper_^^c7^^92_tl on line ...
+Defining \c__unicode_lower_^^c7^^93_tl on line ...
+Defining \c__unicode_upper_^^c7^^94_tl on line ...
+Defining \c__unicode_lower_^^c7^^a2_tl on line ...
+Defining \c__unicode_upper_^^c7^^a3_tl on line ...
+Defining \c__unicode_lower_^^c7^^a6_tl on line ...
+Defining \c__unicode_upper_^^c7^^a7_tl on line ...
+Defining \c__unicode_lower_^^c7^^a8_tl on line ...
+Defining \c__unicode_upper_^^c7^^a9_tl on line ...
+Defining \c__unicode_lower_^^c7^^aa_tl on line ...
+Defining \c__unicode_upper_^^c7^^ab_tl on line ...
+Defining \c__unicode_lower_^^c7^^b4_tl on line ...
+Defining \c__unicode_upper_^^c7^^b5_tl on line ...
+Defining \c__unicode_lower_^^c8^^98_tl on line ...
+Defining \c__unicode_upper_^^c8^^99_tl on line ...
+Defining \c__unicode_lower_^^c8^^9a_tl on line ...
+Defining \c__unicode_upper_^^c8^^9b_tl on line ...
+Defining \c__unicode_upper_^^c3^^9f_tl on line ...
+Defining \c__unicode_title_^^c3^^9f_tl on line ...
+Defining \c__unicode_upper_^^c4^^b1_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index af2d711..d8d8223 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -4318,6 +4318,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4332,7 +4333,14 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nNNNNN on line ...
+Defining \__tl_change_case_char_UTFiix:nnN on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4345,7 +4353,6 @@ Defining \__tl_change_case_lower_sigma:Nw on line ...
 Defining \__tl_change_case_upper_sigma:Nnw on line ...
 Defining \__tl_change_case_lower_tr:Nnw on line ...
 Defining \__tl_change_case_lower_tr_auxi:Nw on line ...
-Defining \__tl_change_case_lower_tr_auxii:Nw on line ...
 Defining \__tl_change_case_upper_tr:Nnw on line ...
 Defining \__tl_change_case_lower_az:Nnw on line ...
 Defining \__tl_change_case_upper_az:Nnw on line ...
@@ -4359,15 +4366,243 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__unicode_lower_^^c0_tl on line ...
+Defining \c__unicode_upper_^^e0_tl on line ...
+Defining \c__unicode_lower_^^c2_tl on line ...
+Defining \c__unicode_upper_^^e2_tl on line ...
+Defining \c__unicode_lower_^^c3_tl on line ...
+Defining \c__unicode_upper_^^e3_tl on line ...
+Defining \c__unicode_lower_^^c4_tl on line ...
+Defining \c__unicode_upper_^^e4_tl on line ...
+Defining \c__unicode_lower_^^c5_tl on line ...
+Defining \c__unicode_upper_^^e5_tl on line ...
+Defining \c__unicode_lower_^^c6_tl on line ...
+Defining \c__unicode_upper_^^e6_tl on line ...
+Defining \c__unicode_lower_^^c7_tl on line ...
+Defining \c__unicode_upper_^^e7_tl on line ...
+Defining \c__unicode_lower_^^c8_tl on line ...
+Defining \c__unicode_upper_^^e8_tl on line ...
+Defining \c__unicode_lower_^^c9_tl on line ...
+Defining \c__unicode_upper_^^e9_tl on line ...
+Defining \c__unicode_lower_^^ca_tl on line ...
+Defining \c__unicode_upper_^^ea_tl on line ...
+Defining \c__unicode_lower_^^cb_tl on line ...
+Defining \c__unicode_upper_^^eb_tl on line ...
+Defining \c__unicode_lower_^^cc_tl on line ...
+Defining \c__unicode_upper_^^ec_tl on line ...
+Defining \c__unicode_lower_^^cd_tl on line ...
+Defining \c__unicode_upper_^^ed_tl on line ...
+Defining \c__unicode_lower_^^ce_tl on line ...
+Defining \c__unicode_upper_^^ee_tl on line ...
+Defining \c__unicode_lower_^^cf_tl on line ...
+Defining \c__unicode_upper_^^ef_tl on line ...
+Defining \c__unicode_lower_^^d0_tl on line ...
+Defining \c__unicode_upper_^^f0_tl on line ...
+Defining \c__unicode_lower_^^d1_tl on line ...
+Defining \c__unicode_upper_^^f1_tl on line ...
+Defining \c__unicode_lower_^^d2_tl on line ...
+Defining \c__unicode_upper_^^f2_tl on line ...
+Defining \c__unicode_lower_^^d3_tl on line ...
+Defining \c__unicode_upper_^^f3_tl on line ...
+Defining \c__unicode_lower_^^d4_tl on line ...
+Defining \c__unicode_upper_^^f4_tl on line ...
+Defining \c__unicode_lower_^^d5_tl on line ...
+Defining \c__unicode_upper_^^f5_tl on line ...
+Defining \c__unicode_lower_^^d6_tl on line ...
+Defining \c__unicode_upper_^^f6_tl on line ...
+Defining \c__unicode_lower_^^d8_tl on line ...
+Defining \c__unicode_upper_^^f8_tl on line ...
+Defining \c__unicode_lower_^^d9_tl on line ...
+Defining \c__unicode_upper_^^f9_tl on line ...
+Defining \c__unicode_lower_^^da_tl on line ...
+Defining \c__unicode_upper_^^fa_tl on line ...
+Defining \c__unicode_lower_^^db_tl on line ...
+Defining \c__unicode_upper_^^fb_tl on line ...
+Defining \c__unicode_lower_^^dc_tl on line ...
+Defining \c__unicode_upper_^^fc_tl on line ...
+Defining \c__unicode_lower_^^dd_tl on line ...
+Defining \c__unicode_upper_^^fd_tl on line ...
+Defining \c__unicode_lower_^^de_tl on line ...
+Defining \c__unicode_upper_^^fe_tl on line ...
+Defining \c__unicode_lower_Ā_tl on line ...
+Defining \c__unicode_upper_ā_tl on line ...
+Defining \c__unicode_lower_Ă_tl on line ...
+Defining \c__unicode_upper_ă_tl on line ...
+Defining \c__unicode_lower_Ą_tl on line ...
+Defining \c__unicode_upper_ą_tl on line ...
+Defining \c__unicode_lower_Ć_tl on line ...
+Defining \c__unicode_upper_ć_tl on line ...
+Defining \c__unicode_lower_Ĉ_tl on line ...
+Defining \c__unicode_upper_ĉ_tl on line ...
+Defining \c__unicode_lower_Ċ_tl on line ...
+Defining \c__unicode_upper_ċ_tl on line ...
+Defining \c__unicode_lower_Č_tl on line ...
+Defining \c__unicode_upper_č_tl on line ...
+Defining \c__unicode_lower_Ď_tl on line ...
+Defining \c__unicode_upper_ď_tl on line ...
+Defining \c__unicode_lower_Đ_tl on line ...
+Defining \c__unicode_upper_đ_tl on line ...
+Defining \c__unicode_lower_Ē_tl on line ...
+Defining \c__unicode_upper_ē_tl on line ...
+Defining \c__unicode_lower_Ĕ_tl on line ...
+Defining \c__unicode_upper_ĕ_tl on line ...
+Defining \c__unicode_lower_Ė_tl on line ...
+Defining \c__unicode_upper_ė_tl on line ...
+Defining \c__unicode_lower_Ę_tl on line ...
+Defining \c__unicode_upper_ę_tl on line ...
+Defining \c__unicode_lower_Ě_tl on line ...
+Defining \c__unicode_upper_ě_tl on line ...
+Defining \c__unicode_lower_Ĝ_tl on line ...
+Defining \c__unicode_upper_ĝ_tl on line ...
+Defining \c__unicode_lower_Ğ_tl on line ...
+Defining \c__unicode_upper_ğ_tl on line ...
+Defining \c__unicode_lower_Ġ_tl on line ...
+Defining \c__unicode_upper_ġ_tl on line ...
+Defining \c__unicode_lower_Ģ_tl on line ...
+Defining \c__unicode_upper_ģ_tl on line ...
+Defining \c__unicode_lower_Ĥ_tl on line ...
+Defining \c__unicode_upper_ĥ_tl on line ...
+Defining \c__unicode_lower_Ĩ_tl on line ...
+Defining \c__unicode_upper_ĩ_tl on line ...
+Defining \c__unicode_lower_Ī_tl on line ...
+Defining \c__unicode_upper_ī_tl on line ...
+Defining \c__unicode_lower_Ĭ_tl on line ...
+Defining \c__unicode_upper_ĭ_tl on line ...
+Defining \c__unicode_lower_Į_tl on line ...
+Defining \c__unicode_upper_į_tl on line ...
+Defining \c__unicode_lower_IJ_tl on line ...
+Defining \c__unicode_upper_ij_tl on line ...
+Defining \c__unicode_lower_Ĵ_tl on line ...
+Defining \c__unicode_upper_ĵ_tl on line ...
+Defining \c__unicode_lower_Ķ_tl on line ...
+Defining \c__unicode_upper_ķ_tl on line ...
+Defining \c__unicode_lower_Ĺ_tl on line ...
+Defining \c__unicode_upper_ĺ_tl on line ...
+Defining \c__unicode_lower_Ļ_tl on line ...
+Defining \c__unicode_upper_ļ_tl on line ...
+Defining \c__unicode_lower_ľ_tl on line ...
+Defining \c__unicode_upper_Ŀ_tl on line ...
+Defining \c__unicode_lower_Ł_tl on line ...
+Defining \c__unicode_upper_ł_tl on line ...
+Defining \c__unicode_lower_Ń_tl on line ...
+Defining \c__unicode_upper_ń_tl on line ...
+Defining \c__unicode_lower_Ņ_tl on line ...
+Defining \c__unicode_upper_ņ_tl on line ...
+Defining \c__unicode_lower_Ň_tl on line ...
+Defining \c__unicode_upper_ň_tl on line ...
+Defining \c__unicode_lower_Ŋ_tl on line ...
+Defining \c__unicode_upper_ŋ_tl on line ...
+Defining \c__unicode_lower_Ō_tl on line ...
+Defining \c__unicode_upper_ō_tl on line ...
+Defining \c__unicode_lower_Ŏ_tl on line ...
+Defining \c__unicode_upper_ŏ_tl on line ...
+Defining \c__unicode_lower_Ő_tl on line ...
+Defining \c__unicode_upper_ő_tl on line ...
+Defining \c__unicode_lower_Œ_tl on line ...
+Defining \c__unicode_upper_œ_tl on line ...
+Defining \c__unicode_lower_Ŕ_tl on line ...
+Defining \c__unicode_upper_ŕ_tl on line ...
+Defining \c__unicode_lower_Ŗ_tl on line ...
+Defining \c__unicode_upper_ŗ_tl on line ...
+Defining \c__unicode_lower_Ř_tl on line ...
+Defining \c__unicode_upper_ř_tl on line ...
+Defining \c__unicode_lower_Ś_tl on line ...
+Defining \c__unicode_upper_ś_tl on line ...
+Defining \c__unicode_lower_Ŝ_tl on line ...
+Defining \c__unicode_upper_ŝ_tl on line ...
+Defining \c__unicode_lower_Ş_tl on line ...
+Defining \c__unicode_upper_ş_tl on line ...
+Defining \c__unicode_lower_Š_tl on line ...
+Defining \c__unicode_upper_š_tl on line ...
+Defining \c__unicode_lower_Ţ_tl on line ...
+Defining \c__unicode_upper_ţ_tl on line ...
+Defining \c__unicode_lower_Ť_tl on line ...
+Defining \c__unicode_upper_ť_tl on line ...
+Defining \c__unicode_lower_Ũ_tl on line ...
+Defining \c__unicode_upper_ũ_tl on line ...
+Defining \c__unicode_lower_Ū_tl on line ...
+Defining \c__unicode_upper_ū_tl on line ...
+Defining \c__unicode_lower_Ŭ_tl on line ...
+Defining \c__unicode_upper_ŭ_tl on line ...
+Defining \c__unicode_lower_Ů_tl on line ...
+Defining \c__unicode_upper_ů_tl on line ...
+Defining \c__unicode_lower_Ű_tl on line ...
+Defining \c__unicode_upper_ű_tl on line ...
+Defining \c__unicode_lower_Ų_tl on line ...
+Defining \c__unicode_upper_ų_tl on line ...
+Defining \c__unicode_lower_Ŵ_tl on line ...
+Defining \c__unicode_upper_ŵ_tl on line ...
+Defining \c__unicode_lower_Ŷ_tl on line ...
+Defining \c__unicode_upper_ŷ_tl on line ...
+Defining \c__unicode_lower_Ÿ_tl on line ...
+Defining \c__unicode_upper_^^ff_tl on line ...
+Defining \c__unicode_lower_Ź_tl on line ...
+Defining \c__unicode_upper_ź_tl on line ...
+Defining \c__unicode_lower_Ż_tl on line ...
+Defining \c__unicode_upper_ż_tl on line ...
+Defining \c__unicode_lower_Ž_tl on line ...
+Defining \c__unicode_upper_ž_tl on line ...
+Defining \c__unicode_lower_Ǎ_tl on line ...
+Defining \c__unicode_upper_ǎ_tl on line ...
+Defining \c__unicode_lower_Ǐ_tl on line ...
+Defining \c__unicode_upper_ǐ_tl on line ...
+Defining \c__unicode_lower_Ǒ_tl on line ...
+Defining \c__unicode_upper_ǒ_tl on line ...
+Defining \c__unicode_lower_Ǔ_tl on line ...
+Defining \c__unicode_upper_ǔ_tl on line ...
+Defining \c__unicode_lower_Ǣ_tl on line ...
+Defining \c__unicode_upper_ǣ_tl on line ...
+Defining \c__unicode_lower_Ǧ_tl on line ...
+Defining \c__unicode_upper_ǧ_tl on line ...
+Defining \c__unicode_lower_Ǩ_tl on line ...
+Defining \c__unicode_upper_ǩ_tl on line ...
+Defining \c__unicode_lower_Ǫ_tl on line ...
+Defining \c__unicode_upper_ǫ_tl on line ...
+Defining \c__unicode_lower_Ǵ_tl on line ...
+Defining \c__unicode_upper_ǵ_tl on line ...
+Defining \c__unicode_lower_Ș_tl on line ...
+Defining \c__unicode_upper_ș_tl on line ...
+Defining \c__unicode_lower_Ț_tl on line ...
+Defining \c__unicode_upper_ț_tl on line ...
+Defining \c__unicode_upper_^^df_tl on line ...
+Defining \c__unicode_title_^^df_tl on line ...
+Defining \c__unicode_upper_ı_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index b1f4ddf..d24af32 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -4584,6 +4584,7 @@ Defining \__tl_change_case_loop:wnn on line ...
 Defining \__tl_change_case_output:nwn on line ...
 Defining \__tl_change_case_output:Vwn on line ...
 Defining \__tl_change_case_output:own on line ...
+Defining \__tl_change_case_output:vwn on line ...
 Defining \__tl_change_case_output:fwn on line ...
 Defining \__tl_change_case_end:wn on line ...
 Defining \__tl_change_case_group:nwnn on line ...
@@ -4598,10 +4599,13 @@ Defining \__tl_change_case_math_space:wNNnn on line ...
 Defining \__tl_change_case_N_type:Nnnn on line ...
 Defining \__tl_change_case_char:Nnn on line ...
 Defining \__tl_change_case_char:nN on line ...
-Defining \__tl_change_case_char_aux:nN on line ...
+Defining \__tl_change_case_char_auxi:nN on line ...
+Defining \__tl_change_case_char_auxii:nN on line ...
 Defining \__tl_lookup_lower:N on line ...
 Defining \__tl_lookup_upper:N on line ...
 Defining \__tl_lookup_title:N on line ...
+Defining \__tl_change_case_cs_letterlike:Nn on line ...
+Defining \__tl_change_case_cs_accents:NN on line ...
 Defining \__tl_change_case_cs:N on line ...
 Defining \__tl_change_case_cs:NN on line ...
 Defining \__tl_change_case_cs:NNn on line ...
@@ -4628,15 +4632,42 @@ Defining \__tl_change_case_upper_lt:nnw on line ...
 Defining \__tl_change_case_upper_lt:Nw on line ...
 Defining \__tl_change_case_upper_lt:NNw on line ...
 Defining \__tl_change_case_upper_de-alt:Nnw on line ...
+Defining \__unicode_codepoint_to_UTFiix:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxi:n on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxii:Nnn on line ...
+Defining \__unicode_codepoint_to_UTFiix_auxiii:n on line ...
 Defining \c__unicode_std_sigma_tl on line ...
 Defining \c__unicode_final_sigma_tl on line ...
 Defining \c__unicode_accents_lt_tl on line ...
 Defining \c__unicode_dot_above_tl on line ...
+Defining \c__unicode_upper_Eszett_tl on line ...
 Defining \c__unicode_dotless_i_tl on line ...
 Defining \c__unicode_dotted_I_tl on line ...
 Defining \c__unicode_i_ogonek_tl on line ...
 Defining \c__unicode_I_ogonek_tl on line ...
-Defining \c__unicode_upper_Eszett_tl on line ...
+Defining \c__tl_change_case_lower_\AA_tl on line ...
+Defining \c__tl_change_case_upper_\aa_tl on line ...
+Defining \c__tl_change_case_lower_\AE_tl on line ...
+Defining \c__tl_change_case_upper_\ae_tl on line ...
+Defining \c__tl_change_case_lower_\DH_tl on line ...
+Defining \c__tl_change_case_upper_\dh_tl on line ...
+Defining \c__tl_change_case_lower_\DJ_tl on line ...
+Defining \c__tl_change_case_upper_\dj_tl on line ...
+Defining \c__tl_change_case_lower_\L_tl on line ...
+Defining \c__tl_change_case_upper_\l_tl on line ...
+Defining \c__tl_change_case_lower_\NG_tl on line ...
+Defining \c__tl_change_case_upper_\ng_tl on line ...
+Defining \c__tl_change_case_lower_\O_tl on line ...
+Defining \c__tl_change_case_upper_\o_tl on line ...
+Defining \c__tl_change_case_lower_\OE_tl on line ...
+Defining \c__tl_change_case_upper_\oe_tl on line ...
+Defining \c__tl_change_case_lower_\SS_tl on line ...
+Defining \c__tl_change_case_upper_\ss_tl on line ...
+Defining \c__tl_change_case_lower_\TH_tl on line ...
+Defining \c__tl_change_case_upper_\th_tl on line ...
+Defining \c__tl_change_case_upper_\i_tl on line ...
+Defining \c__tl_change_case_upper_\j_tl on line ...
+Defining \l_tl_case_change_accents_tl on line ...
 Defining \__tl_mixed_case:nn on line ...
 Defining \__tl_mixed_case_aux:nn on line ...
 Defining \__tl_mixed_case_loop:wn on line ...
diff --git a/l3kernel/testfiles/m3tl013.luatex.tlg b/l3kernel/testfiles/m3tl013.luatex.tlg
index 316167d..81125e3 100644
--- a/l3kernel/testfiles/m3tl013.luatex.tlg
+++ b/l3kernel/testfiles/m3tl013.luatex.tlg
@@ -186,3 +186,17 @@ hello
 FUSSBALL
 ὈΔΥΣΣΕΎΣ
 ============================================================
+============================================================
+TEST 17: Letter-like commands
+============================================================
+\aa \aa \J \ae \dh \ss \l \o 
+\AA \AA \J \AE \DH \SS \L \O 
+\AA \AA \J \AE \DH \SS \L \O 
+============================================================
+============================================================
+TEST 18: Accents
+============================================================
+\"{a}\u {e}\H {i}\v {o}\.{u}
+\"{A}\u {E}\H {I}\v {O}\.{U}
+\"{A}\u {e}\H {i}\v {o}\.{u}
+============================================================
diff --git a/l3kernel/testfiles/m3tl013.lvt b/l3kernel/testfiles/m3tl013.lvt
index 1df7744..e53a4cc 100644
--- a/l3kernel/testfiles/m3tl013.lvt
+++ b/l3kernel/testfiles/m3tl013.lvt
@@ -198,4 +198,15 @@
     \NEWLINE
    \tl_upper_case:n { \tl_lower_case:n {  ὈΔΥΣΣΕΎΣ } }
   }
+
+\TESTEXP { Letter-like~commands }
+  {
+    \test:n { \AA \aa \J \ae \dh \ss \l \O }
+  }
+
+\TESTEXP { Accents }
+  {
+    \test:n { \"{a} \u{e} \H{i} \v{o} \.{u} }
+  }
+
 \END
diff --git a/l3kernel/testfiles/m3tl013.tlg b/l3kernel/testfiles/m3tl013.tlg
index 5bccb80..c121940 100644
--- a/l3kernel/testfiles/m3tl013.tlg
+++ b/l3kernel/testfiles/m3tl013.tlg
@@ -64,14 +64,14 @@ No problems
 TEST 6: Unicode case changing
 ============================================================
 ^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
-^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
-^^c3^^a5^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
+^^c3^^85^^c3^^89^^c3^^8e^^c3^^98^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
+^^c3^^85^^c3^^a9^^c3^^ae^^c3^^b8^^e1^^bd^^ad^^d0^^b4^^ce^^b1^^c6^^90
 ============================================================
 ============================================================
 TEST 7: Unicode case changing exceptions
 ============================================================
 fu^^c3^^9fball
-FU^^c3^^9fBALL
+FUSSBALL
 Fu^^c3^^9fball
 ============================================================
 ============================================================
@@ -87,24 +87,24 @@ TEST 8: The final sigma rule
 ============================================================
 TEST 9: Turkish/Azeri
 ============================================================
-ragIp hul^^c3^^9bs^^c4^^b0 ^^c3^^96zdem
-ragip hul^^c3^^9bs^^c4^^b0 ^^c3^^96zdem
-RAG^^c4^^b1P HUL^^c3^^bbSi ^^c3^^96ZDEM
-RAG^^c4^^b1P HUL^^c3^^bbSI ^^c3^^96ZDEM
-Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^96zdem
-Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^96zdem
-^^c4^^b1p hul^^c3^^bbsi ^^c3^^96zdem
-^^c4^^b1p hul^^c3^^bbsi ^^c3^^96zdem
+rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
+ragip hul^^c3^^bbs^^c4^^b0 ^^c3^^b6zdem
+RAGIP HUL^^c3^^9bS^^c4^^b0 ^^c3^^96ZDEM
+RAGIP HUL^^c3^^9bSI ^^c3^^96ZDEM
+Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
+Rag^^c4^^b1p hul^^c3^^bbsi ^^c3^^b6zdem
+Ip hul^^c3^^bbsi ^^c3^^b6zdem
+Ip hul^^c3^^bbsi ^^c3^^b6zdem
 ============================================================
 ============================================================
 TEST 10: Lithuanian
 ============================================================
-^^c3^^8c^^c3^^8d^^c4^^a8i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^ae^^cc^^80^^c4^^ae^^cc^^81^^c4^^ae^^cc^^83
-^^c3^^8c^^c3^^8d^^c4^^a8i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^ae^^cc^^80^^c4^^ae^^cc^^81^^c4^^ae^^cc^^83
-I^^cc^^87^^cc^^80I^^cc^^87^^cc^^80I^^cc^^87^^cc^^83I^^cc^^87^^cc^^80I^^cc^^87^^cc^^81I^^cc^^87^^cc^^83J^^cc^^87^^cc^^80J^^cc^^87^^cc^^81J^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83
-I^^cc^^87^^cc^^80I^^cc^^87^^cc^^80I^^cc^^87^^cc^^83I^^cc^^87^^cc^^80I^^cc^^87^^cc^^81I^^cc^^87^^cc^^83J^^cc^^87^^cc^^80J^^cc^^87^^cc^^81J^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83
-I^^cc^^87^^cc^^80i^^cc^^87^^cc^^80i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83^^c3^^8c^^c3^^8d^^c4^^a8i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^ae^^cc^^80^^c4^^ae^^cc^^81^^c4^^ae^^cc^^83
-I^^cc^^87^^cc^^80i^^cc^^87^^cc^^80i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83^^c3^^8c^^c3^^8d^^c4^^a8i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^ae^^cc^^80^^c4^^ae^^cc^^81^^c4^^ae^^cc^^83
+^^c3^^ac^^c3^^ad^^c4^^a9i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^af^^cc^^80^^c4^^af^^cc^^81^^c4^^af^^cc^^83
+^^c3^^ac^^c3^^ad^^c4^^a9i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^af^^cc^^80^^c4^^af^^cc^^81^^c4^^af^^cc^^83
+I^^cc^^87^^cc^^80I^^cc^^87^^cc^^80I^^cc^^87^^cc^^83I^^cc^^87^^cc^^80I^^cc^^87^^cc^^81I^^cc^^87^^cc^^83J^^cc^^87^^cc^^80J^^cc^^87^^cc^^81J^^cc^^87^^cc^^83^^c4^^ae^^cc^^87^^cc^^80^^c4^^ae^^cc^^87^^cc^^81^^c4^^ae^^cc^^87^^cc^^83
+I^^cc^^87^^cc^^80I^^cc^^87^^cc^^80I^^cc^^87^^cc^^83I^^cc^^87^^cc^^80I^^cc^^87^^cc^^81I^^cc^^87^^cc^^83J^^cc^^87^^cc^^80J^^cc^^87^^cc^^81J^^cc^^87^^cc^^83^^c4^^ae^^cc^^87^^cc^^80^^c4^^ae^^cc^^87^^cc^^81^^c4^^ae^^cc^^87^^cc^^83
+I^^cc^^87^^cc^^80i^^cc^^87^^cc^^80i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83^^c3^^ac^^c3^^ad^^c4^^a9i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^af^^cc^^80^^c4^^af^^cc^^81^^c4^^af^^cc^^83
+I^^cc^^87^^cc^^80i^^cc^^87^^cc^^80i^^cc^^87^^cc^^83i^^cc^^87^^cc^^80i^^cc^^87^^cc^^81i^^cc^^87^^cc^^83j^^cc^^87^^cc^^80j^^cc^^87^^cc^^81j^^cc^^87^^cc^^83^^c4^^af^^cc^^87^^cc^^80^^c4^^af^^cc^^87^^cc^^81^^c4^^af^^cc^^87^^cc^^83^^c3^^ac^^c3^^ad^^c4^^a9i^^cc^^80i^^cc^^81i^^cc^^83j^^cc^^80j^^cc^^81j^^cc^^83^^c4^^af^^cc^^80^^c4^^af^^cc^^81^^c4^^af^^cc^^83
 ============================================================
 ============================================================
 TEST 11: Dutch
@@ -125,7 +125,7 @@ Im
 ============================================================
 TEST 12: Mixed case exceptions
 ============================================================
-^^c3^^9foo
+SSoo
 ^^c7^^85!
 ============================================================
 ============================================================
@@ -178,6 +178,20 @@ TEST 16: Nesting
 ============================================================
 HELLO
 hello
-FU^^c3^^9fBALL
+FUSSBALL
 ^^e1^^bd^^88^^ce^^94^^ce^^a5^^ce^^a3^^ce^^a3^^ce^^95^^ce^^8e^^ce^^a3
 ============================================================
+============================================================
+TEST 17: Letter-like commands
+============================================================
+\aa \aa \J \ae \dh \ss \l \o 
+\AA \AA \J \AE \DH \SS \L \O 
+\AA \AA \J \AE \DH \SS \L \O 
+============================================================
+============================================================
+TEST 18: Accents
+============================================================
+\"{a}\u {e}\H {i}\v {o}\.{u}
+\"{A}\u {E}\H {I}\v {O}\.{U}
+\"{A}\u {e}\H {i}\v {o}\.{u}
+============================================================
diff --git a/l3kernel/testfiles/m3tl013.uptex.tlg b/l3kernel/testfiles/m3tl013.uptex.tlg
index 0f4839d..c794ef0 100644
--- a/l3kernel/testfiles/m3tl013.uptex.tlg
+++ b/l3kernel/testfiles/m3tl013.uptex.tlg
@@ -64,14 +64,14 @@ No problems
 TEST 6: Unicode case changing
 ============================================================
 ^^e5^^e9^^ee^^f8ὭдαƐ
-^^e5^^e9^^ee^^f8ὭдαƐ
-^^e5^^e9^^ee^^f8ὭдαƐ
+^^c5^^c9^^ce^^d8ὭдαƐ
+^^c5^^e9^^ee^^f8ὭдαƐ
 ============================================================
 ============================================================
 TEST 7: Unicode case changing exceptions
 ============================================================
 fu^^dfball
-FU^^dfBALL
+FUSSBALL
 Fu^^dfball
 ============================================================
 ============================================================
@@ -90,24 +90,24 @@ TEST 8: The final sigma rule
 ============================================================
 TEST 9: Turkish/Azeri
 ============================================================
-ragIp hul^^dbsİ ^^d6zdem
-ragip hul^^dbsİ ^^d6zdem
-RAGıP HUL^^fbSi ^^d6ZDEM
-RAGıP HUL^^fbSI ^^d6ZDEM
-Ragıp hul^^fbsi ^^d6zdem
-Ragıp hul^^fbsi ^^d6zdem
-ıp hul^^fbsi ^^d6zdem
-ıp hul^^fbsi ^^d6zdem
+ragıp hul^^fbsi ^^f6zdem
+ragip hul^^fbsİ ^^f6zdem
+RAGIP HUL^^dbSİ ^^d6ZDEM
+RAGIP HUL^^dbSI ^^d6ZDEM
+Ragıp hul^^fbsi ^^f6zdem
+Ragıp hul^^fbsi ^^f6zdem
+Ip hul^^fbsi ^^f6zdem
+Ip hul^^fbsi ^^f6zdem
 ============================================================
 ============================================================
 TEST 10: Lithuanian
 ============================================================
-^^cc^^cdĨìíĩj̀j́j̃Į̀Į́Į̃
-^^cc^^cdĨìíĩj̀j́j̃Į̀Į́Į̃
-İ̀İ̀İ̃İ̀İ́İ̃J̇̀J̇́J̇̃į̇̀į̇́į̇̃
-İ̀İ̀İ̃İ̀İ́İ̃J̇̀J̇́J̇̃į̇̀į̇́į̇̃
-İ̀i̇̀i̇̃i̇̀i̇́i̇̃j̇̀j̇́j̇̃į̇̀į̇́į̇̃^^cc^^cdĨìíĩj̀j́j̃Į̀Į́Į̃
-İ̀i̇̀i̇̃i̇̀i̇́i̇̃j̇̀j̇́j̇̃į̇̀į̇́į̇̃^^cc^^cdĨìíĩj̀j́j̃Į̀Į́Į̃
+^^ec^^edĩìíĩj̀j́j̃į̀į́į̃
+^^ec^^edĩìíĩj̀j́j̃į̀į́į̃
+İ̀İ̀İ̃İ̀İ́İ̃J̇̀J̇́J̇̃Į̇̀Į̇́Į̇̃
+İ̀İ̀İ̃İ̀İ́İ̃J̇̀J̇́J̇̃Į̇̀Į̇́Į̇̃
+İ̀i̇̀i̇̃i̇̀i̇́i̇̃j̇̀j̇́j̇̃į̇̀į̇́į̇̃^^ec^^edĩìíĩj̀j́j̃į̀į́į̃
+İ̀i̇̀i̇̃i̇̀i̇́i̇̃j̇̀j̇́j̇̃į̇̀į̇́į̇̃^^ec^^edĩìíĩj̀j́j̃į̀į́į̃
 ============================================================
 ============================================================
 TEST 11: Dutch
@@ -128,7 +128,7 @@ Im
 ============================================================
 TEST 12: Mixed case exceptions
 ============================================================
-^^dfoo
+SSoo
 Dž!
 ============================================================
 ============================================================
@@ -181,6 +181,20 @@ TEST 16: Nesting
 ============================================================
 HELLO
 hello
-FU^^dfBALL
+FUSSBALL
 ὈΔΥΣΣΕΎΣ
 ============================================================
+============================================================
+TEST 17: Letter-like commands
+============================================================
+\aa \aa \J \ae \dh \ss \l \o 
+\AA \AA \J \AE \DH \SS \L \O 
+\AA \AA \J \AE \DH \SS \L \O 
+============================================================
+============================================================
+TEST 18: Accents
+============================================================
+\"{a}\u {e}\H {i}\v {o}\.{u}
+\"{A}\u {E}\H {I}\v {O}\.{U}
+\"{A}\u {e}\H {i}\v {o}\.{u}
+============================================================
diff --git a/l3kernel/testfiles/m3tl013.xetex.tlg b/l3kernel/testfiles/m3tl013.xetex.tlg
index 6b7bbfc..0830b84 100644
--- a/l3kernel/testfiles/m3tl013.xetex.tlg
+++ b/l3kernel/testfiles/m3tl013.xetex.tlg
@@ -181,3 +181,17 @@ hello
 FUSSBALL
 ὈΔΥΣΣΕΎΣ
 ============================================================
+============================================================
+TEST 17: Letter-like commands
+============================================================
+\aa \aa \J \ae \dh \ss \l \o 
+\AA \AA \J \AE \DH \SS \L \O 
+\AA \AA \J \AE \DH \SS \L \O 
+============================================================
+============================================================
+TEST 18: Accents
+============================================================
+\"{a}\u {e}\H {i}\v {o}\.{u}
+\"{A}\u {E}\H {I}\v {O}\.{U}
+\"{A}\u {e}\H {i}\v {o}\.{u}
+============================================================

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the latex3-commits mailing list