summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Le Vaillant <glv@posteo.net>2024-01-10 13:27:11 +0100
committerGuillaume Le Vaillant <glv@posteo.net>2024-01-10 14:04:40 +0100
commit749c3e016a4297d2794cbebac0e07297d19b4ffd (patch)
tree59b0c93bcaa9ad6d53fd73d2627231e5f0cf9320
parentea832b44b79fb06bac88679029773006fea15827 (diff)
parent537768018ee03a6a9a5562022a16b47ac287d131 (diff)
downloadguix-749c3e016a4297d2794cbebac0e07297d19b4ffd.tar.gz
Merge branch 'master' into lisp-team
Change-Id: I6c2ce53e782a00861c3adf01c2505099daef7728
-rw-r--r--.guix-authorizations2
-rw-r--r--.mailmap1
-rwxr-xr-xbuild-aux/test-driver.scm3
-rw-r--r--doc/guix.texi127
-rw-r--r--etc/news.scm57
-rwxr-xr-xetc/teams.scm20
-rw-r--r--gnu/home/services/shepherd.scm12
-rw-r--r--gnu/image.scm4
-rw-r--r--gnu/local.mk19
-rw-r--r--gnu/packages/admin.scm4
-rw-r--r--gnu/packages/bioconductor.scm38
-rw-r--r--gnu/packages/bioinformatics.scm217
-rw-r--r--gnu/packages/bootloaders.scm58
-rw-r--r--gnu/packages/bootstrap.scm5
-rw-r--r--gnu/packages/check.scm31
-rw-r--r--gnu/packages/chemistry.scm2
-rw-r--r--gnu/packages/cpp.scm24
-rw-r--r--gnu/packages/curl.scm15
-rw-r--r--gnu/packages/display-managers.scm80
-rw-r--r--gnu/packages/education.scm6
-rw-r--r--gnu/packages/emacs-xyz.scm64
-rw-r--r--gnu/packages/finance.scm4
-rw-r--r--gnu/packages/firmware.scm4
-rw-r--r--gnu/packages/fonts.scm29
-rw-r--r--gnu/packages/game-development.scm131
-rw-r--r--gnu/packages/games.scm157
-rw-r--r--gnu/packages/gcc.scm5
-rw-r--r--gnu/packages/geo.scm28
-rw-r--r--gnu/packages/gl.scm29
-rw-r--r--gnu/packages/gnome.scm17
-rw-r--r--gnu/packages/gnuzilla.scm5
-rw-r--r--gnu/packages/golang-web.scm5
-rw-r--r--gnu/packages/golang.scm52
-rw-r--r--gnu/packages/graph.scm50
-rw-r--r--gnu/packages/graphviz.scm12
-rw-r--r--gnu/packages/gtk.scm6
-rw-r--r--gnu/packages/guile-xyz.scm156
-rw-r--r--gnu/packages/jami.scm444
-rw-r--r--gnu/packages/libsigsegv.scm27
-rw-r--r--gnu/packages/linux.scm44
-rw-r--r--gnu/packages/lisp-xyz.scm102
-rw-r--r--gnu/packages/lisp.scm4
-rw-r--r--gnu/packages/llvm.scm30
-rw-r--r--gnu/packages/logging.scm2
-rw-r--r--gnu/packages/machine-learning.scm111
-rw-r--r--gnu/packages/minetest.scm6
-rw-r--r--gnu/packages/mpd.scm5
-rw-r--r--gnu/packages/multiprecision.scm4
-rw-r--r--gnu/packages/networking.scm345
-rw-r--r--gnu/packages/parallel.scm4
-rw-r--r--gnu/packages/patches/curl-use-ssl-cert-env.patch26
-rw-r--r--gnu/packages/patches/dtc-meson-cell-overflow.patch32
-rw-r--r--gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch23
-rw-r--r--gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch27
-rw-r--r--gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch127
-rw-r--r--gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch50
-rw-r--r--gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch44
-rw-r--r--gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch26
-rw-r--r--gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch71
-rw-r--r--gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch302
-rw-r--r--gnu/packages/patches/guile-fibers-libevent-timeout.patch61
-rw-r--r--gnu/packages/patches/jami-disable-integration-tests.patch10
-rw-r--r--gnu/packages/patches/jami-libjami-headers-search.patch5
-rw-r--r--gnu/packages/patches/jami-qml-tests-discovery.patch15
-rw-r--r--gnu/packages/patches/jami-skip-tests-requiring-internet.patch51
-rw-r--r--gnu/packages/patches/jami-unbundle-dependencies.patch71
-rw-r--r--gnu/packages/patches/libjami-ac-config-files.patch52
-rw-r--r--gnu/packages/patches/python-pyreadstat-link-libiconv.patch15
-rw-r--r--gnu/packages/patches/python-uqbar-python3.10.patch23
-rw-r--r--gnu/packages/plan9.scm136
-rw-r--r--gnu/packages/potassco.scm2
-rw-r--r--gnu/packages/python-compression.scm34
-rw-r--r--gnu/packages/python-web.scm59
-rw-r--r--gnu/packages/python-xyz.scm314
-rw-r--r--gnu/packages/serialization.scm71
-rw-r--r--gnu/packages/shellutils.scm4
-rw-r--r--gnu/packages/statistics.scm177
-rw-r--r--gnu/packages/swig.scm4
-rw-r--r--gnu/packages/tbb.scm46
-rw-r--r--gnu/packages/telephony.scm71
-rw-r--r--gnu/packages/terminals.scm6
-rw-r--r--gnu/packages/textutils.scm4
-rw-r--r--gnu/packages/tls.scm29
-rw-r--r--gnu/packages/valgrind.scm4
-rw-r--r--gnu/packages/version-control.scm267
-rw-r--r--gnu/packages/video.scm428
-rw-r--r--gnu/packages/vim.scm14
-rw-r--r--gnu/packages/web-browsers.scm4
-rw-r--r--gnu/packages/web.scm24
-rw-r--r--gnu/packages/wm.scm4
-rw-r--r--gnu/packages/xfce.scm8
-rw-r--r--gnu/packages/xorg.scm10
-rw-r--r--gnu/services/base.scm4
-rw-r--r--gnu/services/messaging.scm53
-rw-r--r--gnu/services/shepherd.scm51
-rw-r--r--gnu/services/ssh.scm7
-rw-r--r--gnu/services/xorg.scm15
-rw-r--r--gnu/system.scm4
-rw-r--r--gnu/system/hurd.scm4
-rw-r--r--gnu/system/image.scm41
-rw-r--r--gnu/tests/data/jami-dummy-account.dat127
-rw-r--r--gnu/tests/docker.scm2
-rw-r--r--gnu/tests/telephony.scm7
-rw-r--r--gnu/tests/virtualization.scm3
-rw-r--r--guix/build-system/zig.scm118
-rw-r--r--guix/build/zig-build-system.scm7
-rw-r--r--guix/docker.scm212
-rw-r--r--guix/import/crate.scm161
-rw-r--r--guix/platforms/x86.scm10
-rw-r--r--guix/read-print.scm1
-rw-r--r--guix/scripts/import/crate.scm24
-rw-r--r--guix/scripts/pack.scm88
-rw-r--r--guix/scripts/system.scm31
-rw-r--r--guix/ui.scm4
-rw-r--r--guix/utils.scm12
-rw-r--r--nix/libstore/globals.cc4
-rw-r--r--tests/crate.scm576
-rw-r--r--tests/pack.scm50
118 files changed, 5280 insertions, 1694 deletions
diff --git a/.guix-authorizations b/.guix-authorizations
index c2e043d414..c52aa39755 100644
--- a/.guix-authorizations
+++ b/.guix-authorizations
@@ -100,6 +100,8 @@
   (;; primary: "D6B0 C593 DA8C 5EDC A44C  7A58 C336 91F7 1188 B004"
    "A02C 2D82 0EF4 B25B A6B5  1D90 2AC6 A5EC 1C35 7C59"
    (name "samplet"))
+  ("9847 81DE 689C 21C2 6418  0867 76D7 27BF F62C D2B5"
+   (name "sharlatan"))
   ("F494 72F4 7A59 00D5 C235  F212 89F9 6D48 08F3 59C7"
    (name "snape"))
   ("6580 7361 3BFC C5C7 E2E4  5D45 DC51 8FC8 7F97 16AA"
diff --git a/.mailmap b/.mailmap
index ee6dd3f4f2..39b01335ee 100644
--- a/.mailmap
+++ b/.mailmap
@@ -90,6 +90,7 @@ Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 Theodoros Foradis <theodoros.for@openmailbox.org> <theodoros@foradis.org>
 Thomas Danckaert <thomas.danckaert@gmail.com> <post@thomasdanckaert.be>
 Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com>
+Tomas Volf <~@wolfsden.cz> <wolf@wolfsden.cz>
 Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz>
 Vincent Legoll <vincent.legoll@gmail.com> <vincent.legoll@idgrilles.fr>
 Zheng Junjie <873216071@qq.com> Z572 <873216071@qq.com>
diff --git a/build-aux/test-driver.scm b/build-aux/test-driver.scm
index 1cdd4ff8f7..901f6ab9ec 100755
--- a/build-aux/test-driver.scm
+++ b/build-aux/test-driver.scm
@@ -3,7 +3,7 @@ exec guile --no-auto-compile -e main -s "$0" "$@"
 !#
 ;;;; test-driver.scm - Guile test driver for Automake testsuite harness
 
-(define script-version "2021-02-02.05") ;UTC
+(define script-version "2023-12-08.14") ;UTC
 
 ;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
@@ -274,6 +274,7 @@ cases based on their names."
     (exit 0)))
 
 ;;; Local Variables:
+;;; mode: scheme
 ;;; eval: (add-hook 'write-file-functions 'time-stamp)
 ;;; time-stamp-start: "(define script-version \""
 ;;; time-stamp-format: "%:y-%02m-%02d.%02H"
diff --git a/doc/guix.texi b/doc/guix.texi
index 924dbf23ba..395545bed7 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -56,7 +56,7 @@ Copyright @copyright{} 2017 Andy Wingo@*
 Copyright @copyright{} 2017, 2018, 2019, 2020, 2023 Arun Isaac@*
 Copyright @copyright{} 2017 nee@*
 Copyright @copyright{} 2018 Rutger Helling@*
-Copyright @copyright{} 2018, 2021 Oleg Pykhalov@*
+Copyright @copyright{} 2018, 2021, 2023 Oleg Pykhalov@*
 Copyright @copyright{} 2018 Mike Gerwitz@*
 Copyright @copyright{} 2018 Pierre-Antoine Rouby@*
 Copyright @copyright{} 2018, 2019 Gábor Boskovits@*
@@ -122,6 +122,7 @@ Copyright @copyright{} 2023 Felix Lechner@*
 Copyright @copyright{} 2023 Foundation Devices, Inc.@*
 Copyright @copyright{} 2023 Thomas Ieong@*
 Copyright @copyright{} 2023 Saku Laesvuori@*
+Copyright @copyright{} 2023 Graham James Addis@*
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -1799,7 +1800,7 @@ Setup}), or simply fail.
 When the build or substitution process remains silent for more than
 @var{seconds}, terminate it and report a build failure.
 
-The default value is @code{0}, which disables the timeout.
+The default value is @code{3600} (one hour).
 
 The value specified here can be overridden by clients (@pxref{Common
 Build Options, @option{--max-silent-time}}).
@@ -1808,7 +1809,7 @@ Build Options, @option{--max-silent-time}}).
 Likewise, when the build or substitution process lasts for more than
 @var{seconds}, terminate it and report a build failure.
 
-The default value is @code{0}, which disables the timeout.
+The default value is 24 hours.
 
 The value specified here can be overridden by clients (@pxref{Common
 Build Options, @option{--timeout}}).
@@ -7406,7 +7407,7 @@ execution engines listed above by setting the
 @env{GUIX_EXECUTION_ENGINE} environment variable accordingly.
 @end quotation
 
-@cindex entry point, for Docker images
+@cindex entry point, for Docker and Singularity images
 @item --entry-point=@var{command}
 Use @var{command} as the @dfn{entry point} of the resulting pack, if the pack
 format supports it---currently @code{docker} and @code{squashfs} (Singularity)
@@ -7429,6 +7430,41 @@ docker load -i pack.tar.gz
 docker run @var{image-id}
 @end example
 
+@cindex entry point arguments, for docker images
+@item --entry-point-argument=@var{command}
+@itemx -A @var{command}
+Use @var{command} as an argument to @dfn{entry point} of the resulting pack.
+This option is only valid in conjunction with @code{--entry-point} and can
+appear multiple times on the command line.
+
+@example
+guix pack -f docker --entry-point=bin/guile --entry-point-argument="--help" guile
+@end example
+
+@cindex maximum layers argument, for docker images
+@item --max-layers=@code{n}
+Specifies the maximum number of Docker image layers allowed when
+building an image.
+
+@example
+guix pack -f docker --max-layers=100 guile
+@end example
+
+This option allows you to limit the number of layers in a Docker image.
+Docker images are comprised of multiple layers, and each layer adds to
+the overall size and complexity of the image.  By setting a maximum
+number of layers, you can control the following effects:
+
+@itemize
+@item Disk Usage:
+Increasing the number of layers can help optimize the disk space
+required to store multiple images built with a similar package graph.
+
+@item Pulling:
+When transferring images between different nodes or systems, having more
+layers can reduce the time required to pull the image.
+@end itemize
+
 @item --expression=@var{expr}
 @itemx -e @var{expr}
 Consider the package @var{expr} evaluates to.
@@ -14549,6 +14585,13 @@ Additional options include:
 Traverse the dependency graph of the given upstream package recursively
 and generate package expressions for all those packages that are not yet
 in Guix.
+@item --recursive-dev-dependencies
+If @option{--recursive-dev-dependencies} is specified, also the recursively
+imported packages contain their development dependencies, which are recursively
+imported as well.
+@item --allow-yanked
+If no non-yanked version of a crate is available, use the latest yanked
+version instead instead of aborting.
 @end table
 
 @item elm
@@ -19455,8 +19498,8 @@ few seconds when enough entropy is available and is only done once; you
 might want to turn it off for instance in a virtual machine that does
 not need it and where the extra boot time is a problem.
 
-@item @code{max-silent-time} (default: @code{0})
-@itemx @code{timeout} (default: @code{0})
+@item @code{max-silent-time} (default: @code{3600})
+@itemx @code{timeout} (default: @code{(* 3600 24)})
 The number of seconds of silence and the number of seconds of activity,
 respectively, after which a build process times out.  A value of zero
 disables the timeout.
@@ -45243,25 +45286,25 @@ PulseAudio clients to use PipeWire transparently.
 
 @node Mail Home Services
 @subsection Mail Home Services
- 
+
 The @code{(gnu home services mail)} module provides services that help
 you set up the tools to work with emails in your home environment.
- 
+
 @cindex msmtp
 @uref{https://marlam.de/msmtp, MSMTP} is a @acronym{SMTP, Simple Mail
 Transfer Protocol} client.  It sends mail to a predefined SMTP server
 that takes care of proper delivery.
- 
+
 The service reference is given below.
- 
+
 @defvar home-msmtp-service-type
 This is the service type for @command{msmtp}.  Its value must be a
 @code{home-msmtp-configuration}, as shown below.  It provides the
 @file{~/.config/msmtp/config} file.
- 
+
 As an example, here is how you would configure @code{msmtp} for a single
 account:
- 
+
 @lisp
 (service home-msmtp-service-type
          (home-msmtp-configuration
@@ -45279,101 +45322,101 @@ account:
 @end defvar
 
 @c %start of fragment
- 
+
 @deftp {Data Type} home-msmtp-configuration
 Available @code{home-msmtp-configuration} fields are:
- 
+
 @table @asis
 @item @code{defaults} (type: msmtp-configuration)
 The configuration that will be set as default for all accounts.
- 
+
 @item @code{accounts} (default: @code{'()}) (type: list-of-msmtp-accounts)
 A list of @code{msmtp-account} records which contain information about
 all your accounts.
- 
+
 @item @code{default-account} (type: maybe-string)
 Set the default account.
- 
+
 @item @code{extra-content} (default: @code{""}) (type: string)
 Extra content appended as-is to the configuration file.  Run
 @command{man msmtp} for more information about the configuration file
 format.
- 
+
 @end table
- 
+
 @end deftp
- 
+
 @c %end of fragment
- 
+
 @c %start of fragment
- 
+
 @deftp {Data Type} msmtp-account
 Available @code{msmtp-account} fields are:
- 
+
 @table @asis
 @item @code{name} (type: string)
 The unique name of the account.
- 
+
 @item @code{configuration} (type: msmtp-configuration)
 The configuration for this given account.
- 
+
 @end table
- 
+
 @end deftp
- 
+
 @c %end of fragment
 
 @c %start of fragment
- 
+
 @deftp {Data Type} msmtp-configuration
 Available @code{msmtp-configuration} fields are:
- 
+
 @table @asis
 @item @code{auth?} (type: maybe-boolean)
 Enable or disable authentication.
- 
+
 @item @code{tls?} (type: maybe-boolean)
 Enable or disable TLS (also known as SSL) for secured connections.
- 
+
 @item @code{tls-starttls?} (type: maybe-boolean)
 Choose the TLS variant: start TLS from within the session (‘on’,
 default), or tunnel the session through TLS (‘off’).
- 
+
 @item @code{tls-trust-file} (type: maybe-string)
 Activate server certificate verification using a list of trusted
 Certification Authorities (CAs).
- 
+
 @item @code{log-file} (type: maybe-string)
 Enable logging to the specified file.  An empty argument disables
 logging.  The file name ‘-’ directs the log information to standard
 output.
- 
+
 @item @code{host} (type: maybe-string)
 The SMTP server to send the mail to.
- 
+
 @item @code{port} (type: maybe-integer)
 The port that the SMTP server listens on.  The default is 25 ("smtp"),
 unless TLS without STARTTLS is used, in which case it is 465 ("smtps").
- 
+
 @item @code{user} (type: maybe-string)
 Set the user name for authentication.
- 
+
 @item @code{from} (type: maybe-string)
 Set the envelope-from address.
- 
+
 @item @code{password-eval} (type: maybe-string)
 Set the password for authentication to the output (stdout) of the
 command cmd.
- 
+
 @item @code{extra-content} (default: @code{""}) (type: string)
 Extra content appended as-is to the configuration block.  Run
 @command{man msmtp} for more information about the configuration file
 format.
- 
+
 @end table
- 
+
 @end deftp
- 
+
 @c %end of fragment
 
 @node Messaging Home Services
diff --git a/etc/news.scm b/etc/news.scm
index 848873d675..2b0a90a7f3 100644
--- a/etc/news.scm
+++ b/etc/news.scm
@@ -18,6 +18,7 @@
 ;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
 ;; Copyright © 2021, 2023 Jonathan Brielmaier <jonathan.brielmaier@web.de>
 ;; Copyright © 2022 Thiago Jung Bauermann <bauermann@kolabnow.com>
+;; Copyright © 2024 Oleg Pykhalov <go.wigust@gmail.com>
 ;;
 ;; Copying and distribution of this file, with or without modification, are
 ;; permitted in any medium without royalty provided the copyright notice and
@@ -26,6 +27,62 @@
 (channel-news
  (version 0)
 
+ (entry (commit "519e1e3eb88ec532fc83ebb742d9919269b57c87")
+        (title
+         (de "Neues Option @samp{--max-layers=N} für den Befehl @command{guix pack}")
+         (en "New @samp{--max-layers=N} option for the @command{guix pack} command")
+         (ru "Новая опция @samp{--max-layers=N} для @command{guix pack} команды"))
+        (body
+         (de "Sie können jetzt auch mehrschichtige Docker-Abbilder mit dem Befehl
+@command{guix pack --format=docker --max-layers=N} erzeugen. Damit bekommen Sie ein
+Docker-Abbild, bei dem Store-Pfade auf getrennten Schichten („Layer“)
+untergebracht sind, die sich mehrere Abbilder teilen können.  Das Abbild wird
+im Store als gzip-komprimierter Tarball erzeugt.  Hier ist ein einfaches
+Beispiel, wo ein mehrschichtiges Docker-Abbild für das Paket @code{hello}
+angelegt wird:
+
+@example
+guix pack --format=docker --max-layers=N --symlink=/usr/bin/hello=bin/hello hello
+@end example
+
+@command{guix system image} kann jetzt geschichtete Docker-Abbilder erzeugen,
+indem Sie @code{--max-layers=N}.
+
+Siehe @command{info \"(guix.de) Aufruf von guix pack\"} und
+@command{info \"(guix.de) Systemabbilder\"} für weitere Informationen.")
+         (en "Docker layered images can now be produced via the @command{guix
+pack --format=docker --max-layers=N} command, providing a Docker image with
+many of the store paths being on their own layer to improve sharing between
+images.  The image is realized into the GNU store as a gzipped tarball.  Here
+is a simple example that generates a layered Docker image for the @code{hello}
+package:
+
+@example
+guix pack --format=docker --max-layers=N --symlink=/usr/bin/hello=bin/hello hello
+@end example
+
+The @command{guix system image} can now produce layered Docker image by passing
+@code{--max-layers=N}.
+
+See @command{info \"(guix) Invoking guix pack\"} and
+@command{info \"(guix) System Images\"} for more information.")
+         (ru "Появилась команда создания многослойных Docker образов с помощью
+@command{guix pack --format=docker --max-layers=N}, которая соберет Docker образ с
+путями в store расположенными на отдельных слоях, ускоряя таким образом
+передачу образов.  Образ будет создан в GNU store в качестве gzipped tarball.
+
+Пример создания Docker layered образ с @code{hello} пакетом:
+@example
+guix pack --format=docker --max-layers=N --symlink=/usr/bin/hello=bin/hello hello
+@end example
+
+@command{guix system image} теперь может создавать layered Docker образ путем
+указания опции @option{--max-layers=N}.
+
+Смотрите @command{info \"(guix) Invoking guix pack\"} и
+@command{info \"(guix) System Images\"} для получения более детальных
+сведений.")))
+
  (entry (commit "953c65ffdd43c02c934518fb7a1c68542584b223")
         (title
          (en "Declarative offloading on Guix System and childhurds")
diff --git a/etc/teams.scm b/etc/teams.scm
index fba9010130..98f51c13e1 100755
--- a/etc/teams.scm
+++ b/etc/teams.scm
@@ -310,7 +310,8 @@ asdf-build-system."
 (define-team bootstrap
   (team 'bootstrap
         #:name "Bootstrap"
-        #:scope (list "gnu/packages/mes.scm")))
+        #:scope (list "gnu/packages/commencement.scm"
+                      "gnu/packages/mes.scm")))
 
 (define-team embedded
   (team 'embedded
@@ -424,6 +425,21 @@ asdf-build-system."
               (make-regexp* "^guix/scripts/")
               (make-regexp* "^guix/store/"))))
 
+(define-team core-packages
+  (team 'core-packages
+        #:name "Core packages"
+        #:description "Core packages: the GNU tool chain, Guile, Coreutils, etc."
+        #:scope (list "gnu/packages/base.scm"
+                      "gnu/packages/bootstrap.scm"
+                      "gnu/packages/commencement.scm"
+                      "gnu/packages/cross-base.scm"
+                      "gnu/packages/gcc.scm"
+                      "gnu/packages/guile.scm"
+                      "gnu/packages/make-bootstrap.scm"
+                      "guix/build/gnu-build-system.scm"
+                      "guix/build/utils.scm"
+                      "guix/build-system/gnu.scm")))
+
 (define-team games
   (team 'games
         #:name "Games and Toys"
@@ -556,7 +572,7 @@ GLib/GIO, GTK, GStreamer and Webkit."
 
 (define-member (person "Ludovic Courtès"
                        "ludo@gnu.org")
-  core home bootstrap installer mentors)
+  core home bootstrap core-packages installer mentors)
 
 (define-member (person "Andreas Enge"
                        "andreas@enge.fr")
diff --git a/gnu/home/services/shepherd.scm b/gnu/home/services/shepherd.scm
index bd068c37fc..176f4575cb 100644
--- a/gnu/home/services/shepherd.scm
+++ b/gnu/home/services/shepherd.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2021, 2023 Andrew Tropin <andrew@trop.in>
 ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;; Copyright © 2024 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -75,11 +76,8 @@ as shepherd package."
       #~(begin
           (use-modules (srfi srfi-34)
                        (system repl error-handling))
-          (apply
-           register-services
-           (map
-            (lambda (file) (load file))
-            '#$files))
+
+          (register-services (map load '#$files))
 
           #$@(if daemonize?
                  `((action 'root 'daemonize))
@@ -90,9 +88,7 @@ as shepherd package."
                  '#$(append-map shepherd-service-provision
                                 (filter shepherd-service-auto-start?
                                         services))))
-            (if (defined? 'start-in-the-background)
-                (start-in-the-background services-to-start)
-                (for-each start services-to-start))
+            (start-in-the-background services-to-start)
 
             (redirect-port (open-input-file "/dev/null")
                            (current-input-port)))))
diff --git a/gnu/image.scm b/gnu/image.scm
index 523653dd77..7fb06dec10 100644
--- a/gnu/image.scm
+++ b/gnu/image.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2022 Mathieu Othacehe <othacehe@gnu.org>
+;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -42,6 +43,7 @@
             image-format
             image-platform
             image-size
+            image-max-layers
             image-operating-system
             image-partition-table-type
             image-partitions
@@ -170,6 +172,8 @@ that is not in SET, mentioning FIELD in the error message."
   (size               image-size  ;size in bytes as integer
                       (default 'guess)
                       (sanitize validate-size))
+  (max-layers         image-max-layers  ;number of layers as integer
+                      (default #false))
   (operating-system   image-operating-system)  ;<operating-system>
   (partition-table-type image-partition-table-type ; 'mbr or 'gpt
                       (default 'mbr)
diff --git a/gnu/local.mk b/gnu/local.mk
index 1bf8a9df27..453e3fb5c7 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1,5 +1,5 @@
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
 # Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023 Andreas Enge <andreas@enge.fr>
 # Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 # Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Mark H Weaver <mhw@netris.org>
@@ -62,6 +62,7 @@
 # Copyright © 2023 B. Wilson <elaexuotee@wilsonb.com>
 # Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
 # Copyright © 2023 Herman Rimm <herman@rimm.ee>
+# Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
 #
 # This file is part of GNU Guix.
 #
@@ -1092,6 +1093,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/doxygen-hurd.patch			\
   %D%/packages/patches/dstat-fix-crash-when-specifying-delay.patch	\
   %D%/packages/patches/dstat-skip-devices-without-io.patch	\
+  %D%/packages/patches/dtc-meson-cell-overflow.patch		\
   %D%/packages/patches/dune-common-skip-failing-tests.patch	\
   %D%/packages/patches/dune-grid-add-missing-include-cassert.patch	\
   %D%/packages/patches/dune-istl-fix-solver-playground.patch	\
@@ -1111,7 +1113,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/emacs-deferred-fix-number-of-arguments.patch	\
   %D%/packages/patches/emacs-elpy-dup-test-name.patch		\
   %D%/packages/patches/emacs-exec-path.patch			\
-  %D%/packages/patches/emacs-ess-fix-obsolete-function-alias.patch	\
   %D%/packages/patches/emacs-git-email-missing-parens.patch	\
   %D%/packages/patches/emacs-fix-scheme-indent-function.patch	\
   %D%/packages/patches/emacs-json-reformat-fix-tests.patch	\
@@ -1166,6 +1167,13 @@ dist_patch_DATA =						\
   %D%/packages/patches/fenics-dolfin-demo-init.patch		\
   %D%/packages/patches/fenics-dolfin-boost.patch		\
   %D%/packages/patches/fenics-dolfin-config-slepc.patch		\
+  %D%/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch	\
+  %D%/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch	\
+  %D%/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch	\
+  %D%/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch	\
+  %D%/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch \
+  %D%/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch	\
+  %D%/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch	\
   %D%/packages/patches/fifengine-boost-compat.patch		\
   %D%/packages/patches/fifengine-swig-compat.patch		\
   %D%/packages/patches/fifo-map-fix-flags-for-gcc.patch		\
@@ -1384,6 +1392,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/guile-fibers-fd-finalizer-leak.patch	\
   %D%/packages/patches/guile-fibers-wait-for-io-readiness.patch \
   %D%/packages/patches/guile-fibers-libevent-32-bit.patch	\
+  %D%/packages/patches/guile-fibers-libevent-timeout.patch	\
   %D%/packages/patches/guile-fix-invalid-unicode-handling.patch \
   %D%/packages/patches/guile-gdbm-ffi-support-gdbm-1.14.patch	\
   %D%/packages/patches/guile-git-adjust-for-libgit2-1.2.0.patch \
@@ -1458,6 +1467,9 @@ dist_patch_DATA =						\
   %D%/packages/patches/itk-snap-alt-glibc-compat.patch		\
   %D%/packages/patches/jami-disable-integration-tests.patch	\
   %D%/packages/patches/jami-libjami-headers-search.patch	\
+  %D%/packages/patches/jami-qml-tests-discovery.patch		\
+  %D%/packages/patches/jami-skip-tests-requiring-internet.patch	\
+  %D%/packages/patches/jami-unbundle-dependencies.patch		\
   %D%/packages/patches/jamvm-1.5.1-aarch64-support.patch	\
   %D%/packages/patches/jamvm-1.5.1-armv7-support.patch	\
   %D%/packages/patches/jamvm-2.0.0-aarch64-support.patch	\
@@ -1548,6 +1560,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/libgnome-encoding.patch			\
   %D%/packages/patches/libgnomeui-utf8.patch			\
   %D%/packages/patches/libgrss-CVE-2016-2001.patch		\
+  %D%/packages/patches/libjami-ac-config-files.patch		\
   %D%/packages/patches/libjxr-fix-function-signature.patch	\
   %D%/packages/patches/libjxr-fix-typos.patch			\
   %D%/packages/patches/libofa-ftbfs-1.diff		\
@@ -1776,6 +1789,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-louvain-fix-test.patch		\
   %D%/packages/patches/python-random2-getrandbits-test.patch		\
   %D%/packages/patches/python-poppler-qt5-fix-build.patch	\
+  %D%/packages/patches/python-pyreadstat-link-libiconv.patch	\
   %D%/packages/patches/python-pypdf-annotate-tests-appropriately.patch	\
   %D%/packages/patches/python-pytorch2-system-libraries.patch	\
   %D%/packages/patches/python-sip-include-dirs.patch	\
@@ -1783,6 +1797,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-sphinx-prompt-docutils-0.19.patch	\
   %D%/packages/patches/python-telingo-fix-comparison.patch	\
   %D%/packages/patches/python-typeguard-python3.10.patch	\
+  %D%/packages/patches/python-uqbar-python3.10.patch	        \
   %D%/packages/patches/python-wxwidgets-type-errors.patch	\
   %D%/packages/patches/qtdeclarative-5-disable-qmlcache.patch	\
   %D%/packages/patches/qtdeclarative-disable-qmlcache.patch	\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 5442714665..3f1de1e6b6 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -373,14 +373,14 @@ interface and is based on GNU Guile.")
 (define-public shepherd-0.10
   (package
     (inherit shepherd-0.9)
-    (version "0.10.2")
+    (version "0.10.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/shepherd/shepherd-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0v9ld9gbqdp5ya380fbkdsxa0iqr90gi6yk004ccz3n792nq6wlj"))))
+                "1vxghlxnxajx2iciqmjia49c5hkir8li0gv29kl55frhn2zgxilf"))))
     (native-inputs (modify-inputs (package-native-inputs shepherd-0.9)
                      (replace "guile-fibers"
                        ;; Work around
diff --git a/gnu/packages/bioconductor.scm b/gnu/packages/bioconductor.scm
index 1ea5e47321..a7af5c42ce 100644
--- a/gnu/packages/bioconductor.scm
+++ b/gnu/packages/bioconductor.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015-2023 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015-2024 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017, 2018, 2020, 2021 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
 ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
@@ -7324,13 +7324,13 @@ global-scaling and full-quantile normalization.")
 (define-public r-edger
   (package
     (name "r-edger")
-    (version "4.0.3")
+    (version "4.0.5")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "edgeR" version))
               (sha256
                (base32
-                "0sz46pwa1bsqrff2igswfhhj1fcwzn34zrlawy4fnb58z48kccb0"))))
+                "16cghh83v14jdq5n6xkm3jxj87n6l6zrxjgqdwb2ffgc26vkpb7w"))))
     (properties `((upstream-name . "edgeR")))
     (build-system r-build-system)
     (propagated-inputs
@@ -10510,6 +10510,38 @@ expression information.  The package functions as a wrapper for Startrac and
 powerTCR R packages.")
     (license license:gpl2)))
 
+(define-public r-scrnaseq
+  (package
+    (name "r-scrnaseq")
+    (version "2.16.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "scRNAseq" version
+                              'experiment))
+       (sha256
+        (base32 "0dbh3sqq7lkkdf7vls5qg7fbn6y74c7hsigb4d69pvk934ll88aw"))))
+    (properties `((upstream-name . "scRNAseq")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-annotationdbi
+                             r-annotationhub
+                             r-biocgenerics
+                             r-ensembldb
+                             r-experimenthub
+                             r-genomicfeatures
+                             r-genomicranges
+                             r-s4vectors
+                             r-singlecellexperiment
+                             r-summarizedexperiment))
+    (native-inputs (list r-knitr))
+    (home-page "https://bioconductor.org/packages/scRNAseq")
+    (synopsis "Collection of public single-cell RNA-seq datasets")
+    (description
+     "This package contains gene-level counts for a collection of public
+@code{scRNA-seq} datasets, provided as @code{SingleCellExperiment} objects
+with cell- and gene-level metadata.")
+    (license license:cc0)))
+
 (define-public r-scry
   (package
     (name "r-scry")
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index 2ceb0190b6..7dbebcf3da 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -130,6 +130,7 @@
   #:use-module (gnu packages pdf)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages perl-check)
+  #:use-module (gnu packages perl-web)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages popt)
   #:use-module (gnu packages protobuf)
@@ -574,6 +575,30 @@ BED, GFF/GTF, VCF.")
 whole-genome bisulfite sequencing (WGBS) reads from directional protocol.")
     (license license:asl2.0)))
 
+(define-public bustools
+  (package
+    (name "bustools")
+    (version "0.43.2")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/BUStools/bustools")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "068kjlc4d528269nl5mc3j8h2c95r1v545d3fi1iw1ckg8rba0hg"))))
+    (build-system cmake-build-system)
+    (arguments (list #:tests? #f))          ;no test target
+    (inputs (list zlib))
+    (home-page "https://bustools.github.io")
+    (synopsis "Tools for working with BUS files")
+    (description "bustools is a program for manipulating BUS files for single
+cell RNA-Seq datasets.  It can be used to error correct barcodes, collapse
+UMIs, produce gene count or transcript compatibility count matrices, and is useful
+for many other tasks.")
+    (license license:bsd-2)))
+
 (define-public cellsnp-lite
   ;; Last release is from November 2021 and does not contain fixes.
   (let ((commit "0885d746b0b1ea65c8ef92f8943ca7669ca9734a")
@@ -2365,6 +2390,40 @@ sequencing data and the end result are tables of UMI-unique DamID and CEL-Seq
 counts.")
     (license license:expat)))
 
+(define-public python-snaptools
+  (package
+    (name "python-snaptools")
+    (version "1.4.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "snaptools" version))
+       (sha256
+        (base32
+         "1s5373g5jjbshh3q39zy7dlxr7nda6ksxq9d1gw46h82c4fsmfbn"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs
+     (list python-future
+           python-h5py
+           python-louvain
+           python-numpy
+           python-pybedtools
+           python-pysam))
+    (home-page "https://github.com/r3fang/SnapTools")
+    (synopsis "Tools for processing snap files" )
+    (description
+     "@code{SnapTools} can operate on snap files the following types of
+operations:
+
+@itemize
+@item index the reference genome before alignment;
+@item align reads to the corresponding reference genome;
+@item pre-process by convert pair-end reads into fragments, checking the
+  mapping quality score, alingment and filtration;
+@item create the cell-by-bin matrix.
+@end itemize")
+    (license license:asl2.0)))
+
 (define-public python-bioframe
   (package
     (name "python-bioframe")
@@ -4999,6 +5058,126 @@ be of arbitrary length. Repeats with pattern size in the range from 1 to 2000
 bases are detected.")
     (license license:agpl3+)))
 
+(define-public trinityrnaseq
+  (package
+    (name "trinityrnaseq")
+    (version "2.13.2")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/trinityrnaseq/trinityrnaseq.git")
+                    (commit (string-append "Trinity-v" version))
+                    (recursive? #true)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1qszrxqbx4q5pavpgm4rkrh1z1v1mf7qx83vv3fnlqdmncnsf1gv"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:test-target "test"
+      #:modules
+      '((guix build gnu-build-system)
+        (guix build utils)
+        (ice-9 match)
+        (srfi srfi-1))
+      #:make-flags
+      #~(list (string-append "CC=" #$(cc-for-target)))
+      #:phases
+      #~(modify-phases %standard-phases
+          (replace 'configure
+            (lambda _
+              (setenv "SHELL" (which "sh"))
+              (setenv "CONFIG_SHELL" (which "sh"))
+              ;; Do not require version.h, which triggers a local build of a
+              ;; vendored htslib.
+              (substitute* "trinity-plugins/bamsifter/Makefile"
+                (("sift_bam_max_cov.cpp htslib/version.h")
+                 "sift_bam_max_cov.cpp"))))
+          (add-after 'build 'build-plugins
+            (lambda _
+              ;; Run this in the subdirectory to avoid running the
+              ;; tests right here.
+              (with-directory-excursion "trinity-plugins"
+                (invoke "make" "plugins"))))
+          ;; The install script uses rsync, provides no overrides for the
+          ;; default location at /usr/local/bin, and patching it would change
+          ;; all lines that do something.
+          (replace 'install
+            (lambda* (#:key inputs #:allow-other-keys)
+              (let ((share (string-append #$output "/share/trinity/"))
+                    (bin   (string-append #$output "/bin/")))
+                (mkdir-p bin)
+                (copy-recursively "." share)
+                (delete-file (string-append share "/Chrysalis/build/CMakeFiles/CMakeOutput.log"))
+                (delete-file (string-append share "/Inchworm/build/CMakeFiles/CMakeOutput.log"))
+
+                (wrap-program (string-append share "Trinity")
+                  `("R_LIBS_SITE" ":" = (,(getenv "R_LIBS_SITE")))
+                  `("PERL5LIB"    ":" = (,(getenv "PERL5LIB")))
+                  `("PYTHONPATH"  ":" = (,(getenv "GUIX_PYTHONPATH")))
+                  `("PATH"        ":" =
+                    ,(cons (string-append share "/trinity-plugins/BIN")
+                           (filter-map (match-lambda
+                                         ((name . dir)
+                                          (string-append dir "/bin")))
+                                       inputs))))
+                (symlink (string-append share "Trinity")
+                         (string-append bin "Trinity"))))))))
+    (inputs
+     (list blast+
+           bowtie
+           fastqc
+           hisat
+           htslib
+           icedtea-8
+           jellyfish
+           kallisto
+           multiqc
+           perl
+           perl-uri-escape
+           python-numpy
+           python-wrapper
+           r-ape
+           r-argparse
+           r-biobase
+           r-ctc
+           r-deseq2
+           r-edger
+           r-fastcluster
+           r-glimma
+           r-goplot
+           r-goseq
+           r-gplots
+           r-minimal
+           r-qvalue
+           r-rots
+           r-sm
+           r-tidyverse
+           rsem
+           salmon
+           samtools
+           sra-tools
+           star
+           zlib))
+    (propagated-inputs
+     (list coreutils
+           gzip
+           which))
+    (native-inputs (list cmake))
+    (home-page "https://github.com/trinityrnaseq/trinityrnaseq/wiki")
+    (synopsis "Trinity RNA-Seq de novo transcriptome assembly")
+    (description "Trinity assembles transcript sequences from Illumina RNA-Seq
+data.  Trinity represents a novel method for the efficient and robust de novo
+reconstruction of transcriptomes from RNA-seq data.  Trinity combines three
+independent software modules: Inchworm, Chrysalis, and Butterfly, applied
+sequentially to process large volumes of RNA-seq reads.  Trinity partitions
+the sequence data into many individual de Bruijn graphs, each representing the
+transcriptional complexity at a given gene or locus, and then processes each
+graph independently to extract full-length splicing isoforms and to tease
+apart transcripts derived from paralogous genes.")
+    (license license:bsd-3)))
+
 (define-public repeat-masker
   (package
     (name "repeat-masker")
@@ -20521,24 +20700,28 @@ aligner.")
        (uri (pypi-uri "scvelo" version))
        (sha256
         (base32 "0h5ha1459ljs0qgpnlfsw592i8dxqn6p9bl08l1ikpwk36baxb7z"))))
-    (build-system python-build-system)
+    (build-system pyproject-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         ;; Numba needs a writable dir to cache functions.
-         (add-before 'check 'set-numba-cache-dir
-           (lambda _
-             (setenv "NUMBA_CACHE_DIR" "/tmp")))
-         (replace 'check
-           (lambda* (#:key outputs tests? #:allow-other-keys)
-             (when tests?
-               ;; The discovered test file names must match the names of the
-               ;; compiled files, so we cannot run the tests from
-               ;; /tmp/guix-build-*.
-               (with-directory-excursion
-                   (string-append (assoc-ref outputs "out")
-                                  "/lib/python3.10/site-packages/scvelo/core/tests/")
-                 (invoke "pytest" "-v"))))))))
+     (list
+       #:test-flags
+       ;; XXX: these two tests fail for unknown reasons
+       '(list "-k" "not test_perfect_fit and not test_perfect_fit_2d")
+       #:phases
+       #~(modify-phases %standard-phases
+           ;; Numba needs a writable dir to cache functions.
+           (add-before 'check 'set-numba-cache-dir
+             (lambda _
+               (setenv "NUMBA_CACHE_DIR" "/tmp")))
+           (replace 'check
+             (lambda* (#:key tests? test-flags #:allow-other-keys)
+               (when tests?
+                 ;; The discovered test file names must match the names of the
+                 ;; compiled files, so we cannot run the tests from
+                 ;; /tmp/guix-build-*.
+                 (with-directory-excursion
+                     (string-append #$output
+                                    "/lib/python3.10/site-packages/scvelo/core/tests/")
+                   (apply invoke "pytest" "-v" test-flags))))))))
     (propagated-inputs
      (list python-anndata
            python-hnswlib
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index bd8b621e35..c73a0e665d 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -55,9 +55,12 @@
   #:use-module (gnu packages man)
   #:use-module (gnu packages mtools)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages ninja)
+  #:use-module (gnu packages package-management)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
@@ -71,6 +74,7 @@
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system meson)
   #:use-module (guix build-system pyproject)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
@@ -631,7 +635,7 @@ The SUBDIR argument defaults to \"efi/Guix\", as it is also the case for
 (define-public dtc
   (package
     (name "dtc")
-    (version "1.6.1")
+    (version "1.7.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -639,42 +643,56 @@ The SUBDIR argument defaults to \"efi/Guix\", as it is also the case for
                     "dtc-" version ".tar.gz"))
               (sha256
                (base32
-                "0xm38h31jb29xfh2sfyk48d8wdfq4b8lmb412zx9vjr35izjb9iq"))))
-    (build-system gnu-build-system)
+                "0cij9399snpn672pdbda8qbxljdkfg068kvv3g5811rz6yslx124"))
+              (patches
+               (search-patches "dtc-meson-cell-overflow.patch"))))
+    (build-system meson-build-system)
     (arguments
      (list
-      #:modules `(,@%gnu-build-system-modules (srfi srfi-26))
-      #:make-flags
-      #~(list (string-append "CC=" #$(cc-for-target))
-              ;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1.
-              (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib")
-              (string-append "PREFIX=" #$output)
-              (string-append "SETUP_PREFIX=" #$output)
-              "INSTALL=install")
+      #:modules '((guix build meson-build-system)
+                  (guix build utils)
+                  (srfi srfi-26))
       #:phases
       #~(modify-phases %standard-phases
-          (add-after 'unpack 'patch-pkg-config
+          (add-after 'unpack 'preparations
             (lambda _
-              (substitute* '("Makefile"
-                             "tests/run_tests.sh")
-                (("pkg-config")
-                 #$(pkg-config-for-target)))))
-          (delete 'configure)           ;no configure script
-          (add-before 'build 'install-doc
+              ;; The version string is usually derived via setuptools-scm, but
+              ;; without the git metadata available this fails.
+              (setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)
+
+              ;; Needed by setup.py.
+              (setenv "DESTDIR" "/")
+
+              ;; Native gcc needed by run_test.sh.
+              (setenv "CC" "gcc")
+
+              ;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1.
+              (setenv "LDFLAGS"
+                      (string-append "-Wl,-rpath=" #$output "/lib"))))
+          (add-after 'unpack 'install-doc
             (lambda _
               (with-directory-excursion "Documentation"
                 (for-each (cut install-file <> (string-append
                                                 #$output "/share/doc/dtc/"))
                           '("dts-format.txt"
                             "dt-object-internal.txt"
-                            "manual.txt"))))))))
+                            "manual.txt")))))
+          (add-after 'unpack 'patch-pkg-config
+            (lambda _
+              (substitute* '("tests/run_tests.sh")
+                (("pkg-config")
+                 #$(pkg-config-for-target))))))))
     (native-inputs
      (append
       (list bison
             flex
             libyaml
+            ninja
             pkg-config
-            swig)
+            python
+            python-setuptools-scm
+            swig
+            which)
       (if (member (%current-system) (package-supported-systems valgrind))
           (list valgrind)
           '())))
diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index 602d8f26c5..a36bb289cd 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2018, 2019 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2017, 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2020, 2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018, 2020, 2022 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;; Copyright © 2019 Léo Le Bouter <lle-bout@zaclys.net>
@@ -323,6 +323,9 @@ or false to signal an error."
      ((string=? system "powerpc64-linux") "/lib/ld64.so.1")
      ((string=? system "alpha-linux") "/lib/ld-linux.so.2")
 
+     ;; TODO: Differentiate between x86_64-linux-gnu and x86_64-linux-gnux32.
+     ((string=? system "x86_64-linux-gnux32") "/lib/ld-linux-x32.so.2")
+
      ;; XXX: This one is used bare-bones, without a libc, so add a case
      ;; here just so we can keep going.
      ((string=? system "arm-eabi") "no-ld.so")
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index 80e0b94d01..449340f331 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -47,6 +47,7 @@
 ;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
 ;;; Copyright © 2023 Reza Housseini <reza@housseini.me>
 ;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
+;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -602,10 +603,10 @@ It allows the specification of behaviour scenarios using a given-when-then
 pattern.")
       (license license:apsl2))))
 
-(define-public catch2-3.3
+(define-public catch2-3
   (package
     (name "catch2")
-    (version "3.4.0")
+    (version "3.5.1")
     (home-page "https://github.com/catchorg/Catch2")
     (source (origin
               (method git-fetch)
@@ -615,7 +616,7 @@ pattern.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1gdfsva6mnd66px85fmm3s65h8qzqnmgbmws2i3nygfav1y8d88f"))))
+                "0p7rk01n4qfnnm1bgakllyqi83n1kbpz11gh65z1vspfz58hs9iv"))))
     (build-system cmake-build-system)
     (arguments
      (list
@@ -1416,6 +1417,30 @@ distributed testing in both @code{load} and @code{each} modes.  It also
 supports coverage of subprocesses.")
   (license license:expat)))
 
+(define-public python-pytest-dotenv
+  (package
+    (name "python-pytest-dotenv")
+    (version "0.5.2")
+    (source
+     (origin
+       ;; No tests in the PyPI tarball.
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/quiqua/pytest-dotenv")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0bdxwaak5clhsd63b9q65nf2amqqv5hfn7dskfakyldxsqnnh0y6"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-dotenv))
+    (native-inputs (list python-pytest))
+    (home-page "https://github.com/quiqua/pytest-dotenv")
+    (synopsis "Automatically detect and load a .env file before running tests")
+    (description
+     "This Pytest plugin automatically detects and loads environment variables
+from a .env file before running tests.")
+    (license license:expat)))
+
 (define-public python-pytest-httpserver
   (package
     (name "python-pytest-httpserver")
diff --git a/gnu/packages/chemistry.scm b/gnu/packages/chemistry.scm
index e177b27e9d..df96a2f5c1 100644
--- a/gnu/packages/chemistry.scm
+++ b/gnu/packages/chemistry.scm
@@ -263,7 +263,7 @@ molecules.")
     (arguments '(#:tests? #f))
     ;; There is no support for modern msgpack versions yet (see:
     ;; https://github.com/rcsb/mmtf-cpp/issues/44).
-    (propagated-inputs (list msgpack))  ;included by mmtf/structure_data.hpp
+    (propagated-inputs (list msgpack-3)) ;included by mmtf/structure_data.hpp
     (home-page "https://mmtf.rcsb.org/")
     (synopsis "C++ API for the Macromolecular Transmission Format")
     (description "This package is a library for the
diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm
index 0f2c6e0b85..f65506dcec 100644
--- a/gnu/packages/cpp.scm
+++ b/gnu/packages/cpp.scm
@@ -31,7 +31,7 @@
 ;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2022, 2023 David Elsing <david.elsing@posteo.net>
 ;;; Copyright © 2022, 2023 Zheng Junjie <873216071@qq.com>
-;;; Copyright © 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022 Antero Mejr <antero@mailbox.org>
 ;;; Copyright © 2023 Sughosha <Sughosha@proton.me>
 ;;; Copyright © 2023 Artyom V. Poptsov <poptsov.artyom@gmail.com>
@@ -327,6 +327,28 @@ the @code{Clang/LLVM} infrastructure to extract the data, and emits it in
 various formats, including @code{json}.")
     (license license:gpl2+)))
 
+(define-public expected-lite
+  (package
+    (name "expected-lite")
+    (version "0.6.3")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/martinmoene/expected-lite")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0d58nqh2fwdzdpln2wlnf898wyfxdnskq6ff33azbg92d5ibzys2"))))
+    (build-system cmake-build-system)
+    (home-page "https://github.com/martinmoene/expected-lite")
+    (synopsis "Expected objects in C++11 and later")
+    (description "@i{expected lite} is a single-file header-only library for
+objects that either represent a valid value or an error that can be passed by
+value.  It is intended for use with C++11 and later.  The library is based on
+the @code{std::expected} proposal (@url{http://wg21.link/p0323}).")
+    (license license:boost1.0)))
+
 (define-public libzen
   (package
     (name "libzen")
diff --git a/gnu/packages/curl.scm b/gnu/packages/curl.scm
index b33f4d36d4..f73aed679d 100644
--- a/gnu/packages/curl.scm
+++ b/gnu/packages/curl.scm
@@ -65,14 +65,14 @@
 (define-public curl
   (package
     (name "curl")
-    (version "8.4.0")
+    (version "8.5.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://curl.se/download/curl-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "0bd8y8v66biyqvg70ka1sdd0aixs6yzpnvfsig907xzh9af2mihn"))
+                "1sqfflilf7mcz1g03lazyr6v6pf1rsrzprrknsir10hdwawqvas2"))
               (patches (search-patches "curl-use-ssl-cert-env.patch"))))
     (build-system gnu-build-system)
     (outputs '("out"
@@ -127,15 +127,20 @@
                                    (if parallel-tests?
                                        (number->string (parallel-job-count))
                                        "1")))
+                       ;; Ignore test 1477 due to a missing file in the 8.5.0
+                       ;; release.  See
+                       ;; <https://github.com/curl/curl/issues/12462>.
                        (arguments `("-C" "tests" "test"
                                     ,@make-flags
                                     ,(if #$(or (system-hurd?)
                                                (target-arm32?)
                                                (target-aarch64?))
                                          ;; protocol FAIL
-                                         (string-append "TFLAGS=\"~1474 "
-                                                        job-count "\"")
-                                         (string-append "TFLAGS=" job-count)))))
+                                         (string-append "TFLAGS=~1474 "
+                                                        "!1477 "
+                                                        job-count)
+                                         (string-append "TFLAGS=\"~1477 "
+                                                        job-count "\"")))))
                   ;; The top-level "make check" does "make -C tests quiet-test", which
                   ;; is too quiet.  Use the "test" target instead, which is more
                   ;; verbose.
diff --git a/gnu/packages/display-managers.scm b/gnu/packages/display-managers.scm
index 7120c2ad75..2df4e6311b 100644
--- a/gnu/packages/display-managers.scm
+++ b/gnu/packages/display-managers.scm
@@ -69,25 +69,16 @@
 (define-public sddm
   (package
     (name "sddm")
-    (version "0.19.0")
+    (version "0.20.0")
     (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://github.com/sddm/sddm"
-                    "/releases/download/v" version "/"
-                    "sddm-" version ".tar.xz"))
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/sddm/sddm")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0hcdysw8ibr66vk8i7v56l0v5ijvhlq67v4460mc2xf2910g2m72"))
-              (snippet
-               #~(begin
-                   ;; https://github.com/sddm/sddm/issues/1536
-                   ;; https://github.com/sddm/sddm/commit/e93bf95c54ad8c2a1604f8d7be05339164b19308
-                   ;; Commit comes shortly after the 0.19.0 release.
-                   (use-modules ((guix build utils)))
-                   (substitute* "src/daemon/XorgDisplayServer.cpp"
-                     (("m_cookie\\[i\\] = digits\\[dis\\(gen\\)\\]")
-                      "m_cookie[i] = QLatin1Char(digits[dis(gen)])"))))))
+                "1450zv03d3mbid27986p4mdshw9qf3ar8crl4idybf7khxgan22y"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config qttools-5))
@@ -109,36 +100,39 @@
            shadow
            wayland))
     (arguments
-     `(#:configure-flags
-       ,#~(list
-            ;; This option currently does nothing, but will presumably be enabled
-            ;; if/when <https://github.com/sddm/sddm/pull/616> is merged.
-            "-DENABLE_WAYLAND=ON"
-            "-DENABLE_PAM=ON"
-            ;; Both flags are required for elogind support.
-            "-DNO_SYSTEMD=ON" "-DUSE_ELOGIND=ON"
-            "-DCONFIG_FILE=/etc/sddm.conf"
-            ;; Set path to /etc/login.defs.
-            ;; An alternative would be to use -DUID_MIN and -DUID_MAX.
-            (string-append "-DLOGIN_DEFS_PATH="
-                           #$(this-package-input "shadow")
-                           "/etc/login.defs")
-            (string-append "-DQT_IMPORTS_DIR="
-                           #$output "/lib/qt5/qml")
-            (string-append "-DCMAKE_INSTALL_SYSCONFDIR="
-                           #$output "/etc"))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'embed-loginctl-reference
-           (lambda _
-             (substitute* "CMakeLists.txt"
-               (("/usr/bin/loginctl") (which "loginctl")))
-               #t)))))
+     (list
+      #:configure-flags
+      #~(list
+         "-DENABLE_WAYLAND=ON"
+         "-DENABLE_PAM=ON"
+         ;; Both flags are required for elogind support.
+         "-DNO_SYSTEMD=ON"
+         "-DUSE_ELOGIND=ON"
+         "-DCONFIG_FILE=/etc/sddm.conf"
+         ;; Set path to /etc/login.defs.
+         ;; An alternative would be to use -DUID_MIN and -DUID_MAX.
+         (string-append "-DLOGIN_DEFS_PATH="
+                        #$(this-package-input "shadow")
+                        "/etc/login.defs")
+         (string-append "-DCMAKE_CXX_FLAGS=-I"
+                        #$(this-package-input
+                           "qtdeclarative") "/include/qt5")
+         (string-append "-DQT_IMPORTS_DIR="
+                        #$output "/lib/qt5/qml")
+         (string-append "-DCMAKE_INSTALL_SYSCONFDIR="
+                        #$output "/etc"))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'embed-loginctl-reference
+            (lambda _
+              (substitute* "CMakeLists.txt"
+                (("/usr/bin/loginctl")
+                 (which "loginctl"))))))))
     (synopsis "QML based X11 and Wayland display manager")
     (description "SDDM is a display manager for X11 and Wayland aiming to be
 fast, simple and beautiful.  SDDM is themeable and puts no restrictions on the
-user interface design.  It uses QtQuick which gives the designer the ability to
-create smooth, animated user interfaces.")
+user interface design.  It uses QtQuick which gives the designer the ability
+to create smooth, animated user interfaces.")
     (home-page "https://github.com/sddm/sddm")
     ;; QML files are MIT licensed and images are CC BY 3.0.
     (license (list license:gpl2+ license:expat license:cc-by3.0))))
diff --git a/gnu/packages/education.scm b/gnu/packages/education.scm
index 2fd1d4a632..7b72ed0349 100644
--- a/gnu/packages/education.scm
+++ b/gnu/packages/education.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2017-2023 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2018-2023 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2018-2024 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2020 Robert Smith <robertsmith@posteo.net>
 ;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
@@ -564,7 +564,7 @@ a pen-tablet display and a beamer.")
 (define-public fet
   (package
     (name "fet")
-    (version "6.9.0")
+    (version "6.15.0")
     (source
      (origin
        (method url-fetch)
@@ -573,7 +573,7 @@ a pen-tablet display and a beamer.")
               (list (string-append directory base)
                     (string-append directory "old/" base))))
        (sha256
-        (base32 "1lnw58ga1ldhqfznclmk9l21698pg152w3slq2cwmr69ywqr5wys"))))
+        (base32 "0mmk9f0b23lmmk40mv25wf9vgb7wdgfn5zsa1qrkvkh7dh1hjpax"))))
     (build-system gnu-build-system)
     (arguments
      (list
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 979c55bb99..1d99fb30ff 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -2017,6 +2017,27 @@ Apprentice and Sourcerer.")
 theme but now takes more inspiration from the Nano theme.")
     (license license:gpl3+)))
 
+(define-public emacs-adwaita-dark-theme
+  ;; Version 1.1.1 isn't tagged upstream.
+  (package
+    (name "emacs-adwaita-dark-theme")
+    (version "1.1.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://gitlab.com/jessieh/adwaita-dark-theme")
+                    (commit "057c39313341907b35c68d2179226886a0c276fd")))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1g7hyg2hfvn24gaw4lca4g8lw10q2wg9nfrgl7pfdggz202m027c"))))
+    (build-system emacs-build-system)
+    (home-page "https://gitlab.com/jessieh/adwaita-dark-theme")
+    (synopsis "Adwaita-inspired dark color scheme for Emacs")
+    (description
+     "This package provides an Adwaita-inspired dark color scheme for Emacs.")
+    (license license:gpl2+)))
+
 (define-public emacs-treepy
   (package
     (name "emacs-treepy")
@@ -10105,13 +10126,20 @@ constants and units into an Emacs buffer.")
        (sha256
         (base32 "0kq40g46s8kgiafrhdq99h79rz9h5fvgz59k7ralmf86bl4sdmdb"))))
     (build-system emacs-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'remove-spurious-require
+                 (lambda _
+                   (substitute* "tagedit.el"
+                     (("\\(require 'assoc\\)") "")))))))
     (propagated-inputs
-     (list emacs-s emacs-dash))
+     (list emacs-dash emacs-s))
     (home-page "https://github.com/magnars/tagedit")
-    (synopsis "Some paredit-like features for html-mode")
+    (synopsis "Some Paredit-like features for HTML mode")
     (description
-     "This package provides a collection of paredit-like functions for editing
-in @code{html-mode}.")
+     "This package provides a collection of Paredit-like functions for editing
+in HTML mode.")
     (license license:gpl3+)))
 
 (define-public emacs-slime
@@ -11388,6 +11416,30 @@ package provides a light and a dark variant.")
 Solarized color scheme.")
       (license license:expat))))
 
+(define-public emacs-color-identifiers-mode
+  (let ((commit "a26d00d898e0a3295cb7da9323046397223ea1fe")
+        (revision "0"))
+    (package
+      (name "emacs-color-identifiers-mode")
+      (version (git-version "1.1" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/ankurdave/color-identifiers-mode")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1kky827f922ziiwasrfnv97vqdf62fp9yml36x1fjsm2h6qw0c8v"))))
+      (build-system emacs-build-system)
+      (propagated-inputs (list emacs-dash))
+      (home-page "https://github.com/ankurdave/color-identifiers-mode")
+      (synopsis "Minor mode for coloring identifiers based on their names")
+      (description
+       "This package provides an Emacs minor mode to highlight each source
+code identifier uniquely based on its name.")
+      (license license:gpl3+))))
+
 (define-public emacs-poet-theme
   (let ((commit "16eb694f0755c04c4db98614d0eca1199fddad70")
         (revision "1"))
@@ -29880,14 +29932,14 @@ buffer and launches Magit from the status buffer for the project at point.")
 (define-public emacs-repology
   (package
     (name "emacs-repology")
-    (version "1.2.3")
+    (version "1.2.4")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://elpa.gnu.org/packages/"
                            "repology-" version ".tar"))
        (sha256
-        (base32 "1ngx23b7dilyps20nznrrn867kbxyn6nryf4p1sy5m576hkw18kn"))))
+        (base32 "0l53wl0bk8rnqwsjdh1hwvkvbay080l10bslcj3scn42bgbi59j1"))))
     (build-system emacs-build-system)
     (arguments
      (list
diff --git a/gnu/packages/finance.scm b/gnu/packages/finance.scm
index 749f741710..eadaa46102 100644
--- a/gnu/packages/finance.scm
+++ b/gnu/packages/finance.scm
@@ -2300,7 +2300,7 @@ mining.")
 (define-public p2pool
   (package
     (name "p2pool")
-    (version "3.7")
+    (version "3.10")
     (source
      (origin
        (method git-fetch)
@@ -2309,7 +2309,7 @@ mining.")
              (commit (string-append "v" version))
              (recursive? #t)))
        (file-name (git-file-name name version))
-       (sha256 (base32 "1sghdk8yq8si0bq0z83fji48q8yrq0ymvsxbbh5mscw6223syrjq"))
+       (sha256 (base32 "0lp9slfwaq3wp4x6xpsiazam5lv6dz57m20adzlzzk0anb1ascr0"))
        (modules '((guix build utils)))
        (snippet
         #~(for-each delete-file-recursively
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 5cebf515bf..e691bf33da 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -875,7 +875,7 @@ Executables included are:
   (let ((toolchain-ver "GCC5"))
     (package
       (name "ovmf")
-      (version "202308")
+      (version "202311")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -886,7 +886,7 @@ Executables included are:
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "04rnfnaqr2c7ayplj7ib730zp1snw157zx5rmykz5hz1zz2vb20j"))))
+                  "136dl5cxpjpg37whzlqq7jrrjsgybmwrgkbbmks8xaixqmzwhbw0"))))
       (build-system gnu-build-system)
       (arguments
        (list
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 7516e1642b..e050f4fde9 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -123,6 +123,29 @@
 titling.")
     (license license:silofl1.1)))
 
+(define-public font-cardo
+  (package
+    (name "font-cardo")
+    (version "1.04")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://scholarsfonts.net/cardo"
+                                  (string-delete #\. version) ".zip"))
+              (sha256
+               (base32
+                "0ps55zjva4fzmg47w2i8srrh8sqxz1wkcclihwgzlwfbaxixn0cl"))))
+    (build-system font-build-system)
+    (home-page "https://scholarsfonts.net/cardofnt.html")
+    (synopsis "Unicode font for classical scholarship")
+    (description
+     "Cardo is a large unicode font specifically designed for the needs of
+classicists, biblical scholars, medievalists, and linguists.  Since it may be
+used to prepare materials for publication, it also contains features that are
+required for high-quality typography, such as ligatures, text figures (also
+known as old style numerals), true small capitals and a variety of punctuation
+and space characters.")
+    (license license:silofl1.1)))
+
 (define-public font-chivo
   (let ((commit "dc61c468d79781eb5183426e88e844af16cdc3e5")
         (revision "0"))
@@ -1952,15 +1975,15 @@ weights and five widths in both Roman and Italic, plus variable fonts.")
 (define-public font-sarasa-gothic
   (package
     (name "font-sarasa-gothic")
-    (version "0.42.6")
+    (version "1.0.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/be5invis/Sarasa-Gothic"
                            "/releases/download/v" version
-                           "/sarasa-gothic-ttc-" version ".7z"))
+                           "/Sarasa-TTC-" version ".7z"))
        (sha256
-        (base32 "0czx10yph2lxg2k4w6qjnil73zb2pgg3g400apm9gay41m04990v"))))
+        (base32 "1cgqf15fhg567s2bwjpal3xfcdnbgyy0iav5181zkn6b4k56dgl4"))))
     (build-system font-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 73f93a9992..ea1adf0ecf 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -196,69 +196,71 @@ is used in some video games and movies.")
     (license license:zlib)))
 
 (define-public dds
-  (package
-    (name "dds")
-    (version "2.9.0")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/dds-bridge/dds")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32
-         "1iv09qic43nvla02lm8zgnkqpjgnc95p8zh3wyifmnmlh1rz02yj"))))
-    (build-system gnu-build-system)
-    (arguments
-     (list #:phases
-           #~(modify-phases %standard-phases
-               (add-after 'unpack 'chdir
-                 (lambda _
-                   (chdir "src")))
-               (replace 'configure
-                 ;; Configuration is done by copying the appropriate
-                 ;; make file in the working directory.  There is no
-                 ;; configure script.
-                 (lambda _
-                   (copy-file "Makefiles/Makefile_linux_shared"
-                              "Makefile")))
-               (replace 'check
-                 ;; There is no "check" traget.  We must compile
-                 ;; a "dtest" program and apply it on a data set.
-                 (lambda* (#:key tests? #:allow-other-keys)
-                   (when tests?
-                     (install-file "libdds.so" "../test")
-                     (with-directory-excursion "../test"
-                       (copy-file "Makefiles/Makefile_linux"
-                                  "Makefile")
-                       (substitute* "Makefile"
-                         (("-Werror") ""))
-                       (invoke "make")
-                       (invoke "./dtest" "-f" "../hands/list100.txt")))))
-               (replace 'install
-                 ;; "install" target merely moves ".so" file around
-                 ;; the source directory.  We install it in the store,
-                 ;; along with all shipped documentation (which cannot
-                 ;; be built from source unfortunately).
-                 (lambda _
-                   (install-file "libdds.so"
-                                 (string-append #$output "/lib"))
-                   (let ((doc (string-append #$output
-                                             "/share/doc/"
-                                             #$name "-" #$version)))
-                     (install-file "../LICENSE" doc)
-                     (copy-recursively "../doc" doc)))))))
-    (native-inputs
-     (list gawk procps))
-    (inputs
-     (list boost))
-    (home-page "https://privat.bahnhof.se/wb758135/")
-    (synopsis "Double dummy solver for the bridge card game")
-    (description "DDS is a double-dummy solver of bridge hands.  It supports
+  (let ((commit "d2bc4c2c703941664fc1d73e69caa5233cdeac18")
+        (revision "1"))
+    (package
+      (name "dds")
+      (version (git-version "2.9.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/dds-bridge/dds")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1ishbb69cvyv96xdxshnly0m5ydwljgdf8fwa1cr9rj2qj40q4rm"))))
+      (build-system gnu-build-system)
+      (arguments
+       (list #:phases
+             #~(modify-phases %standard-phases
+                 (add-after 'unpack 'chdir
+                   (lambda _
+                     (chdir "src")))
+                 (replace 'configure
+                   ;; Configuration is done by copying the appropriate
+                   ;; make file in the working directory.  There is no
+                   ;; configure script.
+                   (lambda _
+                     (copy-file "Makefiles/Makefile_linux_shared"
+                                "Makefile")))
+                 (replace 'check
+                   ;; There is no "check" traget.  We must compile
+                   ;; a "dtest" program and apply it on a data set.
+                   (lambda* (#:key tests? #:allow-other-keys)
+                     (when tests?
+                       (install-file "libdds.so" "../test")
+                       (with-directory-excursion "../test"
+                         (copy-file "Makefiles/Makefile_linux"
+                                    "Makefile")
+                         (substitute* "Makefile"
+                           (("-Werror") ""))
+                         (invoke "make")
+                         (invoke "./dtest" "-f" "../hands/list100.txt")))))
+                 (replace 'install
+                   ;; "install" target merely moves ".so" file around
+                   ;; the source directory.  We install it in the store,
+                   ;; along with all shipped documentation (which cannot
+                   ;; be built from source unfortunately).
+                   (lambda _
+                     (install-file "libdds.so"
+                                   (string-append #$output "/lib"))
+                     (let ((doc (string-append #$output
+                                               "/share/doc/"
+                                               #$name "-" #$version)))
+                       (install-file "../LICENSE" doc)
+                       (copy-recursively "../doc" doc)))))))
+      (native-inputs
+       (list gawk procps))
+      (inputs
+       (list boost))
+      (home-page "https://privat.bahnhof.se/wb758135/")
+      (synopsis "Double dummy solver for the bridge card game")
+      (description "DDS is a double-dummy solver of bridge hands.  It supports
 single-threading and multi-threading for improved performance.  DDS
 offers a wide range of functions, including par-score calculations.")
-    (license license:asl2.0)))
+      (license license:asl2.0))))
 
 (define-public deutex
   (package
@@ -3269,16 +3271,16 @@ progresses the level, or you may regenerate tiles as the world changes.")
 (define-public bbcsdl
   (package
     (name "bbcsdl")
-    (version "1.35a")
+    (version "1.39a")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url "https://github.com/rtrussell/BBCSDL/")
-                    (commit "b9b2a3eb438cb799edb2766055b3c38e9518e3e3")))
+                    (commit "93b0ffae960f4c4f45fdc2202bc6e83ee5ca277c")))
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1d03xmhrl6ba6w0vwfk46mpyc9d0w3bixxj2d4irx7wl7bh3bfic"))))
+                "03ga14k2hbhflnaynbyx9lwlbxlzx3rv6zqq21yhl183s6d4c0wa"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -3318,6 +3320,7 @@ progresses the level, or you may regenerate tiles as the world changes.")
                      inputs (string-append "share/fonts/truetype/" font))
                     (string-append opt "/lib/" font)))
                  '("DejaVuSans.ttf" "DejaVuSansMono.ttf"
+                   "DejaVuSans-Oblique.ttf"
                    "FreeSans.ttf" "FreeMono.ttf" "FreeSerif.ttf"))
                 (mkdir bin)
                 (symlink (string-append opt "/bbcsdl")
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index c7813790a1..cf2e38f49c 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -78,7 +78,8 @@
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
 ;;; Copyright © 2023 Florian Pelz <pelzflorian@pelzflorian.de>
 ;;; Copyright © 2023 Ivana Drazovic <iv.dra@hotmail.com>
-;;; Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
+;;; Copyright © 2023, 2024 gemmaro <gemmaro.dev@gmail.com>
+;;; Copyright © 2023 Wilko Meyer <w@wmeyer.eu>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -193,6 +194,7 @@
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-compression)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages qt)
@@ -230,6 +232,7 @@
   #:use-module (guix build-system meson)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system qt)
   #:use-module (guix build-system scons)
   #:use-module (guix build-system trivial)
@@ -2367,6 +2370,55 @@ Every puzzle has a complete solution, although there may be more than one.")
     "PrBoom+ is a Doom source port developed from the original PrBoom project.")
    (license license:gpl2+)))
 
+(define-public redeal
+  (let ((commit "e2e81a477fd31ae548a340b5f0f380594d3d0ad6")
+        (revision "1"))
+    (package
+      (name "redeal")
+      (version (git-version "0.2.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/anntzer/redeal")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1vac36bg4ah9gs4hgmp745xq6nnmd7s71vsq99d72ng3sxap0wa3"))))
+      (build-system pyproject-build-system)
+      (arguments
+       (list
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'unpack 'unbundle-dds
+              (lambda* (#:key inputs #:allow-other-keys)
+                (substitute* "setup.py"
+                  (("cmdclass=.*") ""))
+                (let ((libdds (search-input-file inputs "lib/libdds.so")))
+                  (substitute* "redeal/dds.py"
+                    ((" and os.path.exists\\(dll_path\\)") "")
+                    (("dll = DLL\\(dll_path\\)")
+                     (format #f "dll = DLL(~s)" libdds))))))
+            (add-after 'install 'install-examples
+              (lambda _
+                (let* ((doc (string-append #$output "/share/doc/"))
+                       (examples
+                        (string-append doc #$name "-" #$version "/examples")))
+                  (mkdir-p examples)
+                  (copy-recursively "examples" examples)))))))
+      (inputs (list dds `(,python "tk")))
+      (propagated-inputs (list python-colorama))
+      (home-page "https://github.com/anntzer/redeal")
+      (synopsis
+       "Deal generator for bridge card game, written in Python")
+      (description
+       "Redeal is a deal generator written in Python.  It outputs deals
+satisfying whatever conditions you specify --- deals with a double void, deals
+with a strong 2♣ opener opposite a yarborough, etc.  Using Bo Haglund's double
+dummy solver, it can even solve the hands it has generated for you.")
+      (license license:gpl3))))
+
 (define-public retux
   (let ((release "1.6.1")
         (revision 0))
@@ -3385,25 +3437,29 @@ a C library, so they can easily be integrated into other programs.")
 (define-public taisei
   (package
     (name "taisei")
-    (version "1.3.2")
+    (version "1.4")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/taisei-project/"
                            "taisei/releases/download/v" version
-                           "/taisei-v" version ".tar.xz"))
+                           "/taisei-" version ".tar.xz"))
        (sha256
-        (base32 "1g53fcyrlzmvlsb40pw90gaglysv6n1w42hk263iv61ibhdmzh6v"))))
+        (base32 "1glrr99xiyz674d1izgvmk9w1zxanc94d34pacd0wya66bbml0nc"))))
     (build-system meson-build-system)
     (arguments
-     `(#:build-type "release"      ;comment out for bug-reporting (and cheats)
-       #:configure-flags
-       (list "-Dr_default=gles30"
-             "-Dr_gles20=true"
-             "-Dr_gles30=true"
-             "-Dshader_transpiler=true")))
+     (list
+      #:build-type "release" ;comment out for bug-reporting (and cheats)
+      #:configure-flags #~(list "-Dr_default=gles30"
+                                "-Dr_gles20=true"
+                                "-Dr_gles30=true"
+                                "-Dshader_transpiler=true")))
     (native-inputs
-     (list pkg-config python python-docutils python-pygments))
+     (list pkg-config
+           python
+           python-docutils
+           python-pygments
+           python-zstandard))
     (inputs
      (list cglm
            freetype
@@ -3417,21 +3473,23 @@ a C library, so they can easily be integrated into other programs.")
            sdl2-mixer
            shaderc
            spirv-cross
-           zlib))
+           zlib
+           (list zstd "lib")))
     (home-page "https://taisei-project.org/")
     (synopsis "Shoot'em up fangame and libre clone of Touhou Project")
     (description
      "The player controls a character (one of three: Good, Bad, and Dead),
 dodges the missiles (lots of it cover the screen, but the character's hitbox
 is very small), and shoot at the adversaries that keep appear on the screen.")
-    (license (list ;;game
-                   license:expat
-                   ;;resources/00-taisei.pkgdir/bgm/
-                   ;;atlas/portraits/
-                   license:cc-by4.0
-                   ;;miscellaneous
-                   license:cc0
-                   license:public-domain))))
+    (license (list
+              ;; game
+              license:expat
+              ;; resources/00-taisei.pkgdir/bgm/
+              ;; atlas/portraits/
+              license:cc-by4.0
+              ;; miscellaneous
+              license:cc0
+              license:public-domain))))
 
 (define-public cmatrix
   (package
@@ -3833,7 +3891,7 @@ for common mesh file formats, and collision detection.")
   (package
     (inherit irrlicht)
     (name "irrlicht-for-minetest")
-    (version "1.9.0mt10")
+    (version "1.9.0mt13")
     (source
      (origin
        (method git-fetch)
@@ -3843,7 +3901,7 @@ for common mesh file formats, and collision detection.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0y5vchz91khs8dmrkpgc7sqmvzx2yjj6svivvm80r4yppv7s03rw"))))
+         "11pxg0yh50ym1hvh8va5jbbcjz5dsshj3xxvm3qhkgg96vpism06"))))
     (build-system cmake-build-system)
     (arguments
      ;; No check target.
@@ -10115,6 +10173,36 @@ can be downloaded from @url{https://zero.sjeng.org/best-network}.")
    (home-page "https://github.com/bernds/q5Go")
    (license license:gpl2+)))
 
+(define-public qcheckers
+  (package
+    (name "qcheckers")
+    (version "0.9.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/portnov/qcheckers")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "05wzql6abzdf6l0vdzki4rfy2zn31mcplh1wkw3ddk8w81pvaymw"))))
+    (build-system qt-build-system)
+    (arguments
+     (list
+      #:tests? #f
+      #:phases
+      #~(modify-phases %standard-phases
+          (replace 'configure
+            (lambda _
+              (invoke "qmake"
+                      (string-append "PREFIX=" #$output)))))))
+    (inputs (list qtbase-5 qtsvg-5))
+    (home-page "https://portnov.github.io/qcheckers/")
+    (synopsis "Qt-based checkers boardgame")
+    (description "QCheckers, formely known as KCheckers, is a is a Qt version
+of the classic boardgame checkers (also known as draughts).")
+    (license license:gpl2+)))
+
 (define-public xmoto
   (package
     (name "xmoto")
@@ -10415,6 +10503,31 @@ sunfish, but is written in C rather than Python.  It also has TUI tools for
 using any UCI engine and also to connect UCI engines to Lichess.")
       (license license:agpl3+))))
 
+(define-public morris
+  (package
+    (name "morris")
+    (version "0.3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/farindk/morris")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1kkcnpkzgybm7rqg7nafd7sqd5m4alns6l4j5zcf3p41jdc9s3iv"))))
+    (build-system glib-or-gtk-build-system)
+    (inputs (list automake autoconf pkg-config intltool
+		 gnu-gettext libtool glib gtk+-2 boost))
+    (arguments `(#:tests? #f))
+    (home-page "http://nine-mens-morris.net/downloads.html")
+    (synopsis "Morris is an implementation of the board game Nine Men's Morris")
+    (description "Morris is an implementation of the board game Nine Men's Morris.
+It supports not only the standard game, but also several rule-variants and different
+board layouts. You can play against the computer, or simply use the program to
+present the board, but play against another human opponent.")
+    (license license:gpl3)))
+
 (define-public barrage
   (package
     (name "barrage")
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index a8b74a3632..5590cd3d7e 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014, 2015, 2016, 2017, 2019, 2021 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2023 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2015-2018, 2020-2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015-2018, 2020-2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Carlos Sánchez de La Lama <csanchezdll@gmail.com>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2020, 2022 Marius Bakke <marius@gnu.org>
@@ -75,6 +75,9 @@ where the OS part is overloaded to denote a specific ABI---into GCC
            "--with-mode=thumb"
            "--with-fpu=neon"))
 
+        ((string-match "x86_64-linux-gnux32" target)
+         '("--with-abi=mx32"))
+
         ((and (string-suffix? "-gnu" target)
               (not (string-contains target "-linux")))
          ;; Cross-compilation of libcilkrts in GCC 5.5.0 to GNU/Hurd fails
diff --git a/gnu/packages/geo.scm b/gnu/packages/geo.scm
index 31abb2cc36..73b7aa3d11 100644
--- a/gnu/packages/geo.scm
+++ b/gnu/packages/geo.scm
@@ -3228,3 +3228,31 @@ For maps, it can uses its own \"binfile\" map format, or Garmin map
 file format, and data from OpenStreetMap, Garmin maps, Marco Polo
 Grosser Reiseplaner, Routeplaner Europa 2007, Map + Route.")
     (license license:gpl2)))
+
+(define-public laszip
+  (package
+    (name "laszip")
+    (version "3.4.3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/LASzip/LASzip")
+             (commit "3.4.3")))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "09lcsgxwv0jq50fhsgfhx0npbf1zcwn3hbnq6q78fshqksbxmz7m"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      #:configure-flags #~(list "-DLASZIP_BUILD_STATIC=NO")
+      #:build-type "Release"
+      ;; No tests.
+      #:tests? #f))
+    (home-page "https://laszip.org/")
+    (synopsis "Compression library for LAS files")
+    (description
+     "LASzip is a library for compressing @code{LAS} files and uncompressing
+@code{LAZ} files.  The @code{LAS} format is a file format designed for the
+interchange and archiving of lidar point cloud data.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm
index b0ee413acd..7998142b4d 100644
--- a/gnu/packages/gl.scm
+++ b/gnu/packages/gl.scm
@@ -18,7 +18,7 @@
 ;;; Copyright © 2021, 2022, 2023 John Kehayias <john.kehayias@protonmail.com>
 ;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;; Copyright © 2023 Kaelyn Takata <kaelyn.alexi@protonmail.com>
-;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2023, 2024 Zheng Junjie <873216071@qq.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -62,6 +62,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix hg-download)
+  #:use-module (gnu packages cmake)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system meson)
@@ -294,7 +295,7 @@ also known as DXTn or DXTC) for Mesa.")
 (define-public mesa
   (package
     (name "mesa")
-    (version "23.2.1")
+    (version "23.3.2")
     (source
       (origin
         (method url-fetch)
@@ -304,7 +305,7 @@ also known as DXTn or DXTC) for Mesa.")
                                   "mesa-" version ".tar.xz")))
         (sha256
          (base32
-          "1k61pgw0vcjrlb4299q98cy7iqmk2r7jmb5ika91z01dzhb0dpk4"))))
+          "1p4swrbmz3kb1805kdj973hf8virgmix4m9qprmcb2bgl4gviz1w"))))
     (build-system meson-build-system)
     (propagated-inputs
      ;; The following are in the Requires.private field of gl.pc.
@@ -338,7 +339,8 @@ also known as DXTn or DXTC) for Mesa.")
             python-wrapper
             (@ (gnu packages base) which)
             (if (%current-target-system)
-              (list pkg-config-for-build
+              (list cmake-minimal-cross
+                    pkg-config-for-build
                     wayland
                     wayland-protocols)
               '())))
@@ -351,16 +353,16 @@ also known as DXTn or DXTC) for Mesa.")
              ((target-aarch64?)
               ;; TODO: Fix svga driver for non-Intel architectures.
               '("-Dgallium-drivers=etnaviv,freedreno,kmsro,lima,nouveau,\
-panfrost,r300,r600,swrast,tegra,v3d,vc4,virgl"))
+panfrost,r300,r600,swrast,tegra,v3d,vc4,virgl,zink"))
              ((target-arm32?)
               ;; Freedreno FTBFS when built on a 64-bit machine.
               '("-Dgallium-drivers=etnaviv,kmsro,lima,nouveau,panfrost,\
-r300,r600,swrast,tegra,v3d,vc4,virgl"))
+r300,r600,swrast,tegra,v3d,vc4,virgl,zink"))
              ((or (target-ppc64le?) (target-ppc32?) (target-riscv64?))
-              '("-Dgallium-drivers=nouveau,r300,r600,radeonsi,swrast,virgl"))
+              '("-Dgallium-drivers=nouveau,r300,r600,radeonsi,swrast,virgl,zink"))
              (else
               '("-Dgallium-drivers=crocus,iris,nouveau,r300,r600,radeonsi,\
-svga,swrast,virgl")))
+svga,swrast,virgl,zink")))
          ;; Enable various optional features.  TODO: opencl requires libclc,
          ;; omx requires libomxil-bellagio
          "-Dplatforms=x11,wayland"
@@ -415,10 +417,13 @@ svga,swrast,virgl")))
        #~(modify-phases %standard-phases
          #$@(if (%current-target-system)
               #~((add-after 'unpack 'fix-cross-compiling
-                   (lambda* (#:key inputs #:allow-other-keys)
-                     ;; It isn't a problem to use the host's llvm-config.
-                     (setenv "LLVM_CONFIG"
-                             (search-input-file inputs "/bin/llvm-config")))))
+                   (lambda* (#:key native-inputs #:allow-other-keys)
+                     ;; When cross compiling, we use cmake to find llvm, not
+                     ;; llvm-config, because llvm-config cannot be executed
+                     ;; see https://github.com/llvm/llvm-project/issues/58984
+                     (setenv "CMAKE"
+                             (search-input-file
+                              native-inputs "/bin/cmake")))))
               #~())
          (add-after 'unpack 'disable-failing-test
            (lambda _
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index b2d4b73088..b43e533769 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -11,7 +11,7 @@
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020, 2023 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2021 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
-;;; Copyright © 2015-2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015-2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017, 2018 Rene Saavedra <pacoon@protonmail.com>
 ;;; Copyright © 2016 Jochem Raat <jchmrt@riseup.net>
 ;;; Copyright © 2016, 2017, 2019 Kei Kebreau <kkebreau@posteo.net>
@@ -4781,12 +4781,15 @@ GLib and GObject, and integrates JSON with GLib data types.")
                            (string-append #$output:doc
                                           "/share/gtk-doc"))))))))))
     (native-inputs
-     (modify-inputs (package-native-inputs json-glib-minimal)
-       (prepend docbook-xml-4.3
-                docbook-xsl
-                gobject-introspection
-                gtk-doc
-                libxslt)))))
+     (if (%current-target-system)
+         ;; No docs, no additional inputs.
+         (package-native-inputs json-glib-minimal)
+         (modify-inputs (package-native-inputs json-glib-minimal)
+                        (prepend docbook-xml-4.3
+                                 docbook-xsl
+                                 gobject-introspection
+                                 gtk-doc
+                                 libxslt))))))
 
 (define-public libxklavier
   (package
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index bf9bf34e3a..188aa02293 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -1034,6 +1034,9 @@ variable defined below.  It requires guile-json to be installed."
                 (setenv "MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE" "system")
                 (setenv "MOZ_BUILD_DATE" #$%icecat-build-id) ; avoid timestamp
 
+                ;; WM_CLASS (default is "$MOZ_APP_NAME-$MOZ_UPDATE_CHANNEL").
+                (setenv "MOZ_APP_REMOTINGNAME" "Icecat")
+
                 ;; XXX TODO: Fix this to work on systems other than x86_64-linux.
                 (setenv "GUIX_PYTHONPATH"
                         (string-append (getcwd)
@@ -1126,7 +1129,7 @@ variable defined below.  It requires guile-json to be installed."
                   (("NewWindow")        "new-window")
                   (("NewPrivateWindow") "new-private-window")
                   (("StartupNotify=true")
-                   "StartupNotify=true\nStartupWMClass=Navigator"))
+                   "StartupNotify=true\nStartupWMClass=Icecat"))
                 (install-file desktop-file applications))))
           (add-after 'install-desktop-entry 'install-icons
             (lambda _
diff --git a/gnu/packages/golang-web.scm b/gnu/packages/golang-web.scm
index 7759916c35..3e60bfaf33 100644
--- a/gnu/packages/golang-web.scm
+++ b/gnu/packages/golang-web.scm
@@ -21,6 +21,7 @@
 ;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
 ;;; Copyright © 2023 Katherine Cox-Buday <cox.katherine.e@gmail.com>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Artyom V. Poptsov <poptsov.artyom@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -870,7 +871,7 @@ protocol.")
 (define-public go-github-com-hjson-hjson-go
   (package
     (name "go-github-com-hjson-hjson-go")
-    (version "3.1.0")
+    (version "4.3.1")
     (source
      (origin
        (method git-fetch)
@@ -879,7 +880,7 @@ protocol.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1dfdiahimg6z9idg8jiqxwnlwjnmasbjccx8gnag49cz4yfqskaz"))))
+        (base32 "138vmbnrwzxf64cia27k407clrydvs2jx927dlv6ziydiqyvy7m3"))))
     (build-system go-build-system)
     (arguments
      '(#:import-path "github.com/hjson/hjson-go"))
diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm
index 36e2c4b23e..58681af958 100644
--- a/gnu/packages/golang.scm
+++ b/gnu/packages/golang.scm
@@ -3959,11 +3959,11 @@ packages.")
       (license license:bsd-3))))
 
 (define-public go-golang-org-x-sys
-  (let ((commit "b60007cc4e6f966b1c542e343d026d06723e5653")
+  (let ((commit "ca59edaa5a761e1d0ea91d6c07b063f85ef24f78")
         (revision "0"))
     (package
       (name "go-golang-org-x-sys")
-      (version (git-version "0.4.0" revision commit))
+      (version (git-version "0.8.0" revision commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -3972,7 +3972,7 @@ packages.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "0fr2d6fnpbqx6n89sg9lsinqkdaw49y068kqj2g0cxlhbh69hzii"))))
+                  "1p81niiin8dwyrjl2xsc95136w3vdw4kmj0w3mlh0vh5v134s4xq"))))
       (build-system go-build-system)
       (arguments
        (list
@@ -3989,24 +3989,6 @@ support for low-level interaction with the operating system.")
       (home-page "https://go.googlesource.com/sys")
       (license license:bsd-3))))
 
-;; XXX: This version is required for "go-github-com-quic-go-qtls-go1-20".
-(define-public go-golang-org-x-sys-0.8
-  (let ((commit "ca59edaa5a761e1d0ea91d6c07b063f85ef24f78")
-        (revision "0"))
-    (package
-      (inherit go-golang-org-x-sys)
-      (name "go-golang-org-x-sys")
-      (version (git-version "0.8.0" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://go.googlesource.com/sys")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "1p81niiin8dwyrjl2xsc95136w3vdw4kmj0w3mlh0vh5v134s4xq")))))))
-
 (define-public go-golang-org-x-text
   (package
     (name "go-golang-org-x-text")
@@ -7269,7 +7251,7 @@ implementation of generics.")
       #:import-path "github.com/quic-go/qtls-go1-20"
       #:go go-1.20))
     (propagated-inputs (list go-golang-org-x-crypto
-                             go-golang-org-x-sys-0.8))
+                             go-golang-org-x-sys))
     (synopsis "TLS 1.3 for QUIC")
     (description
      "Go standard library TLS 1.3 implementation, modified for QUIC.  For
@@ -7330,21 +7312,17 @@ the Go standard library}.")
            #:tests? #f
            #:go go-1.20))
     (propagated-inputs
-     (let ((p (package-input-rewriting
-               `((,go-golang-org-x-sys . ,go-golang-org-x-sys-0.8))
-               #:deep? #true)))
-       (cons go-golang-org-x-sys-0.8
-             (map p
-                  (list go-github-com-quic-go-qtls-go1-20
-                        go-github-com-quic-go-qpack
-                        go-golang-org-x-crypto
-                        go-github-com-cheekybits-genny
-                        go-github-com-marten-seemann-chacha20
-                        go-github-com-golang-protobuf-proto
-                        go-golang-org-x-crypto
-                        go-golang-org-x-exp
-                        go-golang-org-x-net
-                        go-golang-org-x-sync)))))
+     (list go-github-com-quic-go-qtls-go1-20
+           go-github-com-quic-go-qpack
+           go-golang-org-x-crypto
+           go-github-com-cheekybits-genny
+           go-github-com-marten-seemann-chacha20
+           go-github-com-golang-protobuf-proto
+           go-golang-org-x-crypto
+           go-golang-org-x-exp
+           go-golang-org-x-net
+           go-golang-org-x-sys
+           go-golang-org-x-sync))
     (synopsis "QUIC in Go")
     (description "This package provides a Go language implementation of the QUIC
 network protocol.")
diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm
index a40b580417..26b9d03a73 100644
--- a/gnu/packages/graph.scm
+++ b/gnu/packages/graph.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017, 2018, 2019, 2020, 2022, 2023 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017-2024 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Joshua Sierles, Nextjournal <joshua@nextjournal.com>
 ;;; Copyright © 2018, 2020, 2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
@@ -426,6 +426,48 @@ algorithm for community detection in large networks.")
 large networks.")
     (license license:gpl3+)))
 
+(define-public python-louvain-igraph
+  (package
+    (name "python-louvain-igraph")
+    (version "0.8.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/vtraag/louvain-igraph")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1j2ybihvvzggwjb9zvm829aqb5b94q10h8bw6v0h42xd9w75z9sv"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'find-igraph
+            (lambda _
+              (setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)
+              (substitute* "setup.py"
+                (("/usr/include/igraph")
+                 (string-append #$(this-package-input "igraph")
+                                "/include/igraph"))))))))
+    (propagated-inputs (list python-igraph))
+    (inputs (list igraph))
+    (native-inputs
+     (list python-ddt
+           python-setuptools-scm
+           pkg-config))
+    (home-page "https://github.com/vtraag/louvain-igraph")
+    (synopsis "Implementation of the Louvain algorithm")
+    (description "This package implements the Louvain algorithm for community
+detection in C++ and exposes it to Python.  Besides the relative flexibility
+of the implementation, it also scales well, and can be run on graphs of
+millions of nodes (as long as they can fit in memory).  The core function is
+@code{find_partition} which finds the optimal partition using the louvain
+algorithm for a number of different methods.")
+    (license license:gpl3+)))
+
 (define-public faiss
   (package
     (name "faiss")
@@ -449,8 +491,8 @@ large networks.")
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags
-       (list "-DBUILD_WITH_GPU=OFF"  ; thanks, but no thanks, CUDA.
-             "-DBUILD_TUTORIAL=OFF") ; we don't need those
+       (list "-DBUILD_WITH_GPU=OFF"     ; thanks, but no thanks, CUDA.
+             "-DBUILD_TUTORIAL=OFF")    ; we don't need those
        #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'prepare-build
@@ -466,7 +508,7 @@ large networks.")
                                          '()))))))
                (substitute* "CMakeLists.txt"
                  (("-m64") "")
-                 (("-mpopcnt") "") ; only some architectures
+                 (("-mpopcnt") "")      ; only some architectures
                  (("-msse4")
                   (string-append
                    (string-join features)
diff --git a/gnu/packages/graphviz.scm b/gnu/packages/graphviz.scm
index b91c365e3c..c5507e036c 100644
--- a/gnu/packages/graphviz.scm
+++ b/gnu/packages/graphviz.scm
@@ -195,7 +195,7 @@ structure and layout algorithms.")
 (define-public python-uqbar
   (package
     (name "python-uqbar")
-    (version "0.5.6")
+    (version "0.5.9")
     (source
      (origin
        (method git-fetch)
@@ -205,18 +205,12 @@ structure and layout algorithms.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1ml3x2mf7nlnvrh9lari5yk0sz2mmg39jwsbjxnpzhnw4kcwpdrs"))))
+         "0c573nzpm51qgz2g296f8pw8ys0i3r6daynxk06zagk5l5fgw9ar"))
+       (patches (search-patches "python-uqbar-python3.10.patch"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch
-           (lambda _
-             (substitute* "setup.py"
-               ;; Latest versions of sphink-rtd-theme require npm to build.
-               (("sphinx-rtd-theme >= 0.5.0") "sphinx-rtd-theme >= 0.2.4")
-               (("black") "black >= 19.10b0"))
-             #t))
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index cc33c9f672..1a3bb56945 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -1178,7 +1178,11 @@ application suites.")
                 ;; The unaligned-offscreen test fails for unknown reasons, also
                 ;; on different distributions (see:
                 ;; https://gitlab.gnome.org/GNOME/gtk/-/issues/4889).
-                (("  'unaligned-offscreen',") ""))
+                (("  'unaligned-offscreen',") "")
+                ;; This test, 'gtk:tools / validate', started failing for
+                ;; unknown reasons after updating mesa to 23.3.1 and xorgproto
+                ;; to 2023.2.
+                ((" 'validate',") ""))
               (substitute* "testsuite/reftests/meson.build"
                 (("[ \t]*'label-wrap-justify.ui',") "")
                 ;; The inscription-markup.ui fails due to /etc/machine-id
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index afd8900848..520b838d88 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015, 2017, 2022 Christine Lemmer-Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
@@ -816,7 +816,8 @@ tables.")
                (base32
                 "0wvdi4l58f9a5c9wi3cdc9l1bniscsixb6w2zj86mch7j7j814lc"))
               (patches
-               (search-patches "guile-fibers-libevent-32-bit.patch"))))
+               (search-patches "guile-fibers-libevent-32-bit.patch"
+                               "guile-fibers-libevent-timeout.patch"))))
     (build-system gnu-build-system)
     (arguments
      (list #:make-flags
@@ -1839,6 +1840,33 @@ written in pure Scheme by using Guile's foreign function interface.")
 library}.")
     (license license:gpl3+)))
 
+(define-public guile-yamlpp
+  (package
+    (name "guile-yamlpp")
+    (version "0.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/yorgath/guile-yamlpp")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "14mlqi7hw7pi9scwk1g432issnqcn185pd8na2plijxq55cy0iq7"))))
+    (build-system gnu-build-system)
+    (native-inputs (list autoconf automake libtool pkg-config))
+    (inputs (list guile-3.0 yaml-cpp))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "GUILE_EXTENSIONS_PATH")
+            (files (list "lib/guile/3.0")))))
+    (home-page "https://gitlab.com/yorgath/guile-yamlpp")
+    (synopsis "Guile YAML reader/writer based on @code{yaml-cpp}")
+    (description
+     "A module for GNU Guile to read and write YAML files.  It works using
+bindings to the @code{yaml-cpp} C++ library.")
+    (license license:gpl3+)))
+
 (define-public guile-dbi
   (package
     (name "guile-dbi")
@@ -3565,6 +3593,80 @@ structures.  This package re-uses the SRFI sample implementation.")
            ;; contains ISC code from the SRFI sample implementation
            license:isc))))
 
+(define-public guile-srfi-133
+  (package
+    (name "guile-srfi-133")
+    (version "0.0.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/scheme-requests-for-implementation/srfi-133")
+             (commit "db81a114cd3e23375f024baec15482614ec90453")))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0a7srl72291yah0aj6rwddhj041v2spximhknjj7hczlparsrm7f"))))
+    (build-system guile-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'move-create-and-delete-files
+            (lambda _
+              (rename-file "vectors" "srfi")
+              (rename-file "srfi/vectors-test.scm" "srfi/srfi-test.scm")
+              (rename-file "srfi/vectors-impl.scm" "srfi/srfi-impl.scm")
+              (with-output-to-file "srfi/srfi-133.scm"
+                (lambda ()
+                  (display "(define-module (srfi srfi-133)
+  #:replace (;; Constructors
+             vector-copy
+
+             ;; Mutators
+             vector-fill! vector-copy!
+
+             ;; Conversion
+             vector->list list->vector)
+  #:export (;; Constructors
+            vector-unfold vector-unfold-right vector-reverse-copy
+            vector-append vector-concatenate vector-append-subvectors
+
+            ;; Predicates
+            vector-empty? vector=
+
+            ;; Iteration
+            vector-fold vector-fold-right vector-map vector-map!
+            vector-for-each vector-count vector-cumulate
+
+            ;; Searching
+            vector-index vector-index-right vector-skip vector-skip-right
+            vector-binary-search vector-any vector-every vector-partition
+
+            ;; Mutators
+            vector-swap! vector-reverse!
+            vector-reverse-copy! vector-unfold! vector-unfold-right!
+
+            ;; Conversion
+            reverse-vector->list reverse-list->vector
+            vector->string string->vector))
+
+(include \"srfi-impl.scm\")")))
+              (for-each (lambda (filename)
+                          (delete-file filename))
+                        '("tests/run.scm"
+                          "srfi/vectors.sld"
+                          "srfi/vectors.scm")))))))
+    (native-inputs
+     (list guile-3.0))
+    (home-page "https://github.com/scheme-requests-for-implementation/srfi-133")
+    (synopsis "R7RS-compatible vector library for Guile")
+    (description
+     "This package provides a Guile implementation of
+@uref{https://srfi.schemers.org/srfi-133/srfi-133.html, SRFI-133}, a
+comprehensive library of vector operations.")
+    (license license:expat)))
+
 (define-public guile-srfi-145
   (package
     (name "guile-srfi-145")
@@ -3766,6 +3868,56 @@ Either represents the concept of values which are either correct (Right)
 or errors (Left).")
       (license license:expat))))
 
+(define-public guile-srfi-232
+  (package
+    (name "guile-srfi-232")
+    (version "0.0.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/scheme-requests-for-implementation/srfi-232")
+             (commit "c3f580d220778cd71492aba4fdd0c7040968e705")))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0lp4zcqjjj6hwfh3ix71wak1nffgg4npzsg7cdxfn9hf6iwf9xby"))))
+    (build-system guile-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'move-and-delete-things
+            (lambda _
+              (let* ((srfi-directory (string-append #$output "/srfi")))
+                (mkdir-p "srfi")
+                (with-output-to-file "srfi/srfi-232.scm"
+                  (lambda ()
+                    (display "(define-library (srfi srfi-232)
+ (export curried define-curried)
+ (import (only (guile) import)
+         (scheme base))
+ (include \"../srfi-232.scm\"))")))
+                (for-each (lambda (filename)
+                            (delete-file filename))
+                          '("test-body.scm"
+                            "test-chibi.scm"
+                            "test-srfi-64.scm"))))))))
+    (native-inputs
+     (list guile-3.0))
+    (home-page "https://github.com/scheme-requests-for-implementation/srfi-232")
+    (synopsis "Flexible curried procedures")
+    (description
+     " This package provides an implementation of
+@uref{https://srfi.schemers.org/srfi-232/srfi-232.html, SRFI-232}, which
+describes @code{curried}, a variant of @code{lambda} that creates true curried
+procedures which also behave just like ordinary Scheme procedures.  They can
+be applied to their arguments one by one, all at once, or anywhere in between,
+without any novel syntax.  @code{curried} also supports nullary and variadic
+procedures, and procedures created with it have predictable behavior when
+applied to surplus arguments.")
+    (license license:expat)))
+
 (define-public emacsy
   (package
     (name "emacsy")
diff --git a/gnu/packages/jami.scm b/gnu/packages/jami.scm
index db120f223e..1ef840845a 100644
--- a/gnu/packages/jami.scm
+++ b/gnu/packages/jami.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2019 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
 ;;; Copyright © 2019, 2020 Jan Wielkiewicz <tona_kosmicznego_smiecia@interia.pl>
-;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -38,6 +38,7 @@
   #:use-module (gnu packages guile)
   #:use-module (gnu packages libcanberra)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages markup)
   #:use-module (gnu packages networking)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
@@ -54,6 +55,7 @@
   #:use-module (gnu packages version-control)
   #:use-module (gnu packages video)
   #:use-module (gnu packages vulkan)
+  #:use-module (gnu packages web)
   #:use-module (gnu packages webkit)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xiph)
@@ -68,307 +70,33 @@
   #:use-module (guix packages)
   #:use-module (guix utils))
 
-(define %jami-version "20230323.0")
+;;; We use nightlies as stable versions are a bit far in-between, and often
+;;; have bugs anyway.  When the nightly version change, do not forget to
+;;; retrieve the associated daemon submodule commit and update it in
+;;; %jami-daemon-commit variable below.
 
-(define %jami-sources
-  ;; Return an origin object of the tarball release sources archive of the
-  ;; Jami project.
-  (origin
-    (method url-fetch)
-    (uri (string-append "https://dl.jami.net/release/tarballs/jami-"
-                        %jami-version ".tar.gz"))
-    (modules '((guix build utils)))
-    (snippet
-     ;; Delete multiple MiBs of bundled tarballs.  The daemon/contrib
-     ;; directory contains the custom patches for pjproject and other
-     ;; libraries used by Jami.
-     '(delete-file-recursively "daemon/contrib/tarballs"))
-    (sha256
-     (base32
-      "0vjsjr37cb87j9hqbmipyxn4877k1wn3l0vzca3l3ldgknglz7v2"))
-    (patches (search-patches "jami-disable-integration-tests.patch"
-                             "jami-libjami-headers-search.patch"))))
-
-;; Jami maintains a set of patches for some key dependencies (currently
-;; pjproject and ffmpeg) of Jami that haven't yet been integrated upstream.
-;; This procedure simplifies the process of applying them.
-(define jami-apply-custom-patches
-  #~(lambda* (#:key dep-name patches)
-      (let ((patches-directory "patches"))
-        (mkdir-p patches-directory)
-        (invoke "tar" "-xvf" #$%jami-sources
-                "-C" patches-directory
-                "--strip-components=5"
-                "--wildcards"
-                (string-append "jami-*/daemon/contrib/src/" dep-name))
-        (for-each (lambda (f)
-                    (invoke "patch" "--force" "--ignore-whitespace" "-p1" "-i"
-                            (string-append patches-directory "/" f ".patch")))
-                  patches))))
-
-(define-public pjproject-jami
-  (let ((commit "e4b83585a0bdf1523e808a4fc1946ec82ac733d0")
-        (revision "3"))
-    (package
-      (inherit pjproject)
-      (name "pjproject-jami")
-      (version (git-version "2.12" revision commit))
-      (source (origin
-                (inherit (package-source pjproject))
-                ;; The Jami development team regularly issues patches to
-                ;; pjproject to extend the its functionality and fix bugs;
-                ;; they are submitted for inclusion upstream but larger
-                ;; patches take time to be reviewed and merged, hence this
-                ;; forked repository.
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://github.com/savoirfairelinux/pjproject")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "0gky5idyyqxhqk959lzys5l7x1i925db773lfdpvxxmkmfizdq21"))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments pjproject)
-         ((#:phases phases '%standard-phases)
-          #~(modify-phases #$phases
-              (add-after 'unpack 'apply-patches
-                (lambda _
-                  (#$jami-apply-custom-patches
-                   #:dep-name "pjproject"
-                   #:patches
-                   ;; This adds a config_site.h configuration file that sets
-                   ;; constants such as PJ_ICE_MAX_CAND that cannot be
-                   ;; configured at build time.
-                   '("0009-add-config-site")))))))))))
-
-;; The following variables are configure flags used by ffmpeg-jami.  They're
-;; from the jami/daemon/contrib/src/ffmpeg/rules.mak file.  We try to keep it
-;; as close to the official Jami package as possible, to provide all the
-;; codecs and extra features that are expected (see:
-;; https://review.jami.net/plugins/gitiles/jami-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak).
-;; An exception are the ffnvcodec-related switches, which is not packaged in
-;; Guix and would not work with Mesa.
-(define %ffmpeg-default-configure-flags
-  '("--disable-everything"
-    "--enable-zlib"
-    "--enable-gpl"
-    "--enable-swscale"
-    "--enable-bsfs"
-    "--disable-filters"
-    "--disable-programs"
-    "--disable-postproc"
-    "--disable-protocols"
-    "--enable-protocol=crypto"
-    "--enable-protocol=file"
-    "--enable-protocol=rtp"
-    "--enable-protocol=srtp"
-    "--enable-protocol=tcp"
-    "--enable-protocol=udp"
-    "--enable-protocol=unix"
-    "--enable-protocol=pipe"
-
-    ;; Enable muxers/demuxers.
-    "--disable-demuxers"
-    "--disable-muxers"
-    "--enable-muxer=rtp"
-    "--enable-muxer=g722"
-    "--enable-muxer=g726"
-    "--enable-muxer=g726le"
-    "--enable-muxer=h263"
-    "--enable-muxer=h264"
-    "--enable-muxer=hevc"
-    "--enable-muxer=matroska"
-    "--enable-muxer=wav"
-    "--enable-muxer=webm"
-    "--enable-muxer=ogg"
-    "--enable-muxer=pcm_s16be"
-    "--enable-muxer=pcm_s16le"
-    "--enable-demuxer=rtp"
-    "--enable-demuxer=mjpeg"
-    "--enable-demuxer=mjpeg_2000"
-    "--enable-demuxer=mpegvideo"
-    "--enable-demuxer=gif"
-    "--enable-demuxer=image_jpeg_pipe"
-    "--enable-demuxer=image_png_pipe"
-    "--enable-demuxer=image_webp_pipe"
-    "--enable-demuxer=matroska"
-    "--enable-demuxer=m4v"
-    "--enable-demuxer=mp3"
-    "--enable-demuxer=ogg"
-    "--enable-demuxer=flac"
-    "--enable-demuxer=wav"
-    "--enable-demuxer=ac3"
-    "--enable-demuxer=g722"
-    "--enable-demuxer=g723_1"
-    "--enable-demuxer=g726"
-    "--enable-demuxer=g726le"
-    "--enable-demuxer=pcm_mulaw"
-    "--enable-demuxer=pcm_alaw"
-    "--enable-demuxer=pcm_s16be"
-    "--enable-demuxer=pcm_s16le"
-    "--enable-demuxer=h263"
-    "--enable-demuxer=h264"
-    "--enable-demuxer=hevc"
-
-    ;; Enable parsers.
-    "--enable-parser=h263"
-    "--enable-parser=h264"
-    "--enable-parser=hevc"
-    "--enable-parser=mpeg4video"
-    "--enable-parser=vp8"
-    "--enable-parser=vp9"
-    "--enable-parser=opus"
-
-    ;; Encoders/decoders.
-    "--enable-encoder=adpcm_g722"
-    "--enable-decoder=adpcm_g722"
-    "--enable-encoder=adpcm_g726"
-    "--enable-decoder=adpcm_g726"
-    "--enable-encoder=adpcm_g726le"
-    "--enable-decoder=adpcm_g726le"
-    "--enable-decoder=g729"
-    "--enable-encoder=g723_1"
-    "--enable-decoder=g723_1"
-    "--enable-encoder=rawvideo"
-    "--enable-decoder=rawvideo"
-    "--enable-encoder=libx264"
-    "--enable-decoder=h264"
-    "--enable-encoder=pcm_alaw"
-    "--enable-decoder=pcm_alaw"
-    "--enable-encoder=pcm_mulaw"
-    "--enable-decoder=pcm_mulaw"
-    "--enable-encoder=mpeg4"
-    "--enable-decoder=mpeg4"
-    "--enable-encoder=libvpx_vp8"
-    "--enable-decoder=vp8"
-    "--enable-decoder=vp9"
-    "--enable-encoder=h263"
-    "--enable-encoder=h263p"
-    "--enable-decoder=h263"
-    "--enable-encoder=mjpeg"
-    "--enable-decoder=mjpeg"
-    "--enable-decoder=mjpegb"
-    "--enable-libspeex"
-    "--enable-libopus"
-    "--enable-libvpx"
-    "--enable-libx264"
-    "--enable-encoder=libspeex"
-    "--enable-decoder=libspeex"
-    "--enable-encoder=libopus"
-    "--enable-decoder=libopus"
-
-    ;; Encoders/decoders for ringtones and audio streaming.
-    "--enable-decoder=flac"
-    "--enable-decoder=vorbis"
-    "--enable-decoder=aac"
-    "--enable-decoder=ac3"
-    "--enable-decoder=eac3"
-    "--enable-decoder=mp3"
-    "--enable-decoder=pcm_u24le"
-    "--enable-decoder=pcm_u32le"
-    "--enable-decoder=pcm_u8"
-    "--enable-decoder=pcm_f16le"
-    "--enable-decoder=pcm_f32le"
-    "--enable-decoder=pcm_f64le"
-    "--enable-decoder=pcm_s16le"
-    "--enable-decoder=pcm_s24le"
-    "--enable-decoder=pcm_s32le"
-    "--enable-decoder=pcm_s64le"
-    "--enable-decoder=pcm_u16le"
-    "--enable-encoder=pcm_u8"
-    "--enable-encoder=pcm_f32le"
-    "--enable-encoder=pcm_f64le"
-    "--enable-encoder=pcm_s16le"
-    "--enable-encoder=pcm_s32le"
-    "--enable-encoder=pcm_s64le"
-
-    ;; Encoders/decoders for images.
-    "--enable-encoder=gif"
-    "--enable-decoder=gif"
-    "--enable-encoder=jpegls"
-    "--enable-decoder=jpegls"
-    "--enable-encoder=ljpeg"
-    "--enable-decoder=jpeg2000"
-    "--enable-encoder=png"
-    "--enable-decoder=png"
-    "--enable-encoder=bmp"
-    "--enable-decoder=bmp"
-    "--enable-encoder=tiff"
-    "--enable-decoder=tiff"
-
-    ;; Filters.
-    "--enable-filter=scale"
-    "--enable-filter=overlay"
-    "--enable-filter=amix"
-    "--enable-filter=amerge"
-    "--enable-filter=aresample"
-    "--enable-filter=format"
-    "--enable-filter=aformat"
-    "--enable-filter=fps"
-    "--enable-filter=transpose"
-    "--enable-filter=pad"))
-
-(define %ffmpeg-linux-configure-flags
-  '("--enable-pic"
-    "--extra-cxxflags=-fPIC"
-    "--extra-cflags=-fPIC"
-    "--target-os=linux"
-    "--enable-indev=v4l2"
-    "--enable-indev=xcbgrab"
-    "--enable-vdpau"
-    "--enable-hwaccel=h264_vdpau"
-    "--enable-hwaccel=mpeg4_vdpau"
-    "--enable-vaapi"
-    "--enable-hwaccel=h264_vaapi"
-    "--enable-hwaccel=mpeg4_vaapi"
-    "--enable-hwaccel=h263_vaapi"
-    "--enable-hwaccel=vp8_vaapi"
-    "--enable-hwaccel=mjpeg_vaapi"
-    "--enable-hwaccel=hevc_vaapi"
-    "--enable-encoder=h264_vaapi"
-    "--enable-encoder=vp8_vaapi"
-    "--enable-encoder=mjpeg_vaapi"
-    "--enable-encoder=hevc_vaapi"))
-
-(define (ffmpeg-compose-configure-flags)
-  "Compose the configure flag lists of ffmpeg-jami."
-  #~(append '#$%ffmpeg-default-configure-flags
-            (if (string-contains #$(%current-system) "linux")
-                '#$%ffmpeg-linux-configure-flags
-                '())))
-
-(define-public ffmpeg-jami
-  (package
-    (inherit ffmpeg)
-    (name "ffmpeg-jami")
-    (arguments
-     (substitute-keyword-arguments (package-arguments ffmpeg)
-       ((#:configure-flags _ '())
-        #~(cons* "--disable-static"
-                 "--enable-shared"
-                 "--disable-stripping"
-                 #$(ffmpeg-compose-configure-flags)))
-       ((#:phases phases)
-        #~(modify-phases #$phases
-            (add-after 'unpack 'apply-patches
-              (lambda _
-                ;; These patches come from:
-                ;; "jami-project/daemon/contrib/src/ffmpeg/rules.mak".
-                (#$jami-apply-custom-patches
-                 #:dep-name "ffmpeg"
-                 #:patches '("remove-mjpeg-log"
-                             "change-RTCP-ratio"
-                             "rtp_ext_abs_send_time"
-                             "libopusdec-enable-FEC"
-                             "libopusenc-reload-packet-loss-at-encode"
-                             "screen-sharing-x11-fix"))))))))))
+;;; When updating Jami, make sure that the patches used for ffmpeg-jami are up
+;;; to date with those listed in
+;;; <https://review.jami.net/plugins/gitiles/jami-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak>.
+(define %jami-nightly-version "20231222.2")
+(define %jami-daemon-commit "317b7317dcda4afb733ddb9bd5b450d4635941ae")
 
 (define-public libjami
   (package
     (name "libjami")
-    (version %jami-version)
-    (source %jami-sources)
+    (version %jami-nightly-version)
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://review.jami.net/jami-daemon")
+                    (commit %jami-daemon-commit)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "16qx50xz2mkw894irjsvql82iw7wpc5xncxpvw1nqd2sxhgfiq0i"))
+              (patches (search-patches
+                        "libjami-ac-config-files.patch"
+                        "jami-disable-integration-tests.patch"))))
     (outputs '("out" "bin" "debug"))    ;"bin' contains jamid
     (build-system gnu-build-system)
     (arguments
@@ -378,13 +106,25 @@
       ;; user scripts too, until more general purpose Scheme bindings are made
       ;; available (see: test/agent/README.md).
       #:configure-flags #~(list "--enable-agent" "--enable-debug")
-      #:make-flags #~(list "V=1")       ;build verbosely
+      #:make-flags
+      #~(list
+         "V=1"                 ;build verbosely
+         ;; The 'ut_media_player' is known to fail (see:
+         ;; https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/935).
+         "XFAIL_TESTS=ut_media_player")
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'change-directory/maybe
             (lambda _
               ;; Allow building from the tarball or a git checkout.
               (false-if-exception (chdir "daemon"))))
+          (add-after 'change-directory/maybe 'extend-scheduler-test-timeout
+            (lambda _
+              ;; The ut_scheduler unit test may fail on slower machines (see:
+              ;; https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/939).
+              (substitute* "test/unitTest/scheduler.cpp"
+                (("std::chrono::seconds\\(3)")
+                 "std::chrono::seconds(30)"))))
           (add-after 'install 'delete-static-libraries
             ;; Remove 100+ MiB of static libraries.  "--disable-static" cannot
             ;; be used as the test suite requires access to private symbols
@@ -409,14 +149,14 @@
     (inputs
      (list alsa-lib
            asio
-           dbus-c++
+           dhtnet
            eudev
            ffmpeg-jami
            guile-3.0
            jack-1
            jsoncpp
            libarchive
-           libgit2
+           libgit2-1.6
            libnatpmp
            libsecp256k1
            libupnp
@@ -424,6 +164,7 @@
            openssl
            pjproject-jami
            pulseaudio
+           sdbus-c++
            speex
            speexdsp
            webrtc-audio-processing
@@ -447,18 +188,71 @@ service definitions.")
     (home-page "https://jami.net/")
     (license license:gpl3+)))
 
+;;; Private package; this is used in source form: the project build system has
+;;; no install target.
+(define sortfilterproxymodel
+  ;; Use the latest commit available from the 'qt-6' branch.
+  (let ((commit "6cc21205dbf36640613f0e6e67b2b13b1855c377")
+        (revision "0"))
+    (package
+      (name "sortfilterproxymodel")
+      ;; There are no recent release tag; the module version defined in the
+      ;; source is used (see:
+      ;; https://github.com/oKcerG/SortFilterProxyModel/blob/
+      ;; 5a930885b7ea99f7f41c25fce08bf8006ee54e3f/
+      ;; qqmlsortfilterproxymodel.cpp#L574C15-L574C15).
+      (version (git-version "0.2" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      ;; The upstream is
+                      ;; https://github.com/oKcerG/SortFilterProxyModel, but
+                      ;; it lacks Qt 6 support, so use this fork, which is the
+                      ;; one used by Jami.
+                      (url "https://github.com/atraczyk/SortFilterProxyModel")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1n54jkimr3a818i3w7w3lnbqn47x72nnr5xi9vk0mdnbwri3viwy"))))
+      (build-system qt-build-system)
+      (arguments
+       (list #:qtbase qtbase            ;use Qt 6
+             #:tests? #f                ;no test suite
+             #:configure-flags #~(list "BUILD_SFPM_PIC=ON")))
+      (inputs (list qtdeclarative))
+      (home-page "https://github.com/oKcerG/SortFilterProxyModel")
+      (synopsis "Improved QSortFilterProxyModel implementation for QML")
+      (description "SortFilterProxyModel is an implementation of
+QSortFilterProxyModel conveniently exposed for QML.")
+      (license license:expat))))
+
 (define-public jami
   (package
     (name "jami")
-    (version %jami-version)
-    (source %jami-sources)
+    (version %jami-nightly-version)
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://review.jami.net/jami-client-qt")
+                    (commit (string-append "nightly/" %jami-nightly-version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0ypbbyqmq6x9zq4sr550k38v8pg7yq685bmwqmigqzhqgfazcg97"))
+              (patches (search-patches
+                        "jami-libjami-headers-search.patch"
+                        "jami-qml-tests-discovery.patch"
+                        "jami-skip-tests-requiring-internet.patch"
+                        "jami-unbundle-dependencies.patch"))))
     (build-system qt-build-system)
     (outputs '("out" "debug"))
     (arguments
      (list
       #:qtbase qtbase
       #:configure-flags
-      #~(list "-DENABLE_TESTS=ON"
+      #~(list "-DWITH_DAEMON_SUBMODULE=OFF"
+              "-DENABLE_TESTS=ON"
               ;; Disable the webengine since it grows the closure size by
               ;; about 450 MiB and requires more resources.
               "-DWITH_WEBENGINE=OFF"
@@ -467,11 +261,7 @@ service definitions.")
               "-DENABLE_LIBWRAP=ON")
       #:phases
       #~(modify-phases %standard-phases
-          (add-after 'unpack 'change-directory/maybe
-            (lambda _
-              ;; Allow building from the tarball or a git checkout.
-              (false-if-exception (chdir "client-qt"))))
-          (add-after 'change-directory/maybe 'fix-version-string
+          (add-after 'unpack 'fix-version-string
             (lambda _
               (substitute* "src/app/version.h"
                 (("VERSION_STRING")
@@ -480,6 +270,17 @@ service definitions.")
                  (string-append "const char VERSION_STRING[] = \""
                                 #$version "\";\n"
                                 anchor)))))
+          (add-after 'unpack 'copy-3rdparty-source-dependencies
+            (lambda _
+              (copy-recursively #$(package-source sortfilterproxymodel)
+                                "3rdparty/SortFilterProxyModel")))
+          (add-before 'configure 'fake-x11-environment
+            (lambda _
+              ;; This works around the lack of configuration for the X11
+              ;; push-to-talk feature, which is auto-detected via the
+              ;; XDG_SESSION_TYPE environment variable (see:
+              ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1504).
+              (setenv "XDG_SESSION_TYPE" "x11")))
           (replace 'check
             (lambda* (#:key tests? #:allow-other-keys)
               (when tests?
@@ -488,22 +289,13 @@ service definitions.")
                 ;; The tests require a writable HOME.
                 (setenv "HOME" "/tmp")
 
-                (display "Running unittests...\n")
-                (invoke "tests/unittests" "-mutejamid")
+                (display "Running unit tests...\n")
+                (invoke "tests/unit_tests")
 
-                ;; XXX: There are currently multiple failures with the
-                ;; functional tests (see:
-                ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/883),
-                ;; so the code below is disabled for now.
-                ;;
+                ;; XXX: The QML test suite fails, exiting with status code 1 (see:
+                ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/883).
                 ;; (display "Running functional tests...\n")
-                ;; ;; This is to allow building from the source tarball or
-                ;; ;; directly from the git repository.
-                ;; (let  ((tests-qml (if (file-exists? "../client-qt/tests")
-                ;;                       "../client-qt/tests/qml"
-                ;;                       "../tests/qml")))
-                ;;   (invoke "tests/qml_tests" "-mutejamid"
-                ;;           "-input" tests-qml))
+                ;; (invoke "tests/qml_tests")
                 ))))))
     (native-inputs
      (list googletest
@@ -518,6 +310,7 @@ service definitions.")
            libnotify
            libxcb
            libxkbcommon
+           md4c
            network-manager
            qrencode
            qt5compat
@@ -526,6 +319,7 @@ service definitions.")
            qtnetworkauth
            qtpositioning
            qtsvg
+           tidy-html                    ;used by src/app/htmlparser.h
            vulkan-loader))
     (home-page "https://jami.net")
     (synopsis "Qt Jami client")
@@ -538,8 +332,8 @@ P2P-DHT.")
 
 (define-public jami-docs
   ;; There aren't any tags, so use the latest commit.
-  (let ((revision "1")
-        (commit "ff466ebadb9b99a1672a814126793de670c3099b"))
+  (let ((revision "2")
+        (commit "a48997de84cc4933bd111fa93fbf6a58189b166d"))
     (package
       (name "jami-docs")
       (version (git-version "0.0.0" revision commit))
@@ -551,7 +345,7 @@ P2P-DHT.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "1n8a9dk8mi617rk3ycz5jrzbwv9ybfynlci5faz1klckx0aqdf6q"))))
+                  "0a1kcflvk39aag2vk83cn4m0ifkgb3gvwkr8pbbvf0hcd2cj2j31"))))
       (build-system copy-build-system)
       (arguments
        (list
diff --git a/gnu/packages/libsigsegv.scm b/gnu/packages/libsigsegv.scm
index ebbdd2ad90..71afb35be0 100644
--- a/gnu/packages/libsigsegv.scm
+++ b/gnu/packages/libsigsegv.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2018 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2024 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +21,7 @@
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu))
 
 (define-public libsigsegv
@@ -40,21 +41,15 @@
    (arguments
     `(;; The shared library isn't built by default but some packages need it.
       #:configure-flags '("--enable-shared")
-
-      ;; On MIPS, work around this error:
-      ;;
-      ;; In file included from fault-linux-mips-old.h:18:0,
-      ;;    [...]
-      ;; linux-libre-headers-cross-mips64el-linux-gnu-3.3.8/include/asm/sigcontext.h:57:8: error: redefinition of 'struct sigcontext'
-      ,@(if (string-contains (or (%current-target-system) (%current-system))
-                             "mips64el")
-            `(#:phases (modify-phases %standard-phases
-                         (add-before 'configure 'patch-mips-old-h
-                           (lambda _
-                             (substitute* "src/fault-linux-mips-old.h"
-                               (("#include <asm/sigcontext\\.h>") ""))
-                             #t))))
-            '())))
+      ;; On some architectures 'struct sigcontext' gets redefined from
+      ;; %linux-libre-headers/include/asm/sigcontext.h
+      ,@(cond ((%current-target-system)
+               `(#:phases (modify-phases %standard-phases
+                            (add-before 'configure 'patch-asm-sigcontext-h
+                              (lambda _
+                                (substitute* (find-files "src" "^fault-.*-old\\.h$")
+                                  (("#include <asm/sigcontext\\.h>") "")))))))
+              (else '()))))
    (description
     "GNU libsigsegv is a library to handle page faults, which occur when a
 program tries to access an unavailable region of memory, in user mode.  By
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1c359cb300..2ce25bfa00 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -76,7 +76,7 @@
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
 ;;; Copyright © 2023 dan <i@dan.games>
 ;;; Copyright © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
-;;; Copyright © 2023 Wilko Meyer <w@wmeyer.eu>
+;;; Copyright © 2023, 2024 Wilko Meyer <w@wmeyer.eu>
 ;;; Copyright © 2023 Jaeme Sifat <jaeme@runbox.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -494,17 +494,17 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
 ;; The current "stable" kernels. That is, the most recently released major
 ;; versions that are still supported upstream.
 
-(define-public linux-libre-6.6-version "6.6.8")
+(define-public linux-libre-6.6-version "6.6.10")
 (define-public linux-libre-6.6-gnu-revision "gnu")
 (define deblob-scripts-6.6
   (linux-libre-deblob-scripts
    linux-libre-6.6-version
    linux-libre-6.6-gnu-revision
    (base32 "0g8m0rb15b0231dv8ji456s75a67szsaim71may3yprplycz6pav")
-   (base32 "1hg3ck1j8288fhlhcvhgs1zzwh3i62nfvphw7x3vsaqr75kiwbjp")))
+   (base32 "0kavbby960k7wg355p3hjb9v1c4gnk8dv3lkfhpz44ayhv7kihg5")))
 (define-public linux-libre-6.6-pristine-source
   (let ((version linux-libre-6.6-version)
-        (hash (base32 "05i4ayj9wyjkd1s8ixx7bxwcyagqyx8rhj1zvbc3cjqyw4sc8djh")))
+        (hash (base32 "0v2l0l90w7scv7bxkxxjgqnay0fjh678k9gdlgycgbh9q7j2grly")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-6.6)))
@@ -512,92 +512,92 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
 ;; The "longterm" kernels — the older releases with long-term upstream support.
 ;; Here are the support timelines:
 ;; <https://www.kernel.org/category/releases.html>
-(define-public linux-libre-6.1-version "6.1.69")
+(define-public linux-libre-6.1-version "6.1.71")
 (define-public linux-libre-6.1-gnu-revision "gnu")
 (define deblob-scripts-6.1
   (linux-libre-deblob-scripts
    linux-libre-6.1-version
    linux-libre-6.1-gnu-revision
    (base32 "1sf80f2i4vf888xjcn84ymn4w5ynn30ib9033zwmv7f09yvfhapy")
-   (base32 "1hdibv43xbn1lv83i6qjgfmf1bvqxvq17fryfsq4r4sjgs9212js")))
+   (base32 "1jg2v1nxd6i5x536vmd1l14xhpzrcimpmjfipb1zkrwil102y25f")))
 (define-public linux-libre-6.1-pristine-source
   (let ((version linux-libre-6.1-version)
-        (hash (base32 "0hdm28k49kmy9r96hckps0bvvaq9m06l72n8ih305rccs6a2cgby")))
+        (hash (base32 "0hghnwsa282js9hy4krhdbgrb4khjzslr05zgvjx9zzragfp9xrd")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-6.1)))
 
-(define-public linux-libre-5.15-version "5.15.145")
+(define-public linux-libre-5.15-version "5.15.146")
 (define-public linux-libre-5.15-gnu-revision "gnu")
 (define deblob-scripts-5.15
   (linux-libre-deblob-scripts
    linux-libre-5.15-version
    linux-libre-5.15-gnu-revision
    (base32 "18ac30kxg2mf2f6gk3p935hzhz2qs110jy4xwk21kblnnkskbxj8")
-   (base32 "1idjrn2w8jrixj8ifkk1awxyyq5042nc4p2mld4rda96azlnp948")))
+   (base32 "14pw0yl0yxdgcdp01rpi91ylil9irwzxfq04kfvn3gg2abaq37bn")))
 (define-public linux-libre-5.15-pristine-source
   (let ((version linux-libre-5.15-version)
-        (hash (base32 "086nssif66s86wkixz4yb7xilz1k49g32l0ib28r8fjzc23rv95j")))
+        (hash (base32 "14nijbspmzd4r38l8cpl4vn9dhawzcfnhyc0gnaxl2m8l9gpm02s")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.15)))
 
-(define-public linux-libre-5.10-version "5.10.205")
+(define-public linux-libre-5.10-version "5.10.206")
 (define-public linux-libre-5.10-gnu-revision "gnu1")
 (define deblob-scripts-5.10
   (linux-libre-deblob-scripts
    linux-libre-5.10-version
    linux-libre-5.10-gnu-revision
    (base32 "1b33rkn32b923025iiz4xzxiy8y5ii9j5qk4021mg575890rl4ch")
-   (base32 "0xrrnmb5kcc5r21bdm24aq0fnkk1imn367c1cxlj78b6l6gigx4b")))
+   (base32 "0zmmqj5gyiy2q81f199c29b14isfiqbvl87y72k14yy0q5398276")))
 (define-public linux-libre-5.10-pristine-source
   (let ((version linux-libre-5.10-version)
-        (hash (base32 "0qw8g0h4k0b4dyvspbj51cwr68ihwjzsi2b2261ipy3l1nl1fln5")))
+        (hash (base32 "0ns8qxcrxj9i76b93xcghl002l8vbkg7ksd435sikig62qr62gf4")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.10)))
 
-(define-public linux-libre-5.4-version "5.4.265")
+(define-public linux-libre-5.4-version "5.4.266")
 (define-public linux-libre-5.4-gnu-revision "gnu1")
 (define deblob-scripts-5.4
   (linux-libre-deblob-scripts
    linux-libre-5.4-version
    linux-libre-5.4-gnu-revision
    (base32 "0xg5cz82k2cb0ikxvwv1hp5c3h377jkb5sd6aszvsk7hnabhk62v")
-   (base32 "0sw67b2pk3lng4y67diqqnhxaggnp3nbkx8dxc5fs27rinfxr4m1")))
+   (base32 "08wn4rjrmi8asmdkg92xbbm6v0sw44kackp69agbw57zy6fp2zys")))
 (define-public linux-libre-5.4-pristine-source
   (let ((version linux-libre-5.4-version)
-        (hash (base32 "05cvvwjiznn7hfd02qklklalg0chahvh5v18w64lcva6kzj9kbjd")))
+        (hash (base32 "1dmcn9i3nvf1gldm1a32gnl5ybwbk2lizb3wa4gc06g7dxz2y1ys")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.4)))
 
-(define-public linux-libre-4.19-version "4.19.303")
+(define-public linux-libre-4.19-version "4.19.304")
 (define-public linux-libre-4.19-gnu-revision "gnu1")
 (define deblob-scripts-4.19
   (linux-libre-deblob-scripts
    linux-libre-4.19-version
    linux-libre-4.19-gnu-revision
    (base32 "0pjal2cc2f99cvw8r4icb4l24j41k48jkj6bqk7pcahzcgx33ycb")
-   (base32 "1425mhkfxn18vxn05bb4h3li7x1jl7l1hf1zi8xhnqv3wa31h9wl")))
+   (base32 "07j33w4pq319gaypfsym6v0i2xqc5jagm47nxyy2010zn8k6y8kd")))
 (define-public linux-libre-4.19-pristine-source
   (let ((version linux-libre-4.19-version)
-        (hash (base32 "0dlbl47xs7z4yf9cxbxqzd7zs1f9070jr6ck231wgppa6lwwwb82")))
+        (hash (base32 "165mljr8v1cf4vf4a4b44hx089rprkssvi2azq5wbxxg3basbind")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.19)))
 
-(define-public linux-libre-4.14-version "4.14.334")
+(define-public linux-libre-4.14-version "4.14.335")
 (define-public linux-libre-4.14-gnu-revision "gnu1")
 (define deblob-scripts-4.14
   (linux-libre-deblob-scripts
    linux-libre-4.14-version
    linux-libre-4.14-gnu-revision
    (base32 "1vbgykwzf7j0yjqcwn747cfhwj0rgw3s9h627q94wb9a19x9p0fr")
-   (base32 "1faagsj4i31z2bp83hflx3q9vrddjnn37a3ah2b47iaplva7z1nd")))
+   (base32 "1ir96bbhw77xw6lmsnh42gi130nnzjklpgfyd46pxmqckrpydcvx")))
 (define-public linux-libre-4.14-pristine-source
   (let ((version linux-libre-4.14-version)
-        (hash (base32 "0iaaqdkszmfarvjfszc9rf7y9zsv3w82934xmvmzmsbiz86547ca")))
+        (hash (base32 "0aa0xi1sn4rw9ichgmvxp0s9hsi6rfzhzd9wgbvzvc90md2qfs19")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.14)))
diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
index 38eb9bdfdd..e63364f54b 100644
--- a/gnu/packages/lisp-xyz.scm
+++ b/gnu/packages/lisp-xyz.scm
@@ -23,7 +23,7 @@
 ;;; Copyright © 2020-2023 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2021, 2022 Aurora <rind38@disroot.org>
 ;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>
-;;; Copyright © 2021, 2022, 2023 André A. Gomes <andremegafone@gmail.com>
+;;; Copyright © 2021-2024 André A. Gomes <andremegafone@gmail.com>
 ;;; Copyright © 2021, 2022, 2023 Cage <cage-dev@twistfold.it>
 ;;; Copyright © 2021 Cameron Chaparro <cameron@cameronchaparro.com>
 ;;; Copyright © 2021 Charles Jackson <charles.b.jackson@protonmail.com>
@@ -6126,6 +6126,38 @@ BTCPay, Paypal, and Stripe.")
 (define-public ecl-lisp-pay
   (sbcl-package->ecl-package sbcl-lisp-pay))
 
+(define-public sbcl-stripe
+  (let ((commit "b59631d21d63e101de6eb96b56941471504ba644")
+        (revision "0"))
+    (package
+      (name "sbcl-stripe")
+      (version (git-version "0.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/atlas-engineer/stripe")
+               (commit commit)))
+         (file-name (git-file-name "cl-stripe" version))
+         (sha256
+          (base32 "00sfq2f6dnpwa6pf7rgw5hazbwx4yf1g0jrkfz9h4kq5zyxwk1cy"))))
+      (build-system asdf-build-system/sbcl)
+      (inputs
+       (list sbcl-dexador
+             sbcl-golden-utils
+             sbcl-local-time
+             sbcl-yason))
+      (home-page "https://github.com/atlas-engineer/stripe")
+      (synopsis "Stripe payment API client for Common Lisp")
+      (description "A client for the Stripe payment API.")
+      (license license:expat))))
+
+(define-public cl-stripe
+  (sbcl-package->cl-source-package sbcl-stripe))
+
+(define-public ecl-stripe
+  (sbcl-package->ecl-package sbcl-stripe))
+
 (define-public sbcl-drakma
   (package
     (name "sbcl-drakma")
@@ -26284,43 +26316,45 @@ extra features like type inference.")
   (sbcl-package->cl-source-package sbcl-nclasses))
 
 (define-public sbcl-prompter
-  (package
-    (name "sbcl-prompter")
-    (version "0.1.1")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/atlas-engineer/prompter")
-             (commit version)))
-       (file-name (git-file-name "cl-prompter" version))
-       (sha256
-        (base32
-         "008bq36siza9qwmz6b1pvpm53lxmzryahnhy372l18gl3180in03"))))
-    (build-system asdf-build-system/sbcl)
-    (inputs
-     (list
-      sbcl-alexandria
-      sbcl-calispel
-      sbcl-cl-containers
-      sbcl-cl-str
-      sbcl-closer-mop
-      sbcl-lparallel
-      sbcl-moptilities
-      sbcl-nclasses
-      sbcl-serapeum
-      sbcl-trivial-package-local-nicknames))
-    (native-inputs
-     (list sbcl-lisp-unit2))
-    (home-page "https://github.com/atlas-engineer/prompter")
-    (synopsis "Live-narrowing, fuzzy-matching, extensible prompt framework")
-    (description
-     "This prompter library is heavily inspired by Emacs' minibuffer and
+  (let ((commit "7890ed5d02e70aba01ceb964c6ee4f40776e7dc0")
+        (revision "0"))
+    (package
+      (name "sbcl-prompter")
+      (version (git-version "0.1.1" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/atlas-engineer/prompter")
+               (commit commit)))
+         (file-name (git-file-name "cl-prompter" version))
+         (sha256
+          (base32
+           "0r15a6cagyp5x8aqx92ln2anni737h73bdshkvpzrac04ajss4md"))))
+      (build-system asdf-build-system/sbcl)
+      (inputs
+       (list
+        sbcl-alexandria
+        sbcl-calispel
+        sbcl-cl-containers
+        sbcl-cl-str
+        sbcl-closer-mop
+        sbcl-lparallel
+        sbcl-moptilities
+        sbcl-nclasses
+        sbcl-serapeum
+        sbcl-trivial-package-local-nicknames))
+      (native-inputs
+       (list sbcl-lisp-unit2))
+      (home-page "https://github.com/atlas-engineer/prompter")
+      (synopsis "Live-narrowing, fuzzy-matching, extensible prompt framework")
+      (description
+       "This prompter library is heavily inspired by Emacs' minibuffer and
 Helm (@url{https://emacs-helm.github.io/helm/}).  It only deals with the
 backend side of things, it does not handle any display.  Features include
 asynchronous suggestion computation, multiple sources, actions and resumable
 prompters.")
-    (license license:bsd-3)))
+      (license license:bsd-3))))
 
 (define-public cl-prompter
   (sbcl-package->cl-source-package sbcl-prompter))
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index 40217780c8..aa7315a7ce 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -1486,7 +1486,7 @@ includes a compiler as well as an interpreter.")
 
 (define-public s7-bootstrap
   ;; Need s7-bootstrap to build libc_s7.so (for the REPL) and run tests
-  (let ((commit "a5b4bb49f8bcd7c33ae2366065fc8c254b734460") ;no releases
+  (let ((commit "618de30e0f9851515724245e3ebbfa1be4de6906") ;no releases
         (revision "0"))
     (hidden-package
      (package
@@ -1500,7 +1500,7 @@ includes a compiler as well as an interpreter.")
                  (file-name (git-file-name name version))
                  (sha256
                   (base32
-                   "03n1axdlypzmbgzrhlwfqwa1xiw36hi25j2hwc7vw77mz90cd9f8"))))
+                   "0kh1f49g24ppjpr16v1nc9lr7pvr5nzb82bpw8c6q8ll7pqalqaf"))))
        (build-system gnu-build-system)
        (arguments
         (list #:tests? #f ;no tests in bootstrap
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 6abd1a67d7..4a7cb8033d 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -27,6 +27,7 @@
 ;;; Copyright © 2022 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2022 Zhu Zihao <all_but_last@163.com>
 ;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
+;;; Copyright © 2023, 2024 Zheng Junjie <873216071@qq.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2169,20 +2170,31 @@ using @code{clang-rename}.")))
               ;; AMDGPU is needed by the vulkan drivers.
               #$(string-append "-DLLVM_TARGETS_TO_BUILD="
                                (system->llvm-target) ";AMDGPU")
+              #$@(if (%current-target-system)
+                     '("-DBUILD_SHARED_LIBS:BOOL=TRUE"
+                       "-DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE")
+                    '())
               ;; Skipping tools and utils decreases the output by ~100 MiB.
               "-DLLVM_BUILD_TOOLS=NO"
-              (remove (cut string-match
-                           "-DLLVM_(TARGETS_TO_BUILD|INSTALL_UTILS).*" <>)
+              (remove
+               (cut string-match
+                    #$(if (%current-target-system)
+                          "-DLLVM_(LINK_LLVM_DYLIB|TARGETS_TO_BUILD|INSTALL_UTILS).*"
+                          "-DLLVM_(TARGETS_TO_BUILD|INSTALL_UTILS).*") <>)
                       #$cf)))
          ((#:phases phases '%standard-phases)
           #~(modify-phases #$phases
-              (add-after 'install 'delete-static-libraries
-                ;; If these are just relocated then llvm-config can't find them.
-                (lambda* (#:key outputs #:allow-other-keys)
-                  (for-each delete-file
-                            (find-files (string-append
-                                          (assoc-ref outputs "out") "/lib")
-                                        "\\.a$"))))
+              #$@(if (%current-target-system)
+                     '()
+                     #~((add-after 'install 'delete-static-libraries
+                          ;; If these are just relocated then llvm-config
+                          ;; can't find them.
+                          (lambda* (#:key outputs #:allow-other-keys)
+                            (for-each delete-file
+                                      (find-files
+                                       (string-append
+                                        (assoc-ref outputs "out") "/lib")
+                                       "\\.a$"))))))
               ;; llvm-config is how mesa and others find the various
               ;; libraries and headers they use.
               (add-after 'install 'build-and-install-llvm-config
diff --git a/gnu/packages/logging.scm b/gnu/packages/logging.scm
index c204a013b4..0efd828f8a 100644
--- a/gnu/packages/logging.scm
+++ b/gnu/packages/logging.scm
@@ -232,7 +232,7 @@ output in multiple windows in a terminal.")
        (list "-DSPDLOG_BUILD_BENCH=OFF"
              "-DSPDLOG_BUILD_SHARED=ON"
              "-DSPDLOG_BUILD_TESTS=ON")))
-    (native-inputs (list catch2-3.3))
+    (native-inputs (list catch2-3))
     (home-page "https://github.com/gabime/spdlog")
     (synopsis "Fast C++ logging library")
     (description "Spdlog is a very fast header-only/compiled C++ logging
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 14fc2a0a72..1616738399 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015-2023 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015-2024 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2020-2023 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017, 2020 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
@@ -21,6 +21,7 @@
 ;;; Copyright © 2023 zamfofex <zamfofex@twdb.moe>
 ;;; Copyright © 2023 Navid Afkhami <navid.afkhami@mdc-berlin.de>
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -812,6 +813,94 @@ SentencePiece allows us to make a purely end-to-end system that does not
 depend on language-specific pre- or post-processing.")
     (license license:asl2.0)))
 
+(define-public python-hopcroftkarp
+  ;; This commit fixes a broken import, but has not been released to PyPI.
+  (let ((commit "2846e1dd3265d95d2bddb0cf4190b830cbb4efe6")
+        (revision "1"))
+    (package
+      (name "python-hopcroftkarp")
+      (version (git-version "1.2.5" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/sofiatolaosebikan/hopcroftkarp")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "018ilrp41fcclmb5lsml3aijwbmhbq3m7wy65hr1fryj0avic8fr"))))
+      (build-system pyproject-build-system)
+      (home-page "https://github.com/sofiatolaosebikan/hopcroftkarp")
+      (synopsis "Implementation of the Hopcroft-Karp algorithm")
+      (description
+       "This package implements the Hopcroft-Karp algorithm, producing a maximum
+cardinality matching from a bipartite graph.")
+      (license license:gpl3))))
+
+(define-public python-persim
+  (package
+    (name "python-persim")
+    (version "0.3.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "persim" version))
+       (sha256
+        (base32 "0q8wfakx8q4h3ryvw8cba0v6z7xn9139qkrzs3mi1ggyzacnx9d7"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-deprecated
+                             python-hopcroftkarp
+                             python-joblib
+                             python-matplotlib
+                             python-numpy
+                             python-scikit-learn
+                             python-scipy))
+    (native-inputs (list python-pytest python-pytest-cov))
+    (home-page "https://persim.scikit-tda.org")
+    (synopsis "Tools for analyzing persistence diagrams in Python")
+    (description
+     "This package includes a variety of tools used to analyze persistence diagrams.
+It currently houses implementations of
+@itemize
+@item Persistence images
+@item Persistence landscapes
+@item Bottleneck distance
+@item Modified Gromov–Hausdorff distance
+@item Sliced Wasserstein kernel
+@item Heat kernel
+@item Diagram plotting
+@end itemize
+")
+    (license license:expat))) ; MIT License
+
+(define-public python-ripser
+  (package
+    (name "python-ripser")
+    (version "0.6.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "ripser" version))
+       (sha256
+        (base32 "1575nwsn6b29z7w1mjk23ri83bxq2b4ld979hpgm174642a3x6vs"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-numpy python-persim python-scikit-learn
+                             python-scipy))
+    (native-inputs (list python-cython python-pytest))
+    (home-page "https://ripser.scikit-tda.org")
+    (synopsis "Persistent homology library for Python")
+    (description
+     "This package implements a variety of persistent homology algorithms.  It
+provides an interface for
+@itemize
+@item computing persistence cohomology of sparse and dense data sets
+@item visualizing persistence diagrams
+@item computing lowerstar filtrations on images
+@item computing representative cochains
+@end itemize
+")
+    (license license:expat))) ; MIT License
+
 (define-public python-sacrebleu
   (package
     (name "python-sacrebleu")
@@ -1151,6 +1240,11 @@ in terms of new algorithms.")
     (build-system python-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'relax-requirements
+                    (lambda _
+                      ;; Does this difference really matter?
+                      (substitute* "requirements.txt"
+                        (("3.20.1") "3.20.2"))))
                   (add-before 'build 'pass-cmake-arguments
                     (lambda* (#:key outputs #:allow-other-keys)
                       ;; Pass options to the CMake-based build process.
@@ -1235,7 +1329,13 @@ operators and standard data types.")
                '(begin
                   (delete-file-recursively "third_party")
                   (substitute* "onnx/backend/test/runner/__init__.py"
-                    (("urlretrieve\\(.*") "raise unittest.SkipTest('Skipping download')\n"))))))))
+                    (("urlretrieve\\(.*") "raise unittest.SkipTest('Skipping download')\n"))))))
+    (arguments
+     ;; reuse build system tweaks
+     (substitute-keyword-arguments (package-arguments onnx)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (delete 'relax-requirements)))))))
 
 (define-public python-onnx
   ;; This used to be called "python-onnx" because it provided nothing but
@@ -1262,7 +1362,12 @@ operators and standard data types.")
               (modules '((guix build utils)))
               (snippet '(delete-file-recursively "third_party"))))
     (build-system python-build-system)
-    (arguments (package-arguments onnx))          ;reuse build system tweaks
+    (arguments
+     ;; reuse build system tweaks
+     (substitute-keyword-arguments (package-arguments onnx)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (delete 'relax-requirements)))))
     (native-inputs
      (list cmake python-pytest python-pytest-runner python-nbval
            python-coverage))
diff --git a/gnu/packages/minetest.scm b/gnu/packages/minetest.scm
index bf0df314a7..14c47430e3 100644
--- a/gnu/packages/minetest.scm
+++ b/gnu/packages/minetest.scm
@@ -52,7 +52,7 @@
 (define-public minetest
   (package
     (name "minetest")
-    (version "5.7.0")
+    (version "5.8.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -61,7 +61,7 @@
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "008l44zwwsarwk4hn7wx2nj2m21b1iqsphl7g69rrlxj760zl0pl"))
+                "1sww17h8z77w38jk19nsqxn8xcj27msq0glbil7pyj4i0ffprjrr"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -166,7 +166,7 @@ in different ways.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "02kbj1h6jsq6k8x4v2ir0njczdz7nyx6dbym85ixxp3mrqxiws61"))))
+                "1pq4rm15lzwcqv6npgyz6v89hi3zj8zybw25n9i0d27qj786xc4z"))))
     (build-system copy-build-system)
     (arguments
      (list #:install-plan
diff --git a/gnu/packages/mpd.scm b/gnu/packages/mpd.scm
index e462f0f01d..e16c6bb964 100644
--- a/gnu/packages/mpd.scm
+++ b/gnu/packages/mpd.scm
@@ -117,7 +117,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
 (define-public mpd
   (package
     (name "mpd")
-    (version "0.23.14")
+    (version "0.23.15")
     (source (origin
               (method url-fetch)
               (uri
@@ -126,7 +126,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
                               "/mpd-" version ".tar.xz"))
               (sha256
                (base32
-                "1lh9nn4a7ng6i08df7rbs8c4nbgmz883pss9p2gswa6m4rsadfc5"))))
+                "06k60ych9crifyx6zfc98hdcihixq5nba1c9rwngib6ik8ik40am"))))
     (build-system meson-build-system)
     (arguments
      (list
@@ -162,6 +162,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
                    boost
                    chromaprint
                    curl
+                   dbus
                    elogind
                    expat
                    ffmpeg
diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm
index 0c6255c129..591170b508 100644
--- a/gnu/packages/multiprecision.scm
+++ b/gnu/packages/multiprecision.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2016, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Eric Bavier <bavier@member.fsf.org>
-;;; Copyright © 2018, 2019, 2021, 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2018, 2019, 2021, 2023, 2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2021 Vinicius Monego <monego@posteo.net>
 ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
@@ -71,6 +71,8 @@
                  ;; they produce different headers.  We need shared.
                  `("--disable-static"
                    "--enable-shared"))
+                ((target-x32?)
+                 `("ABI=x32"))
                 (else '())))
       ;; Remove after core-updates merge.
       ;; Workaround for gcc-7 transition breakage, -system and cross-build,
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index c3796f7328..28287a6e32 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -26,7 +26,7 @@
 ;;; Copyright © 2018, 2020-2022 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2018, 2020, 2021, 2022 Oleg Pykhalov <go.wigust@gmail.com>
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
-;;; Copyright © 2019, 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2019, 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2019 Vasile Dumitrascu <va511e@yahoo.com>
 ;;; Copyright © 2019 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2019 Timotej Lazar <timotej.lazar@araneo.si>
@@ -164,8 +164,10 @@
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages ssh)
   #:use-module (gnu packages tcl)
+  #:use-module (gnu packages telephony)
   #:use-module (gnu packages textutils)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages upnp)
   #:use-module (gnu packages valgrind)
   #:use-module (gnu packages web)
   #:use-module (gnu packages wxwidgets)
@@ -1414,39 +1416,50 @@ files contain direct mappings of the abstractions provided by the ØMQ C API.")
     (license license:expat)))
 
 (define-public libnatpmp
-  (package
-    (name "libnatpmp")
-    (version "20230423")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "http://miniupnp.free.fr/files/"
-                    name "-" version ".tar.gz"))
-              (sha256
-               (base32
-                "0w7wvf4yi8qv659dg9d3ndqvh3bqhgm21gd135spwhq6hhnfv106"))))
-    (build-system gnu-build-system)
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (delete 'check)) ; no tests
-       #:make-flags
-       (let* ((target ,(%current-target-system))
-              (gcc (if target
-                       (string-append target "-gcc")
-                       "gcc")))
-         (list
-          (string-append "CC=" gcc)
-          (string-append "INSTALLPREFIX=" (assoc-ref %outputs "out"))
-          (string-append "LDFLAGS=-Wl,-rpath=" %output "/lib")))))
-    (home-page "http://miniupnp.free.fr/libnatpmp.html")
-    (synopsis "C library implementing NAT-PMP")
-    (description
-     "@code{libnatpmp} is a portable and asynchronous implementation of
+  ;; Install the latest commit as it provides a pkg-config (.pc) file.
+  (let ((base-version "20230423")
+        (commit "6a850fd2bd9b08e6edc886382a1dbae2a7df55ec")
+        (revision "0"))
+    (package
+      (name "libnatpmp")
+      (version (git-version base-version revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/miniupnp/libnatpmp")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "18hf9a3i3mncl3w80nzi1684iac3by86bv0hgmbm1v2w8gbfjyw0"))))
+      (build-system cmake-build-system)
+      (arguments
+       (list
+        #:tests? #f                     ;no test suite
+        #:configure-flags #~(list "-DBUILD_SHARED_LIBS=ON")
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'unpack 'patch-build-system
+              ;; Have CMake install the natpmp_declspec.h missing header file
+              ;; that is referenced by natpmp.h (see:
+              ;; https://github.com/miniupnp/libnatpmp/issues/41).
+              (lambda _
+                (substitute* "CMakeLists.txt"
+                  (("install\\(FILES natpmp.h")
+                   "install(FILES natpmp.h natpmp_declspec.h"))))
+            (add-after 'unpack 'fix-version
+              (lambda _
+                (with-output-to-file "VERSION"
+                  (lambda ()
+                    (display #$base-version))))))))
+      (native-inputs (list which))
+      (home-page "https://miniupnp.tuxfamily.org/libnatpmp.html")
+      (synopsis "C library implementing NAT-PMP")
+      (description
+       "@code{libnatpmp} is a portable and asynchronous implementation of
 the Network Address Translation - Port Mapping Protocol (NAT-PMP)
 written in the C programming language.")
-    (license license:bsd-3)))
+      (license license:bsd-3))))
 
 (define-public librdkafka
   (package
@@ -3382,14 +3395,14 @@ eight bytes) tools
 (define-public asio
   (package
     (name "asio")
-    (version "1.22.2")
+    (version "1.28.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://sourceforge/asio/asio/"
                            version " (Stable)/asio-" version ".tar.bz2"))
        (sha256
-        (base32 "0v5w9j4a02j2rkc7mrdj3ms0kfpqbgq2ipkixlz2l0p8xs0vfsvp"))))
+        (base32 "0cp2c4v0kz0ln4bays0s3fr1mcxl527ay2lp7s14qbxx38vc5pfh"))))
     (build-system gnu-build-system)
     (inputs
      (list boost openssl))
@@ -3701,61 +3714,103 @@ communication over HTTP.")
     (license license:agpl3+)))
 
 (define-public restinio
-  ;; Temporarily use an unreleased commit, which includes fixes to be able to
-  ;; run the test suite in the resolver-less Guix build environment.
-  (let ((revision "0")
-        (commit "eda471ec3a2815965ca02ec93a1124a342b7601d"))
-    (package
-      (name "restinio")
-      (version (git-version "0.6.18" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://github.com/Stiffstream/restinio")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "0f4w7714r0ic7csgxydw2vzfh35ssk34pns9jycmc08dzc3r7whb"))))
-      (build-system cmake-build-system)
-      (arguments
-       (list
-        #:configure-flags #~(list "-DRESTINIO_FIND_DEPS=ON"
-                                  "-DRESTINIO_INSTALL=ON"
-                                  "-DRESTINIO_TEST=ON"
-                                  "-DRESTINIO_USE_EXTERNAL_HTTP_PARSER=ON"
-                                  "-DRESTINIO_USE_EXTERNAL_SOBJECTIZER=ON")
-        #:phases
-        #~(modify-phases %standard-phases
-            (add-after 'unpack 'change-directory
-              (lambda _
-                (chdir "dev"))))))
-      (native-inputs
-       (list catch2
-             clara
-             json-dto))
-      (inputs
-       (list openssl
-             sobjectizer))
-      (propagated-inputs
-       ;; These are all #include'd by restinio's .hpp header files.
-       (list asio
-             fmt
-             http-parser
-             pcre
-             pcre2
-             zlib))
-      (home-page "https://stiffstream.com/en/products/restinio.html")
-      (synopsis "C++14 library that gives you an embedded HTTP/Websocket server")
-      (description "RESTinio is a header-only C++14 library that gives you an embedded
+  (package
+    (name "restinio")
+    (version "0.7.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/Stiffstream/restinio")
+                    (commit (string-append "v." version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "06p9gcnzgynsgfxxa1lk58pq5755px7sn00x2xh21qjnspwld1sy"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      #:configure-flags
+      #~(list "-DRESTINIO_INSTALL=ON"
+              "-DRESTINIO_TEST=ON"
+              "-DRESTINIO_DEP_LLHTTP=system"
+              "-DRESTINIO_DEP_FMT=system"
+              "-DRESTINIO_DEP_EXPECTED_LITE=system"
+              "-DRESTINIO_DEP_CATCH2=system"
+              ;; No support to use a system provided so_5
+              ;; (see:
+              ;; https://github.com/Stiffstream/restinio/issues/207).
+              "-DRESTINIO_WITH_SOBJECTIZER=OFF")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'change-directory
+            (lambda _
+              (chdir "dev")))
+          (add-after 'change-directory 'use-system-catch2
+            ;; It's not currently possible to select a system-provided catch2,
+            ;; so patch the build system (see:
+            ;; https://github.com/Stiffstream/restinio/issues/208).
+            (lambda _
+              (substitute* "CMakeLists.txt"
+                (("add_subdirectory\\(catch2\\)")
+                 "find_package(Catch2 REQUIRED)")))))))
+    (native-inputs
+     (list catch2-3
+           expected-lite
+           json-dto))
+    (inputs
+     (list openssl
+           sobjectizer))
+    (propagated-inputs
+     ;; These are all #include'd by restinio's .hpp header files.
+     (list asio
+           fmt
+           llhttp
+           pcre
+           pcre2
+           zlib))
+    (home-page "https://stiffstream.com/en/products/restinio.html")
+    (synopsis "C++14 library that gives you an embedded HTTP/Websocket server")
+    (description "RESTinio is a header-only C++14 library that gives you an embedded
 HTTP/Websocket server.  It is based on standalone version of ASIO
 and targeted primarily for asynchronous processing of HTTP-requests.")
-      (license license:bsd-3))))
+    (license license:bsd-3)))
+
+(define-public restinio-0.6
+  (package
+    (inherit restinio)
+    (name "restinio")
+    (version "0.6.19")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/Stiffstream/restinio")
+                    (commit (string-append "v." version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1qrb1qr075r5059w984c4slgpsiwv94j6fmi9naa5l48dbi1p7jz"))))
+    (arguments
+     (list
+      #:configure-flags #~(list "-DRESTINIO_FIND_DEPS=ON"
+                                "-DRESTINIO_INSTALL=ON"
+                                "-DRESTINIO_TEST=ON"
+                                "-DRESTINIO_USE_EXTERNAL_HTTP_PARSER=ON"
+                                "-DRESTINIO_USE_EXTERNAL_SOBJECTIZER=ON")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'change-directory
+            (lambda _
+              (chdir "dev"))))))
+    (native-inputs (list catch2 clara json-dto))
+    ;; These are all #include'd by restinio's .hpp header files.
+    (propagated-inputs
+     (modify-inputs (package-propagated-inputs restinio)
+       (replace "llhttp" http-parser)))))
 
 (define-public opendht
   (package
     (name "opendht")
-    (version "2.4.12")
+    (version "3.1.7")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3764,7 +3819,7 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0yji5pziqxfvyfizk3fn9j59bqlfdwfa1a0y9jjfknb2mmlwwb9w"))))
+                "15jx62fm1frbbvpkxysvvwz1a8d605xi53aacf0bvp4mb1dzpddn"))))
     (outputs '("out" "python" "tools" "debug"))
     (build-system gnu-build-system)
     (arguments
@@ -3792,6 +3847,14 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
               (substitute* "tests/Makefile.am"
                 (("\\bdhtrunnertester\\.(h|cpp)\\b")
                  ""))))
+          (add-after 'unupack 'relax-test-timeouts
+            (lambda _
+              ;; At least the 'test_send_json' has been seen to fail
+              ;; non-deterministically, but it seems hard to reproducible that
+              ;; failure.
+              (substitute* "tests/httptester.cpp"
+                (("std::chrono::seconds\\(10)")
+                 "std::chrono::seconds(30)"))))
           (add-after 'unpack 'fix-python-installation-prefix
             ;; Specify the installation prefix for the compiled Python module
             ;; that would otherwise attempt to installs itself to Python's own
@@ -3835,8 +3898,8 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
            fmt
            readline))
     (propagated-inputs
-     (list msgpack                      ;included in several installed headers
-           restinio                     ;included in opendht/http.h
+     (list msgpack-cxx                  ;included in several installed headers
+           restinio-0.6                 ;included in opendht/http.h
            ;; The following are listed in the 'Requires.private' field of
            ;; opendht.pc:
            argon2
@@ -3880,6 +3943,60 @@ A very simple IM client working over the DHT.
 @end table")
     (license license:gpl3+)))
 
+(define-public dhtnet
+  ;; There is no tag nor release; use the latest available commit.
+  (let ((revision "0")
+        (commit "8b6e99fd34f150fde5f21f3a57e0e9f28174c70c"))
+    (package
+      (name "dhtnet")
+      ;; The base version is taken from the CMakeLists.txt file.
+      (version (git-version "0.0.1" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/savoirfairelinux/dhtnet")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1yhygsimcl9j6hbww1b77am1kgbcriczslcrfb838nbfh18n1780"))))
+      (outputs (list "out" "debug"))
+      (build-system cmake-build-system)
+      (arguments
+       (list
+        #:configure-flags #~(list "-DBUILD_DEPENDENCIES=OFF"
+                                  "-DBUILD_SHARED_LIBS=ON"
+                                  "-DBUILD_TESTING=ON")
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'unpack 'delete-problematic-tests
+              (lambda _
+                (substitute* "CMakeLists.txt"
+                  ;; The connectionManager test currently segfaults (see:
+                  ;; https://git.jami.net/savoirfairelinux/dhtnet/-/issues/18).
+                  ((".*tests_connectionManager.*") "")
+                  ;; The fileutils test fail, asserting an unexpected returned
+                  ;; value for the removeAll call when the directory to be
+                  ;; removed is missing (see:
+                  ;; https://git.jami.net/savoirfairelinux/dhtnet/-/issues/17).
+                  ((".*tests_fileutils.*") "")))))))
+      (native-inputs (list cppunit pkg-config))
+      ;; This library depends on the Jami fork of pjproject that adds ICE
+      ;; support.
+      (inputs
+       (list asio
+             fmt
+             msgpack-cxx
+             opendht
+             libupnp
+             pjproject-jami
+             readline))
+      (home-page "https://github.com/savoirfairelinux/dhtnet/")
+      (synopsis "OpenDHT network library for C++")
+      (description "The @code{dhtnet} is a C++ library providing abstractions
+for interacting with an OpenDHT distributed network.")
+      (license license:gpl3+))))
+
 (define-public frrouting
   (package
     (name "frrouting")
@@ -4445,36 +4562,32 @@ QUIC protocol.")
                             "github.com/yggdrasil-network/yggdrasil-go/cmd/yggdrasilctl"
                             "github.com/yggdrasil-network/yggdrasil-go/cmd/genkeys"))))))))
     (propagated-inputs
-     (let ((p (package-input-rewriting
-               `((,go-golang-org-x-sys . ,go-golang-org-x-sys-0.8))
-               #:deep? #true)))
-       (cons go-golang-org-x-sys-0.8
-             (map p
-                  (list go-golang-zx2c4-com-wireguard
-                        go-golang-org-x-text
-                        go-golang-org-x-net
-                        go-golang-org-x-crypto
-                        go-golang-org-x-tools
-                        go-netns
-                        go-netlink
-                        go-github-com-bits-and-blooms-bitset
-                        go-github-com-bits-and-blooms-bloom
-                        go-github-com-quic-go-quic-go
-                        go-github-com-hjson-hjson-go
-                        go-github-com-olekukonko-tablewriter
-                        go-github-com-mitchellh-mapstructure
-                        go-github-com-mattn-go-runewidth
-                        go-github-com-mattn-go-isatty
-                        go-github-com-mattn-go-colorable
-                        go-github-com-kardianos-minwinsvc
-                        go-github-com-hjson-hjson-go
-                        go-github-com-hashicorp-go-syslog
-                        go-github-com-gologme-log
-                        go-github-com-fatih-color
-                        go-github-com-cheggaaa-pb-v3
-                        go-github-com-vividcortex-ewma
-                        go-github-com-arceliar-phony
-                        go-github-com-arceliar-ironwood)))))
+     (list go-golang-zx2c4-com-wireguard
+           go-golang-org-x-text
+           go-golang-org-x-net
+           go-golang-org-x-crypto
+           go-golang-org-x-tools
+           go-golang-org-x-sys
+           go-netns
+           go-netlink
+           go-github-com-bits-and-blooms-bitset
+           go-github-com-bits-and-blooms-bloom
+           go-github-com-quic-go-quic-go
+           go-github-com-hjson-hjson-go
+           go-github-com-olekukonko-tablewriter
+           go-github-com-mitchellh-mapstructure
+           go-github-com-mattn-go-runewidth
+           go-github-com-mattn-go-isatty
+           go-github-com-mattn-go-colorable
+           go-github-com-kardianos-minwinsvc
+           go-github-com-hjson-hjson-go
+           go-github-com-hashicorp-go-syslog
+           go-github-com-gologme-log
+           go-github-com-fatih-color
+           go-github-com-cheggaaa-pb-v3
+           go-github-com-vividcortex-ewma
+           go-github-com-arceliar-phony
+           go-github-com-arceliar-ironwood))
     (home-page "https://yggdrasil-network.github.io/blog.html")
     (synopsis
      "Experiment in scalable routing as an encrypted IPv6 overlay network")
diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm
index e12035e47d..8f59331a02 100644
--- a/gnu/packages/parallel.scm
+++ b/gnu/packages/parallel.scm
@@ -64,14 +64,14 @@
 (define-public parallel
   (package
     (name "parallel")
-    (version "20231122")
+    (version "20231222")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://gnu/parallel/parallel-"
                           version ".tar.bz2"))
       (sha256
-       (base32 "1qpa3dhmdddw7l5906y8ck8rnri66kqkxcbxhsnj058pmbw9qb42"))
+       (base32 "1alvva2dlnlq5rbbklzc2a7l84mg550l1xc632zdgfx9dzf6sihr"))
       (snippet
        '(begin
           (use-modules (guix build utils))
diff --git a/gnu/packages/patches/curl-use-ssl-cert-env.patch b/gnu/packages/patches/curl-use-ssl-cert-env.patch
index 24be6e31d9..c39c1f7e98 100644
--- a/gnu/packages/patches/curl-use-ssl-cert-env.patch
+++ b/gnu/packages/patches/curl-use-ssl-cert-env.patch
@@ -5,37 +5,37 @@ must be called when no other threads exist).
 This fixes network functionality in rust:cargo, and probably removes the need
 for other future workarounds.
 ===================================================================
---- curl-7.66.0.orig/lib/easy.c	2020-01-02 15:43:11.883921171 +0100
-+++ curl-7.66.0/lib/easy.c	2020-01-02 16:18:54.691882797 +0100
-@@ -134,6 +134,9 @@
- #  pragma warning(default:4232) /* MSVC extension, dllimport identity */
+--- curl-8.5.0.orig/lib/easy.c	2023-12-17 00:36:32.400468561 -0500
++++ curl-8.5.0/lib/easy.c	2023-12-17 00:39:08.898612331 -0500
+@@ -137,6 +137,9 @@
+ static char *leakpointer;
  #endif
- 
+
 +char * Curl_ssl_cert_dir = NULL;
 +char * Curl_ssl_cert_file = NULL;
 +
  /**
   * curl_global_init() globally initializes curl given a bitwise set of the
   * different features of what to initialize.
-@@ -155,6 +158,9 @@
- #endif
+@@ -163,6 +166,9 @@
+     goto fail;
    }
- 
+
 +  Curl_ssl_cert_dir = curl_getenv("SSL_CERT_DIR");
 +  Curl_ssl_cert_file = curl_getenv("SSL_CERT_FILE");
 +
    if(!Curl_ssl_init()) {
      DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
-     return CURLE_FAILED_INIT;
-@@ -260,6 +266,9 @@
+     goto fail;
+@@ -287,6 +293,9 @@
    Curl_ssl_cleanup();
    Curl_resolver_global_cleanup();
- 
+
 +  free(Curl_ssl_cert_dir);
 +  free(Curl_ssl_cert_file);
 +
- #ifdef WIN32
-   Curl_win32_cleanup(init_flags);
+ #ifdef _WIN32
+   Curl_win32_cleanup(easy_init_flags);
  #endif
 diff -ur curl-7.66.0.orig/lib/url.c curl-7.66.0/lib/url.c
 --- curl-7.66.0.orig/lib/url.c	2020-01-02 15:43:11.883921171 +0100
diff --git a/gnu/packages/patches/dtc-meson-cell-overflow.patch b/gnu/packages/patches/dtc-meson-cell-overflow.patch
new file mode 100644
index 0000000000..1c319312f7
--- /dev/null
+++ b/gnu/packages/patches/dtc-meson-cell-overflow.patch
@@ -0,0 +1,32 @@
+Taken from upstream:
+https://git.kernel.org/pub/scm/utils/dtc/dtc.git/commit/?id=32174a66efa4ad19fc6a2a6422e4af2ae4f055cb
+
+From 32174a66efa4ad19fc6a2a6422e4af2ae4f055cb Mon Sep 17 00:00:00 2001
+From: David Gibson <david@gibson.dropbear.id.au>
+Date: Tue, 28 Feb 2023 10:33:58 +1100
+Subject: [PATCH] meson: Fix cell overflow tests when running from meson
+
+Because meson always builds out-of-tree we need to reference things in the
+original source tree via $SRCDIR from run_tests.sh.  We forgot a couple of
+cases for the cell overflow tests.  Fix them.
+
+Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
+---
+ tests/run_tests.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index 91350ad3..f899d8cb 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -519,8 +519,8 @@ libfdt_tests () {
+     check_tests "$SRCDIR/phandle-args-overflow.dts" clocks_property
+ 
+     ## https://github.com/dgibson/dtc/issues/74
+-    run_dtc_test -I dts -O dtb -o cell-overflow-results.test.dtb cell-overflow-results.dts
+-    run_dtc_test -I dts -O dtb -o cell-overflow.test.dtb cell-overflow.dts
++    run_dtc_test -I dts -O dtb -o cell-overflow-results.test.dtb "$SRCDIR/cell-overflow-results.dts"
++    run_dtc_test -I dts -O dtb -o cell-overflow.test.dtb "$SRCDIR/cell-overflow.dts"
+     run_test dtbs_equal_ordered cell-overflow.test.dtb cell-overflow-results.test.dtb
+ 
+     # check full tests
diff --git a/gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch b/gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch
deleted file mode 100644
index f7b61391c3..0000000000
--- a/gnu/packages/patches/emacs-ess-fix-obsolete-function-alias.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 9cc5520e1998d03f5dec0fbb1fe71b7cdec38b65 Mon Sep 17 00:00:00 2001
-From: Alex Branham <alex.branham@gmail.com>
-Date: Wed, 6 Jan 2021 06:41:20 -0500
-Subject: [PATCH] Add required when to obsolete function alias
-
-Closes #1085
----
- lisp/ess-r-package.el | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/lisp/ess-r-package.el b/lisp/ess-r-package.el
-index 260959955..397ce14e6 100644
---- a/lisp/ess-r-package.el
-+++ b/lisp/ess-r-package.el
-@@ -577,7 +577,7 @@ package mode. Use this function if state of the buffer such as
-   (error "As of ESS 16.04, `ess-developer' is deprecated. Use `ess-r-set-evaluation-env' instead"))
- 
- (defalias 'ess-toggle-developer 'ess-developer)
--(define-obsolete-function-alias 'ess-r-devtools-check-package-buildwin 'ess-r-devtools-check-with-winbuilder)
-+(define-obsolete-function-alias 'ess-r-devtools-check-package-buildwin 'ess-r-devtools-check-with-winbuilder "18.04")
- (define-obsolete-function-alias 'ess-r-devtools-ask 'ess-r-devtools-execute-command "18.04")
- 
- (make-obsolete-variable 'ess-developer "Please use `ess-developer-select-package' and `ess-r-set-evaluation-env' instead." "16.04")
diff --git a/gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch b/gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch
new file mode 100644
index 0000000000..6248165d8c
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-change-RTCP-ratio.patch
@@ -0,0 +1,27 @@
+From a884b62c9e6f23b9f4369d724e25db2f42dad28d Mon Sep 17 00:00:00 2001
+From: Pierre LESPAGNOL <pierre.lespagnol@savoirfairelinux.com>
+Date: Tue, 28 May 2019 16:18:20 -0400
+Subject: [PATCH] Changement du ratio de 0.5% a 5%
+
+---
+ libavformat/rtp.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libavformat/rtp.h b/libavformat/rtp.h
+index 54512c6f71..16916ff86a 100644
+--- a/libavformat/rtp.h
++++ b/libavformat/rtp.h
+@@ -78,8 +78,8 @@ enum AVCodecID ff_rtp_codec_id(const char *buf, enum AVMediaType codec_type);
+ #define RTP_VERSION 2
+ #define RTP_MAX_SDES 256   /**< maximum text length for SDES */
+ 
+-/* RTCP packets use 0.5% of the bandwidth */
+-#define RTCP_TX_RATIO_NUM 5
++/* RTCP packets use 2.5% of the bandwidth */
++#define RTCP_TX_RATIO_NUM 25
+ #define RTCP_TX_RATIO_DEN 1000
+ 
+ /* An arbitrary id value for RTP Xiph streams - only relevant to indicate
+-- 
+2.17.1
+
diff --git a/gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch b/gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch
new file mode 100644
index 0000000000..fb9466a4fc
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-libopusdec-enable-FEC.patch
@@ -0,0 +1,127 @@
+diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c
+index 9b9a610343..8ec5bfc1ad 100644
+--- a/libavcodec/libopusdec.c
++++ b/libavcodec/libopusdec.c
+@@ -45,6 +45,8 @@ struct libopus_context {
+ #ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST
+     int apply_phase_inv;
+ #endif
++    int decode_fec;
++    int64_t expected_next_pts;
+ };
+ 
+ #define OPUS_HEAD_SIZE 19
+@@ -141,6 +143,8 @@ static av_cold int libopus_decode_init(AVCodecContext *avc)
+     /* Decoder delay (in samples) at 48kHz */
+     avc->delay = avc->internal->skip_samples = opus->pre_skip;
+ 
++    opus->expected_next_pts = AV_NOPTS_VALUE;
++
+     return 0;
+ }
+ 
+@@ -161,27 +165,82 @@ static int libopus_decode(AVCodecContext *avc, AVFrame *frame,
+                           int *got_frame_ptr, AVPacket *pkt)
+ {
+     struct libopus_context *opus = avc->priv_data;
+-    int ret, nb_samples;
++    uint8_t *outptr;
++    int ret, nb_samples = 0, nb_lost_samples = 0, nb_samples_left;
++
++    // If FEC is enabled, calculate number of lost samples
++    if (opus->decode_fec &&
++        opus->expected_next_pts != AV_NOPTS_VALUE &&
++        pkt->pts != AV_NOPTS_VALUE &&
++        pkt->pts != opus->expected_next_pts) {
++        // Cap at recovering 120 ms of lost audio.
++        nb_lost_samples = pkt->pts - opus->expected_next_pts;
++        nb_lost_samples = FFMIN(nb_lost_samples, MAX_FRAME_SIZE);
++    }
+ 
+-    frame->nb_samples = MAX_FRAME_SIZE;
++    frame->nb_samples = MAX_FRAME_SIZE + nb_lost_samples;
+     if ((ret = ff_get_buffer(avc, frame, 0)) < 0)
+         return ret;
+ 
++    outptr = frame->data[0];
++    nb_samples_left = frame->nb_samples;
++
++    if (opus->decode_fec && nb_lost_samples) {
++        // Try to recover the lost samples with FEC data from this one.
++        // If there's no FEC data, the decoder will do loss concealment instead.
++        if (avc->sample_fmt == AV_SAMPLE_FMT_S16)
++             nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size,
++                                                  (opus_int16 *)outptr,
++                                                  nb_lost_samples, 1);
++        else
++            nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size,
++                                                       (float *)outptr,
++                                                       nb_lost_samples, 1);
++
++        if (nb_samples < 0) {
++            av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n",
++                   opus_strerror(nb_samples));
++            return ff_opus_error_to_averror(nb_samples);
++        }
++
++        av_log(avc, AV_LOG_WARNING, "Recovered %d samples with FEC/PLC\n",
++                   nb_samples);
++
++        outptr += nb_samples * avc->channels * av_get_bytes_per_sample(avc->sample_fmt);
++        nb_samples_left -= nb_samples;
++        if (pkt->pts != AV_NOPTS_VALUE) {
++            pkt->pts -= nb_samples;
++            frame->pts = pkt->pts;
++        }
++    }
++
++    // Decode the actual, non-lost data.
+     if (avc->sample_fmt == AV_SAMPLE_FMT_S16)
+-        nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size,
+-                                             (opus_int16 *)frame->data[0],
+-                                             frame->nb_samples, 0);
++        ret = opus_multistream_decode(opus->dec, pkt->data, pkt->size,
++                                      (opus_int16 *)outptr,
++                                      nb_samples_left, 0);
+     else
+-        nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size,
+-                                                   (float *)frame->data[0],
+-                                                   frame->nb_samples, 0);
++        ret = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size,
++                                            (float *)outptr,
++                                            nb_samples_left, 0);
+ 
+-    if (nb_samples < 0) {
++    if (ret < 0) {
+         av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n",
+-               opus_strerror(nb_samples));
+-        return ff_opus_error_to_averror(nb_samples);
++               opus_strerror(ret));
++        return ff_opus_error_to_averror(ret);
+     }
+ 
++    nb_samples += ret;
++
++    if (opus->decode_fec)
++    {
++        // Calculate the next expected pts
++        if (pkt->pts == AV_NOPTS_VALUE) {
++            opus->expected_next_pts = AV_NOPTS_VALUE;
++        } else {
++            opus->expected_next_pts = pkt->pts + nb_samples;
++        }
++    }
+ #ifndef OPUS_SET_GAIN
+     {
+         int i = avc->ch_layout.nb_channels * nb_samples;
+@@ -220,6 +279,7 @@ static const AVOption libopusdec_options[] = {
+ #ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST
+     { "apply_phase_inv", "Apply intensity stereo phase inversion", OFFSET(apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
+ #endif
++    { "decode_fec", "Decode FEC data or use PLC", OFFSET(decode_fec), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
+     { NULL },
+ };
+ 
+-- 
+2.34.1
+
diff --git a/gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch b/gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch
new file mode 100644
index 0000000000..43b786c567
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-libopusenc-enable-FEC.patch
@@ -0,0 +1,50 @@
+diff --git a/libavcodec/libopusencc.c b/libavcodec/libopusencc.c
+index 2a97811d18..40ee7b8fec 100644
+--- a/libavcodec/libopusenc.c
++++ b/libavcodec/libopusenc.c
+@@ -33,6 +33,7 @@
+ typedef struct LibopusEncOpts {
+     int vbr;
+     int application;
++    int enable_fec;
+     int packet_loss;
+     int complexity;
+     float frame_duration;
+@@ -143,6 +144,13 @@
+                "Unable to set constrained VBR: %s\n", opus_strerror(ret));
+
+     ret = opus_multistream_encoder_ctl(enc,
++                                       OPUS_SET_INBAND_FEC(opts->enable_fec));
++    if (ret != OPUS_OK)
++        av_log(avctx, AV_LOG_WARNING,
++               "Unable to set enable FEC flag percentage: %s\n",
++               opus_strerror(ret));
++
++    ret = opus_multistream_encoder_ctl(enc,
+                                        OPUS_SET_PACKET_LOSS_PERC(opts->packet_loss));
+     if (ret != OPUS_OK)
+         av_log(avctx, AV_LOG_WARNING,
+@@ -452,6 +460,15 @@
+     int ret;
+     int discard_padding;
+ 
++    // Reload packet loss setting
++    ret = opus_multistream_encoder_ctl(opus->enc,
++                                       OPUS_SET_PACKET_LOSS_PERC(opus->opts.packet_loss));
++    if (ret != OPUS_OK)
++        av_log(avctx, AV_LOG_WARNING,
++               "Unable to set expected packet loss percentage: %s\n",
++               opus_strerror(ret));
++
++
+     if (frame) {
+         ret = ff_af_queue_add(&opus->afq, frame);
+         if (ret < 0)
+@@ -543,6 +560,7 @@
+         { "audio",          "Favor faithfulness to the input",         0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_AUDIO },               0, 0, FLAGS, "application" },
+         { "lowdelay",       "Restrict to only the lowest delay modes", 0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_RESTRICTED_LOWDELAY }, 0, 0, FLAGS, "application" },
+     { "frame_duration", "Duration of a frame in milliseconds", OFFSET(frame_duration), AV_OPT_TYPE_FLOAT, { .dbl = 20.0 }, 2.5, 120.0, FLAGS },
++    { "enable_fec",     "Enable forward error correction",     OFFSET(enable_fec),     AV_OPT_TYPE_BOOL,  { .i64 = 0 },    0,   1,     FLAGS },
+     { "packet_loss",    "Expected packet loss percentage",     OFFSET(packet_loss),    AV_OPT_TYPE_INT,   { .i64 = 0 },    0,   100,  FLAGS },
+     { "vbr",            "Variable bit rate mode",              OFFSET(vbr),            AV_OPT_TYPE_INT,   { .i64 = 1 },    0,   2,    FLAGS, "vbr" },
+         { "off",            "Use constant bit rate", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "vbr" },
diff --git a/gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch b/gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch
new file mode 100644
index 0000000000..5c4bd4d3eb
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch
@@ -0,0 +1,44 @@
+From dba13d03bc8e827fededc20b0ab1f574a1500f2a Mon Sep 17 00:00:00 2001
+From: Philip-Dylan Gleonec <philip-dylan.gleonec@savoirfairelinux.com>
+Date: Thu, 11 Feb 2021 12:25:14 +0100
+Subject: [PATCH 2/2] avcodec/libopusenc: reload packet loss at encode
+
+An estimation of packet loss is required by libopus to compute its FEC
+data. Currently, this estimation is constant, and can not be changed
+after configuration. This means an application using libopus through
+ffmpeg can not adapt the packet loss estimation when the network
+quality degrades.
+
+This patch makes the encoder reload the packet_loss AVOption before
+encoding samples, if fec is enabled. This way an application can modify
+the packet loss estimation by changing the AVOption. Typical use-case
+is a RTP stream, where packet loss can be estimated from RTCP packets.
+
+Signed-off-by: Philip-Dylan Gleonec <philip-dylan.gleonec@savoirfairelinux.com>
+---
+ libavcodec/libopusenc.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
+index 70d17f802b..c18e8ae7fa 100644
+--- a/libavcodec/libopusenc.c
++++ b/libavcodec/libopusenc.c
+@@ -460,6 +460,15 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket *avpkt,
+     int ret;
+     int discard_padding;
+ 
++    if (opus->opts.fec) {
++        ret = opus_multistream_encoder_ctl(opus->enc,
++                                           OPUS_SET_PACKET_LOSS_PERC(opus->opts.packet_loss));
++        if (ret != OPUS_OK)
++            av_log(avctx, AV_LOG_WARNING,
++                   "Unable to set expected packet loss percentage: %s\n",
++                   opus_strerror(ret));
++    }
++
+     if (frame) {
+         ret = ff_af_queue_add(&opus->afq, frame);
+         if (ret < 0)
+-- 
+2.25.1
+
diff --git a/gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch b/gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch
new file mode 100644
index 0000000000..595baea9c9
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-remove-mjpeg-log.patch
@@ -0,0 +1,26 @@
+From c557a6211f5a29d89fc2ab561e0fb3d8878fb6ad Mon Sep 17 00:00:00 2001
+From: philippegorley <gorley.philippe@gmail.com>
+Date: Mon, 17 Dec 2018 15:27:57 -0500
+Subject: [PATCH] remove mjpeg log
+
+---
+ libavcodec/mjpegdec.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
+index d1dca84d36..4a26c23cd4 100644
+--- a/libavcodec/mjpegdec.c
++++ b/libavcodec/mjpegdec.c
+@@ -2294,9 +2294,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+                    "restart marker: %d\n", start_code & 0x0f);
+             /* APP fields */
+         } else if (start_code >= APP0 && start_code <= APP15) {
+-            if ((ret = mjpeg_decode_app(s)) < 0)
+-                av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
+-                       av_err2str(ret));
++            ret = mjpeg_decode_app(s);
+             /* Comment */
+         } else if (start_code == COM) {
+             ret = mjpeg_decode_com(s);
+--
+2.17.1
diff --git a/gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch b/gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch
new file mode 100644
index 0000000000..cf52cf972a
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-rtp_ext_abs_send_time.patch
@@ -0,0 +1,71 @@
+diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
+index 63047beccc..d59ec3dc8c 100644
+--- a/libavformat/rtpenc.c
++++ b/libavformat/rtpenc.c
+@@ -28,6 +28,8 @@
+ 
+ #include "rtpenc.h"
+ 
++#define EXT_ABS_SEND_TIME
++
+ static const AVOption options[] = {
+     FF_RTP_FLAG_OPTS(RTPMuxContext, flags),
+     { "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM },
+@@ -146,7 +148,11 @@ static int rtp_write_header(AVFormatContext *s1)
+                                     s1->pb->max_packet_size);
+     } else
+         s1->packet_size = s1->pb->max_packet_size;
++#ifdef EXT_ABS_SEND_TIME
++    if (s1->packet_size <= 20) {
++#else
+     if (s1->packet_size <= 12) {
++#endif
+         av_log(s1, AV_LOG_ERROR, "Max packet size %u too low\n", s1->packet_size);
+         return AVERROR(EIO);
+     }
+@@ -154,7 +160,11 @@ static int rtp_write_header(AVFormatContext *s1)
+     if (!s->buf) {
+         return AVERROR(ENOMEM);
+     }
++#ifdef EXT_ABS_SEND_TIME
++    s->max_payload_size = s1->packet_size - 20;
++#else
+     s->max_payload_size = s1->packet_size - 12;
++#endif
+ 
+     if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
+         avpriv_set_pts_info(st, 32, 1, st->codecpar->sample_rate);
+@@ -332,16 +342,34 @@ static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time, int bye)
+ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
+ {
+     RTPMuxContext *s = s1->priv_data;
++    uint64_t ntp64_time;
++    uint32_t absoluteSendTime;
+ 
+     av_log(s1, AV_LOG_TRACE, "rtp_send_data size=%d\n", len);
+ 
+     /* build the RTP header */
++#ifdef EXT_ABS_SEND_TIME
++    avio_w8(s1->pb, RTP_VERSION << 6 | 0x10); // extention bit
++#else
+     avio_w8(s1->pb, RTP_VERSION << 6);
++#endif
+     avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
+     avio_wb16(s1->pb, s->seq);
+     avio_wb32(s1->pb, s->timestamp);
+     avio_wb32(s1->pb, s->ssrc);
+ 
++#ifdef EXT_ABS_SEND_TIME
++    avio_wb16(s1->pb, 0xBEDE);      // magic word
++    avio_wb16(s1->pb, 0x0001);      // length=1
++    avio_w8(s1->pb, 0x32);         // ID=3 and lenght=2
++    ntp64_time = ff_get_formatted_ntp_time(ff_ntp_time());
++    absoluteSendTime = (uint32_t)((ntp64_time>> 14) & 0x00ffffff);
++    av_log(s1, AV_LOG_TRACE, "ntp64:%lu, abs_time:%u\n", ntp64_time, absoluteSendTime);
++    avio_w8(s1->pb, (uint8_t)(absoluteSendTime >> 16));
++    avio_w8(s1->pb, (uint8_t)(absoluteSendTime >> 8 & 0xff));
++    avio_w8(s1->pb, (uint8_t)(absoluteSendTime & 0xff));
++#endif
++
+     avio_write(s1->pb, buf1, len);
+     avio_flush(s1->pb);
diff --git a/gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch b/gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch
new file mode 100644
index 0000000000..e54a346706
--- /dev/null
+++ b/gnu/packages/patches/ffmpeg-jami-screen-sharing-x11-fix.patch
@@ -0,0 +1,302 @@
+From c1b210534b15188c964b31dc47e172f8ed4aca55 Mon Sep 17 00:00:00 2001
+From: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
+Date: Tue, 19 Jul 2022 13:35:19 -0300
+Subject: [PATCH] Screen sharing x11 fixes
+
++ We can now have a single stream in the x11grab, which can be updated to follow window resizing
++ Due to stream reinit, shm may cause memory issues and was removed
++ Adds one option (is_area) that defines if we are grabing a region of the display/window or the hole screen/window.
+
+note: This is a custom patch for later rebase
+---
+ libavdevice/xcbgrab.c | 186 ++++++++++--------------------------------
+ 1 file changed, 45 insertions(+), 141 deletions(-)
+
+diff --git a/libavdevice/xcbgrab.c b/libavdevice/xcbgrab.c
+index 64a68ba497..76e654b424 100644
+--- a/libavdevice/xcbgrab.c
++++ b/libavdevice/xcbgrab.c
+@@ -29,11 +29,6 @@
+ #include <xcb/xfixes.h>
+ #endif
+ 
+-#if CONFIG_LIBXCB_SHM
+-#include <sys/shm.h>
+-#include <xcb/shm.h>
+-#endif
+-
+ #if CONFIG_LIBXCB_SHAPE
+ #include <xcb/shape.h>
+ #endif
+@@ -53,9 +48,6 @@ typedef struct XCBGrabContext {
+     xcb_connection_t *conn;
+     xcb_screen_t *screen;
+     xcb_window_t window;
+-#if CONFIG_LIBXCB_SHM
+-    AVBufferPool *shm_pool;
+-#endif
+     int64_t time_frame;
+     AVRational time_base;
+     int64_t frame_duration;
+@@ -72,10 +64,9 @@ typedef struct XCBGrabContext {
+     int region_border;
+     int centered;
+     int select_region;
++    int is_area;
+ 
+     const char *framerate;
+-
+-    int has_shm;
+ } XCBGrabContext;
+ 
+ #define FOLLOW_CENTER -1
+@@ -97,6 +88,7 @@ static const AVOption options[] = {
+     { "show_region", "Show the grabbing region.", OFFSET(show_region), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, D },
+     { "region_border", "Set the region border thickness.", OFFSET(region_border), AV_OPT_TYPE_INT, { .i64 = 3 }, 1, 128, D },
+     { "select_region", "Select the grabbing region graphically using the pointer.", OFFSET(select_region), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D },
++    { "is_area", "Define if we are grabing a region of the display/window.", OFFSET(is_area), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, D },
+     { NULL },
+ };
+ 
+@@ -216,99 +208,6 @@ static int64_t wait_frame(AVFormatContext *s, AVPacket *pkt)
+     return curtime;
+ }
+ 
+-#if CONFIG_LIBXCB_SHM
+-static int check_shm(xcb_connection_t *conn)
+-{
+-    xcb_shm_query_version_cookie_t cookie = xcb_shm_query_version(conn);
+-    xcb_shm_query_version_reply_t *reply;
+-
+-    reply = xcb_shm_query_version_reply(conn, cookie, NULL);
+-    if (reply) {
+-        free(reply);
+-        return 1;
+-    }
+-
+-    return 0;
+-}
+-
+-static void free_shm_buffer(void *opaque, uint8_t *data)
+-{
+-    shmdt(data);
+-}
+-
+-static AVBufferRef *allocate_shm_buffer(void *opaque, size_t size)
+-{
+-    xcb_connection_t *conn = opaque;
+-    xcb_shm_seg_t segment;
+-    AVBufferRef *ref;
+-    uint8_t *data;
+-    int id;
+-
+-    id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777);
+-    if (id == -1)
+-        return NULL;
+-
+-    segment = xcb_generate_id(conn);
+-    xcb_shm_attach(conn, segment, id, 0);
+-    data = shmat(id, NULL, 0);
+-    shmctl(id, IPC_RMID, 0);
+-    if ((intptr_t)data == -1 || !data)
+-        return NULL;
+-
+-    ref = av_buffer_create(data, size, free_shm_buffer, (void *)(ptrdiff_t)segment, 0);
+-    if (!ref)
+-        shmdt(data);
+-
+-    return ref;
+-}
+-
+-static int xcbgrab_frame_shm(AVFormatContext *s, AVPacket *pkt)
+-{
+-    XCBGrabContext *c = s->priv_data;
+-    xcb_shm_get_image_cookie_t iq;
+-    xcb_shm_get_image_reply_t *img;
+-    xcb_drawable_t drawable = c->window_id;
+-    xcb_generic_error_t *e = NULL;
+-    AVBufferRef *buf;
+-    xcb_shm_seg_t segment;
+-
+-    buf = av_buffer_pool_get(c->shm_pool);
+-    if (!buf) {
+-        av_log(s, AV_LOG_ERROR, "Could not get shared memory buffer.\n");
+-        return AVERROR(ENOMEM);
+-    }
+-    segment = (xcb_shm_seg_t)(uintptr_t)av_buffer_pool_buffer_get_opaque(buf);
+-
+-    iq = xcb_shm_get_image(c->conn, drawable,
+-                           c->x, c->y, c->width, c->height, ~0,
+-                           XCB_IMAGE_FORMAT_Z_PIXMAP, segment, 0);
+-    img = xcb_shm_get_image_reply(c->conn, iq, &e);
+-
+-    xcb_flush(c->conn);
+-
+-    if (e) {
+-        av_log(s, AV_LOG_ERROR,
+-               "Cannot get the image data "
+-               "event_error: response_type:%u error_code:%u "
+-               "sequence:%u resource_id:%u minor_code:%u major_code:%u.\n",
+-               e->response_type, e->error_code,
+-               e->sequence, e->resource_id, e->minor_code, e->major_code);
+-
+-        free(e);
+-        av_buffer_unref(&buf);
+-        return AVERROR(EACCES);
+-    }
+-
+-    free(img);
+-
+-    pkt->buf = buf;
+-    pkt->data = buf->data;
+-    pkt->size = c->frame_size;
+-
+-    return 0;
+-}
+-#endif /* CONFIG_LIBXCB_SHM */
+-
+ #if CONFIG_LIBXCB_XFIXES
+ static int check_xfixes(xcb_connection_t *conn)
+ {
+@@ -462,14 +361,7 @@ static int xcbgrab_read_packet(AVFormatContext *s, AVPacket *pkt)
+     if (c->show_region)
+         xcbgrab_update_region(s, win_x, win_y);
+ 
+-#if CONFIG_LIBXCB_SHM
+-    if (c->has_shm && xcbgrab_frame_shm(s, pkt) < 0) {
+-        av_log(s, AV_LOG_WARNING, "Continuing without shared memory.\n");
+-        c->has_shm = 0;
+-    }
+-#endif
+-    if (!c->has_shm)
+-        ret = xcbgrab_frame(s, pkt);
++    ret = xcbgrab_frame(s, pkt);
+     pkt->dts = pkt->pts = pts;
+     pkt->duration = c->frame_duration;
+ 
+@@ -488,11 +380,8 @@ static av_cold int xcbgrab_read_close(AVFormatContext *s)
+ {
+     XCBGrabContext *ctx = s->priv_data;
+ 
+-#if CONFIG_LIBXCB_SHM
+-    av_buffer_pool_uninit(&ctx->shm_pool);
+-#endif
+-
+     xcb_disconnect(ctx->conn);
++    ctx->conn = NULL;
+ 
+     return 0;
+ }
+@@ -572,7 +461,15 @@ static int pixfmt_from_pixmap_format(AVFormatContext *s, int depth,
+ static int create_stream(AVFormatContext *s)
+ {
+     XCBGrabContext *c = s->priv_data;
+-    AVStream *st      = avformat_new_stream(s, NULL);
++
++    // If we try to open another stream to x11grab, there is no reason
++    // to keep more than one stream in the context.
++    AVStream *st;
++    if (!s->nb_streams) {
++        st = avformat_new_stream(s, NULL);
++    } else {
++        st = s->streams[0];
++    }
+     xcb_get_geometry_cookie_t gc;
+     xcb_get_geometry_reply_t *geo;
+     int64_t frame_size_bits;
+@@ -594,11 +491,26 @@ static int create_stream(AVFormatContext *s)
+         return AVERROR_EXTERNAL;
+     }
+ 
++    // av_log(s, AV_LOG_ERROR, "Capture is_area %d\n", c->is_area);
++    // Width and Height are not 0 only when we set a window area to share
++    // This if may be valid only in  the first call to create_stream
+     if (!c->width || !c->height) {
++        // av_log(s, AV_LOG_ERROR, "Capture area!\n");
++        c->is_area = 0;
++        c->width = geo->width;
++        c->height = geo->height;
++    }
++    // If not a predefined area, then we should follow geometry changes
++    // This can be valid only on the second call onwards
++    if (!c->is_area && (c->width != geo->width || c->height != geo->height)) {
+         c->width = geo->width;
+         c->height = geo->height;
+     }
+ 
++    // av_log(s, AV_LOG_ERROR, "Capture area %dx%d at position %d.%d\n",
++    //            c->width, c->height,
++    //            c->x, c->y);
++
+     if (c->x + c->width > geo->width ||
+         c->y + c->height > geo->height) {
+         av_log(s, AV_LOG_ERROR,
+@@ -628,13 +540,6 @@ static int create_stream(AVFormatContext *s)
+     }
+     c->frame_size = frame_size_bits / 8;
+ 
+-#if CONFIG_LIBXCB_SHM
+-    c->shm_pool = av_buffer_pool_init2(c->frame_size + AV_INPUT_BUFFER_PADDING_SIZE,
+-                                           c->conn, allocate_shm_buffer, NULL);
+-    if (!c->shm_pool)
+-        return AVERROR(ENOMEM);
+-#endif
+-
+     st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+     st->codecpar->codec_id   = AV_CODEC_ID_RAWVIDEO;
+     st->codecpar->width      = c->width;
+@@ -829,23 +734,26 @@ static av_cold int xcbgrab_read_header(AVFormatContext *s)
+         sscanf(s->url, "+%d,%d", &c->x, &c->y);
+     }
+ 
+-    c->conn = xcb_connect(display_name[0] ? display_name : NULL, &screen_num);
+-    av_freep(&display_name);
++    if (!c->conn || !c->screen) {
++        xcbgrab_read_close(s);
++        c->conn = xcb_connect(display_name[0] ? display_name : NULL, &screen_num);
++        av_freep(&display_name);
+ 
+-    if ((ret = xcb_connection_has_error(c->conn))) {
+-        av_log(s, AV_LOG_ERROR, "Cannot open display %s, error %d.\n",
+-               s->url[0] ? s->url : "default", ret);
+-        return AVERROR(EIO);
+-    }
++        if ((ret = xcb_connection_has_error(c->conn))) {
++            av_log(s, AV_LOG_ERROR, "Cannot open display %s, error %d.\n",
++                s->url[0] ? s->url : "default", ret);
++            return AVERROR(EIO);
++        }
+ 
+-    setup = xcb_get_setup(c->conn);
++       setup = xcb_get_setup(c->conn);
+ 
+-    c->screen = get_screen(setup, screen_num);
+-    if (!c->screen) {
+-        av_log(s, AV_LOG_ERROR, "The screen %d does not exist.\n",
+-               screen_num);
+-        xcbgrab_read_close(s);
+-        return AVERROR(EIO);
++        c->screen = get_screen(setup, screen_num);
++        if (!c->screen) {
++            av_log(s, AV_LOG_ERROR, "The screen %d does not exist.\n",
++                screen_num);
++            xcbgrab_read_close(s);
++            return AVERROR(EIO);
++        }
+     }
+ 
+     if (c->window_id == XCB_NONE)
+@@ -876,10 +784,6 @@ static av_cold int xcbgrab_read_header(AVFormatContext *s)
+         return ret;
+     }
+ 
+-#if CONFIG_LIBXCB_SHM
+-    c->has_shm = check_shm(c->conn);
+-#endif
+-
+ #if CONFIG_LIBXCB_XFIXES
+     if (c->draw_mouse) {
+         if (!(c->draw_mouse = check_xfixes(c->conn))) {
+-- 
+2.34.1
+
diff --git a/gnu/packages/patches/guile-fibers-libevent-timeout.patch b/gnu/packages/patches/guile-fibers-libevent-timeout.patch
new file mode 100644
index 0000000000..c33678eea3
--- /dev/null
+++ b/gnu/packages/patches/guile-fibers-libevent-timeout.patch
@@ -0,0 +1,61 @@
+commit 2ca397bfcca94c106380368b5b0ce920b0a62a95
+Author: Ludovic Courtès <ludo@gnu.org>
+Date:   Sat Jan 6 16:22:45 2024 +0100
+
+    libevent: Fix computation of the timeout value.
+    
+diff --git a/extensions/libevent.c b/extensions/libevent.c
+index 134460a..62e50a3 100644
+--- a/extensions/libevent.c
++++ b/extensions/libevent.c
+@@ -192,30 +192,27 @@ scm_primitive_resize (SCM lst, SCM eventsv)
+ }
+ #undef FUNC_NAME
+ 
+-static uint64_t time_units_per_microsec;
++static uint64_t time_units_per_microsec, microsec_per_time_units;
+ 
+ static void*
+ run_event_loop (void *p)
+ #define FUNC_NAME "primitive-event-loop"
+ {
+-  int ret = 0;
+-  int microsec = 0;
+-  struct timeval tv;
+-
++  int ret;
+   struct loop_data *data = p;
+ 
+-  if (data->timeout < 0)
+-    microsec = -1;
+-  else if (data->timeout >= 0)
++  if (data->timeout >= 0)
+     {
+-      microsec = (time_units_per_microsec == 0)
+-	? 0 : data->timeout / time_units_per_microsec;
+-      tv.tv_sec = 0;
+-      tv.tv_usec = microsec;
+-    }
++      struct timeval tv;
++
++      tv.tv_sec = data->timeout / scm_c_time_units_per_second;
++      tv.tv_usec =
++	time_units_per_microsec > 0
++	? ((data->timeout % scm_c_time_units_per_second)
++	   / time_units_per_microsec)
++	: ((data->timeout % scm_c_time_units_per_second)
++	   * microsec_per_time_units);
+ 
+-  if (microsec >= 0)
+-    {
+       ret = event_base_loopexit (data->base, &tv);
+       if (ret == -1)
+         SCM_MISC_ERROR ("event loop exit failed", SCM_EOL);
+@@ -307,6 +304,7 @@ void
+ init_fibers_libevt (void)
+ {
+   time_units_per_microsec = scm_c_time_units_per_second / 1000000;
++  microsec_per_time_units = 1000000 / scm_c_time_units_per_second;
+ 
+   scm_c_define_gsubr ("primitive-event-wake", 1, 0, 0,
+                       scm_primitive_event_wake);
diff --git a/gnu/packages/patches/jami-disable-integration-tests.patch b/gnu/packages/patches/jami-disable-integration-tests.patch
index 1efb7d552e..18f13800ac 100644
--- a/gnu/packages/patches/jami-disable-integration-tests.patch
+++ b/gnu/packages/patches/jami-disable-integration-tests.patch
@@ -1,3 +1,5 @@
+This issue is tracked at https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/824.
+
 From 3fd7acc6e5a8c316c366827956d7c06affdc9685 Mon Sep 17 00:00:00 2001
 From: Olivier Dion <olivier.dion@savoirfairelinux.com>
 Date: Fri, 7 Oct 2022 15:20:37 -0400
@@ -17,8 +19,8 @@ With file names adjusted for the source tarball.
 
 diff --git a/configure.ac b/configure.ac
 index 27215d044..aaeef1c1b 100644
---- a/daemon/configure.ac
-+++ b/daemon/configure.ac
+--- a/configure.ac
++++ b/configure.ac
 @@ -40,6 +40,11 @@ AS_IF([test "x$enable_debug" = "xyes"],
    [DAEMONCFLAGS+=" -DNDEBUG=1 -O3"
     DAEMONCXXFLAGS+=" -DNDEBUG=1 -O3 -Wno-deprecated"])
@@ -33,8 +35,8 @@ index 27215d044..aaeef1c1b 100644
      [Build fuzzing tools]))
 diff --git a/test/unitTest/Makefile.am b/test/unitTest/Makefile.am
 index f2b0fd994..ab232ddb7 100644
---- a/daemon/test/unitTest/Makefile.am
-+++ b/daemon/test/unitTest/Makefile.am
+--- a/test/unitTest/Makefile.am
++++ b/test/unitTest/Makefile.am
 @@ -13,30 +13,6 @@ check_PROGRAMS =
  
  ####### Unit Test ########
diff --git a/gnu/packages/patches/jami-libjami-headers-search.patch b/gnu/packages/patches/jami-libjami-headers-search.patch
index 92cc92a4a6..3e7e19d703 100644
--- a/gnu/packages/patches/jami-libjami-headers-search.patch
+++ b/gnu/packages/patches/jami-libjami-headers-search.patch
@@ -1,4 +1,7 @@
-Upstream status: https://review.jami.net/c/jami-client-qt/+/24273.
+It was applied, then reverted (by mistake?) in 4d2c55348bc014.
+
+It's been resubmitted here:
+https://lists.gnu.org/archive/html/jami/2024-01/msg00005.html
 
 diff --git a/CMakeLists.txt b/CMakeLists.txt
 index 8d71b84b..36729698 100644
diff --git a/gnu/packages/patches/jami-qml-tests-discovery.patch b/gnu/packages/patches/jami-qml-tests-discovery.patch
new file mode 100644
index 0000000000..11fd69571c
--- /dev/null
+++ b/gnu/packages/patches/jami-qml-tests-discovery.patch
@@ -0,0 +1,15 @@
+Upstream status: https://review.jami.net/c/jami-client-qt/+/25640
+
+diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
+index d50908cf..587c9d15 100644
+--- a/tests/CMakeLists.txt
++++ b/tests/CMakeLists.txt
+@@ -73,6 +73,8 @@ endif()
+ 
+ string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
+ 
++set(QUICK_TEST_SOURCE_DIR "${CMAKE_SOURCE_DIR}tests/qml/src")
++
+ set(QML_TESTS_SOURCE_FILES
+     ${CMAKE_SOURCE_DIR}/tests/qml/main.cpp
+     ${TEST_QML_RESOURCES}
diff --git a/gnu/packages/patches/jami-skip-tests-requiring-internet.patch b/gnu/packages/patches/jami-skip-tests-requiring-internet.patch
new file mode 100644
index 0000000000..1abc0e80cb
--- /dev/null
+++ b/gnu/packages/patches/jami-skip-tests-requiring-internet.patch
@@ -0,0 +1,51 @@
+Forwarded upstream: https://lists.gnu.org/archive/html/jami/2024-01/msg00010.html
+
+From 1d3b044c85c32341cca392254fe8bbf34a4639e1 Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
+Date: Tue, 9 Jan 2024 11:14:04 -0500
+Subject: [PATCH] tests: Skip tests that need Internet when there's none.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* tests/unittests/messageparser_unittest.cpp (ALinkIsParsedCorrectly)
+(YoutubeLinkIsParsedCorrectly): Skip when there is no Internet.
+
+Series-to: jami@gnu.org
+Series-cc: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
+Fixes: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1507>
+Change-Id: I0a5b57cd82f93fd7edf3fbeb73fb3db5a04c628c
+---
+ tests/unittests/messageparser_unittest.cpp | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/tests/unittests/messageparser_unittest.cpp b/tests/unittests/messageparser_unittest.cpp
+index c10b0d0b..df7a0692 100644
+--- a/tests/unittests/messageparser_unittest.cpp
++++ b/tests/unittests/messageparser_unittest.cpp
+@@ -69,6 +69,9 @@ TEST_F(MessageParserFixture, TextIsParsedCorrectly)
+  */
+ TEST_F(MessageParserFixture, ALinkIsParsedCorrectly)
+ {
++    if (!globalEnv.connectivityMonitor->isOnline())
++        GTEST_SKIP() << "ALinkIsParsedCorrectly requires Internet connectivity";
++
+     auto linkColor = QColor::fromRgb(0, 0, 255);
+     auto backgroundColor = QColor::fromRgb(0, 0, 255);
+ 
+@@ -174,6 +177,9 @@ TEST_F(MessageParserFixture, FencedCodeIsParsedCorrectly)
+  */
+ TEST_F(MessageParserFixture, YoutubeLinkIsParsedCorrectly)
+ {
++    if (!globalEnv.connectivityMonitor->isOnline())
++        GTEST_SKIP() << "YoutubeLinkIsParsedCorrectly requires Internet connectivity";
++
+     auto url = "https://www.youtube.com/watch?v=1234567890";
+     auto msg = "blah blah " + QString(url) + " blah blah";
+ 
+
+base-commit: a4300308dc8d03d59f620bb5fed753df5cf31ed9
+prerequisite-patch-id: 90a419e7de1f4fa5bb68bc58ad0da2817ed268e0
+-- 
+2.41.0
+
diff --git a/gnu/packages/patches/jami-unbundle-dependencies.patch b/gnu/packages/patches/jami-unbundle-dependencies.patch
new file mode 100644
index 0000000000..dab82b26cb
--- /dev/null
+++ b/gnu/packages/patches/jami-unbundle-dependencies.patch
@@ -0,0 +1,71 @@
+Forwarded here: https://lists.gnu.org/archive/html/jami/2024-01/msg00007.html
+
+From a302dc0a0faf2778331745a1d01bc3071e182d4d Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
+Date: Mon, 8 Jan 2024 16:07:05 -0500
+Subject: [PATCH] build: Allow using system-provided md4c and tidy libraries.
+
+* CMakeLists.txt <md4c, tidy>: Search for libraries in the system
+first, falling back to bundled copies in case they aren't found.
+
+Series-to: jami@gnu.org
+Fixes: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1506>
+Change-Id: I637959fefce6a21b0ee73a793acb6c3c42dcdce0
+---
+ CMakeLists.txt | 36 +++++++++++++++++++++++++-----------
+ 1 file changed, 25 insertions(+), 11 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 38e7a4e2..3f1bd599 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -545,19 +545,33 @@ add_subdirectory(3rdparty/SortFilterProxyModel)
+ set(SFPM_OBJECTS $<TARGET_OBJECTS:SortFilterProxyModel>)
+ 
+ # md4c
+-set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
+-add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
+-list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
+-list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
+-list(APPEND CLIENT_LIBS md4c-html)
++find_package(md4c)
++if(md4c_FOUND)
++  message(STATUS "Using system-provided md4c-html")
++  list(APPEND CLIENT_LIBS md4c::md4c-html)
++else()
++  message("Using bundled md4c-html library")
++  set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
++  add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
++  list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
++  list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
++  list(APPEND CLIENT_LIBS md4c-html)
++endif()
+ 
+ # tidy-html5
+-set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
+-set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
+-add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
+-list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
+-list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
+-list(APPEND CLIENT_LIBS tidy-static)
++pkg_check_modules(tidy IMPORTED_TARGET tidy)
++if(tidy_FOUND)
++  message(STATUS "Using system-provided tidy")
++  list(APPEND CLIENT_LIBS PkgConfig::tidy)
++else()
++  message("Using bundled tidy library")
++  set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
++  set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
++  add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
++  list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
++  list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
++  list(APPEND CLIENT_LIBS tidy-static)
++endif()
+ 
+ # common executable sources
+ qt_add_executable(
+
+base-commit: a4300308dc8d03d59f620bb5fed753df5cf31ed9
+-- 
+2.41.0
+
diff --git a/gnu/packages/patches/libjami-ac-config-files.patch b/gnu/packages/patches/libjami-ac-config-files.patch
new file mode 100644
index 0000000000..8508d55ee1
--- /dev/null
+++ b/gnu/packages/patches/libjami-ac-config-files.patch
@@ -0,0 +1,52 @@
+Forwarded here: https://lists.gnu.org/archive/html/jami/2024-01/msg00003.html
+
+From 20a1702d881b381979d31c456f1b8cf5e0f728ad Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
+Date: Sun, 7 Jan 2024 16:40:41 -0500
+Subject: [PATCH] configure.ac: Expand AC_CONFIG_FILES to fix a race.
+
+The commands apparently run for each file listed, or something
+similar, leading to:
+
+  configure: creating ./config.status
+  config.status: creating test/agent/Makefile
+  chmod: cannot access 'test/agent/pre-inst-env': No such file or directory
+  chmod: cannot access 'test/agent/scenarios/bulk-calls/run-scenario': No such file or directory
+  config.status: creating test/agent/pre-inst-env
+  chmod: cannot access 'test/agent/scenarios/bulk-calls/run-scenario': No such file or directory
+
+* configure.ac [ENABLE_AGENT]: Separate AC_CONFIG_FILES uses per file.
+
+Series-to: jami@gnu.org
+Series-postfix: daemon
+Change-Id: Ib283955b73540248e09bf31ef44ef3d178b216fa
+---
+ configure.ac | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index cdea5ff1c..2ab96d817 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -61,11 +61,11 @@ AC_ARG_ENABLE([agent],
+     [Build agent]))
+ AM_CONDITIONAL([ENABLE_AGENT], [test "x$enable_agent" = "xyes"])
+ AM_COND_IF([ENABLE_AGENT],
+-           [AC_CONFIG_FILES([test/agent/Makefile
+-                             test/agent/pre-inst-env:test/agent/build-aux/pre-inst-env.in
+-                             test/agent/scenarios/bulk-calls/run-scenario],
+-                            [chmod +x test/agent/pre-inst-env
+-                             chmod +x test/agent/scenarios/bulk-calls/run-scenario])])
++  [AC_CONFIG_FILES([test/agent/Makefile])
++   AC_CONFIG_FILES([test/agent/pre-inst-env:test/agent/build-aux/pre-inst-env.in],
++                   [chmod +x test/agent/pre-inst-env])
++   AC_CONFIG_FILES([test/agent/scenarios/bulk-calls/run-scenario],
++                   [chmod +x test/agent/scenarios/bulk-calls/run-scenario])])
+ 
+ AC_ARG_ENABLE([tracepoints], AS_HELP_STRING([--enable-tracepoints], [Enable tracepoints]))
+ 
+
+base-commit: e246fb2e090c9b3de55e2d455eee5a6f05a5b286
+-- 
+2.41.0
+
diff --git a/gnu/packages/patches/python-pyreadstat-link-libiconv.patch b/gnu/packages/patches/python-pyreadstat-link-libiconv.patch
new file mode 100644
index 0000000000..7efd71faeb
--- /dev/null
+++ b/gnu/packages/patches/python-pyreadstat-link-libiconv.patch
@@ -0,0 +1,15 @@
+To ensure libiconv can be found by Guix, we need to link the library.
+
+--- a/setup.py
++++ b/setup.py
+@@ -81,8 +81,7 @@ else:
+     libraries.extend(["m", "z"])
+     _platform = sys.platform
+     # Mac: iconv needs to be linked statically
+-    if _platform.lower().startswith("darwin"):
+-        libraries.append("iconv")
++    libraries.append("iconv")
+ 
+ # Extensions
+ sources.sort()
+
diff --git a/gnu/packages/patches/python-uqbar-python3.10.patch b/gnu/packages/patches/python-uqbar-python3.10.patch
new file mode 100644
index 0000000000..164f0c0c64
--- /dev/null
+++ b/gnu/packages/patches/python-uqbar-python3.10.patch
@@ -0,0 +1,23 @@
+Since Python 3.10 the output of a CLI program created with argparse
+uses "options" instead of "optional arguments". This behaviour breaks
+the tests in python-uqbar.
+
+--- a/tests/test_cli.py
++++ b/tests/test_cli.py
+@@ -84,7 +84,7 @@ def test_call_help():
+ 
+         speak like a cat
+ 
+-        optional arguments:
++        options:
+           -h, --help  show this help message and exit
+           --version   show program's version number and exit
+           --loud      be adamant
+@@ -101,6 +101,6 @@ def test_help():
+         """
+         usage: vox-aggregator [-h] [--version] {help,list,birds,mammals} ...
+ 
+-        optional arguments:
++        options:
+           -h, --help            show this help message and exit
+           --version             show program's version number and exit
diff --git a/gnu/packages/plan9.scm b/gnu/packages/plan9.scm
index f78c26e215..b2d8d75471 100644
--- a/gnu/packages/plan9.scm
+++ b/gnu/packages/plan9.scm
@@ -73,8 +73,8 @@ reconstruct a Plan 9 terminal-like experience from a non-Plan 9 system.")
 
 (define-public plan9port
   ;; no releases
-  (let ((commit "cc4571fec67407652b03d6603ada6580de2194dc")
-        (revision "0"))
+  (let ((commit "f8681acb374fa0d5ed1568dbedb00a4abe1ca6f1")
+        (revision "1"))
     (package
       (name "plan9port")
       (version (git-version "0.1.0" revision commit))
@@ -86,7 +86,7 @@ reconstruct a Plan 9 terminal-like experience from a non-Plan 9 system.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "1g2kzlghcghs560na6xalfsjq5zwp015wv9wk8wxn26981zs759x"))
+                  "01343jvn8kr63i78h8xlgscn6wihdsr44xzh1cylvhigjbqw8n2x"))
                 (modules '((guix build utils)))
                 (snippet #~(for-each delete-file-recursively
                                      '("font/luc" ;nonfree
@@ -94,73 +94,69 @@ reconstruct a Plan 9 terminal-like experience from a non-Plan 9 system.")
       (build-system gnu-build-system)
       (arguments
        (list #:tests? #f ;no tests
-             #:phases #~(modify-phases %standard-phases
-                          (add-after 'unpack 'setup
-                            (lambda _
-                              (delete-file "src/cmd/mk/mk.pdf")
-                              (substitute* "src/cmd/acme/acme.c"
-                                (("/lib/font/bit/lucsans/euro.8.font")
-                                 (string-append #$output
-                                  "/font/fixed/unicode.5x8.font"))
-                                (("/lib/font/bit/lucm/unicode.9.font")
-                                 (string-append #$output
-                                  "/font/fixed/unicode.6x9.font")))
-                              (substitute* (find-files "src")
-                                (("/lib/font/bit")
-                                 (string-append #$output "/font")))
-                              (substitute* "bin/9c"
-                                (("which")
-                                 (which "which")))
-                              (substitute* "src/cmd/fontsrv/freetyperules.sh"
-                                (("'\\$i'/freetype2")
-                                 (string-append "-I"
-                                                #$freetype
-                                                "/include/freetype2")))
-                              (with-output-to-file "LOCAL.config"
-                                (lambda _
-                                  (format #t "CC9=~a~%" #$(cc-for-target))
-                                  (format #t "FONTSRV=fontsrv~%")))
-                              (setenv "X11"
-                                      #$libx11)
-                              (setenv "PLAN9"
-                                      (getcwd))
-                              (setenv "PLAN9_TARGET"
-                                      #$output)))
-                          (delete 'configure) ;no configure
-                          (replace 'build
-                            (lambda _
-                              (invoke "./INSTALL" "-b")))
-                          (replace 'install
-                            (lambda _
-                              (for-each (lambda (x)
-                                          (let ((out (string-append #$output
-                                                                    "/" x)))
-                                            (mkdir-p out)
-                                            (copy-recursively x out)))
-                                        ;; TODO: use external sky and dict packages
-                                        '("bin" "face"
-                                          "font"
-                                          "include"
-                                          "lib"
-                                          "lp"
-                                          "mail"
-                                          "man"
-                                          "ndb"
-                                          "plumb"
-                                          "tmac"
-                                          "troff"
-                                          "postscript"))
-                              (install-file "rcmain" #$output)))
-                          (add-after 'install 'wrap-executables
-                            (lambda _
-                              (for-each (lambda (exe)
-                                          (wrap-program exe
-                                            `("PLAN9" ":" prefix
-                                              (,#$output))))
-                                        (find-files
-                                         (string-append #$output "/bin")))))
-                          ;; Plan9 doesn't compress man pages
-                          (delete 'compress-documentation))))
+             #:strip-directories #~'("plan9/bin")
+             #:phases
+             #~(modify-phases %standard-phases
+                 (add-after 'unpack 'setup
+                   (lambda _
+                     (let ((dest (string-append #$output "/plan9")))
+                       (delete-file "src/cmd/mk/mk.pdf")
+                       (substitute* "src/cmd/acme/acme.c"
+                         (("/lib/font/bit/lucsans/euro.8.font")
+                          (string-append dest
+                                         "/font/fixed/unicode.5x8.font"))
+                         (("/lib/font/bit/lucm/unicode.9.font")
+                          (string-append dest
+                                         "/font/fixed/unicode.6x9.font")))
+                       (substitute* (find-files "src")
+                         (("/lib/font/bit")
+                          (string-append dest "/font")))
+                       (substitute* "bin/9c"
+                         (("which")
+                          (which "which")))
+                       (substitute* "src/cmd/fontsrv/freetyperules.sh"
+                         (("'\\$i'/freetype2")
+                          (string-append "-I"
+                                         #$freetype
+                                         "/include/freetype2")))
+                       (with-output-to-file "LOCAL.config"
+                         (lambda _
+                           (format #t "CC9=~a~%" #$(cc-for-target))
+                           (format #t "FONTSRV=fontsrv~%")))
+                       (setenv "X11" #$libx11)
+                       (setenv "PLAN9" (getcwd))
+                       (setenv "PLAN9_TARGET" dest))))
+                 (delete 'configure)    ;no configure
+                 (replace 'build
+                   (lambda _
+                     (invoke "./INSTALL" "-b")))
+                 (replace 'install
+                   (lambda _
+                     (invoke "./INSTALL" "-c")
+                     (let ((dest (getenv "PLAN9_TARGET")))
+                       (for-each (lambda (x)
+                                   (let ((out (string-append dest "/" x)))
+                                     (mkdir-p out)
+                                     (copy-recursively x out)))
+                                 ;; TODO: use external sky and dict packages
+                                 '("bin" "face"
+                                   "font"
+                                   "include"
+                                   "lib"
+                                   "lp"
+                                   "mail"
+                                   "man"
+                                   "ndb"
+                                   "plumb"
+                                   "tmac"
+                                   "troff"
+                                   "postscript"))
+                       (install-file "rcmain" dest)
+                       (mkdir-p (string-append #$output "/bin"))
+                       (symlink (string-append dest "/bin/9")
+                                (string-append #$output "/bin/9")))))
+                 ;; Plan9 doesn't compress man pages
+                 (delete 'compress-documentation))))
       (native-inputs (list perl which))
       (inputs (list bash-minimal                  ;for 'wrap-program'
                     fontconfig libx11 libxext libxt))
diff --git a/gnu/packages/potassco.scm b/gnu/packages/potassco.scm
index 884da3c99f..e69bfda9d6 100644
--- a/gnu/packages/potassco.scm
+++ b/gnu/packages/potassco.scm
@@ -209,7 +209,7 @@ satisfiability checking (SAT).")
                                 "unpool-ast-v2" "parse_term"
                                 "propagator" "propgator-sequence-mining"
                                 "symbol" "visitor"))))))))))
-    (inputs (list catch2-3.3 clasp libpotassco))
+    (inputs (list catch2-3 clasp libpotassco))
     (native-inputs (list mpark-variant
                          pkg-config
                          tl-optional
diff --git a/gnu/packages/python-compression.scm b/gnu/packages/python-compression.scm
index bc96bc05d3..6f249dd3af 100644
--- a/gnu/packages/python-compression.scm
+++ b/gnu/packages/python-compression.scm
@@ -7,6 +7,7 @@
 ;;; Copyright © 2020 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2020, 2022, 2023 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -416,6 +417,39 @@ the LZ4 frame format.")
     (description "Lz-string is a string compressor library for Python.")
     (license license:expat)))
 
+(define-public python-python-snappy
+  (package
+    ;; PyPI contains both `snappy' and `python-snappy' as completely distinct
+    ;; packages. To avoid a name collision in Guix, we use the variable name
+    ;; `python-python-snappy' for the package called `python-snappy' on PyPI.
+    (name "python-python-snappy")
+    (version "0.6.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-snappy" version))
+       (sha256
+        (base32 "0amv12w0ybn6n1lk36x70a3l8bdjv4mn7iflb59wqsi00smhg8dn"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (when tests?
+                        (invoke "pytest" "-vv" "-k"
+                                ;; CFFI is only supported for PyPy builds.
+                                (string-append "not test_snappy_cffi_enum "
+                                               "and not test_snappy_all_cffi"))))))))
+    (inputs (list snappy))
+    (native-inputs (list python-pytest))
+    (home-page "https://github.com/andrix/python-snappy")
+    (synopsis "Python bindings for the Snappy compression library")
+    (description
+     "@code{python-python-snappy} provides bindings to the Snappy library and
+can be used to compress and decompress files and streams.  It can also be used
+directly from the command line.")
+    (license license:bsd-3)))
+
 (define-public bitshuffle
   (package
     (name "bitshuffle")
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index 06b578dac7..88d07ffbc7 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -60,6 +60,7 @@
 ;;; Copyright © 2022 Baptiste Strazzulla <bstrazzull@hotmail.fr>
 ;;; Copyright © 2023 John Kehayias <john.kehayias@protonmail.com>
 ;;; Copyright © 2023 Ivan Vilata-i-Balaguer <ivan@selidor.net>
+;;; Copyright © 2024 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -201,6 +202,38 @@ scripting Launchpad via its the web service API.")
 reusable library for parsing, manipulating, and generating URIs.")
     (license license:lgpl3)))
 
+(define-public python-portend
+  (package
+    (name "python-portend")
+    (version "3.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "portend" version))
+       (sha256
+        (base32 "0wpvixicc3d0lack65554mvdrrckkn18p1xcgiv9v5cwq59a6l2j"))))
+    (build-system pyproject-build-system)
+    ;; Do not test pyproject.toml with python-pytest-checkdocs as it tries to
+    ;; download dependencies.
+    (arguments
+     '(#:test-flags '("-k" "not project")))
+    (propagated-inputs (list python-tempora))
+    ;; TODO: Add python-pytest-ruff to native-inputs once it has been packaged.
+    (native-inputs (list python-pytest
+                         python-pytest-black
+                         python-pytest-checkdocs
+                         python-pytest-cov
+                         python-pytest-enabler
+                         python-pytest-mypy))
+    (home-page "https://github.com/jaraco/portend")
+    (synopsis "Monitor TCP ports for bound or unbound states")
+    (description
+     "@code{python-portend} can be used to monitor TCP ports for bound or
+unbound states.  For example, waiting for a port to be occupied or freed
+within a set timeout.  @code{python-portend} can also be used directly from
+the command line.")
+    (license license:expat)))
+
 (define-public python-prawcore
   (package
     (name "python-prawcore")
@@ -2595,6 +2628,32 @@ your Web app.")
 object to help create WSGI responses.")
     (license license:expat)))
 
+(define-public python-zc-lockfile
+  (package
+    (name "python-zc-lockfile")
+    (version "3.0.post1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "zc.lockfile" version))
+       (sha256
+        (base32 "1v41irj7azaag3f14xyviv3l8mvap74v5p3q274k68vakrnyxcmd"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (if tests?
+                          (invoke "zope-testrunner" "--test-path=src")
+                          (format #t "test suite not run~%")))))))
+    (native-inputs (list python-zope-testing python-zope-testrunner))
+    (home-page "https://github.com/zopefoundation/zc.lockfile")
+    (synopsis "Interprocess locks using lock files")
+    (description
+     "This package provides an implementation of interprocess locks using lock
+files.  These locks can also be used to mediate access to other files.")
+    (license license:zpl2.1)))
+
 (define-public python-zope-event
   (package
     (name "python-zope-event")
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 2afce6c667..46a5e81cb4 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -145,7 +145,7 @@
 ;;; Copyright © c4droid <c4droid@foxmail.com>
 ;;; Copyright © 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2023 Attila Lendvai <attila@lendvai.name>
-;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
+;;; Copyright © 2023, 2024 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2250,25 +2250,21 @@ library.")
     (version "3.8.0")
     (source
      (origin
-      (method url-fetch)
-      (uri (pypi-uri "h5py" version))
-      (sha256
-       (base32
-        "0pyr6z4h2xqbp49yx2i1401gl6yqh03h771zslwcy0201hpxiskg"))))
+       (method url-fetch)
+       (uri (pypi-uri "h5py" version))
+       (sha256
+        (base32 "0pyr6z4h2xqbp49yx2i1401gl6yqh03h771zslwcy0201hpxiskg"))))
     (build-system python-build-system)
     (arguments
-     `(#:tests? #f ; no test target
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-hdf5-paths
-          (lambda* (#:key inputs #:allow-other-keys)
-            (setenv "HDF5_DIR" (assoc-ref inputs "hdf5")))))))
-    (propagated-inputs
-     (list python-six python-numpy))
-    (inputs
-     (list hdf5-1.10))
-    (native-inputs
-     (list python-cython python-pkgconfig pkg-config))
+     '(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'fix-hdf5-paths
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (setenv "HDF5_DIR"
+                              (assoc-ref inputs "hdf5")))))))
+    (propagated-inputs (list python-six python-numpy))
+    (inputs (list hdf5-1.10))
+    (native-inputs (list pkg-config python-cython python-ipython
+                         python-pkgconfig python-pytest))
     (home-page "https://www.h5py.org/")
     (synopsis "Read and write HDF5 files from Python")
     (description
@@ -2279,6 +2275,30 @@ access to HDF5 files, datasets and groups using established Python and NumPy
 concepts.")
     (license license:bsd-3)))
 
+(define-public python-hdf5storage
+  (package
+    (name "python-hdf5storage")
+    (version "0.1.19")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "hdf5storage" version))
+       (sha256
+        (base32 "11pgxsqap9l7jsf52649q9mpj8a0w6p9im929lpr9s26ynnnn6ks"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-h5py python-numpy))
+    (native-inputs (list python-nose))
+    (home-page "https://github.com/frejanordsiek/hdf5storage")
+    (synopsis "Read and write Python data types from and to HDF5 files")
+    (description
+     "This Python package provides high-level utilities to read and write a
+variety of Python types from and to @acronym{HDF5, Hierarchical Data Format}
+formatted files.  This package also provides support for MATLAB MAT v7.3
+formatted files, which are HDF5 files with a different extension and some
+extra metadata.  Because HDF5 and MAT files might need to be read from
+untrusted sources, pickling is avoided in this package.")
+    (license license:bsd-2)))
+
 (define-public python-hjson
   ;; Using commit from master branch as the PyPI version does not contain
   ;; the hjson/tests/ directory.
@@ -9236,6 +9256,105 @@ converting, and viewing many of the proprietary file formats used to store
 experimental data and metadata at the Laboratory for Fluorescence Dynamics.")
     (license license:bsd-3)))
 
+(define-public python-av
+  (package
+    (name "python-av")
+    (version "10.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "av" version))
+       (sha256
+        (base32 "01byqsjclkg65mhr6b4i2r2n4y7af9kdd2c35lxny27121b3vzca"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list
+      #:test-flags
+      #~(list
+         ;; Tests require outbound access to download data samples from
+         ;; http://fate.ffmpeg.org/fate-suite:
+         ;;
+         ;; E urllib.error.URLError: <urlopen error [Errno -3]
+         ;; Temporary failure in name resolution>
+         ;;
+         "--ignore=tests/test_doctests.py"
+         "--ignore=tests/test_timeout.py"
+         "-k"
+         (string-append
+          "not test_data"
+          " and not test_container_probing"
+          " and not test_stream_probing"
+          " and not test_transcode"
+          " and not test_codec_tag"
+          " and not test_parse"
+          " and not test_decode_audio_sample_count"
+          " and not test_decoded_motion_vectors"
+          " and not test_decoded_motion_vectors_no_flag"
+          " and not test_decoded_time_base"
+          " and not test_decoded_video_frame_count"
+          " and not test_encoding_aac"
+          " and not test_encoding_dnxhd"
+          " and not test_encoding_dvvideo"
+          " and not test_encoding_h264"
+          " and not test_encoding_mjpeg"
+          " and not test_encoding_mp2"
+          " and not test_encoding_mpeg1video"
+          " and not test_encoding_mpeg4"
+          " and not test_encoding_pcm_s24le"
+          " and not test_encoding_png"
+          " and not test_encoding_tiff"
+          " and not test_encoding_xvid"
+          " and not test_reading_from_buffer"
+          " and not test_reading_from_buffer_no_seek"
+          " and not test_reading_from_file"
+          " and not test_reading_from_pipe_readonly"
+          " and not test_reading_from_write_readonly"
+          " and not test_writing_to_custom_io_dash"
+          " and not test_writing_to_custom_io_image2"
+          " and not test_decode_half"
+          " and not test_seek_end"
+          " and not test_seek_float"
+          " and not test_seek_int64"
+          " and not test_seek_middle"
+          " and not test_seek_start"
+          " and not test_stream_seek"
+          " and not test_selection"
+          " and not test_stream_tuples"
+          " and not test_movtext"
+          " and not test_vobsub"
+          " and not test_roundtrip"
+          " and not test_stream_probing"))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'check 'build-extensions
+            (lambda _
+              (invoke "python" "setup.py" "build_ext" "--inplace"))))))
+    (native-inputs
+     (list pkg-config
+           python-cython
+           python-editorconfig
+           python-numpy
+           python-pillow
+           python-pytest))
+    (inputs
+     ;; XXX: Build is failing with FFmpeg 6.0, unresolved upstream.
+     ;; See https://github.com/PyAV-Org/PyAV/issues/1106
+     (list ffmpeg-5))
+    (home-page "https://github.com/PyAV-Org/PyAV")
+    (synopsis "Pythonic bindings for FFmpeg's libraries")
+    (description
+     "PyAV is a Python library that allows for direct and precise manipulation
+of media through containers, streams, packets, codecs, and frames.  It provides
+access to the powerful FFmpeg libraries while managing the complex details as
+much as possible.
+PyAV also facilitates data transformation and integration with
+other packages such as Numpy and Pillow.  However, working with media is a
+challenging task and PyAV cannot abstract it away or make all the best decisions
+for you.  If you can accomplish your tasks with the ffmpeg command, PyAV may not
+be necessary.  Nonetheless, PyAV is an essential tool when working with media
+that requires its specific capabilities.")
+    (license license:bsd-3)))
+
 (define-public python-ffmpeg-python
   ;; The latest release (0.2.0) is old and its test suite crashs on Python 3.10.
   (let ((commit "df129c7ba30aaa9ffffb81a48f53aa7253b0b4e6") (revision "0"))
@@ -10275,6 +10394,67 @@ finding unresolved symbols in Python code and their corresponding imports.")
 class constructs.")
     (license license:expat)))
 
+(define-public python-jaraco-collections
+  (package
+    (name "python-jaraco-collections")
+    (version "5.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "jaraco.collections" version))
+       (sha256
+        (base32 "0s7y3jr7c173k38pck1b17kxnvx2fl0qh9m9gdf64pr9kz8fi00n"))))
+    (build-system pyproject-build-system)
+    ;; Do not test pyproject.toml with python-pytest-checkdocs as it tries to
+    ;; download dependencies.
+    (arguments
+     '(#:test-flags '("-k" "not project")))
+    (propagated-inputs (list python-jaraco-text))
+    ;; TODO: Add python-pytest-ruff to native-inputs once it has been
+    ;; packaged.
+    (native-inputs (list python-pytest
+                         python-pytest-black
+                         python-pytest-checkdocs
+                         python-pytest-cov
+                         python-pytest-enabler
+                         python-pytest-mypy))
+    (home-page "https://github.com/jaraco/jaraco.collections")
+    (synopsis "Provides various collection objects")
+    (description
+     "This package provides models and classes to supplement the
+standard library @code{collections} module.  Examples include
+@itemize
+@item
+RangeMap: A mapping that accepts a range of values for keys.
+@item
+Projection: A subset over an existing mapping.
+@item
+KeyTransformingDict: Generalized mapping with keys transformed by a function.
+@item
+FoldedCaseKeyedDict: A dict whose string keys are case-insensitive.
+@item
+BijectiveMap: A map where keys map to values and values back to their keys.
+@item
+ItemsAsAttributes: A mapping mix-in exposing items as attributes.
+@item
+IdentityOverrideMap: A map whose keys map by default to themselves unless overridden.
+@item
+FrozenDict: A hashable, immutable map.
+@item
+Enumeration: An object whose keys are enumerated.
+@item
+Everything: A container that contains all things.
+@item
+Least, Greatest: Objects that are always less than or greater than any other.
+@item
+pop_all: Return all items from the mutable sequence and remove them from that sequence.
+@item
+DictStack: A stack of dicts, great for sharing scopes.
+@item
+WeightedLookup: A specialized RangeMap for selecting an item by weights.
+@end itemize")
+    (license license:expat)))
+
 ;;; Variant used to break a cycle with python-pytest-enabler.
 (define-public python-jaraco-context-bootstrap
   (hidden-package
@@ -10439,6 +10619,41 @@ releases.")
     (description "This package provides testing support by jaraco.")
     (license license:expat)))
 
+(define-public python-jaraco-text
+  (package
+    (name "python-jaraco-text")
+    (version "3.12.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "jaraco.text" version))
+       (sha256
+        (base32 "0b2rmx0sa61f75lkkr4nfaj3mkgmn3x9c1akpwarfbmksk42b7iq"))))
+    (build-system pyproject-build-system)
+    ;; Do not test pyproject.toml with python-pytest-checkdocs as it tries to
+    ;; download dependencies.
+    (arguments
+     '(#:test-flags '("-k" "not project")))
+    (propagated-inputs (list python-autocommand python-inflect
+                             python-jaraco-context python-jaraco-functools
+                             python-more-itertools))
+    ;; TODO: Add python-pytest-ruff to native-inputs once it has been
+    ;; packaged.
+    (native-inputs (list python-pytest
+                         python-pytest-black
+                         python-pytest-checkdocs
+                         python-pytest-cov
+                         python-pytest-enabler
+                         python-pytest-mypy))
+    (home-page "https://github.com/jaraco/jaraco.text")
+    (synopsis "Provides various routines for text manipulation")
+    (description
+     "This package provides handy routines for dealing with text,
+such as wrapping, substitution, trimming, stripping, prefix and suffix
+removal, line continuation, indentation, comment processing, identifier
+processing, values parsing, case insensitive comparison, and more.")
+    (license license:expat)))
+
 (define-public python-simplegeneric
   (package
     (name "python-simplegeneric")
@@ -30176,6 +30391,45 @@ heterogeneous and multi-platform clusters (including clusters running other
 applications with variable CPU loads).")
     (license license:bsd-3)))
 
+(define-public python-djitellopy
+  (package
+    (name "python-djitellopy")
+    (version "2.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "djitellopy" version))
+       (sha256
+        (base32 "1kc0syb4hpn7fay0rxpazmczag6jw3pncrrc6v762jj0afiwkrps"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list
+      #:tests? #f                       ;no test suite
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; OpenCV does not ship metadata files for its Python library, which
+          ;; makes it invisible to the sanity_check script (see:
+          ;; https://github.com/opencv/opencv/issues/24810).
+          (delete 'sanity-check))))
+    (propagated-inputs
+     (list opencv                       ;for opencv-python
+           python-av
+           python-numpy
+           python-pillow))
+    (home-page "https://github.com/damiafuentes/DJITelloPy")
+    (synopsis
+     "DJI Tello drone video streaming, swarms and state packets library")
+    (description
+     "DJI Tello drone Python interface using the official Tello SDK and Tello
+EDU SDK.  This library has the following features:
+@itemize
+@item Implementation of all tello commands
+@item Retrieve a video stream easily
+@item Receive and parse state packets
+@item Control a swarm of drones.
+@end itemize")
+    (license license:expat)))
+
 (define-public python-djvulibre
   (package
     (name "python-djvulibre")
@@ -31490,6 +31744,30 @@ graph can be output for rendering by GraphViz or yEd.")
 function implementations based on the types of the arguments.")
     (license license:bsd-3)))
 
+(define-public python-multimethod
+  (package
+    (name "python-multimethod")
+    (version "1.10")
+    (source
+     (origin
+       ;; No tests in the PyPI tarball.
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/coady/multimethod")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "07xv92q7f4bkp6dzkqvcv0zxr11729qdak4s3ldmbhdwgsf44g5h"))))
+    (build-system pyproject-build-system)
+    (native-inputs (list python-pytest))
+    (home-page "https://github.com/coady/multimethod")
+    (synopsis "Python support for multiple argument dispatching")
+    (description
+     "This package provides a decorator for adding multiple argument
+dispatching to functions.  The decorator creates a multimethod object as
+needed and registers the function with its annotations.")
+    (license license:asl2.0)))
+
 (define-public python-logical-unification
   (package
     (name "python-logical-unification")
diff --git a/gnu/packages/serialization.scm b/gnu/packages/serialization.scm
index e836b4f8b3..3ff3b57cb2 100644
--- a/gnu/packages/serialization.scm
+++ b/gnu/packages/serialization.scm
@@ -15,6 +15,7 @@
 ;;; Copyright © 2023 Alexey Abramov <levenson@mmer.org>
 ;;; Copyright © 2023 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2023 Vinicius Monego <monego@posteo.net>
+;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -219,8 +220,60 @@ such as compact binary encodings, XML, or JSON.")
      (list doxygen gcc-10
            (package-source cereal)))))
 
+(define-public msgpack-c
+  (package
+    (name "msgpack-c")
+    (version "6.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri
+        (string-append
+         "https://github.com/msgpack/msgpack-c/releases/download/"
+         "c-" version "/" name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1fmf08babfsjq5qkgw034wk2nw6mayxp1qlkm7h55p2jqvigam1n"))
+       (snippet
+        '(let ((p (open-file "msgpack-c.pc.in" "a")))
+           (display "Requires: zlib\n" p)
+           (close-output-port p)))))
+    (build-system cmake-build-system)
+    (arguments (list #:configure-flags #~(list "-DMSGPACK_BUILD_TESTS=ON")))
+    (native-inputs (list googletest))
+    (propagated-inputs (list zlib))  ;zbuffer.h includes zlib.h
+    (home-page "https://www.msgpack.org")
+    (synopsis "Binary serialization library")
+    (description "Msgpack is a library for C that implements binary
+serialization.")
+    (license license:boost1.0)))
+
+(define-public msgpack-cxx
+  (package
+    (inherit msgpack-c)
+    (name "msgpack-cxx")
+    (version "6.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri
+        (string-append
+         "https://github.com/msgpack/msgpack-c/releases/download/"
+         "cpp-" version "/" name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1rrrf3nskcv994z3pbq6a5z2021piz118rccmm1y7zlf7klygv93"))))
+    (build-system cmake-build-system)
+    (propagated-inputs (list boost zlib)) ;included in headers
+    (description "Msgpack is a library for C++ that implements binary
+serialization.")))
+
+;;; The msgpack package was split into msgpack-c and msgpack-cxx starting from
+;;; version 4.0.0.
 (define-public msgpack
+  (deprecated-package "msgpack" msgpack-c))
+
+(define-public msgpack-3
   (package
+    (inherit msgpack-c)
     (name "msgpack")
     (version "3.3.0")
     (source
@@ -234,23 +287,13 @@ such as compact binary encodings, XML, or JSON.")
         '(let ((p (open-file "msgpack.pc.in" "a")))
            (display
             (string-append "Requires: " "zlib" "\n") p)
-           (close-output-port p)
-           #t))
+           (close-output-port p)))
        (sha256
         (base32 "0yzhq50ijvwrfkr97knhvn54lj3f4hr3zy39yq8wpf6xll94s4bf"))))
-    (build-system cmake-build-system)
-    (native-inputs
-     (list googletest-1.8 pkg-config))
-    (propagated-inputs
-     (list zlib)) ;; Msgpack installs two headers (zbuffer.h,
-    ;; zbuffer.hpp) which #include <zlib.h>.  However, 'guix gc --references'
-    ;; does not detect a store reference to zlib since these headers are not
-    ;; compiled.
-    (home-page "https://www.msgpack.org")
-    (synopsis "Binary serialization library")
+    (native-inputs (list googletest-1.8))
     (description "Msgpack is a library for C/C++ that implements binary
-serialization.")
-    (license license:boost1.0)))
+serialization.  This is the legacy version that predates the split into C and
+C++ specific packages.")))
 
 (define-public libmpack
   (package
diff --git a/gnu/packages/shellutils.scm b/gnu/packages/shellutils.scm
index 9993c0b807..00352dc327 100644
--- a/gnu/packages/shellutils.scm
+++ b/gnu/packages/shellutils.scm
@@ -331,7 +331,7 @@ particularly in catching syntax errors.")
 (define-public grml-zsh-config
   (package
     (name "grml-zsh-config")
-    (version "0.19.5")
+    (version "0.19.6")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -339,7 +339,7 @@ particularly in catching syntax errors.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "0ifw490z3v9ljccbmm04adz39fj2dmx8mjgayxqj0a9ln90yfdc4"))))
+                "1k1m2fbmvw73qy9mc6k2ygjg6zz8h7nn3d9pvj6jbjadnx4pz770"))))
     (build-system copy-build-system)
     (arguments
      (list
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index c2cf68fca8..906ec456b6 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -18,6 +18,7 @@
 ;;; Copyright © 2021 Frank Pursel <frank.pursel@gmail.com>
 ;;; Copyright © 2022 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
+;;; Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -6757,11 +6758,9 @@ Java package that provides routines for various statistical distributions.")
     (license license:gpl2+)))
 
 (define-public emacs-ess
-  ;; Latest release is old.  This is not the latest commit either due to bug
-  ;; reported here: <https://github.com/emacs-ess/ESS/issues/987>.
-  (let ((commit "24da603184ce39246611dd5b8602e769d7ebd5bf")
+  (let ((commit "3691ecc642eab5d016887e42699648e0eeeef566")
         (version "18.10.2")
-        (revision "0"))
+        (revision "1"))
     (package
       (name "emacs-ess")
       (version (git-version version revision commit))
@@ -6772,60 +6771,96 @@ Java package that provides routines for various statistical distributions.")
                (url "https://github.com/emacs-ess/ESS")
                (commit commit)))
          (sha256
-          (base32 "0j98lv07nzwzd54d4dgcfz01wy5gj48m0mnirxzh5r45ik2myh1r"))
+          (base32 "19p8djsbgvahpsx1w8i6h3qvpbdr4isjwm3wi82yk2648ri0qsq1"))
          (file-name (git-file-name name version))
          (modules '((guix build utils)))
          (snippet
-          '(begin
-             ;; Stop ESS from trying to bundle an external julia-mode.el.
-             (substitute* "lisp/Makefile"
-               ((" \\$\\(JULIAS)") "")
-               (("\ttest.*julia-mode.*\\.el") ""))
-             ;; Only build docs in info format.
-             (substitute* "doc/Makefile"
-               (("all  : info text")
-                "all  : info")
-               (("install: install-info install-other-docs")
-                "install: install-info"))
-             ;; Stop install-info from trying to update the info directory.
-             (substitute* "doc/Makefile"
-               ((".*/dir.*") ""))
-             ;; Fix r-help-mode test.
-             (substitute* "test/ess-test-r.el"
-               (("\\(equal ess-help-object \"plot.default\")") "t"))
-             ;; Avoid generating ess-autoloads.el twice.
-             (substitute* "Makefile"
-               (("all: lisp doc etc autoloads")
-                "all: lisp doc etc"))
-             ;; Install to correct directories.
-             (substitute* "Makefile"
-               (("mkdir -p \\$\\(ESSDESTDIR)")
-                "$(MAKE) -C lisp install; $(MAKE) -C doc install")
-               (("\\$\\(INSTALL) -R \\./\\* \\$\\(ESSDESTDIR)/")
-                "$(MAKE) -C etc install"))
-             #t))
-         (patches
-          (search-patches "emacs-ess-fix-obsolete-function-alias.patch"))))
+          #~(begin
+              ;; Stop ESS from trying to bundle an external julia-mode.el.
+              (substitute* "lisp/Makefile"
+                ((" \\$\\(JULIAS)") "")
+                (("\ttest.*julia-mode.*\\.el") ""))
+              ;; Only build docs in info format.
+              (substitute* "doc/Makefile"
+                (("all  : info text")
+                 "all  : info")
+                (("install: install-info install-other-docs")
+                 "install: install-info"))
+              ;; Stop install-info from trying to update the info directory.
+              (substitute* "doc/Makefile"
+                ((".*/dir.*") ""))
+              ;; Fix r-help-mode test.
+              (substitute* "test/ess-test-r.el"
+                (("\\(equal ess-help-object \"plot.default\")") "t"))
+              ;; Avoid generating ess-autoloads.el twice.
+              (substitute* "Makefile"
+                (("all: lisp doc etc autoloads")
+                 "all: lisp doc etc"))
+              ;; Install to correct directories.
+              (substitute* "Makefile"
+                (("mkdir -p \\$\\(ESSDESTDIR)")
+                 "$(MAKE) -C lisp install; $(MAKE) -C doc install")
+                (("\\$\\(INSTALL) -R \\./\\* \\$\\(ESSDESTDIR)/")
+                 "$(MAKE) -C etc install"))))))
       (build-system gnu-build-system)
       (arguments
        (let ((base-directory "/share/emacs/site-lisp"))
-         `(#:make-flags (list (string-append "PREFIX=" %output)
-                              (string-append "ETCDIR=" %output
-                                             ,base-directory "/etc")
-                              (string-append "LISPDIR=" %output
-                                             ,base-directory)
-                              (string-append "INFODIR=" %output
-                                             "/share/info"))
-           #:phases
-           (modify-phases %standard-phases
-             (delete 'configure)
-             (replace 'check
-               (lambda _ (invoke "make" "test")))))))
+         (list
+          #:modules '((guix build gnu-build-system)
+                      (guix build utils)
+                      (guix build emacs-utils))
+          #:imported-modules `(,@%gnu-build-system-modules
+                               (guix build emacs-build-system)
+                               (guix build emacs-utils))
+          #:make-flags
+          #~(list (string-append "PREFIX=" #$output)
+                  (string-append "ETCDIR=" #$output #$base-directory "/etc")
+                  (string-append "LISPDIR=" #$output #$base-directory)
+                  (string-append "INFODIR=" #$output "/share/info"))
+          #:phases
+          #~(modify-phases %standard-phases
+              (delete 'configure)
+              (add-before 'check 'skip-failing-tests
+                ;; XXX: Skip 10 failing tests (out of 187).
+                (lambda _
+                  (let-syntax
+                      ((disable-tests
+                        (syntax-rules ()
+                          ((_ file ())
+                           (syntax-error "test names list must not be empty"))
+                          ((_ file (test-name ...))
+                           (substitute* file
+                             (((string-append "^\\(ert-deftest " test-name ".*")
+                               all)
+                              (string-append all "(skip-unless nil)\n"))
+                             ...)))))
+                    (disable-tests (list "test/ess-test-inf.el"
+                                         "test/ess-test-r.el")
+                                   ("ess--derive-connection-path"
+                                    "ess-eval-line-test"
+                                    "ess-eval-region-test"
+                                    "ess-mock-remote-process"
+                                    "ess-r-load-ESSR-github-fetch-no"
+                                    "ess-r-load-ESSR-github-fetch-yes"
+                                    "ess-set-working-directory-test"
+                                    "ess-test-r-startup-directory")))
+                  ;; The two tests below use a different syntax.
+                  (emacs-batch-edit-file "test/ess-test-r-eval.el"
+                    '(progn
+                      (mapc (lambda (test)
+                              (goto-char (point-min))
+                              (search-forward (format "etest-deftest %s " test))
+                              (beginning-of-line)
+                              (kill-sexp))
+                            '("ess-r-eval-ns-env-roxy-tracebug-test"
+                              "ess-r-eval-sink-freeze-test"))
+                      (basic-save-buffer)))))
+              (replace 'check
+                (lambda _ (invoke "make" "test")))))))
       (native-inputs
        (list perl r-roxygen2 texinfo))
       (inputs
-       `(("emacs" ,emacs-minimal)
-         ("r-minimal" ,r-minimal)))
+       (list emacs-minimal r-minimal))
       (propagated-inputs
        (list emacs-julia-mode))
       (home-page "https://ess.r-project.org/")
@@ -6885,6 +6920,50 @@ files, including Rmarkdown files.")
 popular stats packages like SAS, Stata and SPSS.")
     (license license:expat)))
 
+(define-public python-pyreadstat
+  (package
+    (name "python-pyreadstat")
+    (version "1.2.4")
+    ;; No tests in the PyPI tarball.
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/Roche/pyreadstat")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0zysrzixvqw2lwwykxqg5yj8a0zyv5s2bmk22x30f4rj2hgvq1pv"))
+       (patches (search-patches "python-pyreadstat-link-libiconv.patch"))))
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-before 'check 'change-home-dir
+                    (lambda _
+                      ;; test_sav_expand and test_sav_write_basic_expanduser need a
+                      ;; home directory with write permissions.
+                      (setenv "HOME" "/tmp")))
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (when tests?
+                        ;; The source also contains tests/test_version.py
+                        ;; which checks the version in __init__.py against the
+                        ;; one in setup.py. Since this requires texlive
+                        ;; dependencies to run and is also not mentioned in
+                        ;; how_to_test.md, this test is skipped.
+                        (invoke "python" "tests/test_basic.py")))))))
+    (build-system python-build-system)
+    (propagated-inputs (list python-pandas))
+    (inputs (list libiconv zlib))
+    (native-inputs (list python-cython-3))
+    (home-page "https://github.com/Roche/pyreadstat")
+    (synopsis
+     "Read and write SAS, SPSS and Stata files into/from Pandas DataFrames")
+    (description
+     "This Python package can be used to read and write SAS, SPSS and Stata
+files into/from Pandas DataFrames.  It is a wrapper around the C library
+@code{readstat}.")
+    (license license:asl2.0)))
+
 (define-public r-quantpsyc
   (package
     (name "r-quantpsyc")
diff --git a/gnu/packages/swig.scm b/gnu/packages/swig.scm
index 3f38cd9f9f..7025d05038 100644
--- a/gnu/packages/swig.scm
+++ b/gnu/packages/swig.scm
@@ -79,7 +79,7 @@ you tailor the wrapping process to suit your application.")
   (package
     (inherit swig)
     (name "swig")
-    (version "4.1.1")
+    (version "4.2.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/" name "/" name "/"
@@ -87,5 +87,5 @@ you tailor the wrapping process to suit your application.")
                                  name "-" version ".tar.gz"))
               (sha256
                (base32
-                "16xc767gf5ip40jh698wbdrxrghli5v2c966bkdmrmpwv378mw1a"))))
+                "15wwh9215rdkflpr85r7zxr2nmrib03jr4bvh5i0f9lyb3bs4716"))))
     (inputs (list pcre2))))
diff --git a/gnu/packages/tbb.scm b/gnu/packages/tbb.scm
index ec630a029f..da3ea74fb6 100644
--- a/gnu/packages/tbb.scm
+++ b/gnu/packages/tbb.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016, 2022 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2022, 2024 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Nikita <nikita@n0.is>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
@@ -51,31 +51,31 @@
      `(#:configure-flags
        '(,@(if (or (target-riscv64?)
                    (target-ppc32?))
-            '("-DTBB_TEST_LINK_FLAGS=-latomic")
-            `())
+               '("-DTBB_TEST_LINK_FLAGS=-latomic")
+               `())
          ,@(if (or (target-arm32?)
                    (target-ppc32?))
-             '("-DTBB_TEST_COMPILE_FLAGS=-DTBB_TEST_LOW_WORKLOAD")
-             `())
-         "-DTBB_STRICT=OFF")   ;; Don't fail on warnings
+               '("-DTBB_TEST_COMPILE_FLAGS=-DTBB_TEST_LOW_WORKLOAD")
+               `())
+         "-DTBB_STRICT=OFF") ;; Don't fail on warnings
        #:phases
        (modify-phases %standard-phases
          ,@(cond
-             ((target-arm32?)
-              `((add-after 'unpack 'adjust-test-suite
-                  (lambda _
-                    (substitute* "test/CMakeLists.txt"
-                      ;; Bus error, skipped on mips.
-                      ((".*test_malloc_pools.*") ""))))))
-             ((target-ppc32?)
-              `((add-after 'unpack 'adjust-test-suite
-                  (lambda _
-                      (substitute* "test/CMakeLists.txt"
-                        ;; These tests hang forever.
-                        ((".*test_function_node.*") "")
-                        ((".*test_multifunction_node.*") "")
-                        ((".*test_async_node.*") ""))))))
-             (else '())))))
+            ((target-arm32?)
+             `((add-after 'unpack 'adjust-test-suite
+                 (lambda _
+                   (substitute* "test/CMakeLists.txt"
+                     ;; Bus error, skipped on mips.
+                     ((".*test_malloc_pools.*") ""))))))
+            ((target-ppc32?)
+             `((add-after 'unpack 'adjust-test-suite
+                 (lambda _
+                   (substitute* "test/CMakeLists.txt"
+                     ;; These tests hang forever.
+                     ((".*test_function_node.*") "")
+                     ((".*test_multifunction_node.*") "")
+                     ((".*test_async_node.*") ""))))))
+            (else '())))))
     (home-page "https://www.threadingbuildingblocks.org")
     (synopsis "C++ library for parallel programming")
     (description
@@ -101,7 +101,9 @@ tasks, synchronization primitives, atomic operations, and more.")
             (lambda _
               (substitute* "python/CMakeLists.txt"
                 (("\\$\\{PYTHON_BUILD_WORK_DIR\\}/build")
-                 #$output))
+                 #$output)
+                (("install --prefix.*-f" m)
+                 (string-append m " --root=/")))
               (substitute* "python/setup.py"
                 (("extra_link_args=tbb_flag,")
                  (string-append "extra_link_args=['-Wl,-rpath="
diff --git a/gnu/packages/telephony.scm b/gnu/packages/telephony.scm
index 3092c39b24..41e83384ec 100644
--- a/gnu/packages/telephony.scm
+++ b/gnu/packages/telephony.scm
@@ -17,7 +17,7 @@
 ;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
 ;;; Copyright © 2020, 2022 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2020 Raghav Gururajan <raghavgururajan@disroot.org>
-;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020, 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
 ;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
@@ -855,6 +855,75 @@ your calls and messages.")
 Initiation Protocol (SIP) and a multimedia framework.")
     (license license:gpl2+)))
 
+(define-public pjproject-jami
+  (let ((commit "d044ad6c5b4221648c555da16196804e4721299c")
+        (revision "0"))
+    (package
+      (inherit pjproject)
+      (name "pjproject-jami")
+      ;; The version is taken from
+      ;; <https://raw.githubusercontent.com/savoirfairelinux/pjproject/master/version.mak>.
+      (version (git-version "2.13.1" revision commit))
+      (source (origin
+                (inherit (package-source pjproject))
+                ;; The Jami development team regularly issues patches to
+                ;; pjproject to extend the its functionality and fix bugs;
+                ;; they are submitted for inclusion upstream but larger
+                ;; patches take time to be reviewed and merged, hence this
+                ;; forked repository.
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/savoirfairelinux/pjproject")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0z4d7wdpa2mlaygb283k0j8n3l6q68gn0xqd62b5ngqvkhlaf775"))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments pjproject)
+         ((#:configure-flags _ ''())
+          ;; This package is tailored for DhtNet; see how it is built for its
+          ;; CI in
+          ;; <https://git.jami.net/savoirfairelinux/dhtnet/-/raw/master/Dockerfile>.
+          #~(list
+             ;; Some flags preserved flags from parent package.
+             "--with-external-srtp"
+             #$@(if (string-contains (or (%current-system)
+                                         (%current-target-system)) "linux")
+                    #~("--enable-epoll")
+                    #~())
+             "--with-gnutls"            ;disable OpenSSL checks
+             ;; -DNDEBUG is set to prevent pjproject from raising
+             ;; assertions that aren't critical, crashing
+             ;; applications as the result.
+             "CFLAGS=-DNDEBUG"
+             ;; Specify a runpath reference to itself, which is missing and
+             ;; causes the validate-runpath phase to fail.
+             (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib")
+             "--enable-shared"
+             "--disable-libyuv"         ;TODO: add missing package
+
+             ;; These flags are specific to DhtNet.
+             "--disable-sound"
+             "--enable-video"
+             "--enable-ext-sound"
+             "--disable-speex-aec"
+             "--disable-g711-codec"
+             "--disable-l16-codec"
+             "--disable-gsm-codec"
+             "--disable-g722-codec"
+             "--disable-g7221-codec"
+             "--disable-speex-codec"
+             "--disable-ilbc-codec"
+             "--disable-opencore-amr"
+             "--disable-silk"
+             "--disable-sdl"
+             "--disable-ffmpeg"
+             "--disable-v4l2"
+             "--disable-openh264"
+             "--disable-resample"
+             "--disable-libwebrtc")))))))
+
 (define-public libtgvoip
   (package
     (name "libtgvoip")
diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm
index 53f67a80e5..f609de8eff 100644
--- a/gnu/packages/terminals.scm
+++ b/gnu/packages/terminals.scm
@@ -1289,10 +1289,8 @@ that can be displayed terminal.")
         (base32
          "0x5c31yq7ansmiy20a0qf59wagba9v3pq97mlkxrqxn4n1gcc6vi"))))
     (build-system gnu-build-system)
-    (inputs
-     (list libevent libssh msgpack ncurses))
-    (native-inputs
-     (list autoconf automake pkg-config))
+    (inputs (list libevent libssh msgpack-3 ncurses))
+    (native-inputs (list autoconf automake pkg-config))
     (home-page "https://tmate.io/")
     (synopsis "Terminal sharing application")
     (description "tmate is a terminal sharing application that allows you to
diff --git a/gnu/packages/textutils.scm b/gnu/packages/textutils.scm
index ea182b1925..494e6b5ef5 100644
--- a/gnu/packages/textutils.scm
+++ b/gnu/packages/textutils.scm
@@ -996,13 +996,13 @@ and Cython.")
 (define-public txt2tags
   (package
     (name "txt2tags")
-    (version "3.7")
+    (version "3.9")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "txt2tags" version))
               (sha256
                (base32
-                "12hpnvdy7dgarq6ini9jp7dp2zcmvpax04zbl3jb84kd423r75i7"))))
+                "0ik7gpr3gymgxnj0p86k8768kyxncbncv93zq67sbak3dbdl8hky"))))
     (build-system python-build-system)
     (native-inputs (list python-tox))
     (home-page "https://txt2tags.org")
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 75e6370c72..806a761d9b 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020, 2021 Leo Famulari <leo@famulari.name>
-;;; Copyright © 2016, 2017, 2019, 2021-2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017, 2019, 2021-2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017, 2018 Nikita <nikita@n0.is>
 ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
@@ -15,7 +15,7 @@
 ;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
-;;; Copyright © 2020, 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020, 2021, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Solene Rapenne <solene@perso.pw>
 ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
@@ -200,7 +200,7 @@ living in the same process.")
   (package
     (name "gnutls")
     (version "3.7.7")
-    (replacement gnutls-3.8.1)
+    (replacement gnutls-3.8.2)
     (source (origin
               (method url-fetch)
               ;; Note: Releases are no longer on ftp.gnu.org since the
@@ -305,11 +305,11 @@ required structures.")
 (define-deprecated/public-alias gnutls-latest gnutls)
 
 ;; Replacement for gnutls@3.7.7 to address GNUTLS-SA-2020-07-14 /
-;; CVE-2023-0361
-(define-public gnutls-3.8.1
+;; CVE-2023-0361 and GNUTLS-SA-2023-10-23 / CVE-2023-5981.
+(define gnutls-3.8.2
   (package
     (inherit gnutls)
-    (version "3.8.1")
+    (version "3.8.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnupg/gnutls/v"
@@ -318,20 +318,7 @@ required structures.")
               (patches (search-patches "gnutls-skip-trust-store-test.patch"))
               (sha256
                (base32
-                "1742jiigwsfhx7nj5rz7dwqr8d46npsph6b68j7siar0mqarx2xs"))))
-    (arguments
-     (if (target-hurd?)
-         ;; Fix reference to undefined 'PATH_MAX'.  This is fixed in GnuTLS
-         ;; commit 3b6ec1e01de4e96d36276dfe34ee9e183f285264.
-         (substitute-keyword-arguments (package-arguments gnutls)
-           ((#:phases phases #~%standard-phases)
-            #~(modify-phases #$phases
-                (add-after 'unpack 'set-path-max
-                  (lambda _
-                    (substitute* "lib/pathbuf.h"
-                      (("^#define GNUTLS_PATH_MAX PATH_MAX")
-                       "#define GNUTLS_PATH_MAX 8192\n")))))))
-         (package-arguments gnutls)))))
+                "0xzgmp1ck5ifvdki4jg29r278w2p1m3a0qz38g99v6zsdw0yarg7"))))))
 
 (define-public gnutls/dane
   ;; GnuTLS with build libgnutls-dane, implementing DNS-based
@@ -429,6 +416,8 @@ OpenSSL for TARGET."
              (cond
               ((target-x86-32? target)
                "x86")
+              ((target-x32? target)
+               "x32")
               ((target-x86-64? target)
                "x86_64")
               ((target-mips64el? target)
diff --git a/gnu/packages/valgrind.scm b/gnu/packages/valgrind.scm
index 06622548a5..b50dabf9ca 100644
--- a/gnu/packages/valgrind.scm
+++ b/gnu/packages/valgrind.scm
@@ -39,7 +39,7 @@
 (define-public valgrind
   (package
     (name "valgrind")
-    (version "3.20.0")
+    (version "3.22.0")
     (source (origin
               (method url-fetch)
               (uri (list (string-append "https://sourceware.org/pub/valgrind"
@@ -48,7 +48,7 @@
                                         "/valgrind-" version ".tar.bz2")))
               (sha256
                (base32
-                "1ipkp6yi202pml2r0qwflysmq86dkqd8iyi1y51d6y70vcqw0dl5"))))
+                "0k1ddnzxfpbng2sp5r31jjxsmp35g977rx6a8jcp4prcvmddn4f8"))))
     (build-system gnu-build-system)
     (outputs '("doc"                              ;16 MB
                "out"))
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 40d7a00dae..a7a701629f 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -33,7 +33,7 @@
 ;;; Copyright © 2020 Tanguy Le Carrour <tanguy@bioneland.org>
 ;;; Copyright © 2020, 2021, 2022 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2021 Greg Hogan <code@greghogan.com>
-;;; Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2021 Léo Le Bouter <lle-bout@zaclys.net>
 ;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
@@ -823,6 +823,52 @@ on @command{git}, and use any regular Git hosting service.")
 to GitHub contributions calendar.")
     (license license:expat)))
 
+(define-public xdiff
+  (let ((revision "0")
+        (commit "a137bc7ee6c76618ed1737c257548eaa10ac0089"))
+    (package
+      (name "xdiff")
+      ;; The base version is taken from the CMakeLists.txt file.
+      (version (git-version "0.1" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/libgit2/xdiff")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1rxzpag2pih64qlgq40xg1z6mz0bzvps4baxw7bmykyhjhc2gx75"))))
+      (build-system cmake-build-system)
+      (arguments
+       (list
+        #:modules '((guix build cmake-build-system)
+                    (guix build utils)
+                    (srfi srfi-26))
+        #:tests? #f                     ;no test suite
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'unpack 'create-shared-library
+              (lambda _
+                (substitute* "CMakeLists.txt"
+                  (("add_library\\(xdiff STATIC")
+                   "add_library(xdiff SHARED"))))
+            (replace 'install           ;no install target
+              (lambda _
+                (with-directory-excursion "../source"
+                  (for-each (cute install-file <>
+                                  (string-append #$output "/include"))
+                            (list "xdiff.h"
+                                  "git-xdiff.h"))) ;included by xdiff.h
+                (install-file "libxdiff.so"
+                              (string-append #$output "/lib")))))))
+      (home-page "https://github.com/libgit2/xdiff")
+      (synopsis "File differential library used by git")
+      (description "@code{xdiff} is the file differential library used by git,
+which has been extracted into a standalone library for compatibility with
+other git-like projects such as @code{libgit2}.")
+      (license license:lgpl2.1+))))
+
 (define-public libgit2
   (package
     (name "libgit2")
@@ -1072,115 +1118,118 @@ collaboration using typical untrusted file hosts or services.")
    (license license:gpl3+)))
 
 (define-public cgit
-  (package
-    (name "cgit")
-    ;; Update the ‘git-source’ input as well.
-    (version "1.2.3")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://git.zx2c4.com/cgit/snapshot/cgit-"
-                    version ".tar.xz"))
-              (sha256
-               (base32
-                "193d990ym10qlslk0p8mjwp2j6rhqa7fq0y1iff65lvbyv914pss"))))
-    (build-system gnu-build-system)
-    (arguments
-     (list
-      #:tests? #f ; XXX: fail to build the in-source git.
-      #:test-target "test"
-      #:make-flags #~(list (string-append "CC=" #$(cc-for-target))
-                           "SHELL_PATH=sh")
-      #:phases
-      #~(modify-phases %standard-phases
-          (add-after 'unpack 'unpack-git
-            (lambda* (#:key inputs #:allow-other-keys)
-              ;; Unpack the source of git into the 'git' directory.
-              (invoke "tar" "--strip-components=1" "-C" "git" "-xf"
-                      (assoc-ref inputs "git-source"))))
-          (add-after 'unpack 'patch-absolute-file-names
-            (lambda* (#:key inputs #:allow-other-keys)
-              (define (quoted-file-name input path)
-                (string-append "\"" input path "\""))
-              (substitute* "ui-snapshot.c"
-                (("\"gzip\"")
-                 (quoted-file-name (assoc-ref inputs "gzip") "/bin/gzip"))
-                (("\"bzip2\"")
-                 (quoted-file-name (assoc-ref inputs "bzip2") "/bin/bzip2"))
-                (("\"xz\"")
-                 (quoted-file-name (assoc-ref inputs "xz") "/bin/xz")))
-
-              (substitute* "filters/about-formatting.sh"
-                (("$\\(dirname $0\\)") (string-append (assoc-ref outputs "out")
-                                                      "/lib/cgit/filters"))
-                (("\\| tr") (string-append "| " (which "tr"))))
-
-              (substitute* "filters/html-converters/txt2html"
-                (("sed") (which "sed")))
-
-              (substitute* "filters/html-converters/man2html"
-                (("groff") (which "groff")))
-
-              (substitute* "filters/html-converters/rst2html"
-                (("rst2html\\.py") (which "rst2html.py")))))
-          (delete 'configure) ; no configure script
-          (add-after 'build 'build-man
-            (lambda* (#:key make-flags #:allow-other-keys)
-              (apply invoke "make" "doc-man" make-flags)))
-          (replace 'install
-            (lambda* (#:key make-flags outputs #:allow-other-keys)
-              (let ((out (assoc-ref outputs "out")))
-                (apply invoke
-                       "make" "install" "install-man"
-                       (string-append "prefix=" out)
-                       (string-append "CGIT_SCRIPT_PATH=" out "/share/cgit")
-                       make-flags)
-                ;; Move the platform-dependent 'cgit.cgi' into lib to get it
-                ;; stripped.
-                (rename-file (string-append out "/share/cgit/cgit.cgi")
-                             (string-append out "/lib/cgit/cgit.cgi")))))
-          (add-after 'install 'wrap-python-scripts
-            (lambda* (#:key outputs #:allow-other-keys)
-              (for-each
-               (lambda (file)
-                 (wrap-program (string-append (assoc-ref outputs "out")
-                                              "/lib/cgit/filters/" file)
-                   `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))))
-               '("syntax-highlighting.py"
-                 "html-converters/md2html")))))))
-    (native-inputs
-     ;; For building manpage.
-     (list asciidoc))
-    (inputs
-     `(;; Building cgit requires a Git source tree.
-       ("git-source"
-        ,(origin
-           (method url-fetch)
-           ;; cgit is tightly bound to git.  Use GIT_VER from the Makefile,
-           ;; which may not match the current (package-version git).
-           (uri "mirror://kernel.org/software/scm/git/git-2.25.4.tar.xz")
-           (sha256
-            (base32 "11am6s46wmn1yll5614smjhzlghbqq6gysgcs64igjr9y5wzpdxq"))))
-       ("bash-minimal" ,bash-minimal)
-       ("openssl" ,openssl)
-       ("python" ,python)
-       ("python-docutils" ,python-docutils)
-       ("python-markdown" ,python-markdown)
-       ("python-pygments" ,python-pygments)
-       ("zlib" ,zlib)
-       ;; bzip2, groff, gzip and xz are inputs (not native inputs)
-       ;; since they are actually substituted into cgit source and
-       ;; referenced by the built package output.
-       ("bzip2" ,bzip2)
-       ("groff" ,groff)
-       ("gzip" ,gzip)
-       ("xz" ,xz)))
-    (home-page "https://git.zx2c4.com/cgit/")
-    (synopsis "Web frontend for git repositories")
-    (description
-     "CGit is an attempt to create a fast web interface for the Git SCM, using
+  (let ((commit "793c420897e18eb3474c751d54cf4e0983f85433")
+        (rev "1"))
+    (package
+      (name "cgit")
+      ;; Update the ‘git-source’ input as well.
+      (version (git-version "1.2.3" rev commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://git.zx2c4.com/cgit")
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "1mhrm14wpqvralf9j33ih5ai6naiq3g2jg2z91gnw9dhh8f9ilwz"))
+                (file-name (git-file-name name version))))
+      (build-system gnu-build-system)
+      (arguments
+       (list
+        #:tests? #f                    ; XXX: fail to build the in-source git.
+        #:test-target "test"
+        #:make-flags #~(list (string-append "CC=" #$(cc-for-target))
+                             "SHELL_PATH=sh")
+        #:phases
+        #~(modify-phases %standard-phases
+            (add-after 'unpack 'unpack-git
+              (lambda* (#:key inputs #:allow-other-keys)
+                ;; Unpack the source of git into the 'git' directory.
+                (invoke "tar" "--strip-components=1" "-C" "git" "-xf"
+                        (assoc-ref inputs "git-source"))))
+            (add-after 'unpack 'patch-absolute-file-names
+              (lambda* (#:key inputs #:allow-other-keys)
+                (define (quoted-file-name input path)
+                  (string-append "\"" input path "\""))
+                (substitute* "ui-snapshot.c"
+                  (("\"gzip\"")
+                   (quoted-file-name (assoc-ref inputs "gzip") "/bin/gzip"))
+                  (("\"bzip2\"")
+                   (quoted-file-name (assoc-ref inputs "bzip2") "/bin/bzip2"))
+                  (("\"xz\"")
+                   (quoted-file-name (assoc-ref inputs "xz") "/bin/xz")))
+
+                (substitute* "filters/about-formatting.sh"
+                  (("$\\(dirname $0\\)") (string-append (assoc-ref outputs "out")
+                                                        "/lib/cgit/filters"))
+                  (("\\| tr") (string-append "| " (which "tr"))))
+
+                (substitute* "filters/html-converters/txt2html"
+                  (("sed") (which "sed")))
+
+                (substitute* "filters/html-converters/man2html"
+                  (("groff") (which "groff")))
+
+                (substitute* "filters/html-converters/rst2html"
+                  (("rst2html\\.py") (which "rst2html.py")))))
+            (delete 'configure)         ; no configure script
+            (add-after 'build 'build-man
+              (lambda* (#:key make-flags #:allow-other-keys)
+                (apply invoke "make" "doc-man" make-flags)))
+            (replace 'install
+              (lambda* (#:key make-flags outputs #:allow-other-keys)
+                (let ((out (assoc-ref outputs "out")))
+                  (apply invoke
+                         "make" "install" "install-man"
+                         (string-append "prefix=" out)
+                         (string-append "CGIT_SCRIPT_PATH=" out "/share/cgit")
+                         make-flags)
+                  ;; Move the platform-dependent 'cgit.cgi' into lib to get it
+                  ;; stripped.
+                  (rename-file (string-append out "/share/cgit/cgit.cgi")
+                               (string-append out "/lib/cgit/cgit.cgi")))))
+            (add-after 'install 'wrap-python-scripts
+              (lambda* (#:key outputs #:allow-other-keys)
+                (for-each
+                 (lambda (file)
+                   (wrap-program (string-append (assoc-ref outputs "out")
+                                                "/lib/cgit/filters/" file)
+                     `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))))
+                 '("syntax-highlighting.py"
+                   "html-converters/md2html")))))))
+      (native-inputs
+       ;; For building manpage.
+       (list asciidoc))
+      (inputs
+       `( ;; Building cgit requires a Git source tree.
+         ("git-source"
+          ,(origin
+             (method url-fetch)
+             ;; cgit is tightly bound to git.  Use GIT_VER from the Makefile,
+             ;; which may not match the current (package-version git).
+             (uri "mirror://kernel.org/software/scm/git/git-2.43.0.tar.xz")
+             (sha256
+              (base32 "1v3nkfm3gw8wr7595qy86qla8xyjvi85fmly4lfph4frfcz60ijl"))))
+         ("bash-minimal" ,bash-minimal)
+         ("openssl" ,openssl)
+         ("python" ,python)
+         ("python-docutils" ,python-docutils)
+         ("python-markdown" ,python-markdown)
+         ("python-pygments" ,python-pygments)
+         ("zlib" ,zlib)
+         ;; bzip2, groff, gzip and xz are inputs (not native inputs)
+         ;; since they are actually substituted into cgit source and
+         ;; referenced by the built package output.
+         ("bzip2" ,bzip2)
+         ("groff" ,groff)
+         ("gzip" ,gzip)
+         ("xz" ,xz)))
+      (home-page "https://git.zx2c4.com/cgit/")
+      (synopsis "Web frontend for git repositories")
+      (description
+       "CGit is an attempt to create a fast web interface for the Git SCM, using
 a built-in cache to decrease server I/O pressure.")
-    (license license:gpl2)))
+      (license license:gpl2))))
 
 (define-public cgit-pink
   (package
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 6da4897a57..d751442561 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -50,7 +50,7 @@
 ;;; Copyright © 2021 Alexey Abramov <levenson@mmer.org>
 ;;; Copyright © 2021, 2022, 2023 Andrew Tropin <andrew@trop.in>
 ;;; Copyright © 2021 David Wilson <david@daviwil.com>
-;;; Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021, 2022, 2023, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2020 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
 ;;; Copyright © 2021 Thiago Jung Bauermann <bauermann@kolabnow.com>
@@ -1047,14 +1047,14 @@ H.264 (MPEG-4 AVC) video streams.")
 (define-public mkvtoolnix
   (package
     (name "mkvtoolnix")
-    (version "52.0.0")
+    (version "80.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://mkvtoolnix.download/sources/"
                            "mkvtoolnix-" version ".tar.xz"))
        (sha256
-        (base32 "15y7ahlifsclnkl70wn5w34dil8nwcwcjnw3k2ydqc6dz4vb0j5s"))
+        (base32 "1x9k9pmw7mzm2amvm251a45dlj9p9iqfank5p4w2fizxkapws25v"))
        (modules '((guix build utils)))
        (snippet '(begin
                    ;; Delete bundled libraries.
@@ -1070,6 +1070,7 @@ H.264 (MPEG-4 AVC) video streams.")
     (outputs '("out" "gui")) ; "mkvtoolnix-gui" brings the closure size from ~300 MB to 1.5+ GB.
     (inputs
      (list boost
+           gmp
            bzip2
            cmark
            libebml
@@ -1083,86 +1084,96 @@ H.264 (MPEG-4 AVC) video streams.")
            lzo
            pcre2
            pugixml
-           qtbase-5
-           qtmultimedia-5
+           qtbase
+           qtmultimedia
+           qtsvg
            utfcpp
            zlib))
     (native-inputs
-     `(("docbook-xsl" ,docbook-xsl)
-       ("gettext" ,gettext-minimal)
-       ("googletest" ,googletest)
-       ("libxslt" ,libxslt)
-       ("nlohmann-json" ,nlohmann-json)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("po4a" ,po4a)
-       ("qttools-5" ,qttools-5)
-       ("ruby" ,ruby-2.7)))
+     (list docbook-xsl
+           gettext-minimal
+           googletest
+           libxslt
+           nlohmann-json
+           perl
+           pkg-config
+           po4a
+           qttools
+           ruby-3.2))
     (arguments
-     `(#:configure-flags
-       (list (string-append "--with-boost="
-                            (assoc-ref %build-inputs "boost"))
-             (string-append "--with-docbook-xsl-root="
-                            (assoc-ref %build-inputs "docbook-xsl")
-                            "/xml/xsl/docbook-xsl-"
-                            ,(package-version docbook-xsl))
-             "--enable-update-check=no"
-             "--enable-precompiled-headers=no")
-        #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-utfcpp-include
-           (lambda _
-             (substitute* "src/common/strings/utf8.cpp"
-               (("<utf8.h>")
-                "<utf8cpp/utf8.h>"))))
-         (add-after 'unpack 'patch-relative-file-names
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-             (substitute* "src/mkvtoolnix-gui/util/settings.cpp"
-               (("mkvmerge" match)
-                (string-append out "/bin/" match)))
-             #t)))
-         (add-before 'configure 'add-googletest
-           (lambda* (#:key inputs #:allow-other-keys)
-             (symlink (search-input-directory inputs "/include/gtest")
-                      "lib/gtest")))
-         (replace 'build
-           (lambda _
-             (let ((-j (list "-j" (number->string (parallel-job-count)))))
-               (apply invoke "rake" -j))))
-         (replace 'check
-           (lambda _
-             (invoke "rake" "tests/unit")))
-         (replace 'install
-           (lambda _
-             (invoke "rake" "install")))
-         (add-after 'install 'post-install
-           (lambda* (#:key outputs #:allow-other-keys)
-             ;; Move the Qt interface to "gui".
-             (let* ((out (assoc-ref outputs "out"))
-                    (gui (assoc-ref outputs "gui"))
-                    (strip-store-dir (lambda (path)
-                                       (substring path (string-prefix-length out path)))))
-               (for-each
-                (lambda (file)
-                  (mkdir-p (string-append gui (dirname file)))
-                  (rename-file (string-append out file)
-                               (string-append gui file)))
-                (append '("/bin/mkvtoolnix-gui"
-                          "/share/applications/org.bunkus.mkvtoolnix-gui.desktop"
-                          "/share/metainfo/org.bunkus.mkvtoolnix-gui.appdata.xml"
-                          "/share/mime/packages/org.bunkus.mkvtoolnix-gui.xml")
-                        (map strip-store-dir (find-files out "\\.ogg$"))
-                        (map strip-store-dir (find-files out "mkvtoolnix-gui\\.png$"))
-                        (map strip-store-dir (find-files out "mkvtoolnix-gui\\.1"))))
-               (for-each
-                (lambda (file)
-                  (delete-file-recursively (string-append out file)))
-                '("/share/applications"
-                  "/share/metainfo"
-                  "/share/mime"
-                  "/share/mkvtoolnix")))
-             #t)))))
+     (list
+      #:configure-flags
+      #~(list (string-append "--with-boost="
+                             #$(this-package-input "boost"))
+              (string-append "--with-docbook-xsl-root="
+                             #$(this-package-native-input "docbook-xsl")
+                             "/xml/xsl/docbook-xsl-"
+                             #$(package-version
+                                (this-package-native-input "docbook-xsl")))
+              "--enable-update-check=no"
+              "--enable-precompiled-headers=no")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-utfcpp-include
+            (lambda _
+              (substitute* "src/common/strings/utf8.cpp"
+                (("<utf8.h>")
+                 "<utf8cpp/utf8.h>"))))
+          (add-after 'unpack 'patch-relative-file-names
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out")))
+                (substitute* "src/mkvtoolnix-gui/util/settings.cpp"
+                  (("mkvmerge" match)
+                   (string-append out "/bin/" match))) #t)))
+          (add-before 'configure 'add-googletest
+            (lambda* (#:key inputs #:allow-other-keys)
+              (symlink (search-input-directory inputs
+                                               "/include/gtest")
+                       "lib/gtest")))
+          (replace 'build
+            (lambda _
+              (let ((-j (list "-j"
+                              (number->string (parallel-job-count)))))
+                (apply invoke "rake" -j))))
+          (replace 'check
+            (lambda _
+              (invoke "rake" "tests/unit")))
+          (replace 'install
+            (lambda _
+              (invoke "rake" "install")))
+          (add-after 'install 'post-install
+            (lambda* (#:key outputs #:allow-other-keys)
+              ;; Move the Qt interface to "gui".
+              (let* ((out (assoc-ref outputs "out"))
+                     (gui (assoc-ref outputs "gui"))
+                     (strip-store-dir (lambda (path)
+                                        (substring path
+                                                   (string-prefix-length
+                                                    out path)))))
+                (for-each (lambda (file)
+                            (mkdir-p (string-append gui
+                                                    (dirname
+                                                     file)))
+                            (rename-file (string-append out file)
+                                         (string-append gui file)))
+                          (append '("/bin/mkvtoolnix-gui"
+                                    "/share/applications/org.bunkus.mkvtoolnix-gui.desktop"
+                                    "/share/metainfo/org.bunkus.mkvtoolnix-gui.appdata.xml"
+                                    "/share/mime/packages/org.bunkus.mkvtoolnix-gui.xml")
+                                  (map strip-store-dir
+                                       (find-files out "\\.ogg$"))
+                                  (map strip-store-dir
+                                       (find-files out
+                                                   "mkvtoolnix-gui\\.png$"))
+                                  (map strip-store-dir
+                                       (find-files out
+                                                   "mkvtoolnix-gui\\.1"))))
+                (for-each (lambda (file)
+                            (delete-file-recursively
+                             (string-append out file)))
+                          '("/share/applications"
+                            "/share/metainfo" "/share/mime"
+                            "/share/mkvtoolnix"))))))))
     (home-page "https://mkvtoolnix.download")
     (synopsis "Tools to create, alter and inspect Matroska files")
     (description
@@ -1505,14 +1516,14 @@ SMPTE 314M.")
 (define-public libmatroska
   (package
     (name "libmatroska")
-    (version "1.6.3")
+    (version "1.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.matroska.org/downloads/"
                            "libmatroska/libmatroska-" version ".tar.xz"))
        (sha256
-        (base32 "06h81sxyz2riic0gpzik6ffcnq32wrqphi8c6k55glcdymiimyfs"))))
+        (base32 "1cqq61qgv6x3xjzjrw71dya7lbsbrsmi9raqm2k4hgfrp0rk0ajp"))))
     (build-system cmake-build-system)
     (inputs
      (list libebml))
@@ -1657,14 +1668,14 @@ operate properly.")
 (define-public ffmpeg
   (package
     (name "ffmpeg")
-    (version "6.0")
+    (version "6.1.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "10kh2f4y4isfqj4xpcqqnzk611jh89ywcjyjnq9c2jcv5p18ggjp"))))
+                "0s7r2qv8gh2a3w568n9xxgcz0q8j5ww1jdsci1hm9f4l1yqg9146"))))
     (outputs '("out" "debug"))
     (build-system gnu-build-system)
     (inputs
@@ -1989,6 +2000,252 @@ audio/video codec library.")
                  "--enable-static"))))
      (inputs '()))))
 
+;;; Custom ffmpeg package used by Jami, which incorporates custom patches.
+(define-public ffmpeg-jami
+  (package
+    (inherit ffmpeg)
+    (name "ffmpeg-jami")
+    (source (let ((ffmpeg-origin (package-source ffmpeg)))
+              (origin
+                (inherit ffmpeg-origin)
+                ;; These patches originate come from
+                ;; <https://review.jami.net/plugins/gitiles/jami-daemon/+/refs/heads/master/contrib/src/ffmpeg/>.
+                ;; Make sure to keep them update and/or register any new ones
+                ;; here.
+                (patches
+                 (append
+                  (origin-patches ffmpeg-origin)
+                  (search-patches
+                   "ffmpeg-jami-remove-mjpeg-log.patch"
+                   "ffmpeg-jami-change-RTCP-ratio.patch"
+                   "ffmpeg-jami-rtp_ext_abs_send_time.patch"
+                   "ffmpeg-jami-libopusdec-enable-FEC.patch"
+                   "ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch"
+                   "ffmpeg-jami-screen-sharing-x11-fix.patch"))))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments ffmpeg)
+       ((#:configure-flags _ '())
+        #~(list "--disable-static"
+                "--enable-shared"
+                "--disable-stripping"
+                ;; The following variables are configure flags used by
+                ;; ffmpeg-jami.  They're from the
+                ;; jami/daemon/contrib/src/ffmpeg/rules.mak file.  We try to
+                ;; keep it as close to the official Jami package as possible,
+                ;; to provide all the codecs and extra features that are
+                ;; expected (see:
+                ;; https://review.jami.net/plugins/gitiles/jami-daemon/+/
+                ;; refs/heads/master/contrib/src/ffmpeg/rules.mak).
+                ;; An exception are the ffnvcodec-related switches, which is
+                ;; not packaged in Guix and would not work with Mesa.
+                #$@(if (string-contains (%current-system) "linux")
+                       '("--enable-pic"
+                         "--extra-cxxflags=-fPIC"
+                         "--extra-cflags=-fPIC"
+                         "--target-os=linux"
+                         "--enable-indev=v4l2"
+                         "--enable-indev=xcbgrab"
+                         "--enable-vdpau"
+                         "--enable-hwaccel=h264_vdpau"
+                         "--enable-hwaccel=mpeg4_vdpau"
+                         "--enable-vaapi"
+                         "--enable-hwaccel=h264_vaapi"
+                         "--enable-hwaccel=mpeg4_vaapi"
+                         "--enable-hwaccel=h263_vaapi"
+                         "--enable-hwaccel=vp8_vaapi"
+                         "--enable-hwaccel=mjpeg_vaapi"
+                         "--enable-hwaccel=hevc_vaapi"
+                         "--enable-encoder=h264_vaapi"
+                         "--enable-encoder=vp8_vaapi"
+                         "--enable-encoder=mjpeg_vaapi"
+                         "--enable-encoder=hevc_vaapi")
+                       '())
+                "--disable-everything"
+                "--enable-zlib"
+                "--enable-gpl"
+                "--enable-swscale"
+                "--enable-bsfs"
+                "--disable-filters"
+                "--disable-programs"
+                "--disable-postproc"
+                "--disable-protocols"
+                "--enable-protocol=crypto"
+                "--enable-protocol=file"
+                "--enable-protocol=rtp"
+                "--enable-protocol=srtp"
+                "--enable-protocol=tcp"
+                "--enable-protocol=udp"
+                "--enable-protocol=unix"
+                "--enable-protocol=pipe"
+
+                ;; Enable muxers/demuxers.
+                "--disable-demuxers"
+                "--disable-muxers"
+                "--enable-muxer=rtp"
+                "--enable-muxer=g722"
+                "--enable-muxer=g726"
+                "--enable-muxer=g726le"
+                "--enable-muxer=h263"
+                "--enable-muxer=h264"
+                "--enable-muxer=hevc"
+                "--enable-muxer=matroska"
+                "--enable-muxer=wav"
+                "--enable-muxer=webm"
+                "--enable-muxer=ogg"
+                "--enable-muxer=pcm_s16be"
+                "--enable-muxer=pcm_s16le"
+                "--enable-demuxer=rtp"
+                "--enable-demuxer=mjpeg"
+                "--enable-demuxer=mjpeg_2000"
+                "--enable-demuxer=mpegvideo"
+                "--enable-demuxer=gif"
+                "--enable-demuxer=image_jpeg_pipe"
+                "--enable-demuxer=image_png_pipe"
+                "--enable-demuxer=image_webp_pipe"
+                "--enable-demuxer=matroska"
+                "--enable-demuxer=m4v"
+                "--enable-demuxer=mp3"
+                "--enable-demuxer=ogg"
+                "--enable-demuxer=flac"
+                "--enable-demuxer=wav"
+                "--enable-demuxer=ac3"
+                "--enable-demuxer=g722"
+                "--enable-demuxer=g723_1"
+                "--enable-demuxer=g726"
+                "--enable-demuxer=g726le"
+                "--enable-demuxer=pcm_mulaw"
+                "--enable-demuxer=pcm_alaw"
+                "--enable-demuxer=pcm_s16be"
+                "--enable-demuxer=pcm_s16le"
+                "--enable-demuxer=h263"
+                "--enable-demuxer=h264"
+                "--enable-demuxer=hevc"
+
+                ;; Enable parsers.
+                "--enable-parser=h263"
+                "--enable-parser=h264"
+                "--enable-parser=hevc"
+                "--enable-parser=mpeg4video"
+                "--enable-parser=vp8"
+                "--enable-parser=vp9"
+                "--enable-parser=opus"
+
+                ;; Encoders/decoders.
+                "--enable-encoder=adpcm_g722"
+                "--enable-decoder=adpcm_g722"
+                "--enable-encoder=adpcm_g726"
+                "--enable-decoder=adpcm_g726"
+                "--enable-encoder=adpcm_g726le"
+                "--enable-decoder=adpcm_g726le"
+                "--enable-decoder=g729"
+                "--enable-encoder=g723_1"
+                "--enable-decoder=g723_1"
+                "--enable-encoder=rawvideo"
+                "--enable-decoder=rawvideo"
+                "--enable-encoder=libx264"
+                "--enable-decoder=h264"
+                "--enable-encoder=pcm_alaw"
+                "--enable-decoder=pcm_alaw"
+                "--enable-encoder=pcm_mulaw"
+                "--enable-decoder=pcm_mulaw"
+                "--enable-encoder=mpeg4"
+                "--enable-decoder=mpeg4"
+                "--enable-encoder=libvpx_vp8"
+                "--enable-decoder=vp8"
+                "--enable-decoder=vp9"
+                "--enable-encoder=h263"
+                "--enable-encoder=h263p"
+                "--enable-decoder=h263"
+                "--enable-encoder=mjpeg"
+                "--enable-decoder=mjpeg"
+                "--enable-decoder=mjpegb"
+                "--enable-libspeex"
+                "--enable-libopus"
+                "--enable-libvpx"
+                "--enable-libx264"
+                "--enable-encoder=libspeex"
+                "--enable-decoder=libspeex"
+                "--enable-encoder=libopus"
+                "--enable-decoder=libopus"
+
+                ;; Encoders/decoders for ringtones and audio streaming.
+                "--enable-decoder=flac"
+                "--enable-decoder=vorbis"
+                "--enable-decoder=aac"
+                "--enable-decoder=ac3"
+                "--enable-decoder=eac3"
+                "--enable-decoder=mp3"
+                "--enable-decoder=pcm_u24le"
+                "--enable-decoder=pcm_u32le"
+                "--enable-decoder=pcm_u8"
+                "--enable-decoder=pcm_f16le"
+                "--enable-decoder=pcm_f32le"
+                "--enable-decoder=pcm_f64le"
+                "--enable-decoder=pcm_s16le"
+                "--enable-decoder=pcm_s24le"
+                "--enable-decoder=pcm_s32le"
+                "--enable-decoder=pcm_s64le"
+                "--enable-decoder=pcm_u16le"
+                "--enable-encoder=pcm_u8"
+                "--enable-encoder=pcm_f32le"
+                "--enable-encoder=pcm_f64le"
+                "--enable-encoder=pcm_s16le"
+                "--enable-encoder=pcm_s32le"
+                "--enable-encoder=pcm_s64le"
+
+                "--enable-decoder=pcm_s16be"
+                "--enable-decoder=pcm_s16be_planar"
+                "--enable-decoder=pcm_s16le_planar"
+                "--enable-decoder=pcm_s24be"
+                "--enable-decoder=pcm_s24le_planar"
+                "--enable-decoder=pcm_s32be"
+                "--enable-decoder=pcm_s32le_planar"
+                "--enable-decoder=pcm_s64be"
+                "--enable-decoder=pcm_s8"
+                "--enable-decoder=pcm_s8_planar"
+                "--enable-decoder=pcm_u16be"
+
+                ;; Encoders/decoders for images.
+                "--enable-encoder=gif"
+                "--enable-decoder=gif"
+                "--enable-encoder=jpegls"
+                "--enable-decoder=jpegls"
+                "--enable-encoder=ljpeg"
+                "--enable-decoder=jpeg2000"
+                "--enable-encoder=png"
+                "--enable-decoder=png"
+                "--enable-encoder=bmp"
+                "--enable-decoder=bmp"
+                "--enable-encoder=tiff"
+                "--enable-decoder=tiff"
+
+                ;; Filters.
+                "--enable-filter=scale"
+                "--enable-filter=overlay"
+                "--enable-filter=amix"
+                "--enable-filter=amerge"
+                "--enable-filter=aresample"
+                "--enable-filter=format"
+                "--enable-filter=aformat"
+                "--enable-filter=fps"
+                "--enable-filter=transpose"
+                "--enable-filter=pad"
+
+                "--enable-filter=afir"
+                "--enable-filter=split"
+                "--enable-filter=drawbox"
+                "--enable-filter=drawtext"
+                "--enable-filter=rotate"
+                "--enable-filter=loop"
+                "--enable-filter=setpts"
+                "--enable-filter=movie"
+                "--enable-filter=alphamerge"
+                "--enable-filter=boxblur"
+                "--enable-filter=lut"
+                "--enable-filter=negate"
+                "--enable-filter=colorkey"
+                "--enable-filter=transpose"))))))
+
 (define-public ffmpegthumbnailer
   (package
     (name "ffmpegthumbnailer")
@@ -3631,7 +3888,10 @@ be used for realtime video capture via Linux-specific APIs.")
              (lambda* _
                (let ((plugin-path (getenv "QT_PLUGIN_PATH")))
                  (wrap-program (string-append #$output "/bin/obs")
-                   `("QT_PLUGIN_PATH" ":" prefix (,plugin-path)))))))))
+                   `("QT_PLUGIN_PATH" ":" prefix (,plugin-path))
+                   `("LD_LIBRARY_PATH" ":" prefix
+                     (,(string-append #$(this-package-input "vlc")
+                                      "/lib"))))))))))
     (native-search-paths
      (list (search-path-specification
             (variable "OBS_PLUGINS_DIRECTORY")
diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm
index 1f7a005cb1..e301088394 100644
--- a/gnu/packages/vim.scm
+++ b/gnu/packages/vim.scm
@@ -884,6 +884,14 @@ refactor Vim in order to:
      '(#:tests? #false ;no tests
        #:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'help-cmake-find-msgpack-c
+           (lambda _
+             ;; Patch the build system so that it can find the modern
+             ;; 'msgpack-c' named pkg-config file (see:
+             ;; https://github.com/jeanguyomarch/eovim/issues/73).
+             (substitute* "cmake/Modules/FindMsgPack.cmake"
+               (("MSGPACK QUIET msgpack")
+                "MSGPACK QUIET msgpack-c msgpack"))))
          (add-after 'configure 'reference-nvim
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((nvim (search-input-file inputs "/bin/nvim")))
@@ -894,10 +902,8 @@ refactor Vim in order to:
                   (string-append start nvim))))))
          (add-before 'build 'set-home
            (lambda _ (setenv "HOME" "/tmp"))))))
-    (native-inputs
-     (list pkg-config))
-    (inputs
-     (list efl msgpack neovim))
+    (native-inputs (list pkg-config))
+    (inputs (list efl msgpack-c neovim))
     (home-page "https://github.com/jeanguyomarch/eovim/")
     (synopsis "EFL GUI for Neovim")
     (description "Graphical Neovim interface based on the @acronym{EFL, Enlightenment
diff --git a/gnu/packages/web-browsers.scm b/gnu/packages/web-browsers.scm
index 0d749dcd30..1d9b562c8b 100644
--- a/gnu/packages/web-browsers.scm
+++ b/gnu/packages/web-browsers.scm
@@ -587,7 +587,7 @@ driven and does not detract you from your daily work.")
 (define-public nyxt
   (package
     (name "nyxt")
-    (version "3.10.0")
+    (version "3.11.0")
     (source
      (origin
        (method git-fetch)
@@ -596,7 +596,7 @@ driven and does not detract you from your daily work.")
              (commit version)))
        (sha256
         (base32
-         "1rz2082kk3fdvszqmi3fgndrq205vbxl3i0x4qyli0jy3lpvjin8"))
+         "0hzkpk8kshw7afz3pryi99xz2vg3v676day0mgji3hvaazfan39p"))
        (file-name (git-file-name name version))))
     (build-system gnu-build-system)
     (arguments
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 13ae53aa8c..41295a1e90 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -46,7 +46,7 @@
 ;;; Copyright © 2020, 2022 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2020, 2021 Ryan Prior <rprior@protonmail.com>
 ;;; Copyright © 2020 Alexandru-Sergiu Marton <brown121407@posteo.ro>
-;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2021 la snesne <lasnesne@lagunposprasihopre.org>
 ;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>
@@ -6621,6 +6621,28 @@ Depending on your architecture, it only requires about 40 bytes of data per
 message stream (in a web server that is per connection).")
       (license license:expat))))
 
+(define-public llhttp
+  (package
+    (name "llhttp")
+    (version "9.1.3")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/nodejs/llhttp")
+                    (commit (string-append "release/v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1nkv64c5fs8x6n5f9f6g28w5hvg776p55cwa0f82ni548nx279s1"))))
+    (build-system cmake-build-system)
+    (arguments (list #:tests? #f))      ;FIXME: tests depend on node-mocha
+    (home-page "https://github.com/nodejs/llhttp")
+    (synopsis "Port of http_parser to llparse")
+    (description "@code{llparse} is a port of @code{http_parser} to
+@code{llparse} which aims making it more maintainable, verifiable and
+efficient where possible.")
+    (license license:expat)))
+
 (define-public python-httpretty
   (package
     (name "python-httpretty")
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index a87eb20428..bd7589b2a6 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -787,7 +787,7 @@ desktop environment.")
 (define-public icewm
   (package
     (name "icewm")
-    (version "3.4.4")
+    (version "3.4.5")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -795,7 +795,7 @@ desktop environment.")
                     version "/icewm-" version ".tar.lz"))
               (sha256
                (base32
-                "0cdsb2d45dwcr2dm4jfh0z5g6pkb0ghd4jaybxqiz74mbw5rmjhv"))))
+                "1wd5k0whh2b43a72223cy19pwc29fhrhd2dnc61fha2y5ndgw6ld"))))
     (build-system gnu-build-system)
     (native-inputs (list pkg-config))
     (inputs (list fontconfig
diff --git a/gnu/packages/xfce.scm b/gnu/packages/xfce.scm
index 73889c945e..a44a871ba2 100644
--- a/gnu/packages/xfce.scm
+++ b/gnu/packages/xfce.scm
@@ -216,7 +216,7 @@ to share commonly used Xfce widgets among the Xfce applications.")
 (define-public catfish
   (package
     (name "catfish")
-    (version "4.16.4")
+    (version "4.18.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/apps/"
@@ -224,7 +224,7 @@ to share commonly used Xfce widgets among the Xfce applications.")
                                   "/catfish-" version ".tar.bz2"))
               (sha256
                (base32
-                "1z5m9f4cj473n68rrhhbkq3x5df5k394qp4n27lqqyny6k2h2p3f"))))
+                "16cbsnki7qragwhbfs3h0ja7xg8xlf59ajxhddqm0jkmrirrpbpx"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
@@ -270,7 +270,7 @@ it to your needs by using several command line options.")
 (define-public elementary-xfce-icon-theme
   (package
     (name "elementary-xfce-icon-theme")
-    (version "0.17")
+    (version "0.18")
     (source (origin
               (method git-fetch)
               (uri
@@ -280,7 +280,7 @@ it to your needs by using several command line options.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0jlawp6rg55w5cm4d7836r660i2pnc5gkzpdjsq7w5875i85arzm"))))
+                "124bdgghkjkpcsfn9a2ad6zqy233pi9jqmv8w8a3ha6q3al2s11s"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f                      ; no check target
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index 4f85a5de8b..9624fb44aa 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -245,14 +245,14 @@ which can be read by any architecture.")
 (define-public xorgproto
   (package
     (name "xorgproto")
-    (version "2022.2")
+    (version "2023.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://xorg/individual/proto"
                                   "/xorgproto-" version ".tar.xz"))
               (sha256
                (base32
-                "17kbq1x68jl9mz69ays5c0w72lpkqi937raxk0im7y88pvrdn4sx"))))
+                "0b4c27aq25w1fccks49p020avf9jzh75kaq5qwnww51bp1yvq7xn"))))
     (build-system gnu-build-system)
     (propagated-inputs
      ;; To get util-macros in (almost?) all package inputs.
@@ -5250,7 +5250,7 @@ EGLStream families of extensions.")
 (define-public xorg-server-xwayland
   (package
     (name "xorg-server-xwayland")
-    (version "21.1.3")
+    (version "23.2.3")
     (source
      (origin
        (method url-fetch)
@@ -5258,7 +5258,7 @@ EGLStream families of extensions.")
                            "/xserver/xwayland-" version ".tar.xz"))
        (sha256
         (base32
-         "18pqvg76grbsyxa3mm3j06i1l8cwb28nbn2gcnqpsk7x75zpbhpb"))))
+         "00p30yyikh7h9xsqgir66xb06pspgjlibv1mi0n42irc4fkrm7gb"))))
     (inputs (list font-dejavu
                   dbus
                   egl-wayland
@@ -5268,6 +5268,7 @@ EGLStream families of extensions.")
                   libepoxy
                   libgcrypt
                   libtirpc
+                  libxcvt
                   libxfont2
                   libxkbfile
                   pixman
@@ -5283,6 +5284,7 @@ EGLStream families of extensions.")
                                  wayland
                                  wayland-protocols)
                            '())))
+    (properties '((upstream-name . "xwayland")))
     (build-system meson-build-system)
     (arguments
      `(#:configure-flags
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 6539bfd6ce..60388a22dd 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -1798,9 +1798,9 @@ archive' public keys, with GUIX."
   (chroot-directories guix-configuration-chroot-directories ;list of file-like/strings
                       (default '()))
   (max-silent-time  guix-configuration-max-silent-time ;integer
-                    (default 0))
+                    (default 3600))
   (timeout          guix-configuration-timeout    ;integer
-                    (default 0))
+                    (default (* 3600 24)))
   (log-compression  guix-configuration-log-compression
                     (default 'gzip))
   (discover?        guix-configuration-discover?
diff --git a/gnu/services/messaging.scm b/gnu/services/messaging.scm
index 7505810e7c..9702170b3e 100644
--- a/gnu/services/messaging.scm
+++ b/gnu/services/messaging.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017, 2018 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
-;;; Copyright © 2015, 2017-2020, 2022, 2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2017-2020, 2022-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Pierre-Antoine Rouby <contact@parouby.fr>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -857,39 +857,24 @@ string, you could instantiate a prosody service like this:
               ;; on 'networking'.
               (requirement '(user-processes networking))
 
-              (start #~(if (defined? 'make-inetd-constructor)
-
-                           (make-inetd-constructor
-                            (list #$bitlbee* "-I" "-c" #$conf)
-                            (list (endpoint
-                                   (addrinfo:addr
-                                    (car (getaddrinfo #$interface
-                                                      #$(number->string port)
-                                                      (logior AI_NUMERICHOST
-                                                              AI_NUMERICSERV))))))
-                            #:requirements '#$requirement
-                            #:service-name-stem "bitlbee"
-                            #:user "bitlbee" #:group "bitlbee"
-
-                            ;; Allow 'bitlbee-purple' to use libpurple plugins.
-                            #:environment-variables
-                            (list (string-append "PURPLE_PLUGIN_PATH="
-                                                 #$plugins "/lib/purple-2")
-                                  "GUIX_LOCPATH=/run/current-system/locale"))
-
-                           (make-forkexec-constructor
-                            (list #$(file-append bitlbee "/sbin/bitlbee")
-                                  "-n" "-F" "-u" "bitlbee" "-c" #$conf)
-
-                            ;; Allow 'bitlbee-purple' to use libpurple plugins.
-                            #:environment-variables
-                            (list (string-append "PURPLE_PLUGIN_PATH="
-                                                 #$plugins "/lib/purple-2"))
-
-                            #:pid-file "/var/run/bitlbee.pid")))
-              (stop  #~(if (defined? 'make-inetd-destructor)
-                           (make-inetd-destructor)
-                           (make-kill-destructor)))))))))
+              (start #~(make-inetd-constructor
+                        (list #$bitlbee* "-I" "-c" #$conf)
+                        (list (endpoint
+                               (addrinfo:addr
+                                (car (getaddrinfo #$interface
+                                                  #$(number->string port)
+                                                  (logior AI_NUMERICHOST
+                                                          AI_NUMERICSERV))))))
+                        #:requirements '#$requirement
+                        #:service-name-stem "bitlbee"
+                        #:user "bitlbee" #:group "bitlbee"
+
+                        ;; Allow 'bitlbee-purple' to use libpurple plugins.
+                        #:environment-variables
+                        (list (string-append "PURPLE_PLUGIN_PATH="
+                                             #$plugins "/lib/purple-2")
+                              "GUIX_LOCPATH=/run/current-system/locale")))
+              (stop  #~(make-inetd-destructor))))))))
 
 (define %bitlbee-accounts
   ;; User group and account to run BitlBee.
diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index e9d3a631c2..5ebac129ce 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013-2016, 2018-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013-2016, 2018-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
@@ -183,7 +183,6 @@ DEFAULT is given, use it as the service's default value."
 (define %default-modules
   ;; Default set of modules visible in a service's file.
   `((shepherd service)
-    (oop goops)
     ((guix build utils) #:hide (delete))
     (guix build syscalls)))
 
@@ -300,10 +299,10 @@ stored."
                  #~(begin
                      (use-modules #$@(shepherd-service-modules service))
 
-                     (make <service>
-                       #:docstring '#$(shepherd-service-documentation service)
-                       #:provides '#$(shepherd-service-provision service)
-                       #:requires '#$(shepherd-service-requirement service)
+                     (service
+                      '#$(shepherd-service-provision service)
+                       #:documentation '#$(shepherd-service-documentation service)
+                       #:requirement '#$(shepherd-service-requirement service)
 
                        ;; The 'one-shot?' slot is new in Shepherd 0.6.0.
                        ;; Older versions ignore it.
@@ -313,7 +312,7 @@ stored."
                        #:start #$(shepherd-service-start service)
                        #:stop #$(shepherd-service-stop service)
                        #:actions
-                       (make-actions
+                       (actions
                         #$@(map (match-lambda
                                   (($ <shepherd-action> name proc doc)
                                    #~(#$name #$doc #$proc)))
@@ -338,7 +337,6 @@ and return the resulting '.go' file. SHEPHERD is used as shepherd package."
 
                          ;; Do the same as the Shepherd's 'load-in-user-module'.
                          (let ((env (make-fresh-user-module)))
-                           (module-use! env (resolve-interface '(oop goops)))
                            (module-use! env (resolve-interface '(shepherd service)))
                            (with-target #$(or target #~%host-type)
                              (lambda _
@@ -371,17 +369,6 @@ as shepherd package."
           (use-modules (srfi srfi-34)
                        (system repl error-handling))
 
-          (define (call-with-file file flags proc)
-            (let ((port #f))
-              (dynamic-wind
-                (lambda ()
-                  (set! port (open file flags)))
-                (lambda ()
-                  (proc port))
-                (lambda ()
-                  (close-port port)
-                  (set! port #f)))))
-
           ;; There's code run from shepherd that uses 'call-with-input-file' &
           ;; co.--e.g., the 'urandom-seed' service.  Starting from Shepherd
           ;; 0.9.2, users need to make sure not to leak non-close-on-exec file
@@ -389,12 +376,12 @@ as shepherd package."
           ;; standard bindings with O_CLOEXEC variants.
           (set! call-with-input-file
                 (lambda (file proc)
-                  (call-with-file file (logior O_RDONLY O_CLOEXEC)
-                                  proc)))
+                  (call-with-port (open file (logior O_RDONLY O_CLOEXEC))
+                    proc)))
           (set! call-with-output-file
                 (lambda (file proc)
-                  (call-with-file file (logior O_WRONLY O_CREAT O_CLOEXEC)
-                                  proc)))
+                  (call-with-port (open file (logior O_WRONLY O_CREAT O_CLOEXEC))
+                    proc)))
 
           ;; Specify the default environment visible to all the services.
           ;; Without this statement, all the environment variables of PID 1
@@ -412,25 +399,17 @@ as shepherd package."
           ;; than a kernel panic.
           (call-with-error-handling
             (lambda ()
-              (apply register-services
-                     (parameterize ((current-warning-port
-                                     (%make-void-port "w")))
-                       (map load-compiled '#$(map scm->go files))))))
+              (register-services
+               (parameterize ((current-warning-port
+                               (%make-void-port "w")))
+                 (map load-compiled '#$(map scm->go files))))))
 
           (format #t "starting services...~%")
           (let ((services-to-start
                  '#$(append-map shepherd-service-provision
                                 (filter shepherd-service-auto-start?
                                         services))))
-            (if (defined? 'start-in-the-background)
-                (start-in-the-background services-to-start)
-                (for-each (lambda (service)       ;pre-0.9.0 compatibility
-                            (guard (c ((service-error? c)
-                                       (format (current-error-port)
-                                               "failed to start service '~a'~%"
-                                               service)))
-                              (start service)))
-                          services-to-start))
+            (start-in-the-background services-to-start)
 
             ;; Hang up stdin.  At this point, we assume that 'start' methods
             ;; that required user interaction on the console (e.g.,
diff --git a/gnu/services/ssh.scm b/gnu/services/ssh.scm
index 0abecd6b42..f759c5cf6e 100644
--- a/gnu/services/ssh.scm
+++ b/gnu/services/ssh.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014-2019, 2022, 2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014-2019, 2022-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;; Copyright © 2016 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
@@ -592,7 +592,10 @@ of user-name/file-like tuples."
 
   (list (shepherd-service
          (documentation "OpenSSH server.")
-         (requirement '(pam syslogd loopback))
+
+         ;; On the Hurd, this can only be started after pfinet is up, hence
+         ;; the dependency on 'networking'.
+         (requirement '(pam syslogd loopback networking))
          (provision '(ssh-daemon ssh sshd))
 
          (start #~(if #$inetd-style?
diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm
index f8cf9f25b6..1ee15ea90c 100644
--- a/gnu/services/xorg.scm
+++ b/gnu/services/xorg.scm
@@ -981,6 +981,11 @@ argument.")))
                 (lambda (pw)
                   (string-append (passwd:dir pw) "/.guix-profile"))))
 
+       (define home-profile
+         (and=> (getpw (getuid))
+                (lambda (pw)
+                  (string-append (passwd:dir pw) "/.guix-home/profile"))))
+
        ;; If we are able to find the user's profile, we can add it to
        ;; the search paths set below.  We need to do this so that D-Bus
        ;; can start services installed by the user.  This allows
@@ -988,9 +993,13 @@ argument.")))
        ;; 'evolution') to work even if those services are only available
        ;; in the user's profile.  See <https://bugs.gnu.org/35267>.
        (define profiles
-         (if user-profile
-             (list user-profile system-profile)
-             (list system-profile)))
+         (append (if home-profile
+                     (list home-profile)
+                     '())
+                 (if user-profile
+                     (list user-profile)
+                     '())
+                 (list system-profile)))
 
        (setenv "XDG_CONFIG_DIRS"
                (string-join (map (cut string-append <> "/etc/xdg") profiles)
diff --git a/gnu/system.scm b/gnu/system.scm
index cfa036556d..3cd64a5c9f 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -803,9 +803,7 @@ bookkeeping."
           %boot-service
           %hurd-startup-service
           %activation-service
-          (service shepherd-root-service-type
-                   (shepherd-configuration
-                    (shepherd shepherd-0.8)))     ;no Fibers
+          (service shepherd-root-service-type)
 
           (service user-processes-service-type)
           (account-service (append (operating-system-accounts os)
diff --git a/gnu/system/hurd.scm b/gnu/system/hurd.scm
index 3b138bef65..cbe0081382 100644
--- a/gnu/system/hurd.scm
+++ b/gnu/system/hurd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2020-2022 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020-2023 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -70,7 +70,7 @@
   ;; Note: the Shepherd comes before the Hurd, not just because its duty is to
   ;; shepherd the herd, but also because we want its 'halt' and 'reboot'
   ;; commands to take precedence.
-  (list shepherd-0.8 hurd netdde bash coreutils file findutils grep sed
+  (list shepherd-0.10 hurd netdde bash coreutils file findutils grep sed
         diffutils patch gawk tar gzip bzip2 xz lzip
         guile-3.0-latest guile-colorized guile-readline
         net-base nss-certs inetutils less procps shadow sudo which
diff --git a/gnu/system/image.scm b/gnu/system/image.scm
index b825892232..2cc1012893 100644
--- a/gnu/system/image.scm
+++ b/gnu/system/image.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
 ;;; Copyright © 2022 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -686,7 +687,8 @@ returns an image record where the first partition's label is set to <label>."
 
 (define* (system-docker-image image
                               #:key
-                              (name "docker-image"))
+                              (name "docker-image")
+                              (archiver tar))
   "Build a docker image for IMAGE.  NAME is the base name to use for the
 output file."
   (define boot-program
@@ -731,6 +733,7 @@ output file."
               (use-modules (guix docker)
                            (guix build utils)
                            (gnu build image)
+                           (srfi srfi-1)
                            (srfi srfi-19)
                            (guix build store-copy)
                            (guix store database))
@@ -754,18 +757,30 @@ output file."
                                            #:register-closures? #$register-closures?
                                            #:deduplicate? #f
                                            #:system-directory #$os)
-                (build-docker-image
-                 #$output
-                 (cons* image-root
-                        (map store-info-item
-                             (call-with-input-file #$graph
-                               read-reference-graph)))
-                 #$os
-                 #:entry-point '(#$boot-program #$os)
-                 #:compressor '(#+(file-append gzip "/bin/gzip") "-9n")
-                 #:creation-time (make-time time-utc 0 1)
-                 #:system #$image-target
-                 #:transformations `((,image-root -> ""))))))))
+                (when #$(image-max-layers image)
+                  (setenv "PATH"
+                          (string-join (list #+(file-append archiver "/bin")
+                                             #+(file-append gzip "/bin"))
+                                       ":")))
+                (apply build-docker-image
+                       (append (list #$output
+                                     (append (if #$(image-max-layers image)
+                                                 '()
+                                                 (list image-root))
+                                             (map store-info-item
+                                                  (call-with-input-file #$graph
+                                                    read-reference-graph)))
+                                     #$os
+                                     #:entry-point '(#$boot-program #$os)
+                                     #:compressor
+                                     '(#+(file-append gzip "/bin/gzip") "-9n")
+                                     #:creation-time (make-time time-utc 0 1)
+                                     #:system #$image-target
+                                     #:transformations `((,image-root -> "")))
+                               (if #$(image-max-layers image)
+                                   (list #:root-system image-root
+                                         #:max-layers #$(image-max-layers image))
+                                   '()))))))))
 
     (computed-file name builder
                    ;; Allow offloading so that this I/O-intensive process
diff --git a/gnu/tests/data/jami-dummy-account.dat b/gnu/tests/data/jami-dummy-account.dat
index 0e908396ca..c2c5357189 100644
--- a/gnu/tests/data/jami-dummy-account.dat
+++ b/gnu/tests/data/jami-dummy-account.dat
@@ -1,8 +1,7 @@
 ;;; -*- mode: scheme; -*-
 ;;; JSON extracted from an actual Jami account and processed with
 ;;; Emacs/guile-json.
-(define %jami-account-content-sexp
-  '(("RINGCAKEY" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3F\
+(("RINGCAKEY" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3F\
 oa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRQzBxWUozSkYvTzhQRGEKRnUwRnpRcHBCaD\
 gybGJMdURrNTlVU0I0MUJSaS9kdDZGV1BRN29YOVpsY25vNGZzM2dmUHQ0dU1hRVBkVFBGKwowbGN2Q\
 jc2cytQTEFlcjlOZGpVQzQ2ZXp0UnNiNE9aQXc4ZUk1M3EwSU04QWJFd0o0ZjllLzBmQUFueHgrK3Qw\
@@ -58,7 +57,7 @@ TUNPaHdxN21xYXRUVnNrawpTRDNySmkrTFR6a2Y4OEx1bjZZNjdiaFNOTWpKZkFaUXNQc0FTRkJBUTJ\
 rQnE5alRLZGVuaU4yYTJIbm0xNCtrCnJDeU9ZVE14Q2hQbWNpS25pVy9MWnFUL0U1dlNRUGdBVzc0dT\
 VLazJoSjRBajNjRW9NVEwxSytZbStWYWh2U0cKTi8xOFdYQ1JRQkg1d0p2eXJYczBtT29GQlRnTWg4d\
 z0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=")
-    ("ringAccountKey" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRUUlCQURBTk\
+ ("ringAccountKey" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRUUlCQURBTk\
 Jna3Foa2lHOXcwQkFRRUZBQVNDQ1Nzd2dna25BZ0VBQW9JQ0FRRDNCdDRnOUVUdk9EVnYKM3hWV0ZlS\
 1Nnbk5uVEF3S2dYa3IrQ1FhdU8vTGZWM01RenNSNHliL3hoaWhhb1Z2c2FtZ3ZRU1haL0M1R3I5QQpE\
 YlAxbHNHclRCK1pXMC9uMXVEb3hmVWdZRWY3SGtVanJtdVFjUGlFWGlUVkNiY002U0NzdVNrMnRxdE1\
@@ -114,7 +113,7 @@ KMTlPd09oZ1lGcjFheGQvNXd2VgpURjNoVlQwbFZGN2RyRC9iMHZOcmxnbUNjbEk4UDg1a2dkRUhZbG\
 ZtTFoxeXJIMkNXVy9SS0lsWk9ZdFVuNFNpCkp5a2VlNDROWElXU3ovalRBdFRta3VQTzRvUjF5d3dRc\
 jdhUTF5a3hRVm9rVm5vY2xqU0tyQlk4R294a0I0eDIKUDNrb3F1UnkvcUd3QzBnN1o4ZjBTQjNQZVZt\
 eQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==")
-    ("ringAccountCert" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXakNDQTBLZ\
+ ("ringAccountCert" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXakNDQTBLZ\
 0F3SUJBZ0lJRm1tNmZuaWRndEl3RFFZSktvWklodmNOQVFFTUJRQXdUREVRTUE0R0ExVUUKQXhNSFNt\
 RnRhU0JEUVRFNE1EWUdDZ21TSm9tVDhpeGtBUUVUS0RjNVpqSTJaVFZpWTJNeU9EWXlPREppT0dFMwp\
 PRFF6TUdOak1EWXpNakV4T1RFNFkyWm1PVGd3SGhjTk1qRXdOREUyTVRjek1qRXdXaGNOTXpFd05ERT\
@@ -180,17 +179,17 @@ OFY2cWM2bXZTbUFXa25nL3QwaStXVmdGVkZuZFQrQ0oyNTJsa0ZacGljdAp6ekdETW44VUNDRUp4TDR\
 KTklTM2lLOUhlRys2MlZuay9QOEM3YVpLSXpVdjFud25rcVdUUUFYWDBKckJGdDdICjI5ZDk1RElmRT\
 RuT0FyS0JFNHc2Z1R4SU1uZzVzWi9ZbDFjcG5wUHlsR3VICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tL\
 S0K")
-    ("ethKey" . "fN8cOT1lYNziaW0+pjBIgZ8r6+zMMhHsukkWBNPDsFo=")
-    ("TURN.username" . "ring")
-    ("TURN.server" . "turn.jami.net")
-    ("TURN.realm" . "ring")
-    ("TURN.password" . "ring")
-    ("TURN.enable" . "true")
-    ("TLS.verifyServer" . "true")
-    ("TLS.verifyClient" . "true")
-    ("TLS.serverName" . "")
-    ("TLS.requireClientCertificate" . "true")
-    ("TLS.privateKeyFile" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQU\
+ ("ethKey" . "fN8cOT1lYNziaW0+pjBIgZ8r6+zMMhHsukkWBNPDsFo=")
+ ("TURN.username" . "ring")
+ ("TURN.server" . "turn.jami.net")
+ ("TURN.realm" . "ring")
+ ("TURN.password" . "ring")
+ ("TURN.enable" . "true")
+ ("TLS.verifyServer" . "true")
+ ("TLS.verifyClient" . "true")
+ ("TLS.serverName" . "")
+ ("TLS.requireClientCertificate" . "true")
+ ("TLS.privateKeyFile" . "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQU\
 RBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRQzM5b1Z0cXNtUGdaSUgKcHpTV\
 GtlT3BlWC9CSEx2KzFTYnJPSFpVRHEwNFZCUU5BNmJmSFNSWTJpbHE1WEVheXNVSmwzQmsvM0txZEhS\
 cQpEV01wQ1dpcE1Vc2FwSGxJR0tSWHEwbXhQZ29WODZSUVBub1dCRTdhWVVEZTlJZXlxMmllZXpDK1l\
@@ -246,11 +245,11 @@ mNUloSWU0RUtZUE5VUXNua0tSVTlxUApzWi9idXBXc2w4bWVFcko3bllJQ05ucHpnSHRpNXdSMlliVF\
 VXT01odmRFUldxMnhTV3BBYmtNMElhZDBUc05kCmUrYVRQVmJOMXFibFZLMm1qUTl2YS9JSkVuSE51V\
 E9TREtJeUpvcVArQkxiRTVjQU5acXQ2OFFadWdOc2RxNHkKV2FoeStydU5LS1F3Mk5MYzQzZUtsNmxv\
 bXdtRlFZOD0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=")
-    ("TLS.password" . "")
-    ("TLS.negotiationTimeoutSec" . "-1")
-    ("TLS.method" . "Automatic")
-    ("TLS.ciphers" . "")
-    ("TLS.certificateFile" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQ\
+ ("TLS.password" . "")
+ ("TLS.negotiationTimeoutSec" . "-1")
+ ("TLS.method" . "Automatic")
+ ("TLS.ciphers" . "")
+ ("TLS.certificateFile" . "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQ\
 XdHZ0F3SUJBZ0lJU1pUdlZPQnh3akF3RFFZSktvWklodmNOQVFFTUJRQXdTVEVOTUFzR0ExVUUKQXhN\
 RVNtRnRhVEU0TURZR0NnbVNKb21UOGl4a0FRRVRLR1l6TXpRMVpqSTNOelZrWkdabE1EZGhOR0l3WkR\
 rMQpaR0ZsWVRFeE1XUXhOV1ppWXpFeE9Ua3dIaGNOTWpFd05ERTJNVGN6TWpFd1doY05NekV3TkRFME\
@@ -346,47 +345,47 @@ lzVXFsVHVncXhtM2xDOUhzaDM2UFJLNURDUG93eHVUNlgKcXo1M1ZiN2h6TkxLelpiRlJzbUdFOFY2c\
 WM2bXZTbUFXa25nL3QwaStXVmdGVkZuZFQrQ0oyNTJsa0ZacGljdAp6ekdETW44VUNDRUp4TDRKTklT\
 M2lLOUhlRys2MlZuay9QOEM3YVpLSXpVdjFud25rcVdUUUFYWDBKckJGdDdICjI5ZDk1RElmRTRuT0F\
 yS0JFNHc2Z1R4SU1uZzVzWi9ZbDFjcG5wUHlsR3VICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K")
-    ("STUN.server" . "")
-    ("STUN.enable" . "false")
-    ("SRTP.rtpFallback" . "false")
-    ("SRTP.keyExchange" . "sdes")
-    ("SRTP.enable" . "true")
-    ("RingNS.uri" . "")
-    ("RingNS.account" . "0790738ce15fa05933b49dd77034312787da86c3")
-    ("DHT.PublicInCalls" . "true")
-    ("Account.videoPortMin" . "49152")
-    ("Account.videoPortMax" . "65534")
-    ("Account.videoEnabled" . "true")
-    ("Account.username" . "f3345f2775ddfe07a4b0d95daea111d15fbc1199")
-    ("Account.useragent" . "")
-    ("Account.upnpEnabled" . "true")
-    ("Account.type" . "RING")
-    ("Account.ringtoneEnabled" . "true")
-    ("Account.rendezVous" . "true")
-    ("Account.publishedSameAsLocal" . "true")
-    ("Account.publishedPort" . "5060")
-    ("Account.publishedAddress" . "")
-    ("Account.presenceSubscribeSupported" . "true")
-    ("Account.peerDiscovery" . "false")
-    ("Account.managerUsername" . "")
-    ("Account.managerUri" . "")
-    ("Account.mailbox" . "")
-    ("Account.localModeratorsEnabled" . "true")
-    ("Account.localInterface" . "default")
-    ("Account.hostname" . "bootstrap.jami.net")
-    ("Account.hasCustomUserAgent" . "false")
-    ("Account.enable" . "true")
-    ("Account.dtmfType" . "overrtp")
-    ("Account.displayName" . "dummy")
-    ("Account.defaultModerators" . "")
-    ("Account.audioPortMin" . "16384")
-    ("Account.audioPortMax" . "32766")
-    ("Account.archiveHasPassword" . "false")
-    ("Account.allowCertFromTrusted" . "true")
-    ("Account.allowCertFromHistory" . "true")
-    ("Account.allowCertFromContact" . "true")
-    ("Account.allModeratorEnabled" . "true")
-    ("Account.alias" . "dummy")
-    ("Account.activeCallLimit" . "-1")
-    ("Account.accountPublish" . "false")
-    ("Account.accountDiscovery" . "false")))
+ ("STUN.server" . "")
+ ("STUN.enable" . "false")
+ ("SRTP.rtpFallback" . "false")
+ ("SRTP.keyExchange" . "sdes")
+ ("SRTP.enable" . "true")
+ ("RingNS.uri" . "")
+ ("RingNS.account" . "0790738ce15fa05933b49dd77034312787da86c3")
+ ("DHT.PublicInCalls" . "true")
+ ("Account.videoPortMin" . "49152")
+ ("Account.videoPortMax" . "65534")
+ ("Account.videoEnabled" . "true")
+ ("Account.username" . "f3345f2775ddfe07a4b0d95daea111d15fbc1199")
+ ("Account.useragent" . "")
+ ("Account.upnpEnabled" . "true")
+ ("Account.type" . "RING")
+ ("Account.ringtoneEnabled" . "true")
+ ("Account.rendezVous" . "true")
+ ("Account.publishedSameAsLocal" . "true")
+ ("Account.publishedPort" . "5060")
+ ("Account.publishedAddress" . "")
+ ("Account.presenceSubscribeSupported" . "true")
+ ("Account.peerDiscovery" . "false")
+ ("Account.managerUsername" . "")
+ ("Account.managerUri" . "")
+ ("Account.mailbox" . "")
+ ("Account.localModeratorsEnabled" . "true")
+ ("Account.localInterface" . "default")
+ ("Account.hostname" . "bootstrap.jami.net")
+ ("Account.hasCustomUserAgent" . "false")
+ ("Account.enable" . "true")
+ ("Account.dtmfType" . "overrtp")
+ ("Account.displayName" . "dummy")
+ ("Account.defaultModerators" . "")
+ ("Account.audioPortMin" . "16384")
+ ("Account.audioPortMax" . "32766")
+ ("Account.archiveHasPassword" . "false")
+ ("Account.allowCertFromTrusted" . "true")
+ ("Account.allowCertFromHistory" . "true")
+ ("Account.allowCertFromContact" . "true")
+ ("Account.allModeratorEnabled" . "true")
+ ("Account.alias" . "dummy")
+ ("Account.activeCallLimit" . "-1")
+ ("Account.accountPublish" . "false")
+ ("Account.accountDiscovery" . "false"))
diff --git a/gnu/tests/docker.scm b/gnu/tests/docker.scm
index edc9804414..9e9d2e2d07 100644
--- a/gnu/tests/docker.scm
+++ b/gnu/tests/docker.scm
@@ -212,7 +212,7 @@ inside %DOCKER-OS."
     (virtual-machine
      (operating-system os)
      (volatile? #f)
-     (disk-image-size (* 5500 (expt 2 20)))
+     (disk-image-size (* 6000 (expt 2 20)))
      (memory-size 2048)
      (port-forwardings '())))
 
diff --git a/gnu/tests/telephony.scm b/gnu/tests/telephony.scm
index f7d9c73767..f03ea963f7 100644
--- a/gnu/tests/telephony.scm
+++ b/gnu/tests/telephony.scm
@@ -38,7 +38,10 @@
 ;;; Jami daemon.
 ;;;
 
-(include "data/jami-dummy-account.dat") ;defines %jami-account-content-sexp
+(define %jami-account-content-sexp
+  (call-with-input-file
+      (search-path %load-path "gnu/tests/data/jami-dummy-account.dat")
+    read))
 
 (define %dummy-jami-account-archive
   ;; A Jami account archive is a gzipped JSON file.
@@ -391,7 +394,7 @@ jami account used as part of the jami configuration are left *unspecified*."
    (description "Provisioning test for the jami service.")
    (value (run-jami-test #:provisioning? #t))))
 
-;;; Thi test verifies that <jami-account> values can be left unspecified
+;;; This test verifies that <jami-account> values can be left unspecified
 ;;; without causing any issue (see: https://issues.guix.gnu.org/56799).
 (define %test-jami-provisioning-partial
   (system-test
diff --git a/gnu/tests/virtualization.scm b/gnu/tests/virtualization.scm
index f3655f1d8a..6ca88cbacd 100644
--- a/gnu/tests/virtualization.scm
+++ b/gnu/tests/virtualization.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
-;;; Copyright © 2020-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com>
 ;;; Copyright © 2022 Marius Bakke <marius@gnu.org>
@@ -277,6 +277,7 @@
               (let ((session (make-session #:user "test"
                                            #:port 10022
                                            #:host "localhost"
+                                           #:timeout 120
                                            #:log-verbosity 'rare)))
                 (match (connect! session)
                   ('ok
diff --git a/guix/build-system/zig.scm b/guix/build-system/zig.scm
index 215178ceb4..1fa4782a2e 100644
--- a/guix/build-system/zig.scm
+++ b/guix/build-system/zig.scm
@@ -83,6 +83,79 @@
                       #:system system
                       #:guile-for-build guile)))
 
+(define* (zig-cross-build name
+                          #:key
+                          source target
+                          build-inputs target-inputs host-inputs
+                          (phases '%standard-phases)
+                          (outputs '("out"))
+                          (search-paths '())
+                          (native-search-paths '())
+                          (tests? #t)
+                          (test-target #f)
+                          (zig-build-flags ''())
+                          (zig-test-flags ''())
+                          (zig-destdir "out")
+                          (zig-test-destdir "test-out")
+                          (zig-release-type #f)
+                          (system (%current-system))
+                          (guile #f)
+                          (imported-modules %zig-build-system-modules)
+                          (modules '((guix build zig-build-system)
+                                     (guix build utils))))
+  "Build SOURCE using Zig, and with INPUTS."
+  (define builder
+    (with-imported-modules imported-modules
+      #~(begin
+          (use-modules #$@(sexp->gexp modules))
+
+          (define %build-host-inputs
+            #+(input-tuples->gexp build-inputs))
+
+          (define %build-target-inputs
+            (append #$(input-tuples->gexp host-inputs)
+              #+(input-tuples->gexp target-inputs)))
+
+          (define %build-inputs
+            (append %build-host-inputs %build-target-inputs))
+
+          (define %outputs
+            #$(outputs->gexp outputs))
+
+          (zig-build #:name #$name
+                     #:source #+source
+                     #:system #$system
+                     #:phases #$phases
+                     #:outputs %outputs
+                     #:target #$target
+                     #:test-target #$test-target
+                     #:inputs %build-target-inputs
+                     #:native-inputs %build-host-inputs
+                     #:search-paths '#$(map search-path-specification->sexp
+                                            search-paths)
+                     #:native-search-paths '#$(map
+                                                search-path-specification->sexp
+                                                native-search-paths)
+                     #:zig-build-flags #$zig-build-flags
+                     #:zig-test-flags #$zig-test-flags
+                     #:zig-release-type #$zig-release-type
+                     #:zig-destdir #$zig-destdir
+                     #:zig-test-destdir #$zig-test-destdir
+                     #:tests? #$tests?
+                     #:search-paths '#$(sexp->gexp
+                                        (map search-path-specification->sexp
+                                             search-paths))))))
+
+  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+                                                  system #:graft? #f)))
+        (gexp->derivation name builder
+                          #:system system
+                          #:target target
+                          #:graft? #f
+                          #:substitutable? substitutable?
+                          #:guile-for-build guile)))
+
+
 (define* (lower name
                 #:key source inputs native-inputs outputs system target
                 (zig (default-zig))
@@ -93,27 +166,30 @@
   (define private-keywords
     '(#:target #:zig #:inputs #:native-inputs #:outputs))
 
-  ;; TODO: support cross-compilation
-  ;; It's as simple as adding some build flags to `zig-build-flags`
-  ;; -Dtarget=aarch64-linux-musl, for example.
-  (and (not target)
-       (bag
-         (name name)
-         (system system)
-         (target target)
-         (host-inputs `(,@(if source
-                              `(("source" ,source))
-                              '())
-                        ,@inputs
-
-                        ;; Keep the standard inputs of 'gnu-build-system'
-                        ;; TODO: do we need this?
-                        ,@(standard-packages)))
-         (build-inputs `(("zig" ,zig)
-                         ,@native-inputs))
-         (outputs outputs)
-         (build zig-build)
-         (arguments (strip-keyword-arguments private-keywords arguments)))))
+  (bag
+    (name name)
+    (system system)
+    (target target)
+    (build-inputs `(,@(if source
+                        `(("source" ,source))
+                        '())
+                    ,@`(("zig" ,zig))
+                    ,@native-inputs
+                    ,@(if target '() inputs)
+                    ,@(if target
+                        ;; Use the standard cross inputs of
+                        ;; 'gnu-build-system'.
+                        (standard-cross-packages target 'host)
+                        '())
+                    ;; Keep the standard inputs of 'gnu-build-system'.
+                    ,@(standard-packages)))
+    (host-inputs (if target inputs '()))
+    (target-inputs (if target
+                     (standard-cross-packages target 'target)
+                     '()))
+    (outputs outputs)
+    (build (if target zig-cross-build zig-build))
+    (arguments (strip-keyword-arguments private-keywords arguments))))
 
 (define zig-build-system
   (build-system
diff --git a/guix/build/zig-build-system.scm b/guix/build/zig-build-system.scm
index d414ebfb17..8352a73324 100644
--- a/guix/build/zig-build-system.scm
+++ b/guix/build/zig-build-system.scm
@@ -47,6 +47,7 @@
                 zig-build-flags
                 zig-release-type       ;; "safe", "fast" or "small" empty for a
                                        ;; debug build"
+                target
                 #:allow-other-keys)
   "Build a given Zig package."
 
@@ -56,6 +57,9 @@
                      "--prefix-lib-dir"     "lib"
                      "--prefix-exe-dir"     "bin"
                      "--prefix-include-dir" "include"
+                     ,@(if target
+                         (list (string-append "-Dtarget=" target))
+                         '())
                      ,@(if zig-release-type
                          (list (string-append "-Drelease-" zig-release-type))
                          '())
@@ -65,9 +69,10 @@
 
 (define* (check #:key tests?
                 zig-test-flags
+                target
                 #:allow-other-keys)
   "Run all the tests"
-  (when tests?
+  (when (and tests? (not target))
     (let ((old-destdir (getenv "DESTDIR")))
       (setenv "DESTDIR" "test-out") ;; Avoid colisions with the build output
       (let ((call `("zig" "build" "test"
diff --git a/guix/docker.scm b/guix/docker.scm
index 5e6460f43f..1c6f59568f 100644
--- a/guix/docker.scm
+++ b/guix/docker.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2017, 2018, 2019, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,16 +30,27 @@
                           with-directory-excursion
                           invoke))
   #:use-module (gnu build install)
+  #:use-module ((guix build store-copy)
+                #:select (file-size))
   #:use-module (json)                             ;guile-json
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-19)
   #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-71)
   #:use-module ((texinfo string-utils)
                 #:select (escape-special-chars))
   #:use-module (rnrs bytevectors)
   #:use-module (ice-9 ftw)
   #:use-module (ice-9 match)
-  #:export (build-docker-image))
+  #:export (%docker-image-max-layers
+            build-docker-image))
+
+;; The maximum number of layers allowed in a Docker image is typically around
+;; 128, although it may vary depending on the Docker daemon. However, we
+;; recommend setting the limit to 100 to ensure sufficient room for future
+;; extensions.
+(define %docker-image-max-layers
+  #f)
 
 ;; Generate a 256-bit identifier in hexadecimal encoding for the Docker image.
 (define docker-id
@@ -92,12 +104,12 @@ Return a version of TAG that follows these rules."
                       (make-string (- min-length l) padding-character)))
       (_ normalized-name))))
 
-(define* (manifest path id #:optional (tag "guix"))
+(define* (manifest path layers #:optional (tag "guix"))
   "Generate a simple image manifest."
   (let ((tag (canonicalize-repository-name tag)))
     `#(((Config . "config.json")
         (RepoTags . #(,(string-append tag ":latest")))
-        (Layers . #(,(string-append id "/layer.tar")))))))
+        (Layers . ,(list->vector layers))))))
 
 ;; According to the specifications this is required for backwards
 ;; compatibility.  It duplicates information provided by the manifest.
@@ -106,8 +118,8 @@ Return a version of TAG that follows these rules."
   `((,(canonicalize-repository-name tag) . ((latest . ,id)))))
 
 ;; See https://github.com/opencontainers/image-spec/blob/master/config.md
-(define* (config layer time arch #:key entry-point (environment '()))
-  "Generate a minimal image configuration for the given LAYER file."
+(define* (config layers-diff-ids time arch #:key entry-point (environment '()))
+  "Generate a minimal image configuration for the given LAYERS files."
   ;; "architecture" must be values matching "platform.arch" in the
   ;; runtime-spec at
   ;; https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc2/config.md#platform
@@ -125,7 +137,7 @@ Return a version of TAG that follows these rules."
     (container_config . #nil)
     (os . "linux")
     (rootfs . ((type . "layers")
-               (diff_ids . #(,(layer-diff-id layer)))))))
+               (diff_ids . ,(list->vector layers-diff-ids))))))
 
 (define directive-file
   ;; Return the file or directory created by a 'evaluate-populate-directive'
@@ -136,6 +148,26 @@ Return a version of TAG that follows these rules."
     (('directory name _ ...)
      (string-trim name #\/))))
 
+(define (size-sorted-store-items items max-layers)
+  "Split list of ITEMS at %MAX-LAYERS and sort by disk usage."
+  (let* ((items-length (length items))
+         (head tail
+               (split-at
+                (map (match-lambda ((size . item) item))
+                     (sort (map (lambda (item)
+                                  (cons (file-size item) item))
+                                items)
+                           (lambda (item1 item2)
+                             (< (match item2 ((size . _) size))
+                                (match item1 ((size . _) size))))))
+                (if (>= items-length max-layers)
+                    (- max-layers 2)
+                    (1- items-length)))))
+    (list head tail)))
+
+(define (create-empty-tar file)
+  (invoke "tar" "-cf" file "--files-from" "/dev/null"))
+
 (define* (build-docker-image image paths prefix
                              #:key
                              (repository "guix")
@@ -146,11 +178,13 @@ Return a version of TAG that follows these rules."
                              entry-point
                              (environment '())
                              compressor
-                             (creation-time (current-time time-utc)))
-  "Write to IMAGE a Docker image archive containing the given PATHS.  PREFIX
-must be a store path that is a prefix of any store paths in PATHS.  REPOSITORY
-is a descriptive name that will show up in \"REPOSITORY\" column of the output
-of \"docker images\".
+                             (creation-time (current-time time-utc))
+                             max-layers
+                             root-system)
+  "Write to IMAGE a layerer Docker image archive containing the given PATHS.
+PREFIX must be a store path that is a prefix of any store paths in PATHS.
+REPOSITORY is a descriptive name that will show up in \"REPOSITORY\" column of
+the output of \"docker images\".
 
 When DATABASE is true, copy it to /var/guix/db in the image and create
 /var/guix/gcroots and friends.
@@ -172,7 +206,14 @@ non-empty directory, then its contents will be recursively added, as well.
 SYSTEM is a GNU triplet (or prefix thereof) of the system the binaries in
 PATHS are for; it is used to produce metadata in the image.  Use COMPRESSOR, a
 command such as '(\"gzip\" \"-9n\"), to compress IMAGE.  Use CREATION-TIME, a
-SRFI-19 time-utc object, as the creation time in metadata."
+SRFI-19 time-utc object, as the creation time in metadata.
+
+When MAX-LAYERS is not false build layered image, providing a Docker
+image with store paths splitted in their own layers to improve sharing
+between images.
+
+ROOT-SYSTEM is a directory with a provisioned root file system, which will be
+added to image as a layer."
   (define (sanitize path-fragment)
     (escape-special-chars
      ;; GNU tar strips the leading slash off of absolute paths before applying
@@ -203,6 +244,59 @@ SRFI-19 time-utc object, as the creation time in metadata."
     (if (eq? '() transformations)
         '()
         `("--transform" ,(transformations->expression transformations))))
+  (define (seal-layer)
+    ;; Add 'layer.tar' to 'image.tar' under the right name.  Return its hash.
+    (let* ((file-hash (layer-diff-id "layer.tar"))
+           (file-name (string-append file-hash "/layer.tar")))
+      (mkdir file-hash)
+      (rename-file "layer.tar" file-name)
+      (invoke "tar" "-rf" "image.tar" file-name)
+      (delete-file file-name)
+      file-hash))
+  (define layers-hashes
+    ;; Generate a tarball that includes container image layers as tarballs,
+    ;; along with a manifest.json file describing the layer and config file
+    ;; locations.
+    (match-lambda
+      (((head ...) (tail ...) id)
+       (create-empty-tar "image.tar")
+       (let* ((head-layers
+               (map
+                (lambda (file)
+                  (invoke "tar" "cf" "layer.tar" file)
+                  (seal-layer))
+                head))
+              (tail-layer
+               (begin
+                 (create-empty-tar "layer.tar")
+                 (for-each (lambda (file)
+                             (invoke "tar" "-rf" "layer.tar" file))
+                           tail)
+                 (let* ((file-hash (layer-diff-id "layer.tar"))
+                        (file-name (string-append file-hash "/layer.tar")))
+                   (mkdir file-hash)
+                   (rename-file "layer.tar" file-name)
+                   (invoke "tar" "-rf" "image.tar" file-name)
+                   (delete-file file-name)
+                   file-hash)))
+              (customization-layer
+               (let* ((file-id (string-append id "/layer.tar"))
+                      (file-hash (layer-diff-id file-id))
+                      (file-name (string-append file-hash "/layer.tar")))
+                 (mkdir file-hash)
+                 (rename-file file-id file-name)
+                 (invoke "tar" "-rf" "image.tar" file-name)
+                 file-hash))
+              (all-layers
+               (append head-layers (list tail-layer customization-layer))))
+         (with-output-to-file "manifest.json"
+           (lambda ()
+             (scm->json (manifest prefix
+                                  (map (cut string-append <> "/layer.tar")
+                                       all-layers)
+                                  repository))))
+         (invoke "tar" "-rf" "image.tar" "manifest.json")
+         all-layers))))
   (let* ((directory "/tmp/docker-image") ;temporary working directory
          (id (docker-id prefix))
          (time (date->string (time-utc->date creation-time) "~4"))
@@ -229,26 +323,39 @@ SRFI-19 time-utc object, as the creation time in metadata."
         (with-output-to-file "json"
           (lambda () (scm->json (image-description id time))))
 
-        ;; Create a directory for the non-store files that need to go into the
-        ;; archive.
-        (mkdir "extra")
+        (if root-system
+            (let ((directory (getcwd)))
+              (with-directory-excursion root-system
+                (apply invoke "tar"
+                       "-cf" (string-append directory "/layer.tar")
+                       `(,@transformation-options
+                         ,@(tar-base-options)
+                         ,@(scandir "."
+                                    (lambda (file)
+                                      (not (member file '("." "..")))))))))
+            (begin
+              ;; Create a directory for the non-store files that need to go
+              ;; into the archive.
+              (mkdir "extra")
 
-        (with-directory-excursion "extra"
-          ;; Create non-store files.
-          (for-each (cut evaluate-populate-directive <> "./")
-                    extra-files)
+              (with-directory-excursion "extra"
+                ;; Create non-store files.
+                (for-each (cut evaluate-populate-directive <> "./")
+                          extra-files)
 
-          (when database
-            ;; Initialize /var/guix, assuming PREFIX points to a profile.
-            (install-database-and-gc-roots "." database prefix))
+                (when database
+                  ;; Initialize /var/guix, assuming PREFIX points to a
+                  ;; profile.
+                  (install-database-and-gc-roots "." database prefix))
 
-          (apply invoke "tar" "-cf" "../layer.tar"
-                 `(,@transformation-options
-                   ,@(tar-base-options)
-                   ,@paths
-                   ,@(scandir "."
-                              (lambda (file)
-                                (not (member file '("." ".."))))))))
+                (apply invoke "tar" "-cf" "../layer.tar"
+                       `(,@transformation-options
+                         ,@(tar-base-options)
+                         ,@(if max-layers '() paths)
+                         ,@(scandir "."
+                                    (lambda (file)
+                                      (not (member file '("." ".."))))))))
+              (delete-file-recursively "extra")))
 
         ;; It is possible for "/" to show up in the archive, especially when
         ;; applying transformations.  For example, the transformation
@@ -261,24 +368,37 @@ SRFI-19 time-utc object, as the creation time in metadata."
         ;; error messages.
         (with-error-to-port (%make-void-port "w")
           (lambda ()
-            (system* "tar" "--delete" "/" "-f" "layer.tar")))
-
-        (delete-file-recursively "extra"))
+            (system* "tar" "--delete" "/" "-f" "layer.tar"))))
 
       (with-output-to-file "config.json"
         (lambda ()
-          (scm->json (config (string-append id "/layer.tar")
-                             time arch
-                             #:environment environment
-                             #:entry-point entry-point))))
-      (with-output-to-file "manifest.json"
-        (lambda ()
-          (scm->json (manifest prefix id repository))))
-      (with-output-to-file "repositories"
-        (lambda ()
-          (scm->json (repositories prefix id repository)))))
-
-    (apply invoke "tar" "-cf" image "-C" directory
-           `(,@(tar-base-options #:compressor compressor)
-             "."))
+          (scm->json
+           (config (if max-layers
+                       (layers-hashes
+                        (append (size-sorted-store-items paths max-layers)
+                                (list id)))
+                       (list (layer-diff-id (string-append id "/layer.tar"))))
+                   time arch
+                   #:environment environment
+                   #:entry-point entry-point))))
+      (if max-layers
+          (begin
+            (invoke "tar" "-rf" "image.tar" "config.json")
+            (if compressor
+                (begin
+                  (apply invoke `(,@compressor "image.tar"))
+                  (copy-file "image.tar.gz" image))
+                (copy-file "image.tar" image)))
+          (begin
+            (with-output-to-file "manifest.json"
+              (lambda ()
+                (scm->json (manifest prefix
+                                     (list (string-append id "/layer.tar"))
+                                     repository))))
+            (with-output-to-file "repositories"
+              (lambda ()
+                (scm->json (repositories prefix id repository))))
+            (apply invoke "tar" "-cf" image
+                   `(,@(tar-base-options #:compressor compressor)
+                     ".")))))
     (delete-file-recursively directory)))
diff --git a/guix/import/crate.scm b/guix/import/crate.scm
index 43823d006e..c57bd0bc6a 100644
--- a/guix/import/crate.scm
+++ b/guix/import/crate.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2022 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,12 +26,15 @@
 (define-module (guix import crate)
   #:use-module (guix base32)
   #:use-module (guix build-system cargo)
+  #:use-module (guix diagnostics)
   #:use-module (gcrypt hash)
   #:use-module (guix http-client)
+  #:use-module (guix i18n)
   #:use-module (guix import json)
   #:use-module (guix import utils)
   #:use-module (guix memoization)
   #:use-module (guix packages)
+  #:use-module (guix read-print)
   #:use-module (guix upstream)
   #:use-module (guix utils)
   #:use-module (gnu packages)
@@ -40,6 +44,7 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-2)
   #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-69)
   #:use-module (srfi srfi-71)
   #:export (crate->guix-package
             guix-package->crate-name
@@ -99,7 +104,7 @@
 
 ;; Autoload Guile-Semver so we only have a soft dependency.
 (module-autoload! (current-module)
-		  '(semver) '(string->semver semver->string semver<?))
+		  '(semver) '(string->semver semver->string semver<? semver=?))
 (module-autoload! (current-module)
 		  '(semver ranges) '(string->semver-range semver-range-contains?))
 
@@ -164,16 +169,18 @@ record or #f if it was not found."
         (list-matches "^(0+\\.){,2}[0-9]+" version))))
 
 (define* (make-crate-sexp #:key name version cargo-inputs cargo-development-inputs
-                          home-page synopsis description license build?)
+                          home-page synopsis description license build? yanked?)
   "Return the `package' s-expression for a rust package with the given NAME,
 VERSION, CARGO-INPUTS, CARGO-DEVELOPMENT-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION,
 and LICENSE."
   (define (format-inputs inputs)
     (map
      (match-lambda
-      ((name version)
+      ((name version yanked)
        (list (crate-name->package-name name)
-             (version->semver-prefix version))))
+             (if yanked
+                 (string-append version "-yanked")
+                 (version->semver-prefix version)))))
      inputs))
 
   (let* ((port (http-fetch (crate-uri name version)))
@@ -183,6 +190,9 @@ and LICENSE."
          (pkg `(package
                    (name ,guix-name)
                    (version ,version)
+                   ,@(if yanked?
+                         `(,(comment "; This version was yanked!\n" #t))
+                         '())
                    (source (origin
                              (method url-fetch)
                              (uri (crate-uri ,name version))
@@ -190,6 +200,9 @@ and LICENSE."
                              (sha256
                               (base32
                                ,(bytevector->nix-base32-string (port-sha256 port))))))
+                   ,@(if yanked?
+                         `((properties '((crate-version-yanked? . #t))))
+                         '())
                    (build-system cargo-build-system)
                    ,@(maybe-arguments (append (if build?
                                                  '()
@@ -206,7 +219,10 @@ and LICENSE."
                                ((license) license)
                                (_ `(list ,@license)))))))
          (close-port port)
-         (package->definition pkg (version->semver-prefix version))))
+         (package->definition pkg
+                              (if yanked?
+                                  (string-append version "-yanked")
+                                  (version->semver-prefix version)))))
 
 (define (string->license string)
   (filter-map (lambda (license)
@@ -217,13 +233,14 @@ and LICENSE."
                          'unknown-license!)))
               (string-split string (string->char-set " /"))))
 
-(define* (crate->guix-package crate-name #:key version include-dev-deps?
-                              #:allow-other-keys)
+(define* (crate->guix-package
+          crate-name
+          #:key version include-dev-deps? allow-yanked? #:allow-other-keys)
   "Fetch the metadata for CRATE-NAME from crates.io, and return the
 `package' s-expression corresponding to that package, or #f on failure.
 When VERSION is specified, convert it into a semver range and attempt to fetch
 the latest version matching this semver range; otherwise fetch the latest
-version of CRATE-NAME. If INCLUDE-DEV-DEPS is true then this will also
+version of CRATE-NAME.  If INCLUDE-DEV-DEPS is true then this will also
 look up the development dependencs for the given crate."
 
   (define (semver-range-contains-string? range version)
@@ -242,63 +259,112 @@ look up the development dependencs for the given crate."
          (or version
              (crate-latest-version crate))))
 
-  ;; find the highest existing package that fulfills the semver <range>
+  ;; Find the highest existing package that fulfills the semver <range>.
+  ;; Packages previously marked as yanked take lower priority.
   (define (find-package-version name range)
     (let* ((semver-range (string->semver-range range))
-           (versions
+           (package-versions
             (sort
-             (filter (lambda (version)
-                       (semver-range-contains? semver-range version))
+             (filter (match-lambda ((semver yanked)
+                                    (and
+                                     (or allow-yanked? (not yanked))
+                                     (semver-range-contains? semver-range semver))))
                      (map (lambda (pkg)
-                            (string->semver (package-version pkg)))
+                            (let ((version (package-version pkg)))
+                              (list
+                                (string->semver version)
+                                (assoc-ref (package-properties pkg)
+                                           'crate-version-yanked?))))
                           (find-packages-by-name
                            (crate-name->package-name name))))
-             semver<?)))
-      (and (not (null-list? versions))
-           (semver->string (last versions)))))
-
-  ;; Find the highest version of a crate that fulfills the semver <range>
-  ;; and hasn't been yanked.
+             (match-lambda* (((semver1 yanked1) (semver2 yanked2))
+                             (or (and yanked1 (not yanked2))
+                                 (and (eq? yanked1 yanked2)
+                                      (semver<? semver1 semver2))))))))
+      (and (not (null-list? package-versions))
+           (match-let (((semver yanked) (last package-versions)))
+             (list (semver->string semver) yanked)))))
+
+  ;; Find the highest version of a crate that fulfills the semver <range>.
+  ;; If no matching non-yanked version has been found and allow-yanked? is #t,
+  ;; also consider yanked packages.
   (define (find-crate-version crate range)
     (let* ((semver-range (string->semver-range range))
            (versions
             (sort
              (filter (lambda (entry)
                        (and
-                         (not (crate-version-yanked? (second entry)))
+                         (or allow-yanked?
+                             (not (crate-version-yanked? (second entry))))
                          (semver-range-contains? semver-range (first entry))))
                      (map (lambda (ver)
                             (list (string->semver (crate-version-number ver))
                                   ver))
                           (crate-versions crate)))
-             (match-lambda* (((semver _) ...)
-                             (apply semver<? semver))))))
+             (match-lambda* (((semver ver) ...)
+                             (match-let (((yanked1 yanked2)
+                                          (map crate-version-yanked? ver)))
+                               (or (and yanked1 (not yanked2))
+                                   (and (eq? yanked1 yanked2)
+                                        (apply semver<? semver)))))))))
       (and (not (null-list? versions))
            (second (last versions)))))
 
-  (define (dependency-name+version dep)
+  ;; If no non-yanked existing package version was found, check the upstream
+  ;; versions.  If a non-yanked upsteam version exists, use it instead,
+  ;; otherwise use the existing package version, provided it exists.
+  (define (dependency-name+version+yanked dep)
     (let* ((name (crate-dependency-id dep))
-           (req (crate-dependency-requirement dep))
-           (existing-version (find-package-version name req)))
-      (if existing-version
-          (list name existing-version)
+                 (req (crate-dependency-requirement dep))
+                 (existing-version (find-package-version name req)))
+      (if (and existing-version (not (second existing-version)))
+          (cons name existing-version)
           (let* ((crate (lookup-crate* name))
                  (ver (find-crate-version crate req)))
-            (list name
-                  (crate-version-number ver))))))
+            (if existing-version
+                (if (and ver (not (crate-version-yanked? ver)))
+                    (if (semver=? (string->semver (first existing-version))
+                                  (string->semver (crate-version-number ver)))
+                        (begin
+                          (warning (G_ "~A: version ~a is no longer yanked~%")
+                                   name (first existing-version))
+                          (cons name existing-version))
+                        (list name
+                              (crate-version-number ver)
+                              (crate-version-yanked? ver)))
+                    (begin
+                      (warning (G_ "~A: using existing version ~a, which was yanked~%")
+                               name (first existing-version))
+                      (cons name existing-version)))
+                (begin
+                  (unless ver
+                    (leave (G_ "~A: no version found for requirement ~a~%") name req))
+                  (if (crate-version-yanked? ver)
+                      (warning (G_ "~A: imported version ~a was yanked~%")
+                               name (crate-version-number ver)))
+                  (list name
+                        (crate-version-number ver)
+                        (crate-version-yanked? ver))))))))
 
   (define version*
     (and crate
-         (find-crate-version crate version-number)))
+         (or (find-crate-version crate version-number)
+             (leave (G_ "~A: version ~a not found~%") crate-name version-number))))
 
   ;; sort and map the dependencies to a list containing
   ;; pairs of (name version)
   (define (sort-map-dependencies deps)
-    (sort (map dependency-name+version
+    (sort (map dependency-name+version+yanked
                deps)
-          (match-lambda* (((name _) ...)
+          (match-lambda* (((name _ _) ...)
                           (apply string-ci<? name)))))
 
+  (define (remove-yanked-info deps)
+    (map
+     (match-lambda ((name version yanked)
+                    (list name version)))
+     deps))
+
   (if (and crate version*)
       (let* ((dependencies (crate-version-dependencies version*))
              (dep-crates dev-dep-crates (partition normal-dependency? dependencies))
@@ -308,6 +374,7 @@ look up the development dependencs for the given crate."
                                            '())))
         (values
          (make-crate-sexp #:build? include-dev-deps?
+                          #:yanked? (crate-version-yanked? version*)
                           #:name crate-name
                           #:version (crate-version-number version*)
                           #:cargo-inputs cargo-inputs
@@ -324,19 +391,27 @@ look up the development dependencs for the given crate."
                           #:description (crate-description crate)
                           #:license (and=> (crate-version-license version*)
                                            string->license))
-         (append cargo-inputs cargo-development-inputs)))
+         (append
+          (remove-yanked-info cargo-inputs)
+          (remove-yanked-info cargo-development-inputs))))
       (values #f '())))
 
-(define* (crate-recursive-import crate-name #:key version)
-  (recursive-import crate-name
-                    #:repo->guix-package (lambda* params
-                      ;; download development dependencies only for the top level package
-                      (let ((include-dev-deps? (equal? (car params) crate-name))
-                            (crate->guix-package* (memoize crate->guix-package)))
-                        (apply crate->guix-package*
-                               (append params `(#:include-dev-deps? ,include-dev-deps?)))))
-                    #:version version
-                    #:guix-name crate-name->package-name))
+(define* (crate-recursive-import
+          crate-name #:key version recursive-dev-dependencies? allow-yanked?)
+  (recursive-import
+   crate-name
+   #:repo->guix-package
+   (let ((crate->guix-package* (memoize crate->guix-package)))
+     (lambda* params
+       ;; download development dependencies only for the top level package
+       (let ((include-dev-deps?
+              (or (equal? (car params) crate-name)
+                  recursive-dev-dependencies?)))
+         (apply crate->guix-package*
+                (append params `(#:include-dev-deps? ,include-dev-deps?
+                                 #:allow-yanked? ,allow-yanked?))))))
+   #:version version
+   #:guix-name crate-name->package-name))
 
 (define (guix-package->crate-name package)
   "Return the crate name of PACKAGE."
diff --git a/guix/platforms/x86.scm b/guix/platforms/x86.scm
index 4ed5638c14..0c8fc7296c 100644
--- a/guix/platforms/x86.scm
+++ b/guix/platforms/x86.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2022 Mathieu Othacehe <othacehe@gnu.org>
+;;; Copyright © 2023, 2024 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,7 @@
   #:use-module (guix records)
   #:export (i686-linux
             x86_64-linux
+            x86_64-linux-x32
             i686-mingw
             x86_64-mingw
             i586-gnu))
@@ -41,6 +43,14 @@
    (rust-target "x86_64-unknown-linux-gnu")
    (glibc-dynamic-linker "/lib/ld-linux-x86-64.so.2")))
 
+(define x86_64-linux-x32
+  (platform
+   (target "x86_64-linux-gnux32")
+   (system #f)
+   (linux-architecture "x86_64")
+   (rust-target "x86_64-unknown-linux-gnux32")
+   (glibc-dynamic-linker "/lib/ld-linux-x32.so.2")))
+
 (define i686-mingw
   (platform
    (target "i686-w64-mingw32")
diff --git a/guix/read-print.scm b/guix/read-print.scm
index 690f5dacdd..6421b79737 100644
--- a/guix/read-print.scm
+++ b/guix/read-print.scm
@@ -46,6 +46,7 @@
             page-break
             page-break?
 
+            <comment>
             comment
             comment?
             comment->string
diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm
index 038faa87db..082a973aee 100644
--- a/guix/scripts/import/crate.scm
+++ b/guix/scripts/import/crate.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2019, 2020 Martin Becze <mjbecze@riseup.net>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
 ;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -47,6 +48,13 @@
 Import and convert the crates.io package for PACKAGE-NAME.\n"))
   (display (G_ "
   -r, --recursive        import packages recursively"))
+  (display (G_ "
+      --recursive-dev-dependencies
+                         include dev-dependencies recursively"))
+  (display (G_ "
+      --allow-yanked
+                         allow importing yanked crates if no alternative
+                         satisfying the version requirement exists"))
   (newline)
   (display (G_ "
   -h, --help             display this help and exit"))
@@ -67,6 +75,12 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
          (option '(#\r "recursive") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'recursive #t result)))
+         (option '("recursive-dev-dependencies") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'recursive-dev-dependencies #t result)))
+         (option '("allow-yanked") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'allow-yanked #t result)))
          %standard-import-options))
 
 
@@ -92,8 +106,14 @@ Import and convert the crates.io package for PACKAGE-NAME.\n"))
          (package-name->name+version spec))
 
        (match (if (assoc-ref opts 'recursive)
-                  (crate-recursive-import name #:version version)
-                  (crate->guix-package name #:version version #:include-dev-deps? #t))
+                  (crate-recursive-import
+                   name #:version version
+                   #:recursive-dev-dependencies?
+                   (assoc-ref opts 'recursive-dev-dependencies)
+                   #:allow-yanked? (assoc-ref opts 'allow-yanked))
+                  (crate->guix-package
+                   name #:version version #:include-dev-deps? #t
+                   #:allow-yanked? (assoc-ref opts 'allow-yanked)))
          ((or #f '())
           (leave (G_ "failed to download meta-data for package '~a'~%")
                  (if version
diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index 8071840de1..d0acc6cfd8 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -8,6 +8,8 @@
 ;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2020 Eric Bavier <bavier@posteo.net>
 ;;; Copyright © 2022 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2023 Graham James Addis <graham@addis.org.uk>
+;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -47,6 +49,7 @@
   #:use-module (guix scripts build)
   #:use-module (guix transformations)
   #:use-module ((guix self) #:select (make-config.scm))
+  #:use-module ((guix docker) #:select (%docker-image-max-layers))
   #:use-module (gnu compression)
   #:use-module (gnu packages)
   #:use-module (gnu packages bootstrap)
@@ -202,6 +205,16 @@ target the profile's @file{bin/env} file:
      (leave (G_ "~a: invalid symlink specification~%")
             arg))))
 
+(define (entry-point-argument-spec-option-parser opt name arg result)
+  "A SRFI-37 option parser for the --entry-point-argument option. The spec
+takes multiple occurrences. The entries are used in the exec form for the
+docker entry-point. The values are used as parameters in conjunction with the
+--entry-point option which is used as the first value in the exec form."
+  (let ((entry-point-argument (assoc-ref result 'entry-point-argument)))
+    (alist-cons 'entry-point-argument
+                (append entry-point-argument (list arg))
+                (alist-delete 'entry-point-argument result eq?))))
+
 (define (set-utf8-locale profile)
   "Configure the environment to use the \"en_US.utf8\" locale provided by the
 GLIBC-UT8-LOCALES package."
@@ -506,12 +519,15 @@ added to the pack."
                        localstatedir?
                        (symlinks '())
                        (archiver tar)
-                       (extra-options '()))
-  "Return a derivation to construct a Docker image of PROFILE.  The
-image is a tarball conforming to the Docker Image Specification, compressed
-with COMPRESSOR.  It can be passed to 'docker load'.  If TARGET is true, it
-must a be a GNU triplet and it is used to derive the architecture metadata in
-the image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument."
+                       (extra-options '())
+                       max-layers)
+  "Return a derivation to construct a Docker image of PROFILE.  The image is a
+tarball conforming to the Docker Image Specification, compressed with
+COMPRESSOR.  It can be passed to 'docker load'.  If TARGET is true, it must a
+be a GNU triplet and it is used to derive the architecture metadata in the
+image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument.  If
+MAX-LAYERS is not false, the image will be splitted in up to MAX-LAYERS
+layers."
   (define database
     (and localstatedir?
          (file-append (store-database (list profile))
@@ -562,10 +578,28 @@ the image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument."
               `((directory "/tmp" ,(getuid) ,(getgid) #o1777)
                 ,@(append-map symlink->directives '#$symlinks)))
 
-            (setenv "PATH" #+(file-append archiver "/bin"))
+            (define (form-entry-point prefix entry-point entry-point-argument)
+              ;; Construct entry-point parameter for build-docker-image.  The
+              ;; first entry is constructed by prefixing the entry-point with
+              ;; the supplied index, subsequent entries are taken from the
+              ;; --entry-point-argument options.
+              (and=> entry-point
+                     (lambda (entry-point)
+                       (cons* (string-append prefix "/" entry-point)
+                              entry-point-argument))))
+
+            (setenv "PATH"
+                    (string-join `(#+(file-append archiver "/bin")
+                                   #+@(if max-layers
+                                          (list (file-append gzip "/bin"))
+                                          '()))
+                                 ":"))
 
             (let-keywords '#$extra-options #f
-                          ((image-tag #f))
+                          ((image-tag #f)
+                           (entry-point-argument #f)
+                           (max-layers #f))
+
               (build-docker-image #$output
                                   (map store-info-item
                                        (call-with-input-file "profile"
@@ -578,16 +612,16 @@ the image.  EXTRA-OPTIONS may contain the IMAGE-TAG keyword argument."
                                   #:database #+database
                                   #:system (or #$target %host-type)
                                   #:environment environment
-                                  #:entry-point
-                                  #$(and entry-point
-                                         #~(list
-                                            (string-append #$profile "/"
-                                                           #$entry-point)))
+                                  #:entry-point (form-entry-point
+                                                 #$profile
+                                                 #$entry-point
+                                                 entry-point-argument)
                                   #:extra-files directives
                                   #:compressor
                                   #+(compressor-command compressor)
                                   #:creation-time
-                                  (make-time time-utc 0 1)))))))
+                                  (make-time time-utc 0 1)
+                                  #:max-layers max-layers))))))
 
   (gexp->derivation (string-append name ".tar"
                                    (compressor-extension compressor))
@@ -1264,6 +1298,8 @@ last resort for relocation."
     (debug . 0)
     (verbosity . 1)
     (symlinks . ())
+    (entry-point-argument . ())
+    (max-layers . ,%docker-image-max-layers)
     (compressor . ,(first %compressors))))
 
 (define %formats
@@ -1299,7 +1335,13 @@ last resort for relocation."
                    rest))))
 
 (define %docker-format-options
-  (list (required-option 'image-tag)))
+  (list (required-option 'image-tag)
+        (option '(#\A "entry-point-argument") #t #f
+                entry-point-argument-spec-option-parser)
+        (option '("max-layers") #t #f
+                (lambda (opt name arg result)
+                  (alist-cons 'max-layers (string->number* arg)
+                              result)))))
 
 (define (show-docker-format-options)
   (display (G_ "
@@ -1308,7 +1350,15 @@ last resort for relocation."
 (define (show-docker-format-options/detailed)
   (display (G_ "
       --image-tag=NAME
-                         Use the given NAME for the Docker image repository"))
+                         Use the given NAME for the Docker image repository
+
+      -A, --entry-point-argument=COMMAND/PARAMETER
+                         Value(s) to use for the Docker ENTRYPOINT arguments.
+                         Multiple instances are accepted. This is only valid
+                         in conjunction with the --entry-point option
+
+      --max-layers=N
+                         Number of image layers"))
   (newline)
   (exit 0))
 
@@ -1619,7 +1669,11 @@ Create a bundle of PACKAGE.\n"))
                    (extra-options (match pack-format
                                     ('docker
                                      (list #:image-tag
-                                           (assoc-ref opts 'image-tag)))
+                                           (assoc-ref opts 'image-tag)
+                                           #:entry-point-argument
+                                           (assoc-ref opts 'entry-point-argument)
+                                           #:max-layers
+                                           (assoc-ref opts 'max-layers)))
                                     ('deb
                                      (list #:control-file
                                            (process-file-arg opts 'control-file)
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index f85b663d64..bf3d2f9044 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -58,6 +58,7 @@
   #:use-module (guix scripts system reconfigure)
   #:use-module (guix build utils)
   #:use-module (guix progress)
+  #:use-module ((guix docker) #:select (%docker-image-max-layers))
   #:use-module (gnu build image)
   #:use-module (gnu build install)
   #:autoload   (gnu build file-systems)
@@ -1053,6 +1054,8 @@ Some ACTIONS support additional ARGS.\n"))
   (newline)
   (show-native-build-options-help)
   (newline)
+  (show-docker-format-options)
+  (newline)
   (display (G_ "
   -h, --help             display this help and exit"))
   (display (G_ "
@@ -1060,12 +1063,21 @@ Some ACTIONS support additional ARGS.\n"))
   (newline)
   (show-bug-report-information))
 
+(define %docker-format-options
+  (list (option '("max-layers") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'max-layers (string->number* arg)
+                               result)))))
+
 (define %options
   ;; Specifications of the command-line options.
   (cons* (option '(#\h "help") #f #f
                  (lambda args
                    (leave-on-EPIPE (show-help))
                    (exit 0)))
+         (option '("help-docker-format") #f #f
+                 (lambda args
+                   (show-docker-format-options/detailed)))
          (option '(#\V "version") #f #f
                  (lambda args
                    (show-version-and-exit "guix system")))
@@ -1154,7 +1166,8 @@ Some ACTIONS support additional ARGS.\n"))
                    (alist-cons 'list-installed (or arg "") result)))
          (append %standard-build-options
                  %standard-cross-build-options
-                 %standard-native-build-options)))
+                 %standard-native-build-options
+                 %docker-format-options)))
 
 (define %default-options
   ;; Alist of default option values.
@@ -1175,7 +1188,8 @@ Some ACTIONS support additional ARGS.\n"))
     (label . #f)
     (volatile-image-root? . #f)
     (volatile-vm-root? . #t)
-    (graph-backend . "graphviz")))
+    (graph-backend . "graphviz")
+    (max-layers . ,%docker-image-max-layers)))
 
 (define (verbosity-level opts)
   "Return the verbosity level based on OPTS, the alist of parsed options."
@@ -1183,6 +1197,17 @@ Some ACTIONS support additional ARGS.\n"))
       (if (eq? (assoc-ref opts 'action) 'build)
           3 1)))
 
+(define (show-docker-format-options)
+  (display (G_ "
+      --help-docker-format list options specific to the docker image type.")))
+
+(define (show-docker-format-options/detailed)
+  (display (G_ "
+      --max-layers=N
+                         Number of image layers"))
+  (newline)
+  (exit 0))
+
 
 ;;;
 ;;; Entry point.
@@ -1245,6 +1270,7 @@ resulting from command-line parsing."
                                            ((docker-image) docker-image-type)
                                            (else image-type)))
                             (image-size (assoc-ref opts 'image-size))
+                            (image-max-layers (assoc-ref opts 'max-layers))
                             (volatile?
                              (assoc-ref opts 'volatile-image-root?))
                             (shared-network?
@@ -1258,6 +1284,7 @@ resulting from command-line parsing."
                                       (image-with-label base-image label)
                                       base-image))
                          (size image-size)
+                         (max-layers image-max-layers)
                          (volatile-root? volatile?)
                          (shared-network? shared-network?))))
          (os          (or (image-operating-system image)
diff --git a/guix/ui.scm b/guix/ui.scm
index e3bf07212f..962d291d2e 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2014 Cyril Roelandt <tipecaml@gmail.com>
@@ -555,7 +555,7 @@ See the \"Application Setup\" section in the manual, for more info.\n"))
   (leave-on-EPIPE
    (simple-format #t "~a (~a) ~a~%"
                   command %guix-package-name %guix-version)
-   (format #t "Copyright ~a 2023 ~a"
+   (format #t "Copyright ~a 2024 ~a"
            ;; TRANSLATORS: Translate "(C)" to the copyright symbol
            ;; (C-in-a-circle), if this symbol is available in the user's
            ;; locale.  Otherwise, do not translate "(C)"; leave it as-is.  */
diff --git a/guix/utils.scm b/guix/utils.scm
index 8e71f97e1c..e4e9d922e7 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2018, 2020 Marius Bakke <marius@gnu.org>
-;;; Copyright © 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2020, 2021, 2024 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020, 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
@@ -97,6 +97,7 @@
             target-x86-32?
             target-x86-64?
             target-x86?
+            target-x32?
             target-arm32?
             target-aarch64?
             target-arm?
@@ -634,6 +635,8 @@ returned by `config.guess'."
                        (else triplet))))
     (cond ((string-match "^arm[^-]*-([^-]+-)?linux-gnueabihf" triplet)
            "armhf-linux")
+          ;; Otherwise it will show up as x86_64-linux... which isn't wrong.
+          ((string-match "x86_64-linux-gnux32" triplet) "x86_64-linux-gnux32")
           ((string-match "^([^-]+)-([^-]+-)?linux-gnu.*" triplet)
            =>
            (lambda (m)
@@ -710,6 +713,13 @@ a character other than '@'."
 architecture (x86_64)?"
   (string-prefix? "x86_64-" target))
 
+(define* (target-x32? #:optional (target (or (%current-target-system)
+                                             (%current-system))))
+  "Is the architecture of TARGET a variant of Intel/AMD's 64-bit
+architecture (x86_64) using 32-bit data types?"
+  (and (target-x86-64? target)
+       (string-suffix? "gnux32" target)))
+
 (define* (target-x86? #:optional (target (or (%current-target-system)
                                              (%current-system))))
   (or (target-x86-32? target) (target-x86-64? target)))
diff --git a/nix/libstore/globals.cc b/nix/libstore/globals.cc
index d4f9a46a74..89add1f107 100644
--- a/nix/libstore/globals.cc
+++ b/nix/libstore/globals.cc
@@ -32,8 +32,8 @@ Settings::Settings()
     buildCores = 1;
     readOnlyMode = false;
     thisSystem = SYSTEM;
-    maxSilentTime = 0;
-    buildTimeout = 0;
+    maxSilentTime = 3600;
+    buildTimeout = 3600 * 24;
     useBuildHook = true;
     printBuildTrace = false;
     multiplexedBuildOutput = false;
diff --git a/tests/crate.scm b/tests/crate.scm
index 5aea5efaf3..ce2f08aade 100644
--- a/tests/crate.scm
+++ b/tests/crate.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2019, 2020, 2022 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
 ;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2023 David Elsing <david.elsing@posteo.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,7 +25,10 @@
   #:use-module (guix import crate)
   #:use-module (guix base32)
   #:use-module (guix build-system cargo)
-  #:use-module (gcrypt hash)
+  #:use-module ((gcrypt hash)
+                #:select ((sha256 . gcrypt-sha256)))
+  #:use-module (guix packages)
+  #:use-module (guix read-print)
   #:use-module (guix tests)
   #:use-module (gnu packages)
   #:use-module (ice-9 iconv)
@@ -37,13 +41,18 @@
 ;; foo-1.0.0
 ;; foo-1.0.3
 ;; 	leaf-alice 0.7.5
+;; bar-1.0.0
+;;      leaf-bob   3.0.1
+;;      leaf-bob   3.0.2 (dev-dependency)
+;;      leaf-bob   4.0.0 (dev-dependency)
 ;;
 ;; root-1.0.0
 ;; root-1.0.4
-;; 	intermediate-a  1.0.42
-;; 	intermeidate-b ^1.0.0
+;; 	intermediate-a 1.0.42
+;; 	intermediate-b ^1.0.0
 ;; 	leaf-alice     ^0.7
-;; 	leaf-bob     ^3
+;; 	leaf-bob       ^3
+;; 	intermediate-c 1 (dev-dependency)
 ;;
 ;; intermediate-a-1.0.40
 ;; intermediate-a-1.0.42
@@ -55,10 +64,15 @@
 ;; intermediate-b-1.2.3
 ;; 	leaf-bob	3.0.1
 ;;
+;; intermediate-c-1.0.1
+;;      leaf-alice      0.7.5 (dev-dependency)
+;;
 ;; leaf-alice-0.7.3
 ;; leaf-alice-0.7.5
 ;;
 ;; leaf-bob-3.0.1
+;; leaf-bob-3.0.2 (yanked)
+;; leaf-bob-4.0.0 (yanked)
 
 
 (define test-foo-crate
@@ -111,6 +125,50 @@
   ]
 }")
 
+(define test-bar-crate
+  "{
+  \"crate\": {
+    \"max_version\": \"1.0.0\",
+    \"name\": \"bar\",
+    \"description\": \"summary\",
+    \"homepage\": \"http://example.com\",
+    \"repository\": \"http://example.com\",
+    \"keywords\": [\"dummy\", \"test\"],
+    \"categories\": [\"test\"],
+    \"actual_versions\": [
+      { \"id\": 234100,
+        \"num\": \"1.0.0\",
+        \"license\": \"MIT OR Apache-2.0\",
+        \"links\": {
+          \"dependencies\": \"/api/v1/crates/bar/1.0.0/dependencies\"
+        },
+        \"yanked\": false
+      }
+    ]
+  }
+}")
+
+(define test-bar-dependencies
+  "{
+  \"dependencies\": [
+     {
+       \"crate_id\": \"leaf-bob\",
+       \"kind\": \"normal\",
+       \"req\": \"3.0.1\"
+     },
+     {
+       \"crate_id\": \"leaf-bob\",
+       \"kind\": \"dev\",
+       \"req\": \"^3.0.2\"
+     },
+     {
+       \"crate_id\": \"leaf-bob\",
+       \"kind\": \"dev\",
+       \"req\": \"^4.0.0\"
+     }
+  ]
+}")
+
 (define test-root-crate
   "{
   \"crate\": {
@@ -164,6 +222,11 @@
        \"crate_id\": \"leaf-bob\",
        \"kind\": \"normal\",
        \"req\": \"^3\"
+     },
+     {
+       \"crate_id\": \"intermediate-c\",
+       \"kind\": \"dev\",
+       \"req\": \"1\"
      }
   ]
 }")
@@ -262,6 +325,40 @@
   ]
 }")
 
+(define test-intermediate-c-crate
+  "{
+  \"crate\": {
+    \"max_version\": \"1.0.1\",
+    \"name\": \"intermediate-c\",
+    \"description\": \"summary\",
+    \"homepage\": \"http://example.com\",
+    \"repository\": \"http://example.com\",
+    \"keywords\": [\"dummy\", \"test\"],
+    \"categories\": [\"test\"],
+    \"actual_versions\": [
+      { \"id\": 234290,
+        \"num\": \"1.0.1\",
+        \"license\": \"MIT OR Apache-2.0\",
+        \"links\": {
+          \"dependencies\": \"/api/v1/crates/intermediate-c/1.0.1/dependencies\"
+        },
+        \"yanked\": false
+      }
+    ]
+  }
+}")
+
+(define test-intermediate-c-dependencies
+  "{
+  \"dependencies\": [
+     {
+       \"crate_id\": \"leaf-alice\",
+       \"kind\": \"dev\",
+       \"req\": \"0.7.5\"
+     }
+  ]
+}")
+
 (define test-leaf-alice-crate
   "{
   \"crate\": {
@@ -316,6 +413,22 @@
           \"dependencies\": \"/api/v1/crates/leaf-bob/3.0.1/dependencies\"
         },
         \"yanked\": false
+      },
+      { \"id\": 234281,
+        \"num\": \"3.0.2\",
+        \"license\": \"MIT OR Apache-2.0\",
+        \"links\": {
+          \"dependencies\": \"/api/v1/crates/leaf-bob/3.0.2/dependencies\"
+        },
+        \"yanked\": true
+      },
+      { \"id\": 234282,
+        \"num\": \"4.0.0\",
+        \"license\": \"MIT OR Apache-2.0\",
+        \"links\": {
+          \"dependencies\": \"/api/v1/crates/leaf-bob/4.0.0/dependencies\"
+        },
+        \"yanked\": true
       }
     ]
   }
@@ -355,7 +468,7 @@
              ("https://crates.io/api/v1/crates/foo/1.0.3/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/foo/1.0.3/dependencies"
               (open-input-string test-foo-dependencies))
@@ -364,7 +477,7 @@
              ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/dependencies"
               (open-input-string test-leaf-alice-dependencies))
@@ -398,7 +511,7 @@
            (pk 'fail x #f)))))
 
 (unless have-guile-semver? (test-skip 1))
-(test-assert "cargo-recursive-import"
+(test-assert "crate-recursive-import"
   ;; Replace network resources with sample data.
   (mock ((guix http-client) http-fetch
          (lambda (url . rest)
@@ -408,7 +521,7 @@
              ("https://crates.io/api/v1/crates/root/1.0.4/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/root/1.0.4/dependencies"
               (open-input-string test-root-dependencies))
@@ -417,7 +530,7 @@
              ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/intermediate-a/1.0.42/dependencies"
               (open-input-string test-intermediate-a-dependencies))
@@ -426,16 +539,25 @@
              ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/intermediate-b/1.2.3/dependencies"
               (open-input-string test-intermediate-b-dependencies))
+             ("https://crates.io/api/v1/crates/intermediate-c"
+              (open-input-string test-intermediate-c-crate))
+             ("https://crates.io/api/v1/crates/intermediate-c/1.0.1/download"
+              (set! test-source-hash
+                    (bytevector->nix-base32-string
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+              (open-input-string "empty file\n"))
+             ("https://crates.io/api/v1/crates/intermediate-c/1.0.1/dependencies"
+              (open-input-string test-intermediate-c-dependencies))
              ("https://crates.io/api/v1/crates/leaf-alice"
               (open-input-string test-leaf-alice-crate))
              ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/leaf-alice/0.7.5/dependencies"
               (open-input-string test-leaf-alice-dependencies))
@@ -444,7 +566,7 @@
              ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/download"
               (set! test-source-hash
                     (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
+                     (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
               (open-input-string "empty file\n"))
              ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/dependencies"
               (open-input-string test-leaf-bob-dependencies))
@@ -452,7 +574,27 @@
         (match (crate-recursive-import "root")
           ;; rust-intermediate-b has no dependency on the rust-leaf-alice
           ;; package, so this is a valid ordering
-          (((define-public 'rust-leaf-alice-0.7
+          (((define-public 'rust-intermediate-c-1
+              (package
+                (name "rust-intermediate-c")
+                (version "1.0.1")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "intermediate-c" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (arguments
+                 ('quasiquote (#:skip-build? #t)))
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-leaf-alice-0.7
               (package
                 (name "rust-leaf-alice")
                 (version "0.7.5")
@@ -563,10 +705,157 @@
                                 ("rust-leaf-alice"
                                  ('unquote 'rust-leaf-alice-0.7))
                                 ("rust-leaf-bob"
+                                 ('unquote rust-leaf-bob-3)))
+                               #:cargo-development-inputs
+                               (("rust-intermediate-c"
+                                 ('unquote rust-intermediate-c-1))))))
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0)))))
+           #t)
+          (x
+           (pk 'fail x #f)))
+        (match (crate-recursive-import "root"
+                                       #:recursive-dev-dependencies? #t)
+          ;; rust-intermediate-b has no dependency on the rust-leaf-alice
+          ;; package, so this is a valid ordering
+          (((define-public 'rust-intermediate-c-1
+              (package
+                (name "rust-intermediate-c")
+                (version "1.0.1")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "intermediate-c" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (arguments
+                 ('quasiquote (#:cargo-development-inputs
+                               (("rust-leaf-alice"
+                                 ('unquote rust-leaf-alice-0.7))))))
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-leaf-alice-0.7
+              (package
+                (name "rust-leaf-alice")
+                (version "0.7.5")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "leaf-alice" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-leaf-bob-3
+              (package
+                (name "rust-leaf-bob")
+                (version "3.0.1")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "leaf-bob" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-intermediate-b-1
+              (package
+                (name "rust-intermediate-b")
+                (version "1.2.3")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "intermediate-b" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (arguments
+                 ('quasiquote (#:cargo-inputs
+                               (("rust-leaf-bob"
+                                 ('unquote rust-leaf-bob-3))))))
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-intermediate-a-1
+              (package
+                (name "rust-intermediate-a")
+                (version "1.0.42")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "intermediate-a" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (arguments
+                 ('quasiquote (#:cargo-inputs
+                               (("rust-intermediate-b"
+                                 ('unquote rust-intermediate-b-1))
+                                ("rust-leaf-alice"
+                                 ('unquote 'rust-leaf-alice-0.7))
+                                ("rust-leaf-bob"
                                  ('unquote rust-leaf-bob-3))))))
                 (home-page "http://example.com")
                 (synopsis "summary")
                 (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-root-1
+              (package
+                (name "rust-root")
+                (version "1.0.4")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "root" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (arguments
+                 ('quasiquote (#:cargo-inputs
+                               (("rust-intermediate-a"
+                                 ('unquote rust-intermediate-a-1))
+                                ("rust-intermediate-b"
+                                 ('unquote rust-intermediate-b-1))
+                                ("rust-leaf-alice"
+                                 ('unquote 'rust-leaf-alice-0.7))
+                                ("rust-leaf-bob"
+                                 ('unquote rust-leaf-bob-3)))
+                               #:cargo-development-inputs
+                               (("rust-intermediate-c"
+                                 ('unquote rust-intermediate-c-1))))))
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
                 (license (list license:expat license:asl2.0)))))
            #t)
           (x
@@ -594,69 +883,209 @@
 
 
 
-(define test-doctool-crate
-  "{
-  \"crate\": {
-    \"max_version\": \"2.2.2\",
-    \"name\": \"leaf-bob\",
-    \"description\": \"summary\",
-    \"homepage\": \"http://example.com\",
-    \"repository\": \"http://example.com\",
-    \"keywords\": [\"dummy\", \"test\"],
-    \"categories\": [\"test\"]
-    \"actual_versions\": [
-      { \"id\": 234280,
-        \"num\": \"2.2.2\",
-        \"license\": \"MIT OR Apache-2.0\",
-        \"links\": {
-          \"dependencies\": \"/api/v1/crates/doctool/2.2.2/dependencies\"
-        },
-        \"yanked\": false
-      }
-    ]
-  }
-}")
+(define rust-leaf-bob-3
+  (package
+    (name "rust-leaf-bob")
+    (version "3.0.1")
+    (source #f)
+    (build-system #f)
+    (home-page #f)
+    (synopsis #f)
+    (description #f)
+    (license #f)))
 
-;; FIXME: This test depends on some existing packages
-(define test-doctool-dependencies
-  "{
-  \"dependencies\": [
-     {
-       \"crate_id\": \"docopt\",
-       \"kind\": \"normal\",
-       \"req\": \"^0.8.1\"
-     }
-  ]
-}")
+(define rust-leaf-bob-3.0.2-yanked
+  (package
+    (name "rust-leaf-bob")
+    (version "3.0.2")
+    (source #f)
+    (properties '((crate-version-yanked? . #t)))
+    (build-system #f)
+    (home-page #f)
+    (synopsis #f)
+    (description #f)
+    (license #f)))
 
-
-(test-assert "self-test: rust-docopt 0.8.x is gone, please adjust the test case"
-  (not (null? (find-packages-by-name "rust-docopt" "0.8"))))
+(unless have-guile-semver? (test-skip 1))
+(test-assert "crate-recursive-import-honors-existing-packages"
+  (mock
+   ((gnu packages) find-packages-by-name
+    (lambda* (name #:optional version)
+      (match name
+        ("rust-leaf-bob"
+         (list rust-leaf-bob-3 rust-leaf-bob-3.0.2-yanked))
+        (_ '()))))
+   (mock
+    ((guix http-client) http-fetch
+     (lambda (url . rest)
+       (match url
+         ("https://crates.io/api/v1/crates/bar"
+          (open-input-string test-bar-crate))
+         ("https://crates.io/api/v1/crates/bar/1.0.0/download"
+          (set! test-source-hash
+                (bytevector->nix-base32-string
+                 (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+          (open-input-string "empty file\n"))
+         ("https://crates.io/api/v1/crates/bar/1.0.0/dependencies"
+          (open-input-string test-bar-dependencies))
+         ("https://crates.io/api/v1/crates/leaf-bob"
+          (open-input-string test-leaf-bob-crate))
+         ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/download"
+          (set! test-source-hash
+                (bytevector->nix-base32-string
+                 (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+          (open-input-string "empty file\n"))
+         ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/dependencies"
+          (open-input-string test-leaf-bob-dependencies))
+         ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/download"
+          (set! test-source-hash
+                (bytevector->nix-base32-string
+                 (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+          (open-input-string "empty file\n"))
+         ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/dependencies"
+          (open-input-string test-leaf-bob-dependencies))
+         (_ (error "Unexpected URL: " url)))))
+    (match (crate-recursive-import "bar"
+                                   #:allow-yanked? #t)
+      (((define-public 'rust-bar-1
+          (package
+            (name "rust-bar")
+            (version "1.0.0")
+            (source
+             (origin
+               (method url-fetch)
+               (uri (crate-uri "bar" version))
+               (file-name
+                (string-append name "-" version ".tar.gz"))
+               (sha256
+                (base32
+                 (?  string? hash)))))
+            (build-system cargo-build-system)
+            (arguments
+             ('quasiquote (#:cargo-inputs
+                           (("rust-leaf-bob"
+                             ('unquote 'rust-leaf-bob-3)))
+                           #:cargo-development-inputs
+                           (("rust-leaf-bob"
+                             ('unquote 'rust-leaf-bob-3.0.2-yanked))
+                            ("rust-leaf-bob"
+                             ('unquote 'rust-leaf-bob-4.0.0-yanked))))))
+            (home-page "http://example.com")
+            (synopsis "summary")
+            (description "summary")
+            (license (list license:expat license:asl2.0)))))
+       #t)
+      (x
+       (pk 'fail x #f))))))
 
 (unless have-guile-semver? (test-skip 1))
-(test-assert "cargo-recursive-import-hoors-existing-packages"
-  (mock ((guix http-client) http-fetch
-         (lambda (url . rest)
-           (match url
-             ("https://crates.io/api/v1/crates/doctool"
-              (open-input-string test-doctool-crate))
-             ("https://crates.io/api/v1/crates/doctool/2.2.2/download"
-              (set! test-source-hash
-                    (bytevector->nix-base32-string
-                     (sha256 (string->bytevector "empty file\n" "utf-8"))))
-              (open-input-string "empty file\n"))
-             ("https://crates.io/api/v1/crates/doctool/2.2.2/dependencies"
-              (open-input-string test-doctool-dependencies))
-             (_ (error "Unexpected URL: " url)))))
-        (match (crate-recursive-import "doctool")
-          (((define-public 'rust-doctool-2
+(test-assert "crate-import-only-yanked-available"
+  (mock
+   ((guix http-client) http-fetch
+    (lambda (url . rest)
+      (match url
+        ("https://crates.io/api/v1/crates/bar"
+         (open-input-string test-bar-crate))
+        ("https://crates.io/api/v1/crates/bar/1.0.0/download"
+         (set! test-source-hash
+               (bytevector->nix-base32-string
+                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+         (open-input-string "empty file\n"))
+        ("https://crates.io/api/v1/crates/bar/1.0.0/dependencies"
+         (open-input-string test-bar-dependencies))
+        ("https://crates.io/api/v1/crates/leaf-bob"
+         (open-input-string test-leaf-bob-crate))
+        ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/download"
+         (set! test-source-hash
+               (bytevector->nix-base32-string
+                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+         (open-input-string "empty file\n"))
+        ("https://crates.io/api/v1/crates/leaf-bob/3.0.1/dependencies"
+         (open-input-string test-leaf-bob-dependencies))
+        ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/download"
+         (set! test-source-hash
+               (bytevector->nix-base32-string
+                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+         (open-input-string "empty file\n"))
+        ("https://crates.io/api/v1/crates/leaf-bob/3.0.2/dependencies"
+         (open-input-string test-leaf-bob-dependencies))
+        ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/download"
+         (set! test-source-hash
+               (bytevector->nix-base32-string
+                (gcrypt-sha256 (string->bytevector "empty file\n" "utf-8"))))
+         (open-input-string "empty file\n"))
+        ("https://crates.io/api/v1/crates/leaf-bob/4.0.0/dependencies"
+         (open-input-string test-leaf-bob-dependencies))
+        (_ (error "Unexpected URL: " url)))))
+        (match (crate-recursive-import "bar"
+                                       #:recursive-dev-dependencies? #t
+                                       #:allow-yanked? #t)
+          (((define-public 'rust-leaf-bob-4.0.0-yanked
+              (package
+                (name "rust-leaf-bob")
+                (version "4.0.0")
+                ($ <comment> "; This version was yanked!\n" #t)
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "leaf-bob" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (properties ('quote (('crate-version-yanked? . #t))))
+                (build-system cargo-build-system)
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-leaf-bob-3.0.2-yanked
               (package
-                (name "rust-doctool")
-                (version "2.2.2")
+                (name "rust-leaf-bob")
+                (version "3.0.2")
+                ($ <comment> "; This version was yanked!\n" #t)
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "leaf-bob" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (properties ('quote (('crate-version-yanked? . #t))))
+                (build-system cargo-build-system)
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-leaf-bob-3
+              (package
+                (name "rust-leaf-bob")
+                (version "3.0.1")
                 (source
                  (origin
                    (method url-fetch)
-                   (uri (crate-uri "doctool" version))
+                   (uri (crate-uri "leaf-bob" version))
+                   (file-name
+                    (string-append name "-" version ".tar.gz"))
+                   (sha256
+                    (base32
+                     (?  string? hash)))))
+                (build-system cargo-build-system)
+                (home-page "http://example.com")
+                (synopsis "summary")
+                (description "summary")
+                (license (list license:expat license:asl2.0))))
+            (define-public 'rust-bar-1
+              (package
+                (name "rust-bar")
+                (version "1.0.0")
+                (source
+                 (origin
+                   (method url-fetch)
+                   (uri (crate-uri "bar" version))
                    (file-name
                     (string-append name "-" version ".tar.gz"))
                    (sha256
@@ -665,14 +1094,19 @@
                 (build-system cargo-build-system)
                 (arguments
                  ('quasiquote (#:cargo-inputs
-                               (("rust-docopt"
-                                 ('unquote 'rust-docopt-0.8))))))
+                               (("rust-leaf-bob"
+                                 ('unquote 'rust-leaf-bob-3)))
+                               #:cargo-development-inputs
+                               (("rust-leaf-bob"
+                                 ('unquote 'rust-leaf-bob-3.0.2-yanked))
+                                ("rust-leaf-bob"
+                                 ('unquote 'rust-leaf-bob-4.0.0-yanked))))))
                 (home-page "http://example.com")
                 (synopsis "summary")
                 (description "summary")
                 (license (list license:expat license:asl2.0)))))
             #t)
           (x
-           (pk 'fail x #f)))))
+           (pk 'fail (pretty-print-with-comments (current-output-port) x) #f)))))
 
 (test-end "crate")
diff --git a/tests/pack.scm b/tests/pack.scm
index ac78817a70..55445ea1e9 100644
--- a/tests/pack.scm
+++ b/tests/pack.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2017-2021, 2023 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,6 +30,7 @@
   #:use-module (guix gexp)
   #:use-module (guix modules)
   #:use-module (guix utils)
+  #:use-module ((guix build utils) #:select (%store-directory))
   #:use-module (gnu packages)
   #:use-module ((gnu packages base) #:select (libc-utf8-locales-for-target))
   #:use-module (gnu packages bootstrap)
@@ -251,6 +253,54 @@
       (built-derivations (list check))))
 
   (unless store (test-skip 1))
+  (test-assertm "docker-layered-image + localstatedir"
+    (mlet* %store-monad
+        ((guile (set-guile-for-build (default-guile)))
+         (profile -> (profile
+                      (content (packages->manifest (list %bootstrap-guile)))
+                      (hooks '())
+                      (locales? #f)))
+         (tarball (docker-image "docker-pack" profile
+                                #:symlinks '(("/bin/Guile" -> "bin/guile"))
+                                #:localstatedir? #t
+                                #:max-layers 100))
+         (check (gexp->derivation
+                 "check-tarball"
+                 (with-imported-modules '((guix build utils))
+                   #~(begin
+                       (use-modules (guix build utils)
+                                    (ice-9 match))
+
+                       (define bin
+                         (string-append "." #$profile "/bin"))
+
+                       (define store
+                         (string-append "." #$(%store-directory)))
+
+                       (setenv "PATH" (string-append #$%tar-bootstrap "/bin"))
+                       (mkdir "base")
+                       (with-directory-excursion "base"
+                         (invoke "tar" "xvf" #$tarball))
+
+                       (match (find-files "base" "layer.tar")
+                         ((layers ...)
+                          (for-each (lambda (layer)
+                                      (invoke "tar" "xvf" layer)
+                                      (invoke "chmod" "--recursive" "u+w" store))
+                                    layers)))
+
+                       (when
+                           (and (file-exists? (string-append bin "/guile"))
+                                (file-exists? "var/guix/db/db.sqlite")
+                                (file-is-directory? "tmp")
+                                (string=? (string-append #$%bootstrap-guile "/bin")
+                                          (readlink bin))
+                                (string=? (string-append #$profile "/bin/guile")
+                                          (readlink "bin/Guile")))
+                         (mkdir #$output)))))))
+      (built-derivations (list check))))
+
+  (unless store (test-skip 1))
   (test-assertm "squashfs-image + localstatedir"
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))