diff --git a/Makefile b/Makefile
index 1f1de8d23..6247b294d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,4 @@
 # vim:ts=3
-#BASEDIR = ~/lfs-book
-#SYSDDIR = ~/lfs-systemd
-#DUMPDIR = ~/lfs-commands
 RENDERTMP = $(HOME)/tmp
 CHUNK_QUIET = 1
 ROOT_ID =
@@ -24,15 +21,15 @@ ifneq ($(REV), sysv)
 endif
 
 ifeq ($(REV), sysv)
-  BASEDIR         ?= ~/public_html/lfs-book
+  BASEDIR         ?= $(HOME)/public_html/lfs-book
   PDF_OUTPUT      ?= LFS-BOOK.pdf
   NOCHUNKS_OUTPUT ?= LFS-BOOK.html
-  DUMPDIR         ?= ~/lfs-commands
+  DUMPDIR         ?= $(HOME)/lfs-commands
 else
-  BASEDIR         ?= ~/public_html/lfs-systemd
+  BASEDIR         ?= $(HOME)/public_html/lfs-systemd
   PDF_OUTPUT      ?= LFS-SYSD-BOOK.pdf
   NOCHUNKS_OUTPUT ?= LFS-SYSD-BOOK.html
-  DUMPDIR         ?= ~/lfs-sysd-commands
+  DUMPDIR         ?= $(HOME)/lfs-sysd-commands
 endif
 
 book: validate profile-html
@@ -47,7 +44,8 @@ book: validate profile-html
 	@echo "Copying CSS code and images..."
 	$(Q)mkdir -p $(BASEDIR)/stylesheets
 	$(Q)cp stylesheets/lfs-xsl/*.css $(BASEDIR)/stylesheets
-	$(Q)sed -i 's|../stylesheet|stylesheet|' $(BASEDIR)/index.html
+	$(Q)sed -e 's|../stylesheet|stylesheet|' \
+           -i $(BASEDIR)/index.html
 
 	$(Q)mkdir -p $(BASEDIR)/images
 	$(Q)cp images/*.png $(BASEDIR)/images
@@ -55,11 +53,10 @@ book: validate profile-html
 	@echo "Running Tidy and obfuscate.sh..."
 	$(Q)for filename in `find $(BASEDIR) -name "*.html"`; do \
          tidy -config tidy.conf $$filename;           \
-         true;                                        \
          /bin/bash obfuscate.sh $$filename;           \
-         sed -e "s@text/html@application/xhtml+xml@g" \
+         sed -e "s|text/html|application/xhtml+xml|g" \
              -i $$filename;                           \
-   done;
+       done
 
 	$(Q)$(MAKE) --no-print-directory wget-list md5sums
 
@@ -98,16 +95,16 @@ nochunks: validate profile-html
                 --output $(BASEDIR)/$(NOCHUNKS_OUTPUT) \
                 stylesheets/lfs-nochunks.xsl           \
                 $(RENDERTMP)/lfs-html.xml
-#                $(RENDERTMP)/lfs-html2.xml
 
 	@echo "Running Tidy..."
-	$(Q)tidy -config tidy.conf $(BASEDIR)/$(NOCHUNKS_OUTPUT) || true
+	$(Q)tidy -config tidy.conf $(BASEDIR)/$(NOCHUNKS_OUTPUT) || test $$? -le 1
 
 	@echo "Running obfuscate.sh..."
-	$(Q)bash obfuscate.sh                                $(BASEDIR)/$(NOCHUNKS_OUTPUT)
-	$(Q)sed -i -e "s@text/html@application/xhtml+xml@g"  $(BASEDIR)/$(NOCHUNKS_OUTPUT)
-	$(Q)sed -i -e "s@../wget-list@wget-list@"            $(BASEDIR)/$(NOCHUNKS_OUTPUT)
-	$(Q)sed -i -e "s@../md5sums@md5sums@"                $(BASEDIR)/$(NOCHUNKS_OUTPUT)
+	$(Q)bash obfuscate.sh      $(BASEDIR)/$(NOCHUNKS_OUTPUT)
+	$(Q)sed -e "s|text/html|application/xhtml+xml|g" \
+           -e "s|../wget-list|wget-list|"           \
+           -e "s|../md5sums|md5sums|"               \
+           -i $(BASEDIR)/$(NOCHUNKS_OUTPUT)
 
 	@echo "Output at $(BASEDIR)/$(NOCHUNKS_OUTPUT)"
 
@@ -126,16 +123,16 @@ validate: tmpdir version
 	@echo "Adjusting for revision $(REV)..."
 	$(Q)xsltproc --nonet                               \
                 --xinclude                            \
-                --output $(RENDERTMP)/lfs-html2.xml   \
                 --stringparam profile.revision $(REV) \
+                --output $(RENDERTMP)/lfs-html2.xml   \
                 stylesheets/lfs-xsl/profile.xsl       \
                 index.xml
 
 	@echo "Validating the book..."
-	$(Q)xmllint --nonet                      \
-               --noent                      \
-               --postvalid                  \
-               -o $(RENDERTMP)/lfs-full.xml \
+	$(Q)xmllint --nonet                            \
+               --encode UTF-8                     \
+               --postvalid                        \
+               --output $(RENDERTMP)/lfs-full.xml \
                $(RENDERTMP)/lfs-html2.xml
 
 	$(Q)rm -f appendices/*.script
@@ -157,18 +154,21 @@ wget-list: $(BASEDIR)/wget-list $(BASEDIR)/wget-list-$(REV)
 $(BASEDIR)/wget-list: stylesheets/wget-list.xsl $(DOWNLOADS_DEP)
 	@echo "Generating consolidated wget list at $(BASEDIR)/wget-list ..."
 	$(Q)mkdir -p $(BASEDIR)
-	$(Q)xsltproc --xinclude --nonet            \
+	$(Q)xsltproc --nonet                       \
+                --xinclude                    \
                 --output $(BASEDIR)/wget-list \
                 stylesheets/wget-list.xsl     \
                 chapter03/chapter03.xml
 
 $(BASEDIR)/wget-list-$(REV): stylesheets/wget-list.xsl $(DOWNLOADS_DEP)
-	$(Q)xsltproc --nonet --xinclude                   \
+	$(Q)xsltproc --nonet                               \
+                --xinclude                            \
                 --stringparam profile.revision $(REV) \
                 --output $(RENDERTMP)/wget-list.xml   \
                 stylesheets/lfs-xsl/profile.xsl       \
                 chapter03/chapter03.xml
-	$(Q)xsltproc --xinclude --nonet                  \
+
+	$(Q)xsltproc --nonet                              \
                 --output $(BASEDIR)/wget-list-$(REV) \
                 stylesheets/wget-list.xsl            \
                 $(RENDERTMP)/wget-list.xml
@@ -178,13 +178,14 @@ $(BASEDIR)/md5sums: stylesheets/wget-list.xsl $(DOWNLOADS_DEP)
 	@echo "Generating consolidated md5sum file at $(BASEDIR)/md5sums ..."
 	$(Q)mkdir -p $(BASEDIR)
 
-	$(Q)xsltproc --nonet --xinclude                   \
+	$(Q)xsltproc --nonet                               \
+                --xinclude                            \
                 --stringparam profile.revision $(REV) \
                 --output $(RENDERTMP)/md5sum.xml      \
                 stylesheets/lfs-xsl/profile.xsl       \
                 chapter03/chapter03.xml
 
-	$(Q)xsltproc --xinclude --nonet         \
+	$(Q)xsltproc --nonet                     \
                 --output $(BASEDIR)/md5sums \
                 stylesheets/md5sum.xsl      \
                 $(RENDERTMP)/md5sum.xml
diff --git a/appendices/dependencies.xml b/appendices/dependencies.xml
index 1493d84f9..9d92de448 100644
--- a/appendices/dependencies.xml
+++ b/appendices/dependencies.xml
@@ -1047,7 +1047,15 @@
       <segmentedlist id="gettext-optdeps">
         <segtitle>&external;</segtitle>
         <seglistitem>
-          <seg>None</seg>
+          <seg>
+            <ulink url='&blfs-book;general/libunistring.html'>
+              libunistring
+            </ulink>
+            and
+            <ulink url='&blfs-book;general/libxml2.html'>
+              libxml2
+            </ulink>
+          </seg>
         </seglistitem>
       </segmentedlist>
 
@@ -1566,7 +1574,9 @@
       <segmentedlist id="kbd-optdeps">
         <segtitle>&external;</segtitle>
         <seglistitem>
-          <seg>None</seg>
+          <seg>
+            <ulink url="&blfs-book;postlfs/linux-pam.html">Linux-PAM</ulink>
+          </seg>
         </seglistitem>
       </segmentedlist>
 
@@ -2470,7 +2480,7 @@
       <segmentedlist id="perl-testdeps">
         <segtitle>&testsuites;</segtitle>
         <seglistitem>
-          <seg>Iana-Etc, Less. and Procps-ng</seg>
+          <seg>Iana-Etc, Less, and Procps-ng</seg>
         </seglistitem>
       </segmentedlist>
 
diff --git a/chapter01/changelog.xml b/chapter01/changelog.xml
index aba69a0de..72ef95ea8 100644
--- a/chapter01/changelog.xml
+++ b/chapter01/changelog.xml
@@ -40,6 +40,124 @@
     appropriate for the entry or if needed the entire day's listitem.
     -->
 
+    <listitem>
+      <para>2024-02-14</para>
+      <itemizedlist>
+        <listitem>
+          <para>[bdubbs] - Update to meson-1.3.2.  Fixes
+          <ulink url='&lfs-ticket-root;5442'>#5442</ulink>.</para>
+        </listitem>
+      </itemizedlist>
+    </listitem>
+
+    <listitem>
+      <para>2024-02-12</para>
+      <itemizedlist>
+        <listitem>
+          <para>[bdubbs] - Update to shadow-4.14.5.  Fixes
+          <ulink url='&lfs-ticket-root;5437'>#5437</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to setuptools-69.1.0 (Python module).  Fixes
+          <ulink url='&lfs-ticket-root;5439'>#5439</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to python-3.12.2.  Fixes
+          <ulink url='&lfs-ticket-root;5434'>#5434</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to pkgconf-2.1.1.  Fixes
+          <ulink url='&lfs-ticket-root;5432'>#5432</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to MarkupSafe-2.1.5 (Python module).  Fixes
+          <ulink url='&lfs-ticket-root;5431'>#5431</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to man-pages-6.06.  Fixes
+          <ulink url='&lfs-ticket-root;5438'>#5438</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to expat-2.6.0.  Fixes
+          <ulink url='&lfs-ticket-root;5435'>#5435</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to linux-6.7.4.  Fixes
+          <ulink url='&lfs-ticket-root;5433'>#5433</ulink>.</para>
+        </listitem>
+      </itemizedlist>
+    </listitem>
+
+    <listitem revision='systemd'>
+      <para>2024-02-10</para>
+      <itemizedlist>
+        <listitem>
+          <para>[xry111] - Fix a bug in systemd breaking running
+          systemd-analyze on an instantiated systemd unit.</para>
+        </listitem>
+      </itemizedlist>
+    </listitem>
+
+    <listitem>
+      <para>2024-02-02</para>
+      <itemizedlist>
+        <listitem>
+          <para>[xry111] - Update to tzdata-2024a.  Fixes
+          <ulink url='&lfs-ticket-root;5428'>#5428</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[xry111] - Update to glibc-2.39 (security fix).  Fixes
+          <ulink url='&lfs-ticket-root;5426'>#5426</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[xry111] - Update to linux-6.7.3.  Fixes
+          <ulink url='&lfs-ticket-root;5427'>#5427</ulink>.</para>
+        </listitem>
+      </itemizedlist>
+    </listitem>
+
+    <listitem>
+      <para>2024-02-01</para>
+      <itemizedlist>
+        <listitem>
+          <para>[bdubbs] - Update to openssl-3.2.1 (security fix). Fixes
+          <ulink url='&lfs-ticket-root;5425'>#5425</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to zlib-1.3.1. Fixes
+          <ulink url='&lfs-ticket-root;5419'>#5419</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to xz-5.4.6. Fixes
+          <ulink url='&lfs-ticket-root;5423'>#5423</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to linux-6.7.2. Fixes
+          <ulink url='&lfs-ticket-root;5422'>#5422</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to iana-etc-20240125. Addresses
+          <ulink url='&lfs-ticket-root;5006'>#5006</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to binutils-2.42. Fixes
+          <ulink url='&lfs-ticket-root;5424'>#5424</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update to acl-2.3.2. Fixes
+          <ulink url='&lfs-ticket-root;5421'>#5421</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Update upstream fixes for readline-8.2. Fixes
+          <ulink url='&lfs-ticket-root;5420'>#5420</ulink>.</para>
+        </listitem>
+        <listitem>
+          <para>[bdubbs] - Apply upstream fix for bash-5.2.21. Fixes
+          <ulink url='&lfs-ticket-root;5420'>#5420</ulink>.</para>
+        </listitem>
+      </itemizedlist>
+    </listitem>
+
     <listitem>
       <para>2024-01-21</para>
       <itemizedlist>
@@ -579,7 +697,8 @@
            <ulink url='&lfs-ticket-root;5330'>#5330</ulink>.</para>
         </listitem>
         <listitem>
-           <para>[bdubbs] - Update to procps-ng-4.0.4. Fixes
+           <para>[bdubbs] - Update to procps-ng-4.0.4 (security fix
+           for 32-bit systems). Fixes
            <ulink url='&lfs-ticket-root;5335'>#5335</ulink>.</para>
         </listitem>
         <listitem>
diff --git a/chapter01/whatsnew.xml b/chapter01/whatsnew.xml
index 2dd0a8d02..d1cc11706 100644
--- a/chapter01/whatsnew.xml
+++ b/chapter01/whatsnew.xml
@@ -26,9 +26,9 @@
     <!--<listitem>
     <para>None</para>
     </listitem>-->
-    <!--<listitem>
+    <listitem>
       <para>Acl-&acl-version;</para>
-    </listitem>-->
+    </listitem>
     <listitem>
       <para>Attr-&attr-version;</para>
     </listitem>
@@ -44,9 +44,9 @@
     <listitem>
       <para>Bc-&bc-version;</para>
     </listitem>
-    <!--<listitem>
+    <listitem>
       <para>Binutils-&binutils-version;</para>
-    </listitem>-->
+    </listitem>
     <!--<listitem>
       <para>Bison-&bison-version;</para>
     </listitem>-->
@@ -71,9 +71,9 @@
     <!--<listitem>
        <para>E2fsprogs-&e2fsprogs-version;</para>
     </listitem>-->
-    <!--<listitem>
+    <listitem>
        <para>Expat-&expat-version;</para>
-    </listitem>-->
+    </listitem>
     <!--<listitem>
        <para>Expect-&expect-version;</para>
     </listitem>-->
@@ -101,9 +101,9 @@
     <listitem>
       <para>Gettext-&gettext-version;</para>
     </listitem>
-    <!--<listitem>
+    <listitem>
       <para>Glibc-&glibc-version;</para>
-    </listitem>-->
+    </listitem>
     <!--<listitem>
       <para>GMP-&gmp-version;</para>
     </listitem>-->
@@ -176,9 +176,9 @@
     <listitem>
       <para>Man-DB-&man-db-version;</para>
     </listitem>
-    <!--<listitem>
+    <listitem>
       <para>Man-pages-&man-pages-version;</para>
-    </listitem>-->
+    </listitem>
     <listitem>
       <para>MarkupSafe-&markupsafe-version;</para>
     </listitem>
@@ -224,9 +224,9 @@
     <!--<listitem>
       <para>Sed-&sed-version;</para>
     </listitem>-->
-    <!--<listitem>  After version 12.1 release - see Added
+    <listitem>  <!-- After version 12.1 release - see Added -->
       <para>Setuptools-&setuptools-version;</para>
-    </listitem>-->
+    </listitem>
     <listitem>
       <para>Shadow-&shadow-version;</para>
     </listitem>
@@ -291,21 +291,21 @@
     <listitem><para></para></listitem>  <!-- satisfy build -->
 
     <listitem>
-      <para>setuptools-&setuptools-version;</para>
-    </listitem>
-
-    <listitem>
-      <para>&glibc-upstream-fixes-patch;</para>
-    </listitem>
-
-    <listitem>
-      <para>&pkgconf-upstream-fix-patch;</para>
+      <para>&bash-upstream-fixes-patch;</para>
     </listitem>
 
     <listitem>
       <para>&readline-fixes-patch;</para>
     </listitem>
 
+    <listitem>
+      <para>setuptools-&setuptools-version;</para>
+    </listitem>
+
+    <listitem>
+      <para>&systemd-upstream-patch;</para>
+    </listitem>
+
   </itemizedlist>
 
   <itemizedlist>
diff --git a/chapter02/creatingpartition.xml b/chapter02/creatingpartition.xml
index 50112024d..4642bfa50 100644
--- a/chapter02/creatingpartition.xml
+++ b/chapter02/creatingpartition.xml
@@ -40,7 +40,8 @@
   <filename class="devicefile">/dev/sda</filename> for the primary
   disk drive. Create a Linux native partition and a
   <systemitem class="filesystem">swap</systemitem> partition, if needed. Please
-  refer to <filename>cfdisk(8)</filename> or <filename>fdisk(8)</filename> if
+  refer to <ulink role='man' url='&man;cfdisk.8'>cfdisk(8)</ulink> or
+  <ulink role='man' url='&man;fdisk.8'>fdisk(8)</ulink> if
   you do not yet know how to use the programs.</para>
 
   <note><para>For experienced users, other partitioning schemes are possible.
diff --git a/chapter02/hostreqs.xml b/chapter02/hostreqs.xml
index 8d9d13567..7375ca327 100644
--- a/chapter02/hostreqs.xml
+++ b/chapter02/hostreqs.xml
@@ -29,9 +29,10 @@
     minimum versions indicated. This should not be an issue for most
     modern Linux distributions. Also note that many distributions will
     place software headers into separate packages, often in the form of
-    <quote>&lt;package-name&gt;-devel</quote> or
-    <quote>&lt;package-name&gt;-dev</quote>. Be sure to install those if
-    your distribution provides them.</para>
+    <literal><replaceable>&lt;package-name&gt;</replaceable>-devel</literal>
+    or
+    <literal><replaceable>&lt;package-name&gt;</replaceable>-dev</literal>.
+    Be sure to install those if your distribution provides them.</para>
 
    <para>Earlier versions of the listed software packages may work, but have
    not been tested.</para>
@@ -99,8 +100,12 @@
       <xref linkend="chapter-building-system"/>, so the workarounds for
       older kernels are not enabled and the compiled
       <application>glibc</application> is slightly faster and smaller.
-      As at June 2023, &min-kernel; is the oldest kernel release still
-      supported by the kernel developers.</para>
+      As at Feb 2024, &min-kernel; is the oldest kernel release still
+      supported by the kernel developers.  Some kernel releases older than
+      &min-kernel; may be still supported by third-party teams, but they
+      are not considered official upstream kernel releases; read
+      <ulink url='https://kernel.org/category/releases.html'/> for the
+      details.</para>
 
       <para>If the host kernel is earlier than &min-kernel; you will need to replace
       the kernel with a more up-to-date version. There are two ways
diff --git a/chapter02/mounting.xml b/chapter02/mounting.xml
index 6c279ac78..4db0f5bfc 100644
--- a/chapter02/mounting.xml
+++ b/chapter02/mounting.xml
@@ -16,7 +16,7 @@
   <envar>LFS</envar> environment variable described in the previous section.
   </para>
   
-  <para>Strictly speaking, one cannot "mount a partition". One mounts the <emphasis>file
+  <para>Strictly speaking, one cannot <quote>mount a partition.</quote> One mounts the <emphasis>file
   system</emphasis> embedded in that partition. But since a single partition can't contain
   more than one file system, people often speak of the partition and the
   associated file system as if they were one and the same.</para>
diff --git a/chapter02/stages.xml b/chapter02/stages.xml
index 710ff6585..aeee2588e 100644
--- a/chapter02/stages.xml
+++ b/chapter02/stages.xml
@@ -69,7 +69,7 @@
 
       <listitem>
         <para>A few operations, from <quote>Changing Ownership</quote> to
-        <quote>Entering the Chroot Environment</quote>, must be done as the
+        <quote>Entering the Chroot Environment,</quote> must be done as the
         <systemitem class="username">root</systemitem> user, with the LFS
         environment variable set for the &root; user.</para>
       </listitem>
diff --git a/chapter03/patches.xml b/chapter03/patches.xml
index 50ff56a6f..067dc9aea 100644
--- a/chapter03/patches.xml
+++ b/chapter03/patches.xml
@@ -27,14 +27,14 @@
     </varlistentry>
 -->
 
-<!--    <varlistentry>
-      <term>Bash Upstream Fixes Patch - <token>&bash-fixes-patch-size;</token>:</term>
+    <varlistentry>
+      <term>Bash Upstream Fixes Patch - <token>&bash-upstream-fixes-patch-size;</token>:</term>
       <listitem>
-        <para>Download: <ulink url="&patches-root;&bash-fixes-patch;"/></para>
-        <para>MD5 sum: <literal>&bash-fixes-patch-md5;</literal></para>
+        <para>Download: <ulink url="&patches-root;&bash-upstream-fixes-patch;"/></para>
+        <para>MD5 sum: <literal>&bash-upstream-fixes-patch-md5;</literal></para>
       </listitem>
     </varlistentry>
--->
+
 <!--
     <varlistentry>
       <term>Binutils LTO Fix Patch - <token>&binutils-lto-patch-size;</token>:</term>
@@ -76,7 +76,7 @@
         <para>MD5 sum: <literal>&gcc-upstream-fixes-patch-md5;</literal></para>
       </listitem>
     </varlistentry>
--->
+
     <varlistentry>
       <term>Glibc Upstream Fixes Patch - <token>&glibc-upstream-fixes-patch-size;</token>:</term>
       <listitem>
@@ -84,7 +84,7 @@
         <para>MD5 sum: <literal>&glibc-upstream-fixes-patch-md5;</literal></para>
       </listitem>
     </varlistentry>
-
+-->
     <varlistentry>
       <term>Glibc FHS Patch - <token>&glibc-fhs-patch-size;</token>:</term>
       <listitem>
@@ -117,7 +117,7 @@
       </listitem>
     </varlistentry>
 -->
-
+<!--
     <varlistentry>
       <term>Pkgconf Upstream Fix Patch - <token>&pkgconf-upstream-fix-patch-size;</token>:</term>
       <listitem>
@@ -125,7 +125,7 @@
         <para>MD5 sum: <literal>&pkgconf-upstream-fix-patch-md5;</literal></para>
       </listitem>
     </varlistentry>
-
+-->
     <varlistentry>
       <term>Readline Upstream Fix Patch - <token>&readline-fixes-patch-size;</token>:</term>
       <listitem>
@@ -142,15 +142,13 @@
       </listitem>
     </varlistentry>
 
-<!--
     <varlistentry revision="systemd">
-      <term>Systemd Upstream Patch - <token>&systemd-upstream-patch-size;</token>:</term>
+      <term>Systemd Upstream Fixes Patch - <token>&systemd-upstream-patch-size;</token>:</term>
       <listitem>
         <para>Download: <ulink url="&patches-root;&systemd-upstream-patch;"/></para>
         <para>MD5 sum: <literal>&systemd-upstream-patch-md5;</literal></para>
       </listitem>
     </varlistentry>
--->
 <!--
     <varlistentry>
       <term>Xz Upstream Fix Patch - <token>&xz-upstream-fix-patch-size;</token>:</term>
diff --git a/chapter04/addinguser.xml b/chapter04/addinguser.xml
index 3173dff7f..eed85c569 100644
--- a/chapter04/addinguser.xml
+++ b/chapter04/addinguser.xml
@@ -96,6 +96,7 @@ useradd -s /bin/bash -g lfs -m -k /dev/null lfs</userinput></screen>
   <para>The <quote><parameter>-</parameter></quote> instructs
   <command>su</command> to start a login shell as opposed to a non-login shell.
   The difference between these two types of shells is described in detail in
-  <filename>bash(1)</filename> and <command>info bash</command>.</para>
+  <ulink role='man' url='&man;bash.1'>bash(1)</ulink> and <command>info
+  bash</command>.</para>
 
 </sect1>
diff --git a/chapter04/settingenviron.xml b/chapter04/settingenviron.xml
index 20988bd3f..b179bb0b3 100644
--- a/chapter04/settingenviron.xml
+++ b/chapter04/settingenviron.xml
@@ -79,8 +79,8 @@ EOF</userinput></screen>
   <para>Setting the user file-creation mask (umask) to 022 ensures that newly
   created files and directories are only writable by their owner, but are
   readable and executable by anyone (assuming default modes are used by the
-  <filename>open(2)</filename> system call, new files will end up with
-  permission mode 644 and directories with mode 755).</para>
+  <ulink role='man' url='&man;open.2'>open(2)</ulink> system call, new files
+  will end up with permission mode 644 and directories with mode 755).</para>
       </listitem>
     </varlistentry>
 
diff --git a/chapter05/glibc.xml b/chapter05/glibc.xml
index 33819c851..584781fa3 100644
--- a/chapter05/glibc.xml
+++ b/chapter05/glibc.xml
@@ -137,8 +137,8 @@ cd       build</userinput></screen>
     Gettext package, which the host distribution should provide.</para>
 
     <note><para>There have been reports that this package may fail when
-    building as a "parallel make".  If that occurs, rerun the make command
-    with the "-j1" option.</para></note>
+    building as a <quote>parallel make.</quote>  If that occurs, rerun the make command
+    with the <option>-j1</option> option.</para></note>
 
     <para>Compile the package:</para>
 
diff --git a/chapter06/file.xml b/chapter06/file.xml
index cb952d9bb..ada0dddeb 100644
--- a/chapter06/file.xml
+++ b/chapter06/file.xml
@@ -78,11 +78,6 @@ popd</userinput></screen>
 
 <screen><userinput remap="configure">./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)</userinput></screen>
 
-<!-- devs: if using - -build here, the build system wants to compile
-     the signature file with "file" on the build system, but stops if it is not
-     the same version. One possibility would be to build "file" on the build
-     system first, but it is simpler to have the system think it is not
-     cross-compiling, and use the just built "file". -->
     <para>Compile the package:</para>
 
 <screen><userinput remap="make">make FILE_COMPILE=$(pwd)/build/src/file</userinput></screen>
diff --git a/chapter07/creatingdirs.xml b/chapter07/creatingdirs.xml
index aee184941..eab9f5fce 100644
--- a/chapter07/creatingdirs.xml
+++ b/chapter07/creatingdirs.xml
@@ -54,7 +54,7 @@ install -dv -m 1777 /tmp /var/tmp</userinput></screen>
   <filename class="directory">/tmp</filename> and <filename
   class="directory">/var/tmp</filename> directories, but cannot remove
   another user's files from them. The latter is prohibited by the so-called
-  <quote>sticky bit</quote>, the highest bit (1) in the 1777 bit mask.</para>
+  <quote>sticky bit,</quote> the highest bit (1) in the 1777 bit mask.</para>
 
   <sect2>
     <title>FHS Compliance Note</title>
diff --git a/chapter07/kernfs.xml b/chapter07/kernfs.xml
index 00a971b59..067a614f4 100644
--- a/chapter07/kernfs.xml
+++ b/chapter07/kernfs.xml
@@ -63,11 +63,14 @@
 
       <para>Now mount the remaining virtual kernel file systems:</para>
 
-<screen><userinput>mount -v --bind /dev/pts $LFS/dev/pts
+      <!-- Do not put any option after $LFS/${mountpoint} or jhalfs cannot
+           handle it! -->
+
+<screen><userinput>mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts
 mount -vt proc proc $LFS/proc
 mount -vt sysfs sysfs $LFS/sys
 mount -vt tmpfs tmpfs $LFS/run</userinput></screen>
-<!--
+
     <variablelist>
       <title>The meaning of the mount options for devpts:</title>
 
@@ -95,11 +98,12 @@ mount -vt tmpfs tmpfs $LFS/run</userinput></screen>
       </varlistentry>
 
     </variablelist>
--->
+
       <para>In some host systems, <filename>/dev/shm</filename> is a
-      symbolic link to <filename class="directory">/run/shm</filename>.
+      symbolic link to a directory, typically
+      <filename class="directory">/run/shm</filename>.
       The /run tmpfs was mounted above so in this case only a
-      directory needs to be created.</para>
+      directory needs to be created with the correct permissions.</para>
 
       <para>In other host systems <filename>/dev/shm</filename> is a mount point 
       for a tmpfs. In that case the mount of /dev above will only create
@@ -107,7 +111,7 @@ mount -vt tmpfs tmpfs $LFS/run</userinput></screen>
       we must explicitly mount a tmpfs:</para>
 
 <screen><userinput>if [ -h $LFS/dev/shm ]; then
-  (cd $LFS/dev; mkdir $(readlink shm))
+  install -v -d -m 1777 $LFS$(realpath /dev/shm)
 else
   mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm
 fi</userinput></screen>
diff --git a/chapter07/python.xml b/chapter07/python.xml
index 4ed385d58..872cf4a36 100644
--- a/chapter07/python.xml
+++ b/chapter07/python.xml
@@ -44,8 +44,8 @@
     <title>Installation of Python</title>
 
     <note>
-      <para>There are two package files whose name starts with
-      <quote>python</quote>. The one to extract from is
+      <para>There are two package files whose name starts with the
+      <quote>python</quote> prefix. The one to extract from is
       <filename>Python-&python-version;.tar.xz</filename> (notice the
       uppercase first letter).</para>
     </note>
@@ -83,9 +83,9 @@
     <note>
       <para>
         Some Python 3 modules can't be built now because the dependencies
-        are not installed yet. The building system still attempts to build
-        them however, so the compilation of some files will fail and the
-        compiler message may seem to indicate <quote>fatal error</quote>.
+        are not installed yet. For the <filename>ssl</filename> module,
+        a message <computeroutput>Python requires a OpenSSL 1.1.1 or
+        newer</computeroutput> is outputted.
         The message should be ignored.  Just make sure the toplevel
         <command>make</command> command has not failed.  The optional
         modules are not needed now and they will be built in
diff --git a/chapter08/bash.xml b/chapter08/bash.xml
index 2656d8ca3..1490e7791 100644
--- a/chapter08/bash.xml
+++ b/chapter08/bash.xml
@@ -40,6 +40,10 @@
   <sect2 role="installation">
     <title>Installation of Bash</title>
 
+    <para>First, fix some issues identified upstream:</para>
+
+<screen><userinput remap="pre">patch -Np1 -i ../&bash-upstream-fixes-patch;</userinput></screen>
+
     <para>Prepare Bash for compilation:</para>
 
     <screen><userinput remap="configure">./configure --prefix=/usr             \
@@ -71,7 +75,7 @@
 
     <para>To prepare the tests, ensure that the <systemitem class="username">tester</systemitem> user can write to the sources tree:</para>
 
-<screen><userinput remap="test">chown -Rv tester .</userinput></screen>
+<screen><userinput remap="test">chown -R tester .</userinput></screen>
 
     <para>The test suite of this package is designed to be run as a non-&root;
     user who owns the terminal connected to standard input.  To satisfy the
@@ -79,7 +83,7 @@
     <application>Expect</application> and run the tests as the <systemitem
     class="username">tester</systemitem> user:</para>
 
-<screen><userinput remap="test">su -s /usr/bin/expect tester &lt;&lt; EOF
+<screen><userinput remap="test">su -s /usr/bin/expect tester &lt;&lt; "EOF"
 set timeout -1
 spawn make tests
 expect eof
diff --git a/chapter08/binutils.xml b/chapter08/binutils.xml
index 9163b8ecd..259c9d5e5 100644
--- a/chapter08/binutils.xml
+++ b/chapter08/binutils.xml
@@ -135,7 +135,7 @@ cd       build</userinput></screen>
 
 <screen><userinput remap="test">grep '^FAIL:' $(find -name '*.log')</userinput></screen>
 
-    <para>Three tests in the gprofng suite are known to fail.</para>
+ <!--    <para>Three tests in the gprofng suite are also known to fail.</para>-->
 
     <para>Install the package:</para>
 
diff --git a/chapter08/coreutils.xml b/chapter08/coreutils.xml
index e6114461f..94c276360 100644
--- a/chapter08/coreutils.xml
+++ b/chapter08/coreutils.xml
@@ -121,7 +121,7 @@ FORCE_UNSAFE_CONFIGURE=1 ./configure \
     <para>Fix some of the permissions so that the non-&root; user can
     compile and run the tests:</para>
 
-<screen><userinput remap="test">chown -Rv tester . </userinput></screen>
+<screen><userinput remap="test">chown -R tester . </userinput></screen>
 
     <para>Now run the tests:</para>
 
@@ -129,8 +129,14 @@ FORCE_UNSAFE_CONFIGURE=1 ./configure \
 
 <!-- Sometimes skipped, but if not it may fail.
      Please DO NOT remove or comment out this unless we can fully
-     understand it!  -->
+     understand it!
     <para>The test-getlogin test may fail in the LFS chroot environment.</para>
+    20240226: Commented out as it seems the upstream has root-caused and
+    fixed the issue.  I've checked the fix is in Coreutils 9.4 release
+    tarball:
+
+    https://lists.gnu.org/archive/html/bug-gnulib/2022-06/msg00079.html
+-->
 
     <para>Remove the temporary group:</para>
 
@@ -1261,8 +1267,8 @@ sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8</userinput></screen>
       <varlistentry id="yes">
         <term><command>yes</command></term>
         <listitem>
-          <para>Repeatedly outputs <quote>y</quote>, or a given string, until
-          killed</para>
+          <para>Repeatedly outputs <literal>y</literal> or a given string,
+          until killed</para>
           <indexterm zone="ch-system-coreutils yes">
             <primary sortas="b-yes">yes</primary>
           </indexterm>
diff --git a/chapter08/e2fsprogs.xml b/chapter08/e2fsprogs.xml
index 6a4489dee..c5718c191 100644
--- a/chapter08/e2fsprogs.xml
+++ b/chapter08/e2fsprogs.xml
@@ -159,7 +159,8 @@ install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info</userin
     <screen role='nodump'><userinput>sed 's/metadata_csum_seed,//' -i /etc/mke2fs.conf</userinput></screen>
 
     <para>
-      Read the man page <filename>mke2fs.conf(5)</filename> for details.
+      Read the man page <ulink role='man'
+      url='&man;mke2fs.conf.5'>mke2fs.conf(5)</ulink> for details.
     </para>
   </sect2>
 
diff --git a/chapter08/expect.xml b/chapter08/expect.xml
index a9bc3169e..27cde8cb1 100644
--- a/chapter08/expect.xml
+++ b/chapter08/expect.xml
@@ -48,6 +48,25 @@
   <sect2 role="installation">
     <title>Installation of Expect</title>
 
+    <para>Expect needs PTYs to work.  Verify that the PTYs are working
+    properly inside the chroot environment by performing a simple
+    test:</para>
+
+<screen><userinput remap="test">python3 -c 'from pty import spawn; spawn(["echo", "ok"])'</userinput></screen>
+
+    <para>This command should output <computeroutput>ok</computeroutput>.
+    If, instead, the output includes <computeroutput>OSError: out of pty
+    devices</computeroutput>, then the environment is not set up for proper
+    PTY operation.  You need to exit from the chroot environment, read
+    <xref linkend='ch-tools-kernfs'/> again, and ensure the
+    <systemitem class="filesystem">devpts</systemitem> file system (and
+    other virtual kernel file systems) mounted correctly.  Then reenter
+    the chroot environment following <xref linkend='ch-tools-chroot'/>.
+    This issue needs to be resolved before continuing, or the test suites
+    requiring Expect (for example the test suites of Bash, Binutils, GCC,
+    GDBM, and of course Expect itself) will fail catastrophically, and other
+    subtle breakages may also happen.</para>
+
     <para>Update two config scripts to allow building this package for
     AArch64:</para>
 
@@ -88,27 +107,10 @@
 
 <screen><userinput remap="make">make</userinput></screen>
 
-    <important>
-      <para>The test suite for Expect is considered critical.
-      Do not skip it under any circumstances.</para>
-    </important>
-
     <para>To test the results, issue:</para>
 
 <screen><userinput remap="test">make test</userinput></screen>
 
-    <para>If any test fails with the message
-    <quote><computeroutput>The system has no more ptys.  Ask your system
-    administrator to create more</computeroutput></quote>, it indicates
-    you've not mounted the
-    <systemitem class="filesystem">devpts</systemitem> file system
-    correctly.  You need to exit from the chroot environment, read
-    <xref linkend='ch-tools-kernfs'/> again, and ensure the
-    <systemitem class="filesystem">devpts</systemitem> file system (and
-    other virtual kernel file systems) mounted correctly.  Then reenter
-    the chroot environment following <xref linkend='ch-tools-chroot'/>.
-    This issue needs to be resolved before continuing.</para>
-
     <para>Install the package:</para>
 
 <screen><userinput remap="install">make install
diff --git a/chapter08/findutils.xml b/chapter08/findutils.xml
index 7012c221a..5671f6183 100644
--- a/chapter08/findutils.xml
+++ b/chapter08/findutils.xml
@@ -82,7 +82,7 @@ esac</userinput></screen>
 
     <para>To test the results, issue:</para>
 
-<screen><userinput remap="test">chown -Rv tester .
+<screen><userinput remap="test">chown -R tester .
 su tester -c "PATH=$PATH make check"</userinput></screen>
 
     <para>Install the package:</para>
diff --git a/chapter08/gawk.xml b/chapter08/gawk.xml
index a7f74eb92..bc19acaaf 100644
--- a/chapter08/gawk.xml
+++ b/chapter08/gawk.xml
@@ -54,7 +54,7 @@
 
     <para>To test the results, issue:</para>
 
-<screen><userinput remap="test">chown -Rv tester .
+<screen><userinput remap="test">chown -R tester .
 su tester -c "PATH=$PATH make check"</userinput></screen>
 
     <para>Install the package:</para>
diff --git a/chapter08/gcc.xml b/chapter08/gcc.xml
index 73b449b68..904346489 100644
--- a/chapter08/gcc.xml
+++ b/chapter08/gcc.xml
@@ -154,7 +154,7 @@ cd       build</userinput></screen>
 
     <para>Test the results as a non-privileged user, but do not stop at errors:</para>
 
-<screen><userinput remap="test">chown -Rv tester .
+<screen><userinput remap="test">chown -R tester .
 su tester -c "PATH=$PATH make -k check"</userinput></screen>
 
     <para>To extract a summary of the test suite results, run:</para>
@@ -170,8 +170,7 @@ su tester -c "PATH=$PATH make -k check"</userinput></screen>
 
     <para>
     <!-- https://gcc.gnu.org/PR107915 and https://gcc.gnu.org/PR109353 -->
-    Two tests named <filename>copy.cc</filename> and
-    <filename>contracts-tmpl-spec2.C</filename> are known to fail.
+    One test named <filename>contracts-tmpl-spec2.C</filename> is known to fail.
     <!-- https://gcc.gnu.org/PR111224 -->
     Some C++ module tests named <filename>xtreme-*</filename> are known to
     fail.
@@ -181,14 +180,19 @@ su tester -c "PATH=$PATH make -k check"</userinput></screen>
     <para>Many gcc and g++ tests related to hwasan are known to fail.</para>
 
     <para>
-      With Glibc-2.38, the analyzer tests named
-      <filename>data-model-4.c</filename> and
-      <filename>conftest-1.c</filename> 
-        are known to fail.
-      In the asan tests, several tests in <filename>asan_test.C</filename> 
-        are known to fail.
-      The test named <filename>interception-malloc-test-1.C</filename> 
-        is known to fail.
+    Eight gcc tests (out of over 185,000):
+    <!-- https://gcc.gnu.org/PR106375 --><filename>pr56837.c</filename>
+    and seven tests in the <filename class='directory'>analyzer</filename>
+    directory are known to fail.
+
+    <!-- https://gcc.gnu.org/PR109353 -->
+    One libstdc++ test (out of over 15000), <filename>copy.cc</filename>, is
+    known to fail.
+
+    For g++, 21 tests (out of approximately 250,000): 14
+    <quote>AddressSanitizer*</quote>
+    tests and 7 <filename>interception-malloc-test-1.C</filename> tests, are
+    known to fail.
     </para>
 
     <para>A few unexpected failures cannot always be avoided. The GCC developers
@@ -196,15 +200,6 @@ su tester -c "PATH=$PATH make -k check"</userinput></screen>
     Unless the test results are vastly different from those at the above URL,
     it is safe to continue.</para>
 
-    <!--note><para>
-      On some combinations of kernel configuration and AMD processors
-      there may be more than 1100 failures in the gcc.target/i386/mpx
-      tests (which are designed to test the MPX option on recent
-      Intel processors). These can safely be ignored on AMD
-      processors. These tests will also fail on Intel processors if MPX support
-      is not enabled in the kernel even though it is present on the CPU.
-    </para></note-->
-
     <para>Install the package:</para>
 
 <screen><userinput remap="install">make install</userinput></screen>
diff --git a/chapter08/glibc.xml b/chapter08/glibc.xml
index 748a93abf..3352f6ac7 100644
--- a/chapter08/glibc.xml
+++ b/chapter08/glibc.xml
@@ -49,12 +49,12 @@
     store their runtime data in the FHS-compliant locations:</para>
 
 <screen><userinput remap="pre">patch -Np1 -i ../&glibc-fhs-patch;</userinput></screen>
-
+<!--
     <para>Now fix two security vulnerabilities and a regression causing the
     posix_memalign() function very slow in some conditions:</para>
 
 <screen><userinput remap="pre">patch -Np1 -i ../&glibc-upstream-fixes-patch;</userinput></screen>
-
+-->
     <para>The Glibc documentation recommends building Glibc
     in a dedicated build directory:</para>
 
@@ -73,7 +73,6 @@ cd       build</userinput></screen>
              --disable-werror                         \
              --enable-kernel=&min-kernel;                     \
              --enable-stack-protector=strong          \
-             --with-headers=/usr/include              \
              --disable-nscd                           \
              libc_cv_slibdir=/usr/lib</userinput></screen>
 
@@ -103,15 +102,10 @@ cd       build</userinput></screen>
         <listitem>
           <para>This option increases system security by adding
           extra code to check for buffer overflows, such as stack
-          smashing attacks.</para>
-        </listitem>
-      </varlistentry>
-<!-- do we need this one? -->
-      <varlistentry>
-        <term><parameter>--with-headers=/usr/include</parameter></term>
-        <listitem>
-          <para>This option tells the build system where to find the
-          kernel API headers.</para>
+          smashing attacks.  Note that Glibc always explicitly overrides
+          the default of GCC, so this option is still needed even though
+          we've already specified <option>--enable-default-ssp</option> for
+          GCC.</para>
         </listitem>
       </varlistentry>
 
@@ -169,29 +163,34 @@ esac</userinput></screen>
         is known to fail in the LFS chroot environment.</para>
       </listitem>
 
-<!-- Did not fail with glibc-2.38
-      <listitem>
-        <para><emphasis>misc/tst-ttyname</emphasis>
-        is known to fail in the LFS chroot environment.</para>
-      </listitem>
--->
-
-      <!-- https://sourceware.org/pipermail/libc-alpha/2022-August/141567.html -->
-      <listitem>
-        <para>The <emphasis>stdlib/tst-arc4random-thread</emphasis>
-        test is known to fail if the host kernel is relatively old.</para>
-      </listitem>
-
       <listitem>
         <para>Some tests, for example
-        <emphasis>nss/tst-nss-files-hosts-multi</emphasis>,
-        are known to fail on relatively slow systems due to an internal
-        timeout.</para>
+        <emphasis>nss/tst-nss-files-hosts-multi</emphasis> and
+        <emphasis>nptl/tst-thread-affinity*</emphasis>
+        are known to fail due to a timeout (especially when the system is
+        relatively slow and/or running the test suite with multiple
+        parallel make jobs).  These tests can be identified with:</para>
+
+        <!-- TODO: Using nodump for freeze.  Change it to role="test" after
+             12.1 release so jhalfs can list these in the log.  -->
+        <screen role="nodump"><userinput>grep "Timed out" -l $(find -name \*.out)</userinput></screen>
+
+        <para>It's possible to re-run a single test with enlarged timeout
+        with
+        <command>TIMEOUTFACTOR=<replaceable>&lt;factor&gt;</replaceable>
+        make test t=<replaceable>&lt;test name&gt;</replaceable></command>.
+        For example, <command>TIMEOUTFACTOR=10 make test
+        t=nss/tst-nss-files-hosts-multi</command> will re-run
+        <emphasis>nss/tst-nss-files-hosts-multi</emphasis> with ten times
+        the original timeout.</para>
       </listitem>
 
       <listitem>
         <para>Additionally, some tests may fail with a relatively old CPU
-        model or host kernel version.</para>
+        model (for example
+        <emphasis>elf/tst-cpu-features-cpuinfo</emphasis>) or host kernel
+        version (for example
+        <emphasis>stdlib/tst-arc4random-thread</emphasis>).</para>
       </listitem>
     </itemizedlist>
 
@@ -207,6 +206,122 @@ esac</userinput></screen>
 
 <screen><userinput remap="install">sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile</userinput></screen>
 
+    <important>
+      <para>
+        If upgrading Glibc to a new minor version (for example, from
+        Glibc-2.36 to Glibc-&glibc-version;) on a running LFS system, you
+        need to take some extra precautions to avoid breaking the system:
+      </para>
+
+      <itemizedlist>
+        <listitem>
+          <!-- There are two reasons we don't support this:
+               1. Upgrading on a system with separate /lib and /usr/lib is
+                  tricky.
+               2. With Glibc prior to 2.34 libc.so.6 etc. are symlinks to
+                  libc-2.33.so etc., again causing the upgradation tricky.
+                  The Glibc NEWS file explicit states they no longer use
+                  symlinks for the ABI names to avoid upgradation
+                  issues.  -->
+          <para>
+            Upgrading Glibc on a LFS system prior to 11.0 (exclusive) is
+            not supported.  Rebuild LFS if you are running such an old LFS
+            system but you need a newer Glibc.
+          </para>
+        </listitem>
+
+        <!-- https://sourceware.org/pipermail/libc-alpha/2024-January/154095.html -->
+        <listitem>
+          <para>
+            If upgrading on a LFS system prior to 12.0 (exclusive), install
+            <application>Libxcrypt</application> following
+            <xref role='.' linkend='ch-system-libxcrypt'/>  In addition to
+            a normal <application>Libxcrypt</application> installation,
+            <emphasis role='bold'>you MUST follow the note in Libxcrypt
+            section to install
+            <filename class='libraryfile'>libcrypt.so.1*</filename>
+            (replacing
+            <filename class='libraryfile'>libcrypt.so.1</filename> from the
+            prior Glibc installation)</emphasis>.
+          </para>
+        </listitem>
+
+        <!-- Otherwise on lfs-systemd nscd will fail to start on boot,
+             and on both lfs-sysv and lfs-systemd useradd etc. will try
+             to start nscd, then nscd will fail to start as well and
+             produce some spurious error message.  -->
+        <listitem>
+          <para>
+            If upgrading on a LFS system prior to 12.1 (exclusive),
+            remove the <command>nscd</command> program:
+          </para>
+
+          <screen role='nodump'><userinput>rm -f /usr/sbin/nscd</userinput></screen>
+
+          <para revision='systemd'>
+            If this system (prior to LFS 12.1, exclusive) is based on
+            Systemd, it's also needed to disable and stop the
+            <command>nscd</command> service now:
+          </para>
+
+          <screen revision='systemd' role='nodump'><userinput>systemctl disable --now nscd</userinput></screen>
+        </listitem>
+
+        <listitem>
+          <para>
+            Upgrade the kernel and reboot if it's older than &min-kernel;
+            (check the current version with <command>uname -r</command>)
+            or if you want to upgrade it anyway, following
+            <xref linkend='ch-bootable-kernel' role='.'/>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>
+            Upgrade the kernel API headers if it's older than &min-kernel;
+            (check the current version with
+            <command>cat /usr/include/linux/version.h</command>)
+            or if you want to upgrade it anyway, following
+            <xref linkend='ch-tools-linux-headers'/> (but removing
+            <envar>$LFS</envar> from the <command>cp</command> command).
+          </para>
+        </listitem>
+
+        <!-- This is to ensure we don't start a process at the time point
+             where some Glibc shared libraries are updated but the others
+             are not.  Such mismatches can cause programs crash on startup,
+             esp. a mismatch between ld-linux-x86-64.so.2 and
+             libc.so.6.  Note that a crash in the installation process
+             will leave the system in a state with the mismatch forever,
+             unrecoverable without the help of another distro.  -->
+        <listitem>
+          <para>
+            Perform a <envar>DESTDIR</envar> installation and upgrade
+            the Glibc shared libraries on the system using one single
+            <command>install</command> command:
+          </para>
+
+          <screen role='nodump'><userinput>make DESTDIR=$PWD/dest install
+install -vm755 dest/usr/lib/*.so.* /usr/lib</userinput></screen>
+        </listitem>
+      </itemizedlist>
+
+      <para>
+        It's imperative to strictly follow these steps above unless you
+        completely understand what you are doing.
+        <emphasis role='bold'>Any unexpected deviation may render the
+        system completely unusable.  YOU ARE WARNED.</emphasis>
+      </para>
+
+      <para>
+        Then continue to run the <command>make install</command> command,
+        the <command>sed</command> command against
+        <filename>/usr/bin/ldd</filename>, and the commands to install
+        the locales.  Once they are finished, reboot the system
+        immediately.
+      </para>
+    </important>
+
     <para>Install the package:</para>
 
 <screen><userinput remap="install">make install</userinput></screen>
@@ -420,7 +535,7 @@ unset ZONEINFO</userinput></screen>
         <term><parameter>zic ... -p ...</parameter></term>
         <listitem>
           <para>This creates the <filename>posixrules</filename> file. We use
-          New York because POSIX requires the daylight savings time rules
+          New York because POSIX requires the daylight saving time rules
           to be in accordance with US rules.</para>
         </listitem>
       </varlistentry>
diff --git a/chapter08/gmp.xml b/chapter08/gmp.xml
index bd7a8d7f3..7157f2d13 100644
--- a/chapter08/gmp.xml
+++ b/chapter08/gmp.xml
@@ -49,7 +49,7 @@
       to the <command>configure</command> command.</para>
 
       <!-- To editors: the configure script says "the none host is obsolete,
-           use - -disable-assembly", but don't believe it: with the latter
+           use - -disable-assembly," but don't believe it: with the latter
            CFLAGS is still automatically set to -march=something.  -->
     </note>
 
@@ -97,8 +97,9 @@ make html</userinput></screen>
     <caution><para>The code in gmp is highly optimized for the processor where
     it is built. Occasionally, the code that detects the processor misidentifies
     the system capabilities and there will be errors in the tests or other
-    applications using the gmp libraries with the message "Illegal
-    instruction".  In this case, gmp should be reconfigured with the option
+    applications using the gmp libraries with the message
+    <computeroutput>Illegal instruction</computeroutput>.
+    In this case, gmp should be reconfigured with the option
     <option>--host=none-linux-gnu</option> and rebuilt.</para></caution>
 
     <!-- Some tests PASS on a specific uarch but SKIP on other CPUs.
diff --git a/chapter08/libtool.xml b/chapter08/libtool.xml
index 89b7786aa..cb550b5d6 100644
--- a/chapter08/libtool.xml
+++ b/chapter08/libtool.xml
@@ -56,8 +56,9 @@
 
     <para>Five tests are known to fail in the LFS build environment due
     to a circular dependency, but these tests pass if rechecked after
-    automake has been installed.  Additionally, with grep-3.8, two tests will
-    trigger a warning for non-POSIX regular expressions and fail.</para>
+    automake has been installed.  Additionally, with grep-3.8 or newer,
+    two tests will trigger a warning for non-POSIX regular expressions and
+    fail.</para>
 
     <para>Install the package:</para>
 
diff --git a/chapter08/libxcrypt.xml b/chapter08/libxcrypt.xml
index 7c6cc15ba..fb4c4adaa 100644
--- a/chapter08/libxcrypt.xml
+++ b/chapter08/libxcrypt.xml
@@ -110,7 +110,7 @@
             --disable-static             \
             --disable-failure-tokens
 make
-cp -av .libs/libcrypt.so.1* /usr/lib</userinput></screen>
+cp -av --remove-destination .libs/libcrypt.so.1* /usr/lib</userinput></screen>
     </note>
 
   </sect2>
diff --git a/chapter08/make.xml b/chapter08/make.xml
index 186698a58..41a77c649 100644
--- a/chapter08/make.xml
+++ b/chapter08/make.xml
@@ -53,7 +53,7 @@
          https://savannah.gnu.org/bugs/?63852 -->
     <para>To test the results, issue:</para>
 
-<screen><userinput remap="test">chown -Rv tester .
+<screen><userinput remap="test">chown -R tester .
 su tester -c "PATH=$PATH make check"</userinput></screen>
 
     <para>Install the package:</para>
diff --git a/chapter08/openssl.xml b/chapter08/openssl.xml
index ae5d27e38..446dd226a 100644
--- a/chapter08/openssl.xml
+++ b/chapter08/openssl.xml
@@ -163,7 +163,7 @@ make MANSUFFIX=ssl install</userinput></screen>
             is a command-line tool for using the various cryptography functions
             of <application>OpenSSL</application>'s crypto library from the
             shell. It can be used for various functions which are documented in
-            <filename>openssl(1)</filename>
+            <ulink role='man' url='&man;openssl.1'>openssl(1)</ulink>
           </para>
           <indexterm zone="ch-system-openssl openssl-prog">
             <primary sortas="b-openssl">openssl</primary>
@@ -195,7 +195,8 @@ make MANSUFFIX=ssl install</userinput></screen>
           <para>
             implements the Transport Layer Security (TLS v1) protocol.
             It provides a rich API, documentation
-            on which can be found in <filename>ssl(7)</filename>
+            on which can be found in <ulink role='man'
+            url='&man;ssl.7'>ssl(7)</ulink>
           </para>
           <indexterm zone="ch-system-openssl libssl">
             <primary sortas="c-libssl">libssl.so</primary>
diff --git a/chapter08/pkgconf.xml b/chapter08/pkgconf.xml
index 139e0c810..3e7e737fa 100644
--- a/chapter08/pkgconf.xml
+++ b/chapter08/pkgconf.xml
@@ -44,11 +44,6 @@
 
     <title>Installation of Pkgconf</title>
 
-    <!-- https://github.com/pkgconf/pkgconf/issues/317 -->
-    <para>Fix a regression in pkgconf-2.1.0 breaking BLFS packages:</para>
-
-    <screen><userinput remap="pre">patch -Np1 -i ../&pkgconf-upstream-fix-patch;</userinput></screen>
-
     <para>Prepare Pkgconf for compilation:</para>
 
 <screen><userinput remap="configure">./configure --prefix=/usr              \
diff --git a/chapter08/pkgmgt.xml b/chapter08/pkgmgt.xml
index 42a6ff945..10ec5d199 100644
--- a/chapter08/pkgmgt.xml
+++ b/chapter08/pkgmgt.xml
@@ -56,28 +56,16 @@
         5.10.17 to 5.10.18 or 5.11.1), nothing else needs to be rebuilt.
         The system will keep working fine thanks to the well-defined interface
         between the kernel and userspace.  Specifically, Linux API headers
-        need not be (and should not be, see the next item) upgraded
+        need not be upgraded
         along with the kernel.  You will merely need to reboot your system to use the
         upgraded kernel.</para>
       </listitem>
 
       <listitem>
-        <para>If the Linux API headers or Glibc need to be upgraded to a newer
-        version, (e.g.,  from Glibc-2.31 to Glibc-2.32), it is safer to
-        rebuild LFS.  Though you <emphasis>may</emphasis> be able to rebuild
-        all the packages in their dependency order, we do not recommend
-        it.  </para>
-      </listitem>
-
-      <listitem>
-        <para>Reinstalling the same version of Glibc (&glibc-version; for
-        this release of LFS) with patches should be safe when these patches
-        do not change ABI and API.  When a security vulnerability is found
-        in Glibc, we often need to apply such a patch to fix the
-        vulnerability and reinstall Glibc.  Consult
-        <ulink url='&lfs-root;lfs/advisories/'>LFS security
-        advisories</ulink> if you are alerted for a published Glibc security
-        vulnerability but unsure about the action to take.</para>
+        <para>If Glibc needs to be upgraded to a newer
+        version, (e.g.,  from Glibc-2.36 to Glibc-&glibc-version;),
+        some extra steps are needed to avoid breaking the system.
+        Read <xref linkend='ch-system-glibc'/> for details.</para>
       </listitem>
 
       <listitem> <para>If a package containing a shared library is updated, and
diff --git a/chapter08/procps.xml b/chapter08/procps.xml
index 0d2537054..3f229c713 100644
--- a/chapter08/procps.xml
+++ b/chapter08/procps.xml
@@ -72,7 +72,20 @@
 
     <para> To run the test suite, run:</para>
 
-<screen><userinput remap="test">make check</userinput></screen>
+<screen><userinput remap="test">make -k check</userinput></screen>
+
+    <para>One test named
+    <literal>ps with output flag bsdtime,cputime,etime,etimes</literal>
+    is known to fail if the host kernel is not built with
+    <literal>CONFIG_BSD_PROCESS_ACCT</literal> enabled.
+    <!-- These two tests just do not work as root but they seem to pass
+         in most time due to some internal hazards of Tcl/Expect/DejaGNU
+         framework.  However the failures have been really observed.
+         TODO: run the test suite as tester after the freeze ends.  -->
+    Two tests named
+    <literal>pmap X with unreachable process</literal> and
+    <literal>pmap XX with unreachable process</literal> are known to
+    fail occasionally.</para>
 
     <para>Install the package:</para>
 
diff --git a/chapter08/sed.xml b/chapter08/sed.xml
index 4a524c751..75d015600 100644
--- a/chapter08/sed.xml
+++ b/chapter08/sed.xml
@@ -51,7 +51,7 @@ make html</userinput></screen>
 
     <para>To test the results, issue:</para>
 
-<screen><userinput remap="test">chown -Rv tester .
+<screen><userinput remap="test">chown -R tester .
 su tester -c "PATH=$PATH make check"</userinput></screen>
 
     <para>Install the package and its documentation:</para>
diff --git a/chapter08/shadow.xml b/chapter08/shadow.xml
index 49bcae6de..89678b3f4 100644
--- a/chapter08/shadow.xml
+++ b/chapter08/shadow.xml
@@ -203,8 +203,8 @@ make -C man install-man</userinput></screen>
     to pass either the <parameter>-g</parameter> or <parameter>-N</parameter>
     parameter to <command>useradd</command>, or else change the setting of
     <parameter>USERGROUPS_ENAB</parameter> in
-    <filename>/etc/login.defs</filename>. See <filename>useradd(8)</filename>
-    for more information.</para>
+    <filename>/etc/login.defs</filename>. See <ulink role='man'
+    url='&man;useradd.8'>useradd(8)</ulink> for more information.</para>
 
     <para>Second, to change the default parameters, the file
     <filename>/etc/default/useradd</filename> must be created and tailored
diff --git a/chapter08/stripping.xml b/chapter08/stripping.xml
index e842403f2..6193fd9b4 100644
--- a/chapter08/stripping.xml
+++ b/chapter08/stripping.xml
@@ -53,7 +53,7 @@
   little-endian systems and ld-linux-aarch64_be.so.1 on big-endian systems.
   The construct below selects the
   correct name for the current architecture, excluding anything ending
-  with <quote>g</quote>, in case the commands below have already been
+  with <literal>g</literal>, in case the commands below have already been
   run.</para></note>
 
   <important>
diff --git a/chapter08/systemd.xml b/chapter08/systemd.xml
index 5bc2a3553..2d325d5cd 100644
--- a/chapter08/systemd.xml
+++ b/chapter08/systemd.xml
@@ -50,10 +50,11 @@
 
     <!-- https://github.com/systemd/systemd/pull/30549 -->
     <para>Now fix a security vulnerability in the DNSSEC verification of
-    <command>systemd-resolved</command>:</para>
+    <command>systemd-resolved</command> and a bug breaking running
+    <command>systemd-analyze verify</command> on an instantiated systemd
+    unit:</para>
 
-<screen><userinput remap='pre'>sed -e '/return FLAGS_SET.*AUTHENTICATED/s/(t/(dt/' \
-    -i src/resolve/resolved-dns-transaction.c</userinput></screen>
+<screen><userinput remap='pre'>patch -Np1 -i ../&systemd-upstream-patch;</userinput></screen>
 
     <para>Prepare systemd for compilation:</para>
 
diff --git a/chapter08/util-linux.xml b/chapter08/util-linux.xml
index 2f9687d5d..27268def9 100644
--- a/chapter08/util-linux.xml
+++ b/chapter08/util-linux.xml
@@ -103,7 +103,7 @@
 <screen role="nodump"><userinput>bash tests/run.sh --srcdir=$PWD --builddir=$PWD</userinput></screen>
     </warning>
 
-<screen><userinput remap="test">chown -Rv tester .
+<screen><userinput remap="test">chown -R tester .
 su tester -c "make -k check"</userinput></screen>
 
     <para>The <emphasis>hardlink</emphasis> tests will fail if the host's kernel
@@ -574,7 +574,8 @@ su tester -c "make -k check"</userinput></screen>
         <term><command>irqtop</command></term>
         <listitem>
           <para>Displays kernel interrupt counter information in
-          <filename>top(1)</filename> style view</para>
+          <ulink role='man' url='&man;top.1'>top(1)</ulink> style
+          view</para>
           <indexterm zone="ch-system-util-linux irqtop">
             <primary sortas="b-irqtop">irqtop</primary>
           </indexterm>
diff --git a/chapter08/vim.xml b/chapter08/vim.xml
index 9dd3b4b74..88322132e 100644
--- a/chapter08/vim.xml
+++ b/chapter08/vim.xml
@@ -66,18 +66,21 @@
     <systemitem class="username">tester</systemitem> can write
     to the source tree:</para>
 
-<screen><userinput remap="test">chown -Rv tester .</userinput></screen>
+<screen><userinput remap="test">chown -R tester .</userinput></screen>
 
     <para>Now run the tests as user <systemitem
     class="username">tester</systemitem>:</para>
 
-<screen><userinput remap="test">su tester -c "LANG=en_US.UTF-8 make -j1 test" &amp;> vim-test.log</userinput></screen>
+<screen><userinput remap="test">su tester -c "TERM=xterm-256color LANG=en_US.UTF-8 make -j1 test" \
+   &amp;> vim-test.log</userinput></screen>
 
     <para>The test suite outputs a lot of binary data to the screen.  This can
-    cause issues with the settings of the current terminal.  The problem can be
+    cause issues with the settings of the current terminal (especially while
+    we are overriding the <envar>TERM</envar> variable to satisify some
+    assumptions of the test suite).  The problem can be
     avoided by redirecting the output to a log file as shown above.  A
-    successful test will result in the words "ALL DONE" in the log file
-    at completion.</para>
+    successful test will result in the words <computeroutput>ALL
+    DONE</computeroutput> in the log file at completion.</para>
 
     <para>Install the package:</para>
 
diff --git a/chapter09/chapter09.xml b/chapter09/chapter09.xml
index 1f6dda19c..3f4db0d6b 100644
--- a/chapter09/chapter09.xml
+++ b/chapter09/chapter09.xml
@@ -26,14 +26,13 @@
   <!-- sysv -->
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="network.xml"/>
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="usage.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="profile.xml"/>
 
   <!-- systemd -->
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="clock.xml"/>
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="consoled.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="locale.xml"/>
 
   <!-- common -->
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="locale.xml"/>
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="inputrc.xml"/>
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="etcshells.xml"/>
 
diff --git a/chapter09/consoled.xml b/chapter09/consoled.xml
index 94e99ce8d..ce922d6a8 100644
--- a/chapter09/consoled.xml
+++ b/chapter09/consoled.xml
@@ -30,7 +30,7 @@
   directory for valid screen fonts.</para>
 
   <para>The <filename>/etc/vconsole.conf</filename> file should contain lines
-  of the form: VARIABLE="value". The following variables are recognized:</para>
+  of the form: <envar>VARIABLE=value</envar>. The following variables are recognized:</para>
 
   <variablelist>
 
@@ -74,6 +74,25 @@
 
   </variablelist>
 
+  <para>We'll use <literal>C.UTF-8</literal> as the locale for interactive
+  sessions in the Linux console in <xref role='.'
+  linkend='ch-config-locale'/>  The console fonts shipped by
+  the <application>Kbd</application> package containing the glyphs for
+  all characters from the program messages in the <literal>C.UTF-8</literal>
+  locale are <filename>LatArCyrHeb*.psfu.gz</filename>,
+  <filename>LatGrkCyr*.psfu.gz</filename>,
+  <filename>Lat2-Terminus16.psfu.gz</filename>, and
+  <filename>pancyrillic.f16.psfu.gz</filename> in
+  <filename class='directory'>/usr/share/consolefonts</filename> (the other
+  shipped console fonts lack glyphs of some characters like the Unicode
+  left/right quotation marks and the Unicode English dash). So set one of
+  them, for example <filename>Lat2-Terminus16.psfu.gz</filename> as the
+  default console font:</para>
+
+  <!-- We are using "nodump" for general settings, but not examples.  This
+       is ironic, but needed for the compatibility with jhalfs!  -->
+<screen role='nodump'><userinput>echo <literal>FONT=Lat2-Terminus16</literal> &gt; /etc/vconsole.conf</userinput></screen>
+
   <para>An example for a German keyboard and console is given below:</para>
 <!-- This is what is used by jhalfs for creating the vconsole.conf file.
      Whenever you want to change the following, please inform the jhalfs
diff --git a/chapter09/locale.xml b/chapter09/locale.xml
index 8b6d2c4b2..f738e1994 100644
--- a/chapter09/locale.xml
+++ b/chapter09/locale.xml
@@ -5,18 +5,21 @@
   %general-entities;
 ]>
 
-<sect1 id="ch-config-locale" revision="systemd">
+<sect1 id="ch-config-locale">
   <?dbhtml filename="locale.html"?>
 
   <title>Configuring the System Locale</title>
 
   <indexterm zone="ch-config-locale">
-    <primary sortas="e-etc-locale-conf">/etc/locale.conf</primary>
+    <primary sortas="e-/etc/profile">/etc/profile</primary>
   </indexterm>
 
-  <para>The <filename>/etc/locale.conf</filename> file below sets some
-  environment variables necessary for native language support. Setting
-  them properly results in:</para>
+  <indexterm zone="ch-config-locale" revision='systemd'>
+    <primary sortas="e-/etc/profile">/etc/locale.conf</primary>
+  </indexterm>
+
+  <para>Some environment variables are necessary for native language
+  support. Setting them properly results in:</para>
 
   <itemizedlist>
     <listitem>
@@ -39,35 +42,37 @@
   </itemizedlist>
 
   <para>Replace <replaceable>&lt;ll&gt;</replaceable> below with the two-letter code
-  for your desired language (e.g., <quote>en</quote>) and
+  for your desired language (e.g., <literal>en</literal>) and
   <replaceable>&lt;CC&gt;</replaceable> with the two-letter code for the appropriate
-  country (e.g., <quote>GB</quote>). <replaceable>&lt;charmap&gt;</replaceable> should
+  country (e.g., <literal>GB</literal>). <replaceable>&lt;charmap&gt;</replaceable> should
   be replaced with the canonical charmap for your chosen locale. Optional
-  modifiers such as <quote>@euro</quote> may also be present.</para>
+  modifiers such as <literal>@euro</literal> may also be present.</para>
 
   <para>The list of all locales supported by Glibc can be obtained by running
   the following command:</para>
 
 <screen role="nodump"><userinput>locale -a</userinput></screen>
 
-  <para>Charmaps can have a number of aliases, e.g., <quote>ISO-8859-1</quote>
-  is also referred to as <quote>iso8859-1</quote> and <quote>iso88591</quote>.
+  <para>Charmaps can have a number of aliases, e.g.,
+  <literal>ISO-8859-1</literal> is also referred to as
+  <literal>iso8859-1</literal> and <literal>iso88591</literal>.
   Some applications cannot handle the various synonyms correctly (e.g., require
-  that <quote>UTF-8</quote> is written as <quote>UTF-8</quote>, not
-  <quote>utf8</quote>), so it is the safest in most
+  that <literal>UTF-8</literal> is written as <literal>UTF-8</literal>, not
+  <literal>utf8</literal>), so it is the safest in most
   cases to choose the canonical name for a particular locale. To determine
   the canonical name, run the following command, where <replaceable>&lt;locale
   name&gt;</replaceable> is the output given by <command>locale -a</command> for
-  your preferred locale (<quote>en_GB.iso88591</quote> in our example).</para>
+  your preferred locale (<literal>en_GB.iso88591</literal> in our
+  example).</para>
 
 <screen role="nodump"><userinput>LC_ALL=<replaceable>&lt;locale name&gt;</replaceable> locale charmap</userinput></screen>
 
-  <para>For the <quote>en_GB.iso88591</quote> locale, the above command
+  <para>For the <literal>en_GB.iso88591</literal> locale, the above command
   will print:</para>
 
 <screen><computeroutput>ISO-8859-1</computeroutput></screen>
 
-  <para>This results in a final locale setting of <quote>en_GB.ISO-8859-1</quote>.
+  <para>This results in a final locale setting of <literal>en_GB.ISO-8859-1</literal>.
   It is important that the locale found using the heuristic above is tested prior
   to it being added to the Bash startup files:</para>
 
@@ -90,66 +95,115 @@ LC_ALL=&lt;locale name&gt; locale int_prefix</userinput></screen>
   Further instructions assume that there are no such error messages from
   Glibc.</para>
 
-  <!-- FIXME: the xlib example will become obsolete in the future.-->
-  <para>Some packages beyond LFS may also lack support for your chosen locale. One
-  example is the X library (part of the X Window System), which outputs the
-  following error message if the locale does not exactly match one of the character
-  map names in its internal files:</para>
-
-<screen><computeroutput>Warning: locale not supported by Xlib, locale set to C</computeroutput></screen>
-
-  <para>In several cases Xlib expects that the character map will be listed in
-  uppercase notation with canonical dashes. For instance, "ISO-8859-1" rather
-  than "iso88591". It is also  possible to find an appropriate specification by
-  removing the charmap part of the locale specification.  This can be checked
-  by running the <command>locale charmap</command> command in both locales.
-  For example, one would have to change "de_DE.ISO-8859-15@euro" to
-  "de_DE@euro" in order to get this locale recognized by Xlib.</para>
-
   <para>Other packages can also function incorrectly (but may not necessarily
   display any error messages) if the locale name does not meet their expectations.
   In those cases, investigating how other Linux distributions support your locale
   might provide some useful information.</para>
 
-  <para>Once the proper locale settings have been determined, create the
-  <filename>/etc/locale.conf</filename> file:</para>
+  <para revision='systemd'>Once the proper locale settings have been
+  determined, create the <filename>/etc/locale.conf</filename> file:</para>
 
-<screen><userinput>cat &gt; /etc/locale.conf &lt;&lt; "EOF"
+<screen revision='systemd'><userinput>cat &gt; /etc/locale.conf &lt;&lt; "EOF"
 <literal>LANG=<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable></literal>
 EOF</userinput></screen>
 
-  <para>Note that you can modify <filename>/etc/locale.conf</filename> with the
+  <para>The shell program <command>/bin/bash</command> (here after referred
+  as <quote>the shell</quote>) uses a collection of startup files to help
+  create the environment to run in. Each file has a specific use and may
+  affect login and interactive environments differently. The files in the
+  <filename class="directory">/etc</filename> directory provide global
+  settings.  If equivalent files exist in the home directory, they
+  may override the global settings.</para>
+
+  <para>An interactive login shell is started after a successful login,
+  using <command>/bin/login</command>, by reading the
+  <filename>/etc/passwd</filename> file.  An interactive non-login shell is
+  started at the command-line (e.g.
+  <prompt>[prompt]$</prompt><command>/bin/bash</command>).  A
+  non-interactive shell is usually present when a shell script is running.
+  It is non-interactive because it is processing a script and not waiting
+  for user input between commands.</para>
+
+  <para><phrase revision='systemd'>The login shells are often unaffected by
+  the settings in <filename>/etc/locale.conf</filename>. </phrase>Create the
+  <filename>/etc/profile</filename>
+  <phrase revision='sysv'>once the proper locale settings have been
+  determined to set the desired locale</phrase><phrase
+  revision='systemd'>to read the locale settings from
+  <filename>/etc/locale.conf</filename> and export them</phrase>,
+  but set the <literal>C.UTF-8</literal> locale instead if running in the Linux
+  console (to prevent programs from outputting characters that the Linux
+  console is unable to render):</para>
+
+<screen revision="systemd"><userinput>cat &gt; /etc/profile &lt;&lt; "EOF"
+<literal># Begin /etc/profile
+
+for i in $(locale); do
+  unset ${i%=*}
+done
+
+if [[ "$TERM" = linux ]]; then
+  export LANG=C.UTF-8
+else
+  source /etc/locale.conf
+
+  for i in $(locale); do
+    key=${i%=*}
+    if [[ -v $key ]]; then
+      export $key
+    fi
+  done
+fi
+
+# End /etc/profile</literal>
+EOF</userinput></screen>
+
+<screen revision="sysv"><userinput>cat &gt; /etc/profile &lt;&lt; "EOF"
+<literal># Begin /etc/profile
+
+for i in $(locale); do
+  unset ${i%=*}
+done
+
+if [[ "$TERM" = linux ]]; then
+  export LANG=C.UTF-8
+else
+  export LANG=<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable>
+fi
+
+# End /etc/profile</literal>
+EOF</userinput></screen>
+
+  <para revision='systemd'>Note that you can modify <filename>/etc/locale.conf</filename> with the
   systemd <command>localectl</command> utility. To use
   <command>localectl</command> for the example above, run:</para>
 
-<screen role="nodump"><userinput>localectl set-locale LANG="<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable>"</userinput></screen>
+<screen revision='systemd' role="nodump"><userinput>localectl set-locale LANG="<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable>"</userinput></screen>
 
-  <para>You can also specify other language specific environment variables such
-  as <envar>LANG</envar>, <envar>LC_CTYPE</envar>, <envar>LC_NUMERIC</envar> or
-  any other environment variable from <command>locale</command> output. Just
-  separate them with a space. An example where <envar>LANG</envar> is set as
+  <para revision='systemd'>You can also specify other language specific
+  environment variables such as <envar>LANG</envar>,
+  <envar>LC_CTYPE</envar>, <envar>LC_NUMERIC</envar> or any other
+  environment variable from <command>locale</command> output. Just separate
+  them with a space. An example where <envar>LANG</envar> is set as
   en_US.UTF-8 but <envar>LC_CTYPE</envar> is set as just en_US is:</para>
 
-<screen role="nodump"><userinput>localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"</userinput></screen>
+<screen revision='systemd' role="nodump"><userinput>localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"</userinput></screen>
 
-  <note><para>Please note that the <command>localectl</command> command
-  doesn't work in the chroot environment.  It can only
-  be used after the LFS system is booted with systemd.</para></note>
+  <note revision='systemd'><para>Please note that the
+  <command>localectl</command> command doesn't work in the chroot
+  environment.  It can only be used after the LFS system is booted with
+  systemd.</para></note>
 
-  <para>The <quote>C</quote> (default) and <quote>en_US</quote> (the recommended
-  one for United States English users) locales are different. <quote>C</quote>
+  <para>The <literal>C</literal> (default) and <literal>en_US</literal>
+  (the recommended one for United States English users) locales are
+  different. <literal>C</literal>
   uses the US-ASCII 7-bit character set, and treats bytes with the high bit set
   as invalid characters. That's why, e.g., the <command>ls</command> command
   substitutes them with question marks in that locale. Also, an attempt to send
   mail with such characters from Mutt or Pine results in non-RFC-conforming
-  messages being sent (the charset in the outgoing mail is indicated as <quote>unknown
-  8-bit</quote>). It's suggested that you use the <quote>C</quote> locale only
+  messages being sent (the charset in the outgoing mail is indicated as
+  <computeroutput>unknown 8-bit</computeroutput>). It's suggested that you
+  use the <literal>C</literal> locale only
   if you are certain that you will never need 8-bit characters.</para>
 
-<!--
-  <para>UTF-8 based locales are not supported well by many programs.
-  Work is in progress to document and, if possible, fix such problems, see
-  <ulink url="&blfs-book;introduction/locale-issues.html"/>.</para>
--->
-
 </sect1>
diff --git a/chapter09/network.xml b/chapter09/network.xml
index f8b549eff..a443ada2c 100644
--- a/chapter09/network.xml
+++ b/chapter09/network.xml
@@ -62,9 +62,9 @@ EOF</userinput></screen>
     <para>The values in italics must be changed in each file, to set
     the interfaces up correctly.</para>
 
-    <para>If the <envar>ONBOOT</envar> variable is set to <quote>yes</quote> the
+    <para>If the <envar>ONBOOT</envar> variable is set to <literal>yes</literal> the
     System V network script will bring up the Network Interface Card (NIC) during
-    the system boot process. If set to anything besides <quote>yes</quote>, the NIC
+    the system boot process. If set to anything besides <literal>yes</literal>, the NIC
     will be ignored by the network script and will not be started automatically.
     Interfaces can be manually started or stopped with the
     <command>ifup</command> and <command>ifdown</command> commands.</para>
diff --git a/chapter09/networkd.xml b/chapter09/networkd.xml
index 19a1f7c01..6c2935de1 100644
--- a/chapter09/networkd.xml
+++ b/chapter09/networkd.xml
@@ -50,9 +50,11 @@
     <filename class="extension">.netdev</filename> and
     <filename class="extension">.network</filename> files. For detailed
     descriptions and example contents of these configuration files, consult
-    the <filename>systemd-link(5)</filename>,
-    <filename>systemd-netdev(5)</filename> and
-    <filename>systemd-network(5)</filename> manual pages.</para>
+    the <ulink role='man' url='&man;systemd-link.5'>systemd-link(5)</ulink>,
+    <ulink role='man' url='&man;systemd-netdev.5'>systemd-netdev(5)</ulink>,
+    and <ulink role='man'
+    url='&man;systemd-network.5'>systemd-network(5)</ulink> manual
+    pages.</para>
 
     <sect3 id="systemd-network-devices">
       <title>Network Device Naming</title>
@@ -89,18 +91,20 @@
       <itemizedlist>
         <listitem>
           <para>
-            Mask udev's .link file for the default policy:
+            Mask udev's <filename class='extension'>.link</filename> file
+            for the default policy:
 <screen role="nodump"><userinput>ln -s /dev/null /etc/systemd/network/99-default.link</userinput></screen>
           </para>
         </listitem>
 
         <listitem>
           <para>
-             Create a manual naming scheme, for example by naming the
-             interfaces something like "internet0", "dmz0", or "lan0".
-             To do that, create .link files in /etc/systemd/network/ that
-             select an explicit name or a better naming scheme for your
-             network interfaces. For example:
+            Create a manual naming scheme, for example by naming the
+            interfaces something like <literal>internet0</literal>,
+            <literal>dmz0</literal>, or <literal>lan0</literal>.
+            To do that, create <filename class='extension'>.link</filename>
+            files in /etc/systemd/network/ that select an explicit name or a
+            better naming scheme for your network interfaces. For example:
           </para>
 
 <screen role="nodump"><userinput>cat &gt; /etc/systemd/network/10-ether0.link &lt;&lt; "EOF"
@@ -113,7 +117,7 @@ Name=ether0</literal>
 EOF</userinput></screen>
 
           <para>
-            See <filename>systemd.link(5)</filename> for more information.
+            See <ulink role='man' url='&man;systemd.link.5'>systemd.link(5)</ulink> for more information.
           </para>
         </listitem>
 
@@ -357,7 +361,9 @@ EOF</userinput></screen>
      <literal>localhost.localdomain</literal>, or the hostname (without a
      domain) because they are handled by the
      <systemitem class='library'>myhostname</systemitem> NSS module, read
-     the man page <filename>nss-myhostname(8)</filename> for details.</para>
+     the man page <ulink role='man'
+     url='&man;nss-myhostname.8'>nss-myhostname(8)</ulink> for
+     details.</para>
 
      <para>The ::1 entry is the IPv6 counterpart of 127.0.0.1 and represents
      the IPv6 loopback interface.</para>
diff --git a/chapter09/profile.xml b/chapter09/profile.xml
deleted file mode 100644
index 8f0f59d1f..000000000
--- a/chapter09/profile.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
-  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-  <!ENTITY % general-entities SYSTEM "../general.ent">
-  %general-entities;
-]>
-
-<sect1 id="ch-config-profile" revision="sysv">
-  <?dbhtml filename="profile.html"?>
-
-  <title>The Bash Shell Startup Files</title>
-
-  <indexterm zone="ch-config-profile">
-    <primary sortas="e-/etc/profile">/etc/profile</primary>
-  </indexterm>
-
-  <para>The shell program <command>/bin/bash</command> (hereafter referred to
-  as <quote>the shell</quote>) uses a collection of startup files to help
-  create the environment to run in. Each file has a specific use and may affect
-  login and interactive environments differently. The files in the <filename
-  class="directory">/etc</filename> directory provide global settings. If
-  equivalent files exist in the home directory, they may override the global
-  settings.</para>
-
-  <para>An interactive login shell is started after a successful login, using
-  <command>/bin/login</command>, by reading the <filename>/etc/passwd</filename>
-  file. An interactive non-login shell is started at the command-line (e.g.,
-  <prompt>[prompt]$</prompt><command>/bin/bash</command>). A non-interactive
-  shell is usually present when a shell script is running. It is non-interactive
-  because it is processing a script and not waiting for user input between
-  commands.</para>
-
-<para>For more information, see the <emphasis>Bash Startup Files</emphasis> and
-  <emphasis>Interactive Shells</emphasis> sections in the <emphasis>Bash 
-  Features</emphasis> chapter of the Bash info pages (<command>info bash</command>).</para>
-
-  <para>The files <filename>/etc/profile</filename> and
-  <filename>~/.bash_profile</filename> are read when the shell is
-  invoked as an interactive login shell.</para>
-
-  <para>The base <filename>/etc/profile</filename> below sets some
-  environment variables necessary for native language support. Setting
-  them properly results in:</para>
-
-  <itemizedlist>
-    <listitem>
-      <para>The output of programs translated into the native language</para>
-    </listitem>
-    <listitem>
-      <para>Correct classification of characters into letters, digits and other
-      classes. This is necessary for <command>bash</command> to properly accept
-      non-ASCII characters in command lines in non-English locales</para>
-    </listitem>
-    <listitem>
-      <para>The correct alphabetical sorting order for the country</para>
-    </listitem>
-    <listitem>
-      <para>Appropriate default paper size</para>
-    </listitem>
-    <listitem>
-      <para>Correct formatting of monetary, time, and date values</para>
-    </listitem>
-  </itemizedlist>
-
-  <para>Replace <replaceable>&lt;ll&gt;</replaceable> below with the two-letter code
-  for the desired language (e.g., <quote>en</quote>) and
-  <replaceable>&lt;CC&gt;</replaceable> with the two-letter code for the appropriate
-  country (e.g., <quote>GB</quote>). <replaceable>&lt;charmap&gt;</replaceable> should
-  be replaced with the canonical charmap for your chosen locale. Optional
-  modifiers such as <quote>@euro</quote> may also be present.</para>
-
-  <para>The list of all locales supported by Glibc can be obtained by running
-  the following command:</para>
-
-<screen role="nodump"><userinput>locale -a</userinput></screen>
-
-  <para>Charmaps can have a number of aliases, e.g., <quote>ISO-8859-1</quote>
-  is also referred to as <quote>iso8859-1</quote> and <quote>iso88591</quote>.
-  Some applications cannot handle the various synonyms correctly (e.g., require
-  that <quote>UTF-8</quote> is written as <quote>UTF-8</quote>, not
-  <quote>utf8</quote>), so it is safest in most
-  cases to choose the canonical name for a particular locale. To determine
-  the canonical name, run the following command, where <replaceable>&lt;locale
-  name&gt;</replaceable> is the output given by <command>locale -a</command> for
-  your preferred locale (<quote>en_GB.iso88591</quote> in our example).</para>
-
-<screen role="nodump"><userinput>LC_ALL=<replaceable>&lt;locale name&gt;</replaceable> locale charmap</userinput></screen>
-
-  <para>For the <quote>en_GB.iso88591</quote> locale, the above command
-  will print:</para>
-
-<screen><computeroutput>ISO-8859-1</computeroutput></screen>
-
-  <para>This results in a final locale setting of <quote>en_GB.ISO-8859-1</quote>.
-  It is important that the locale found using the heuristic above is tested before
-  it is added to the Bash startup files:</para>
-
-<screen role="nodump"><userinput>LC_ALL=&lt;locale name&gt; locale language
-LC_ALL=&lt;locale name&gt; locale charmap
-LC_ALL=&lt;locale name&gt; locale int_curr_symbol
-LC_ALL=&lt;locale name&gt; locale int_prefix</userinput></screen>
-
-  <para>The above commands should print the language name, the character
-  encoding used by the locale, the local currency, and the prefix to dial
-  before the telephone number in order to get into the country. If any of the
-  commands above fail with a message similar to the one shown below, this means
-  that your locale was either not installed in <xref linkend="ch-system-glibc"/>
-  or is not supported by the default installation of Glibc.</para>
-
-<screen><computeroutput>locale: Cannot set LC_* to default locale: No such file or directory</computeroutput></screen>
-
-  <para>If this happens, you should either install the desired locale using the
-  <command>localedef</command> command, or consider choosing a different locale.
-  Further instructions assume that there are no such error messages from
-  Glibc.</para>
-
-  <!-- FIXME: the xlib example will became obsolete real soon -->
-  <!--<para>Some packages beyond LFS may also lack support for your chosen locale. One
-  example is the X library (part of the X Window System), which outputs the
-  following error message if the locale does not exactly match one of the character
-  map names in its internal files:</para>
-
-<screen><computeroutput>Warning: locale not supported by Xlib, locale set to C</computeroutput></screen>
-
-  <para>In several cases Xlib expects that the character map will be listed in
-  uppercase notation with canonical dashes. For instance, "ISO-8859-1" rather
-  than "iso88591". It is also  possible to find an appropriate specification by
-  removing the charmap part of the locale specification.  This can be checked
-  by running the <command>locale charmap</command> command in both locales.
-  For example, one would have to change "de_DE.ISO-8859-15@euro" to
-  "de_DE@euro" in order to get this locale recognized by Xlib.</para>
--->
-  <para>Other packages may also function incorrectly (but will not necessarily
-  display any error messages) if the locale name does not meet their expectations.
-  In such cases, investigating how other Linux distributions support your locale
-  might provide some useful information.</para>
-
-  <para>Once the proper locale settings have been determined, create the
-  <filename>/etc/profile</filename> file:</para>
-
-<screen><userinput>cat &gt; /etc/profile &lt;&lt; "EOF"
-<literal># Begin /etc/profile
-
-export LANG=<replaceable>&lt;ll&gt;_&lt;CC&gt;.&lt;charmap&gt;&lt;@modifiers&gt;</replaceable>
-
-# End /etc/profile</literal>
-EOF</userinput></screen>
-
-  <para>The <quote>C</quote> (default) and <quote>en_US.utf8</quote> (the recommended
-  one for United States English users) locales are different. <quote>C</quote>
-  uses the US-ASCII 7-bit character set, and treats bytes with the high-order bit set
-  <quote>on</quote> as invalid characters. That's why, e.g., the <command>ls</command> command
-  displays them as question marks in that locale. Also, an attempt to send
-  mail with such characters from Mutt or Pine results in non-RFC-conforming
-  messages being sent (the charset in the outgoing mail is indicated as <quote>unknown
-  8-bit</quote>). So you can only use the <quote>C</quote> locale if you are sure
-  you will never need 8-bit characters.</para>
-
-  <para>UTF-8 based locales are not supported well by some programs.
-  Work is in progress to document and, if possible, fix such problems. See
-  <ulink url="&blfs-book;introduction/locale-issues.html"/>.</para>
-
-</sect1>
diff --git a/chapter09/systemd-custom.xml b/chapter09/systemd-custom.xml
index 81a94a148..ffca1a76f 100644
--- a/chapter09/systemd-custom.xml
+++ b/chapter09/systemd-custom.xml
@@ -21,8 +21,9 @@
     of options to control basic systemd operations. The default file has all
     entries commented out with the default settings indicated. This file is
     where the log level may be changed as well as some basic logging settings.
-    See the <filename>systemd-system.conf(5)</filename> manual page for details
-    on each configuration option.</para>
+    See the <ulink role='man'
+    url='&man;systemd-system.conf.5'>systemd-system.conf(5)</ulink> manual
+    page for details on each configuration option.</para>
 
   </sect2>
 
@@ -89,8 +90,8 @@ EOF</userinput></screen>
     <filename class="directory">/etc/tmpfiles.d</filename> override
     files with the same name in
     <filename class="directory">/usr/lib/tmpfiles.d</filename>. See
-    <filename>tmpfiles.d(5)</filename> manual page for file format
-    details.</para>
+    <ulink role='man' url='&man;tmpfiles.d.5'>tmpfiles.d(5)</ulink> manual
+    page for file format details.</para>
 
     <para>
       Note that the syntax for the
@@ -135,7 +136,8 @@ Restart=always
 RestartSec=30</literal>
 EOF</userinput></screen>
 
-     <para>See <filename>systemd.unit(5)</filename> manual page for more
+     <para>See <ulink role='man'
+     url='&man;systemd.unit.5'>systemd.unit(5)</ulink> manual page for more
      information. After creating the configuration file, run
      <userinput>systemctl daemon-reload</userinput> and <userinput>systemctl
      restart foobar</userinput> to activate the changes to a service.</para>
@@ -251,10 +253,11 @@ cat &gt; /etc/systemd/coredump.conf.d/maxuse.conf &lt;&lt; EOF
 MaxUse=5G</literal>
 EOF</userinput></screen>
 
-    <para>See the <filename>systemd-coredump(8)</filename>,
-    <filename>coredumpctl(1)</filename>, and
-    <filename>coredump.conf.d(5)</filename> manual pages for more
-    information.</para>
+    <para>See the <ulink role='man' url='&man;systemd-coredump.8'>systemd-coredump(8)</ulink>,
+    <ulink role='man' url='&man;coredumpctl.1'>coredumpctl(1)</ulink>, and
+    <ulink role='man'
+    url='&man;coredump.conf.d.5'>coredump.conf.d(5)</ulink> manual pages for
+    more information.</para>
   </sect2>
 
   <sect2>
diff --git a/chapter09/udev.xml b/chapter09/udev.xml
index 0fba5a8b4..06db345a2 100644
--- a/chapter09/udev.xml
+++ b/chapter09/udev.xml
@@ -129,13 +129,13 @@
       program and are usually related to the bus-specific identifiers of devices
       supported by a module. For example, the <emphasis>snd-fm801</emphasis>
       driver supports PCI devices with vendor ID 0x1319 and device ID 0x0801,
-      and has an alias of <quote>pci:v00001319d00000801sv*sd*bc04sc01i*</quote>.
+      and has an alias of <literal>pci:v00001319d00000801sv*sd*bc04sc01i*</literal>.
       For most devices, the bus driver exports the alias of the driver that
       would handle the device via <systemitem
       class="filesystem">sysfs</systemitem>. E.g., the
       <filename>/sys/bus/pci/devices/0000:00:0d.0/modalias</filename> file
       might contain the string
-      <quote>pci:v00001319d00000801sv00001319sd00001319bc04sc01i00</quote>.
+      <literal>pci:v00001319d00000801sv00001319sd00001319bc04sc01i00</literal>.
       The default rules provided with udev will cause <command>udevd</command>
       to call out to <command>/sbin/modprobe</command> with the contents of the
       <envar>MODALIAS</envar> uevent environment variable (which should be the
@@ -225,8 +225,9 @@
       <para>Note that the <quote>softdep</quote> command also allows
       <literal>pre:</literal> dependencies, or a mixture of both
       <literal>pre:</literal> and <literal>post:</literal> dependencies.  See
-      the <filename>modprobe.d(5)</filename> manual page for more information
-      on <quote>softdep</quote> syntax and capabilities.</para>
+      the <ulink role='man' url='&man;modprobe.d.5'>modprobe.d(5)</ulink>
+      manual page for more information on <quote>softdep</quote> syntax and
+      capabilities.</para>
 
       <para revision="sysv">If the module in question is not a wrapper and is
       useful by itself, configure the <command>modules</command> bootscript to
@@ -300,7 +301,7 @@
 
       <para>This is due to the fact that udev, by design, handles uevents and
       loads modules in parallel, and thus in an unpredictable order. This will
-      never be <quote>fixed</quote>. You should not rely upon the kernel device
+      never be <quote>fixed.</quote> You should not rely upon the kernel device
       names being stable. Instead, create your own rules that make symlinks with
       stable names based on some stable attributes of the device, such as a
       serial number or the output of various *_id utilities installed by udev.
diff --git a/chapter09/usage.xml b/chapter09/usage.xml
index 1fc7189d6..6b5441bba 100644
--- a/chapter09/usage.xml
+++ b/chapter09/usage.xml
@@ -32,7 +32,8 @@
     <para>SysVinit (which will be referred to as <quote>init</quote> from now on)
     uses a run levels scheme. There are seven run levels, numbered 0 to 6.
     (Actually, there are more run levels, but the others are for special cases and are
-    generally not used. See <filename>init(8)</filename> for more details.)
+    generally not used. See <ulink role='man'
+    url='&man;init.8'>init(8)</ulink> for more details.)
     Each one of the seven corresponds to actions the computer is supposed to
     perform when it starts up or shuts down. The default run level is 3. Here are the
     descriptions of the different run levels as they are implemented in LFS:</para>
@@ -47,11 +48,11 @@
 
     <note>
        <para>
-          Classically, run level 2 above was defined as
-          "multi-user mode without networking", but this was only the case
-          many years ago when multiple users could connect to a system via
-          serial ports.  In today's environment it makes no sense, and
-          we now say it is "reserved".
+         Classically, run level 2 above was defined as <quote>multi-user
+         mode without networking,</quote> but this was only the case
+         many years ago when multiple users could connect to a system via
+         serial ports.  In today's environment it makes no sense, and
+         we now say it is <quote>reserved.</quote>
        </para>
     </note>
 
@@ -341,12 +342,13 @@ EOF</userinput></screen>
   url="https://tldp.org/HOWTO/HOWTO-INDEX/other-lang.html"/>. If still in
   doubt, look in the <filename class="directory">/usr/share/keymaps</filename>
   and <filename class="directory">/usr/share/consolefonts</filename> directories
-  for valid keymaps and screen fonts. Read the <filename>loadkeys(1)</filename> and
-  <filename>setfont(8)</filename> manual pages to determine the correct
-  arguments for these programs.</para>
+  for valid keymaps and screen fonts. Read the <ulink role='man'
+  url='&man;loadkeys.1'>loadkeys(1)</ulink> and <ulink role='man'
+  url='&man;setfont.8'>setfont(8)</ulink> manual pages to determine the
+  correct arguments for these programs.</para>
 
   <para>The <filename>/etc/sysconfig/console</filename> file should contain lines
-  of the form: VARIABLE="value". The following variables are recognized:</para>
+  of the form: <envar>VARIABLE=value</envar>. The following variables are recognized:</para>
   <variablelist>
 
     <varlistentry>
@@ -354,7 +356,7 @@ EOF</userinput></screen>
       <listitem>
         <para>This variable specifies the log level for kernel messages sent
         to the console as set by <command>dmesg -n</command>. Valid levels are
-        from "1" (no messages) to "8". The default level is "7".</para>
+        from <literal>1</literal> (no messages) to <literal>8</literal>. The default level is <literal>7</literal>, which is quite verbose.</para>
       </listitem>
     </varlistentry>
 
@@ -363,7 +365,7 @@ EOF</userinput></screen>
       <listitem>
         <para>This variable specifies the arguments for the
         <command>loadkeys</command> program, typically, the name of the keymap
-        to load, e.g., <quote>it</quote>. If this variable is not set, the
+        to load, e.g., <literal>it</literal>. If this variable is not set, the
         bootscript will not run the <command>loadkeys</command> program,
         and the default kernel keymap will be used.  Note that a few keymaps
         have multiple versions with the same name (cz and its variants in
@@ -382,7 +384,7 @@ EOF</userinput></screen>
         <command>loadkeys</command> program. This is useful if the stock keymap
         is not completely satisfactory and a small adjustment has to be made. E.g.,
         to include the Euro sign into a keymap that normally doesn't have it,
-        set this variable to <quote>euro2</quote>.</para>
+        set this variable to <literal>euro2</literal>.</para>
       </listitem>
     </varlistentry>
 
@@ -391,12 +393,12 @@ EOF</userinput></screen>
       <listitem>
         <para>This variable specifies the arguments for the
         <command>setfont</command> program. Typically, this includes the font
-        name, <quote>-m</quote>, and the name of the application character
+        name, <literal>-m</literal>, and the name of the application character
         map to load. E.g., in order to load the <quote>lat1-16</quote> font
         together with the <quote>8859-1</quote> application character map
         (appropriate in the USA),
         <!-- because of the copyright sign -->
-        set this variable to <quote>lat1-16 -m 8859-1</quote>.
+        set this variable to <literal>lat1-16 -m 8859-1</literal>.
         In UTF-8 mode, the kernel uses the application character map to
         convert 8-bit key codes to UTF-8. Therefore
         the argument of the "-m" parameter should be set to the encoding of the
@@ -408,8 +410,8 @@ EOF</userinput></screen>
     <varlistentry>
       <term>UNICODE</term>
       <listitem>
-        <para>Set this variable to <quote>1</quote>, <quote>yes</quote>, or
-        <quote>true</quote> in order to put the
+        <para>Set this variable to <literal>1</literal>, <literal>yes</literal>, or
+        <literal>true</literal> in order to put the
         console into UTF-8 mode. This is useful in UTF-8 based locales and
         harmful otherwise.</para>
       </listitem>
@@ -430,6 +432,40 @@ EOF</userinput></screen>
   <para>Some examples:</para>
 
   <itemizedlist>
+    <listitem>
+      <para>
+        We'll use <literal>C.UTF-8</literal> as the locale for interactive
+        sessions in the Linux console in <xref role=','
+        linkend='ch-config-locale'/> so we should set
+        <literal>UNICODE</literal> to <literal>1</literal>.  And the console
+        fonts shipped by the <application>Kbd</application> package
+        containing the glyphs for all characters from the program messages
+        in the <literal>C.UTF-8</literal> locale are
+        <filename>LatArCyrHeb*.psfu.gz</filename>,
+        <filename>LatGrkCyr*.psfu.gz</filename>,
+        <filename>Lat2-Terminus16.psfu.gz</filename>, and
+        <filename>pancyrillic.f16.psfu.gz</filename> in
+        <filename class='directory'>/usr/share/consolefonts</filename> (the
+        other shipped console fonts lack glyphs of some characters like the
+        Unicode left/right quotation marks and the Unicode English dash).
+        So set one of them, for example
+        <filename>Lat2-Terminus16.psfu.gz</filename> as the default console
+        font:
+      </para>
+
+      <!-- We are using 'nodump' for the generic setting, but not for an
+           example (see below).  This is deliberate to keep the
+           compatibility with jhalfs.  -->
+<screen role='nodump'><userinput>cat &gt; /etc/sysconfig/console &lt;&lt; "EOF"
+<literal># Begin /etc/sysconfig/console
+
+UNICODE="1"
+FONT="Lat2-Terminus16"
+
+# End /etc/sysconfig/console</literal>
+EOF</userinput></screen>
+
+    </listitem>
 
     <listitem>
       <para>For a non-Unicode setup, only the KEYMAP and FONT variables are
@@ -524,7 +560,7 @@ EOF</userinput></screen>
       languages, because there accents are added to unaccented ASCII
       characters, or two ASCII characters are composed together. However, in
       UTF-8 mode it is a problem; e.g., for the Greek language, where one
-      sometimes needs to put an accent on the letter <quote>alpha</quote>.
+      sometimes needs to put an accent on the letter α.
       The solution is either to avoid the use of UTF-8, or to install the
       X window system, which doesn't have this limitation, in its input
       handling.</para>
diff --git a/chapter10/fstab.xml b/chapter10/fstab.xml
index c20f806dd..ad835be30 100644
--- a/chapter10/fstab.xml
+++ b/chapter10/fstab.xml
@@ -56,7 +56,7 @@ EOF</userinput></screen>
   class="partition">sda2</filename>, <filename
   class="partition">sda5</filename>, and <systemitem
   class="filesystem">ext4</systemitem>. For details on the six
-  fields in this file, see <filename>fstab(5)</filename>.</para>
+  fields in this file, see <ulink role='man' url='&man;fstab.5'>fstab(5)</ulink>.</para>
 
   <para>Filesystems with MS-DOS or Windows origin (i.e. vfat, ntfs, smbfs,
   cifs, iso9660, udf) need a special option, utf8, in order for non-ASCII
diff --git a/chapter10/grub.xml b/chapter10/grub.xml
index 0b6e46248..8eca69a1e 100644
--- a/chapter10/grub.xml
+++ b/chapter10/grub.xml
@@ -190,17 +190,6 @@ umount /sys/firmware/efi/efivars</userinput></screen>
       </para>
     </note>
 
-<!-- This does not seem to be true any more
-    <note><para><application>grub-install</application> is a script and calls another
-    program, grub-probe, that may fail with a message "cannot stat `/dev/root'".
-    If so, create a temporary symbolic link from your root partition to /dev/root:</para>
-
-<screen role="nodump"><userinput>ln -sv /dev/sda2 /dev/root</userinput></screen>
-
-    <para>The symbolic link will only be present until the system is rebooted.
-    The link is only needed for the installation procedure.
-    </para></note>
--->
   </sect2>
 
   <sect2 id="grub-cfg">
diff --git a/chapter10/kernel.xml b/chapter10/kernel.xml
index 4fa873114..47ca09029 100644
--- a/chapter10/kernel.xml
+++ b/chapter10/kernel.xml
@@ -87,7 +87,7 @@
     un-tarring.</para>
 
     <para>There are several ways to configure the kernel options. Usually,
-    This is done through a menu-driven interface, for example:</para>
+    this is done through a menu-driven interface, for example:</para>
 
 <screen role="nodump"><userinput>make menuconfig</userinput></screen>
 
@@ -304,7 +304,8 @@
     located in <xref linkend="ch-config-udev"/> and in the kernel
     documentation in the <filename
     class="directory">linux-&linux-version;/Documentation</filename> directory.
-    Also, <filename>modprobe.d(5)</filename> may be of interest.</para>
+    Also, <ulink role='man' url='&man;modprobe.d.5'>modprobe.d(5)</ulink>
+    may be of interest.</para>
 
     <para>Unless module support has been disabled in the kernel configuration,
     install the modules with:</para>
diff --git a/chapter11/afterlfs.xml b/chapter11/afterlfs.xml
index ff8bae006..633a782df 100644
--- a/chapter11/afterlfs.xml
+++ b/chapter11/afterlfs.xml
@@ -130,7 +130,7 @@ mounttype proc    proc   proc
 mounttype sys     sysfs  sysfs
 mounttype run     tmpfs  run
 if [ -h $LFS/dev/shm ]; then
-  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
+  install -v -d -m 1777 $LFS$(realpath /dev/shm)
 else
   mounttype dev/shm tmpfs tmpfs -o nosuid,nodev
 fi 
diff --git a/general.ent b/general.ent
index 0540ac6c2..cad537e5b 100644
--- a/general.ent
+++ b/general.ent
@@ -92,9 +92,9 @@
 <!ENTITY test-results    "&lfs-root;lfs/build-logs/&generic-version;/">
 <!ENTITY secadv          "&lfs-root;lfs/advisories/">
 
-<!-- 4.14 EOL is Jan 2024
-     so for LFS 11.5 we may consider moving to 4.19 -->
-<!ENTITY min-kernel      "4.14">
+<!-- 4.19 EOL is Dec 2024
+     so for LFS 12.3 we may consider moving to 5.4 -->
+<!ENTITY min-kernel      "4.19">
 
 <!--
 <!ENTITY patches-rootd   "&lfs-root;patches/lfs/&generic-versiond;/">
@@ -125,6 +125,7 @@
 <!ENTITY github          "https://github.com">
 <!ENTITY pypi-home       "https://pypi.org/project">
 <!ENTITY pypi-src        "https://pypi.org/packages/source">
+<!ENTITY man             "https://man.archlinux.org/man/">
 
 <!ENTITY root            "<systemitem class='username'>root</systemitem>">
 <!ENTITY lfs-user        "<systemitem class='username'>lfs</systemitem>">
diff --git a/lfs-latest-git.php b/lfs-latest-git.php
index 162d8d6c8..c2414789a 100644
--- a/lfs-latest-git.php
+++ b/lfs-latest-git.php
@@ -152,6 +152,7 @@ if ( $package == "tcl"        ) $dirpath = "https://www.tcl.tk/software/tcltk/do
 if ( $package == "util-linux" ) $dirpath = max_parent( $dirpath, "v." );
 if ( $package == "vim"        ) $dirpath = "https://github.com/vim/vim/tags";
 if ( $package == "wheel"      ) $dirpath = "https://pypi.org/project/wheel/#files";
+if ( $package == "xz"         ) $dirpath = github("tukaani-project/xz");
 if ( $package == "zlib"       ) $dirpath = "https://www.zlib.net";
 if ( $package == "zstd"       ) $dirpath = github("facebook/zstd");
 
diff --git a/packages.ent b/packages.ent
index fba1f5405..b085c0c5e 100644
--- a/packages.ent
+++ b/packages.ent
@@ -13,12 +13,12 @@
      *-knl-*     Package info for Kernel stuff
 -->
 
-<!ENTITY acl-version "2.3.1">
-<!ENTITY acl-size "348 KB">
+<!ENTITY acl-version "2.3.2">
+<!ENTITY acl-size "363 KB">
 <!ENTITY acl-url "&savannah;/releases/acl/acl-&acl-version;.tar.xz">
-<!ENTITY acl-md5 "95ce715fe09acca7c12d3306d0f076b2">
+<!ENTITY acl-md5 "590765dee95907dbc3c856f7255bd669">
 <!ENTITY acl-home "&savannah-nongnu;/projects/acl">
-<!ENTITY acl-fin-du "6.1 MB">
+<!ENTITY acl-fin-du "6.3 MB">
 <!ENTITY acl-fin-sbu "less than 0.1 SBU">
 
 <!ENTITY attr-version "2.5.2">
@@ -26,7 +26,7 @@
 <!ENTITY attr-url "&savannah;/releases/attr/attr-&attr-version;.tar.gz">
 <!ENTITY attr-md5 "227043ec2f6ca03c0948df5517f9c927">
 <!ENTITY attr-home "&savannah-nongnu;/projects/attr">
-<!ENTITY attr-fin-du "4.1 MB">
+<!ENTITY attr-fin-du "4.2 MB">
 <!ENTITY attr-fin-sbu "less than 0.1 SBU">
 
 <!ENTITY autoconf-version "2.72">
@@ -34,8 +34,8 @@
 <!ENTITY autoconf-url "&gnu;autoconf/autoconf-&autoconf-version;.tar.xz">
 <!ENTITY autoconf-md5 "1be79f7106ab6767f18391c5e22be701">
 <!ENTITY autoconf-home "&gnu-software;autoconf/">
-<!ENTITY autoconf-fin-du "24 MB">
-<!ENTITY autoconf-fin-sbu-tests "6.0">
+<!ENTITY autoconf-fin-du "25 MB">
+<!ENTITY autoconf-fin-sbu-tests "0.5">
 <!ENTITY autoconf-fin-sbu "less than 0.1 SBU (about &autoconf-fin-sbu-tests; SBU with tests)">
 
 <!ENTITY automake-version "1.16.5">
@@ -44,8 +44,8 @@
 <!ENTITY automake-url "&gnu;automake/automake-&automake-version;.tar.xz">
 <!ENTITY automake-md5 "4017e96f89fca45ca946f1c5db6be714">
 <!ENTITY automake-home "&gnu-software;automake/">
-<!ENTITY automake-fin-du "114 MB">
-<!ENTITY automake-fin-sbu "less than 0.1 SBU (about 7.0 SBU with tests)">
+<!ENTITY automake-fin-du "115 MB">
+<!ENTITY automake-fin-sbu "less than 0.1 SBU (about 1.6 SBU with tests)">
 
 <!ENTITY bash-version "5.2.21">
 <!ENTITY bash-size "10,696 KB">
@@ -55,24 +55,24 @@
 <!ENTITY bash-tmp-du "67 MB">
 <!ENTITY bash-tmp-sbu "0.2 SBU">
 <!ENTITY bash-fin-du "52 MB">
-<!ENTITY bash-fin-sbu "1.1 SBU">
+<!ENTITY bash-fin-sbu "1.2 SBU">
 
 <!ENTITY bc-version "6.7.5">
 <!ENTITY bc-size "460 KB">
 <!ENTITY bc-url "https://github.com/gavinhoward/bc/releases/download/&bc-version;/bc-&bc-version;.tar.xz">
 <!ENTITY bc-md5 "e249b1f86f886d6fb71c15f72b65dd3d">
 <!ENTITY bc-home "https://git.gavinhoward.com/gavin/bc">
-<!ENTITY bc-fin-du "7.7 MB">
+<!ENTITY bc-fin-du "7.8 MB">
 <!ENTITY bc-fin-sbu "less than 0.1 SBU">
 
-<!ENTITY binutils-version "2.41">
-<!ENTITY binutils-size "26,139 KB">
+<!ENTITY binutils-version "2.42">
+<!ENTITY binutils-size "26,922 KB">
 <!ENTITY binutils-url "https://sourceware.org/pub/binutils/releases/binutils-&binutils-version;.tar.xz">
-<!ENTITY binutils-md5 "256d7e0ad998e423030c84483a7c1e30">
+<!ENTITY binutils-md5 "a075178a9646551379bfb64040487715">
 <!ENTITY binutils-home "&gnu-software;binutils/">
-<!ENTITY binutils-tmpp1-du "647 MB">
+<!ENTITY binutils-tmpp1-du "663 MB">
 <!ENTITY binutils-tmpp1-sbu "1 SBU">
-<!ENTITY binutils-tmpp2-du "523 MB">
+<!ENTITY binutils-tmpp2-du "537 MB">
 <!ENTITY binutils-tmpp2-sbu "0.5 SBU">
 <!ENTITY binutils-fin-du "2.7 GB">
 <!ENTITY binutils-fin-sbu "2.2 SBU">
@@ -86,7 +86,7 @@
 <!ENTITY bison-tmp-du "57 MB">
 <!ENTITY bison-tmp-sbu "0.2 SBU">
 <!ENTITY bison-fin-du "62 MB">
-<!ENTITY bison-fin-sbu "2.2 SBU">
+<!ENTITY bison-fin-sbu "2.3 SBU">
 
 <!ENTITY bzip2-version "1.0.8">
 <!ENTITY bzip2-size "792 KB">
@@ -109,10 +109,10 @@
 <!ENTITY coreutils-url "&gnu;coreutils/coreutils-&coreutils-version;.tar.xz">
 <!ENTITY coreutils-md5 "459e9546074db2834eefe5421f250025">
 <!ENTITY coreutils-home "&gnu-software;coreutils/">
-<!ENTITY coreutils-tmp-du "168 MB">
+<!ENTITY coreutils-tmp-du "173 MB">
 <!ENTITY coreutils-tmp-sbu "0.3 SBU">
-<!ENTITY coreutils-fin-du "165 MB">
-<!ENTITY coreutils-fin-sbu "0.9 SBU">
+<!ENTITY coreutils-fin-du "175 MB">
+<!ENTITY coreutils-fin-sbu "1/0 SBU">
 
 <!ENTITY dbus-version "1.14.10">
 <!ENTITY dbus-size "1,344 KB">
@@ -128,7 +128,7 @@
 <!ENTITY dejagnu-md5 "68c5208c58236eba447d7d6d1326b821">
 <!ENTITY dejagnu-home "&gnu-software;dejagnu/">
 <!ENTITY dejagnu-tmp-du "6.9 MB">
-<!ENTITY dejagnu-tmp-sbu "less than 0.1 SBU">
+<!ENTITY dejagnu-tmp-sbu "0.1 SBU">
 
 <!ENTITY diffutils-version "3.10">
 <!ENTITY diffutils-size "1,587 KB">
@@ -146,22 +146,22 @@
 <!ENTITY e2fsprogs-md5 "6b4f18a33873623041857b4963641ee9">
 <!ENTITY e2fsprogs-home "http://e2fsprogs.sourceforge.net/">
 <!ENTITY e2fsprogs-fin-du "95 MB">
-<!ENTITY e2fsprogs-fin-sbu "2.4 SBU on a spinning disk, 0.6 SBU on an SSD">
+<!ENTITY e2fsprogs-fin-sbu "2.4 SBU on a spinning disk, 0.4 SBU on an SSD">
 
 <!ENTITY elfutils-version "0.190"> <!-- libelf -->
 <!ENTITY elfutils-size "8,949 KB">
 <!ENTITY elfutils-url "https://sourceware.org/ftp/elfutils/&elfutils-version;/elfutils-&elfutils-version;.tar.bz2">
 <!ENTITY elfutils-md5 "79ad698e61a052bea79e77df6a08bc4b">
 <!ENTITY elfutils-home "https://sourceware.org/elfutils/">
-<!ENTITY elfutils-fin-du "122 MB">
+<!ENTITY elfutils-fin-du "124 MB">
 <!ENTITY elfutils-fin-sbu "0.3 SBU">
 
-<!ENTITY expat-version "2.5.0">
-<!ENTITY expat-size "450 KB">
+<!ENTITY expat-version "2.6.0">
+<!ENTITY expat-size "473 KB">
 <!ENTITY expat-url "&sourceforge;expat/expat-&expat-version;.tar.xz">
-<!ENTITY expat-md5 "ac6677b6d1b95d209ab697ce8b688704">
+<!ENTITY expat-md5 "bd169cb11f4b9bdfddadf9e88a5c4d4b">
 <!ENTITY expat-home "https://libexpat.github.io/">
-<!ENTITY expat-fin-du "12 MB">
+<!ENTITY expat-fin-du "13 MB">
 <!ENTITY expat-fin-sbu "0.1 SBU">
 
 <!ENTITY expect-version "5.45.4">
@@ -205,7 +205,7 @@
 <!ENTITY flit-core-url "&pypi-src;/f/flit-core/flit_core-&flit-core-version;.tar.gz">
 <!ENTITY flit-core-md5 "3bc52f1952b9a78361114147da63c35b">
 <!ENTITY flit-core-home "&pypi-home;/flit-core/">
-<!ENTITY flit-core-fin-du "1.7 MB">
+<!ENTITY flit-core-fin-du "1.6 MB">
 <!ENTITY flit-core-fin-sbu "less than 0.1 SBU">
 
 <!ENTITY gawk-version "5.3.0">
@@ -213,9 +213,9 @@
 <!ENTITY gawk-url "&gnu;gawk/gawk-&gawk-version;.tar.xz">
 <!ENTITY gawk-md5 "97c5a7d83f91a7e1b2035ebbe6ac7abd">
 <!ENTITY gawk-home "&gnu-software;gawk/">
-<!ENTITY gawk-tmp-du "48 MB">
+<!ENTITY gawk-tmp-du "47 MB">
 <!ENTITY gawk-tmp-sbu "0.1 SBU">
-<!ENTITY gawk-fin-du "46 MB">
+<!ENTITY gawk-fin-du "42 MB">
 <!ENTITY gawk-fin-sbu "0.1 SBU">
 
 <!ENTITY gcc-version "13.2.0">
@@ -223,10 +223,10 @@
 <!ENTITY gcc-url "&gnu;gcc/gcc-&gcc-version;/gcc-&gcc-version;.tar.xz">
 <!ENTITY gcc-md5 "e0e48554cc6e4f261d55ddee9ab69075">
 <!ENTITY gcc-home "https://gcc.gnu.org/">
-<!ENTITY gcc-tmpp1-du "4.2 GB">
-<!ENTITY gcc-tmpp1-sbu "3.5 SBU">
+<!ENTITY gcc-tmpp1-du "4.1 GB">
+<!ENTITY gcc-tmpp1-sbu "3.8 SBU">
 <!ENTITY gcc-tmpp2-du "4.8 GB">
-<!ENTITY gcc-tmpp2-sbu "4.3 SBU">
+<!ENTITY gcc-tmpp2-sbu "4.4 SBU">
 <!ENTITY gcc-fin-du "5.5 GB ">
 <!ENTITY gcc-fin-sbu "42 SBU (with tests)">
 <!ENTITY libquadmath-version "0.0.0">
@@ -243,7 +243,7 @@
 <!ENTITY gdbm-md5 "8551961e36bf8c70b7500d255d3658ec">
 <!ENTITY gdbm-home "&gnu-software;gdbm/">
 <!ENTITY gdbm-fin-du "13 MB">
-<!ENTITY gdbm-fin-sbu "less than 0.1 SBU">
+<!ENTITY gdbm-fin-sbu "0.1 SBU">
 
 <!ENTITY gettext-version "0.22.4">
 <!ENTITY gettext-size "10,016 KB">
@@ -255,15 +255,15 @@
 <!ENTITY gettext-fin-du "250 MB">
 <!ENTITY gettext-fin-sbu "1.4 SBU">
 
-<!ENTITY glibc-version "2.38">
-<!ENTITY glibc-size "18,471 KB">
+<!ENTITY glibc-version "2.39">
+<!ENTITY glibc-size "18,092 KB">
 <!ENTITY glibc-url "&gnu;glibc/glibc-&glibc-version;.tar.xz">
-<!ENTITY glibc-md5 "778cce0ea6bf7f84ca8caacf4a01f45b">
+<!ENTITY glibc-md5 "be81e87f72b5ea2c0ffe2bedfeb680c6">
 <!ENTITY glibc-home "&gnu-software;libc/">
-<!ENTITY glibc-tmp-du "858 MB">
-<!ENTITY glibc-tmp-sbu "1.6 SBU">
-<!ENTITY glibc-fin-du "3.0 GB">
-<!ENTITY glibc-fin-sbu "11 SBU">
+<!ENTITY glibc-tmp-du "846 MB">
+<!ENTITY glibc-tmp-sbu "1.5 SBU">
+<!ENTITY glibc-fin-du "3.1 GB">
+<!ENTITY glibc-fin-sbu "12 SBU">
 
 <!ENTITY gmp-version "6.3.0">
 <!ENTITY gmp-size "2,046 KB">
@@ -304,7 +304,7 @@
 <!ENTITY grub-url "https://ftp.gnu.org/gnu/grub/grub-&grub-version;.tar.xz">
 <!ENTITY grub-md5 "60c564b1bdc39d8e43b3aab4bc0fb140">
 <!ENTITY grub-home "&gnu-software;grub/">
-<!ENTITY grub-fin-du "161 MB">
+<!ENTITY grub-fin-du "166 MB">
 <!ENTITY grub-fin-sbu "0.3 SBU">
 
 <!ENTITY gzip-version "1.13">
@@ -317,10 +317,10 @@
 <!ENTITY gzip-fin-du "21 MB">
 <!ENTITY gzip-fin-sbu "0.3 SBU">
 
-<!ENTITY iana-etc-version "20240117">
-<!ENTITY iana-etc-size "596 KB">
+<!ENTITY iana-etc-version "20240125">
+<!ENTITY iana-etc-size "589 KB">
 <!ENTITY iana-etc-url "https://github.com/Mic92/iana-etc/releases/download/&iana-etc-version;/iana-etc-&iana-etc-version;.tar.gz">
-<!ENTITY iana-etc-md5 "215feb4b55043a6c18e84a5ed58b705f">
+<!ENTITY iana-etc-md5 "aed66d04de615d76c70890233081e584">
 <!ENTITY iana-etc-home "https://www.iana.org/protocols">
 <!ENTITY iana-etc-fin-du "4.8 MB">
 <!ENTITY iana-etc-fin-sbu "less than 0.1 SBU">
@@ -330,7 +330,7 @@
 <!ENTITY inetutils-url "&gnu;inetutils/inetutils-&inetutils-version;.tar.xz">
 <!ENTITY inetutils-md5 "9e5a6dfd2d794dc056a770e8ad4a9263">
 <!ENTITY inetutils-home "&gnu-software;inetutils/">
-<!ENTITY inetutils-fin-du "31 MB">
+<!ENTITY inetutils-fin-du "35 MB">
 <!ENTITY inetutils-fin-sbu "0.2 SBU">
 
 <!ENTITY intltool-version "0.51.0">
@@ -353,8 +353,8 @@
 <!ENTITY jinja2-size "264 KB">
 <!ENTITY jinja2-url "&pypi-src;/J/Jinja2/Jinja2-&jinja2-version;.tar.gz">
 <!ENTITY jinja2-md5 "caf5418c851eac59e70a78d9730d4cea">
-<!ENTITY jinja2-home "https://jinja.palletsprojects.com/en/3.0.x/">
-<!ENTITY jinja2-fin-du "3.4 MB">
+<!ENTITY jinja2-home "https://jinja.palletsprojects.com/en/3.1.x/">
+<!ENTITY jinja2-fin-du "3.2 MB">
 <!ENTITY jinja2-fin-sbu "less than 0.1 SBU">
 
 <!ENTITY kbd-version "2.6.4">
@@ -362,7 +362,7 @@
 <!ENTITY kbd-url "https://www.kernel.org/pub/linux/utils/kbd/kbd-&kbd-version;.tar.xz">
 <!ENTITY kbd-md5 "e2fd7adccf6b1e98eb1ae8d5a1ce5762">
 <!ENTITY kbd-home "https://kbd-project.org/">
-<!ENTITY kbd-fin-du "35 MB">
+<!ENTITY kbd-fin-du "34 MB">
 <!ENTITY kbd-fin-sbu "0.1 SBU">
 
 <!ENTITY kmod-version "31">
@@ -419,7 +419,7 @@
 <!ENTITY libtool-md5 "2fc0b6ddcd66a89ed6e45db28fa44232">
 <!ENTITY libtool-home "&gnu-software;libtool/">
 <!ENTITY libtool-fin-du "45 MB">
-<!ENTITY libtool-fin-sbu "1.3 SBU">
+<!ENTITY libtool-fin-sbu "0.6 SBU">
 
 <!ENTITY libxcrypt-version "4.4.36">
 <!ENTITY libxcrypt-size "610 KB">
@@ -431,12 +431,12 @@
 
 <!ENTITY linux-major-version "6">
 <!ENTITY linux-minor-version "7">
-<!ENTITY linux-patch-version "1">
+<!ENTITY linux-patch-version "4">
 <!--<!ENTITY linux-version "&linux-major-version;.&linux-minor-version;">-->
 <!ENTITY linux-version "&linux-major-version;.&linux-minor-version;.&linux-patch-version;">
-<!ENTITY linux-size "138,096 KB">
+<!ENTITY linux-size "138,130 KB">
 <!ENTITY linux-url "&kernel;linux/kernel/v&linux-major-version;.x/linux-&linux-version;.tar.xz">
-<!ENTITY linux-md5 "d8a7394e0e349dd373e9722e141c8b61">
+<!ENTITY linux-md5 "370e1b6155ae63133380e421146619e0">
 <!ENTITY linux-home "https://www.kernel.org/">
 <!-- measured for 6.5.3 / gcc-13.2.0 on x86_64 with -j4 : minimum is
  allnoconfig + some configs we recommend for the users, rounded down to
@@ -475,29 +475,29 @@
 <!ENTITY man-db-url "&savannah;/releases/man-db/man-db-&man-db-version;.tar.xz">
 <!ENTITY man-db-md5 "67e0052fa200901b314fad7b68c9db27">
 <!ENTITY man-db-home "https://www.nongnu.org/man-db/">
-<!ENTITY man-db-fin-du "40 MB">
+<!ENTITY man-db-fin-du "41 MB">
 <!ENTITY man-db-fin-sbu "0.2 SBU">
 
-<!ENTITY man-pages-version "6.05.01">
-<!ENTITY man-pages-size "2,144 KB">
+<!ENTITY man-pages-version "6.06">
+<!ENTITY man-pages-size "2,116 KB">
 <!ENTITY man-pages-url "&kernel;linux/docs/man-pages/man-pages-&man-pages-version;.tar.xz">
-<!ENTITY man-pages-md5 "de4563b797cf9b1e0b0d73628b35e442">
+<!ENTITY man-pages-md5 "26b39e38248144156d437e1e10cb20bf">
 <!ENTITY man-pages-home "https://www.kernel.org/doc/man-pages/">
 <!ENTITY man-pages-fin-du "33 MB">
 <!ENTITY man-pages-fin-sbu "less than 0.1 SBU">
 
-<!ENTITY markupsafe-version "2.1.4">
-<!ENTITY markupsafe-size "20 KB">
+<!ENTITY markupsafe-version "2.1.5">
+<!ENTITY markupsafe-size "19 KB">
 <!ENTITY markupsafe-url "&pypi-src;/M/MarkupSafe/MarkupSafe-&markupsafe-version;.tar.gz">
-<!ENTITY markupsafe-md5 "8138329a11cf4bd0f9db780b2af26c66">
+<!ENTITY markupsafe-md5 "8fe7227653f2fb9b1ffe7f9f2058998a">
 <!ENTITY markupsafe-home "https://palletsprojects.com/p/markupsafe/">
-<!ENTITY markupsafe-fin-du "548 KB">
+<!ENTITY markupsafe-fin-du "508 KB">
 <!ENTITY markupsafe-fin-sbu "less than 0.1 SBU">
 
-<!ENTITY meson-version "1.3.1">
+<!ENTITY meson-version "1.3.2">
 <!ENTITY meson-size "2,172 KB">
 <!ENTITY meson-url "&github;/mesonbuild/meson/releases/download/&meson-version;/meson-&meson-version;.tar.gz">
-<!ENTITY meson-md5 "dd404b8c0f8b79f80181b4a58bb81768">
+<!ENTITY meson-md5 "2d0ebd3a24249617b1c4d30026380cf8">
 <!ENTITY meson-home "https://mesonbuild.com">
 <!ENTITY meson-fin-du "42 MB">
 <!ENTITY meson-fin-sbu "less than 0.1 SBU">
@@ -515,8 +515,8 @@
 <!ENTITY mpfr-url "https://ftp.gnu.org/gnu/mpfr/mpfr-&mpfr-version;.tar.xz">
 <!ENTITY mpfr-md5 "523c50c6318dde6f9dc523bc0244690a">
 <!ENTITY mpfr-home "https://www.mpfr.org/">
-<!ENTITY mpfr-fin-du "43 MB">
-<!ENTITY mpfr-fin-sbu "0.2 SBU">
+<!ENTITY mpfr-fin-du "44 MB">
+<!ENTITY mpfr-fin-sbu "0.3 SBU">
 
 <!ENTITY ncurses-release "6.4">
 <!ENTITY ncurses-version "&ncurses-release;-20230520">
@@ -539,13 +539,13 @@
 <!ENTITY ninja-fin-du "75 MB">
 <!ENTITY ninja-fin-sbu "0.3 SBU">
 
-<!ENTITY openssl-version "3.2.0">
-<!ENTITY openssl-size "17,284 KB">
+<!ENTITY openssl-version "3.2.1">
+<!ENTITY openssl-size "17,318 KB">
 <!ENTITY openssl-url "https://www.openssl.org/source/openssl-&openssl-version;.tar.gz">
-<!ENTITY openssl-md5 "7903549a14abebc5c323ce4e85f2cbb2">
+<!ENTITY openssl-md5 "c239213887804ba00654884918b37441">
 <!ENTITY openssl-home "https://www.openssl.org/">
-<!ENTITY openssl-fin-du "587 MB">
-<!ENTITY openssl-fin-sbu "3.0 SBU">
+<!ENTITY openssl-fin-du "805 MB">
+<!ENTITY openssl-fin-sbu "1.8 SBU">
 
 <!ENTITY patch-version "2.7.6">
 <!ENTITY patch-size "766 KB">
@@ -569,12 +569,12 @@
 <!ENTITY perl-tmp-du "280 MB">
 <!ENTITY perl-tmp-sbu "0.6 SBU">
 <!ENTITY perl-fin-du "239 MB">
-<!ENTITY perl-fin-sbu "7.1 SBU">
+<!ENTITY perl-fin-sbu "1.5 SBU">
 
-<!ENTITY pkgconf-version "2.1.0">
+<!ENTITY pkgconf-version "2.1.1">
 <!ENTITY pkgconf-size "305 KB">
 <!ENTITY pkgconf-url "https://distfiles.ariadne.space/pkgconf/pkgconf-&pkgconf-version;.tar.xz">
-<!ENTITY pkgconf-md5 "0f2eadbb9dea5aed95147272ae1592cc">
+<!ENTITY pkgconf-md5 "bc29d74c2483197deb9f1f3b414b7918">
 <!ENTITY pkgconf-home "http://pkgconf.org/">
 <!ENTITY pkgconf-fin-du "4.6 MB">
 <!ENTITY pkgconf-fin-sbu "less than 0.1 SBU">
@@ -584,7 +584,7 @@
 <!ENTITY procps-ng-url "https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-&procps-ng-version;.tar.xz">
 <!ENTITY procps-ng-md5 "2f747fc7df8ccf402d03e375c565cf96">
 <!ENTITY procps-ng-home "https://sourceforge.net/projects/procps-ng">
-<!ENTITY procps-ng-fin-du "25 MB">
+<!ENTITY procps-ng-fin-du "27 MB">
 <!ENTITY procps-ng-fin-sbu "0.1 SBU">
 
 <!ENTITY psmisc-version "23.6">
@@ -598,19 +598,19 @@
 <!-- If python minor version changes, updates in python and
      meson pages will be needed: python3.6 and python3.6m -->
 
-<!ENTITY python-version "3.12.1">
+<!ENTITY python-version "3.12.2">
 <!ENTITY python-minor "3.12">
-<!ENTITY python-size "20,102 KB">
+<!ENTITY python-size "20,109 KB">
 <!ENTITY python-url "https://www.python.org/ftp/python/&python-version;/Python-&python-version;.tar.xz">
-<!ENTITY python-md5 "50f827c800483776c8ef86e6a53831fa">
+<!ENTITY python-md5 "e7c178b97bf8f7ccd677b94d614f7b3c">
 <!ENTITY python-home "https://www.python.org/">
-<!ENTITY python-tmp-du "533 MB">
-<!ENTITY python-tmp-sbu "0.4 SBU">
-<!ENTITY python-fin-du "370 MB">
-<!ENTITY python-fin-sbu "1.9 SBU">
+<!ENTITY python-tmp-du "598 MB">
+<!ENTITY python-tmp-sbu "0.5 SBU">
+<!ENTITY python-fin-du "485 MB">
+<!ENTITY python-fin-sbu "1.8 SBU">
 <!ENTITY python-docs-url "https://www.python.org/ftp/python/doc/&python-version;/python-&python-version;-docs-html.tar.bz2">
-<!ENTITY python-docs-md5 "d5c21b804c219b06256495eae30fd153">
-<!ENTITY python-docs-size "7,998 KB">
+<!ENTITY python-docs-md5 "8a6310f6288e7f60c3565277ec3b5279">
+<!ENTITY python-docs-size "8,065 KB">
 
 <!ENTITY readline-version "8.2">
 <!ENTITY readline-soversion "8.2"><!-- used for stripping -->
@@ -631,20 +631,20 @@
 <!ENTITY sed-fin-du "30 MB">
 <!ENTITY sed-fin-sbu "0.3 SBU">
 
-<!ENTITY setuptools-version "69.0.3">
+<!ENTITY setuptools-version "69.1.0">
 <!ENTITY setuptools-size "2,168 KB">
 <!ENTITY setuptools-url "&pypi-src;/s/setuptools/setuptools-&setuptools-version;.tar.gz">
-<!ENTITY setuptools-md5 "b82de45aaa6b9bb911226660212ebb83">
+<!ENTITY setuptools-md5 "6f6eb780ce12c90d81ce243747ed7ab0">
 <!ENTITY setuptools-home "&pypi-home;/setuptools/">
-<!ENTITY setuptools-fin-du "30 MB">
-<!ENTITY setuptools-fin-sbu "0.1 SBU">
+<!ENTITY setuptools-fin-du "20 MB">
+<!ENTITY setuptools-fin-sbu "less than 0.1 SBU">
 
-<!ENTITY shadow-version "4.14.3">
-<!ENTITY shadow-size "1,760 KB">
+<!ENTITY shadow-version "4.14.5">
+<!ENTITY shadow-size "1,765 KB">
 <!ENTITY shadow-url "&github;/shadow-maint/shadow/releases/download/&shadow-version;/shadow-&shadow-version;.tar.xz">
-<!ENTITY shadow-md5 "b9a7f56d0c63297c0d11d742be2f8ffd">
+<!ENTITY shadow-md5 "452b0e59f08bf618482228ba3732d0ae">
 <!ENTITY shadow-home "&github;/shadow-maint/shadow/">
-<!ENTITY shadow-fin-du "46 MB">
+<!ENTITY shadow-fin-du "49 MB">
 <!ENTITY shadow-fin-sbu "0.1 SBU">
 
 <!ENTITY sysklogd-version "1.5.1">
@@ -669,7 +669,7 @@
 <!--<!ENTITY systemd-man-url  "&anduin-sources;/systemd-man-pages-&systemd-version;-&systemd-stable;.tar.xz">-->
 <!ENTITY systemd-man-url  "&anduin-sources;/systemd-man-pages-&systemd-man-version;.tar.xz">
 <!ENTITY systemd-man-md5  "1ebe54d7a80f9abf8f2d14ddfeb2432d">
-<!ENTITY systemd-fin-du   "238 MB">
+<!ENTITY systemd-fin-du   "247 MB">
 <!ENTITY systemd-fin-sbu  "0.7 SBU">
 
 <!ENTITY sysvinit-version "3.08">
@@ -677,7 +677,7 @@
 <!ENTITY sysvinit-url "&github;/slicer69/sysvinit/releases/download/&sysvinit-version;/sysvinit-&sysvinit-version;.tar.xz">
 <!ENTITY sysvinit-md5 "81a05f28d7b67533cfc778fcadea168c">
 <!ENTITY sysvinit-home "&savannah-nongnu;/projects/sysvinit">
-<!ENTITY sysvinit-fin-du "4.5 MB">
+<!ENTITY sysvinit-fin-du "3.5 MB">
 <!ENTITY sysvinit-fin-sbu "less than 0.1 SBU">
 
 <!ENTITY tar-version "1.35">
@@ -688,7 +688,7 @@
 <!ENTITY tar-tmp-du "42 MB">
 <!ENTITY tar-tmp-sbu "0.1 SBU">
 <!ENTITY tar-fin-du "43 MB">
-<!ENTITY tar-fin-sbu "1.7 SBU">
+<!ENTITY tar-fin-sbu "0.5 SBU">
 
 <!ENTITY tcl-version "8.6.13">
 <!ENTITY tcl-major-version "8.6">
@@ -707,18 +707,18 @@
 <!ENTITY texinfo-url "&gnu;texinfo/texinfo-&texinfo-version;.tar.xz">
 <!ENTITY texinfo-md5 "edd9928b4a3f82674bcc3551616eef3b">
 <!ENTITY texinfo-home "&gnu-software;texinfo/">
-<!ENTITY texinfo-tmp-du "116 MB">
-<!ENTITY texinfo-tmp-sbu "0.1 SBU">
-<!ENTITY texinfo-fin-du "128 MB">
+<!ENTITY texinfo-tmp-du "130 MB">
+<!ENTITY texinfo-tmp-sbu "0.2 SBU">
+<!ENTITY texinfo-fin-du "139 MB">
 <!ENTITY texinfo-fin-sbu "0.3 SBU">
 
-<!ENTITY tzdata-version "2023d">
-<!ENTITY tzdata-size "440 KB">
+<!ENTITY tzdata-version "2024a">
+<!ENTITY tzdata-size "444 KB">
 <!ENTITY tzdata-url "https://www.iana.org/time-zones/repository/releases/tzdata&tzdata-version;.tar.gz">
-<!ENTITY tzdata-md5 "08b9d559939670725ec298fdbb029649">
+<!ENTITY tzdata-md5 "2349edd8335245525cc082f2755d5bf4">
 <!ENTITY tzdata-home "https://www.iana.org/time-zones">
 
-<!ENTITY udev-fin-du "138 MB">
+<!ENTITY udev-fin-du "144 MB">
 <!ENTITY udev-fin-sbu "0.2 SBU">
 
 <!ENTITY udev-lfs-version "udev-lfs-20230818">
@@ -733,9 +733,9 @@
 <!ENTITY util-linux-url "&kernel;linux/utils/util-linux/v&util-linux-minor;/util-linux-&util-linux-version;.tar.xz">
 <!ENTITY util-linux-md5 "f3591e6970c017bb4bcd24ae762a98f5">
 <!ENTITY util-linux-home "https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/">
-<!ENTITY util-linux-tmp-du "169 MB">
+<!ENTITY util-linux-tmp-du "172 MB">
 <!ENTITY util-linux-tmp-sbu "0.2 SBU">
-<!ENTITY util-linux-fin-du "310 MB">
+<!ENTITY util-linux-fin-du "313 MB">
 <!ENTITY util-linux-fin-sbu "0.5 SBU">
 
 <!ENTITY vim-version "9.1.0041">
@@ -746,8 +746,8 @@
 <!--<!ENTITY vim-url "&anduin-sources;/vim-&vim-version;.tar.gz">-->
 <!ENTITY vim-md5 "79dfe62be5d347b1325cbd5ce2a1f9b3">
 <!ENTITY vim-home "https://www.vim.org">
-<!ENTITY vim-fin-du "229 MB">
-<!ENTITY vim-fin-sbu "2.3 SBU">
+<!ENTITY vim-fin-du "236 MB">
+<!ENTITY vim-fin-sbu "2.5 SBU">
 
 <!ENTITY wheel-version "0.42.0">
 <!ENTITY wheel-size "97 KB">
@@ -762,29 +762,29 @@
 <!ENTITY xml-parser-url "https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-&xml-parser-version;.tar.gz">
 <!ENTITY xml-parser-md5 "89a8e82cfd2ad948b349c0a69c494463">
 <!ENTITY xml-parser-home "&github;/chorny/XML-Parser">
-<!ENTITY xml-parser-fin-du "2.3 MB">
+<!ENTITY xml-parser-fin-du "2.4 MB">
 <!ENTITY xml-parser-fin-sbu "less than 0.1 SBU">
 
-<!ENTITY xz-version "5.4.5">
-<!ENTITY xz-size "1,642 KB">
-<!ENTITY xz-url "https://tukaani.org/xz/xz-&xz-version;.tar.xz">
-<!ENTITY xz-md5 "1d33e0be05c53e7a5641acf5c8b35fdd">
+<!ENTITY xz-version "5.4.6">
+<!ENTITY xz-size "1,645 KB">
+<!ENTITY xz-url "https://github.com/tukaani-project/xz/releases/download/v&xz-version;/xz-&xz-version;.tar.xz">
+<!ENTITY xz-md5 "7ade7bd1181a731328f875bec62a9377">
 <!ENTITY xz-home "https://tukaani.org/xz">
 <!ENTITY xz-tmp-du "22 MB">
 <!ENTITY xz-tmp-sbu "0.1 SBU">
-<!ENTITY xz-fin-du "24 MB">
+<!ENTITY xz-fin-du "25 MB">
 <!ENTITY xz-fin-sbu "0.1 SBU">
 
-<!ENTITY zlib-version "1.3">
-<!ENTITY zlib-size "1,461 KB">
+<!ENTITY zlib-version "1.3.1">
+<!ENTITY zlib-size "1,478 KB">
 <!-- DO NOT remove "fossils"!
      The upstream removes https://zlib.net/zlib-&zlib-version;.tar.xz
      once a newer version is released EVEN IF there is no security fixes.
      Unfortunately there is no .xz files in fossils directory.  -->
 <!ENTITY zlib-url "https://zlib.net/fossils/zlib-&zlib-version;.tar.gz">
-<!ENTITY zlib-md5 "60373b133d630f74f4a1f94c1185a53f">
+<!ENTITY zlib-md5 "9855b6d802d7fe5b7bd5b196a2271655">
 <!ENTITY zlib-home "https://zlib.net/">
-<!ENTITY zlib-fin-du "6.2 MB">
+<!ENTITY zlib-fin-du "6.4 MB">
 <!ENTITY zlib-fin-sbu "less than 0.1 SBU">
 
 <!ENTITY zstd-version "1.5.5">
@@ -793,5 +793,5 @@
 <!ENTITY zstd-md5 "63251602329a106220e0a5ad26ba656f">
 <!ENTITY zstd-home "https://facebook.github.io/zstd/">
 <!ENTITY zstd-fin-du "77 MB">
-<!ENTITY zstd-fin-sbu "0.4 SBU">
+<!ENTITY zstd-fin-sbu "0.5 SBU">
 
diff --git a/part3intro/toolchaintechnotes.xml b/part3intro/toolchaintechnotes.xml
index c220d24d8..7997b0891 100644
--- a/part3intro/toolchaintechnotes.xml
+++ b/part3intro/toolchaintechnotes.xml
@@ -56,7 +56,7 @@
     <variablelist>
       <varlistentry><term>The build</term><listitem>
         <para>is the machine where we build programs. Note that this machine
-        is also referred to as the <quote>host</quote>.</para></listitem>
+        is also referred to as the <quote>host.</quote></para></listitem>
       </varlistentry>
 
       <varlistentry><term>The host</term><listitem>
diff --git a/patches.ent b/patches.ent
index d27c717de..17966e30c 100644
--- a/patches.ent
+++ b/patches.ent
@@ -2,6 +2,10 @@
 
 <!-- Start of Common Patches -->
 
+<!ENTITY bash-upstream-fixes-patch "bash-&bash-version;-upstream_fixes-1.patch">
+<!ENTITY bash-upstream-fixes-patch-md5 "2d1691a629c558e894dbb78ee6bf34ef">
+<!ENTITY bash-upstream-fixes-patch-size "5.9 KB">
+
 <!ENTITY bzip2-docs-patch "bzip2-&bzip2-version;-install_docs-1.patch">
 <!ENTITY bzip2-docs-patch-md5 "6a5ac7e89b791aae556de0f745916f7f">
 <!ENTITY bzip2-docs-patch-size "1.6 KB">
@@ -13,24 +17,23 @@
 <!ENTITY glibc-fhs-patch "glibc-&glibc-version;-fhs-1.patch">
 <!ENTITY glibc-fhs-patch-md5 "9a5997c3452909b1769918c759eff8a2">
 <!ENTITY glibc-fhs-patch-size "2.8 KB">
-
-<!ENTITY glibc-upstream-fixes-patch "glibc-&glibc-version;-upstream_fixes-3.patch">
-<!ENTITY glibc-upstream-fixes-patch-md5 "545977e0b5c341ba945cf4b5de92f1e2">
-<!ENTITY glibc-upstream-fixes-patch-size "28 KB">
-
+<!--
+<!ENTITY glibc-upstream-fixes-patch "glibc-&glibc-version;-upstream_fixes-4.patch">
+<!ENTITY glibc-upstream-fixes-patch-md5 "66e843b00688c641c9bdda684db45b43">
+<!ENTITY glibc-upstream-fixes-patch-size "36 KB">
+-->
 <!ENTITY kbd-backspace-patch "kbd-&kbd-version;-backspace-1.patch">
 <!ENTITY kbd-backspace-patch-md5 "f75cca16a38da6caa7d52151f7136895">
 <!ENTITY kbd-backspace-patch-size "12 KB">
 
-<!ENTITY pkgconf-upstream-fix-patch "pkgconf-&pkgconf-version;-upstream_fix-1.patch">
-<!ENTITY pkgconf-upstream-fix-patch-md5 "77d5bb10840724a0e3dc08efee548363">
-<!ENTITY pkgconf-upstream-fix-patch-size "4 KB">
-
-<!ENTITY readline-fixes-patch "readline-&readline-version;-upstream_fixes-2.patch">
-<!ENTITY readline-fixes-patch-md5 "d2477ebe908cc99763d90dde7fd9549a">
-<!ENTITY readline-fixes-patch-size "5.7 KB">
+<!ENTITY readline-fixes-patch "readline-&readline-version;-upstream_fixes-3.patch">
+<!ENTITY readline-fixes-patch-md5 "9ed497b6cb8adcb8dbda9dee9ebce791">
+<!ENTITY readline-fixes-patch-size "13 KB">
 
 <!ENTITY sysvinit-consolidated-patch "sysvinit-&sysvinit-version;-consolidated-1.patch">
 <!ENTITY sysvinit-consolidated-patch-md5 "17ffccbb8e18c39e8cedc32046f3a475">
 <!ENTITY sysvinit-consolidated-patch-size "2.5 KB">
 
+<!ENTITY systemd-upstream-patch "systemd-&systemd-version;-upstream_fixes-1.patch">
+<!ENTITY systemd-upstream-patch-md5 "8d9c1014445c463cf7c24c162b1e0686">
+<!ENTITY systemd-upstream-patch-size "7.2 KB">
diff --git a/prologue/standards.xml b/prologue/standards.xml
index 0e5faa2a3..abb805988 100644
--- a/prologue/standards.xml
+++ b/prologue/standards.xml
@@ -49,7 +49,7 @@
     </itemizedlist>
 
     <para>While it is possible to create a complete system that will pass the LSB
-    certification tests "from scratch", this can't be done without many additional packages
+    certification tests <quote>from scratch,</quote> this can't be done without many additional packages
     that are beyond the scope of the LFS book.  Installation instructions for these
     additional packages can be found in BLFS. </para>
 
diff --git a/prologue/typography.xml b/prologue/typography.xml
index 303a107c5..d394e9b17 100644
--- a/prologue/typography.xml
+++ b/prologue/typography.xml
@@ -74,22 +74,27 @@ EOF</userinput></screen>
 
   <para>This format is used to encapsulate text that is optional.</para>
 
-  <para><filename>passwd(5)</filename></para>
+  <para><ulink role='man' url='&man;passwd.5'>passwd(5)</ulink></para>
 
   <para>This format is used to refer to a specific manual (man) page. The number inside parentheses
   indicates a specific section inside the manuals. For example,
   <command>passwd</command> has two man pages. Per LFS installation instructions,
   those two man pages will be located at
   <filename>/usr/share/man/man1/passwd.1</filename> and
-  <filename>/usr/share/man/man5/passwd.5</filename>. When the book uses <filename>passwd(5)</filename> it is
+  <filename>/usr/share/man/man5/passwd.5</filename>. When the book uses
+  <ulink role='man' url='&man;/passwd.5'>passwd(5)</ulink> it is
   specifically referring to <filename>/usr/share/man/man5/passwd.5</filename>.
   <command>man passwd</command> will print the first man page it finds that
-  matches <quote>passwd</quote>, which will be
+  matches <quote>passwd,</quote> which will be
   <filename>/usr/share/man/man1/passwd.1</filename>. For this example, you will
   need to run <command>man 5 passwd</command> in order to read the page
   being specified. Note that most man pages do not have duplicate
   page names in different sections. Therefore, <command>man <replaceable>&lt;program
-  name&gt;</replaceable></command> is generally sufficient.</para>
+  name&gt;</replaceable></command> is generally sufficient.  In the LFS
+  book these references to man pages are also hyperlinks, so clicking on
+  such a reference will open the man page rendered in HTML from
+  <ulink url='https://man.archlinux.org/'>Arch Linux manual
+  pages</ulink>.</para>
 
 </sect1>
 
diff --git a/stylesheets/dump-commands.xsl b/stylesheets/dump-commands.xsl
index 48af34c20..83e24dfc6 100644
--- a/stylesheets/dump-commands.xsl
+++ b/stylesheets/dump-commands.xsl
@@ -1,14 +1,13 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    xmlns:exsl="http://exslt.org/common"
-    extension-element-prefixes="exsl"
-    version="1.0">
+                xmlns:exsl="http://exslt.org/common"
+                extension-element-prefixes="exsl"
+                version="1.0">
 
 <!-- XSLT stylesheet to extract commands from [B,H]LFS books. -->
 
   <xsl:variable name="newline">
-    <xsl:text>
-</xsl:text>
+    <xsl:text>&#xA;</xsl:text>
   </xsl:variable>
 
   <xsl:template match="/">
diff --git a/stylesheets/lfs-xsl/chunk-slave.xsl b/stylesheets/lfs-xsl/chunk-slave.xsl
index f5bc8a956..45d33e04a 100644
--- a/stylesheets/lfs-xsl/chunk-slave.xsl
+++ b/stylesheets/lfs-xsl/chunk-slave.xsl
@@ -10,6 +10,14 @@
   <!-- Upstream XHTML presentation templates -->
   <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"/>
 
+  <xsl:param name="chunker.output.method" select="'xml'"/>
+  <xsl:param name="chunker.output.encoding" select="'UTF-8'"/>
+  <xsl:param name="chunker.output.media-type" select="'application/xhtml+xml'"/>
+  <xsl:param name="chunker.output.doctype-public" select="'-//W3C//DTD XHTML 1.0 Strict//EN'"/>
+  <xsl:param name="chunker.output.doctype-system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'"/>
+  <xsl:param name="chunker.output.omit-xml-declaration" select="'yes'"/>
+  <xsl:param name="chunker.output.indent" select="'no'"/>
+
   <!-- Including our customized elements templates -->
   <xsl:include href="common.xsl"/>
   <xsl:include href="xhtml/lfs-admon.xsl"/>
@@ -31,9 +39,6 @@
   <xsl:param name="ulink.target" select="''"/>
   <xsl:param name="css.decoration" select="0"/>
 
-  <!-- No XML declaration -->
-  <xsl:param name="chunker.output.omit-xml-declaration" select="'yes'"/>
-
   <!-- Control generation of ToCs and LoTs -->
   <xsl:param name="generate.toc">
     book      toc,title
diff --git a/stylesheets/lfs-xsl/lfs-l10n.xml b/stylesheets/lfs-xsl/lfs-l10n.xml
index 783bb1118..b47ee7f76 100644
--- a/stylesheets/lfs-xsl/lfs-l10n.xml
+++ b/stylesheets/lfs-xsl/lfs-l10n.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!DOCTYPE l:i18n SYSTEM "https://cdn.docbook.org/release/xsl-nons/current/common/l10n.dtd">
+<!DOCTYPE l:i18n SYSTEM "http://cdn.docbook.org/release/xsl-nons/current/common/l10n.dtd">
 
 <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
 
diff --git a/stylesheets/lfs-xsl/lfs.css b/stylesheets/lfs-xsl/lfs.css
index 80eca11ed..d453cac89 100644
--- a/stylesheets/lfs-xsl/lfs.css
+++ b/stylesheets/lfs-xsl/lfs.css
@@ -1,13 +1,13 @@
 /* Global settings */
 body {
-  font-family: verdana, tahoma, helvetica, arial, sans-serif;
+  font-family: verdana, tahoma, arial, sans-serif;
   text-align: left;
   background: #fff;
   color: #222;
   margin: 1em;
   padding: 0;
   font-size: 1em;
-  line-height: 1.2em
+  line-height: 1.2em;
 }
 
 
@@ -38,10 +38,36 @@ div.dedication {
   padding-left: 1em;
 }
 
+/* Section titles */
+h1.sect1, h1.preface, h1.part, h1.chapter, h1.appendix, .glossary h1, .index h1
+ {
+  background: #f5f6f7;
+  border-bottom: .1em solid #dbddec;
+  margin-bottom:1em;
+  margin-top: 0;
+  padding: .4em;
+}
 
-/* Sections */
-div.sect1, div.appendix {
-  padding-left: .3em;
+/* Scrolling parts
+   The header is taller for sect1 and chapter pages than on the
+   other pages.  Since we want fixed boxes, their top has to be calculated
+   by trial and errors to fit below the static header box.*/
+
+div.sect1, div.chapter, div.appendix, div.wrap {
+  top: 11.55em;
+}
+div.preface, div.part, .index div.index {
+  top: 10.15em;
+}
+div.sect1, div.appendix, div.preface, div.part, div.chapter, div.wrap, .index div.index {
+/*  padding-left: .3em;*/
+  overflow:auto;
+  height: auto;
+  position: fixed;
+  left:1em;
+  right:1em;
+  bottom: 1em;
+  border-bottom: 1em solid #dbddec;
 }
 
 div.important ul {
@@ -63,8 +89,12 @@ div.important ul li p {
   background: #f5f6f7;
   border-bottom: 0.2em solid #dbddec;
   padding-top: .1em;
-  margin-top: 0;
+/*  margin-top: 0;*/
 }
+/*
+.lfs .package p:first-child {
+  margin-top: 0;
+}*/
 
 .lfs .configuration {
   background:   #fefefe;
@@ -74,11 +104,11 @@ div.important ul li p {
 .lfs .content {
   background: #f5f6f7;
   border-top: 0.2em solid #dbddec;
+  border-bottom: 0.2em solid #dbddec;
   padding-bottom: .1em;
-  margin-bottom: 0;
+  margin-bottom: .5em;
 }
 
-
 /* Headers */
 h1, h2, h3, h4, h5, h6, b, .strong {
   color: #000;
@@ -96,18 +126,6 @@ h1 {
   padding: 0.4em;
 }
 
-.preface h1, .part h1, .chapter h1, .appendix h1, .index h1, .sect1 h1, .glossary h1 {
-  background: #f5f6f7;
-  border-bottom: .1em solid #dbddec;
-  margin-bottom: 1em;
-  margin-top: 0;
-  padding: .4em;
-}
-
-.sect1 h1, .appendix h1 {
-  margin-left: -.2em;
-}
-
 .wrap h1 {
   background: #f5f6f7;
   margin: 0;
@@ -157,13 +175,19 @@ div.navheader, div.navfooter {
 }
 
 div.navheader {
-  border-bottom: 1px solid #dbddec;
-   position: sticky;
-   top: 0;
+  border-bottom: .1em solid #dbddec;
 }
 
+/* no need for a footer now that the header is always visible */
 div.navfooter {
-  border-top: 1px solid #dbddec;
+  display:none;
+}
+
+/* Except for the first page (TOC), where the bottom is the only
+   place where navigation is displayed. */
+
+div.book + div.navfooter {
+  display:block
 }
 
 div.navheader h4 {
@@ -179,7 +203,7 @@ div.navheader h3 {
 }
 
 div.navheader ul, div.navfooter ul {
-  padding: .2em .5em .5em 0;
+  padding: .2em .5em .5em .5em; /*top right bottom left*/
   margin: .5em 0;
   position: relative;
   background: #dbddec;
@@ -196,29 +220,29 @@ div.navheader ul li.prev, div.navfooter ul li.prev {
   left: 0;
   text-align: left;
   padding: 0.2em 1em;
-  margin-left: 6px;
+  margin-left: .4em;
 }
 
 div.navheader ul li.next, div.navfooter ul li.next {
   position: absolute;
   display: block;
   text-align: right;
-  right: 5px;
-  padding: 0.2em 0.5em;
-  margin-right: 7px;
+  right: 0;
+  padding: 0.2em 1em;
+  margin-right: .4em;
 }
 
 div.navheader ul li.prev p, div.navfooter ul li.prev p,
 div.navheader ul li.next p, div.navfooter ul li.next p {
   padding: 0;
-  margin: 1px 0px;
+  margin: .1em 0;
 }
 
 div.navheader ul li.home, div.navheader ul li.up,
 div.navfooter ul li.home, div.navfooter ul li.up {
   text-align: center;
   padding: 0;
-  margin: 0px auto;
+  margin: 0 auto;
   display: block;
   color: #dbddec;
 }
diff --git a/stylesheets/lfs-xsl/nochunks.xsl b/stylesheets/lfs-xsl/nochunks.xsl
index 5a5ad36f5..896449d7c 100644
--- a/stylesheets/lfs-xsl/nochunks.xsl
+++ b/stylesheets/lfs-xsl/nochunks.xsl
@@ -10,6 +10,13 @@
   <!-- Upstream XHTML templates -->
   <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"/>
 
+  <xsl:output method="xml"
+              encoding="UTF-8"
+              media-type="application/xhtml+xml"
+              doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+              doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+              omit-xml-declaration="yes"
+              indent="no" />
   <!-- Include our customized templates -->
   <xsl:include href="common.xsl"/>
   <xsl:include href="xhtml/lfs-index.xsl"/>
diff --git a/stylesheets/lfs-xsl/pdf.xsl b/stylesheets/lfs-xsl/pdf.xsl
index 679f73b84..ea247f5db 100644
--- a/stylesheets/lfs-xsl/pdf.xsl
+++ b/stylesheets/lfs-xsl/pdf.xsl
@@ -53,8 +53,8 @@
        We have expanded the support to several inline tags.
        See pdf/lfs-mixed.xsl.
        Note: the argument in select= is a zero-width space
-       (unicode 200b, encoded in utf-8)-->
-  <xsl:param name="ulink.hyphenate" select="'​'"/>
+       (unicode 200b)-->
+  <xsl:param name="ulink.hyphenate" select="'&#x200B;'"/>
 
   <!-- List of characters to allow ulink URLs, and supported inline tags,
        to be automatically hyphenated on.
diff --git a/stylesheets/lfs-xsl/profile.xsl b/stylesheets/lfs-xsl/profile.xsl
index a19d924e9..80c9b01b5 100644
--- a/stylesheets/lfs-xsl/profile.xsl
+++ b/stylesheets/lfs-xsl/profile.xsl
@@ -18,6 +18,7 @@
 
   <!-- Generate DocBook instance with correct DOCTYPE -->
   <xsl:output method="xml"
+              encoding="UTF-8"
               doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
               doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/>
 
diff --git a/stylesheets/lfs-xsl/xhtml/lfs-sections.xsl b/stylesheets/lfs-xsl/xhtml/lfs-sections.xsl
index cde5f0349..c44aa229c 100644
--- a/stylesheets/lfs-xsl/xhtml/lfs-sections.xsl
+++ b/stylesheets/lfs-xsl/xhtml/lfs-sections.xsl
@@ -11,10 +11,14 @@
   <xsl:param name="chunk.first.sections" select="1"/>
 
     <!-- preface:
-           Output non sect1 child elements before the TOC -->
+         Output non sect1 child elements before the TOC
+         Output title outside of the <div> because we want to be able to
+         use it at a fixed position -->
     <!-- The original template is in {docbook-xsl}/xhtml/components.xsl -->
   <xsl:template match="preface">
     <xsl:call-template name="id.warning"/>
+    <xsl:call-template name="preface.titlepage"/>
+    <xsl:call-template name="component.separator"/>
     <div>
       <xsl:apply-templates select="." mode="class.attribute"/>
       <xsl:call-template name="dir">
@@ -26,8 +30,6 @@
           <xsl:call-template name="object.id"/>
         </xsl:attribute>
       </xsl:if>
-      <xsl:call-template name="component.separator"/>
-      <xsl:call-template name="preface.titlepage"/>
       <xsl:apply-templates/>
       <xsl:variable name="toc.params">
         <xsl:call-template name="find.path.params">
@@ -44,11 +46,42 @@
     </div>
   </xsl:template>
 
+    <!-- part:
+         Output non sect1 child elements before the TOC
+         Output title outside of the <div> because we want to be able to
+         use it at a fixed position -->
+    <!-- The original template is in {docbook-xsl}/xhtml/divisions.xsl -->
+  <xsl:template match="part">
+    <xsl:call-template name="id.warning"/>
+
+    <xsl:call-template name="part.titlepage"/>
+
+    <div>
+      <xsl:apply-templates select="." mode="common.html.attributes"/>
+      <xsl:call-template name="id.attribute">
+        <xsl:with-param name="conditional" select="0"/>
+      </xsl:call-template>
+
+      <xsl:apply-templates/>
+      <xsl:variable name="toc.params">
+        <xsl:call-template name="find.path.params">
+          <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+        </xsl:call-template>
+      </xsl:variable>
+      <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+        <xsl:call-template name="division.toc"/>
+      </xsl:if>
+    </div>
+  </xsl:template>
+
     <!-- chapter:
-           Output non sect1 child elements before the TOC -->
+           Output non sect1 child elements before the TOC
+           Output title before div to be able to fix the title position -->
     <!-- The original template is in {docbook-xsl}/xhtml/components.xsl -->
   <xsl:template match="chapter">
     <xsl:call-template name="id.warning"/>
+    <xsl:call-template name="chapter.titlepage"/>
+    <xsl:call-template name="component.separator"/>
     <div>
       <xsl:apply-templates select="." mode="class.attribute"/>
       <xsl:call-template name="dir">
@@ -60,8 +93,6 @@
           <xsl:call-template name="object.id"/>
         </xsl:attribute>
       </xsl:if>
-      <xsl:call-template name="component.separator"/>
-      <xsl:call-template name="chapter.titlepage"/>
       <xsl:apply-templates/>
       <xsl:variable name="toc.params">
         <xsl:call-template name="find.path.params">
@@ -78,12 +109,50 @@
     </div>
   </xsl:template>
 
+    <!-- appendix:
+           Output non sect1 child elements before the TOC
+           Output title before div to be able to fix the title position -->
+    <!-- The original template is in {docbook-xsl}/xhtml/components.xsl -->
+  <xsl:template match="appendix">
+
+    <xsl:call-template name="id.warning"/>
+
+    <xsl:call-template name="appendix.titlepage"/>
+
+    <xsl:element name="div" namespace="http://www.w3.org/1999/xhtml">
+      <xsl:call-template name="common.html.attributes">
+        <xsl:with-param name="inherit" select="1"/>
+      </xsl:call-template>
+      <xsl:call-template name="id.attribute">
+        <xsl:with-param name="conditional" select="0"/>
+      </xsl:call-template>
+
+      <xsl:apply-templates/>
+
+      <xsl:variable name="toc.params">
+        <xsl:call-template name="find.path.params">
+          <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+        </xsl:call-template>
+      </xsl:variable>
+
+      <xsl:if test="contains($toc.params, 'toc')">
+        <xsl:call-template name="component.toc">
+          <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+        </xsl:call-template>
+      </xsl:if>
+
+    </xsl:element>
+  </xsl:template>
+
     <!-- sect1:
            When there is a role attibute, use it as the class value.
            Process the SVN keywords found in sect1info as a footnote.
+           Output title before the containing <div> so that the title
+           can be at a fixed position.
            Removed unused code. -->
     <!-- The original template is in {docbook-xsl}/xhtml/sections.xsl -->
   <xsl:template match="sect1">
+    <xsl:call-template name="sect1.titlepage"/>
     <div>
       <xsl:choose>
         <xsl:when test="@role">
@@ -96,7 +165,6 @@
         </xsl:otherwise>
       </xsl:choose>
       <xsl:call-template name="language.attribute"/>
-      <xsl:call-template name="sect1.titlepage"/>
       <xsl:apply-templates/>
       <xsl:apply-templates select="sect1info" mode="svn-keys"/>
     </div>
diff --git a/stylesheets/md5sum.xsl b/stylesheets/md5sum.xsl
index bb7268276..57723df97 100644
--- a/stylesheets/md5sum.xsl
+++ b/stylesheets/md5sum.xsl
@@ -3,7 +3,7 @@
 <!-- Create a md5 list for packages and patches used. -->
 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    version="1.0">
+                version="1.0">
 
   <xsl:output method="text"/>
 
@@ -31,8 +31,7 @@
       </xsl:call-template>
 
       <!-- Add a newline -->
-      <xsl:text>
-</xsl:text>
+      <xsl:text>&#xA;</xsl:text>
 
     </xsl:if>
   </xsl:template>
diff --git a/stylesheets/wget-list.xsl b/stylesheets/wget-list.xsl
index aa8d263c4..eca53a4c9 100644
--- a/stylesheets/wget-list.xsl
+++ b/stylesheets/wget-list.xsl
@@ -4,7 +4,7 @@
      with wget. -->
 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    version="1.0">
+                version="1.0">
 
   <xsl:output method="text"/>
 
@@ -28,8 +28,7 @@
           <xsl:value-of select="@url"/>
         </xsl:otherwise>
       </xsl:choose>
-      <xsl:text>
-</xsl:text>
+      <xsl:text>&#xA;</xsl:text>
     </xsl:if>
   </xsl:template>