summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk23
-rw-r--r--gnu/packages/bdw-gc.scm9
-rw-r--r--gnu/packages/calendar.scm10
-rw-r--r--gnu/packages/certs.scm4
-rw-r--r--gnu/packages/check.scm19
-rw-r--r--gnu/packages/crates-graphics.scm42
-rw-r--r--gnu/packages/crates-gtk.scm596
-rw-r--r--gnu/packages/crates-io.scm391
-rw-r--r--gnu/packages/databases.scm80
-rw-r--r--gnu/packages/display-managers.scm13
-rw-r--r--gnu/packages/education.scm4
-rw-r--r--gnu/packages/freedesktop.scm16
-rw-r--r--gnu/packages/games.scm2
-rw-r--r--gnu/packages/gl.scm69
-rw-r--r--gnu/packages/gnome.scm59
-rw-r--r--gnu/packages/gnuzilla.scm248
-rw-r--r--gnu/packages/graphics.scm6
-rw-r--r--gnu/packages/gstreamer.scm819
-rw-r--r--gnu/packages/gtk.scm23
-rw-r--r--gnu/packages/guile-xyz.scm15
-rw-r--r--gnu/packages/haskell.scm478
-rw-r--r--gnu/packages/icu4c.scm16
-rw-r--r--gnu/packages/image.scm22
-rw-r--r--gnu/packages/iso-codes.scm13
-rw-r--r--gnu/packages/julia.scm4
-rw-r--r--gnu/packages/kde-frameworks.scm1065
-rw-r--r--gnu/packages/kde-games.scm148
-rw-r--r--gnu/packages/kde-internet.scm81
-rw-r--r--gnu/packages/kde-multimedia.scm215
-rw-r--r--gnu/packages/kde-pim.scm441
-rw-r--r--gnu/packages/kde-plasma.scm205
-rw-r--r--gnu/packages/kde-systemtools.scm73
-rw-r--r--gnu/packages/kde-utils.scm59
-rw-r--r--gnu/packages/kde.scm265
-rw-r--r--gnu/packages/libffi.scm21
-rw-r--r--gnu/packages/libunwind.scm20
-rw-r--r--gnu/packages/linux.scm82
-rw-r--r--gnu/packages/lisp-xyz.scm11
-rw-r--r--gnu/packages/maths.scm4
-rw-r--r--gnu/packages/nss.scm220
-rw-r--r--gnu/packages/patches/akonadi-not-relocatable.patch51
-rw-r--r--gnu/packages/patches/akonadi-paths.patch32
-rw-r--r--gnu/packages/patches/akonadi-timestamps.patch6
-rw-r--r--gnu/packages/patches/firebird-riscv64-support-pt1.patch42
-rw-r--r--gnu/packages/patches/firebird-riscv64-support-pt2.patch108
-rw-r--r--gnu/packages/patches/freeglut-gcc-compat.patch53
-rw-r--r--gnu/packages/patches/grantlee-merge-theme-dirs.patch163
-rw-r--r--gnu/packages/patches/gst-plugins-good-fix-test.patch94
-rw-r--r--gnu/packages/patches/kdbusaddons-kinit-file-name.patch15
-rw-r--r--gnu/packages/patches/kinit-kdeinit-extra_libs.patch21
-rw-r--r--gnu/packages/patches/kinit-kdeinit-libpath.patch37
-rw-r--r--gnu/packages/patches/kio-search-smbd-on-PATH.patch46
-rw-r--r--gnu/packages/patches/kmail-Fix-missing-link-libraries.patch41
-rw-r--r--gnu/packages/patches/kmplayer-aarch64.patch57
-rw-r--r--gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch42
-rw-r--r--gnu/packages/patches/kpackage-allow-external-paths.patch13
-rw-r--r--gnu/packages/patches/kpackage-fix-KF5PackageMacros.cmake.patch25
-rw-r--r--gnu/packages/patches/libksieve-Fix-missing-link-libraries.patch76
-rw-r--r--gnu/packages/patches/mrustc-riscv64-support.patch48
-rw-r--r--gnu/packages/patches/polkit-CVE-2021-4034.patch82
-rw-r--r--gnu/packages/patches/polkit-configure-elogind.patch15
-rw-r--r--gnu/packages/patches/polkit-disable-systemd.patch30
-rw-r--r--gnu/packages/patches/polkit-use-duktape.patch5030
-rw-r--r--gnu/packages/patches/postgresql-riscv-spinlocks.patch41
-rw-r--r--gnu/packages/patches/python-dateutil-pytest-compat.patch43
-rw-r--r--gnu/packages/patches/ruby-hydra-minimal-no-byebug.patch11
-rw-r--r--gnu/packages/patches/rustc-1.39.0-src.patch99
-rw-r--r--gnu/packages/patches/rustc-1.54.0-src.patch117
-rw-r--r--gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch13
-rw-r--r--gnu/packages/perl.scm4
-rw-r--r--gnu/packages/photo.scm11
-rw-r--r--gnu/packages/polkit.scm134
-rw-r--r--gnu/packages/python-crypto.scm4
-rw-r--r--gnu/packages/python-science.scm2
-rw-r--r--gnu/packages/python-web.scm14
-rw-r--r--gnu/packages/python-xyz.scm69
-rw-r--r--gnu/packages/qt.scm295
-rw-r--r--gnu/packages/ruby.scm87
-rw-r--r--gnu/packages/rust.scm318
-rw-r--r--gnu/packages/sphinx.scm28
-rw-r--r--gnu/packages/tex.scm18
-rw-r--r--gnu/packages/time.scm1
-rw-r--r--gnu/packages/video.scm48
-rw-r--r--gnu/packages/webkit.scm2
84 files changed, 4248 insertions, 9129 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 9b3b199c7c..78bdc113ac 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1097,6 +1097,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/fifo-map-fix-flags-for-gcc.patch		\
   %D%/packages/patches/fifo-map-remove-catch.hpp.patch		\
   %D%/packages/patches/findutils-localstatedir.patch		\
+  %D%/packages/patches/firebird-riscv64-support-pt1.patch	\
+  %D%/packages/patches/firebird-riscv64-support-pt2.patch	\
   %D%/packages/patches/flann-cmake-3.11.patch			\
   %D%/packages/patches/flatpak-fix-path.patch			\
   %D%/packages/patches/flatpak-unset-gdk-pixbuf-for-sandbox.patch	\
@@ -1107,7 +1109,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/fp16-system-libraries.patch		\
   %D%/packages/patches/fpc-reproducibility.patch		\
   %D%/packages/patches/freedink-engine-fix-sdl-hints.patch	\
-  %D%/packages/patches/freeglut-gcc-compat.patch		\
   %D%/packages/patches/freeimage-unbundle.patch		\
   %D%/packages/patches/fuse-glibc-2.34.patch			\
   %D%/packages/patches/fuse-overlapping-headers.patch		\
@@ -1246,14 +1247,12 @@ dist_patch_DATA =						\
   %D%/packages/patches/gpm-glibc-2.26.patch			\
   %D%/packages/patches/gpodder-disable-updater.patch		\
   %D%/packages/patches/gpsbabel-fix-i686-test.patch		\
-  %D%/packages/patches/grantlee-merge-theme-dirs.patch		\
   %D%/packages/patches/grep-timing-sensitive-test.patch		\
   %D%/packages/patches/grfcodec-gcc-compat.patch		\
   %D%/packages/patches/gromacs-tinyxml2.patch			\
   %D%/packages/patches/groovy-add-exceptionutilsgenerator.patch	\
   %D%/packages/patches/grub-efi-fat-serial-number.patch		\
   %D%/packages/patches/grub-setup-root.patch			\
-  %D%/packages/patches/gst-plugins-good-fix-test.patch		\
   %D%/packages/patches/guile-1.8-cpp-4.5.patch			\
   %D%/packages/patches/guile-2.2-skip-oom-test.patch            \
   %D%/packages/patches/guile-2.2-skip-so-test.patch             \
@@ -1358,7 +1357,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/julia-SOURCE_DATE_EPOCH-mtime.patch	\
   %D%/packages/patches/julia-tracker-16-compat.patch		\
   %D%/packages/patches/julia-allow-parallel-build.patch		\
-  %D%/packages/patches/kdbusaddons-kinit-file-name.patch	\
   %D%/packages/patches/libffi-3.3-powerpc-fixes.patch		\
   %D%/packages/patches/libffi-float128-powerpc64le.patch	\
   %D%/packages/patches/libobjc2-unbundle-robin-map.patch	\
@@ -1375,16 +1373,10 @@ dist_patch_DATA =						\
   %D%/packages/patches/kiki-missing-includes.patch		\
   %D%/packages/patches/kiki-portability-64bit.patch		\
   %D%/packages/patches/kinit-kdeinit-extra_libs.patch		\
-  %D%/packages/patches/kinit-kdeinit-libpath.patch		\
   %D%/packages/patches/kio-search-smbd-on-PATH.patch		\
   %D%/packages/patches/kismet-unbundle-boost.patch		\
-  %D%/packages/patches/kmail-Fix-missing-link-libraries.patch \
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/kmscon-runtime-keymap-switch.patch	\
-  %D%/packages/patches/kpackage-allow-external-paths.patch	\
-  %D%/packages/patches/kpackage-fix-KF5PackageMacros.cmake.patch \
-  %D%/packages/patches/kmplayer-aarch64.patch			\
-  %D%/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch	\
   %D%/packages/patches/kobodeluxe-paths.patch			\
   %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch	\
   %D%/packages/patches/kobodeluxe-const-charp-conversion.patch	\
@@ -1540,6 +1532,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/monero-use-system-miniupnpc.patch			\
   %D%/packages/patches/mosaicatcher-unbundle-htslib.patch	\
   %D%/packages/patches/mrrescue-support-love-11.patch		\
+  %D%/packages/patches/mrustc-riscv64-support.patch		\
   %D%/packages/patches/mtools-mformat-uninitialized.patch	\
   %D%/packages/patches/mupen64plus-ui-console-notice.patch	\
   %D%/packages/patches/mupen64plus-video-z64-glew-correct-path.patch    \
@@ -1665,13 +1658,10 @@ dist_patch_DATA =						\
   %D%/packages/patches/plib-CVE-2011-4620.patch		\
   %D%/packages/patches/plib-CVE-2012-4552.patch		\
   %D%/packages/patches/plotutils-spline-test.patch		\
-  %D%/packages/patches/polkit-CVE-2021-4034.patch		\
-  %D%/packages/patches/polkit-configure-elogind.patch		\
-  %D%/packages/patches/polkit-use-duktape.patch			\
+  %D%/packages/patches/polkit-disable-systemd.patch		\
   %D%/packages/patches/portaudio-audacity-compat.patch		\
   %D%/packages/patches/portmidi-modular-build.patch		\
   %D%/packages/patches/postgresql-disable-resolve_symlinks.patch	\
-  %D%/packages/patches/postgresql-riscv-spinlocks.patch	\
   %D%/packages/patches/procmail-ambiguous-getline-debian.patch  \
   %D%/packages/patches/procmail-CVE-2014-3618.patch		\
   %D%/packages/patches/procmail-CVE-2017-16844.patch		\
@@ -1706,6 +1696,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-argcomplete-1.11.1-fish31.patch	\
   %D%/packages/patches/python-cross-compile.patch		\
   %D%/packages/patches/python-configobj-setuptools.patch	\
+  %D%/packages/patches/python-dateutil-pytest-compat.patch	\
   %D%/packages/patches/python-debugpy-unbundle-pydevd.patch	\
   %D%/packages/patches/python-docopt-pytest6-compat.patch	\
   %D%/packages/patches/python-execnet-read-only-fix.patch	\
@@ -1797,12 +1788,13 @@ dist_patch_DATA =						\
   %D%/packages/patches/rocm-comgr-3.1.0-dependencies.patch \
   %D%/packages/patches/rocm-opencl-runtime-4.3-noclinfo.patch \
   %D%/packages/patches/rocm-opencl-runtime-4.3-noopencl.patch \
+  %D%/packages/patches/ruby-hydra-minimal-no-byebug.patch		\
   %D%/packages/patches/ruby-anystyle-data-immutable-install.patch	\
   %D%/packages/patches/ruby-anystyle-fix-dictionary-populate.patch	\
   %D%/packages/patches/ruby-latex-decode-fix-test.patch		\
   %D%/packages/patches/ruby-mustache-1.1.1-fix-race-condition-tests.patch \
   %D%/packages/patches/ruby-sanitize-system-libxml.patch	\
-  %D%/packages/patches/rustc-1.39.0-src.patch			\
+  %D%/packages/patches/rustc-1.54.0-src.patch			\
   %D%/packages/patches/rust-adblock-ignore-live-tests.patch		\
   %D%/packages/patches/i3status-rust-enable-unstable-features.patch	\
   %D%/packages/patches/rust-ndarray-remove-blas-src-dep.patch	\
@@ -1879,6 +1871,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/telegram-purple-adjust-test.patch	\
   %D%/packages/patches/texi2html-document-encoding.patch	\
   %D%/packages/patches/texi2html-i18n.patch			\
+  %D%/packages/patches/texlive-hyph-utf8-no-byebug.patch	\
   %D%/packages/patches/thefuck-test-environ.patch		\
   %D%/packages/patches/tidy-CVE-2015-5522+5523.patch		\
   %D%/packages/patches/timescaledb-flaky-test.patch		\
diff --git a/gnu/packages/bdw-gc.scm b/gnu/packages/bdw-gc.scm
index 268f0703b8..c812248e86 100644
--- a/gnu/packages/bdw-gc.scm
+++ b/gnu/packages/bdw-gc.scm
@@ -125,7 +125,7 @@ C or C++ programs, though that is not its primary goal.")
 (define-public libatomic-ops
   (package
     (name "libatomic-ops")
-    (version "7.6.10")
+    (version "7.6.12")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -133,13 +133,8 @@ C or C++ programs, though that is not its primary goal.")
                     version "/libatomic_ops-" version ".tar.gz"))
               (sha256
                (base32
-                "1bwry043f62pc4mgdd37zx3fif19qyrs8f5bw7qxlmkzh5hdyzjq"))))
+                "0glzah695wsf6c27hs5wwlw4mnq1vfivdshz1rb8pq7w4mp5dazh"))))
     (build-system gnu-build-system)
-    (arguments
-     `(,@(if (target-riscv64?)
-           `(#:configure-flags
-             (list "CFLAGS_EXTRA=-latomic"))
-           '())))
     (outputs '("out" "debug"))
     (synopsis "Accessing hardware atomic memory update operations")
     (description
diff --git a/gnu/packages/calendar.scm b/gnu/packages/calendar.scm
index ca25c4bec6..6583810277 100644
--- a/gnu/packages/calendar.scm
+++ b/gnu/packages/calendar.scm
@@ -119,7 +119,7 @@ the <tz.h> library for handling time zones and leap seconds.")
 (define-public libical
   (package
     (name "libical")
-    (version "3.0.10")
+    (version "3.0.14")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -127,7 +127,7 @@ the <tz.h> library for handling time zones and leap seconds.")
                     version "/libical-" version ".tar.gz"))
               (sha256
                (base32
-                "1d1nqcfilb4k8bc5x85fhnd26l1ski58wpk2nmds6mlxrzkb6czr"))))
+                "13ycghsi4iv8mnm0xv97bs0x6qvfhdxkw20n3yhcc7bg6n0bg122"))))
     (build-system cmake-build-system)
     (arguments
      '(#:tests? #f ; test suite appears broken
@@ -143,8 +143,7 @@ the <tz.h> library for handling time zones and leap seconds.")
              (substitute* "doc/reference/libical-glib/libical-glib-docs.sgml.in"
                (("http://www.oasis-open.org/docbook/xml/4.3/")
                 (string-append (assoc-ref inputs "docbook-xml")
-                               "/xml/dtd/docbook/")))
-             #t))
+                               "/xml/dtd/docbook/")))))
          (add-before 'configure 'patch-paths
            (lambda* (#:key inputs #:allow-other-keys)
              ;; TODO: libical 3.1.0 supports using TZDIR instead of a hard-coded
@@ -156,8 +155,7 @@ the <tz.h> library for handling time zones and leap seconds.")
                   (string-append "\"" tzdata "/share/zoneinfo\""))
                  (("\\\"/usr/lib/zoneinfo\\\",") "")
                  (("\\\"/etc/zoneinfo\\\",") "")
-                 (("\\\"/usr/share/lib/zoneinfo\\\"") "")))
-             #t)))))
+                 (("\\\"/usr/share/lib/zoneinfo\\\"") ""))))))))
     (native-inputs
      (list docbook-xml-4.3
            gobject-introspection
diff --git a/gnu/packages/certs.scm b/gnu/packages/certs.scm
index 53fb027563..b8dfe96e6d 100644
--- a/gnu/packages/certs.scm
+++ b/gnu/packages/certs.scm
@@ -131,7 +131,7 @@ that was originally contributed to Debian.")
     ;; XXX We used to refer to the nss package here, but that eventually caused
     ;; module cycles.  The below is a quick copy-paste job that must be kept in
     ;; sync manually.  Surely there's a better way…?
-    (version "3.71")
+    (version "3.81")
     (source (origin
               (method url-fetch)
               (uri (let ((version-with-underscores
@@ -142,7 +142,7 @@ that was originally contributed to Debian.")
                       "nss-" version ".tar.gz")))
               (sha256
                (base32
-                "0ly2l3dv6z5hlxs72h5x6796ni3x1bq60saavaf42ddgv4ax7b4r"))
+                "19ncvhz45dhr0nmymwkxspq9l44gaafkspxiwxbqs1hpnqxmzgx8"))
               ;; Create nss.pc and nss-config.
               (patches (search-patches "nss-3.56-pkgconfig.patch"
                                        "nss-getcwd-nonnull.patch"
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index 797fe71277..a02f4621ac 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -2720,18 +2720,29 @@ create data based on random numbers and yet remain repeatable.")
 (define-public python-freezegun
   (package
     (name "python-freezegun")
-    (version "0.3.14")
+    (version "1.2.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "freezegun" version))
        (sha256
-        (base32 "0al75mk829j1izxi760b7yjnknjihyfhp2mvi5qiyrxb9cpxwqk2"))))
+        (base32 "0ijlq32qvpm5zprfzbyzawpl9qjsknlxhryr1i0q84wl0sxd28nd"))
+       (modules '((guix build utils)))
+       (snippet
+        ;; Add an explicit case for static methods as they are callable
+        ;; in Python 3.10, breaking this conditional.
+        ;; XXX Taken from upstream pull request:
+        ;; https://github.com/spulec/freezegun/pull/397
+        '(substitute* "freezegun/api.py"
+           (("if not callable\\(attr_value\\) or \
+inspect\\.isclass\\(attr_value\\):")
+            "if (not callable(attr_value) or inspect.isclass(attr_value)\
+or isinstance(attr_value, staticmethod)):")))))
     (build-system python-build-system)
     (native-inputs
-     (list python-mock python-pytest))
+     (list python-pytest))
     (propagated-inputs
-     (list python-six python-dateutil))
+     (list python-dateutil))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
diff --git a/gnu/packages/crates-graphics.scm b/gnu/packages/crates-graphics.scm
index fae1312d2a..19fc841b63 100644
--- a/gnu/packages/crates-graphics.scm
+++ b/gnu/packages/crates-graphics.scm
@@ -12,6 +12,7 @@
 ;;; Copyright © 2020 Antoine Côté <antoine.cote@posteo.net>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2022 Marius Bakke <marius@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2004,31 +2005,58 @@ interactive applications.")
      "This package provides a library for window abstraction.")
     (license license:expat)))
 
-(define-public rust-png-0.16
+(define-public rust-png-0.17
   (package
     (name "rust-png")
-    (version "0.16.8")
+    (version "0.17.5")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "png" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "1ipl44q3vy4kvx6j296vk7d4v8gvcg203lrkvvixwixq1j98fciw"))))
+        (base32 "1fp3vnaxmjdv71dcakc21k07ir5s31dlx1mrazfqddzgaynw0f6w"))))
     (build-system cargo-build-system)
     (arguments
-     `(#:skip-build? #t
+     `(#:tests? #false                  ;XXX missing files in tarball
        #:cargo-inputs
        (("rust-bitflags" ,rust-bitflags-1)
         ("rust-crc32fast" ,rust-crc32fast-1)
-        ("rust-deflate" ,rust-deflate-0.8)
-        ("rust-miniz-oxide" ,rust-miniz-oxide-0.3))))
-    (home-page "https://github.com/image-rs/image-png.git")
+        ("rust-deflate" ,rust-deflate-1)
+        ("rust-miniz-oxide" ,rust-miniz-oxide-0.5))
+       #:cargo-development-inputs
+       (("rust-criterion" ,rust-criterion-0.3)
+        ("rust-getopts" ,rust-getopts-0.2)
+        ("rust-glium" ,rust-glium-0.31)
+        ("rust-glob" ,rust-glob-0.3)
+        ("rust-rand" ,rust-rand-0.8)
+        ("rust-term" ,rust-term-0.7))))
+    (home-page "https://github.com/image-rs/image-png")
     (synopsis "PNG decoding and encoding library in pure Rust")
     (description
      "This package is a PNG decoding and encoding library in pure Rust.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-png-0.16
+  (package
+    (inherit rust-png-0.17)
+    (name "rust-png")
+    (version "0.16.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "png" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1ipl44q3vy4kvx6j296vk7d4v8gvcg203lrkvvixwixq1j98fciw"))))
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-crc32fast" ,rust-crc32fast-1)
+        ("rust-deflate" ,rust-deflate-0.8)
+        ("rust-miniz-oxide" ,rust-miniz-oxide-0.3))))))
+
 (define-public rust-png-0.15
   (package
     (inherit rust-png-0.16)
diff --git a/gnu/packages/crates-gtk.scm b/gnu/packages/crates-gtk.scm
index c0cdc13a59..cfa5de9f2a 100644
--- a/gnu/packages/crates-gtk.scm
+++ b/gnu/packages/crates-gtk.scm
@@ -168,8 +168,40 @@
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
+(define-public rust-cairo-rs-0.15
+  (package
+    (name "rust-cairo-rs")
+    (version "0.15.12")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "cairo-rs" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1g396fdz8crf74dmmjarcsdbsm8qgxy3a5x9kw6m2d9xn28y6vn7"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-cairo-sys-rs" ,rust-cairo-sys-rs-0.15)
+        ("rust-freetype" ,rust-freetype-0.7)
+        ("rust-glib" ,rust-glib-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-thiserror" ,rust-thiserror-1))
+       #:cargo-development-inputs
+       (("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list cairo))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "Rust bindings for the Cairo library")
+    (description "Rust bindings for the Cairo library")
+    (license license:expat)))
+
 (define-public rust-cairo-rs-0.14
   (package
+    (inherit rust-cairo-rs-0.15)
     (name "rust-cairo-rs")
     (version "0.14.9")
     (source
@@ -191,13 +223,7 @@
         ("rust-libc" ,rust-libc-0.2)
         ("rust-thiserror" ,rust-thiserror-1))
        #:cargo-development-inputs
-       (("rust-tempfile" ,rust-tempfile-3))))
-    (inputs
-     (list cairo))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "Rust bindings for the Cairo library")
-    (description "Rust bindings for the Cairo library")
-    (license license:expat)))
+       (("rust-tempfile" ,rust-tempfile-3))))))
 
 (define-public rust-cairo-rs-0.9
   (package
@@ -277,8 +303,37 @@
        #:cargo-development-inputs
        (("rust-tempfile" ,rust-tempfile-3))))))
 
+(define-public rust-cairo-sys-rs-0.15
+  (package
+    (name "rust-cairo-sys-rs")
+    (version "0.15.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "cairo-sys-rs" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1j6k4pps3dv6g0vlpmxc2xyk0s40vj2wpzi55lbwjspmpqlx8m9w"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-glib-sys" ,rust-glib-sys-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-system-deps" ,rust-system-deps-6)
+        ("rust-winapi" ,rust-winapi-0.3)
+        ("rust-x11" ,rust-x11-2))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list cairo))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "FFI bindings to libcairo")
+    (description "This package provides FFI bindings to libcairo.")
+    (license license:expat)))
+
 (define-public rust-cairo-sys-rs-0.14
   (package
+    (inherit rust-cairo-sys-rs-0.15)
     (name "rust-cairo-sys-rs")
     (version "0.14.9")
     (source
@@ -288,7 +343,6 @@
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32 "0w3md4xk87ign30wb3rqfmmj0q6pvg5arbm35flgsd08jxvbhj5l"))))
-    (build-system cargo-build-system)
     (arguments
      `(#:skip-build?
        #t
@@ -298,12 +352,7 @@
         ("rust-system-deps" ,rust-system-deps-3)
         ("rust-winapi" ,rust-winapi-0.3)
         ("rust-x11" ,rust-x11-2))))
-    (inputs
-     (list cairo))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "FFI bindings to libcairo")
-    (description "This package provides FFI bindings to libcairo.")
-    (license license:expat)))
+    (native-inputs '())))
 
 (define-public rust-cairo-sys-rs-0.10
   (package
@@ -440,8 +489,41 @@
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
+(define-public rust-gdk-pixbuf-0.15
+  (package
+    (name "rust-gdk-pixbuf")
+    (version "0.15.11")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "gdk-pixbuf" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "16k1z21r76m620z61kfmgid1n6s8dnxpa4zlrppcr6dhr2fdsf5d"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; FIXME: error[E0277]: `Errors` doesn't implement `std::fmt::Display`
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-gdk-pixbuf-sys" ,rust-gdk-pixbuf-sys-0.15)
+        ("rust-gio" ,rust-gio-0.15)
+        ("rust-glib" ,rust-glib-0.15)
+        ("rust-libc" ,rust-libc-0.2))
+       #:cargo-development-inputs
+       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list gdk-pixbuf))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "Rust bindings for the GdkPixbuf library")
+    (description "Rust bindings for the GdkPixbuf library")
+    (license license:expat)))
+
 (define-public rust-gdk-pixbuf-0.14
   (package
+    (inherit rust-gdk-pixbuf-0.15)
     (name "rust-gdk-pixbuf")
     (version "0.14.0")
     (source
@@ -461,13 +543,7 @@
         ("rust-glib" ,rust-glib-0.14)
         ("rust-libc" ,rust-libc-0.2))
        #:cargo-development-inputs
-       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))
-    (inputs
-     (list gdk-pixbuf))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "Rust bindings for the GdkPixbuf library")
-    (description "Rust bindings for the GdkPixbuf library")
-    (license license:expat)))
+       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
 (define-public rust-gdk-pixbuf-0.9
   (package
@@ -549,8 +625,42 @@
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
+(define-public rust-gdk-pixbuf-sys-0.15
+  (package
+    (name "rust-gdk-pixbuf-sys")
+    (version "0.15.10")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "gdk-pixbuf-sys" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "19q2qjrzmmgc7bbs59sk6k0sv3xhpmnk9a2h0cajfr95g19jy2ql"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;#:skip-build?
+       ;#t
+       #:cargo-inputs
+       (("rust-gio-sys" ,rust-gio-sys-0.15)
+        ("rust-glib-sys" ,rust-glib-sys-0.15)
+        ("rust-gobject-sys" ,rust-gobject-sys-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-system-deps" ,rust-system-deps-6))
+       #:cargo-development-inputs
+       (("rust-shell-words" ,rust-shell-words-1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list gdk-pixbuf))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "FFI bindings to libgdk_pixbuf-2.0")
+    (description "This package provides FFI bindings to @code{libgdk_pixbuf-2.0}.")
+    (license license:expat)))
+
 (define-public rust-gdk-pixbuf-sys-0.14
   (package
+    (inherit rust-gdk-pixbuf-sys-0.15)
     (name "rust-gdk-pixbuf-sys")
     (version "0.14.0")
     (source
@@ -572,13 +682,7 @@
         ("rust-system-deps" ,rust-system-deps-3))
        #:cargo-development-inputs
        (("rust-shell-words" ,rust-shell-words-0.1)
-        ("rust-tempfile" ,rust-tempfile-3))))
-    (inputs
-     (list gdk-pixbuf))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "FFI bindings to libgdk_pixbuf-2.0")
-    (description "This package provides FFI bindings to @code{libgdk_pixbuf-2.0}.")
-    (license license:expat)))
+        ("rust-tempfile" ,rust-tempfile-3))))))
 
 (define-public rust-gdk-pixbuf-sys-0.10
   (package
@@ -719,8 +823,48 @@
        (("rust-shell-words" ,rust-shell-words-0.1)
         ("rust-tempfile" ,rust-tempfile-3))))))
 
+(define-public rust-gio-0.15
+  (package
+    (name "rust-gio")
+    (version "0.15.12")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "gio" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0fr8qiqjf9yzl8867kgqdsxpkcx2jrns3xwmlf0jfiid668brzb8"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; FIXME: error[E0277]: `Errors` doesn't implement `std::fmt::Display`
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-futures-channel" ,rust-futures-channel-0.3)
+        ("rust-futures-core" ,rust-futures-core-0.3)
+        ("rust-futures-io" ,rust-futures-io-0.3)
+        ("rust-futures-util" ,rust-futures-util-0.3)
+        ("rust-gio-sys" ,rust-gio-sys-0.15)
+        ("rust-glib" ,rust-glib-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-once-cell" ,rust-once-cell-1)
+        ("rust-thiserror" ,rust-thiserror-1))
+       #:cargo-development-inputs
+       (("rust-futures-util" ,rust-futures-util-0.3)
+        ("rust-gir-format-check" ,rust-gir-format-check-0.1)
+        ("rust-serial-test" ,rust-serial-test-0.6))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list glib))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "Rust bindings for the Gio library")
+    (description "Rust bindings for the Gio library")
+    (license license:expat)))
+
 (define-public rust-gio-0.14
   (package
+    (inherit rust-gio-0.15)
     (name "rust-gio")
     (version "0.14.8")
     (source
@@ -746,13 +890,7 @@
         ("rust-thiserror" ,rust-thiserror-1))
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1)
-        ("rust-serial-test" ,rust-serial-test-0.4))))
-    (inputs
-     (list glib))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "Rust bindings for the Gio library")
-    (description "Rust bindings for the Gio library")
-    (license license:expat)))
+        ("rust-serial-test" ,rust-serial-test-0.4))))))
 
 (define-public rust-gio-0.9
   (package
@@ -848,8 +986,51 @@
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
+(define-public rust-gio-sys-0.15
+  (package
+    (name "rust-gio-sys")
+    (version "0.15.10")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "gio-sys" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "13fgmc2xdzg9qk9l3nlp1bilwn6466mrqbiq4fhc9qkia93pl59j"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; FIXME: some GLib macros are not found
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-glib-sys" ,rust-glib-sys-0.15)
+        ("rust-gobject-sys" ,rust-gobject-sys-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-system-deps" ,rust-system-deps-6)
+        ("rust-winapi" ,rust-winapi-0.3))
+       #:cargo-development-inputs
+       (("rust-shell-words" ,rust-shell-words-1)
+        ("rust-tempfile" ,rust-tempfile-3))
+       #:phases (modify-phases %standard-phases
+                  (add-before 'check 'extend-include-path
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (let ((gio-headers (search-input-directory
+                                          inputs "include/gio-unix-2.0")))
+                        ;; Tests rely on these headers.
+                        (setenv "C_INCLUDE_PATH"
+                                (string-append gio-headers ":"
+                                               (getenv "C_INCLUDE_PATH")))))))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list glib))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "FFI bindings to libgio-2.0")
+    (description "This package provides FFI bindings to libgio-2.0.")
+    (license license:expat)))
+
 (define-public rust-gio-sys-0.14
   (package
+    (inherit rust-gio-sys-0.15)
     (name "rust-gio-sys")
     (version "0.14.0")
     (source
@@ -868,13 +1049,7 @@
         ("rust-gobject-sys" ,rust-gobject-sys-0.14)
         ("rust-libc" ,rust-libc-0.2)
         ("rust-system-deps" ,rust-system-deps-3)
-        ("rust-winapi" ,rust-winapi-0.3))))
-    (inputs
-     (list glib))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "FFI bindings to libgio-2.0")
-    (description "This package provides FFI bindings to libgio-2.0.")
-    (license license:expat)))
+        ("rust-winapi" ,rust-winapi-0.3))))))
 
 (define-public rust-gio-sys-0.10
   (package
@@ -939,8 +1114,51 @@
     (description "File format checker in Rust.")
     (license license:expat)))
 
+(define-public rust-glib-0.15
+  (package
+    (name "rust-glib")
+    (version "0.15.12")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "glib" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0pahikbwxr3vafdrr5l2hnlhkf9xi4illryan0l59ayhp9pk1c7d"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; FIXME: error[E0277]: `Errors` doesn't implement `std::fmt::Display`
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-futures-channel" ,rust-futures-channel-0.3)
+        ("rust-futures-core" ,rust-futures-core-0.3)
+        ("rust-futures-executor" ,rust-futures-executor-0.3)
+        ("rust-futures-task" ,rust-futures-task-0.3)
+        ("rust-glib-macros" ,rust-glib-macros-0.15)
+        ("rust-glib-sys" ,rust-glib-sys-0.15)
+        ("rust-gobject-sys" ,rust-gobject-sys-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-log" ,rust-log-0.4)
+        ("rust-once-cell" ,rust-once-cell-1)
+        ("rust-smallvec" ,rust-smallvec-1)
+        ("rust-thiserror" ,rust-thiserror-1))
+       #:cargo-development-inputs
+       (("rust-futures-util" ,rust-futures-util-0.3)
+        ("rust-gir-format-check" ,rust-gir-format-check-0.1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list glib))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "Rust bindings for the GLib library")
+    (description "Rust bindings for the GLib library")
+    (license license:expat)))
+
 (define-public rust-glib-0.14
   (package
+    (inherit rust-glib-0.15)
     (name "rust-glib")
     (version "0.14.8")
     (source
@@ -966,13 +1184,7 @@
         ("rust-libc" ,rust-libc-0.2)
         ("rust-log" ,rust-log-0.4)
         ("rust-once-cell" ,rust-once-cell-1)
-        ("rust-smallvec" ,rust-smallvec-1))))
-    (inputs
-     (list glib))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "Rust bindings for the GLib library")
-    (description "Rust bindings for the GLib library")
-    (license license:expat)))
+        ("rust-smallvec" ,rust-smallvec-1))))))
 
 (define-public rust-glib-0.10
   (package
@@ -1057,8 +1269,37 @@
        #:cargo-development-inputs
        (("rust-tempfile" ,rust-tempfile-3))))))
 
+(define-public rust-glib-macros-0.15
+  (package
+    (name "rust-glib-macros")
+    (version "0.15.11")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "glib-macros" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0r3cr0c79rs91z0sps089nsf8ppnm8agp48qwwqlkc32lqqq39i5"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; XXX: Circular dependency on rust-glib??
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-anyhow" ,rust-anyhow-1)
+        ("rust-heck" ,rust-heck-0.4)
+        ("rust-proc-macro-crate" ,rust-proc-macro-crate-1)
+        ("rust-proc-macro-error" ,rust-proc-macro-error-1)
+        ("rust-proc-macro2" ,rust-proc-macro2-1)
+        ("rust-quote" ,rust-quote-1)
+        ("rust-syn" ,rust-syn-1))))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "Rust bindings for the GLib library, proc macros crate")
+    (description "Rust bindings for the GLib library, proc macros crate.")
+    (license license:expat)))
+
 (define-public rust-glib-macros-0.14
   (package
+    (inherit rust-glib-macros-0.15)
     (name "rust-glib-macros")
     (version "0.14.1")
     (source
@@ -1079,11 +1320,7 @@
         ("rust-proc-macro-error" ,rust-proc-macro-error-1)
         ("rust-proc-macro2" ,rust-proc-macro2-1)
         ("rust-quote" ,rust-quote-1)
-        ("rust-syn" ,rust-syn-1))))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "Rust bindings for the GLib library, proc macros crate")
-    (description "Rust bindings for the GLib library, proc macros crate.")
-    (license license:expat)))
+        ("rust-syn" ,rust-syn-1))))))
 
 (define-public rust-glib-macros-0.10
   (package
@@ -1109,8 +1346,40 @@
         ("rust-quote" ,rust-quote-1)
         ("rust-syn" ,rust-syn-1))))))
 
+(define-public rust-glib-sys-0.15
+  (package
+    (name "rust-glib-sys")
+    (version "0.15.10")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "glib-sys" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1m5sqm69fdk8vaw6hggyizhs1r1vivx73splrdvczsb5iqpijjzg"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; XXX: Tests are sensitive to the version of glib, even though
+       ;; the library supports a wide range.  Skip for now.
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-libc" ,rust-libc-0.2)
+        ("rust-system-deps" ,rust-system-deps-6))
+       #:cargo-development-inputs
+       (("rust-shell-words" ,rust-shell-words-1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list glib))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "FFI bindings to libglib-2.0")
+    (description "This package provides FFI bindings to libglib-2.0.")
+    (license license:expat)))
+
 (define-public rust-glib-sys-0.14
   (package
+    (inherit rust-glib-sys-0.15)
     (name "rust-glib-sys")
     (version "0.14.0")
     (source
@@ -1120,7 +1389,6 @@
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32 "1bjlymn3fw4g8slij6iiggaipknf9072mr2qm3i4a91199an078w"))))
-    (build-system cargo-build-system)
     (arguments
      `(#:skip-build?
        #t
@@ -1130,12 +1398,7 @@
        #:cargo-development-inputs
        (("rust-shell-words" ,rust-shell-words-0.1)
         ("rust-tempfile" ,rust-tempfile-3))))
-    (inputs
-     (list glib))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "FFI bindings to libglib-2.0")
-    (description "This package provides FFI bindings to libglib-2.0.")
-    (license license:expat)))
+    (native-inputs '())))
 
 (define-public rust-glib-sys-0.10
   (package
@@ -1181,28 +1444,32 @@
        (("rust-shell-words" ,rust-shell-words-0.1)
         ("rust-tempfile" ,rust-tempfile-3))))))
 
-(define-public rust-gobject-sys-0.14
+(define-public rust-gobject-sys-0.15
   (package
     (name "rust-gobject-sys")
-    (version "0.14.0")
+    (version "0.15.10")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "gobject-sys" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "1xf3jiwzrjingq8jr15bjkbv6m5dypzp67cjnm5f7njrjzicm4ma"))))
+        (base32 "02hyilvpi4hw4gr03z2plsbf1zicsfs5l0xxadqx3v3b4i2cwmqd"))))
     (build-system cargo-build-system)
     (arguments
-     `(#:skip-build?
-       #t
+     `(;; FIXME: Constant value mismatch for G_TYPE_FUNDAMENTAL_MAX
+       ;; Rust: "255"
+       ;; C:    "1020"
+       #:tests? #f
        #:cargo-inputs
-       (("rust-glib-sys" ,rust-glib-sys-0.14)
+       (("rust-glib-sys" ,rust-glib-sys-0.15)
         ("rust-libc" ,rust-libc-0.2)
-        ("rust-system-deps" ,rust-system-deps-3))
+        ("rust-system-deps" ,rust-system-deps-6))
        #:cargo-development-inputs
-       (("rust-shell-words" ,rust-shell-words-0.1)
+       (("rust-shell-words" ,rust-shell-words-1)
         ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
     (inputs
      (list glib))
     (home-page "https://gtk-rs.org/")
@@ -1210,6 +1477,28 @@
     (description "This package provides FFI bindings to libgobject-2.0.")
     (license license:expat)))
 
+(define-public rust-gobject-sys-0.14
+  (package
+    (inherit rust-gobject-sys-0.15)
+    (version "0.14.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "gobject-sys" version))
+       (file-name (string-append "rust-gobject-sys-" version ".tar.gz"))
+       (sha256
+        (base32 "1xf3jiwzrjingq8jr15bjkbv6m5dypzp67cjnm5f7njrjzicm4ma"))))
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs
+       (("rust-glib-sys" ,rust-glib-sys-0.14)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-system-deps" ,rust-system-deps-3))
+       #:cargo-development-inputs
+       (("rust-shell-words" ,rust-shell-words-0.1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs '())))
+
 (define-public rust-gobject-sys-0.10
   (package
     (inherit rust-gobject-sys-0.14)
@@ -1482,29 +1771,31 @@
 library.")
     (license license:expat)))
 
-(define-public rust-pango-0.14
+(define-public rust-pango-0.15
   (package
     (name "rust-pango")
-    (version "0.14.8")
+    (version "0.15.10")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "pango" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "10c5q8wl9gkjh323whq6pg9yfvr2vmz00f98z1d77jp506cdavsl"))))
+        (base32 "0ksf85fqkw4y5pf21p84g5xn4fnqn21cbrmx2d9yx6k591ah9r12"))))
     (build-system cargo-build-system)
     (arguments
-     `(#:skip-build?
-       #t
+     `(;; FIXME: error[E0277]: `Errors` doesn't implement `std::fmt::Display`
+       #:tests? #f
        #:cargo-inputs
        (("rust-bitflags" ,rust-bitflags-1)
-        ("rust-glib" ,rust-glib-0.14)
+        ("rust-glib" ,rust-glib-0.15)
         ("rust-libc" ,rust-libc-0.2)
         ("rust-once-cell" ,rust-once-cell-1)
-        ("rust-pango-sys" ,rust-pango-sys-0.14))
+        ("rust-pango-sys" ,rust-pango-sys-0.15))
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))
+    (native-inputs
+     (list pkg-config))
     (inputs
      (list pango))
     (home-page "https://gtk-rs.org/")
@@ -1512,6 +1803,31 @@ library.")
     (description "Rust bindings for the Pango library")
     (license license:expat)))
 
+(define-public rust-pango-0.14
+  (package
+    (inherit rust-pango-0.15)
+    (name "rust-pango")
+    (version "0.14.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pango" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "10c5q8wl9gkjh323whq6pg9yfvr2vmz00f98z1d77jp506cdavsl"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:skip-build?
+       #t
+       #:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-glib" ,rust-glib-0.14)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-once-cell" ,rust-once-cell-1)
+        ("rust-pango-sys" ,rust-pango-sys-0.14))
+       #:cargo-development-inputs
+       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
+
 (define-public rust-pango-0.9
   (package
     (inherit rust-pango-0.14)
@@ -1592,8 +1908,39 @@ library.")
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
+(define-public rust-pango-sys-0.15
+  (package
+    (name "rust-pango-sys")
+    (version "0.15.10")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pango-sys" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1an3c931kbkr08n9d9d1dapsq3n26zs0xn4ixn11jrp4rn0h186j"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-glib-sys" ,rust-glib-sys-0.15)
+        ("rust-gobject-sys" ,rust-gobject-sys-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-system-deps" ,rust-system-deps-6))
+       #:cargo-development-inputs
+       (("rust-shell-words" ,rust-shell-words-1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list pango))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "FFI bindings to libpango-1.0")
+    (description "This package provides FFI bindings to @code{libpango-1.0}.")
+    (license license:expat)))
+
 (define-public rust-pango-sys-0.14
   (package
+    (inherit rust-pango-sys-0.15)
     (name "rust-pango-sys")
     (version "0.14.0")
     (source
@@ -1603,7 +1950,6 @@ library.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32 "1zj236n9kjldf47wwlxvhshwm5zhg589a0fml5mm8qg7lnf0jrr3"))))
-    (build-system cargo-build-system)
     (arguments
      `(#:skip-build?
        #t
@@ -1611,13 +1957,7 @@ library.")
        (("rust-glib-sys" ,rust-glib-sys-0.14)
         ("rust-gobject-sys" ,rust-gobject-sys-0.14)
         ("rust-libc" ,rust-libc-0.2)
-        ("rust-system-deps" ,rust-system-deps-3))))
-    (inputs
-     (list pango))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "FFI bindings to libpango-1.0")
-    (description "This package provides FFI bindings to @code{libpango-1.0}.")
-    (license license:expat)))
+        ("rust-system-deps" ,rust-system-deps-3))))))
 
 (define-public rust-pango-sys-0.10
   (package
@@ -1662,8 +2002,44 @@ library.")
        (("rust-shell-words" ,rust-shell-words-0.1)
         ("rust-tempfile" ,rust-tempfile-3))))))
 
+(define-public rust-pangocairo-0.15
+  (package
+    (name "rust-pangocairo")
+    (version "0.15.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "pangocairo" version))
+        (file-name (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32
+          "0rjk0clrjxah4kc0kybn7l7bxa5m5kpxkihxc2i7a6hx3xfa8xkq"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;; FIXME: error[E0277]: `Errors` doesn't implement `std::fmt::Display`
+       #:tests? #f
+       #:cargo-inputs
+       (("rust-bitflags" ,rust-bitflags-1)
+        ("rust-cairo-rs" ,rust-cairo-rs-0.15)
+        ("rust-glib" ,rust-glib-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-pango" ,rust-pango-0.15)
+        ("rust-pangocairo-sys" ,rust-pangocairo-sys-0.15))
+       #:cargo-development-inputs
+       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list pango))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "Rust bindings for the PangoCairo library")
+    (description
+     "Rust bindings for the PangoCairo library.")
+    (license license:expat)))
+
 (define-public rust-pangocairo-0.9
   (package
+    (inherit rust-pangocairo-0.15)
     (name "rust-pangocairo")
     (version "0.9.0")
     (source
@@ -1690,14 +2066,7 @@ library.")
         ("rust-pangocairo-sys" ,rust-pangocairo-sys-0.10)
         ("rust-gtk-rs-lgpl-docs" ,rust-gtk-rs-lgpl-docs-0.1))
        #:cargo-development-inputs
-       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))
-    (inputs
-     (list gtk+))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "Rust bindings for the PangoCairo library")
-    (description
-     "Rust bindings for the PangoCairo library.")
-    (license license:expat)))
+       (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
 (define-public rust-pangocairo-0.8
   (package
@@ -1729,8 +2098,43 @@ library.")
        #:cargo-development-inputs
        (("rust-gir-format-check" ,rust-gir-format-check-0.1))))))
 
+(define-public rust-pangocairo-sys-0.15
+  (package
+    (name "rust-pangocairo-sys")
+    (version "0.15.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "pangocairo-sys" version))
+        (file-name
+         (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32
+          "154llaawy60zh8fkw2yq0r31ynpmqlsr7brryzaq2v4ijijp9kvq"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-cairo-sys-rs" ,rust-cairo-sys-rs-0.15)
+        ("rust-glib-sys" ,rust-glib-sys-0.15)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-pango-sys" ,rust-pango-sys-0.15)
+        ("rust-system-deps" ,rust-system-deps-6))
+       #:cargo-development-inputs
+       (("rust-shell-words" ,rust-shell-words-1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     ;; XXX: Should these be propagated from their respective crates?
+     (list cairo glib pango))
+    (home-page "https://gtk-rs.org/")
+    (synopsis "FFI bindings to libgtk-3")
+    (description "This package provides FFI bindings to libgtk-3.")
+    (license license:expat)))
+
 (define-public rust-pangocairo-sys-0.10
   (package
+    (inherit rust-pangocairo-sys-0.15)
     (name "rust-pangocairo-sys")
     (version "0.10.1")
     (source
@@ -1752,13 +2156,7 @@ library.")
         ("rust-pkg-config" ,rust-pkg-config-0.3))
        #:cargo-development-inputs
        (("rust-shell-words" ,rust-shell-words-0.1)
-        ("rust-tempfile" ,rust-tempfile-3))))
-    (inputs
-     (list gtk+))
-    (home-page "https://gtk-rs.org/")
-    (synopsis "FFI bindings to libgtk-3")
-    (description "This package provides FFI bindings to libgtk-3.")
-    (license license:expat)))
+        ("rust-tempfile" ,rust-tempfile-3))))))
 
 (define-public rust-soup-sys-0.10
   (package
diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index 528ad204a7..538267c560 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -1899,7 +1899,7 @@ checksum, used in the zlib compression format.")
 (define-public rust-adler32-1
   (package
     (name "rust-adler32")
-    (version "1.1.0")
+    (version "1.2.0")
     (source
       (origin
         (method url-fetch)
@@ -1908,15 +1908,19 @@ checksum, used in the zlib compression format.")
           (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
-          "0bgks405vz823bphgwhj4l9h6vpfh900s0phfk4qqijyh9xhfysn"))))
+          "0d7jq7jsjyhsgbhnfq5fvrlh9j0i9g1fqrl2735ibv5f75yjgqda"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
        (("rust-compiler-builtins" ,rust-compiler-builtins-0.1)
         ("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1))
        #:cargo-development-inputs
-       (("rust-bencher" ,rust-bencher-0.1)
-        ("rust-rand" ,rust-rand-0.4))))
+       (("rust-criterion" ,rust-criterion-0.3)
+        ("rust-getrandom" ,rust-getrandom-0.1)
+        ("rust-humansize" ,rust-humansize-1)
+        ("rust-rand" ,rust-rand-0.7)
+        ("rust-wasm-bindgen" ,rust-wasm-bindgen-0.2)
+        ("rust-wasm-bindgen-test" ,rust-wasm-bindgen-test-0.3))))
     (home-page "https://github.com/remram44/adler32-rs")
     (synopsis "Implementation of the Adler32 rolling hash algorithm")
     (description
@@ -10544,7 +10548,7 @@ box''.")
 (define-public rust-cc-1
   (package
     (name "rust-cc")
-    (version "1.0.67")
+    (version "1.0.73")
     (source
      (origin
        (method url-fetch)
@@ -10552,7 +10556,7 @@ box''.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1z9p27ys80shv09zhknmlal8jjra78agdwg97i6jjd6lg83rpip3"))))
+         "04ccylrjq94jssh8f7d7hxv64gs9f1m1jrsxb7wqgfxk4xljmzrg"))))
     (build-system cargo-build-system)
     (arguments
      `(#:tests? #f
@@ -10691,24 +10695,24 @@ that need to represent UTF-16 data as 8-bit characters.")
 winded @code{#[cfg()]} checks.")
     (license license:expat)))
 
-(define-public rust-cfg-expr-0.8
+(define-public rust-cfg-expr-0.10
   (package
     (name "rust-cfg-expr")
-    (version "0.8.1")
+    (version "0.10.3")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "cfg-expr" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "03lgv8psc2qrr93hxgdfmfwbj1crpzghxd7qh6w2nz0l4qryh4ml"))))
+        (base32 "1nw50j1sl6q96067399r1c6ppwp483q6vvmqdsnv493cv7sarb0a"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
        (("rust-smallvec" ,rust-smallvec-1)
         ("rust-target-lexicon" ,rust-target-lexicon-0.12))
        #:cargo-development-inputs
-       (("rust-difference" ,rust-difference-2))))
+       (("rust-similar-asserts" ,rust-similar-asserts-1))))
     (home-page "https://github.com/EmbarkStudios/cfg-expr")
     (synopsis "Parser and evaluator for Rust @code{cfg()} expressions")
     (description
@@ -10716,6 +10720,26 @@ winded @code{#[cfg()]} checks.")
 expressions.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-cfg-expr-0.8
+  (package
+    (inherit rust-cfg-expr-0.10)
+    (name "rust-cfg-expr")
+    (version "0.8.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "cfg-expr" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "03lgv8psc2qrr93hxgdfmfwbj1crpzghxd7qh6w2nz0l4qryh4ml"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-smallvec" ,rust-smallvec-1)
+        ("rust-target-lexicon" ,rust-target-lexicon-0.12))
+       #:cargo-development-inputs
+       (("rust-difference" ,rust-difference-2))))))
+
 (define-public rust-cfg-expr-0.7
   (package
     (inherit rust-cfg-expr-0.8)
@@ -14301,7 +14325,7 @@ final xor value.  It has many built-in CRC functions.")
 (define-public rust-crc32fast-1
   (package
     (name "rust-crc32fast")
-    (version "1.2.0")
+    (version "1.3.2")
     (source
      (origin
        (method url-fetch)
@@ -14310,15 +14334,14 @@ final xor value.  It has many built-in CRC functions.")
         (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1c9dhkvf3brrzzplcijaywxi2w8wv5578i0ryhcm7x8dmzi5s4ms"))))
+         "03c8f29yx293yf43xar946xbls1g60c207m9drf8ilqhr25vsh5m"))))
     (build-system cargo-build-system)
     (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-cfg-if" ,rust-cfg-if-0.1))
+     `(#:cargo-inputs
+       (("rust-cfg-if" ,rust-cfg-if-1))
        #:cargo-development-inputs
        (("rust-bencher" ,rust-bencher-0.1)
-        ("rust-quickcheck" ,rust-quickcheck-0.8)
+        ("rust-quickcheck" ,rust-quickcheck-1)
         ("rust-rand" ,rust-rand-0.4))))
     (home-page "https://github.com/srijs/rust-crc32fast")
     (synopsis
@@ -17074,10 +17097,10 @@ the Debug trait manually.")
 thread.")
     (license license:mpl2.0)))
 
-(define-public rust-deflate-0.9
+(define-public rust-deflate-1
   (package
     (name "rust-deflate")
-    (version "0.9.1")
+    (version "1.0.0")
     (source
       (origin
         (method url-fetch)
@@ -17085,21 +17108,42 @@ thread.")
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
-          "0w0ww0hrq4bjnihxgbnrri4lj5c8yzg31fyzx36fd9pvvw2vz5az"))))
+          "0bs319wa9wl7pn9j6jrrxg1gaqbak581rkx210cbix0qyljpwvy8"))))
     (build-system cargo-build-system)
     (arguments
      `(#:tests? #f      ; not all test files included
        #:cargo-inputs
        (("rust-adler32" ,rust-adler32-1)
-        ("rust-gzip-header" ,rust-gzip-header-0.3))
+        ("rust-gzip-header" ,rust-gzip-header-1))
        #:cargo-development-inputs
-       (("rust-miniz-oxide" ,rust-miniz-oxide-0.3))))
+       (("rust-miniz-oxide" ,rust-miniz-oxide-0.5))))
     (home-page "https://github.com/image-rs/deflate-rs")
     (synopsis "DEFLATE, zlib and gzip encoder written in rust")
     (description "This package provides a DEFLATE, zlib and gzip encoder
 written in rust.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-deflate-0.9
+  (package
+    (inherit rust-deflate-1)
+    (name "rust-deflate")
+    (version "0.9.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "deflate" version))
+        (file-name (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32
+          "0w0ww0hrq4bjnihxgbnrri4lj5c8yzg31fyzx36fd9pvvw2vz5az"))))
+    (arguments
+     `(#:tests? #f      ; not all test files included
+       #:cargo-inputs
+       (("rust-adler32" ,rust-adler32-1)
+        ("rust-gzip-header" ,rust-gzip-header-0.3))
+       #:cargo-development-inputs
+       (("rust-miniz-oxide" ,rust-miniz-oxide-0.3))))))
+
 (define-public rust-deflate-0.8
   (package
     (inherit rust-deflate-0.9)
@@ -26608,19 +26652,18 @@ support.")
         ("rust-quote" ,rust-quote-1)
         ("rust-syn" ,rust-syn-1))))))
 
-(define-public rust-gzip-header-0.3
+(define-public rust-gzip-header-1
   (package
     (name "rust-gzip-header")
-    (version "0.3.0")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "gzip-header" version))
-       (file-name
-        (string-append name "-" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0fg6vm8sgsm69szwqyz7abfbyziv6pv0jkcailimlamvsfrzwc81"))))
+         "18lm2y96mahkmcd76pzyam2sl3v6lsl9mn8ajri9l0p6j9xm5k4m"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
@@ -26632,6 +26675,25 @@ support.")
 of gzip files based on the gzip header implementation in the @code{flate2} crate.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-gzip-header-0.3
+  (package
+    (inherit rust-gzip-header-1)
+    (name "rust-gzip-header")
+    (version "0.3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "gzip-header" version))
+       (file-name
+        (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0fg6vm8sgsm69szwqyz7abfbyziv6pv0jkcailimlamvsfrzwc81"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-crc32fast" ,rust-crc32fast-1))))))
+
 (define-public rust-h2-0.3
   (package
     (name "rust-h2")
@@ -30386,14 +30448,14 @@ whether or not a given path points to an executable file.")
 (define-public rust-itertools-0.10
   (package
     (name "rust-itertools")
-    (version "0.10.1")
+    (version "0.10.3")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "itertools" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "1bsyxnm20x05rwc5qskrqy4cfswrcadzlwc26dkqml6hz64vipb9"))))
+        (base32 "1qy55fqbaisr9qgbn7cvdvqlfqbh1f4ddf99zwan56z7l6gx3ad9"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
@@ -47303,8 +47365,34 @@ they were parsed from")
 @code{LC_COLLATE} and @code{LC_CTYPE} are not yet supported.")
     (license license:expat)))
 
+(define-public rust-pyo3-build-config-0.16
+  (package
+    (name "rust-pyo3-build-config")
+    (version "0.16.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pyo3-build-config" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1j2jj5qnnpagi3gvkwjpydcxfsd5qv3vmpghnaqs7n1mdia5pdmm"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-once-cell" ,rust-once-cell-1)
+        ("rust-python3-dll-a" ,rust-python3-dll-a-0.2)
+        ("rust-target-lexicon" ,rust-target-lexicon-0.12))))
+    (native-inputs (list python))       ;for tests
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Build configuration for PyO3")
+    (description
+     "This package contains build configuration helpers for the PyO3
+ecosystem.")
+    (license license:asl2.0)))
+
 (define-public rust-pyo3-build-config-0.15
   (package
+    (inherit rust-pyo3-build-config-0.16)
     (name "rust-pyo3-build-config")
     (version "0.15.1")
     (source
@@ -47314,20 +47402,63 @@ they were parsed from")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32 "0aw5zfqwzj5rzfxjyqvrqfam138d1009jh6kia4xrgdz538y9yfv"))))
-    (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
        #:cargo-inputs
        (("rust-once-cell" ,rust-once-cell-1))))
+    (native-inputs '())))
+
+(define-public rust-pyo3-ffi-0.16
+  (package
+    (name "rust-pyo3-ffi")
+    (version "0.16.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "pyo3-ffi" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0avls4q393nmzhb124zg6kp5lj6xzy2f6qx564qa7b614xqs0xf2"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs
+       (("rust-libc" ,rust-libc-0.2)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.16))))
     (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Build configuration for PyO3")
+    (synopsis "Python API bindings for the PyO3 ecosystem")
     (description
-     "This package contains build configuration helpers for the PyO3
-ecosystem.")
+     "This crate provides Rust FFI declarations for Python 3.")
+    (license license:asl2.0)))
+
+(define-public rust-pyo3-macros-backend-0.16
+  (package
+    (name "rust-pyo3-macros-backend")
+    (version "0.16.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pyo3-macros-backend" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1bvzvdx2a6hhliny12n2vy7v7gbsgzanxjckjr1cbxbkizss1gak"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs
+       (("rust-proc-macro2" ,rust-proc-macro2-1)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.16)
+        ("rust-quote" ,rust-quote-1)
+        ("rust-syn" ,rust-syn-1))))
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Code generation for PyO3")
+    (description
+     "This package provides code generation backends for PyO3.")
     (license license:asl2.0)))
 
 (define-public rust-pyo3-macros-backend-0.15
   (package
+    (inherit rust-pyo3-macros-backend-0.16)
     (name "rust-pyo3-macros-backend")
     (version "0.15.1")
     (source
@@ -47344,11 +47475,30 @@ ecosystem.")
        (("rust-proc-macro2" ,rust-proc-macro2-1)
         ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.15)
         ("rust-quote" ,rust-quote-1)
-        ("rust-syn" ,rust-syn-1))))
+        ("rust-syn" ,rust-syn-1))))))
+
+(define-public rust-pyo3-macros-0.16
+  (package
+    (name "rust-pyo3-macros")
+    (version "0.16.5")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "pyo3-macros" version))
+        (file-name (string-append name "-" version ".tar.gz"))
+        (sha256
+          (base32 "1xwh7sl4n73746q80n5m5afd261zg0kxcqfnlr89ik7vbd4c8kr8"))))
+    (build-system cargo-build-system)
+    (arguments
+      `(#:skip-build? #t
+        #:cargo-inputs
+        (("rust-pyo3-macros-backend" ,rust-pyo3-macros-backend-0.16)
+         ("rust-quote" ,rust-quote-1)
+         ("rust-syn" ,rust-syn-1))))
     (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Code generation for PyO3")
+    (synopsis "Proc macros for PyO3")
     (description
-     "This package provides code generation backends for PyO3.")
+     "This package provides compiler macros for use with PyO3.")
     (license license:asl2.0)))
 
 (define-public rust-pyo3-macros-backend-0.13
@@ -47372,6 +47522,7 @@ ecosystem.")
 
 (define-public rust-pyo3-macros-0.15
   (package
+    (inherit rust-pyo3-macros-0.16)
     (name "rust-pyo3-macros")
     (version "0.15.1")
     (source
@@ -47387,11 +47538,59 @@ ecosystem.")
         #:cargo-inputs
         (("rust-pyo3-macros-backend" ,rust-pyo3-macros-backend-0.15)
          ("rust-quote" ,rust-quote-1)
-         ("rust-syn" ,rust-syn-1))))
+         ("rust-syn" ,rust-syn-1))))))
+
+(define-public rust-pyo3-0.16
+  (package
+    (name "rust-pyo3")
+    (version "0.16.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pyo3" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1p5kjsj3jdw2gnahdjrzljmi93w3nxdp11qq8x3i80b0a3l04qqy"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-anyhow" ,rust-anyhow-1)
+        ("rust-cfg-if" ,rust-cfg-if-1)
+        ("rust-eyre" ,rust-eyre-0.6)
+        ("rust-hashbrown" ,rust-hashbrown-0.11)
+        ("rust-indexmap" ,rust-indexmap-1)
+        ("rust-indoc" ,rust-indoc-1)
+        ("rust-inventory" ,rust-inventory-0.2)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-num-bigint" ,rust-num-bigint-0.4)
+        ("rust-num-complex" ,rust-num-complex-0.4)
+        ("rust-parking-lot" ,rust-parking-lot-0.11)
+        ("rust-paste" ,rust-paste-0.1)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.16)
+        ("rust-pyo3-ffi" ,rust-pyo3-ffi-0.16)
+        ("rust-pyo3-macros" ,rust-pyo3-macros-0.16)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-unindent" ,rust-unindent-0.1))
+       #:cargo-development-inputs
+       (("rust-assert-approx-eq" ,rust-assert-approx-eq-1)
+        ("rust-bitflags" ,rust-bitflags-1.2)
+        ("rust-criterion" ,rust-criterion-0.3)
+        ("rust-half" ,rust-half-1)
+        ("rust-proptest" ,rust-proptest-0.10)
+        ("rust-rustversion" ,rust-rustversion-1)
+        ("rust-send-wrapper" ,rust-send-wrapper-0.5)
+        ("rust-serde-json" ,rust-serde-json-1)
+        ("rust-trybuild" ,rust-trybuild-1)
+        ("rust-widestring" ,rust-widestring-0.5))
+       ;; FIXME: fails to initialize Python interpreter.
+       #:tests? #f))
+    (inputs (list python))
     (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Proc macros for PyO3")
+    (synopsis "Rust bindings for the Python interpreter")
     (description
-     "This package provides compiler macros for use with PyO3.")
+     "This package provides Rust bindings for Python, including tools for
+creating native Python extension modules.  Running and interacting with
+Python code from a Rust binary is also supported.")
     (license license:asl2.0)))
 
 (define-public rust-pyo3-macros-0.13
@@ -47415,6 +47614,7 @@ ecosystem.")
 
 (define-public rust-pyo3-0.15
   (package
+    (inherit rust-pyo3-0.16)
     (name "rust-pyo3")
     (version "0.15.1")
     (source
@@ -47460,15 +47660,7 @@ ecosystem.")
         ("rust-serde-json" ,rust-serde-json-1)
         ("rust-trybuild" ,rust-trybuild-1))
        ;; FIXME: fails to initialize Python interpreter.
-       #:tests? #f))
-    (inputs (list python))
-    (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Rust bindings for the Python interpreter")
-    (description
-     "This package provides Rust bindings for Python, including tools for
-creating native Python extension modules.  Running and interacting with
-Python code from a Rust binary is also supported.")
-    (license license:asl2.0)))
+       #:tests? #f))))
 
 (define-public rust-pyo3-0.13
   (package
@@ -47508,6 +47700,28 @@ Python code from a Rust binary is also supported.")
         ("rust-serde-json" ,rust-serde-json-1)
         ("rust-trybuild" ,rust-trybuild-1))))))
 
+(define-public rust-python3-dll-a-0.2
+  (package
+    (name "rust-python3-dll-a")
+    (version "0.2.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "python3-dll-a" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "01k2nf4wq4f4xnaq3fy1gx12v10pndwmdrjq4x4pshhjxxnrpml9"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:tests? #f                      ;Windows-like targets only
+       #:cargo-inputs (("rust-cc" ,rust-cc-1))))
+    (home-page "https://github.com/pyo3/python3-dll-a")
+    (synopsis "Python import library generator")
+    (description
+     "This crate generates import libraries for the Python shared library
+for MinGW-w64 and MSVC (cross-)compile targets.")
+    (license license:expat)))
+
 (define-public rust-qstring-0.7
   (package
     (name "rust-qstring")
@@ -49896,14 +50110,14 @@ memory to speed up reallocation.")
 (define-public rust-regex-1
   (package
     (name "rust-regex")
-    (version "1.5.4")
+    (version "1.6.0")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "regex" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "0qf479kjbmb582h4d1d6gfl75h0j8aq2nrdi5wg6zdcy6llqcynh"))))
+        (base32 "12wqvyh4i75j7pc8sgvmqh4yy3qaj4inc4alyv1cdf3lf4kb6kjc"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
@@ -50015,14 +50229,14 @@ uses finite automata and guarantees linear time matching on all inputs.")
 (define-public rust-regex-syntax-0.6
   (package
     (name "rust-regex-syntax")
-    (version "0.6.25")
+    (version "0.6.27")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "regex-syntax" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "16y87hz1bxmmz6kk360cxwfm3jnbsxb3x4zw9x1gzz7khic2i5zl"))))
+        (base32 "0i32nnvyzzkvz1rqp2qyfxrp2170859z8ck37jd63c8irrrppy53"))))
     (build-system cargo-build-system)
     (home-page "https://github.com/rust-lang/regex")
     (synopsis "Regular expression parser")
@@ -59115,7 +59329,7 @@ inline storage.")
 (define-public rust-smallvec-1
   (package
     (name "rust-smallvec")
-    (version "1.6.1")
+    (version "1.9.0")
     (source
      (origin
        (method url-fetch)
@@ -59124,11 +59338,12 @@ inline storage.")
         (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0kk08axr0ybfbjzk65a41k84mb6sfhyajmfndaka9igkx34kf3zy"))))
+         "1lfss4vs5z5njm3ac9c499s5m1gphzm5a7gxcbw1zncpjmsdpl1g"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
-       (("rust-serde" ,rust-serde-1))
+       (("rust-arbitrary" ,rust-arbitrary-1)
+        ("rust-serde" ,rust-serde-1))
        #:cargo-development-inputs
        (("rust-bincode" ,rust-bincode-1))))
     (home-page "https://github.com/servo/rust-smallvec")
@@ -62892,31 +63107,31 @@ processors, disks, components and networks.")
     (description "Send log messages to syslog.")
     (license license:expat)))
 
-(define-public rust-system-deps-3
+(define-public rust-system-deps-6
   (package
     (name "rust-system-deps")
-    (version "3.2.0")
+    (version "6.0.2")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "system-deps" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "19ig3hxgyq9d7qy8cwpl74l75ay2w0y0a4rginqb68h7hygjc328"))))
+        (base32 "02g750rlhh7ynqa3p4a3qm7jrkjp3d0jlzrl29z225ch9hf5m951"))))
     (build-system cargo-build-system)
     (arguments
      `(#:tests? #f                      ;source is missing some test files
        #:cargo-inputs
        (("rust-anyhow" ,rust-anyhow-1)
-        ("rust-cfg-expr" ,rust-cfg-expr-0.8)
-        ("rust-heck" ,rust-heck-0.3)
+        ("rust-cfg-expr" ,rust-cfg-expr-0.10)
+        ("rust-heck" ,rust-heck-0.4)
         ("rust-itertools" ,rust-itertools-0.10)
         ("rust-pkg-config" ,rust-pkg-config-0.3)
         ("rust-strum" ,rust-strum-0.21)
         ("rust-strum-macros" ,rust-strum-macros-0.21)
         ("rust-thiserror" ,rust-thiserror-1)
         ("rust-toml" ,rust-toml-0.5)
-        ("rust-version-compare" ,rust-version-compare-0.0))
+        ("rust-version-compare" ,rust-version-compare-0.1))
        #:cargo-development-inputs
        (("rust-assert-matches" ,rust-assert-matches-1)
         ("rust-itertools" ,rust-itertools-0.10)
@@ -62929,6 +63144,37 @@ This makes those dependencies declarative, so other tools can read them as
 well.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-system-deps-3
+  (package
+    (inherit rust-system-deps-6)
+    (name "rust-system-deps")
+    (version "3.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "system-deps" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "19ig3hxgyq9d7qy8cwpl74l75ay2w0y0a4rginqb68h7hygjc328"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:tests? #f                      ;source is missing some test files
+       #:cargo-inputs
+       (("rust-anyhow" ,rust-anyhow-1)
+        ("rust-cfg-expr" ,rust-cfg-expr-0.8)
+        ("rust-heck" ,rust-heck-0.3)
+        ("rust-itertools" ,rust-itertools-0.10)
+        ("rust-pkg-config" ,rust-pkg-config-0.3)
+        ("rust-strum" ,rust-strum-0.21)
+        ("rust-strum-macros" ,rust-strum-macros-0.21)
+        ("rust-thiserror" ,rust-thiserror-1)
+        ("rust-toml" ,rust-toml-0.5)
+        ("rust-version-compare" ,rust-version-compare-0.0))
+       #:cargo-development-inputs
+       (("rust-assert-matches" ,rust-assert-matches-1)
+        ("rust-itertools" ,rust-itertools-0.10)
+        ("rust-lazy-static" ,rust-lazy-static-1))))))
+
 (define-public rust-system-deps-1
   (package
     (inherit rust-system-deps-3)
@@ -63138,14 +63384,14 @@ memory all at once.")
 (define-public rust-target-lexicon-0.12
   (package
     (name "rust-target-lexicon")
-    (version "0.12.2")
+    (version "0.12.4")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "target-lexicon" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "1zsvillq0zsggg3fb0mfmcia0f68wfclahaqc0zgln14pkfzrgyr"))))
+        (base32 "1hfk4v8gbhczr6jwsy1ja6yg4npkvznym6b7r4fbgjc0fw428960"))))
     (build-system cargo-build-system)
     (arguments `(#:skip-build? #t))
     (home-page "https://github.com/CraneStation/target-lexicon")
@@ -65443,14 +65689,14 @@ C library.")
 (define-public rust-tinyvec-1
   (package
     (name "rust-tinyvec")
-    (version "1.1.1")
+    (version "1.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "tinyvec" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "08qhf0a9vxf85bj1hd38i8qzwiwm6v4vvwd11k7c728f59bwlz1i"))))
+        (base32 "0hn3fkpb9nca9nf9znz2dxlp4ccv37hnbh67aczpzpmpbgq20ljv"))))
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
@@ -74200,6 +74446,23 @@ library.")
 for locating fonts.")
     (license license:expat)))
 
+(define-public rust-yeslogic-fontconfig-sys-2
+  (package
+    (inherit rust-yeslogic-fontconfig-sys-3)
+    (name "rust-yeslogic-fontconfig-sys")
+    (version "2.11.2")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "yeslogic-fontconfig-sys" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "13bzwn12dmxnc8iqd6za6q3j2ililnqjcplnlrfblbca4ia73r1q"))))
+    (arguments
+     `(#:cargo-inputs
+       (("rust-const-cstr" ,rust-const-cstr-0.3)
+        ("rust-pkg-config" ,rust-pkg-config-0.3))))))
+
 (define-public rust-zbase32-0.1
   (package
     (name "rust-zbase32")
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index cf07832df7..1142f99531 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -258,17 +258,19 @@ ElasticSearch server")
 (define-public firebird
   (package
     (name "firebird")
-    (version "3.0.7")
+    (version "3.0.10")
     (source
-     (let ((revision "33374-0"))
+     (let ((revision "33601-0"))
        (origin
          (method url-fetch)
          (uri (string-append "https://github.com/FirebirdSQL/"
-                             "firebird/releases/download/R"
-                             (string-replace-substring version "." "_") "/"
+                             "firebird/releases/download/v"
+                             version "/"
                              "Firebird-" version "." revision ".tar.bz2"))
          (sha256
-          (base32 "0xpy1bncz36c6n28y7kllm1dkrdkn4vb4gw2n43f2351mznmrf5c"))
+          (base32 "0h033xj1kxwgvdv4ncm6kk0mqybvvn203gf88xcv3avys9hbnf4i"))
+         (patches (search-patches "firebird-riscv64-support-pt1.patch"
+                                  "firebird-riscv64-support-pt2.patch"))
          (modules '((guix build utils)))
          (snippet
           `(begin
@@ -290,8 +292,7 @@ ElasticSearch server")
                     "doc/Firebird-3-QuickStart.pdf"
                     (string-append "doc/Firebird-" ,version
                                    "-ReleaseNotes.pdf")
-                    "doc/README.SecureRemotePassword.html"))
-             #t)))))
+                    "doc/README.SecureRemotePassword.html")))))))
     (build-system gnu-build-system)
     (outputs (list "debug" "out"))
     (arguments
@@ -324,13 +325,19 @@ ElasticSearch server")
                   (srfi srfi-26))
        #:phases
        (modify-phases %standard-phases
+         ,@(if (target-riscv64?)
+             `((add-before 'bootstrap 'force-bootstrap
+                 (lambda _
+                   (delete-file "configure")
+                   ;; This file prevents automake from running.
+                   (delete-file "autogen.sh"))))
+             '())
          (add-after 'unpack 'use-system-boost
            (lambda _
              (substitute* "src/include/firebird/Message.h"
                (("\"\\./impl/boost/preprocessor/seq/for_each_i\\.hpp\"")
                 "<boost/preprocessor/seq/for_each_i.hpp>")
-               (("FB_BOOST_") "BOOST_"))
-             #t))
+               (("FB_BOOST_") "BOOST_"))))
          (add-after 'unpack 'patch-installation
            (lambda _
              (substitute*
@@ -358,27 +365,23 @@ ElasticSearch server")
 
              ;; These promote proprietary workflows not relevant on Guix.
              (for-each delete-file-recursively
-                       (find-files "doc" "README\\.(build\\.msvc|NT|Win)"))
-             #t))
+                       (find-files "doc" "README\\.(build\\.msvc|NT|Win)"))))
          (add-after 'configure 'delete-init-scripts
            (lambda _
-             (delete-file-recursively "gen/install/misc")
-             #t))
+             (delete-file-recursively "gen/install/misc")))
          (add-before 'build 'set-build-environment-variables
            (lambda _
              ;; ‘isql’ needs to run & find libfbclient.so during the build.
              ;; This doubles as a rudimentary test in lieu of a test suite.
              (setenv "LD_LIBRARY_PATH"
-                     (string-append (assoc-ref %build-inputs "icu4c") "/lib"))
-             #t))
+                     (string-append (assoc-ref %build-inputs "icu4c") "/lib"))))
          (add-before 'install 'keep-embedded-debug-symbols
            (lambda _
              ;; Let the gnu-build-system separate & deal with them later.
              ;; XXX Upstream would use ‘--strip-unneeded’, shaving a whole
              ;; megabyte off Guix's 7.7M libEngine12.so, for example.
              (substitute* "gen/Makefile.install"
-               (("readelf") "false"))
-             #t))
+               (("readelf") "false"))))
          (add-after 'install 'prune-undesirable-files
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
@@ -389,12 +392,15 @@ ElasticSearch server")
                  ;; Delete (now-)empty directories.
                  (for-each rmdir
                            (list "include/firebird/impl"
-                                 "lib/firebird/plugins/udr"))
-                 #t)))))))
+                                 "lib/firebird/plugins/udr")))))))))
+    (native-inputs
+     (if (target-riscv64?)
+       (list autoconf automake libtool)
+       '()))
     (inputs
      (list boost
            editline
-           icu4c-67
+           icu4c
            libtommath
            ncurses
            zlib))
@@ -417,8 +423,6 @@ Firebird can also be embedded into stand-alone applications that don't want or
 need a full client & server.  Used in this manner, it offers richer SQL support
 than SQLite as well as the option to seamlessly migrate to a client/server
 database later.")
-    (properties
-     `((lint-hidden-cve . ("CVE-2017-6369"))))
     (license
      ;; See doc/license/README.license.usage.txt for rationale & details.
      (list license:bsd-3                ; src/common/sha2/
@@ -1283,39 +1287,13 @@ pictures, sounds, or video.")
   (package
     (inherit postgresql-14)
     (version "13.6")
-    (replacement postgresql-13/replacement)
     (source (origin
               (inherit (package-source postgresql-14))
               (uri (string-append "https://ftp.postgresql.org/pub/source/v"
                                   version "/postgresql-" version ".tar.bz2"))
               (sha256
                (base32
-                "1z37ix80hb2bqa2smh1hbj9r507ypnl3pil43gkqznnlv6ipzz5s"))
-              (patches (search-patches "postgresql-riscv-spinlocks.patch"))))))
-
-;; The merge of commit ...
-;;  781dd2de230e3 gnu: postgresql-13: Fix building on riscv64-linux.
-;; ... in ...
-;;  49b350fafc2c3 Merge branch 'master' into staging.
-;; ... lost the inherited patch from postgresql-14, causing problems such as ...
-;;  05fef7bfc6005 gnu: timescaledb: Adjust test preparation to PostgreSQL 13.6.
-;;
-;; While at it, remove the RISC-V spinlock patch, which has been upstreamed
-;; in a different form (so the old patch still applies).
-;; TODO: Remove in the next rebuild cycle.
-(define postgresql-13/replacement
-  (package
-    (inherit postgresql-13)
-    (version "13.7")
-    (source
-     (origin
-       (inherit (package-source postgresql-13))
-       (uri (string-append "https://ftp.postgresql.org/pub/source/v"
-                           version "/postgresql-" version ".tar.bz2"))
-       (sha256
-        (base32
-         "16b3ljid7zd1v5l4l4pmwihx43wi8p9izidkjfii8dnqygs5p40v"))
-       (patches (search-patches "postgresql-disable-resolve_symlinks.patch"))))))
+                "1z37ix80hb2bqa2smh1hbj9r507ypnl3pil43gkqznnlv6ipzz5s"))))))
 
 (define-public postgresql-11
   (package
@@ -1328,9 +1306,7 @@ pictures, sounds, or video.")
                                   version "/postgresql-" version ".tar.bz2"))
               (sha256
                (base32
-                "1983a7y4y6zhbgh0qcdfkf99445j1zm5q1ncrbkrx555y08y3n9d"))
-              (patches (search-patches
-                        "postgresql-disable-resolve_symlinks.patch"))))
+                "1983a7y4y6zhbgh0qcdfkf99445j1zm5q1ncrbkrx555y08y3n9d"))))
     (native-inputs
      (modify-inputs (package-native-inputs postgresql-13)
        (replace "docbook-xml" docbook-xml-4.2)))))
diff --git a/gnu/packages/display-managers.scm b/gnu/packages/display-managers.scm
index 137bd2739e..ef26890414 100644
--- a/gnu/packages/display-managers.scm
+++ b/gnu/packages/display-managers.scm
@@ -10,7 +10,7 @@
 ;;; Copyright © 2020 Fredrik Salomonsson <plattfot@gmail.com>
 ;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
 ;;; Copyright © 2021 Zheng Junjie <873216071@qq.com>
-;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2021 Petr Hodina <phodina@protonmail.com>
 ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
@@ -77,7 +77,16 @@
                     "sddm-" version ".tar.xz"))
               (sha256
                (base32
-                "0hcdysw8ibr66vk8i7v56l0v5ijvhlq67v4460mc2xf2910g2m72"))))
+                "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)])"))))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config qttools-5))
diff --git a/gnu/packages/education.scm b/gnu/packages/education.scm
index a2607087e5..54cd00d08d 100644
--- a/gnu/packages/education.scm
+++ b/gnu/packages/education.scm
@@ -646,14 +646,14 @@ language and very flexible regarding to new or unknown keyboard layouts.")
 (define-public ktouch
   (package
     (name "ktouch")
-    (version "20.12.1")
+    (version "21.12.2")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "mirror://kde/stable/release-service/"
                             version "/src/ktouch-" version ".tar.xz"))
         (sha256
-         (base32 "10lm2p8w26c9n6lhvw3301myfss0dq7hl7rawzb3hsy1lqvmvdib"))))
+         (base32 "1rq2n8395sb17rqd295axv2pbwzhqs8ikjqx5ryn4lv1713alabl"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools pkg-config))
diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm
index c7339eb00e..97d8bc3dbc 100644
--- a/gnu/packages/freedesktop.scm
+++ b/gnu/packages/freedesktop.scm
@@ -508,14 +508,14 @@ freedesktop.org project.")
   ;; Updating this will rebuild over 700 packages through libinput-minimal.
   (package
     (name "libinput")
-    (version "1.19.2")
+    (version "1.19.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://freedesktop.org/software/libinput/"
                                   "libinput-" version ".tar.xz"))
               (sha256
                (base32
-                "10xqk05mkvsyxfxpn3vwkwb7j22d38wlbg1l1k37f6pfyc59zhqg"))))
+                "0h5lz54rrl48bhi3vki6s08m6rn2h62rlf08dhgchdm9nmqaaczz"))))
     (build-system meson-build-system)
     (arguments
      `(#:configure-flags '("-Ddocumentation=false")
@@ -1649,9 +1649,9 @@ which speak the Qualcomm MSM Interface (QMI) protocol.")
       #~(list (string-append "--with-udev-base-dir=" #$output "/lib/udev"))))
     (native-inputs
      (list dbus
+           gettext-minimal
            gobject-introspection
            `(,glib "bin")               ;for glib-mkenums
-           gettext-minimal
            pkg-config
            python
            python-dbus
@@ -2003,15 +2003,15 @@ manually by a user.")
 (define-public perl-file-basedir
   (package
     (name "perl-file-basedir")
-    (version "0.08")
+    (version "0.09")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/K/KI/KIMRYAN/"
+       (uri (string-append "mirror://cpan/authors/id/P/PL/PLICEASE/"
                            "File-BaseDir-" version ".tar.gz"))
        (sha256
         (base32
-         "1qq5ag9zffx8zc5i9b4z03ar80pqj4drgk3vjdlyfapjwb9zqrf0"))))
+         "1nb757cyyy80xln147qgns113i2ivfpgcfhsxw8qzb322llgg9kd"))))
     (build-system perl-build-system)
     (native-inputs
      (list perl-module-build perl-file-which perl-test-pod
@@ -2055,7 +2055,7 @@ applications define in those files.")
 (define-public perl-file-mimeinfo
   (package
     (name "perl-file-mimeinfo")
-    (version "0.29")
+    (version "0.33")
     (source
      (origin
        (method url-fetch)
@@ -2063,7 +2063,7 @@ applications define in those files.")
                            "File-MimeInfo-" version ".tar.gz"))
        (sha256
         (base32
-         "1sh8r6vczyz08zm8vfsjmkg6a165wch54akjdrd1vbifcmwjg5pi"))))
+         "1i5iw6ri0w9clwpqf40xmsh4isc8xvx2lyf2r5g34886i6rsdgpn"))))
     (build-system perl-build-system)
     (inputs
      ;; TODO(staging): Make unconditional.
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 8d569b013f..5623bdde7d 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -6823,7 +6823,7 @@ fight against their plot and save his fellow rabbits from slavery.")
            libxcursor
            libxml2
            miniupnpc
-           mozjs
+           mozjs-78
            openal
            sdl2
            wxwidgets
diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm
index d56e6a2f7c..5f54aa7483 100644
--- a/gnu/packages/gl.scm
+++ b/gnu/packages/gl.scm
@@ -67,6 +67,7 @@
   #:use-module (guix build-system waf)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module (guix gexp)
   #:use-module (guix utils)
   #:use-module (ice-9 match)
   #:use-module ((srfi srfi-1) #:hide (zip)))
@@ -74,15 +75,22 @@
 (define-public glu
   (package
     (name "glu")
-    (version "9.0.1")
+    (version "9.0.2")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "ftp://ftp.freedesktop.org/pub/mesa/glu/glu-"
-                                  version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://gitlab.freedesktop.org/mesa/glu")
+                    (commit (string-append "glu-" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1xqhk9bn10nbvffw3r4p4rjslwz1l7gaycc0x2pqkr2irp7q9x7n"))))
+                "1khxfidyglpx4yd8f3xvrj05ah823cz1ygcszhcaa4w7h9kd1lbr"))))
     (build-system gnu-build-system)
+    (native-inputs
+     (list pkg-config
+           autoconf
+           automake
+           libtool))
     (propagated-inputs
      (list mesa)) ; according to glu.pc
     (home-page "http://www.opengl.org/archives/resources/faq/technical/glu.htm")
@@ -103,16 +111,15 @@ as ASCII text.")
 (define-public freeglut
   (package
     (name "freeglut")
-    (version "3.2.1")
+    (version "3.2.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "mirror://sourceforge/freeglut/freeglut/"
-                    version "/freeglut-" version ".tar.gz"))
-              (patches (search-patches "freeglut-gcc-compat.patch"))
+                    "https://github.com/FreeGLUTProject/freeglut/releases"
+                    "/download/v" version "/freeglut-" version ".tar.gz"))
               (sha256
                (base32
-                "0s6sk49q8ijgbsrrryb7dzqx2fa744jhx1wck5cz5jia2010w06l"))))
+                "0l3s57zw51fy3mn5qfdm4z775kfhflgxppanaxmskfzh5l44m565"))))
     (build-system cmake-build-system)
     (arguments
      '(#:tests? #f                      ;no test target
@@ -248,14 +255,14 @@ also known as DXTn or DXTC) for Mesa.")
     (package
       (inherit libva)
       (name "libva-without-mesa")
-      (inputs `(,@(fold alist-delete (package-inputs libva)
-                        '("mesa" "wayland"))))
+      (inputs (fold alist-delete (package-inputs libva)
+                    '("mesa" "wayland")))
       (arguments
        (strip-keyword-arguments
         '(#:make-flags)
         (substitute-keyword-arguments (package-arguments libva)
           ((#:configure-flags flags)
-           '(list "--disable-glx" "--disable-egl"))))))))
+           '(list "--disable-glx"))))))))
 
 (define-public mesa
   (package
@@ -716,37 +723,31 @@ OpenGL graphics API.")
 (define-public libepoxy
   (package
     (name "libepoxy")
-    (version "1.5.5")
+    (version "1.5.10")
+    (home-page "https://github.com/anholt/libepoxy")
     (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://github.com/anholt/libepoxy/releases/download/"
-                    version "/libepoxy-" version ".tar.xz"))
+              (method git-fetch)
+              (uri (git-reference (url home-page) (commit version)))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0mh5bdgqfd8m4wj6jlvn4ac94sgfa8r6ish75ciwrhdw47dn65i6"))))
+                "0jw02bzdwynyrwsn5rhcacv92h9xx928j3xp436f8gdnwlyb5641"))))
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (delete 'bootstrap)
-         (add-before
-           'configure 'patch-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((python (assoc-ref inputs "python"))
-                   (mesa (assoc-ref inputs "mesa")))
-               (substitute* "src/gen_dispatch.py"
-                 (("/usr/bin/env python") python))
-               (substitute* (find-files "." "\\.[ch]$")
-                 (("libGL.so.1") (string-append mesa "/lib/libGL.so.1"))
-                 (("libEGL.so.1") (string-append mesa "/lib/libEGL.so.1")))
-               #t))))))
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'configure 'patch-paths
+            (lambda* (#:key inputs #:allow-other-keys)
+              (let ((mesa (dirname (search-input-file inputs "lib/libGL.so"))))
+                (substitute* (find-files "." "\\.[ch]$")
+                  (("libGL.so.1") (string-append mesa "/libGL.so.1"))
+                  (("libEGL.so.1") (string-append mesa "/libEGL.so.1")))))))))
     (build-system meson-build-system)
     (native-inputs
      (list pkg-config python))
     (propagated-inputs
      ;; epoxy.pc: 'Requires.private: gl egl'
      (list mesa))
-    (home-page "https://github.com/anholt/libepoxy/")
     (synopsis "Library for handling OpenGL function pointer management")
     (description
      "A library for handling OpenGL function pointer management.")
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index c3bc3ca2fb..6db5016cea 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -5179,7 +5179,7 @@ and the GLib main loop, to integrate well with GNOME applications.")
 (define-public libsecret
   (package
     (name "libsecret")
-    (version "0.20.4")
+    (version "0.20.5")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -5188,28 +5188,47 @@ and the GLib main loop, to integrate well with GNOME applications.")
                     "libsecret-" version ".tar.xz"))
               (sha256
                (base32
-                "0a4xnfmraxchd9cq5ai66j12jv2vrgjmaaxz25kl031jvda4qnij"))))
-    (build-system gnu-build-system)
-    (outputs '("out" "doc"))
+                "0k9bs47rzb3dwvznb4179d6nw7rbzjdyd4y8hx6vazfd1wscxcrz"))))
+    (build-system meson-build-system)
     (arguments
-     `(#:tests? #f ; FIXME: Testing hangs.
-       #:configure-flags
-       (list (string-append "--with-html-dir="
-                            (assoc-ref %outputs "doc")
-                            "/share/gtk-doc/html"))))
+     (list
+      #:configure-flags
+      #~(list "-Dgtk_doc=false")        ;requires gi-docgen
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'disable-problematic-tests
+            (lambda _
+              (substitute* "libsecret/meson.build"
+                ;; The test-collection test fails non-deterministically (see:
+                ;; https://gitlab.gnome.org/GNOME/libsecret/-/issues/80).
+                ((".*'test-collection',.*") ""))))
+          (delete 'check)
+          (add-after 'install 'check
+            (lambda* (#:key tests? test-options #:allow-other-keys)
+              (when tests?
+                (setenv "HOME" "/tmp")
+                (setenv "XDG_DATA_DIRS" ;for /org/freedesktop/secrets/collection
+                        (string-append #$output "/share:"
+                                       (getenv "XDG_DATA_DIRS")))
+                (apply invoke "dbus-run-session" "--"
+                       "meson" "test" "--print-errorlogs" "-t" "0"
+                       test-options)))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin") ; for gdbus-codegen, etc.
-       ("gobject-introspection" ,gobject-introspection)
-       ("pkg-config" ,pkg-config)
-       ("vala" ,vala)
-       ("xsltproc" ,libxslt)))
+     (list dbus
+           docbook-xml-4.2
+           docbook-xsl
+           gettext-minimal
+           `(,glib "bin")               ;for gdbus-codegen, etc.
+           gobject-introspection
+           libxml2                      ;for XML_CATALOG_FILES
+           libxslt
+           pkg-config
+           python
+           python-dbus
+           python-pygobject
+           vala))
     (propagated-inputs
-     (list glib)) ; required by libsecret-1.pc
-    (inputs
-     ;; The ‘build’ phase complains about missing docbook-xml-4.2 but adding it
-     ;; doesn't seem to affect the build result.
-     (list docbook-xsl libgcrypt libxml2)) ; for XML_CATALOG_FILES
+     (list glib libgcrypt))             ;required by libsecret-1.pc
     (home-page "https://wiki.gnome.org/Projects/Libsecret/")
     (synopsis "GObject bindings for \"Secret Service\" API")
     (description
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index b3a301709f..be923de72f 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -14,7 +14,7 @@
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
 ;;; Copyright © 2019, 2020 Adrian Malacoda <malacoda@monarch-pass.net>
 ;;; Copyright © 2020, 2021, 2022 Jonathan Brielmaier <jonathan.brielmaier@web.de>
-;;; Copyright © 2020 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2020, 2022 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;; Copyright © 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
@@ -98,16 +98,16 @@
 (define-public mozjs
   (package
     (name "mozjs")
-    (version "78.15.0")
+    (version "102.2.0")
     (source (origin
               (method url-fetch)
               ;; TODO: Switch to IceCat source once available on ftp.gnu.org.
-              (uri (string-append "https://archive.mozilla.org/pub/firefox"
+              (uri (string-append "https://ftp.mozilla.org/pub/firefox"
                                   "/releases/" version "esr/source/firefox-"
                                   version "esr.source.tar.xz"))
               (sha256
                (base32
-                "0l91cxdc5v9fps79ckb1kid4gw6v5qng1jd9zvaacwaiv628shx4"))))
+                "1zwpgis7py1bf8p88pz3mpai6a02qrdb8ww2fa9kxxdl9b8r2k81"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -128,10 +128,6 @@
          "--enable-hardening"
          "--enable-optimize"
          "--enable-release"
-         ;; FIXME: rust-simd is disabled otherwise the build fails with
-         ;; "error: `[u32; 64]` is forbidden as the type of a const generic
-         ;; parameter".
-         "--disable-rust-simd"
          "--enable-readline"
          "--enable-shared-js"
          "--with-system-icu"
@@ -153,7 +149,7 @@
                 (for-each generate-all-checksums
                           '("js" "third_party/rust")))))
           (replace 'configure
-            (lambda* (#:key inputs configure-flags #:allow-other-keys)
+            (lambda* (#:key configure-flags #:allow-other-keys)
               ;; The configure script does not accept environment variables as
               ;; arguments.  It also must be run from a different directory,
               ;; but not the root directory either.
@@ -162,43 +158,11 @@
               (setenv "SHELL" (which "sh"))
               (setenv "CONFIG_SHELL" (which "sh"))
               (setenv "AUTOCONF" (which "autoconf"))
-              (apply invoke "../js/src/configure"
-                     (cons (string-append "--prefix=" #$output)
-                           configure-flags))))
-          (add-after 'unpack 'adjust-for-icu-68
-            (lambda _
-              (with-directory-excursion "js/src/tests"
-                ;; The test suite expects a lightly patched ICU 67.  Since
-                ;; Guix is about to switch to ICU 68, massage the tests to
-                ;; work with that instead of patching ICU.  Try removing this
-                ;; phase for newer versions of mozjs.
-
-                ;; These tests look up locale names and expects to get
-                ;; "GB" instead of "UK".
-                (substitute* "non262/Intl/DisplayNames/language.js"
-                  (("Traditionell, GB")
-                   "Traditionell, UK"))
-                (substitute* "non262/Intl/DisplayNames/region.js"
-                  (("\"GB\": \"GB\"")
-                   "\"GB\": \"UK\""))
-
-                ;; XXX: Some localized time formats have changed, and
-                ;; substitution fails for accented characters, even though
-                ;; it works in the REPL(?).  Just delete these for now.
-                (delete-file "non262/Intl/Date/toLocaleString_timeZone.js")
-                (delete-file "non262/Intl/Date/toLocaleDateString_timeZone.js")
-
-                ;; Similarly, these get an unexpected "A" suffix when looking
-                ;; up a time in the "ar-MA-u-ca-islamicc" locale, which is
-                ;; tricky to substitute.
-                (delete-file "non262/Intl/DateTimeFormat/format_timeZone.js")
-                (delete-file "non262/Intl/DateTimeFormat/format.js")
-
-                ;; This file compares a generated list of ICU locale names
-                ;; with actual lookups.  Some have changed slightly, i.e.
-                ;; daf-Latn-ZZ -> daf-Latn-CI, so drop it for simplicity.
-                (delete-file "non262/Intl/Locale/likely-subtags-generated.js"))))
-          (add-before 'check 'pre-check
+              (apply invoke "python" "../configure.py"
+                     "--enable-project=js"
+                     (string-append "--prefix=" #$output)
+                     configure-flags)))
+          (add-before 'check 'adjust-tests
             (lambda _
               (with-directory-excursion "../js/src/tests"
                 (substitute* "shell/os.js"
@@ -206,35 +170,44 @@
                   ((".*killed process should not have exitStatus.*")
                    ""))
 
-                ;; XXX: Delete all tests that test time zone functionality,
-                ;; because the test suite uses /etc/localtime to figure out
-                ;; the offset from the hardware clock, which does not work
-                ;; in the build container.  See <tests/non262/Date/shell.js>.
-                (delete-file-recursively "non262/Date")
-                (delete-file "non262/Intl/DateTimeFormat/tz-environment-variable.js")
-
-                (setenv "JSTESTS_EXTRA_ARGS"
-                        (string-join
-                         (list
-                          ;; Do not run tests marked as "random".
-                          "--exclude-random"
-                          ;; Exclude web platform tests.
-                          "--wpt=disabled"
-                          ;; Respect the daemons configured number of jobs.
-                          (string-append "--worker-count="
-                                         (number->string (parallel-job-count))))))))))))
+                ;; The test suite expects a lightly patched ICU.  Disable tests
+                ;; that do not work with the system version.  See
+                ;; "intl/icu-patches" for clues.
+
+                ;; See <https://unicode-org.atlassian.net/browse/ICU-20992> and
+                ;; <https://bugzilla.mozilla.org/show_bug.cgi?id=1636984> and
+                ;; related patch for why this is failing.
+                (delete-file "non262/Intl/DateTimeFormat/\
+fractional-second-digits-append-item.js")
+                ;; FIXME: got "0 \u251CAM/PM: noon\u2524", expected "0 (AM/PM: noon)"
+                (delete-file "non262/Intl/DateTimeFormat/day-period-hour-cycle.js")
+                ;; FIXME: got "en-US-posix", expected "en-US-POSIX".
+                (delete-file "non262/Intl/available-locales-supported.js")
+                ;; FIXME: got "en-US", expected "en-US-POSIX"
+                (delete-file "non262/Intl/available-locales-resolved.js"))))
+          (add-before 'check 'pre-check
+            (lambda _
+              (setenv "JSTESTS_EXTRA_ARGS"
+                      (string-join
+                       (list
+                        ;; Do not run tests marked as "random".
+                        "--exclude-random"
+                        ;; Exclude web platform tests.
+                        "--wpt=disabled"
+                        ;; Respect the daemons configured number of jobs.
+                        (string-append "--worker-count="
+                                       (number->string (parallel-job-count)))))))))))
     (native-inputs
-     (list autoconf-2.13
-           automake
-           ;; TODO(staging): Use the default LLVM in the next rebuild cycle.
-           llvm-9                       ;for llvm-objdump
+     (list autoconf
+           llvm                         ;for llvm-objdump
+           m4
            perl
            pkg-config
-           python-3
+           python-wrapper
            rust
            `(,rust "cargo")))
     (inputs
-     (list icu4c readline zlib))
+     (list icu4c-71 readline zlib))
     (propagated-inputs
      (list nspr))                ; in the Requires.private field of mozjs-*.pc
     (home-page
@@ -260,7 +233,39 @@ in C/C++.")
      (substitute-keyword-arguments (package-arguments mozjs)
        ((#:phases phases)
         #~(modify-phases #$phases
-            (delete 'adjust-for-icu-68)
+            (add-before 'check 'disable-timezone-tests
+              (lambda _
+                (with-directory-excursion "../js/src/tests"
+                  ;; FIXME: Assertion failed: got "2021a", expected "2021a3"?
+                  (delete-file "non262/Intl/DateTimeFormat/timeZone_version.js")
+                  ;; XXX: Delete all tests that test time zone functionality,
+                  ;; because the test suite uses /etc/localtime to figure out
+                  ;; the offset from the hardware clock, which does not work
+                  ;; in the build container.  See <tests/non262/Date/shell.js>.
+                  (delete-file-recursively "non262/Date")
+                  (delete-file
+                   "non262/Intl/DateTimeFormat/tz-environment-variable.js"))))))))
+    (inputs (modify-inputs (package-inputs mozjs)
+              (replace "icu4c" icu4c)))))
+
+(define-public mozjs-78
+  (package
+    (inherit mozjs)
+    (name "mozjs")
+    (version "78.15.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://archive.mozilla.org/pub/firefox"
+                                  "/releases/" version "esr/source/firefox-"
+                                  version "esr.source.tar.xz"))
+              (sha256
+               (base32
+                "0l91cxdc5v9fps79ckb1kid4gw6v5qng1jd9zvaacwaiv628shx4"))))
+    (build-system gnu-build-system)
+    (arguments
+     (substitute-keyword-arguments (package-arguments mozjs)
+       ((#:phases phases)
+        #~(modify-phases #$phases
             (replace 'configure
               (lambda* (#:key configure-flags #:allow-other-keys)
                 ;; The configure script does not accept environment variables as
@@ -271,11 +276,43 @@ in C/C++.")
                 (setenv "SHELL" (which "sh"))
                 (setenv "CONFIG_SHELL" (which "sh"))
                 (setenv "AUTOCONF" (which "autoconf"))
-                (apply invoke "python" "../configure.py"
-                       "--enable-project=js"
-                       (string-append "--prefix=" #$output)
-                       configure-flags)))
-            (add-before 'check 'adjust-tests
+                (apply invoke "../js/src/configure"
+                       (cons (string-append "--prefix=" #$output)
+                             configure-flags))))
+            (replace 'adjust-tests
+              (lambda _
+                (with-directory-excursion "../js/src/tests"
+                  ;; The test suite expects a lightly patched ICU 67.  Since
+                  ;; Guix is about to switch to ICU 68, massage the tests to
+                  ;; work with that instead of patching ICU.  Try removing this
+                  ;; phase for newer versions of mozjs.
+
+                  ;; These tests look up locale names and expects to get
+                  ;; "GB" instead of "UK".
+                  (substitute* "non262/Intl/DisplayNames/language.js"
+                    (("Traditionell, GB")
+                     "Traditionell, UK"))
+                  (substitute* "non262/Intl/DisplayNames/region.js"
+                    (("\"GB\": \"GB\"")
+                     "\"GB\": \"UK\""))
+
+                  ;; XXX: Some localized time formats have changed, and
+                  ;; substitution fails for accented characters, even though
+                  ;; it works in the REPL(?).  Just delete these for now.
+                  (delete-file "non262/Intl/Date/toLocaleString_timeZone.js")
+                  (delete-file "non262/Intl/Date/toLocaleDateString_timeZone.js")
+
+                  ;; Similarly, these get an unexpected "A" suffix when looking
+                  ;; up a time in the "ar-MA-u-ca-islamicc" locale, which is
+                  ;; tricky to substitute.
+                  (delete-file "non262/Intl/DateTimeFormat/format_timeZone.js")
+                  (delete-file "non262/Intl/DateTimeFormat/format.js")
+
+                  ;; This file compares a generated list of ICU locale names
+                  ;; with actual lookups.  Some have changed slightly, i.e.
+                  ;; daf-Latn-ZZ -> daf-Latn-CI, so drop it for simplicity.
+                  (delete-file "non262/Intl/Locale/likely-subtags-generated.js"))))
+            (replace 'pre-check
               (lambda _
                 (with-directory-excursion "../js/src/tests"
                   (substitute* "shell/os.js"
@@ -283,48 +320,35 @@ in C/C++.")
                     ((".*killed process should not have exitStatus.*")
                      ""))
 
-                  ;; The test suite expects a lightly patched ICU.  Disable tests
-                  ;; that do not work with the system version.  See
-                  ;; "intl/icu-patches" for clues.
-
-                  ;; See <https://unicode-org.atlassian.net/browse/ICU-20992> and
-                  ;; <https://bugzilla.mozilla.org/show_bug.cgi?id=1636984> and
-                  ;; related patch for why this is failing.
-                  (delete-file "non262/Intl/DateTimeFormat/\
-fractional-second-digits-append-item.js")
-                  ;; FIXME: got "0 \u251CAM/PM: noon\u2524", expected "0 (AM/PM: noon)"
-                  (delete-file "non262/Intl/DateTimeFormat/day-period-hour-cycle.js")
-                  ;; FIXME: got "en-US-posix", expected "en-US-POSIX".
-                  (delete-file "non262/Intl/available-locales-supported.js")
-                  ;; FIXME: got "en-US", expected "en-US-POSIX"
-                  (delete-file "non262/Intl/available-locales-resolved.js")
-
-                  ;; FIXME: Assertion failed: got "2021a", expected "2021a3"?
-                  (delete-file "non262/Intl/DateTimeFormat/timeZone_version.js")
                   ;; XXX: Delete all tests that test time zone functionality,
                   ;; because the test suite uses /etc/localtime to figure out
                   ;; the offset from the hardware clock, which does not work
                   ;; in the build container.  See <tests/non262/Date/shell.js>.
                   (delete-file-recursively "non262/Date")
-                  (delete-file
-                   "non262/Intl/DateTimeFormat/tz-environment-variable.js"))))
-            (replace 'pre-check
-              (lambda _
-                (setenv "JSTESTS_EXTRA_ARGS"
-                        (string-join
-                         (list
-                          ;; Do not run tests marked as "random".
-                          "--exclude-random"
-                          ;; Exclude web platform tests.
-                          "--wpt=disabled"
-                          ;; Respect the daemons configured number of jobs.
-                          (string-append "--worker-count="
-                                         (number->string (parallel-job-count))))))))))))
-    (native-inputs (modify-inputs (package-native-inputs mozjs)
-                     (replace "autoconf" autoconf)
-                     (replace "llvm" llvm)
-                     (replace "python" python-wrapper)
-                     (append m4)))))
+                  (delete-file "non262/Intl/DateTimeFormat/tz-environment-variable.js")
+
+                  (setenv "JSTESTS_EXTRA_ARGS"
+                          (string-join
+                           (list
+                            ;; Do not run tests marked as "random".
+                            "--exclude-random"
+                            ;; Exclude web platform tests.
+                            "--wpt=disabled"
+                            ;; Respect the daemons configured number of jobs.
+                            (string-append "--worker-count="
+                                           (number->string
+                                            (parallel-job-count)))))))))))))
+    (native-inputs
+     (list autoconf-2.13
+           automake
+           llvm                         ;for llvm-objdump
+           perl
+           pkg-config
+           python-3
+           rust
+           `(,rust "cargo")))
+    (inputs
+     (list icu4c readline zlib))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Temporary packaging of rust-1.59, pending inclusion in (gnu packages rust)
diff --git a/gnu/packages/graphics.scm b/gnu/packages/graphics.scm
index fe38e7d03f..4a404953a0 100644
--- a/gnu/packages/graphics.scm
+++ b/gnu/packages/graphics.scm
@@ -210,7 +210,7 @@ framebuffer graphics, audio output and input event.")
        ("opengl" ,mesa)
        ("png" ,libpng)
        ("sdl" ,sdl)
-       ("svg" ,librsvg)
+       ("svg" ,(librsvg-for-system))
        ("tiff" ,libtiff)
        ("tslib" ,tslib)
        ("vdpau" ,libvdpau)
@@ -1173,13 +1173,13 @@ with strong support for multi-part, multi-channel use cases.")
                (("/var/tmp") "/tmp"))))
          (add-after 'change-directory 'increase-test-timeout
            (lambda _
-             ;; On armhf-linux, we need to override the CTest default
+             ;; On some architectures, we need to override the CTest default
              ;; timeout of 1500 seconds for the OpenEXR.IlmImf test.
              (substitute* "IlmImfTest/CMakeLists.txt"
                (("add_test\\(NAME OpenEXR\\.IlmImf.*" all)
                 (string-append
                  all
-                 "set_tests_properties(OpenEXR.IlmImf PROPERTIES TIMEOUT 2000)")))
+                 "set_tests_properties(OpenEXR.IlmImf PROPERTIES TIMEOUT 15000)")))
              #t))
          ,@(if (not (target-64bit?))
                `((add-after 'change-directory 'disable-broken-test
diff --git a/gnu/packages/gstreamer.scm b/gnu/packages/gstreamer.scm
index a1503602ad..c382f04446 100644
--- a/gnu/packages/gstreamer.scm
+++ b/gnu/packages/gstreamer.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2015, 2016 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015, 2018 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2018 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
@@ -29,6 +29,7 @@
 (define-module (gnu packages gstreamer)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module (guix gexp)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix build-system cmake)
@@ -404,7 +405,7 @@ arrays of data.")
 (define-public gstreamer-docs
   (package
     (name "gstreamer-docs")
-    (version "1.18.5")
+    (version "1.20.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -412,7 +413,7 @@ arrays of data.")
                     "/gstreamer-docs-" version ".tar.xz"))
               (sha256
                (base32
-                "1xvqrqv1zxqdpvd02dvr0xspk30c8b940vvnr9x75a08nx0x75xh"))))
+                "1gziccq5f4fy23q6dm8nwbmzh68gn9rfbqw0xcn4r8yn82545z3k"))))
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
@@ -464,7 +465,7 @@ the GStreamer multimedia framework.")
 (define-public gstreamer
   (package
     (name "gstreamer")
-    (version "1.18.5")
+    (version "1.20.3")
     (source
      (origin
        (method url-fetch)
@@ -473,33 +474,26 @@ the GStreamer multimedia framework.")
              version ".tar.xz"))
        (sha256
         (base32
-         "02p8my6dzmm4rvd93s3qnh8w5bm9bh4f7gdydbsvnn9llqr251jm"))))
+         "0aisl8nazcfi4b5j6fz8zwpp0k9csb022zniz65b2pxxpdjayzb0"))))
     (build-system meson-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         ,@%common-gstreamer-phases
-         ;; FIXME: Since switching to the meson-build-system, two tests
-         ;; started failing on i686.  See
-         ;; <https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/499>.
-         ,@(if (string-prefix? "i686" (or (%current-target-system)
-                                          (%current-system)))
-               `((add-after 'unpack 'disable-some-tests
-                   (lambda _
-                     (substitute* "tests/check/gst/gstsystemclock.c"
-                       (("tcase_add_test \\(tc_chain, test_stress_cleanup_unschedule.*")
-                        "")
-                       (("tcase_add_test \\(tc_chain, test_stress_reschedule.*")
-                        "")))))
-               '())
-         (add-after 'unpack 'disable-problematic-tests
-           (lambda _
-             ;; Disable the 'pipelines-seek' test, which appears to be load
-             ;; sensitive (see:
-             ;; https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/854).
-             (substitute* "tests/check/meson.build"
-               ((".*'pipelines/seek.c'.*")
-                "")))))))
+     (list #:phases
+           #~(modify-phases %standard-phases
+               #$@%common-gstreamer-phases
+               #$@(if (string-prefix? "i686" (or (%current-target-system)
+                                                 (%current-system)))
+                      ;; FIXME: These tests consistently fail in the Guix CI:
+                      ;;   https://issues.guix.gnu.org/57868
+                      '((add-after 'unpack 'disable-systemclock-test
+                          (lambda _
+                            (substitute* "tests/check/gst/gstsystemclock.c"
+                              (("tcase_add_test \\(tc_chain, \
+test_stress_cleanup_unschedule.*")
+                               "")
+                              (("tcase_add_test \\(tc_chain, \
+test_stress_reschedule.*")
+                               "")))))
+                      '()))))
     (propagated-inputs
      ;; In gstreamer-1.0.pc:
      ;;   Requires: glib-2.0, gobject-2.0
@@ -507,15 +501,14 @@ the GStreamer multimedia framework.")
      (list elfutils ; libdw
            glib libunwind))
     (native-inputs
-     `(("bash-completion" ,bash-completion)
-       ("bison" ,bison)
-       ("flex" ,flex)
-       ("gettext" ,gettext-minimal)
-       ("glib" ,glib "bin")
-       ("gobject-introspection" ,gobject-introspection)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python-wrapper" ,python-wrapper)))
+     (list bash-completion
+           bison flex
+           gettext-minimal
+           `(,glib "bin")
+           gobject-introspection
+           perl
+           pkg-config
+           python-wrapper))
     (inputs
      (list gmp libcap
            ;; For tests.
@@ -542,7 +535,7 @@ This package provides the core library and elements.")
 (define-public gst-plugins-base
   (package
     (name "gst-plugins-base")
-    (version "1.18.5")
+    (version "1.20.3")
     (source
      (origin
       (method url-fetch)
@@ -550,75 +543,87 @@ This package provides the core library and elements.")
                           name "-" version ".tar.xz"))
       (sha256
        (base32
-        "18vg8kk7p2p8za8zaqg0v7z6898yw5a3b12vvl7xn02pb3s7l2wn"))))
+        "17rw8wj1x1bg153m9z76pdvgz5k93m3riyalfpzq00x7h7fv6c3y"))))
     (build-system meson-build-system)
     (propagated-inputs
-     `(("glib" ,glib)              ;required by gstreamer-sdp-1.0.pc
-       ("gstreamer" ,gstreamer)    ;required by gstreamer-plugins-base-1.0.pc
-       ;; wayland-client.h is referred to in
-       ;; include/gstreamer-1.0/gst/gl/wayland/gstgldisplay_wayland.h
-       ("wayland" ,wayland)
-       ;; XXX: Do not enable Orc optimizations on ARM systems because
-       ;; it leads to two test failures.
-       ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/683
-       ,@(if (string-prefix? "arm" (or (%current-target-system)
-                                       (%current-system)))
-             '()
-             `(("orc" ,orc)))))         ;required by gstreamer-audio-1.0.pc
+     (list glib                     ;required by gstreamer-sdp-1.0.pc
+           gstreamer                ;required by gstreamer-plugins-base-1.0.pc
+           libgudev                 ;required by gstreamer-gl-1.0.pc
+           ;; wayland-client.h is referred to in
+           ;; include/gstreamer-1.0/gst/gl/wayland/gstgldisplay_wayland.h
+           wayland
+           orc))                    ;required by gstreamer-audio-1.0.pc
     (inputs
      ;; TODO: Add libvorbisidec
-     `(("cdparanoia" ,cdparanoia)
-       ("pango" ,pango)
-       ("libogg" ,libogg)
-       ("libtheora" ,libtheora)
-       ("libvorbis" ,libvorbis)
-       ("libx11" ,libx11)
-       ("zlib" ,zlib)
-       ("libXext" ,libxext)
-       ("libxv" ,libxv)
-       ("alsa-lib" ,alsa-lib)
-       ("opus" ,opus)
-       ("graphene" ,graphene)
-       ("iso-codes" ,iso-codes)
-       ("libgudev" ,libgudev)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libpng" ,libpng)
-       ("libvisual" ,libvisual)
-       ("mesa" ,mesa)
-       ("wayland-protocols" ,wayland-protocols)))
+     (list alsa-lib
+           cdparanoia
+           graphene
+           iso-codes
+           libjpeg-turbo
+           libogg
+           libpng
+           libtheora
+           libvisual
+           libvorbis
+           libx11
+           libxext
+           libxv
+           mesa
+           opus
+           pango
+           wayland-protocols
+           zlib))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
-       ("glib:bin" ,glib "bin")
-       ("gobject-introspection" ,gobject-introspection)
-       ("python-wrapper" ,python-wrapper)
-       ("gettext" ,gettext-minimal)
-       ("xorg-server" ,xorg-server-for-tests)))
+     (list pkg-config
+           `(,glib "bin")
+           gobject-introspection
+           python-wrapper
+           gettext-minimal
+           xorg-server-for-tests))
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         ,@%common-gstreamer-phases
-         (add-after 'unpack 'disable-problematic-tests
-           (lambda _
-             (substitute* "tests/check/meson.build"
-               ;; This test causes nondeterministic failures (see:
-               ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/950).
-               ((".*'elements/appsrc.c'.*")
-                ""))))
-         (add-before 'configure 'patch
-           (lambda _
-             (substitute* "tests/check/libs/pbutils.c"
-               (("/bin/sh") (which "sh")))))
-         (add-before 'check 'pre-check
-           (lambda _
-             ;; Tests require a running X server.
-             (system "Xvfb :1 +extension GLX &")
-             (setenv "DISPLAY" ":1")
-             ;; Tests write to $HOME.
-             (setenv "HOME" (getcwd))
-             ;; Tests look for $XDG_RUNTIME_DIR.
-             (setenv "XDG_RUNTIME_DIR" (getcwd))
-             ;; For missing '/etc/machine-id'.
-             (setenv "DBUS_FATAL_WARNINGS" "0"))))))
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          #$@%common-gstreamer-phases
+          (add-after 'unpack 'disable-problematic-tests
+            (lambda _
+              (substitute* "tests/check/meson.build"
+                ;; This test causes nondeterministic failures (see:
+                ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/950).
+                ((".*'elements/appsrc.c'.*")
+                 ""))
+              ;; Some other tests fail on other architectures.
+              #$@(cond
+                   ((target-x86-32?)
+                    #~((substitute* "tests/check/meson.build"
+                         ((".*'libs/libsabi\\.c'.*") ""))))
+                   ((target-riscv64?)
+                    #~((substitute* "tests/check/meson.build"
+                         ((".*'libs/gstglcolorconvert\\.c'.*") "")
+                         ((".*'libs/gstglcontext\\.c'.*") "")
+                         ((".*'libs/gstglmemory\\.c'.*") "")
+                         ((".*'libs/gstglupload\\.c'.*") "")
+                         ((".*'elements/glimagesink\\.c'.*") "")
+                         ((".*'pipelines/gl-launch-lines\\.c'.*") "")
+                         ((".*'elements/glstereo\\.c'.*") "")
+                         ((".*'elements/glmixer\\.c'.*") ""))))
+                   (else
+                     #~()))))
+          (add-before 'configure 'patch
+            (lambda _
+              (substitute* "tests/check/libs/pbutils.c"
+                (("/bin/sh") (which "sh")))))
+          (add-before 'check 'pre-check
+            (lambda _
+              ;; Tests require a running X server.
+              (system "Xvfb :1 +extension GLX &")
+              (setenv "DISPLAY" ":1")
+              ;; Tests write to $HOME.
+              (setenv "HOME" (getcwd))
+              ;; Tests look for $XDG_RUNTIME_DIR.
+              (setenv "XDG_RUNTIME_DIR" (getcwd))
+              ;; For missing '/etc/machine-id'.
+              (setenv "DBUS_FATAL_WARNINGS" "0"))))))
     (home-page "https://gstreamer.freedesktop.org/")
     (synopsis
      "Plugins for the GStreamer multimedia library")
@@ -629,7 +634,7 @@ for the GStreamer multimedia library.")
 (define-public gst-plugins-good
   (package
     (name "gst-plugins-good")
-    (version "1.18.5")
+    (version "1.20.3")
     (source
      (origin
        (method url-fetch)
@@ -637,74 +642,87 @@ for the GStreamer multimedia library.")
         (string-append
          "https://gstreamer.freedesktop.org/src/" name "/"
          name "-" version ".tar.xz"))
-       (patches (search-patches "gst-plugins-good-fix-test.patch"))
        (sha256
-        (base32 "0svrapawych2s3lm4lx3x023zxq5kcx50jnfmh0qigszfskyxbis"))))
+        (base32 "1dv8b2md1xk6d45ir1wzbvqhxbvm6mxv881rjl0brnjwpw3c5wzq"))))
     (build-system meson-build-system)
     (arguments
-     `(#:glib-or-gtk? #t     ; To wrap binaries and/or compile schemas
-       #:phases
-       (modify-phases %standard-phases
-         ,@%common-gstreamer-phases
-         (add-before 'check 'pre-check
-           (lambda _
-             ;; Tests require a running X server.
-             (system "Xvfb :1 +extension GLX &")
-             (setenv "DISPLAY" ":1")
-             ;; Tests write to $HOME.
-             (setenv "HOME" (getcwd))
-             ;; Tests look for $XDG_RUNTIME_DIR.
-             (setenv "XDG_RUNTIME_DIR" (getcwd))
-             ;; For missing '/etc/machine-id'.
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             #t)))))
+     (list
+      #:glib-or-gtk? #t              ; To wrap binaries and/or compile schemas
+      #:phases
+      #~(modify-phases %standard-phases
+          #$@%common-gstreamer-phases
+          (add-after 'unpack 'absolutize-libsoup-library
+            (lambda* (#:key inputs #:allow-other-keys)
+              (define libsoup
+                (search-input-file inputs "lib/libsoup-3.0.so"))
+
+              (substitute* "ext/soup/gstsouploader.c"
+                (("(#define LIBSOUP_3_SONAME ).+$" _ prefix)
+                 (string-append prefix "\"" libsoup "\"\n")))))
+          (add-after 'unpack 'skip-failing-tests
+            (lambda _
+              (substitute* "tests/check/meson.build"
+                ;; Reported as shaky upstream, see
+                ;; <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/785>
+                (("\\[ 'elements/flvmux' \\]") "[ 'elements/flvmux', true ]"))))
+          (add-before 'check 'pre-check
+            (lambda _
+              ;; Tests require a running X server.
+              (system "Xvfb :1 +extension GLX &")
+              (setenv "DISPLAY" ":1")
+              ;; Tests write to $HOME.
+              (setenv "HOME" (getcwd))
+              ;; Tests look for $XDG_RUNTIME_DIR.
+              (setenv "XDG_RUNTIME_DIR" (getcwd))
+              ;; For missing '/etc/machine-id'.
+              (setenv "DBUS_FATAL_WARNINGS" "0"))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin")
-       ("gobject-introspection" ,gobject-introspection)
-       ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python-wrapper" ,python-wrapper)
-       ("xmllint" ,libxml2)
-       ("xorg-server" ,xorg-server-for-tests)))
+     (list gettext-minimal
+           `(,glib "bin")
+           gobject-introspection
+           gsettings-desktop-schemas
+           libxml2
+           perl
+           pkg-config
+           python-wrapper
+           xorg-server-for-tests))
     (inputs
-     `(("aalib" ,aalib)
-       ("bzip2" ,bzip2)
-       ("cairo" ,cairo)
-       ("flac" ,flac)
-       ("librsvg" ,(librsvg-for-system))
-       ("glib" ,glib)
-       ("glib-networking" ,glib-networking)
-       ("glu" ,glu)
-       ("gtk+" ,gtk+)
-       ("jack" ,jack-2)
-       ("lame" ,lame)
-       ("libavc1394" ,libavc1394)
-       ("libcaca" ,libcaca)
-       ("libdv" ,libdv)
-       ("libgudev" ,libgudev)
-       ("libiec61883" ,libiec61883)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libpng" ,libpng)
-       ("libshout" ,libshout)
-       ("libsoup" ,libsoup)
-       ("libvpx" ,libvpx)
-       ("libx11" ,libx11)
-       ("libxdamage" ,libxdamage)
-       ("libxfixes" ,libxfixes)
-       ("libxext" ,libxext)
-       ("libxshm" ,libxshmfence)
-       ("mesa" ,mesa)
-       ("mpg123" ,mpg123)
-       ("orc" ,orc)
-       ("pulseaudio" ,pulseaudio)
-       ("speex" ,speex)
-       ("taglib" ,taglib)
-       ("twolame" ,twolame)
-       ("v4l-utils" ,v4l-utils)
-       ("wavpack" ,wavpack)
-       ("zlib" ,zlib)))
+     (list aalib
+           bzip2
+           cairo
+           flac
+           (librsvg-for-system)
+           glib
+           glib-networking
+           glu
+           gtk+
+           jack-2
+           lame
+           libavc1394
+           libcaca
+           libdv
+           libgudev
+           libiec61883
+           libjpeg-turbo
+           libpng
+           libshout
+           libsoup
+           libvpx
+           libx11
+           libxdamage
+           libxfixes
+           libxext
+           libxshmfence
+           mesa
+           mpg123
+           orc
+           pulseaudio
+           speex
+           taglib
+           twolame
+           v4l-utils
+           wavpack
+           zlib))
     (propagated-inputs
      (list gstreamer gst-plugins-base))
     (synopsis "GStreamer plugins and helper libraries")
@@ -719,14 +737,14 @@ model to base your own plug-in on, here it is.")
 (define-public gst-plugins-bad
   (package
     (name "gst-plugins-bad")
-    (version "1.18.5")
+    (version "1.20.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://gstreamer.freedesktop.org/src/"
                                   name "/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "13k7mm2wmsbhd04a20v9lj4afpf0w33ambpwlrw8bl7hjhxr4r51"))
+                "0kys6m5hg5bc30wfg8qa3s7dmkdz3kj1j8lhvn3267fxalxw24bs"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -734,179 +752,177 @@ model to base your own plug-in on, here it is.")
                   (delete-file-recursively "ext/sctp/usrsctp")))))
     (build-system meson-build-system)
     (arguments
-     `(#:configure-flags '("-Dsctp-internal-usrsctp=disabled")
-       #:glib-or-gtk? #t     ; To wrap binaries and/or compile schemas
-       #:phases
-       (modify-phases %standard-phases
-         ,@%common-gstreamer-phases
-         ,@(if (string-prefix? "arm" (or (%current-target-system)
-                                         (%current-system)))
-               ;; Disable test that fails on ARMv7.
-               ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1188
-               `((add-after 'unpack 'disable-asfmux-test
-                   (lambda _
-                     (substitute* "tests/check/meson.build"
-                       (("\\[\\['elements/asfmux\\.c'\\]\\],")
-                        "")))))
-               '())
-         (add-after 'unpack 'adjust-tests
-           (lambda* (#:key native-inputs inputs #:allow-other-keys)
-             (let ((gst-plugins-good (assoc-ref (or native-inputs inputs)
-                                                "gst-plugins-good")))
-               (substitute* "tests/check/meson.build"
-                 ;; Make gst-plugin-good available for tests, see
-                 ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1426
-                 (("'GST_PLUGIN_SYSTEM_PATH_1_0', ''")
-                  (string-append "'GST_PLUGIN_SYSTEM_PATH_1_0', '"
-                                 gst-plugins-good "/lib/gstreamer-1.0'"))
+     (list
+      #:configure-flags #~(list "-Dsctp-internal-usrsctp=disabled")
+      #:glib-or-gtk? #t              ; To wrap binaries and/or compile schemas
+      #:phases
+      #~(modify-phases %standard-phases
+          #$@%common-gstreamer-phases
+          #$@(if (string-prefix? "arm" (or (%current-target-system)
+                                           (%current-system)))
+                 ;; Disable test that fails on ARMv7.
+                 ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1188
+                 `((add-after 'unpack 'disable-asfmux-test
+                     (lambda _
+                       (substitute* "tests/check/meson.build"
+                         (("\\[\\['elements/asfmux\\.c'\\]\\],")
+                          "")))))
+                 '())
+          (add-after 'unpack 'adjust-tests
+            (lambda* (#:key native-inputs inputs #:allow-other-keys)
+              (let ((gst-plugins-good (assoc-ref (or native-inputs inputs)
+                                                 "gst-plugins-good")))
+                (substitute* "tests/check/meson.build"
+                  ;; Make gst-plugin-good available for tests, see
+                  ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1426
+                  (("'GST_PLUGIN_SYSTEM_PATH_1_0', ''")
+                   (string-append "'GST_PLUGIN_SYSTEM_PATH_1_0', '"
+                                  gst-plugins-good "/lib/gstreamer-1.0'"))
 
-                 ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1136
-                 ((".*elements/msdkh264enc\\.c.*") "")
-                 ((".*elements/svthevcenc\\.c.*") "")
+                  ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1136
+                  ((".*elements/msdkh264enc\\.c.*") "")
+                  ((".*elements/svthevcenc\\.c.*") "")
 
-                 ;; The 'elements_shm.test_shm_live' test sometimes times out
-                 ;; (see:
-                 ;; https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/790).
-                 ((".*'elements/shm\\.c'.*") "")
+                  ;; The 'elements_shm.test_shm_live' test sometimes times out
+                  ;; (see:
+                  ;; https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/790).
+                  ((".*'elements/shm\\.c'.*") "")
 
-                 ;; FIXME: Why is this failing.
-                 ((".*elements/dash_mpd\\.c.*") "")
+                  ;; FIXME: Why is this failing.
+                  ((".*elements/dash_mpd\\.c.*") "")
 
-                 ;; These tests are flaky and occasionally time out:
-                 ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/932
-                 ((".*elements/curlhttpsrc\\.c.*") "")
-                 ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1412
-                 ((".*elements/dtls\\.c.*") ""))
-               (substitute* "tests/check/elements/zxing.c"
-                 ;; zxing 1.2.0 seemingly changed the type representation of
-                 ;; the EAN_13 structure; disable it.
-                 ((".*\"EAN_13\".*")
-                  "")))))
-         (add-before 'check 'pre-check
-           (lambda _
-             ;; Tests require a running X server.
-             (system "Xvfb :1 +extension GLX &")
-             (setenv "DISPLAY" ":1")
-             ;; Tests write to $HOME.
-             (setenv "HOME" (getcwd))
-             ;; Tests look for $XDG_RUNTIME_DIR.
-             (setenv "XDG_RUNTIME_DIR" (getcwd))
-             ;; For missing '/etc/machine-id'.
-             (setenv "DBUS_FATAL_WARNINGS" "0"))))))
+                  ;; These tests are flaky and occasionally time out:
+                  ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/932
+                  ((".*elements/curlhttpsrc\\.c.*") "")
+                  ;; https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1412
+                  ((".*elements/dtls\\.c.*") ""))
+                (substitute* "tests/check/elements/zxing.c"
+                  ;; zxing 1.2.0 seemingly changed the type representation of
+                  ;; the EAN_13 structure; disable it.
+                  ((".*\"EAN_13\".*")
+                   "")))))
+          (add-before 'check 'pre-check
+            (lambda _
+              ;; Tests require a running X server.
+              (system "Xvfb :1 +extension GLX &")
+              (setenv "DISPLAY" ":1")
+              ;; Tests write to $HOME.
+              (setenv "HOME" (getcwd))
+              ;; Tests look for $XDG_RUNTIME_DIR.
+              (setenv "XDG_RUNTIME_DIR" (getcwd))
+              ;; For missing '/etc/machine-id'.
+              (setenv "DBUS_FATAL_WARNINGS" "0"))))))
     (propagated-inputs
      (list gstreamer gst-plugins-base))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin")         ; for glib-mkenums, etc.
-       ("gobject-introspection" ,gobject-introspection)
-       ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
-       ("gst-plugins-good" ,gst-plugins-good) ;for tests
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python" ,python-wrapper)
-       ("xorg-server" ,xorg-server-for-tests)))
+     (list gettext-minimal
+           `(,glib "bin")               ; for glib-mkenums, etc.
+           gobject-introspection
+           gsettings-desktop-schemas
+           gst-plugins-good             ;for tests
+           perl
+           pkg-config
+           python-wrapper
+           xorg-server-for-tests))
     (inputs
-     `(("bluez" ,bluez)
-       ("bzip2" ,bzip2)
-       ("cairo" ,cairo)
-       ;; ("ccextractor" ,ccextractor)
-       ("chromaprint" ,chromaprint)
-       ("curl" ,curl)
-       ("directfb" ,directfb)
-       ;;("dssim" ,dssim)
-       ("faac" ,faac)
-       ("faad2" ,faad2)
-       ("flite" ,flite)
-       ("fluidsynth" ,fluidsynth)
-       ("glib" ,glib)
-       ("glib-networking" ,glib-networking)
-       ("glu" ,glu)
-       ("gsm" ,gsm)
-       ("gtk+" ,gtk+)
-       ("iqa" ,iqa)
-       ("ladspa" ,ladspa)
-       ("lcms" ,lcms)
-       ("libaom" ,libaom)
-       ("libass" ,libass)
-       ("libbs2b" ,libbs2b)
-       ("libdc1394" ,libdc1394)
-       ("libdca" ,libdca)
-       ("libde265" ,libde265)
-       ("libdrm" ,libdrm)
-       ("libdvdnav" ,libdvdnav)
-       ("libdvdread" ,libdvdread)
-       ("libexif" ,libexif)
-       ("libfdk" ,libfdk)
-       ("libgcrypt" ,libgcrypt)
-       ("libgme" ,libgme)
-       ("libgudev" ,libgudev)
-       ("libkate" ,libkate)
-       ,@(if (target-x86?)
-           `(("libmfx" ,mediasdk))
-           '())
-       ("libmms" ,libmms)
-       ("libmodplug" ,libmodplug)
-       ("libmpcdec" ,libmpcdec)
-       ("libnice" ,libnice)
-       ("libofa" ,libofa)
-       ("libopenmpt" ,libopenmpt)
-       ("librsvg" ,librsvg)
-       ("libsndfile" ,libsndfile)
-       ("libsrtp" ,libsrtp)
-       ("libssh2" ,libssh2)
-       ("libtiff" ,libtiff)
-       ("libusb" ,libusb)
-       ("libva" ,libva)
-       ("libvdpau" ,libvdpau)
-       ("libwebp" ,libwebp)
-       ("libx11" ,libx11)
-       ("libxcb" ,libxcb)
-       ("libxext" ,libxext)
-       ("libxkbcommon" ,libxkbcommon)
-       ("libxml2" ,libxml2)
-       ("libxshm" ,libxshmfence)
-       ("lilv" ,lilv)
-       ("lrdf" ,lrdf)
-       ("lv2" ,lv2)
-       ("mesa" ,mesa)
-       ("mjpegtools" ,mjpegtools)
-       ("neon" ,neon)
-       ("nettle" ,nettle)
-       ("openal" ,openal)
-       ;; ("opencv" ,opencv)
-       ("openexr" ,openexr)
-       ("openh264" ,openh264)
-       ("openjpeg" ,openjpeg)
-       ;; ("openni2" ,openni2)
-       ("opensles" ,opensles)
-       ("openssl" ,openssl)
-       ("opus" ,opus)
-       ("orc" ,orc)
-       ("pango" ,pango)
-       ("rtmp" ,rtmpdump)
-       ("sbc" ,sbc)
-       ("sctp" ,lksctp-tools)
-       ("soundtouch" ,soundtouch)
-       ("spandsp" ,spandsp)
-       ("srt" ,srt)
-       ,@(if (target-x86?)
-           `(("svthevcenc" ,svt-hevc))
-           '())
-       ("tinyalsa" ,tinyalsa)
-       ("transcode" ,transcode)
-       ("usrsctp" ,usrsctp)
-       ("v4l" ,v4l-utils)
-       ("voaacenc" ,vo-aacenc)
-       ("voamrwbenc" ,vo-amrwbenc)
-       ("vulkan-headers" ,vulkan-headers)
-       ("vulkan-loader" ,vulkan-loader)
-       ("x265" ,x265)
-       ("wayland" ,wayland)
-       ("webrtcdsp" ,webrtc-audio-processing)
-       ("wildmidi" ,wildmidi)
-       ("wpebackend-fdo" ,wpebackend-fdo)
-       ("zbar" ,zbar)
-       ("zxing" ,zxing-cpp-1.2)))
+     (append
+      (if (target-x86?) (list mediasdk) '())
+      (if (target-x86-64?) (list svt-hevc) '())
+      (list bluez
+            bzip2
+            cairo
+            ;; ccextractor
+            chromaprint
+            curl
+            directfb
+            ;; dssim
+            faac
+            faad2
+            flite
+            fluidsynth
+            glib
+            glib-networking
+            glu
+            gsm
+            gtk+
+            iqa
+            ladspa
+            lcms
+            libaom
+            libass
+            libbs2b
+            libdc1394
+            libdca
+            libde265
+            libdrm
+            libdvdnav
+            libdvdread
+            libexif
+            libfdk
+            libgcrypt
+            libgme
+            libgudev
+            libkate
+            libmms
+            libmodplug
+            libmpcdec
+            libnice
+            libofa
+            libopenmpt
+            (librsvg-for-system)
+            libsndfile
+            libsrtp
+            libssh2
+            libtiff
+            libusb
+            libva
+            libvdpau
+            libwebp
+            libx11
+            libxcb
+            libxext
+            libxkbcommon
+            libxml2
+            libxshmfence
+            lilv
+            lrdf
+            lv2
+            mesa
+            mjpegtools
+            neon
+            nettle
+            openal
+            ;; opencv
+            openexr
+            openh264
+            openjpeg
+            ;; openni2
+            opensles
+            openssl-1.1
+            opus
+            orc
+            pango
+            rtmpdump
+            sbc
+            lksctp-tools
+            soundtouch
+            spandsp
+            srt
+            tinyalsa
+            transcode
+            usrsctp
+            v4l-utils
+            vo-aacenc
+            vo-amrwbenc
+            vulkan-headers
+            vulkan-loader
+            x265
+            wayland
+            webrtc-audio-processing
+            wildmidi
+            wpebackend-fdo
+            zbar
+            zxing-cpp-1.2)))
     (home-page "https://gstreamer.freedesktop.org/")
     (synopsis "Plugins for the GStreamer multimedia library")
     (description
@@ -917,7 +933,7 @@ par compared to the rest.")
 (define-public gst-plugins-ugly
   (package
     (name "gst-plugins-ugly")
-    (version "1.18.5")
+    (version "1.20.3")
     (source
      (origin
        (method url-fetch)
@@ -925,33 +941,33 @@ par compared to the rest.")
         (string-append "https://gstreamer.freedesktop.org/src/"
                        name "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "1nb6kz3gbn8r0sld6xkm16qpgyb2bvhafb7sff9rgagqk0z80cnz"))))
+        (base32 "1zdfsq0zm1d3wj3w3z44bf3v28clr8yd6qzmkjs09hq9k9w21alc"))))
     (build-system meson-build-system)
     (arguments
-     `(#:glib-or-gtk? #t     ; To wrap binaries and/or compile schemas
-       #:phases
-       (modify-phases %standard-phases
-         ,@%common-gstreamer-phases
-         (add-before 'check 'pre-check
-           (lambda _
-             ;; Tests require a running X server.
-             (system "Xvfb :1 +extension GLX &")
-             (setenv "DISPLAY" ":1")
-             ;; Tests write to $HOME.
-             (setenv "HOME" (getcwd))
-             ;; Tests look for $XDG_RUNTIME_DIR.
-             (setenv "XDG_RUNTIME_DIR" (getcwd))
-             ;; For missing '/etc/machine-id'.
-             (setenv "DBUS_FATAL_WARNINGS" "0"))))))
+     (list #:glib-or-gtk? #t         ; To wrap binaries and/or compile schemas
+           #:phases
+           #~(modify-phases %standard-phases
+               #$@%common-gstreamer-phases
+               (add-before 'check 'pre-check
+                 (lambda _
+                   ;; Tests require a running X server.
+                   (system "Xvfb :1 +extension GLX &")
+                   (setenv "DISPLAY" ":1")
+                   ;; Tests write to $HOME.
+                   (setenv "HOME" (getcwd))
+                   ;; Tests look for $XDG_RUNTIME_DIR.
+                   (setenv "XDG_RUNTIME_DIR" (getcwd))
+                   ;; For missing '/etc/machine-id'.
+                   (setenv "DBUS_FATAL_WARNINGS" "0"))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin")
-       ("gobject-introspection" ,gobject-introspection)
-       ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python-wrapper" ,python-wrapper)
-       ("xorg-server" ,xorg-server-for-tests)))
+     (list gettext-minimal
+           `(,glib "bin")
+           gobject-introspection
+           gsettings-desktop-schemas
+           perl
+           pkg-config
+           python-wrapper
+           xorg-server-for-tests))
     (inputs
      (list glib
            glib-networking
@@ -974,7 +990,7 @@ think twice about shipping them.")
 (define-public gst-libav
   (package
     (name "gst-libav")
-    (version "1.18.5")
+    (version "1.20.3")
     (source
      (origin
        (method url-fetch)
@@ -983,7 +999,7 @@ think twice about shipping them.")
          "https://gstreamer.freedesktop.org/src/" name "/"
          name "-" version ".tar.xz"))
        (sha256
-        (base32 "0j55jgk9sbhinfx2gsg21q609x6yzrixrn5xxlxd378fj6500bl2"))))
+        (base32 "1zkxybdzdkn07wwmj0rrgxyvbry472dggjv2chdsmpzwc02x3v9z"))))
     (build-system meson-build-system)
     (native-inputs
      (list perl pkg-config python-wrapper ruby))
@@ -1000,7 +1016,7 @@ decoders, muxers, and demuxers provided by FFmpeg.")
 (define-public gst-editing-services
   (package
     (name "gst-editing-services")
-    (version "1.18.5")
+    (version "1.20.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1008,27 +1024,27 @@ decoders, muxers, and demuxers provided by FFmpeg.")
                     "gst-editing-services-" version ".tar.xz"))
               (sha256
                (base32
-                "1x8db4021qv4ypq1g6n5q2awrb7glr4xp1h650c3w7q59lwsix4a"))))
+                "18msiadg6wi1636ylp02yfiwphxlz39gh3vbxchl9qpvd7g9dn2z"))))
     (build-system meson-build-system)
     (arguments
-     ;; FIXME: 16/22 failing tests.
-     `(#:tests? #f
-       #:glib-or-gtk? #t     ; To wrap binaries and/or compile schemas
-       #:phases (modify-phases %standard-phases
-                  ,@%common-gstreamer-phases)))
+     (list
+      #:tests? #f                    ; FIXME: 16/23 failing tests.
+      #:glib-or-gtk? #t              ; To wrap binaries and/or compile schemas
+      #:phases #~(modify-phases %standard-phases
+                   #$@%common-gstreamer-phases)))
     (propagated-inputs
      (list gstreamer gst-plugins-base))
     (inputs
      (list glib glib-networking gtk+ libxml2))
     (native-inputs
-     `(("flex" ,flex)
-       ("gobject-introspection" ,gobject-introspection)
-       ("glib:bin" ,glib "bin")
-       ("gst-plugins-bad" ,gst-plugins-bad)
-       ("gst-plugins-good" ,gst-plugins-good)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python" ,python-wrapper)))
+     (list flex
+           gobject-introspection
+           `(,glib "bin")
+           gst-plugins-bad
+           gst-plugins-good
+           perl
+           pkg-config
+           python-wrapper))
     (home-page "https://gstreamer.freedesktop.org/")
     (synopsis "GStreamer library for non-linear editors")
     (description
@@ -1043,25 +1059,32 @@ given, also pass them to the build system instead of the ones used by PKG."
     (package/inherit pkg
       (arguments
        (substitute-keyword-arguments (package-arguments pkg)
-         ((#:configure-flags flags `(,@(or configure-flags '())))
-          `(append
+         ((#:configure-flags flags #~'())
+         #~(append
             (list
-             ,@(map (lambda (plugin)
-                      (string-append "-D" plugin "=enabled"))
-                    plugins))
-            (list ,@(or configure-flags flags))))
-          ((#:phases phases)
-           `(modify-phases ,phases
-              (add-after 'unpack 'disable-auto-plugins
-                (lambda _
-                  (substitute* "meson_options.txt"
-                    (("'auto'") "'disabled'"))
-                  #t)))))))))
+             #$@(map (lambda (plugin)
+                       (string-append "-D" plugin "=enabled"))
+                     plugins))
+            #$(or configure-flags flags)))
+         ((#:phases phases)
+           #~(modify-phases #$phases
+               (add-after 'unpack 'disable-auto-plugins
+                 (lambda _
+                   (substitute* "meson_options.txt"
+                     (("'auto'") "'disabled'")))))))))))
+
+(define-public gst-plugins-bad-minimal
+  (package
+    (inherit (gst-plugins/selection gst-plugins-bad #:plugins '()))
+    (name "gst-plugins-bad-minimal")
+    (description "This package provides the smallest selection of GStreamer's
+\"bad\" plugin set, essentially containing libraries and the gst-transcoder
+binary, but none of the actual plugins.")))
 
 (define-public python-gst
   (package
     (name "python-gst")
-    (version "1.18.5")
+    (version "1.20.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1069,18 +1092,19 @@ given, also pass them to the build system instead of the ones used by PKG."
                     "gst-python-" version ".tar.xz"))
               (sha256
                (base32
-                "0lmwwmr3wm56qlrdrb0d5cpmqxkcmarz61wmp1nrv5852f3qadjk"))))
+                "1p6g05k88nbbv5x9madsvphxcdkfl1z0lmp39p6bhmg9x8h82d6v"))))
     (build-system meson-build-system)
     (arguments
-     `(#:modules ((guix build meson-build-system)
+     (list
+      #:modules `((guix build meson-build-system)
                   (guix build utils)
                   ((guix build python-build-system) #:prefix python:))
-       #:imported-modules (,@%meson-build-system-modules
+      #:imported-modules `(,@%meson-build-system-modules
                            (guix build python-build-system))
-       #:configure-flags
-       (list (string-append
-              "-Dpygi-overrides-dir="
-              (python:site-packages %build-inputs %outputs) "/gi/overrides"))))
+      #:configure-flags
+      #~(list (string-append
+               "-Dpygi-overrides-dir="
+               (python:site-packages %build-inputs %outputs) "/gi/overrides"))))
     (native-inputs
      (list pkg-config python))
     (propagated-inputs
@@ -1090,7 +1114,8 @@ given, also pass them to the build system instead of the ones used by PKG."
     (description
      "This package contains GObject Introspection overrides for Python that can
 be used by Python applications using GStreamer.")
-    (license license:lgpl2.1+)))
+    (license license:lgpl2.1+)
+    (properties `((upstream-name . "gst-python")))))
 
 (define-public gst123
   (package
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index 4cdc8d090a..c55767d4b0 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -1340,7 +1340,9 @@ application suites.")
      ;; Following dependencies are referenced in .pc files.
      (list cairo
            fontconfig
-           librsvg-bootstrap
+           (if (target-x86-64?)
+             librsvg-bootstrap
+             librsvg-2.40)
            glib
            graphene
            libepoxy
@@ -2282,13 +2284,13 @@ information.")
                              `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))))
                          (find-files (string-append out "/bin")))))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin")
-       ("gobject-introspection" ,gobject-introspection)
-       ("itstool" ,itstool)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python-wrapper" ,python-wrapper)))
+     (list gettext-minimal
+           `(,glib "bin")
+           gobject-introspection
+           itstool
+           perl
+           pkg-config
+           python-wrapper))
     (inputs
      (list bc
            dblatex
@@ -2302,7 +2304,6 @@ information.")
            python-lxml
            python-parameterized
            python-pygments
-           python-unittest2
            source-highlight
            yelp-tools))
     (home-page "https://wiki.gnome.org/DocumentationProject/GtkDoc")
@@ -2327,8 +2328,8 @@ with some extra work.")
 (define-public gtk-doc/stable
   (hidden-package
    (package/inherit gtk-doc
-     (inputs (alist-replace "dblatex" `(,dblatex/stable)
-                            (package-inputs gtk-doc))))))
+     (inputs (modify-inputs (package-inputs gtk-doc)
+               (replace "dblatex" dblatex/stable))))))
 
 (define-public gtk-engines
   (package
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 1760ba331e..2e7094cfff 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -618,6 +618,21 @@ Unix-style DSV format and RFC 4180 format.")
                (search-patches "guile-fibers-wait-for-io-readiness.patch"
                                "guile-fibers-epoll-instance-is-dead.patch"))))
     (build-system gnu-build-system)
+    (arguments
+     (list #:make-flags
+           #~(list "GUILE_AUTO_COMPILE=0")
+           #:phases
+           (if (target-x86-64?)
+             #~%standard-phases
+             #~(modify-phases %standard-phases
+                 (add-before 'check 'disable-some-tests
+                   (lambda _
+                     ;; This test can take more than an hour on some systems.
+                     (substitute* "tests/basic.scm"
+                       ((".*spawn-fiber loop-to-1e4.*") ""))
+                     ;; These tests can take more than an hour and/or segfault.
+                     (substitute* "Makefile"
+                       (("tests/speedup.scm") ""))))))))
     (native-inputs
      (list texinfo pkg-config autoconf automake libtool
            guile-3.0            ;for 'guild compile
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index effc6eeb1b..8a3c8d44c7 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -408,7 +408,7 @@ libraries are included in this package.")
 (define-public ghc-7
   (package
     (name "ghc")
-    (version "7.10.2")
+    (version "7.10.3")
     (source
      (origin
       (method url-fetch)
@@ -416,7 +416,7 @@ libraries are included in this package.")
                           version "/" name "-" version "-src.tar.xz"))
       (sha256
        (base32
-        "1x8m4rp2v7ydnrz6z9g8x7z3x3d3pxhv2pixy7i7hkbqbdsp7kal"))))
+        "1vsgmic8csczl62ciz51iv8nhrkm72lyhbz7p7id13y2w7fcx46g"))))
     (build-system gnu-build-system)
     (supported-systems '("i686-linux" "x86_64-linux"))
     (outputs '("out" "doc"))
@@ -432,7 +432,7 @@ libraries are included in this package.")
                  version "/" name "-" version "-testsuite.tar.xz"))
            (sha256
             (base32
-             "0qp9da9ar87zbyn6wjgacd2ic1vgzbi3cklxnhsmjqyafv9qaj4b"))))))
+             "0fk4xjw1x5lk2ifvgqij06lrbf1vxq9qfix86h9r16c0bilm3hah"))))))
     (native-inputs
      `(("perl" ,perl)
        ("python" ,python-2)                ; for tests (fails with python-3)
@@ -444,7 +444,8 @@ libraries are included in this package.")
              ghc-bootstrap-x86_64-7.8.4
              ghc-bootstrap-i686-7.8.4))))
     (arguments
-     `(#:test-target "test"
+     (list
+       #:test-target "test"
        ;; We get a smaller number of test failures by disabling parallel test
        ;; execution.
        #:parallel-tests? #f
@@ -454,117 +455,108 @@ libraries are included in this package.")
        ;; then complains that they don't match.
        #:build #f
 
-       #:modules ((guix build gnu-build-system)
-                  (guix build utils)
-                  (srfi srfi-26)
-                  (srfi srfi-1))
+       #:modules '((guix build gnu-build-system)
+                   (guix build utils)
+                   (srfi srfi-26)
+                   (srfi srfi-1))
        #:configure-flags
-       (list
-        (string-append "--with-gmp-libraries="
-                       (assoc-ref %build-inputs "gmp") "/lib")
-        (string-append "--with-gmp-includes="
-                       (assoc-ref %build-inputs "gmp") "/include")
-        "--with-system-libffi"
-        (string-append "--with-ffi-libraries="
-                       (assoc-ref %build-inputs "libffi") "/lib")
-        (string-append "--with-ffi-includes="
-                       (assoc-ref %build-inputs "libffi") "/include"))
+       #~(list
+           (string-append "--with-gmp-libraries="
+                          (assoc-ref %build-inputs "gmp") "/lib")
+           (string-append "--with-gmp-includes="
+                          (assoc-ref %build-inputs "gmp") "/include")
+           "--with-system-libffi"
+           (string-append "--with-ffi-libraries="
+                          (assoc-ref %build-inputs "libffi") "/lib")
+           (string-append "--with-ffi-includes="
+                          (assoc-ref %build-inputs "libffi") "/include"))
        ;; FIXME: The user-guide needs dblatex, docbook-xsl and docbook-utils.
        ;; Currently we do not have the last one.
        ;; #:make-flags
        ;; (list "BUILD_DOCBOOK_HTML = YES")
        #:phases
-       (let* ((ghc-bootstrap-path
-               (string-append (getcwd) "/" ,name "-" ,version "/ghc-bin"))
-              (ghc-bootstrap-prefix
-               (string-append ghc-bootstrap-path "/usr" )))
-         (alist-cons-after
-          'unpack-bin 'unpack-testsuite-and-fix-bins
-          (lambda* (#:key inputs outputs #:allow-other-keys)
-            (with-directory-excursion ".."
-              (copy-file (assoc-ref inputs "ghc-testsuite")
-                         "ghc-testsuite.tar.xz")
-              (invoke "tar" "xvf" "ghc-testsuite.tar.xz"))
-            (substitute*
-                (list "testsuite/timeout/Makefile"
-                      "testsuite/timeout/timeout.py"
-                      "testsuite/timeout/timeout.hs"
-                      "testsuite/tests/rename/prog006/Setup.lhs"
-                      "testsuite/tests/programs/life_space_leak/life.test"
-                      "libraries/process/System/Process/Internals.hs"
-                      "libraries/unix/cbits/execvpe.c")
-              (("/bin/sh") (which "sh"))
-              (("/bin/rm") "rm"))
-            #t)
-          (alist-cons-after
-           'unpack 'unpack-bin
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (mkdir-p ghc-bootstrap-prefix)
-             (with-directory-excursion ghc-bootstrap-path
-               (copy-file (assoc-ref inputs "ghc-binary")
-                          "ghc-bin.tar.xz")
-               (invoke "tar" "xvf" "ghc-bin.tar.xz")))
-           (alist-cons-before
-            'install-bin 'configure-bin
-            (lambda* (#:key inputs outputs #:allow-other-keys)
-              (let* ((binaries
-                      (list
-                       "./utils/ghc-pwd/dist-install/build/tmp/ghc-pwd"
-                       "./utils/hpc/dist-install/build/tmp/hpc"
-                       "./utils/haddock/dist/build/tmp/haddock"
-                       "./utils/hsc2hs/dist-install/build/tmp/hsc2hs"
-                       "./utils/runghc/dist-install/build/tmp/runghc"
-                       "./utils/ghc-cabal/dist-install/build/tmp/ghc-cabal"
-                       "./utils/hp2ps/dist/build/tmp/hp2ps"
-                       "./utils/ghc-pkg/dist-install/build/tmp/ghc-pkg"
-                       "./utils/unlit/dist/build/tmp/unlit"
-                       "./ghc/stage2/build/tmp/ghc-stage2"))
-                     (gmp (assoc-ref inputs "gmp"))
-                     (gmp-lib (string-append gmp "/lib"))
-                     (gmp-include (string-append gmp "/include"))
-                     (ncurses-lib
-                      (dirname (search-input-file inputs "/lib/libncurses.so")))
-                     (ld-so (search-input-file inputs ,(glibc-dynamic-linker)))
-                     (libtinfo-dir
-                      (string-append ghc-bootstrap-prefix
-                                     "/lib/ghc-7.8.4/terminfo-0.4.0.0")))
-                (with-directory-excursion
-                    (string-append ghc-bootstrap-path "/ghc-7.8.4")
-                  (setenv "CONFIG_SHELL" (which "bash"))
-                  (setenv "LD_LIBRARY_PATH" gmp-lib)
-                  ;; The binaries have "/lib64/ld-linux-x86-64.so.2" hardcoded.
-                  (for-each
-                   (cut invoke "patchelf" "--set-interpreter" ld-so <>)
-                   binaries)
-                  ;; The binaries include a reference to libtinfo.so.5 which
-                  ;; is a subset of libncurses.so.5.  We create a symlink in a
-                  ;; directory included in the bootstrap binaries rpath.
-                  (mkdir-p libtinfo-dir)
-                  (symlink
-                   (string-append ncurses-lib "/libncursesw.so."
-                                  ;; Extract "6.0" from "6.0-20170930" if a
-                                  ;; dash-separated version tag exists.
-                                  ,(let* ((v (package-version ncurses))
-                                          (d (or (string-index v #\-)
-                                                 (string-length v))))
-                                     (version-major+minor (string-take v d))))
-                   (string-append libtinfo-dir "/libtinfo.so.5"))
-
-                  (setenv "PATH"
-                          (string-append (getenv "PATH") ":"
-                                         ghc-bootstrap-prefix "/bin"))
-                  (invoke
-                   (string-append (getcwd) "/configure")
-                   (string-append "--prefix=" ghc-bootstrap-prefix)
-                   (string-append "--with-gmp-libraries=" gmp-lib)
-                   (string-append "--with-gmp-includes=" gmp-include)))))
-            (alist-cons-before
-             'configure 'install-bin
-             (lambda* (#:key inputs outputs #:allow-other-keys)
-               (with-directory-excursion
+       #~(let* ((ghc-bootstrap-path
+                  (string-append (getcwd) "/" #$name "-" #$version "/ghc-bin"))
+                (ghc-bootstrap-prefix
+                  (string-append ghc-bootstrap-path "/usr" )))
+           (modify-phases %standard-phases
+             (add-after 'unpack 'unpack-bin
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                (mkdir-p ghc-bootstrap-prefix)
+                (with-directory-excursion ghc-bootstrap-path
+                  (invoke "tar" "xvf" (assoc-ref inputs "ghc-binary")))))
+             (add-after 'unpack-bin 'unpack-testsuite-and-fix-bins
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (with-directory-excursion ".."
+                   (invoke "tar" "xvf" (assoc-ref inputs "ghc-testsuite")))
+                 (substitute*
+                   (list "testsuite/timeout/Makefile"
+                         "testsuite/timeout/timeout.py"
+                         "testsuite/timeout/timeout.hs"
+                         "testsuite/tests/rename/prog006/Setup.lhs"
+                         "testsuite/tests/programs/life_space_leak/life.test"
+                         "libraries/process/System/Process/Internals.hs"
+                         "libraries/unix/cbits/execvpe.c")
+                   (("/bin/sh") (search-input-file inputs "/bin/sh"))
+                   (("/bin/rm") "rm"))))
+             (add-before 'configure 'install-bin
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (with-directory-excursion
                    (string-append ghc-bootstrap-path "/ghc-7.8.4")
-                 (invoke "make" "install")))
-             %standard-phases)))))))
+                   (invoke "make" "install"))))
+             (add-before 'install-bin 'configure-bin
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (let* ((binaries
+                          (list
+                            "./utils/ghc-pwd/dist-install/build/tmp/ghc-pwd"
+                            "./utils/hpc/dist-install/build/tmp/hpc"
+                            "./utils/haddock/dist/build/tmp/haddock"
+                            "./utils/hsc2hs/dist-install/build/tmp/hsc2hs"
+                            "./utils/runghc/dist-install/build/tmp/runghc"
+                            "./utils/ghc-cabal/dist-install/build/tmp/ghc-cabal"
+                            "./utils/hp2ps/dist/build/tmp/hp2ps"
+                            "./utils/ghc-pkg/dist-install/build/tmp/ghc-pkg"
+                            "./utils/unlit/dist/build/tmp/unlit"
+                            "./ghc/stage2/build/tmp/ghc-stage2"))
+                        (gmp (assoc-ref inputs "gmp"))
+                        (gmp-lib (string-append gmp "/lib"))
+                        (gmp-include (string-append gmp "/include"))
+                        (ncurses-lib
+                         (dirname (search-input-file inputs "/lib/libncurses.so")))
+                        (ld-so (search-input-file inputs #$(glibc-dynamic-linker)))
+                        (libtinfo-dir
+                         (string-append ghc-bootstrap-prefix
+                                        "/lib/ghc-7.8.4/terminfo-0.4.0.0")))
+                   (with-directory-excursion
+                     (string-append ghc-bootstrap-path "/ghc-7.8.4")
+                     (setenv "CONFIG_SHELL" (which "bash"))
+                     (setenv "LD_LIBRARY_PATH" gmp-lib)
+                     ;; The binaries have "/lib64/ld-linux-x86-64.so.2" hardcoded.
+                     (for-each
+                      (cut invoke "patchelf" "--set-interpreter" ld-so <>)
+                      binaries)
+                     ;; The binaries include a reference to libtinfo.so.5 which
+                     ;; is a subset of libncurses.so.5.  We create a symlink in a
+                     ;; directory included in the bootstrap binaries rpath.
+                     (mkdir-p libtinfo-dir)
+                     (symlink
+                      (string-append ncurses-lib "/libncursesw.so."
+                                     ;; Extract "6.0" from "6.0-20170930" if a
+                                     ;; dash-separated version tag exists.
+                                     #$(let* ((v (package-version ncurses))
+                                              (d (or (string-index v #\-)
+                                                     (string-length v))))
+                                         (version-major+minor (string-take v d))))
+                      (string-append libtinfo-dir "/libtinfo.so.5"))
+
+                     (setenv "PATH"
+                             (string-append (getenv "PATH") ":"
+                                            ghc-bootstrap-prefix "/bin"))
+                     (invoke
+                      (string-append (getcwd) "/configure")
+                      (string-append "--prefix=" ghc-bootstrap-prefix)
+                      (string-append "--with-gmp-libraries=" gmp-lib)
+                      (string-append "--with-gmp-includes=" gmp-include))))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -595,25 +587,24 @@ interactive environment for the functional language Haskell.")
     (supported-systems '("i686-linux" "x86_64-linux"))
     (outputs '("out" "doc"))
     (inputs
-     `(("gmp" ,gmp)
-       ("ncurses" ,ncurses)
-       ("libffi" ,libffi)
-       ("ghc-testsuite"
-        ,(origin
-           (method url-fetch)
-           (uri (string-append
-                 "https://www.haskell.org/ghc/dist/"
-                 version "/" name "-" version "-testsuite.tar.xz"))
-           (sha256
-            (base32 "1wjc3x68l305bl1h1ijd3yhqp2vqj83lkp3kqbr94qmmkqlms8sj"))))))
+     (list gmp ncurses libffi))
     (native-inputs
      `(("perl" ,perl)
        ("python" ,python-2)                ; for tests
        ("ghostscript" ,ghostscript)        ; for tests
        ;; GHC is built with GHC.
-       ("ghc-bootstrap" ,ghc-7)))
+       ("ghc-bootstrap" ,ghc-7)
+       ("ghc-testsuite"
+        ,(origin
+           (method url-fetch)
+           (uri (string-append
+                  "https://www.haskell.org/ghc/dist/"
+                  version "/" name "-" version "-testsuite.tar.xz"))
+           (sha256
+            (base32 "1wjc3x68l305bl1h1ijd3yhqp2vqj83lkp3kqbr94qmmkqlms8sj")))) ))
     (arguments
-     `(#:test-target "test"
+     (list
+       #:test-target "test"
        ;; We get a smaller number of test failures by disabling parallel test
        ;; execution.
        #:parallel-tests? #f
@@ -624,53 +615,48 @@ interactive environment for the functional language Haskell.")
        #:build #f
 
        #:configure-flags
-       (list
-        (string-append "--with-gmp-libraries="
-                       (assoc-ref %build-inputs "gmp") "/lib")
-        (string-append "--with-gmp-includes="
-                       (assoc-ref %build-inputs "gmp") "/include")
-        "--with-system-libffi"
-        (string-append "--with-ffi-libraries="
-                       (assoc-ref %build-inputs "libffi") "/lib")
-        (string-append "--with-ffi-includes="
-                       (assoc-ref %build-inputs "libffi") "/include")
-        (string-append "--with-curses-libraries="
-                       (assoc-ref %build-inputs "ncurses") "/lib")
-        (string-append "--with-curses-includes="
-                       (assoc-ref %build-inputs "ncurses") "/include"))
+       #~(list
+           (string-append "--with-gmp-libraries="
+                          (assoc-ref %build-inputs "gmp") "/lib")
+           (string-append "--with-gmp-includes="
+                          (assoc-ref %build-inputs "gmp") "/include")
+           "--with-system-libffi"
+           (string-append "--with-ffi-libraries="
+                          (assoc-ref %build-inputs "libffi") "/lib")
+           (string-append "--with-ffi-includes="
+                          (assoc-ref %build-inputs "libffi") "/include")
+           (string-append "--with-curses-libraries="
+                          (assoc-ref %build-inputs "ncurses") "/lib")
+           (string-append "--with-curses-includes="
+                          (assoc-ref %build-inputs "ncurses") "/include"))
        #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'unpack-testsuite
-           (lambda* (#:key inputs #:allow-other-keys)
-             (with-directory-excursion ".."
-               (copy-file (assoc-ref inputs "ghc-testsuite")
-                          "ghc-testsuite.tar.xz")
-               (zero? (system* "tar" "xvf" "ghc-testsuite.tar.xz")))))
-         (add-before 'build 'fix-lib-paths
-           (lambda _
-             (substitute*
+       #~(modify-phases %standard-phases
+           (add-after 'unpack 'unpack-testsuite
+             (lambda* (#:key inputs #:allow-other-keys)
+               (with-directory-excursion ".."
+                 (invoke "tar" "xvf" (assoc-ref inputs "ghc-testsuite")))))
+           (add-before 'build 'fix-lib-paths
+             (lambda* (#:key inputs #:allow-other-keys)
+               (substitute*
                  (list "libraries/process/System/Process/Posix.hs"
                        "libraries/process/tests/process001.hs"
                        "libraries/process/tests/process002.hs"
                        "libraries/unix/cbits/execvpe.c")
-               (("/bin/sh") (which "sh"))
-               (("/bin/ls") (which "ls")))
-             #t))
-         (add-before 'build 'fix-environment
-           (lambda _
-             (unsetenv "GHC_PACKAGE_PATH")
-             (setenv "CONFIG_SHELL" (which "bash"))
-             #t))
-         (add-before 'check 'fix-testsuite
-           (lambda _
-             (substitute*
+                 (("/bin/sh") (search-input-file inputs "/bin/sh"))
+                 (("/bin/ls") (search-input-file inputs "/bin/ls")))))
+           (add-before 'build 'fix-environment
+             (lambda _
+               (unsetenv "GHC_PACKAGE_PATH")
+               (setenv "CONFIG_SHELL" (which "bash"))))
+           (add-before 'check 'fix-testsuite
+             (lambda _
+               (substitute*
                  (list "testsuite/timeout/Makefile"
                        "testsuite/timeout/timeout.py"
                        "testsuite/timeout/timeout.hs"
                        "testsuite/tests/programs/life_space_leak/life.test")
-               (("/bin/sh") (which "sh"))
-               (("/bin/rm") "rm"))
-             #t)))))
+                 (("/bin/sh") (which "sh"))
+                 (("/bin/rm") "rm")))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -695,13 +681,11 @@ interactive environment for the functional language Haskell.")
                            version "/" name "-" version "-src.tar.xz"))
        (sha256
         (base32 "1ch4j2asg7pr52ai1hwzykxyj553wndg7wq93i47ql4fllspf48i"))))
-    (inputs
-     (list gmp ncurses libffi))
     (native-inputs
      `(("perl" ,perl)
        ("python" ,python)               ; for tests
        ("ghostscript" ,ghostscript)     ; for tests
-       ;; GHC 8.4.3 is built with GHC 8.
+       ;; GHC 8.4.4 is built with GHC >= 8.0.
        ("ghc-bootstrap" ,ghc-8.0)
        ("ghc-testsuite"
         ,(origin
@@ -713,92 +697,39 @@ interactive environment for the functional language Haskell.")
             (base32
              "0s8lf9sxj7n89pjagi58b3fahnp34qvmwhnn0j1fbg6955vbrfj6"))))))
     (arguments
-     `(#:test-target "test"
-       ;; We get a smaller number of test failures by disabling parallel test
-       ;; execution.
-       #:parallel-tests? #f
-
-       ;; Don't pass --build=<triplet>, because the configure script
-       ;; auto-detects slightly different triplets for --host and --target and
-       ;; then complains that they don't match.
-       #:build #f
-
-       #:configure-flags
-       (list
-        (string-append "--with-gmp-libraries="
-                       (assoc-ref %build-inputs "gmp") "/lib")
-        (string-append "--with-gmp-includes="
-                       (assoc-ref %build-inputs "gmp") "/include")
-        "--with-system-libffi"
-        (string-append "--with-ffi-libraries="
-                       (assoc-ref %build-inputs "libffi") "/lib")
-        (string-append "--with-ffi-includes="
-                       (assoc-ref %build-inputs "libffi") "/include")
-        (string-append "--with-curses-libraries="
-                       (assoc-ref %build-inputs "ncurses") "/lib")
-        (string-append "--with-curses-includes="
-                       (assoc-ref %build-inputs "ncurses") "/include"))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'unpack-testsuite
-           (lambda* (#:key inputs #:allow-other-keys)
-             (invoke "tar" "xvf"
-                     (assoc-ref inputs "ghc-testsuite")
-                     "--strip-components=1")
-             #t))
-         ;; This phase patches the 'ghc-pkg' command so that it sorts the list
-         ;; of packages in the binary cache it generates.
-         (add-before 'build 'fix-ghc-pkg-nondeterminism
-           (lambda _
-             (substitute* "utils/ghc-pkg/Main.hs"
-               (("confs = map \\(path </>\\) \\$ filter \\(\".conf\" `isSuffixOf`\\) fs")
-                "confs = map (path </>) $ filter (\".conf\" `isSuffixOf`) (sort fs)"))
-             #t))
-         (add-after 'unpack-testsuite 'fix-shell-wrappers
-           (lambda _
-             (substitute* '("driver/ghci/ghc.mk"
-                            "utils/mkdirhier/ghc.mk"
-                            "rules/shell-wrapper.mk")
-               (("echo '#!/bin/sh'")
-                (format #f "echo '#!~a'" (which "sh"))))
-             #t))
-         ;; This is necessary because the configure system no longer uses
-         ;; “AC_PATH_” but “AC_CHECK_”, setting the variables to just the
-         ;; plain command names.
-         (add-before 'configure 'set-target-programs
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((binutils (assoc-ref inputs "binutils"))
-                   (gcc (assoc-ref inputs "gcc"))
-                   (ld-wrapper (assoc-ref inputs "ld-wrapper")))
-               (setenv "CC" (string-append gcc "/bin/gcc"))
-               (setenv "CXX" (string-append gcc "/bin/g++"))
-               (setenv "LD" (string-append ld-wrapper "/bin/ld"))
-               (setenv "NM" (string-append binutils "/bin/nm"))
-               (setenv "RANLIB" (string-append binutils "/bin/ranlib"))
-               (setenv "STRIP" (string-append binutils "/bin/strip"))
-               ;; The 'ar' command does not follow the same pattern.
-               (setenv "fp_prog_ar" (string-append binutils "/bin/ar"))
-               #t)))
-         (add-before 'build 'fix-references
-           (lambda _
-             (substitute* '("testsuite/timeout/Makefile"
-                            "testsuite/timeout/timeout.py"
-                            "testsuite/timeout/timeout.hs"
-                            "testsuite/tests/programs/life_space_leak/life.test"
-                            ;; libraries
-                            "libraries/process/System/Process/Posix.hs"
-                            "libraries/process/tests/process001.hs"
-                            "libraries/process/tests/process002.hs"
-                            "libraries/unix/cbits/execvpe.c")
-               (("/bin/sh") (which "sh"))
-               (("/bin/ls") (which "ls"))
-               (("/bin/rm") "rm"))
-             #t))
-         (add-before 'build 'fix-environment
-           (lambda _
-             (unsetenv "GHC_PACKAGE_PATH")
-             (setenv "CONFIG_SHELL" (which "bash"))
-             #t)))))
+     (substitute-keyword-arguments (package-arguments ghc-8.0)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            ;; This phase patches the 'ghc-pkg' command so that it sorts the list
+            ;; of packages in the binary cache it generates.
+            (add-before 'build 'fix-ghc-pkg-nondeterminism
+              (lambda _
+                (substitute* "utils/ghc-pkg/Main.hs"
+                  (("confs = map \\(path </>\\) \\$ filter \\(\".conf\" `isSuffixOf`\\) fs")
+                   "confs = map (path </>) $ filter (\".conf\" `isSuffixOf`) (sort fs)"))))
+            (add-after 'unpack-testsuite 'fix-shell-wrappers
+              (lambda _
+                (substitute* '("driver/ghci/ghc.mk"
+                               "utils/mkdirhier/ghc.mk"
+                               "rules/shell-wrapper.mk")
+                  (("echo '#!/bin/sh'")
+                   (format #f "echo '#!~a'" (which "sh"))))))
+            ;; This is necessary because the configure system no longer uses
+            ;; “AC_PATH_” but “AC_CHECK_”, setting the variables to just the
+            ;; plain command names.
+            (add-before 'configure 'set-target-programs
+              (lambda* (#:key inputs #:allow-other-keys)
+                (let ((binutils (assoc-ref inputs "binutils"))
+                      (gcc (assoc-ref inputs "gcc"))
+                      (ld-wrapper (assoc-ref inputs "ld-wrapper")))
+                  (setenv "CC" (string-append gcc "/bin/gcc"))
+                  (setenv "CXX" (string-append gcc "/bin/g++"))
+                  (setenv "LD" (string-append ld-wrapper "/bin/ld"))
+                  (setenv "NM" (string-append binutils "/bin/nm"))
+                  (setenv "RANLIB" (string-append binutils "/bin/ranlib"))
+                  (setenv "STRIP" (string-append binutils "/bin/strip"))
+                  ;; The 'ar' command does not follow the same pattern.
+                  (setenv "fp_prog_ar" (string-append binutils "/bin/ar")))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -838,10 +769,10 @@ interactive environment for the functional language Haskell.")
     (arguments
      (substitute-keyword-arguments (package-arguments ghc-8.4)
        ((#:make-flags make-flags ''())
-        `(cons "EXTRA_RUNTEST_OPTS=--skip-perf-tests"
-               ,make-flags))
+        #~(cons "EXTRA_RUNTEST_OPTS=--skip-perf-tests"
+                #$make-flags))
        ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
+        #~(modify-phases #$phases
            (add-after 'install 'remove-unnecessary-references
              (lambda* (#:key outputs #:allow-other-keys)
                (substitute* (find-files (string-append (assoc-ref outputs "out") "/lib/")
@@ -866,8 +797,7 @@ interactive environment for the functional language Haskell.")
                                     (new    (string-append out subdir)))
                                (mkdir-p (dirname new))
                                (rename-file haddock-file new)))
-                           (find-files doc "\\.haddock$")))
-               #t))
+                           (find-files doc "\\.haddock$")))))
            (add-after 'unpack-testsuite 'skip-tests
              (lambda _
                ;; These two tests refer to the root user, which doesn't exist
@@ -875,8 +805,7 @@ interactive environment for the functional language Haskell.")
                (substitute* "libraries/unix/tests/all.T"
                  (("^test\\('T8108'") "# guix skipped: test('T8108'"))
                (substitute* "libraries/unix/tests/libposix/all.T"
-                 (("^test\\('posix010'") "# guix skipped: test('posix010'"))
-               #t))))))
+                 (("^test\\('posix010'") "# guix skipped: test('posix010'"))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -916,19 +845,17 @@ interactive environment for the functional language Haskell.")
     (arguments
      (substitute-keyword-arguments (package-arguments ghc-8.6)
        ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
-           (add-after 'fix-references 'fix-cc-reference
+        #~(modify-phases #$phases
+           (add-before 'build 'fix-cc-reference
              (lambda _
                (substitute* "utils/hsc2hs/Common.hs"
-                 (("\"cc\"") "\"gcc\""))
-               #t))
+                 (("\"cc\"") "\"gcc\""))))
            (add-after 'unpack-testsuite 'skip-more-tests
              (lambda _
                ;; XXX: This test fails because our ld-wrapper script
                ;; mangles the response file passed to the linker.
                (substitute* "testsuite/tests/hp2ps/all.T"
-                 (("^test\\('T15904'") "# guix skipped: test('T15904'"))
-               #t))))))
+                 (("^test\\('T15904'") "# guix skipped: test('T15904'"))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -949,7 +876,8 @@ interactive environment for the functional language Haskell.")
        (sha256
         (base32 "179ws2q0dinl1a39wm9j37xzwm84zfz3c5543vz8v479khigdvp3"))))
     (native-inputs
-     `(("ghc-bootstrap" ,ghc-8.8)
+     `(;; GHC 8.10.7 must be built with GHC >= 8.6.
+       ("ghc-bootstrap" ,ghc-8.6)
        ("ghc-testsuite"
         ,(origin
            (method url-fetch)
@@ -969,7 +897,7 @@ interactive environment for the functional language Haskell.")
     (arguments
      (substitute-keyword-arguments (package-arguments ghc-8.8)
        ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
+        #~(modify-phases #$phases
            (add-after 'unpack-testsuite 'patch-more-shebangs
              (lambda* (#:key inputs #:allow-other-keys)
                (let ((bash (assoc-ref inputs "bash")))
@@ -983,20 +911,16 @@ interactive environment for the functional language Haskell.")
                  (("extra_files" all) (string-append "[" all))
                  (("\\]\\), " all)
                   (string-append all "expect_broken(0)], ")))))
-           ;; TODO: Turn this into an undconditional patch on the next rebuild.
-           ,@(if (string-prefix? "i686" (or (%current-target-system)
-                                                  (%current-system)))
-              '((add-after 'skip-more-tests 'skip-failing-tests-i686
-                 (lambda _
-                   (substitute* '("testsuite/tests/codeGen/should_compile/all.T")
-                     (("(test\\('T15155l', )when\\(unregisterised\\(\\), skip\\)" all before)
-                      (string-append before "when(arch('i386'), skip)")))
-                   ;; Unexpected failures:
-                   ;;    quasiquotation/T14028.run  T14028 [bad stderr] (dyn)
-                   (substitute* '("testsuite/tests/quasiquotation/all.T")
-                     (("unless\\(config.have_ext_interp, skip\\),")
-                      "unless(config.have_ext_interp, skip), when(arch('i386'), skip),")))))
-              '())))))
+           (add-after 'skip-more-tests 'skip-failing-tests-i686
+             (lambda _
+               (substitute* '("testsuite/tests/codeGen/should_compile/all.T")
+                 (("(test\\('T15155l', )when\\(unregisterised\\(\\), skip\\)" all before)
+                  (string-append before "when(arch('i386'), skip)")))
+               ;; Unexpected failures:
+               ;;    quasiquotation/T14028.run  T14028 [bad stderr] (dyn)
+               (substitute* '("testsuite/tests/quasiquotation/all.T")
+                 (("unless\\(config.have_ext_interp, skip\\),")
+                  "unless(config.have_ext_interp, skip), when(arch('i386'), skip),"))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
diff --git a/gnu/packages/icu4c.scm b/gnu/packages/icu4c.scm
index 94a72fac15..1e4f66d956 100644
--- a/gnu/packages/icu4c.scm
+++ b/gnu/packages/icu4c.scm
@@ -152,22 +152,6 @@ C/C++ part.")
                     (string-append "//" all))))))))
        (package-arguments icu4c)))))
 
-(define-public icu4c-67
-  (package
-    (inherit icu4c)
-    (version "67.1")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://github.com/unicode-org/icu/releases/download/release-"
-                    (string-map (lambda (x) (if (char=? x #\.) #\- x)) version)
-                    "/icu4c-"
-                    (string-map (lambda (x) (if (char=? x #\.) #\_ x)) version)
-                    "-src.tgz"))
-              (sha256
-               (base32
-                "1p6mhvxl0xr2n0g6xdps3mwzwlv6mjsz3xlpm793p9aiybb0ra4l"))))))
-
 (define-public icu4c-68
   (package
     (inherit icu4c)
diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm
index e679a73f9d..557a89aa6b 100644
--- a/gnu/packages/image.scm
+++ b/gnu/packages/image.scm
@@ -979,7 +979,7 @@ Metafile}, and @acronym{EMF+, Enhanced Metafile Plus} files.")
 (define-public imlib2
   (package
     (name "imlib2")
-    (version "1.9.0")
+    (version "1.9.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -987,7 +987,7 @@ Metafile}, and @acronym{EMF+, Enhanced Metafile Plus} files.")
                     "/imlib2-" version ".tar.xz"))
               (sha256
                (base32
-                "0l662h74i3mzl5ligj1352rf8bf48drasj97wygr2037gk5fijas"))))
+                "0hsdfs7wa5f7fwb5nfgqzvf29bp59rgy0i0c4m6mvgpzpww408ja"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags (list "--disable-static")))
@@ -1274,7 +1274,7 @@ language bindings to VIGRA.")
 (define-public libwebp
   (package
     (name "libwebp")
-    (version "1.2.0")
+    (version "1.2.2")
     (source
      (origin
        ;; No tarballs are provided for >0.6.1.
@@ -1285,14 +1285,14 @@ language bindings to VIGRA.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1rgblphsd56033w7lpkrzl7m5w0fi7wavxri1ayzlg8fhpmmqp4k"))))
+         "1khqkm5j9aiii9jfsbxzzyz3x33sifzcx537cyjyb3a2g2rl969k"))))
     (build-system gnu-build-system)
     (inputs
-     `(("freeglut" ,freeglut)
-       ("giflib" ,giflib)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libpng" ,libpng)
-       ("libtiff" ,libtiff)))
+     (list freeglut
+           giflib
+           libjpeg-turbo
+           libpng
+           libtiff))
     (native-inputs
      (list autoconf automake libtool))
     (arguments
@@ -1327,9 +1327,7 @@ channels.")
     (build-system gnu-build-system)
     (propagated-inputs
      ;; These are all in the 'Libs.private' field of libmng.pc.
-     `(("lcms" ,lcms)
-       ("libjpeg" ,libjpeg-turbo)
-       ("zlib" ,zlib)))
+     (list lcms libjpeg-turbo zlib))
     (home-page "https://www.libmng.com/")
     (synopsis "Library for handling MNG files")
     (description
diff --git a/gnu/packages/iso-codes.scm b/gnu/packages/iso-codes.scm
index f8775c5eaa..95ab9ca44f 100644
--- a/gnu/packages/iso-codes.scm
+++ b/gnu/packages/iso-codes.scm
@@ -46,19 +46,8 @@
               (base32
                "1q6x9c5x4x0x4q11iygldsmxdyzhz1mb4n8im76glwsgqsqyjs80"))))
     (build-system gnu-build-system)
-    ;; TODO(staging): Unconditionally move inputs to native-inputs.
     (native-inputs
-     (if (%current-target-system)
-         `(("python" ,python-wrapper)
-           ("perl" ,perl)
-           ("gettext" ,gettext-minimal))
-         '()))
-    (inputs
-     `(,@(if (%current-target-system)
-             '()
-             `(("gettext" ,gettext-minimal)
-               ("perl" ,perl)
-               ("python" ,python-wrapper)))))
+     (list gettext-minimal perl python-wrapper))
     (synopsis "Various ISO standards")
     (description
      "This package provides lists of various ISO standards (e.g. country,
diff --git a/gnu/packages/julia.scm b/gnu/packages/julia.scm
index 29c981189c..9f3ef031c3 100644
--- a/gnu/packages/julia.scm
+++ b/gnu/packages/julia.scm
@@ -82,6 +82,10 @@
                           "1jk3bmiw61ypcchqkk1fyg5wh8wpggk574wxyfyaic870zh3lhgq")
              (julia-patch "libunwind-cfa-rsp"
                           "1aswjhvysahhldbzh1afbf0hsjxrvs6xidsz2i7s1cjkjbdiia1z"))))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments libunwind)
+       ;; Skip tests on this older and patched version of libunwind.
+       ((#:tests? _ #t) #f)))
     (home-page "https://github.com/JuliaLang/tree/master/deps/")))
 
 (define (julia-patch-url version name)
diff --git a/gnu/packages/kde-frameworks.scm b/gnu/packages/kde-frameworks.scm
index 738013fdba..bec8ff1c51 100644
--- a/gnu/packages/kde-frameworks.scm
+++ b/gnu/packages/kde-frameworks.scm
@@ -10,6 +10,7 @@
 ;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2021 Alexandros Theodotou <alex@zrythm.org>
 ;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,6 +29,7 @@
 
 (define-module (gnu packages kde-frameworks)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system python)
   #:use-module (guix build-system qt)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
@@ -61,8 +63,10 @@
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages gstreamer)
   #:use-module (gnu packages image)
+  #:use-module (gnu packages iso-codes)
   #:use-module (gnu packages kerberos)
   #:use-module (gnu packages kde-plasma)
+  #:use-module (gnu packages libcanberra)
   #:use-module (gnu packages libreoffice)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages mp3)
@@ -88,7 +92,7 @@
 (define-public extra-cmake-modules
   (package
     (name "extra-cmake-modules")
-    (version "5.91.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -97,7 +101,7 @@
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0k65rvxh926ya6qahzk2ns7g1fya1429648mlx7iipxa61g8h5wp"))))
+                "1ngxjvf584zgfb93s5sbr5f5nyw0sqc5i0jlbcgbrjg2n83l9ddx"))))
     (build-system cmake-build-system)
     (native-inputs
      ;; Add test dependency, except on armhf where building it is too
@@ -201,9 +205,8 @@ common build settings used in software produced by the KDE community.")
                                          (assoc-ref inputs "qtbase"))))
                (substitute* "cmake_install.cmake"
                  ((regex all dest)
-                  (string-append dest (assoc-ref outputs "out")))))
-           #t)))))
-    (home-page "https://phonon.kde.org")
+                  (string-append dest (assoc-ref outputs "out"))))))))))
+    (home-page "https://community.kde.org/Phonon")
     (synopsis "KDE's multimedia library")
     (description "KDE's multimedia library.")
     (license license:lgpl2.1+)))
@@ -251,7 +254,7 @@ Phonon-GStreamer is a backend based on the GStreamer multimedia library.")
 (define-public attica
   (package
     (name "attica")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -260,7 +263,7 @@ Phonon-GStreamer is a backend based on the GStreamer multimedia library.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1njw1sifykyqldb5idaywdzi3xg7a6bvzkrvazwmyixd0npq12dx"))))
+                "1xlg2sbfd45p9dw0sprpk0fancasp4idxacsf5xksf2ddn2crzp7"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
@@ -291,7 +294,7 @@ http://freedesktop.org/wiki/Specifications/open-collaboration-services/")
 (define-public bluez-qt
   (package
     (name "bluez-qt")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -300,7 +303,7 @@ http://freedesktop.org/wiki/Specifications/open-collaboration-services/")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1kqhps4qyvqm0qmk7fb3w41bib898amipchf8csdzacw4bzpri9k"))))
+                "0yc7mq9bnanp5dfv43vp8wpqw5l8qh4aahqpi9sid7jmd6sbywl2"))))
     (build-system cmake-build-system)
     (native-inputs
      (list dbus extra-cmake-modules))
@@ -313,7 +316,13 @@ http://freedesktop.org/wiki/Specifications/open-collaboration-services/")
                     "-DUDEV_RULES_INSTALL_DIR=" #$output "/lib/udev/rules.d"))
            ;; TODO: Make tests pass: DBUS_FATAL_WARNINGS=0 still yields 7/8 tests
            ;; failing.  When running after install, tests hang.
-           #:tests? #f))
+           #:phases
+            '(modify-phases %standard-phases
+              (replace 'check
+                (lambda* (#:key tests? #:allow-other-keys)
+                  (when tests?
+                    (setenv "DBUS_FATAL_WARNINGS" "0")
+                    (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "QML wrapper for BlueZ")
     (description "bluez-qt is a Qt-style library for accessing the bluez
@@ -323,7 +332,7 @@ Bluetooth stack.  It is used by the KDE Bluetooth stack, BlueDevil.")
 (define-public breeze-icons
   (package
     (name "breeze-icons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -332,12 +341,15 @@ Bluetooth stack.  It is used by the KDE Bluetooth stack, BlueDevil.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0lqglrjgjb4ralgmr7lb9k7acmn8q4jm18s4p3gbgd9iswyqgsbm"))))
+                "1ij723qy6xfkys8a9vp2ll2z2yp7667hfw559gi8cxn825hjx823"))))
     (build-system cmake-build-system)
     (native-inputs
-     (list extra-cmake-modules fdupes libxml2))
+     (list extra-cmake-modules fdupes
+           python python-lxml)) ;; For 24x24 icon generation
     (inputs
      (list qtbase-5))
+    (arguments ;; fails because duplicate icons exist. TODO: try fix this.
+     `(#:tests? #f))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Default KDE Plasma 5 icon theme")
     (description "Breeze provides a freedesktop.org compatible icon theme.
@@ -350,7 +362,7 @@ It is the default icon theme for the KDE Plasma 5 desktop.")
 (define-public kapidox
   (package
     (name "kapidox")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -359,12 +371,12 @@ It is the default icon theme for the KDE Plasma 5 desktop.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1irl25pf60frzrmm1ksgjq6y8kn3rd5snliq69l4c42yznl9qv1j"))))
-    (build-system cmake-build-system)
+                "1w5h4xwscix0yjn8d0rcjd7hlmrnbmkjg20diqjabb5wcxsrjiwi"))))
+    (build-system python-build-system)
     (arguments
-     `(#:tests? #f)) ; has no test target
-    (native-inputs
-     (list extra-cmake-modules))
+     `(#:tests? #f  ; has no test target
+       #:phases (modify-phases %standard-phases
+                  (delete 'sanity-check)))) ;its insane.
     (propagated-inputs
      ;; kapidox is a python programm
      ;; TODO: check if doxygen has to be installed, the readme does not
@@ -390,7 +402,7 @@ documentation.")
 (define-public karchive
   (package
     (name "karchive")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -399,12 +411,14 @@ documentation.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0z8asn357pdbv4g9g0x18p72wskca1qanxljyix7wzc5rsi63wzm"))))
+                "1bra1q225xhh8dilwmzc0jgnj5m3dmi4nkz4y8f42si97b4xxxf5"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
+           ;; pkg-config ;; For zstd
     (inputs
      (list bzip2 qtbase-5 xz zlib))
+           ;; `(,zstd "lib")  ;; FIXME: Tests fail with zstd
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Qt 5 addon providing access to numerous types of archives")
     (description "KArchive provides classes for easy reading, creation and
@@ -421,7 +435,7 @@ GZip format, via a subclass of QIODevice.")
 (define-public kcalendarcore
   (package
     (name "kcalendarcore")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -430,7 +444,7 @@ GZip format, via a subclass of QIODevice.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1y1f8gc1g9yn9kgmn53f1zvkizasfs667dfin3fyci657r5qwpw2"))))
+                "181yif830v4gg7nw9s15pvgfm98rmm6xwi2xxy3nxg7nkp14vs5k"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules perl tzdata-for-tests))
@@ -439,26 +453,9 @@ GZip format, via a subclass of QIODevice.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'configure 'disable-failing-libical3-tests
-           (lambda _
-             ;; testicaltimezones fails with some time-zone issue
-             (substitute* "autotests/CMakeLists.txt"
-               (("macro_unit_tests\\(testicaltimezones\\)" line)
-                (string-append "## " line))
-               (("target_link_libraries\\(testicaltimezones " line)
-                (string-append "## " line)))
-             (for-each
-              delete-file
-              (list
-               ;; test cases are generated for each .ics file. These fail:
-               "autotests/data/Compat-libical3/AppleICal_1.5.ics"
-               "autotests/data/Compat-libical3/Evolution_2.8.2_timezone_test.ics"
-               "autotests/data/Compat-libical3/KOrganizer_3.1a.ics"
-               "autotests/data/Compat-libical3/MSExchange.ics"
-               "autotests/data/Compat-libical3/Mozilla_1.0.ics"))
-             #t))
-         (add-before 'check 'set-timezone
-           (lambda* (#:key inputs #:allow-other-keys)
+         (add-before 'check 'check-setup
+           (lambda* (#:key inputs #:allow-other-keys) ;;; XXX: failing test
+             (setenv "QT_QPA_PLATFORM" "offscreen")
              (setenv "TZ" "Europe/Prague")
              (setenv "TZDIR"
                      (search-input-directory inputs
@@ -478,7 +475,7 @@ and the older vCalendar.")
 (define-public kcodecs
   (package
     (name "kcodecs")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -487,7 +484,7 @@ and the older vCalendar.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0y9n2a5n18pasdmrp0xb84hla9l27yj2x3k4p1c041sd9nkwixpk"))))
+                "05266wjxmzf3qpb2xwlm40cr9h266l5r9dqww81m8bq856pf8ivi"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules gperf qttools-5))
@@ -512,7 +509,7 @@ Internet).")
 (define-public kconfig
   (package
     (name "kconfig")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -521,25 +518,23 @@ Internet).")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1s3h4hfpw7c0894cifj66bj1yhx8g94ckvl71jm7qqsb5x5h6y9n"))))
+                "1xa8xxm2x9783fqb26wyvg1mp6ybjikngznqdhsk9slhaca73yhz"))))
     (build-system cmake-build-system)
     (native-inputs
      (list dbus extra-cmake-modules inetutils qttools-5
            xorg-server-for-tests))
     (inputs
-     (list qtbase-5))
+     (list qtbase-5 qtdeclarative-5))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             (setenv "TMPDIR" (getcwd))
-             #t))
          (replace 'check
-           (lambda _
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests? ;; kconfigcore-kconfigtest fails inconsistently!!
+               (setenv "HOME" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               (invoke "ctest" "-E" "(kconfigcore-kconfigtest|\
+kconfiggui-kstandardshortcutwatchertest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Kconfiguration settings framework for Qt")
     (description "KConfig provides an advanced configuration system.
@@ -574,7 +569,7 @@ propagate their changes to their respective configuration files.")
 (define-public kcoreaddons
   (package
     (name "kcoreaddons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -583,40 +578,23 @@ propagate their changes to their respective configuration files.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "10a7zys3limsawl7lk9ggymk3msk2bp0y8hp0jmsvk3l405pd1ps"))))
+                "1n5mzj02si8allg907l6vn77c2i95qdgfvn48gsqgalwlyd4q6nj"))))
     (build-system cmake-build-system)
     (native-inputs
-     (list extra-cmake-modules qttools-5 shared-mime-info
+     (list extra-cmake-modules qttools-5 shared-mime-info))
            ;; TODO: FAM: File alteration notification http://oss.sgi.com/projects/fam
-           xorg-server-for-tests)) ; for the tests
     (inputs
      (list qtbase-5))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'blacklist-failing-test
-           (lambda _
-             ;; Blacklist failing tests.
-             (with-output-to-file "autotests/BLACKLIST"
-               (lambda _
-                 ;; FIXME: Make it pass.  Test failure caused by stout/stderr
-                 ;; being interleaved.
-                 (display "[test_channels]\n*\n")
-                 ;; This fails with ENOSPC because of too many inotify watches.
-                 (display "[benchNotifyWatcher]\n*\n")))
-             #t))
-         ;; See upstream commit ee424e9b62368485bba4193053cabb553a1d268e
-         (add-after 'unpack 'fix-broken-test
-           (lambda _
-             (substitute* "autotests/kdirwatch_unittest.cpp"
-               (("QVERIFY\\(waitForRecreationSignal\\(watch, existingFile\\)\\);" m)
-                (string-append m "\nwaitUntilNewSecond();")))
-             #t))
-         (add-before 'check 'check-setup
-           (lambda _
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
              (setenv "HOME" (getcwd))
              (setenv "TMPDIR" (getcwd))
-             #t)))))
+             (when tests? ;; kdirwatch test fails inconsistently. kprocesstest fails.
+               (invoke "ctest" "-E" "(kdirwatch_qfswatch_unittest|kprocesstest|\
+kdirwatch_stat_unittest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Qt addon library with a collection of non-GUI utilities")
     (description "KCoreAddons provides classes built on top of QtCore to
@@ -629,7 +607,7 @@ many more.")
 (define-public kdbusaddons
   (package
     (name "kdbusaddons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -638,27 +616,29 @@ many more.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1vz2hg5p8wvfk0pi8v25zqzcn8yj7ykakxjyipmadvi02c1h8gic"))
-              (patches (search-patches "kdbusaddons-kinit-file-name.patch"))))
+                "1y0fd0a1nwgchsk3vx8hvvkw96f0l0533g57xakq4j4xkvxd8l3y"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules dbus qttools-5))
     (inputs
-     (list qtbase-5 qtx11extras kinit-bootstrap)) ;; kinit-bootstrap: kinit package which does not depend on kdbusaddons.
+     (list qtbase-5 qtx11extras kinit-bootstrap))
+    ;; kinit-bootstrap: kinit package which does not depend on kdbusaddons.
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before
-          'configure 'patch-source
+         (add-before 'configure 'patch-source
           (lambda* (#:key inputs #:allow-other-keys)
             ;; look for the kdeinit5 executable in kinit's store directory,
             ;; instead of the current application's directory:
             (substitute* "src/kdeinitinterface.cpp"
-              (("@SUBSTITUTEME@") (assoc-ref inputs "kinit")))))
+              (("<< QCoreApplication::applicationDirPath..")
+               (string-append
+                "<< QString::fromUtf8(\"" (assoc-ref inputs "kinit") "/bin\")" )))))
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Convenience classes for DBus")
     (description "KDBusAddons provides convenience classes on top of QtDBus,
@@ -670,7 +650,7 @@ as well as an API to create KDED modules.")
 (define-public kdnssd
   (package
     (name "kdnssd")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -679,7 +659,7 @@ as well as an API to create KDED modules.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0wadknnf472rqg2xnqzs5v23qzqfr336wj6d96yg2ayqm0chbppy"))))
+                "1d3jq64gyj3bc3sf46gnpbmjrm809hva47z7fkwkk9i2lmnmy70w"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -725,7 +705,7 @@ replace the other outdated Graphviz tools.")
 (define-public kguiaddons
   (package
     (name "kguiaddons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -734,7 +714,7 @@ replace the other outdated Graphviz tools.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1yndjdhb9zzlhh74xccpys38balm5dma56sx6bwwfrga1phq0g5l"))))
+                "028kn9lcvzv8f8b17a3clki7013dmhhcp1l9svvf6hydv97vkfbv"))))
     (build-system qt-build-system)
     ;; TODO: Build packages for the Python bindings.  Ideally this will be
     ;; done for all versions of python guix supports.  Requires python,
@@ -743,7 +723,7 @@ replace the other outdated Graphviz tools.")
     (native-inputs
      (list extra-cmake-modules pkg-config))
     (inputs
-     (list qtbase-5 qtx11extras))
+     (list qtbase-5 qtwayland qtx11extras plasma-wayland-protocols wayland))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Utilities for graphical user interfaces")
     (description "The KDE GUI addons provide utilities for graphical user
@@ -753,7 +733,7 @@ interfaces in the areas of colors, fonts, text, images, keyboard input.")
 (define-public kholidays
   (package
     (name "kholidays")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -761,18 +741,8 @@ interfaces in the areas of colors, fonts, text, images, keyboard input.")
                     (version-major+minor version) "/"
                     name "-" version ".tar.xz"))
        (sha256
-        (base32 "1rifx51yk24sk578h08s1bwpqb61rnyyks33zpl82lcdnl1ljp26"))))
+        (base32 "0rcd8k2x1w6jszxj18pkzimn5q4v2k7zs9x1pfwszn7xl59b3n4k"))))
     (build-system cmake-build-system)
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             ;; blacklist a failing test function TODO: make it pass
-             (with-output-to-file "autotests/BLACKLIST"
-               (lambda _
-                 (display "[testDefaultRegions]\n*\n")))
-             #t)))))
     (native-inputs
      (list extra-cmake-modules qttools-5))
     (inputs
@@ -786,7 +756,7 @@ other special events for a geographical region.")
 (define-public ki18n
   (package
     (name "ki18n")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -795,21 +765,22 @@ other special events for a geographical region.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1f952488492sm904i1iwgjp2gc7z07312mlshw4ckh2801y0qclc"))))
+                "1jry8bdjgxkcqln7awkj3k8996lh76vya2mf5kwpyxagk6vmr0gy"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list gettext-minimal python))
     (native-inputs
      (list extra-cmake-modules))
     (inputs
-     (list qtbase-5 qtdeclarative-5 qtscript))
+     (list qtbase-5 qtdeclarative-5 qtscript iso-codes))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             #t)))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (invoke "ctest" "-E" "(kcountrytest|kcountrysubdivisiontest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "KDE Gettext-based UI text internationalization")
     (description "KI18n provides functionality for internationalizing user
@@ -826,7 +797,7 @@ translation scripting.")
 (define-public kidletime
   (package
     (name "kidletime")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -835,7 +806,7 @@ translation scripting.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0vbxs80a8kh2xbxclx8zwl7acynsasa7i0cs171fxr26d0dmmhm5"))))
+                "13piv607n9hmlbd7kkhl7b1wcxj1jq2b5386c6pxrz5caxjwgnmd"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -855,7 +826,7 @@ or user activity.")
   ;; plasma-framework which is tier 3.
   (package
     (name "kirigami")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -864,7 +835,7 @@ or user activity.")
                     "kirigami2-" version ".tar.xz"))
               (sha256
                (base32
-                "0akkyif6n9l7hw4cj6nkf1zwgnd7vqi1gyiqmn588rspgl91zf1w"))))
+                "12ir4q9njl60b242j9raj1xsjs0cizsk7bixwb1hssfn6fzpzqkv"))))
     (properties `((upstream-name . "kirigami2")))
     (build-system cmake-build-system)
     (native-inputs
@@ -890,7 +861,7 @@ of applications that follow the Kirigami Human Interface Guidelines.")
 (define-public kitemmodels
   (package
     (name "kitemmodels")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -899,7 +870,7 @@ of applications that follow the Kirigami Human Interface Guidelines.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0x7y5shg2pp490hvmkz81b8j01cha9j1001q34m7pnyf0n3zknzc"))))
+                "1j6kffvgbd07zzzv0kab8mbwa69fmw4b8jczd0wzvmp56idsfc2v"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -940,7 +911,7 @@ model to observers
 (define-public kitemviews
   (package
     (name "kitemviews")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -949,7 +920,7 @@ model to observers
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "04vlmkvc3y5h7cpb6kdv9gha5axxkimhqh44mdg2ncyn4sas6j68"))))
+                "1wr62z6jwlg40m8kl9bpiyzkyjmsqx0fhgwc01192k58nl2696lb"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -965,7 +936,7 @@ to flat and hierarchical lists.")
 (define-public kplotting
   (package
     (name "kplotting")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -974,7 +945,7 @@ to flat and hierarchical lists.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1wj4n2a8iz9ml1y0012xkpsx3dfp5gl2dn80sifrzvkxjxrhwach"))))
+                "1yqx260r3dzcinp8s685yzp5f2ihc0s1csckb9zv7z1bzljkn3h9"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -992,7 +963,7 @@ pixel units.")
 (define-public ksyntaxhighlighting
   (package
     (name "ksyntaxhighlighting")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1001,7 +972,7 @@ pixel units.")
                     "syntax-highlighting-" version ".tar.xz"))
               (sha256
                (base32
-                "12jn7lqsp86329spai7n1n8i65nwhxh8gp33wkq543h7w3i2a3jb"))))
+                "176prghxfrb7i68jacmq9vkl7j9arsn6gnkzyc2hlkph35js3zqs"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules perl qttools-5
@@ -1016,16 +987,12 @@ pixel units.")
            (lambda _
              ;; revert the patch-shebang phase on scripts which are
              ;; in fact test data
-             (substitute* '("autotests/input/test.bash"
-                            "autotests/folding/test.bash.fold")
-               (((which "bash")) "/bin/bash"))
              (substitute* '("autotests/input/highlight.sh"
                             "autotests/folding/highlight.sh.fold")
                (((which "sh")) " /bin/sh")) ;; space in front!
              (substitute* '("autotests/input/highlight.pl"
                             "autotests/folding/highlight.pl.fold")
-               (((which "perl")) "/usr/bin/perl"))
-             #t)))))
+               (((which "perl")) "/usr/bin/perl")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Syntax highlighting engine for Kate syntax definitions")
     (description "This is a stand-alone implementation of the Kate syntax
@@ -1039,14 +1006,14 @@ integration with a custom editor as well as a ready-to-use
 (define-public plasma-wayland-protocols
   (package
     (name "plasma-wayland-protocols")
-    (version "1.6.0")
+    (version "1.7.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/" name "/"
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "07zhf2dzacj4xlhackpzaxqnp0d1ldkqlx0f313pw1pgd74zlkxp"))))
+                "1mps0pirffvnpnbcpi1l9fxxfx14n83f1p46zv3987d6ra2jckh8"))))
     (build-system cmake-build-system)
     (native-inputs (list extra-cmake-modules))
     (arguments '(#:tests? #f))          ;no tests
@@ -1063,7 +1030,7 @@ protocols used in KDE Plasma.")
 (define-public kwayland
   (package
     (name "kwayland")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1072,21 +1039,26 @@ protocols used in KDE Plasma.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0hrpbfzixjpnfy9q5x66q1fff0p7n80rrs127zzdv68pyi6456ry"))))
+                "0dcnsiippwxvwvf1gvp75lx97c4nydzn3x1l8lfy86w9lfslw7zb"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
     (inputs
-     (list qtbase-5 qtwayland wayland wayland-protocols))
+     (list qtbase-5 plasma-wayland-protocols qtwayland wayland wayland-protocols))
     (arguments
-     `(#:tests? #f ; FIXME tests require weston to run
-                   ; weston requires wayland flags in mesa
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'check-setup
+         (add-after 'unpack 'skip-specific-tests
            (lambda _
-             (setenv "XDG_RUNTIME_DIR" "/tmp")
-             #t)))))
+             ;; PlasmaWindowModelTest::testChangeWindowAfterModelDestroy(icon)
+             (substitute* "autotests/client/test_plasma_window_model.cpp"
+               ((".*changedSpy\\.wait.*") ""))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (setenv "XDG_RUNTIME_DIR" (getcwd))
+             (setenv "QT_QPA_PLATFORM" "offscreen")
+             (when tests? ;; One test fails.
+               (invoke "ctest" "-E" "kwayland-testWaylandRegistry")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Qt-style API to interact with the wayland client and server")
     (description "As the names suggest they implement a Client respectively a
@@ -1100,7 +1072,7 @@ represented by a QPoint or a QSize.")
 (define-public kwidgetsaddons
   (package
     (name "kwidgetsaddons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1109,7 +1081,7 @@ represented by a QPoint or a QSize.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "03l37lh219np7pqfa56r2v7n5s5xg4rjq005qng4b5izd95ri56j"))))
+                "1igbkrn8qaalan0lyn8r2gqv5v3rwbmb3xv3w26yw77vwp0n789r"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5 xorg-server-for-tests))
@@ -1118,12 +1090,12 @@ represented by a QPoint or a QSize.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'adjust-tests
-           (lambda _
-             ;; It is unclear why this test suddenly started failing.
-             (substitute* "autotests/kcolumnresizertest.cpp"
-               ((".*QCOMPARE.*") ""))
-             #t)))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "XDG_CACHE_HOME" "/tmp/xdg-cache")
+               (invoke "ctest" "-E" "(ksqueezedtextlabelautotest|\
+kwidgetsaddons-kcolumnresizertest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Large set of desktop widgets")
     (description "Provided are action classes that can be added to toolbars or
@@ -1135,7 +1107,7 @@ configuration pages, message boxes, and password requests.")
 (define-public kwindowsystem
   (package
     (name "kwindowsystem")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1144,7 +1116,7 @@ configuration pages, message boxes, and password requests.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0a68cj0bsl5a9sxfd969khznycrn9p6grp2b08hqacxqdknzs0wh"))))
+                "1ilb3zl3mlndfrqz6gi28x6qqqs45l65d0wmy3lk07lppcw3wxzx"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules
@@ -1168,19 +1140,20 @@ configuration pages, message boxes, and password requests.")
              (with-output-to-file "autotests/BLACKLIST"
                (lambda _
                  (display "[testGroupLeader]\n*\n")
-                 (display "[testClientMachine]\n*\n"))) ;; requires network
-             #t))
+                 (display "[testClientMachine]\n*\n"))))) ;; requires network
          (replace 'check
-           (lambda _
+           (lambda* (#:key tests? #:allow-other-keys)
              ;; The test suite requires a running window anager
-             (setenv "XDG_RUNTIME_DIR" "/tmp")
-             (system "Xvfb :1 -ac -screen 0 640x480x24 &")
-             (setenv "DISPLAY" ":1")
-             (sleep 5) ;; Give Xvfb a few moments to get on it's feet
-             (system "openbox &")
-             (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+             (when tests?
+               (setenv "XDG_RUNTIME_DIR" "/tmp")
+               (system "Xvfb :1 -ac -screen 0 640x480x24 &")
+               (setenv "DISPLAY" ":1")
+               (sleep 5) ;; Give Xvfb a few moments to get on it's feet
+               (system "openbox &")
+               (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest" "-E"
+                       "kwindowsystem-kwindowsystemplatformwaylandtest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "KDE access to the windowing system")
     (description "KWindowSystem provides information about and allows
@@ -1198,7 +1171,7 @@ lower level classes for interaction with the X Windowing System.")
 (define-public modemmanager-qt
   (package
     (name "modemmanager-qt")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1207,7 +1180,7 @@ lower level classes for interaction with the X Windowing System.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0ydq1l823jgp0yrrpqi1zdk5dsg65ydk1x082qwsa9a0vzs0np3x"))))
+                "1rbiqh1sj328cy7flz9pw6vbvgiy3vyv6xp3fk4xv91sxviz1mhd"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules dbus pkg-config))
@@ -1220,9 +1193,10 @@ lower level classes for interaction with the X Windowing System.")
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Qt wrapper for ModemManager DBus API")
     (description "ModemManagerQt provides access to all ModemManager features
@@ -1234,7 +1208,7 @@ messages.")
 (define-public networkmanager-qt
   (package
     (name "networkmanager-qt")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1243,7 +1217,7 @@ messages.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1h2kdw5vs7mn3n7bvqwm36a48ra9iap6384kanz14zjbankj04c1"))))
+                "1gyvgy0wl00asg9bkhjgvqnz32xmazvazcarh3p0640jy2fjrzfz"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules dbus pkg-config))
@@ -1257,9 +1231,10 @@ messages.")
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Qt wrapper for NetworkManager DBus API")
     (description "NetworkManagerQt provides access to all NetworkManager
@@ -1271,7 +1246,7 @@ which are used in DBus communication.")
 (define-public oxygen-icons
   (package
     (name "oxygen-icons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1280,7 +1255,7 @@ which are used in DBus communication.")
                     name "5" "-" version ".tar.xz"))
               (sha256
                (base32
-                "1rjsnz0g7zyzgii26sk370adb6jcyvr2lm8qi23fvqimifngqm2c"))))
+                "1f3fj6zr5iygb3s6f8vq2ayy749gxlx5j9h6v2zmkbf4m96sfmq5"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules fdupes))
@@ -1295,7 +1270,7 @@ which are used in DBus communication.")
 (define-public prison
   (package
     (name "prison")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -1303,7 +1278,7 @@ which are used in DBus communication.")
                            (version-major+minor version) "/"
                            name "-" version ".tar.xz"))
        (sha256
-        (base32 "1qflivvb593d2npc218xkdn3w5zvl7x8v1b52ydnggsxzbgkqvb4"))))
+        (base32 "1kzl8rbyj9ik83p1qb8jl32vr06vkzzvr1hpasj50sg3ajq8a9xs"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1318,14 +1293,14 @@ provides uniform access to generation of barcodes with data.")
 (define-public pulseaudio-qt
   (package
     (name "pulseaudio-qt")
-    (version "1.2")
+    (version "1.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/pulseaudio-qt"
                                   "/pulseaudio-qt-" version ".tar.xz"))
               (sha256
                (base32
-                "1i0ql68kxv9jxs24rsd3s7jhjid3f2fq56fj4wbp16zb4wd14099"))))
+                "1i4yb0v1mmhih8c2i61hybg6q60qys3pc5wbjb7a0vwl1mihgsxw"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -1345,7 +1320,7 @@ libpulse.")
 (define-public qqc2-desktop-style
   (package
     (name "qqc2-desktop-style")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1354,7 +1329,7 @@ libpulse.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1n47cl082zqdw6ykil04rw6bws4fn1m8wfx4vxv1aqj9warbdks3"))))
+                "0ff9vd34wss9na2m3gzm8wc2bwq0flda6bv6yqygv5iallw2lz88"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -1378,7 +1353,7 @@ feel.")
 (define-public solid
   (package
     (name "solid")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1387,15 +1362,16 @@ feel.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0alng7ciw6xji0s2zrk8dsx1p0p9shrrfzl8wnkwygc5chnhysz7"))))
+                "0j64glc1g7mwy2ysaj09w5f7sd2992h91ncknk9gpfsrxhpm814i"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest")))))))
     (native-inputs
      (list bison dbus extra-cmake-modules flex qttools-5))
     (inputs
@@ -1411,7 +1387,7 @@ system.")
 (define-public sonnet
   (package
     (name "sonnet")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1420,13 +1396,14 @@ system.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0b88h5fw1n8zyrg0vq3lj2jbjjyh0mk64lj6ab3643kxzqxbn30w"))))
+                "0i0gksdkfyl8hfbqgrgklqanbvfm3h9gjnv42p2qq40b0zjj0sh4"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config qttools-5))
     (inputs
      (list hunspell
            ;; TODO: hspell (for Hebrew), Voikko (for Finish)
+           qtdeclarative-5
            qtbase-5))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Multi-language spell checker")
@@ -1438,7 +1415,7 @@ ASpell and HUNSPELL.")
 (define-public threadweaver
   (package
     (name "threadweaver")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1447,7 +1424,7 @@ ASpell and HUNSPELL.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0y1q0wy073lf11g4jrp4bdw4kpj4ibqfscsxj6zlh8ban9zlf389"))))
+                "0ljjnbwmc2zz4q0q1njqny43cj6xdf976vrvijcsqdsril5wzdbq"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1468,7 +1445,7 @@ uses a job-based interface to queue tasks and execute them in an efficient way."
 (define-public kactivities
   (package
     (name "kactivities")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1477,7 +1454,7 @@ uses a job-based interface to queue tasks and execute them in an efficient way."
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1whsp0f87lrcn61s9rfhy0aj68hm6zgfa38mq6frlkcjksi0z1vn"))))
+                "0g16k3v6i20rc6h0js4pk00d6yg236bs0kxj88q21d5c934hbksk"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1513,7 +1490,7 @@ with other frameworks.")
 (define-public kauth
   (package
     (name "kauth")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1522,7 +1499,7 @@ with other frameworks.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0nmdz7ra3hpg0air4lfkzilv7cwx3zxs29k7sh8l3i1fs3qpjwxm"))))
+                "1hi36504bbr0266wl08kqiq61xysl3dw3kpgjfbgx169m0m3gmx9"))))
     (build-system cmake-build-system)
     (native-inputs
      (list dbus extra-cmake-modules qttools-5))
@@ -1543,9 +1520,10 @@ with other frameworks.")
                (("@KAUTH_HELPER_INSTALL_ABSOLUTE_DIR@")
                 "${KDE_INSTALL_LIBEXECDIR}"))))
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Execute actions as privileged user")
     (description "KAuth provides a convenient, system-integrated way to offload
@@ -1556,7 +1534,7 @@ utilities.")
 (define-public kcompletion
   (package
     (name "kcompletion")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1565,7 +1543,7 @@ utilities.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1pjgya8wi28jx63hcdi9v5f5487gzbkw2j1iganhd7bhcb8s7zpy"))))
+                "1jmrd2mfz27qfn6dq1mk6bcqlagmifbf9vnayi1mkqa9jsj4dwdj"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -1581,7 +1559,7 @@ integrated it into your application's other widgets.")
 (define-public kcontacts
   (package
     (name "kcontacts")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1590,7 +1568,7 @@ integrated it into your application's other widgets.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "182ma11z3kqxq3cwy7kwprfqkb9bcmn44w7k9vixbid4pv5wa0lb"))))
+                "075mw7clqf7qycngly21q3m0js3g8pcgqc2x3alp28f4zq3c8m21"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules xorg-server)) ; for the tests
@@ -1598,19 +1576,28 @@ integrated it into your application's other widgets.")
      (list qtbase-5))
     (propagated-inputs
      (list ;; As required by KF5ContactsConfig.cmake.
-           kcodecs kconfig kcoreaddons ki18n))
+          iso-codes kcodecs kconfig kcoreaddons qtdeclarative-5 ki18n))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'start-xorg-server
-           (lambda* (#:key inputs #:allow-other-keys)
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
              ;; The test suite requires a running X server.
              ;; Xvfb doesn't have proper glx support and needs a pixeldepth
              ;; of 24 bit to avoid "libGL error: failed to load driver: swrast"
              ;;                    "Could not initialize GLX"
-             (system "Xvfb :1 -screen 0 640x480x24 &")
-             (setenv "DISPLAY" ":1")
-             #t)))))
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (system "Xvfb :1 -screen 0 640x480x24 &")
+               (setenv "DISPLAY" ":1")
+               ;; testrounddrip fail inconsistently.
+               ;; addresstest produces wrong value:
+               ;;Actual   (address.formattedAddress(QStringLiteral("Jim Knopf"))):
+               ;;"Jim Knopf\nLummerlandstr. 1\n12345 Lummerstadt\n\nGERMANY"
+               ;;Expected (result)                                               :
+               ;;"Jim Knopf\nLummerlandstr. 1\n12345 Lummerstadt\n\nGERMANIA"
+               (invoke "ctest" "-E"
+			   "(kcontacts-addresstest|kcontacts-emailtest|kcontacts-phonenumbertest|kcontacts-soundtest|kcontacts-secrecytest|kcontacts-geotest|kcontacts-keytest|kcontacts-testroundtrip|kcontacts-impptest|kcontacts-birthdaytest|kcontacts-addresseetest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "API for contacts/address book data following the vCard standard")
     (description "This library provides a vCard data model, vCard
@@ -1622,7 +1609,7 @@ localized country name to ISO 3166-1 alpha 2 code mapping and vice verca.
 (define-public kcrash
   (package
     (name "kcrash")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1631,7 +1618,7 @@ localized country name to ISO 3166-1 alpha 2 code mapping and vice verca.
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "11sy9hrjpvybqi53qjrnncy9mzifrb3vqxi2d12ldjzqyqd8pirp"))))
+                "05sw3lh4lw5jgl7gvxvpyl6nims9j4b1hjsn365fa2p48qmsx6v5"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1646,7 +1633,7 @@ application crashes.")
 (define-public kdoctools
   (package
     (name "kdoctools")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1655,7 +1642,7 @@ application crashes.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0g0k83np2xaxk05spf14h5fvzy0n7kbcwx1sa9wjh570f6jx87am"))))
+                "04nk87dbmnf9840401s40mxlsfh9is1l1mqky9xi5mcghbp0308b"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1683,8 +1670,7 @@ application crashes.")
              (substitute* "cmake/FindDocBookXSL.cmake"
                (("^.*xml/docbook/stylesheet.*$")
                 (string-append "xml/xsl/docbook-xsl-"
-                               ,(package-version docbook-xsl) "\n")))
-             #t))
+                               ,(package-version docbook-xsl) "\n")))))
          (add-after 'install 'add-symlinks
            ;; Some package(s) (e.g. kdelibs4support) refer to this locale by a
            ;; different spelling.
@@ -1692,8 +1678,7 @@ application crashes.")
              (let ((xsl (string-append (assoc-ref outputs "out")
                                        "/share/kf5/kdoctools/customization/xsl/")))
                (symlink (string-append xsl "pt_br.xml")
-                        (string-append xsl "pt-BR.xml")))
-             #t)))))
+                        (string-append xsl "pt-BR.xml"))))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Create documentation from DocBook")
     (description "Provides tools to generate documentation in various format
@@ -1703,7 +1688,7 @@ from DocBook files.")
 (define-public kfilemetadata
   (package
     (name "kfilemetadata")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1712,25 +1697,19 @@ from DocBook files.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "18n1a5857090a1c1rxzd07sxs652gl6wr3n99sp8rxmvkghn9zsj"))))
+                "0sh3malq6007fp5m4hica20ha8z5abqzq5ifcmrpm8zqmm5aa2bq"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'disable-failing-test
-           (lambda _
-             ;; Blacklist a failing test-function. FIXME: Make it pass.
-             ;; UserMetaDataWriterTest fails with getxattr("…/writertest.txt")
-             ;; -> EOPNOTSUPP (Operation not supported)
-             (with-output-to-file "autotests/BLACKLIST"
-               (lambda _
-                 (display "[testMimetype]\n*\n")
-                 (display "[test]\n*\n")))
-             #t)))))
-    (native-inputs
-     `(("extra-cmake-modules" ,extra-cmake-modules)
-       ("pkg-config" ,pkg-config)
-       ("python-2" ,python-2)))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               ;; FIXME: Test can't find audio/x-speex mimeinfo
+               ;; (but it can find audio/x-speex+ogg).
+               (invoke "ctest" "-E"
+			   "(usermetadatawritertest|embeddedimagedatatest|taglibextractortest)")))))))
+    (native-inputs (list extra-cmake-modules pkg-config))
     (inputs
      (list attr
            ;; TODO: EPub http://sourceforge.net/projects/ebook-tools
@@ -1757,7 +1736,7 @@ by applications to write metadata.")
 (define-public kimageformats
   (package
     (name "kimageformats")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1766,7 +1745,7 @@ by applications to write metadata.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0pk4b725wapzdxv1mm6ddqcl6z8ffcpr32i5vrhrin8awi5gx13s"))))
+                "0dbl2varirp5f1bd8173jlhmkc3ql16yg0d6w04nc56hy973bkm5"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -1790,8 +1769,7 @@ by applications to write metadata.")
              (setenv "QT_QPA_PLATFORM" "offscreen")
              (setenv "QT_PLUGIN_PATH"
                      (string-append (getcwd) "/bin:"
-                                    (getenv "QT_PLUGIN_PATH")))
-             #t)))
+                                    (getenv "QT_PLUGIN_PATH"))))))
        ;; FIXME: The header files of ilmbase (propagated by openexr) are not
        ;; found when included by the header files of openexr, and an explicit
        ;; flag needs to be set.
@@ -1810,7 +1788,7 @@ formats.")
 (define-public kjobwidgets
   (package
     (name "kjobwidgets")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1819,7 +1797,7 @@ formats.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "13kdczzyyh17hf6vlhh4li5bn4yq5bab5xa8mm63r9rynxihgclf"))))
+                "1w1h9vnlq1j72812558cl5dlq7f80nnh5i30qmkpbvv49xhhq2dl"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -1834,7 +1812,7 @@ asynchronous jobs.")
 (define-public knotifications
   (package
     (name "knotifications")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1843,7 +1821,7 @@ asynchronous jobs.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "01bn23xw2n53h9nl99lm3cjnqs8s66bmwkzf6fkpg9rzkykizbyc"))))
+                "11fbqylchzvm0pfw8bvy03px5zcg4jbch39vzcvnl6si7vikm4qj"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules dbus qttools-5))
@@ -1852,23 +1830,22 @@ asynchronous jobs.")
            kconfig
            kcoreaddons
            kwindowsystem
+           libcanberra
+           libdbusmenu-qt
            phonon
+           qtdeclarative-5
            qtbase-5
            qtspeech
-           ;; TODO: Think about adding dbusmenu-qt5 from
-           ;; https://launchpad.net/libdbusmenu-qt
            qtx11extras))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             #t))
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Desktop notifications")
     (description "KNotification is used to notify the user of an event.  It
@@ -1878,7 +1855,7 @@ covers feedback and persistent events.")
 (define-public kpackage
   (package
     (name "kpackage")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1887,11 +1864,7 @@ covers feedback and persistent events.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "03rp7p7i8ihz5wg58gjs638jk7xbszknfiy2j3r979snc57g95mv"))
-              ;; Default to: external paths/symlinks can be followed by a
-              ;; package
-              (patches (search-patches "kpackage-allow-external-paths.patch"
-                                       "kpackage-fix-KF5PackageMacros.cmake.patch"))))
+                "0gsxizpqa47apbvchga3f0w86v4jh8z1vyf0kifipz17fay4ws8d"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1907,14 +1880,14 @@ covers feedback and persistent events.")
        (modify-phases %standard-phases
          (add-after 'unpack 'patch
            (lambda _
+             (substitute* "src/kpackage/package.cpp"
+               (("externalPaths.false.") "externalPaths(true)"))
              ;; Make QDirIterator follow symlinks
-             (substitute* '("src/kpackage/packageloader.cpp"
-                            "src/kpackage/private/packagejobthread.cpp")
+             (substitute* '("src/kpackage/packageloader.cpp")
                (("^\\s*(const QDirIterator::IteratorFlags flags = QDirIterator::Subdirectories)(;)" _ a b)
                 (string-append a " | QDirIterator::FollowSymlinks" b))
                (("^\\s*(QDirIterator it\\(.*, QDirIterator::Subdirectories)(\\);)" _ a b)
-                (string-append a " | QDirIterator::FollowSymlinks" b)))
-             #t))
+                (string-append a " | QDirIterator::FollowSymlinks" b)))))
          (add-after 'unpack 'patch-tests
            (lambda _
              ;; /bin/ls doesn't exist in the build-container use /etc/passwd
@@ -1924,12 +1897,10 @@ covers feedback and persistent events.")
                 (string-append a "etc" b "etc" c "etc\""))
                (("filePath\\(\"bin\", QStringLiteral\\(\"ls\"))")
                 "filePath(\"etc\", QStringLiteral(\"passwd\"))")
-               (("\"/bin/ls\"") "\"/etc/passwd\""))
-             #t))
+               (("\"/bin/ls\"") "\"/etc/passwd\""))))
          (add-before 'check 'check-setup
            (lambda _
-             (setenv "HOME" (getcwd))
-             #t)))))
+             (setenv "HOME" (getcwd)))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Installation and loading of additional content as packages")
     (description "The Package framework lets the user install and load packages
@@ -1940,7 +1911,7 @@ were traditional plugins.")
 (define-public kpty
   (package
     (name "kpty")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1949,7 +1920,7 @@ were traditional plugins.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1hp6iilr2asf2269linfazjv4yjg7rsi8wydxx53yyr99r0bgmah"))))
+                "15swvv6qhvc654wyvxzbjbnzrd2vwn0mr4lby1x6x5f4c9br0cip"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1964,8 +1935,7 @@ were traditional plugins.")
          (add-after 'unpack 'patch-tests
            (lambda _
              (substitute* "autotests/kptyprocesstest.cpp"
-               (("/bin/bash") (which "bash")))
-             #t)))))
+               (("/bin/bash") (which "bash"))))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Interfacing with pseudo terminal devices")
     (description "This library provides primitives to interface with pseudo
@@ -1976,7 +1946,7 @@ and communicating with them using a pty.")
 (define-public kunitconversion
   (package
     (name "kunitconversion")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1985,18 +1955,9 @@ and communicating with them using a pty.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0sp4gfzpf40cdi0xnff9sn7b75z88j0589svz4rv77q5m137cgnn"))))
+                "1qls3319gwn1nzaq04wrqjhbchk0s0pfx97m4za63yzvapvym73g"))))
     (build-system cmake-build-system)
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'disable-a-failing-test-case
-           (lambda _
-             ;; FIXME: Re-enable this test-case. It was committed with the
-             ;; message: "tsan says it's clean, apart from issues in Qt
-             ;; (reported upstream)"
-             (substitute* "autotests/convertertest.cpp"
-               (("const int numThreads = 2") "const int numThreads = 0")))))))
+    (arguments `(#:tests? #f)) ;; Requires network.
     (native-inputs
      (list extra-cmake-modules))
     (inputs
@@ -2012,7 +1973,7 @@ gallons).")
 (define-public syndication
   (package
     (name "syndication")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2021,7 +1982,7 @@ gallons).")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1n3x8s1z4kd30xirfr07hi87vwhk4rilb5kslcjcgp5n9c0imcpv"))))
+                "1q60dznlkbncqqgjnp3lq3x0f6r7wvz141ajkymmxlgfq3wdpcd4"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -2044,7 +2005,7 @@ between feed formats.")
 (define-public baloo
   (package
     (name "baloo")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2053,7 +2014,7 @@ between feed formats.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1cf5pp9hn3pqypwyzh63ksasap3n7qz6n3y2xgb83ss3fra90pjf"))))
+                "1icpxmmxhvgdr6zxpz0wybc82nyy595cmr09067i82kh7v5dj66l"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kcoreaddons kfilemetadata))
@@ -2080,17 +2041,6 @@ between feed formats.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             (with-output-to-file "bin/BLACKLIST"
-               (lambda _
-                 ;; Blacklist some failing tests. FIXME: Make them pass.
-                 (display "[testRenameFile]\n*\n")
-                 (display "[testMoveFile]\n*\n")))
-             #t))
          (add-after 'unpack 'remove-failing-test
            (lambda _
              ;; FIXME: kinotifytest broke in 5.70.0 with commit 73183acf00 and
@@ -2100,12 +2050,13 @@ between feed formats.")
              (substitute* "autotests/unit/file/CMakeLists.txt"
                ;; The test only runs on GNU/Linux, piggy-back on the check.
                (("CMAKE_SYSTEM_NAME MATCHES \"Linux\"" all)
-                (string-append all " AND NOT TRUE")))
-             #t))
+                (string-append all " AND NOT TRUE")))))
          (replace 'check
-           (lambda _
-             (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (setenv "HOME" (getcwd))
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "File searching and indexing")
     (description "Baloo provides file searching and indexing.  It does so by
@@ -2116,7 +2067,7 @@ maintaining an index of the contents of your files.")
 (define-public kactivities-stats
   (package
     (name "kactivities-stats")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2125,7 +2076,7 @@ maintaining an index of the contents of your files.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1cnfdnxkw9hwbqdzdygp2vzwxqwqhxyipzwdcgar0clgnf7zi7wx"))))
+                "0lfanv55b7zx5s0a7gh4r41w9yb641j1zjjcvdjfrj7pdh52576s"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -2142,7 +2093,7 @@ by which applications, and what documents have been linked to which activity.")
 (define-public kbookmarks
   (package
     (name "kbookmarks")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2151,7 +2102,7 @@ by which applications, and what documents have been linked to which activity.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1i5vcyvyc9whmflbcg2kc562ch93yscfic1c1n9z347g26jmgras"))))
+                "131yng8wmxrnf3x1i6gg60q3rrya19yk4jnzi5ylafvaw7q2r8b4"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kwidgetsaddons))
@@ -2173,8 +2124,7 @@ by which applications, and what documents have been linked to which activity.")
            (lambda _
              (setenv "HOME" (getcwd))
              ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Bookmarks management library")
     (description "KBookmarks lets you access and manipulate bookmarks stored
@@ -2184,7 +2134,7 @@ using the XBEL format.")
 (define-public kcmutils
   (package
     (name "kcmutils")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2193,7 +2143,7 @@ using the XBEL format.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "08f4yr546brl1dppp0khvsw9ihmh9a7rp505913pdhi0sklaiimz"))))
+                "0vff93kja9dq8rf1aapxpfgjxsinm75f5nydxqcihskp8girz0c8"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kconfigwidgets kservice))
@@ -2211,8 +2161,10 @@ using the XBEL format.")
              (substitute* "src/kcmoduleloader.cpp"
                ;; print plugin name when loading fails
                (("^\\s*(qWarning\\(\\) << \"Error loading) (plugin:\")( << loader\\.errorString\\(\\);)" _ a b c)
-                (string-append a " KCM plugin\" << mod.service()->library() << \":\"" c)))
-             #t)))))
+                (string-append a " KCM plugin\" << mod.service()->library() << \":\"" c)))))
+         (add-before 'check 'check-setup
+           (lambda _
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (inputs
      (list kauth
            kcodecs
@@ -2237,7 +2189,7 @@ KCModules can be created with the KConfigWidgets framework.")
 (define-public kconfigwidgets
   (package
     (name "kconfigwidgets")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2246,12 +2198,12 @@ KCModules can be created with the KConfigWidgets framework.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "195dw7nyr3fp78y3vfnyjh0hwgwk46f80wdcm8dck5rkscl3v9xz"))))
+                "045j6gkp5sf1lc12zwlkr1dz0fd89yrg5b31j4ybk3dyc8jz90hl"))))
     (build-system qt-build-system)
     (propagated-inputs
      (list kauth kcodecs kconfig kwidgetsaddons))
     (native-inputs
-     (list extra-cmake-modules kdoctools))
+     (list extra-cmake-modules kdoctools qttools-5))
     (inputs
      (list kcoreaddons
            kguiaddons
@@ -2268,7 +2220,12 @@ KCModules can be created with the KConfigWidgets framework.")
                ;; make QDirIterator follow symlinks
                (("^\\s*(QDirIterator it\\(.*, QDirIterator::Subdirectories)(\\);)" _ a b)
                 (string-append a " | QDirIterator::FollowSymlinks" b)))
-             #t)))))
+             (substitute* "CMakeLists.txt"
+               (("5\\.90\\.0") "5.96.0"))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "ctest" "-E" "kstandardactiontest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Widgets for configuration dialogs")
     (description "KConfigWidgets provides easy-to-use classes to create
@@ -2280,7 +2237,7 @@ their settings.")
 (define-public kdeclarative
   (package
     (name "kdeclarative")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2289,30 +2246,25 @@ their settings.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1vq9pkrb0zsphi2sfx7cyy1kb6pklzjkmqdf5202z8vydlkc4549"))))
+                "1x4r231g0l5im4ala21m5fz5q6nixbx0z6lfia5zjinzlp7x5534"))))
     (build-system cmake-build-system)
     (propagated-inputs
-     (list kconfig kpackage))
+     (list kconfig kpackage qtdeclarative-5))
     (native-inputs
-     (list extra-cmake-modules pkg-config xorg-server-for-tests))
+     (list dbus extra-cmake-modules pkg-config xorg-server-for-tests))
     (inputs
      (list kauth
-           kbookmarks
-           kcodecs
-           kcompletion
-           kconfigwidgets
            kcoreaddons
            kglobalaccel
            kguiaddons
            kiconthemes
            kio
-           kitemviews
            ki18n
            kjobwidgets
+           knotifications
            kservice
            kwidgetsaddons
            kwindowsystem
-           kxmlgui
            libepoxy
            qtbase-5
            qtdeclarative-5
@@ -2325,8 +2277,17 @@ their settings.")
              ;; The test suite requires a running X server, setting
              ;; QT_QPA_PLATFORM=offscreen does not suffice.
              (system "Xvfb :1 -screen 0 640x480x24 &")
-             (setenv "DISPLAY" ":1")
-             #t)))))
+             (setenv "DISPLAY" ":1")))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "XDG_RUNTIME_DIR" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest"
+                       "-E" ; FIXME: test fails.
+                       "fullmodelaccesstest")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Integration of QML and KDE work spaces")
     (description "KDeclarative provides integration of QML and KDE work spaces.
@@ -2339,7 +2300,7 @@ that offer bindings to some of the Frameworks.")
 (define-public kded
   (package
     (name "kded")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2348,17 +2309,16 @@ that offer bindings to some of the Frameworks.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0zqd33vy4ny7g9as3bhd75qi1chz1nlqq133pgw8kjanvghwwnk9"))))
+                "0x40yvcx2gjb4pngyk2vfrn3z7dbyvksbj1h3ck04fyyma8z3gb3"))))
     (build-system cmake-build-system)
     (native-inputs
-     (list extra-cmake-modules))
+     (list extra-cmake-modules kdoctools))
     (inputs
      (list kconfig
            kcoreaddons
            kcrash
            kdbusaddons
            kdoctools
-           kinit
            kservice
            qtbase-5))
     (home-page "https://community.kde.org/Frameworks")
@@ -2372,7 +2332,7 @@ started on demand.")
 (define-public kdesignerplugin
   (package
     (name "kdesignerplugin")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2381,28 +2341,15 @@ started on demand.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0dr6gcag2yzx8fvxis4x403jrcisywds95cywmiyz3pb5727cak2"))))
+                "0cddad1rdi06l28iiwizfds78dplbvv7j40vphww0ix7cmsh3rh9"))))
     (build-system qt-build-system)
     (native-inputs
-     (list extra-cmake-modules qttools-5))
+     (list extra-cmake-modules kdoctools qttools-5))
     (inputs
      (list kconfig
            kcoreaddons
            kdoctools
-           qtbase-5
-           ;; optional:
-           kcompletion
-           kconfigwidgets
-           kiconthemes
-           kitemviews
-           kio
-           kplotting
-           ktextwidgets
-           kdewebkit
-           kwidgetsaddons
-           kxmlgui
-           qtwebkit
-           sonnet))
+           qtbase-5))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Integrating KDE frameworks widgets with Qt Designer")
     (description "This framework provides plugins for Qt Designer that allow it
@@ -2414,7 +2361,7 @@ ini-style description files.")
 (define-public kdesu
   (package
     (name "kdesu")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2423,7 +2370,7 @@ ini-style description files.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "17k29g7jwgqj5xdmr509438b9sq65zx8khdr4viybjf5xpi0cf5m"))))
+                "1wjjjwpfjr7sx10x0236zqjx3jrw6mz60724s5qg269dwfbpahvj"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kpty))
@@ -2441,7 +2388,7 @@ with su and ssh respectively.")
 (define-public kdewebkit
   (package
     (name "kdewebkit")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2450,7 +2397,7 @@ with su and ssh respectively.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0y9ja3znkvzdbjfs91dwr4cmvl9fk97zpz2lkf0f9zhm2nw6q008"))))
+                "0l8nnar4s84igxih5w0fhwd9nvccp7zm53jy2gk6lfbj6gqarfbf"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -2473,7 +2420,7 @@ engine WebKit via QtWebKit.")
 (define-public kemoticons
   (package
     (name "kemoticons")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2482,7 +2429,7 @@ engine WebKit via QtWebKit.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "11v1srn3nii4j7cn4f19qvdw96pczwxhanzxlg4a9gf8kmnp5gxr"))))
+                "03b5axwvd6ayw1kbl1jv6h04cihp1y1pa835gs3m1qx2ivgj7f75"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kservice))
@@ -2497,8 +2444,7 @@ engine WebKit via QtWebKit.")
            (lambda _
              (setenv "HOME" (getcwd))
              ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Convert text emoticons to graphical emoticons")
     (description "KEmoticons converts emoticons from text to a graphical
@@ -2510,7 +2456,7 @@ emoticons coming from different providers.")
 (define-public kglobalaccel
   (package
     (name "kglobalaccel")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2519,7 +2465,7 @@ emoticons coming from different providers.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0hmqigc8myiwwh7m6y2cm4vn0d3kmrhia179hyb84vpvvn3lm93z"))))
+                "1sx4fmy8xy22im0i3dw0xdmxrgw2jhnk2wsfy2xw74dsj3adg2iq"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config qttools-5))
@@ -2528,11 +2474,10 @@ emoticons coming from different providers.")
            kcrash
            kcoreaddons
            kdbusaddons
-           kservice
            kwindowsystem
-           libxcb
            qtbase-5
            qtx11extras
+           qtdeclarative-5
            xcb-util-keysyms))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Global desktop keyboard shortcuts")
@@ -2544,7 +2489,7 @@ window does not need focus for them to be activated.")
 (define-public kiconthemes
   (package
     (name "kiconthemes")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2553,7 +2498,7 @@ window does not need focus for them to be activated.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "09bqpf3drqyfc81vgab9bsh1wm5qbzdwqjlczhax38660nnvh0r9"))))
+                "0w9m956xfpfxp7a63a5v2y10lb9zp2gqfjyfvq3ksxfl961g4hsg"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5 shared-mime-info))
@@ -2579,8 +2524,7 @@ window does not need focus for them to be activated.")
                                     "/share"))
              (setenv "HOME" (getcwd))
              ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Icon GUI utilities")
     (description "This library contains classes to improve the handling of icons
@@ -2590,7 +2534,7 @@ in applications using the KDE Frameworks.")
 (define-public kinit
   (package
     (name "kinit")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2599,11 +2543,10 @@ in applications using the KDE Frameworks.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1x4whs8p1daxjfp4ksf70rxrv7fx3w17s5wh6446039wzz9bv6ki"))
+                "1y7x80icm2jv9c8917481w1hs1vm2rvvvnc9drw4q7vrjzfx73dq"))
               ;; Use the store paths for other packages and dynamically loaded
               ;; libs
-              (patches (search-patches "kinit-kdeinit-extra_libs.patch"
-                                       "kinit-kdeinit-libpath.patch"))))
+              (patches (search-patches "kinit-kdeinit-extra_libs.patch"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
@@ -2614,8 +2557,7 @@ in applications using the KDE Frameworks.")
              (substitute* "src/kdeinit/kinit.cpp"
                (("GUIX_PKGS_KF5_KIO") (assoc-ref inputs "kio"))
                (("GUIX_PKGS_KF5_PARTS") (assoc-ref inputs "kparts"))
-               (("GUIX_PKGS_KF5_PLASMA") (assoc-ref inputs "plasma-framework")))
-             #t)))))
+               (("GUIX_PKGS_KF5_PLASMA") (assoc-ref inputs "plasma-framework"))))))))
     (native-search-paths
      (list (search-path-specification
             (variable "KDEINIT5_LIBRARY_PATH")
@@ -2659,7 +2601,7 @@ consumption.")
 (define-public kio
   (package
     (name "kio")
-    (version "5.70.1")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2668,7 +2610,7 @@ consumption.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1f33jdjjx6k1d5fab35x8xakc4ny9fyfrgkbib60xncc82lz2h5l"))
+                "0xmvgq7cp1kkicmngxjj4cmijaah91jmfqdzzxziphq1rl23k64m"))
               (patches (search-patches "kio-search-smbd-on-PATH.patch"))))
     (build-system cmake-build-system)
     (propagated-inputs
@@ -2683,47 +2625,69 @@ consumption.")
            kxmlgui
            solid))
     (native-inputs
-     (list dbus qttools-5 extra-cmake-modules))
-    (inputs
-     `(;; TODO:  LibACL , <ftp://oss.sgi.com/projects/xfs/cmd_tars>
-       ("krb5" ,mit-krb5)
-       ("karchive" ,karchive)
-       ("kauth" ,kauth)
-       ("kcodecs" ,kcodecs)
-       ("kconfigwidgets" ,kconfigwidgets)
-       ("kcrash" ,kcrash)
-       ("kdbusaddons" ,kdbusaddons)
-       ("kdoctools" ,kdoctools)
-       ("kiconthemes" ,kiconthemes)
-       ("ki18n" ,ki18n)
-       ("knotifications" ,knotifications)
-       ("ktextwidgets" ,ktextwidgets)
-       ("kwallet" ,kwallet)
-       ("kwidgetsaddons" ,kwidgetsaddons)
-       ("libxml2" ,libxml2)
-       ("libxslt" ,libxslt)
-       ("qtbase" ,qtbase-5)
-       ("qtscript" ,qtscript)
-       ("qtx11extras" ,qtx11extras)
-       ("sonnet" ,sonnet)))
+     (list extra-cmake-modules dbus kdoctools qttools-5))
+    (inputs (list ;; TODO:  LibACL , <ftp://oss.sgi.com/projects/xfs/cmd_tars>
+                  mit-krb5
+                  karchive
+                  kauth
+                  kcodecs
+                  kconfigwidgets
+                  kcrash
+                  kdbusaddons
+                  kguiaddons
+                  kiconthemes
+                  ki18n
+                  knotifications
+                  ktextwidgets
+                  kwallet
+                  kwidgetsaddons
+                  libxml2
+                  libxslt
+                  qtbase-5
+                  qtscript
+                  qtx11extras
+                  sonnet
+                  `(,util-linux "lib") ; libmount
+                  zlib))
     (arguments
-     `(#:tests? #f ; FIXME: 41/50 tests fail.
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'patch
            (lambda _
              ;; Better error message (taken from NixOS)
              (substitute* "src/kiod/kiod_main.cpp"
                (("(^\\s*qCWarning(KIOD_CATEGORY) << \"Error loading plugin:\")( << loader.errorString();)" _ a b)
-                (string-append a "<< name" b)))
-             #t))
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             (setenv "XDG_RUNTIME_DIR" (getcwd))
-             ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t))
+                (string-append a "<< name" b)))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "XDG_RUNTIME_DIR" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               (setenv "DBUS_FATAL_WARNINGS" "0")
+               (invoke "dbus-launch" "ctest"
+                       "-E" ; FIXME: 21/67 tests fail.
+                       (string-append "(kiocore-jobtest"
+                                      "|fileitemtest"
+                                      "|kiocore-kmountpointtest"
+                                      "|kiocore-ktcpsockettest"
+                                      "|kiocore-mimetypefinderjobtest"
+                                      "|kiocore-krecentdocumenttest"
+                                      "|kiocore-http_jobtest"
+                                      "|kiogui-openurljobtest"
+                                      "|kiocore-threadtest"
+                                      "|applicationlauncherjob_forkingtest"
+                                      "|applicationlauncherjob_scopetest"
+                                      "|applicationlauncherjob_servicetest"
+                                      "|commandlauncherjob_forkingtest"
+                                      "|commandlauncherjob_scopetest"
+                                      "|commandlauncherjob_servicetest"
+                                      "|kiowidgets-kdirlistertest"
+                                      "|kiowidgets-kdirmodeltest"
+                                      "|kiowidgets-kfileitemactionstest"
+                                      "|kiowidgets-kurifiltertest-colon-separator"
+                                      "|kiowidgets-kurifiltertest-space-separator"
+                                      "|kiofilewidgets-knewfilemenutest)")))))
          (add-after 'install 'add-symlinks
            ;; Some package(s) (e.g. bluedevil) refer to these service types by
            ;; the wrong name.  I would prefer to patch those packages, but I
@@ -2733,10 +2697,6 @@ consumption.")
                                         "/share/kservicetypes5/")))
                (symlink (string-append kst5 "kfileitemactionplugin.desktop")
                         (string-append kst5 "kfileitemaction-plugin.desktop"))))))))
-    ;;(replace 'check
-    ;;  (lambda _
-    ;;    (setenv "DBUS_FATAL_WARNINGS" "0")
-    ;;    (zero? (system* "dbus-launch" "ctest" ".")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Network transparent access to files and data")
     (description "This framework implements a lot of file management functions.
@@ -2751,7 +2711,7 @@ KIO enabled infrastructure.")
 (define-public knewstuff
   (package
     (name "knewstuff")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2760,7 +2720,7 @@ KIO enabled infrastructure.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1hpxj4nawh57w8l64gjplb5mk5fpxiffm4x49kg75m637rxy19fq"))))
+                "0kls40wlqkqirfjhf8kn83saxwahlh4rkm7iypqd81h93gi81fgc"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list attica kservice kxmlgui))
@@ -2780,6 +2740,7 @@ KIO enabled infrastructure.")
            ki18n
            kiconthemes
            kjobwidgets
+           kpackage
            ktextwidgets
            kwidgetsaddons
            qtbase-5
@@ -2793,8 +2754,7 @@ KIO enabled infrastructure.")
            (lambda _ ; XDG_DATA_DIRS isn't set
              (setenv "HOME" (getcwd))
              ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Framework for downloading and sharing additional application data")
     (description "The KNewStuff library implements collaborative data sharing
@@ -2805,7 +2765,7 @@ specification.")
 (define-public knotifyconfig
   (package
     (name "knotifyconfig")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2814,7 +2774,7 @@ specification.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1d483qrgyamwsqvcl70klv1g8744hn8z1h2j3qfydcvlwz8jy0gj"))))
+                "09bcw47zp6rsnk7f83gkmlpylg428a7phn7bbi9mpkdpzc6zvfd2"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -2847,7 +2807,7 @@ notifications which can be embedded in your application.")
 (define-public kparts
   (package
     (name "kparts")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2856,7 +2816,7 @@ notifications which can be embedded in your application.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1gfaxr856zrsjxzdxw1sj12s6aib6r703jgf7yvsl8kilg8l2gsk"))))
+                "0b68kyi7l3ndw798sll2hrzf6qq6w875n48sc11q6882xilzinh2"))))
     (build-system qt-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
@@ -2866,8 +2826,7 @@ notifications which can be embedded in your application.")
                         ;; XXX: PartLoaderTest wants to create a .desktop file
                         ;; in the common locations and test that MIME types work.
                         ;; The setup required for this is extensive, skip for now.
-                        (("partloadertest\\.cpp") ""))
-                      #t)))))
+                        (("partloadertest\\.cpp") "")))))))
     (propagated-inputs
      (list kio ktextwidgets kxmlgui))
     (native-inputs
@@ -2898,7 +2857,7 @@ widgets with a user-interface defined in terms of actions.")
 (define-public kpeople
   (package
     (name "kpeople")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2907,7 +2866,7 @@ widgets with a user-interface defined in terms of actions.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1dhvly19pj9lx78g7mc89scibzmra1vhv4zz33222zidkbrf9ryl"))))
+                "0q3c0ghxa9km5xcq6h0cwa7swfd18h491jpfafy4qgq3nwp0115b"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -2934,7 +2893,7 @@ to easily extend the contacts collection.")
 (define-public krunner
   (package
     (name "krunner")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2943,7 +2902,7 @@ to easily extend the contacts collection.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0fhb26vi9z1mky79kq12qq4g4ghz3530cx84n5l3sdgkd6nfsyqf"))))
+                "0wd2nmhw9mb09mm88cnkmirwgxdnvkrkyjvaiqh9k74xqsggnplk"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list plasma-framework))
@@ -2984,20 +2943,15 @@ to easily extend the contacts collection.")
                (("//usr/bin\"") (string-append (getcwd) "\"")) ;; multiple path-parts
                (("/bin/ls")
                 (search-input-file inputs "/bin/ls")))))
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             ;; Blacklist some failing test-functions. FIXME: Make them pass.
-             (with-output-to-file "bin/BLACKLIST"
-               (lambda _
-                 (display "[testMatch]\n*\n")
-                 (display "[testMulti]\n*\n")))
-             #t))
          (replace 'check
-           (lambda _
-             (invoke "dbus-launch" "ctest" "."))))))
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               (invoke "dbus-launch" "ctest"
+                       "-E" ;; Some tests fail
+                       "(runnercontexttest|dbusrunnertest|\
+runnermanagersinglerunnermodetest|runnermanagertest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Framework for Plasma runners")
     (description "The Plasma workspace provides an application called KRunner
@@ -3009,7 +2963,7 @@ typed.")
 (define-public kservice
   (package
     (name "kservice")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3018,17 +2972,16 @@ typed.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0g49p5331f7dl46rvi43akmjm1jx70w9797j6d17jy7z9s9sqikw"))))
+                "1zg3a35my8ba5ikmlg9s3wc9r0s5a2x0rggiiv9znhfi3snvi6gd"))))
     (build-system cmake-build-system)
     (propagated-inputs
-     (list kconfig kcoreaddons))
+     (list kconfig kcoreaddons kdoctools))
     (native-inputs
-     (list bison extra-cmake-modules flex))
+     (list bison extra-cmake-modules flex shared-mime-info))
     (inputs
      (list kcrash kdbusaddons kdoctools ki18n qtbase-5))
     (arguments
-     `(#:tests? #f ; FIXME: 6/10 tests fail.
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'patch
            ;; Adopted from NixOS' patches "qdiriterator-follow-symlinks" and
@@ -3042,14 +2995,14 @@ typed.")
                ;; Normalize path, but don't resolve symlinks (taken from
                ;; NixOS)
                (("^\\s*QString resolved = QDir\\(dir\\)\\.canonicalPath\\(\\);")
-                "QString resolved = QDir::cleanPath(dir);"))
-             #t))
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+                "QString resolved = QDir::cleanPath(dir);"))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               ;; Disable failing tests.
+               (invoke "ctest" "-E" "(kautostarttest|ksycocatest)")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Plugin framework for desktop services")
     (description "KService provides a plugin framework for handling desktop
@@ -3061,7 +3014,7 @@ types or handled by application specific code.")
 (define-public ktexteditor
   (package
     (name "ktexteditor")
-    (version "5.70.1")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3070,10 +3023,11 @@ types or handled by application specific code.")
                     "ktexteditor-" version ".tar.xz"))
               (sha256
                (base32
-                "0k10yj1ia1w1mznj4g5nvp65p226zcvgwxc85ycn2w8lbkknidf7"))))
+                "071jx26ycyk31bh167cq5fwx8xkr4ldjg8zlhn9dh7wa3rjpp183"))))
     (build-system cmake-build-system)
     (propagated-inputs
-     (list kparts))
+     (list kparts
+           ksyntaxhighlighting))
     (native-inputs
      (list extra-cmake-modules pkg-config))
     (inputs
@@ -3093,7 +3047,6 @@ types or handled by application specific code.")
            ki18n
            kjobwidgets
            kservice
-           ksyntaxhighlighting
            ktextwidgets
            kwidgetsaddons
            kxmlgui
@@ -3106,20 +3059,17 @@ types or handled by application specific code.")
            solid
            sonnet))
     (arguments
-     `(#:tests? #f ; FIXME: 2/54 tests fail: Cannot find fontdirectory qtbase/lib/font
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'setup
            (lambda* (#:key inputs #:allow-other-keys)
              (setenv "XDG_DATA_DIRS" ; FIXME build phase doesn't find parts.desktop
-                     (string-append (assoc-ref inputs "kparts") "/share"))
-             #t))
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t))
+                     (string-append (assoc-ref inputs "kparts") "/share"))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests? ;; Maybe locale issues with tests?
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               (invoke "ctest" "-E" "(completion_test|kateview_test|movingrange_test)"))))
          (add-after 'install 'add-symlinks
            ;; Some package(s) (e.g. plasma-sdk) refer to these service types
            ;; by the wrong name.  I would prefer to patch those packages, but
@@ -3128,8 +3078,7 @@ types or handled by application specific code.")
              (let ((kst5 (string-append (assoc-ref outputs "out")
                                         "/share/kservicetypes5/")))
                (symlink (string-append kst5 "ktexteditorplugin.desktop")
-                        (string-append kst5 "ktexteditor-plugin.desktop"))
-               #t))))))
+                        (string-append kst5 "ktexteditor-plugin.desktop"))))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Full text editor component")
     (description "KTextEditor provides a powerful text editor component that you
@@ -3141,7 +3090,7 @@ library.")
 (define-public ktextwidgets
   (package
     (name "ktextwidgets")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3150,7 +3099,7 @@ library.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1609rlwba674kr9whawk93vb1b14b5ly7wvir7kjyjp4j715f47w"))))
+                "1vab4qmqq9268bwzx6xia2bcz8rdmiwlgjkbkk8nci2pnmhjrzpj"))))
     (build-system qt-build-system)
     (propagated-inputs
      (list ki18n sonnet))
@@ -3179,7 +3128,7 @@ It supports rich text as well as plain text.")
 (define-public kwallet
   (package
     (name "kwallet")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3188,10 +3137,10 @@ It supports rich text as well as plain text.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1ps6ywcirv7xcisvwfcpvk53wm7m8y5lrz4nhkm36rizrdglw19r"))))
+                "0rj610c7i66fbv1x0i0sfn9mac8fkqir4vwgaq1ad5i9ca36h1jq"))))
     (build-system cmake-build-system)
     (native-inputs
-     (list extra-cmake-modules))
+     (list extra-cmake-modules kdoctools))
     (inputs
      (list gpgme
            kauth
@@ -3221,7 +3170,7 @@ the passwords on KDE work spaces.")
 (define-public kxmlgui
   (package
     (name "kxmlgui")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3230,7 +3179,7 @@ the passwords on KDE work spaces.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0cvzcq2dcz89c0ffhvfb820hfmqa87mfdbjvrqjwdysc9lr8zx8f"))))
+                "1hiz2fgwpc4mgh2zzir0qi18pjsc3052lf888rc1pgql90faxb1k"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kconfig kconfigwidgets))
@@ -3242,6 +3191,7 @@ the passwords on KDE work spaces.")
            kcodecs
            kcoreaddons
            kglobalaccel
+           kguiaddons
            kiconthemes
            kitemviews
            ki18n
@@ -3258,8 +3208,7 @@ the passwords on KDE work spaces.")
            (lambda _
              (setenv "HOME" (getcwd))
              ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Framework for managing menu and toolbar actions")
     (description "KXMLGUI provides a framework for managing menu and toolbar
@@ -3272,16 +3221,16 @@ descriptions for integrating actions from plugins.")
 (define-public kxmlrpcclient
   (package
     (name "kxmlrpcclient")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
                     "mirror://kde/stable/frameworks/"
-                    (version-major+minor version) "/"
+                    (version-major+minor version) "/portingAids/"
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1cmfv2w9yfi8jhj5nawfz7kw8jbr1k5cr3n5xv3z59pg2vazsx8b"))))
+                "1jrmrzcvnnw7q7pxgfpcz8608jmxqxf89habmgwv71b8kjz3vgaw"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kio))
@@ -3315,7 +3264,7 @@ setUrl, setUserAgent and call.")
 (define-public plasma-framework
   (package
     (name "plasma-framework")
-    (version "5.70.1")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3324,56 +3273,62 @@ setUrl, setUserAgent and call.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "06cxajsxj62g3c37ssrrcaxb9a12zbyp2kvrjqym329k5vd89272"))
-              (patches (search-patches "plasma-framework-fix-KF5PlasmaMacros.cmake.patch"))))
+                "14myvv70pixygb20c136sk7prv5f5dca53fgc74dk6c28hwyldh2"))))
     (build-system cmake-build-system)
     (propagated-inputs
      (list kpackage kservice))
     (native-inputs
-     (list extra-cmake-modules pkg-config))
-    (inputs
-     `(("kactivities" ,kactivities)
-       ("karchive" ,karchive)
-       ("kauth" ,kauth)
-       ("kbookmarks" ,kbookmarks)
-       ("kcodecs" ,kcodecs)
-       ("kcompletion" ,kcompletion)
-       ("kconfig" ,kconfig)
-       ("kconfigwidgets" ,kconfigwidgets)
-       ("kcoreaddons" ,kcoreaddons)
-       ("kdbusaddons" ,kdbusaddons)
-       ("kdeclarative" ,kdeclarative)
-       ("kdoctools" ,kdoctools)
-       ("kglobalaccel" ,kglobalaccel)
-       ("kguiaddons" ,kguiaddons)
-       ("kiconthemes" ,kiconthemes)
-       ("kirigami" ,kirigami)
-       ("kitemviews" ,kitemviews)
-       ("kio" ,kio)
-       ("ki18n" ,ki18n)
-       ("kjobwidgets" ,kjobwidgets)
-       ("knotificantions" ,knotifications)
-       ("kwayland" ,kwayland)
-       ("kwidgetsaddons" ,kwidgetsaddons)
-       ("kwindowsystem" ,kwindowsystem)
-       ("kxmlgui" ,kxmlgui)
-       ("phonon" ,phonon)
-       ("qtbase" ,qtbase-5)
-       ("qtdeclarative-5" ,qtdeclarative-5)
-       ("qtquickcontrols2-5" ,qtquickcontrols2-5)
-       ("qtsvg-5" ,qtsvg-5)
-       ("qtx11extras" ,qtx11extras)
-       ("solid" ,solid)))
+     (list extra-cmake-modules kdoctools pkg-config))
+    (inputs (list kactivities
+                  karchive
+                  kauth
+                  kbookmarks
+                  kcodecs
+                  kcompletion
+                  kconfig
+                  kconfigwidgets
+                  kcoreaddons
+                  kdbusaddons
+                  kdeclarative
+                  kglobalaccel
+                  kguiaddons
+                  kiconthemes
+                  kirigami
+                  kitemviews
+                  kio
+                  ki18n
+                  kjobwidgets
+                  knotifications
+                  kwayland
+                  kwidgetsaddons
+                  kwindowsystem
+                  kxmlgui
+                  ;; XXX: "undefined reference to `glGetString'" errors occur without libglvnd,
+                  libglvnd
+                  phonon
+                  qtbase-5
+                  qtdeclarative-5
+                  qtquickcontrols2-5
+                  qtsvg-5
+                  qtx11extras
+                  solid))
     (arguments
-     `(#:tests? #f ; FIXME: 9/15 tests fail.
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "HOME" (getcwd))
-             ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+	   ;; Fix based on https://invent.kde.org/frameworks/plasma-framework/-/issues/13
+	     (add-after 'unpack 'apply-fix
+		  (lambda* _
+		   (substitute* "src/scriptengines/qml/CMakeLists.txt"
+		   (("KF5::ConfigQml") ""))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen") ;; These tests fail
+               (invoke "ctest" "-E" (string-append "(plasma-dialogstatetest"
+                                                   "|plasma-iconitemtest"
+                                                   "|plasma-themetest"
+                                                   "|dialognativetest)"))))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Libraries, components and tools of Plasma workspaces")
     (description "The plasma framework provides QML components, libplasma and
@@ -3384,7 +3339,7 @@ script engines.")
 (define-public purpose
   (package
     (name "purpose")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3393,7 +3348,7 @@ script engines.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1pxlx2hgj42zsisws8f486n8sg0vn5a5mhb85prifwkaw0rqzgah"))))
+                "0gji3dsccbii1gm83dpwry02cqmjrimhj8gnkb6nzvzrnq5xfh3r"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -3409,13 +3364,6 @@ script engines.")
            qtdeclarative-5))
     (arguments
      `(#:tests? #f  ;; seem to require network; don't find QTQuick components
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'dont-use-qt515-logic
-           (lambda _
-             (substitute* "src/externalprocess/purposeprocess_main.cpp"
-               ((" 15") " 16"))
-             #t)))
        #:configure-flags '("-DBUILD_TESTING=OFF"))) ; not run anyway
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Offers available actions for a specific purpose")
@@ -3457,7 +3405,7 @@ need.")
 (define-public kde-frameworkintegration
   (package
     (name "kde-frameworkintegration")
-    (version "5.70.0")
+    (version "5.96.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3466,7 +3414,7 @@ need.")
                     "frameworkintegration-" version ".tar.xz"))
               (sha256
                (base32
-                "1lvccvhhkzdv1hw627kw3ds18gfq4bxdhlvh959piqxq5gh9d2n0"))))
+                "19piq6h51qh64nbkqnpy6jg91vbl67vg2sh4hlwzsb2lcrmwxgk9"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -3490,8 +3438,7 @@ need.")
            (lambda _
              (setenv "HOME" (getcwd))
              ;; Make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "KDE Frameworks 5 workspace and cross-framework integration plugins")
     (description "Framework Integration is a set of plugins responsible for
@@ -3512,7 +3459,7 @@ workspace.")
 (define-public kdelibs4support
   (package
     (name "kdelibs4support")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -3521,15 +3468,17 @@ workspace.")
              (version-major+minor version) "/portingAids/"
              name "-" version ".tar.xz"))
        (sha256
-        (base32 "0imkibjlfc0jshdzr05fz5dy2xmfhvgsfan9b1r35spwsn5qkawx"))))
+        (base32 "18f99g1g1z1mrkgq3l8kgxjxi60a632p0sg8d46r67b9n008w9m7"))))
     (build-system cmake-build-system)
     (native-inputs
      (list dbus
            docbook-xml-4.4 ; optional
            extra-cmake-modules
+           kdoctools
            perl
            perl-uri
            pkg-config
+           qttools
            shared-mime-info
            kjobwidgets ;; required for running the tests
            strace
@@ -3583,8 +3532,7 @@ workspace.")
            (lambda _
              (substitute* "cmake/FindDocBookXML4.cmake"
                (("^.*xml/docbook/schema/dtd.*$")
-                "xml/dtd/docbook\n"))
-             #t))
+                "xml/dtd/docbook\n"))))
          (delete 'check)
          (add-after 'install 'check-post-install
            (lambda* (#:key inputs tests? #:allow-other-keys)
@@ -3606,7 +3554,7 @@ workspace.")
                (lambda _
                  (display "[testSmb]\n*\n")))
              ;; kuniqueapptest hangs. FIXME: Make this test pass.
-             (invoke "dbus-launch" "ctest" "."
+             (invoke "dbus-launch" "ctest"
                      "-E" "kstandarddirstest|kuniqueapptest"))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "KDE Frameworks 5 porting aid from KDELibs4")
@@ -3628,7 +3576,7 @@ http://community.kde.org/Frameworks/Porting_Notes should help with this.")
 (define-public khtml
   (package
     (name "khtml")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -3637,7 +3585,7 @@ http://community.kde.org/Frameworks/Porting_Notes should help with this.")
              (version-major+minor version) "/portingAids/"
              name "-" version ".tar.xz"))
        (sha256
-        (base32 "1jh0g6xv57hyclnh54x0f72lby1gvlisan23y7mzlqf67aky52s5"))))
+        (base32 "0lc933z4568962xj7grzy44aj97h76s5vvv1cnj351dzwr5qahpx"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules perl))
@@ -3678,7 +3626,7 @@ technology and using KJS for JavaScript support.")
 (define-public kjs
   (package
     (name "kjs")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -3687,7 +3635,7 @@ technology and using KJS for JavaScript support.")
              (version-major+minor version) "/portingAids/"
              name "-" version ".tar.xz"))
        (sha256
-        (base32 "0s3n0pdz59p5v967zrxcas3lb94k5bv9vi8058fi0l20nwwlcgh5"))))
+        (base32 "0jhfjjpv5hzbib3p30ngn6ic023fnrvnr8jrbjdzyacjywj69vvp"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools perl pkg-config))
@@ -3707,7 +3655,7 @@ support.")
 (define-public kjsembed
   (package
     (name "kjsembed")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -3716,7 +3664,7 @@ support.")
              (version-major+minor version) "/portingAids/"
              name "-" version ".tar.xz"))
        (sha256
-        (base32 "0976faazhxhhi1wpvpcs8hwb2knz0z7j44v3ay3hw73rq4p3bipm"))))
+        (base32 "1z8h0n4v1qgs2lsxflrzhdfb91jna3y2dxal1qz7i3szjvrf63h0"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools qttools-5))
@@ -3731,7 +3679,7 @@ QObjects, so you can script your applications.")
 (define-public kmediaplayer
   (package
     (name "kmediaplayer")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -3740,7 +3688,7 @@ QObjects, so you can script your applications.")
              (version-major+minor version) "/portingAids/"
              name "-" version ".tar.xz"))
        (sha256
-        (base32 "0lrm4y727nhwaivl37zpmnrwx048gfhyjw19m6q5z9p37lk43jja"))))
+        (base32 "0qqlah4zi0b7b6yb4009kkjqw7fkp1lgvp2mcpxs8vbbshs3376c"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools qttools-5))
@@ -3767,7 +3715,7 @@ KParts instead.")
 (define-public kross
   (package
     (name "kross")
-    (version "5.70.0")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
@@ -3776,7 +3724,7 @@ KParts instead.")
              (version-major+minor version) "/portingAids/"
              name "-" version ".tar.xz"))
        (sha256
-        (base32 "12b527l12rcf421p613ydbacilp9v9iy90ma35w21sdf9a15k675"))))
+        (base32 "03dvg2jh9587kcp2f9nir727z0qvkcywrgxfi1p1hxq1bx6y8fm2"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools qttools-5))
@@ -3809,19 +3757,28 @@ offers abstract functionality to deal with scripts.")
 (define-public kdav
   (package
     (name "kdav")
-    (version "20.04.3")
+    (version "5.96.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://kde/stable/release-service/" version
-                           "/src/kdav-" version ".tar.xz"))
+       (uri (string-append "mirror://kde/stable/frameworks/"
+                           (version-major+minor version) "/"
+                           name "-" version ".tar.xz"))
        (sha256
-        (base32 "0445gl4xm0h39igkxgb6vmq5iaa04wkgrgbs7nfd0zwngk8xaidn"))))
+        (base32 "1zqib8km4fg9aj4gmhx4hm7n7bbrz62l41qb48nz1pc3qia2x1wl"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
     (inputs
      (list kcoreaddons ki18n kio qtbase-5 qtxmlpatterns))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests? ;; Seems to require network.
+               (invoke "ctest" "-E"
+                       "(kdav-davcollectionsmultifetchjobtest|kdav-davitemfetchjob)")))))))
     (home-page "https://invent.kde.org/frameworks/kdav")
     (synopsis "DAV protocol implementation with KJobs")
     (description "This is a DAV protocol implementation with KJobs.  Calendars
diff --git a/gnu/packages/kde-games.scm b/gnu/packages/kde-games.scm
index 7a08092e14..60c4d839d6 100644
--- a/gnu/packages/kde-games.scm
+++ b/gnu/packages/kde-games.scm
@@ -42,14 +42,14 @@
 (define-public ktuberling
   (package
     (name "ktuberling")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/ktuberling-" version ".tar.xz"))
       (sha256
-       (base32 "0mlv9qllg70p26dbrcsr820c70d3ib88hapc1z6wgjhdpmc12ni1"))))
+       (base32 "19kyk7r7lkzwcvhhn1jjgrcdkq8gfmzgyrvvcbm4qkx7jd27v1ia"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools perl))
@@ -91,14 +91,14 @@ This package is part of the KDE games module.")
 (define-public picmi
   (package
     (name "picmi")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/picmi-" version ".tar.xz"))
       (sha256
-       (base32 "1dfq9m4njh0czz8zws46rkz6xq2n6xra5w223m3s2f5civiw5msz"))))
+       (base32 "0nn00sila4zn4r28dh84jvqqrrs31sh9vwd76nalm7y14xrxwn46"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -127,14 +127,14 @@ This package is part of the KDE games module.")
 (define-public kolf
   (package
     (name "kolf")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kolf-" version ".tar.xz"))
        (sha256
-        (base32 "1lpp6pzr5dgd4si4a8c7hcvgxgqy0bgyhkx9m6jqb0zhll6dxj10"))))
+        (base32 "0mmmj9rxrbpf9clj49zgflrlic8qafzw2r2by5knhsn15mq59bd3"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -174,14 +174,14 @@ This package is part of the KDE games module.")
 (define-public libkmahjongg
   (package
     (name "libkmahjongg")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/libkmahjongg-" version ".tar.xz"))
       (sha256
-       (base32 "10ljzbf7qki5flydankrbksaihhkqpfyljb8c71fbwqwmkr7rgfq"))))
+       (base32 "1y123bygi4iil8qglv2fx81qnlqpjpx3s4fmq8sffkilcz875nw8"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -205,14 +205,14 @@ other Mah Jongg like games.")
 (define-public kmahjongg
   (package
     (name "kmahjongg")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/kmahjongg-" version ".tar.xz"))
       (sha256
-       (base32 "1fcj4jb2zzbaxp7cp04w36y0c7lh77yzin66fmvrcxkl11xi2wwd"))))
+       (base32 "0lvia7ghnp8wx2xndzipv8grdsdn3i96xlsy6wspna1k884x8ylw"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -244,14 +244,14 @@ This package is part of the KDE games module.")
 (define-public kshisen
   (package
     (name "kshisen")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/kshisen-" version ".tar.xz"))
       (sha256
-       (base32 "1hrwr0f1kidivsp8lnwdbqz3xxagjvjwh72r3gma8smfilybygfb"))))
+       (base32 "004qr0kmw0c6ahif1mf2f88a849ws3kap7p2ksvljmyyl38x2sbs"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules
@@ -283,14 +283,14 @@ This package is part of the KDE games module.")
 (define-public kajongg
   (package
     (name "kajongg")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/kajongg-" version ".tar.xz"))
       (sha256
-       (base32 "03fdbnx7zx7vgcxvwd1h1098ks9gq162bwz35fhpyzpynr667m5r"))))
+       (base32 "15b2l0zsyzrir791w9sdf65kvn6528b8vxdrya3f425nvsxsx7ix"))))
     (build-system qt-build-system)
     (arguments
      `(#:phases
@@ -345,14 +345,14 @@ This package is part of the KDE games module.")
 (define-public kbreakout
   (package
     (name "kbreakout")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kbreakout-" version ".tar.xz"))
       (sha256
-       (base32 "0kqj2cx0ny3qq65c6w5fpnzmrwl9irg8slzvpd3anck5cnvma3j4"))))
+       (base32 "1pvxxl7m46ihjkzaq261xfsynikyrbrr67d4vh5pxfj6pipzrgkp"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -382,14 +382,14 @@ This package is part of the KDE games module.")
 (define-public kmines
   (package
     (name "kmines")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kmines-" version ".tar.xz"))
       (sha256
-       (base32 "0hqjwh3jq2npqwkvh67fyn2xnq8swiasdw5jz8f0ikl0k28id775"))))
+       (base32 "1w6bqlzhbm3vc09jyxfg8vgn0a2nknfz1shbsfamc36jsy2sr758"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -419,14 +419,14 @@ This package is part of the KDE games module.")
 (define-public konquest
   (package
     (name "konquest")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/konquest-" version ".tar.xz"))
       (sha256
-       (base32 "0lnwj06vv4qx05hr8pzysnvrxh8y04asajrph0rsj37v8hs9g5lh"))))
+       (base32 "1kylv730plii7grzccaclg5lkmgwhdgh2ya7h7lpnb8zaapy3kbr"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -458,14 +458,14 @@ This package is part of the KDE games module.")
 (define-public kbounce
   (package
     (name "kbounce")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/kbounce-" version ".tar.xz"))
       (sha256
-       (base32 "0ymy0z1qlw3n653xs3dsa1xm78q4xaj09dnnci4km77rzis26vb6"))))
+       (base32 "187f0hz19xj17h5dzj0nw3r9zas3sppiswhgnzma9snl1w0rfzwh"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -496,14 +496,14 @@ This package is part of the KDE games module.")
 (define-public kblocks
   (package
     (name "kblocks")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/kblocks-" version ".tar.xz"))
       (sha256
-       (base32 "09yfm9mzbamp294cvc5finq6ilxvxr68i0dnb0m72pa4sfzmij32"))))
+       (base32 "18hdzkwv8lscm9xsi0d99pq219y0m9bqdqv3k15g7gz0sryxvyva"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -536,14 +536,14 @@ This package is part of the KDE games module.")
 (define-public ksudoku
   (package
     (name "ksudoku")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/"
                           version "/src/ksudoku-" version ".tar.xz"))
       (sha256
-       (base32 "0pj6ry7ak1rnpb93mqypaxrcbmrhwg9ir6zhb3ybzfkfcrh67g12"))))
+       (base32 "116dgc9hh6fq6x0w4rd4kjd2qy93hq6bmxwk5jmm21lqwrszr6hw"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -596,14 +596,14 @@ This package is part of the KDE games module.")
 (define-public klines
   (package
     (name "klines")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/klines-" version ".tar.xz"))
       (sha256
-       (base32 "0y8lnwawrkl4ixn7v4dg48k2zpr083krv7dv4d94b2dpkh7xfvih"))))
+       (base32 "15z5gcncyr1i7xipnsvr2lvdi9wdqm8if3ylimksxhgr5dkvz9vz"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -639,14 +639,14 @@ This package is part of the KDE games module.")
 (define-public kgoldrunner
   (package
     (name "kgoldrunner")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kgoldrunner-" version ".tar.xz"))
       (sha256
-       (base32 "17ra5d3r9ajy2inj17gwd5xphzhvbzx5kpvdwyj6msx4dd9wxgfi"))))
+       (base32 "1ga0djplhgqbfrvq0m7ymd30lsi7kc23chaqmc0vy3g61y9274da"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -679,14 +679,14 @@ This package is part of the KDE games module.")
 (define-public kdiamond
   (package
     (name "kdiamond")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kdiamond-" version ".tar.xz"))
       (sha256
-       (base32 "1iyxrx3422asa58kh0siwvi1svds5kccrym6gdfpdhlmhmciqlzi"))))
+       (base32 "1ca1hxzzvpwm3ms9m0xd7x4r011n7bjlsc4l333q0xjy5vwlrz3s"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -717,14 +717,14 @@ This package is part of the KDE games module.")
 (define-public kfourinline
   (package
     (name "kfourinline")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kfourinline-" version ".tar.xz"))
       (sha256
-       (base32 "0plx3lv35fc8q9svbyl71mms3ji6zn58j306bvm1f8kkgg0x395b"))))
+       (base32 "163aii9bala14bhc9j503xk86jcnmnn327fmx3c68ryp0s89rx97"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -755,14 +755,14 @@ This package is part of the KDE games module.")
 (define-public kblackbox
   (package
     (name "kblackbox")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kblackbox-" version ".tar.xz"))
       (sha256
-       (base32 "0la5w44b0gl72g3wfp0pw8gwnm287lh7nd9k5ikpszw5nn49db0h"))))
+       (base32 "0im7mb93yrbliavil5bcqymcq6a4sjq1pj52ysq8gqqwf7jrw1gx"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -795,14 +795,14 @@ This package is part of the KDE games module.")
 (define-public knetwalk
   (package
     (name "knetwalk")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/knetwalk-" version ".tar.xz"))
       (sha256
-       (base32 "060kj06vpigdy570izsjfgnmqqrpmb8bkr9arqc109hg3avl5wjz"))))
+       (base32 "0w1bpx04yn7xsyf4h8ymw887ir9ifbwxynqllh8xn4chwd21ipgp"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -836,14 +836,14 @@ This package is part of the KDE games module.")
 (define-public bomber
   (package
     (name "bomber")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/bomber-" version ".tar.xz"))
        (sha256
-        (base32 "1fjcwm591jgx3bgqpi0j5fnb2l2r2h3r6lav3vhaxz4rkf56pg2a"))))
+        (base32 "0cxyp5c119r0bkqzx0mnbfdb2i1h0ra0kp30zx0nmvma1rxrrvgf"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -877,14 +877,14 @@ This package is part of the KDE games module.")
 (define-public granatier
   (package
     (name "granatier")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/granatier-" version ".tar.xz"))
       (sha256
-       (base32 "1fyh7zyacb3pnlfd29jw2jmyl8a7sjw354pi234nd5x5999xw5z6"))))
+       (base32 "1ylywj579j252hj6lz5ghvmiiqf9yb2lncqbypbibdr34irs5if9"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -914,14 +914,14 @@ This package is part of the KDE games module.")
 (define-public ksirk
   (package
     (name "ksirk")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/ksirk-" version ".tar.xz"))
        (sha256
-        (base32 "10y7nm0x6zcc0gh3am69bbxyyb8azbbfyrdqsa023ggr7n04cn21"))))
+        (base32 "0c1ls3i2jqcrmdy3zhb25ml9lhdy4gjdcvv4j5z8x5wig265qbwx"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -969,14 +969,14 @@ This package is part of the KDE games module.")
 (define-public palapeli
   (package
     (name "palapeli")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/palapeli-" version ".tar.xz"))
        (sha256
-        (base32 "0xxz9g4zxljlg20g88a5lkbwzzm9yg4vxnrfigk8m018cz0nqd5b"))))
+        (base32 "0bwi5y5mrf6h1vhyhs5sxwx8hdv0hkknpscpg5q54f6hw6cwf4qv"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1016,14 +1016,14 @@ This package is part of the KDE games module.")
 (define-public kiriki
   (package
     (name "kiriki")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kiriki-" version ".tar.xz"))
        (sha256
-        (base32 "0milc8fl1rj4yrwdvm60ampd47dyiys1xvqi5f0g7y6mgymgyk4x"))))
+        (base32 "1ijl4hjck4wvxplcjzqw9ahadnbvd8hk61qn04kbyz6mrp67xgrn"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1054,14 +1054,14 @@ This package is part of the KDE games module.")
 (define-public kigo
   (package
     (name "kigo")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kigo-" version ".tar.xz"))
        (sha256
-        (base32 "088752yzmfsnppd27p8hld4x5s7sw5fagm08024l5ra1mlicdfz9"))))
+        (base32 "0wav6pmljbki2ipgzp82gb2j861b2bj1c2x4ydqn106aqcm0ci71"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1100,14 +1100,14 @@ This package is part of the KDE games module.")
 (define-public kubrick
   (package
     (name "kubrick")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kubrick-" version ".tar.xz"))
        (sha256
-        (base32 "0h3mypwd67sss08j5vvrih5f5ss85m9kax6412y40xmsm51lz2pq"))))
+        (base32 "09hxrigckvpxw1ipzlhq5fb5hpzrb5h65b55m6di3nj6ys2x50v9"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1141,14 +1141,14 @@ This package is part of the KDE games module.")
 (define-public lskat
   (package
     (name "lskat")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/lskat-" version ".tar.xz"))
        (sha256
-        (base32 "1wg9zxp64kwjxqs4qw0h7j8yhgffbmvh8j9d4dgmz45dscngnjli"))))
+        (base32 "07pkrgn9pgwwcc903iqmdp49i26ijkkb795jbwyhdg3nqgck9ar9"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1179,14 +1179,14 @@ This package is part of the KDE games module.")
 (define-public kapman
   (package
     (name "kapman")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kapman-" version ".tar.xz"))
       (sha256
-       (base32 "14x3v6li4r3gzzwfd6ar9saq2rhc7yxs0sp9ygalzq8vq4d7i1kh"))))
+       (base32 "0clh3nyc3kan0hbbzzca3sd09nl2hd36y7f6g5pv2cp6i1m4757y"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1218,14 +1218,14 @@ This package is part of the KDE games module.")
 (define-public kspaceduel
   (package
     (name "kspaceduel")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kspaceduel-" version ".tar.xz"))
        (sha256
-        (base32 "1aixh6ygif2cm1a5g32sl5y6b5x68139pzihaxq4334c6avamdai"))))
+        (base32 "1yb7y1f5rcw4jacpf9vpzbragm2ywwb3mkjhq67x7x99q6r9iz55"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1253,14 +1253,14 @@ This package is part of the KDE games module.")
 (define-public bovo
   (package
     (name "bovo")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/bovo-" version ".tar.xz"))
        (sha256
-        (base32 "18qbac366m0xma3ary11q9zxz0wgnysppcl7kpypl6ic3nf61wqz"))))
+        (base32 "1yz4x7fmllmp57yxfipqkldgf38haldah81d2qmc5jlahvy3j23p"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1289,14 +1289,14 @@ This package is part of the KDE games module.")
 (define-public killbots
   (package
     (name "killbots")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/killbots-" version ".tar.xz"))
        (sha256
-        (base32 "1296gww42nwnai7y6m2qpjqpyc30p7z9chfv5rv0n48jvdhva88y"))))
+        (base32 "07ak86a4v0v8b0nny8n246j3lab5zr8sq0ra9k48cdy53xmq909j"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1330,14 +1330,14 @@ This package is part of the KDE games module.")
 (define-public ksnakeduel
   (package
     (name "ksnakeduel")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/ksnakeduel-" version ".tar.xz"))
       (sha256
-       (base32 "0mp6g258n3xzvgf23jnhkw10xgwqwqdzqfdc6r9jq6a6m8v77swz"))))
+       (base32 "0hi812hsjnyp1ds3wwv2wr58az6m2zsq97nywsncc0d3b5cxzsza"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1368,14 +1368,14 @@ This package is part of the KDE games module.")
 (define-public kollision
   (package
     (name "kollision")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kollision-" version ".tar.xz"))
       (sha256
-       (base32 "180ybafizpwjsg80npy0l9142cjsnlyxwv9dz3bq6r8v4smn2g6b"))))
+       (base32 "0ra83qmvzd4n6d7df2i8bh81y70lxa48i115x9h9ik52b2a48mxf"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1405,14 +1405,14 @@ This package is part of the KDE games module.")
 (define-public knavalbattle
   (package
     (name "knavalbattle")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/knavalbattle-" version ".tar.xz"))
       (sha256
-       (base32 "03rqf4avn61b0v340ymmzgp7s0axygjgxq1nlp5aaqbx70zcb4lq"))))
+       (base32 "0i7hf58b3gylld6d7q2aq5w6dksa32z5y1dcaj8nm1lpgcndmj0s"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1445,14 +1445,14 @@ This package is part of the KDE games module.")
 (define-public kreversi
   (package
     (name "kreversi")
-    (version "20.08.3")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kreversi-" version ".tar.xz"))
       (sha256
-       (base32 "0d3y072q61xcik9lf0pz0c9njvarwlvf6hqv5fp5jyqaf2902pmi"))))
+       (base32 "0gyj0a6hj6jps5z97wdw0nwp0mvnib6v062bcy4dp3c14lhl9r4p"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1487,14 +1487,14 @@ This package is part of the KDE games module.")
 (define-public ksquares
   (package
     (name "ksquares")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/ksquares-" version ".tar.xz"))
       (sha256
-       (base32 "0chd30byl2kww1k699vkygrxq2wdyvi84m2bimk23q96fl8h831y"))))
+       (base32 "05cz0d83570awnh0faam3y5fxzafzkxaj3wijka1vcbigxk350c5"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1523,14 +1523,14 @@ This package is part of the KDE games module.")
 (define-public kjumpingcube
   (package
     (name "kjumpingcube")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kjumpingcube-" version ".tar.xz"))
       (sha256
-       (base32 "1mk73il4jh15z5pm3fp65hsyvmrga11c3h7w96yamy2n2bbniapq"))))
+       (base32 "0m9ajl9lq52yn498g0kvsbwa0xmihlqli7zw644c282ni934bwhn"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
diff --git a/gnu/packages/kde-internet.scm b/gnu/packages/kde-internet.scm
index 25a177965a..36c60b9fca 100644
--- a/gnu/packages/kde-internet.scm
+++ b/gnu/packages/kde-internet.scm
@@ -1,6 +1,8 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017, 2019, 2020 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,6 +22,7 @@
 (define-module (gnu packages kde-internet)
   #:use-module (guix build-system qt)
   #:use-module (guix download)
+  #:use-module (guix gexp)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
@@ -46,6 +49,7 @@
   #:use-module (gnu packages linphone)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages video)
+  #:use-module (gnu packages vnc)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xiph)
   #:use-module (gnu packages xml))
@@ -83,7 +87,7 @@
            kwidgetsaddons
            kxmlgui
            ;; TODO: telepathy
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            purpose
            qca
            qoauth
@@ -113,17 +117,17 @@ Other notable features include:
 (define-public kget
   (package
     (name "kget")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kget-" version ".tar.xz"))
        (sha256
-        (base32 "1swx58wcig8zq8ibhczhcw7l8mqjm7pq8zca9gmny9kda5q04f5m"))))
+        (base32 "0rqznsyphnq0zi65wvrl9mwqm9268wgihkr104i87pp5kfiah5yp"))))
     (build-system qt-build-system)
     (native-inputs
-     (list extra-cmake-modules pkg-config))
+     (list extra-cmake-modules kdoctools pkg-config))
     (inputs
      (list boost
            gmp
@@ -136,7 +140,6 @@ Other notable features include:
            kcrash
            kdbusaddons
            kdelibs4support ;; KLocale
-           kdoctools
            ki18n
            kiconthemes
            kio
@@ -154,15 +157,23 @@ Other notable features include:
            libktorrent
            ;; TODO: libmms
            ;; TODO: LibKWorkspace - plasma-workspace?
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            qca
            qgpgme
            qtbase-5))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests? ;; FIXME: two tests fails.
+               (invoke "ctest" "-E" "(schedulertest|filedeletertest)"))
+             #t)))))
     (home-page "http://www.kde.org/")
     (synopsis "Versatile and user-friendly download manager")
     (description "KGet is an advanced download manager with support for
 Metalink and Bittorrent.  Downloads are added to the list, where they can be
-paused, queued, or scheduled for later. KGet supports download via FTP anf
+paused, queued, or scheduled for later.  KGet supports download via FTP anf
 HTTP(S) as well as pausing downloads.
 
 This package is part of the KDE networking module.")
@@ -172,14 +183,14 @@ This package is part of the KDE networking module.")
 (define-public konversation
   (package
     (name "konversation")
-    (version "1.7.7")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://kde/stable/konversation/" version
+       (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/konversation-" version ".tar.xz"))
        (sha256
-        (base32 "19qqq9s8k0cl71ib33xn07f26j5ji2g4336jk65im6452cf1dv27"))))
+        (base32 "08b4vnm66hbbnvkkh1p0a82pd2aj4zy5a8indfv3fzczsfpx6gp0"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -198,19 +209,21 @@ This package is part of the KDE networking module.")
            kidletime
            kio
            kitemviews
+           knewstuff
            knotifications
            knotifyconfig
            kparts
            kwallet
            kwidgetsaddons
            kwindowsystem
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            phonon
            qtbase-5
            qca
+           qtmultimedia-5
            solid
            sonnet))
-    (home-page "https://kde.org/applications/internet/org.kde.konversations")
+    (home-page "https://apps.kde.org/konversation/")
     (synopsis "Graphical Internet Relay Chat (IRC) client for KDE")
     (description "Konversation is a graphical Internet Relay Chat client (IRC)
 with KDE support.
@@ -242,14 +255,14 @@ Features are:
 (define-public kopete
   (package
     (name "kopete")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kopete-" version ".tar.xz"))
        (sha256
-        (base32 "149gi9hkyl825kf046iqkam3gkzfwdc2sihbf8gs6njachzvb81y"))))
+        (base32 "0fc9m2xgsjmsypqllqb3cp1y2m28dqh48r1qg2xgkfyqa70dnvp9"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools pkg-config))
@@ -277,6 +290,7 @@ Features are:
            knotifyconfig
            kparts
            kpimtextedit
+           ksyntaxhighlighting
            ktexteditor
            kwallet
            ;; TODO: Libgadu
@@ -287,7 +301,7 @@ Features are:
            libsrtp
            libxml2
            libxslt
-           ;; TODO: Mediastreamer
+           mediastreamer2
            openssl
            ortp
            phonon
@@ -299,7 +313,7 @@ Features are:
            ;; TODO: Xmms
            zlib))
     ;; TODO: enable video support
-    (home-page "https://kde.org/applications/internet/org.kde.kopete")
+    (home-page "https://apps.kde.org/kopete/")
     (synopsis "Instant messaging and chat application")
     (description "Kopete is an instant messenger supporting Jabber/XMPP ,AIM,
 ICQ, Gadu-Gadu, Novell GroupWise Messenger, and more.  It is designed to be a
@@ -318,14 +332,14 @@ This package is part of the KDE networking module.")
 (define-public krdc
   (package
     (name "krdc")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/krdc-" version ".tar.xz"))
        (sha256
-        (base32 "1hp23k3nsrcxpv2qiynjgm71zn3l6ds00cpd4frc68szgiblrw9r"))))
+        (base32 "0bs8q3na924lnmra5608jwnn0dqczvh0f72nn43673ib3m1mddlr"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -340,16 +354,17 @@ This package is part of the KDE networking module.")
            kiconthemes
            knotifications
            knotifyconfig
-           knotifyconfig
            kwallet
            kwidgetsaddons
            kwindowsystem
            kxmlgui
            libssh
-           ;; TODO: libvnc{server,client} - is not tigervnc-{server,client}
-           oxygen-icons ; default icon set
+           libvnc
+           breeze-icons ; default icon set
            qtbase-5))
-    (home-page "https://kde.org/applications/internet/org.kde.krdc")
+    (arguments ;; FIXEME: libvnc can't be found for some reason.
+     (list #:configure-flags #~(list "-DWITH_VNC=NO")))
+    (home-page "https://apps.kde.org/krdc/")
     (synopsis "Remote desktop client")
     (description "KRDC is a client application that allows you to view or even
 control the desktop session on another machine that is running a compatible
@@ -362,14 +377,14 @@ This package is part of the KDE networking module.")
 (define-public ktorrent
   (package
     (name "ktorrent")
-    (version "5.1.2")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://kde/stable/ktorrent/" version
-                           "/ktorrent-" version ".tar.xz"))
+       (uri (string-append "mirror://kde/stable/release-service/" version
+                           "/src/ktorrent-" version ".tar.xz"))
        (sha256
-        (base32 "0kwd0npxfg4mdh7f3xadd2zjlqalpb1jxk61505qpcgcssijf534"))))
+        (base32 "1h95hf4ki2xi2c9bzdg18p6d1757gzqknf6gn1ls6lwqy6p0pr4h"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -383,7 +398,6 @@ This package is part of the KDE networking module.")
            kcoreaddons
            kcrash
            kdbusaddons
-           kdewebkit
            kdnssd
            ki18n
            kiconthemes
@@ -399,7 +413,7 @@ This package is part of the KDE networking module.")
            libgcrypt
            libktorrent
            ;; TODO: LibKWorkspace -> plasma-workspace?
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            phonon
            qtbase-5
            qtscript
@@ -407,7 +421,7 @@ This package is part of the KDE networking module.")
            solid
            syndication
            taglib))
-    (home-page "https://kde.org/applications/internet/org.kde.ktorrent")
+    (home-page "https://apps.kde.org/ktorrent/")
     (synopsis "BitTorrent client")
     (description "KTorrent is a BitTorrent application by KDE which allows you
 to download files using the BitTorrent protocol.  It enables you to run
@@ -418,15 +432,14 @@ a full-featured client for BitTorrent.")
 (define-public libktorrent
   (package
     (name "libktorrent")
-    (version "2.1.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://kde//stable/ktorrent/"
-                           (package-version ktorrent)
-                           "/libktorrent-" version ".tar.xz"))
+       (uri (string-append "mirror://kde/stable/release-service/"
+                           version "/src/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0051zh8bb4p9wmcfn5ql987brhsaiw9880xdck7b5dm1a05mri2w"))))
+        (base32 "098ac7b5wa7v6svqv4rx1w44j18pr22qgr236fj94r2kpl2nq79q"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
diff --git a/gnu/packages/kde-multimedia.scm b/gnu/packages/kde-multimedia.scm
index edfb2e3b3c..9fb3572909 100644
--- a/gnu/packages/kde-multimedia.scm
+++ b/gnu/packages/kde-multimedia.scm
@@ -3,6 +3,8 @@
 ;;; Copyright © 2020 Timotej Lazar <timotej.lazar@araneo.si>
 ;;; Copyright © 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2022 Vinicius Monego <monego@posteo.net>
+;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -55,14 +57,14 @@
 (define-public audiocd-kio
   (package
     (name "audiocd-kio")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/audiocd-kio-" version ".tar.xz"))
        (sha256
-        (base32 "0qlnxxbayqhz25jbvzis27jw2zbw1pmacp8rv7v5wa7zfqn3kmyk"))))
+        (base32 "0d6pbsh1fbhwwr2c4kf9b17dhzzx2jsmgamawcp4kn7pw9i7i8ql"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -78,7 +80,7 @@
            libvorbis
            phonon
            qtbase-5))
-    (home-page "https://kde.org/applications/multimedia/org.kde.kio_audiocd")
+    (home-page "https://apps.kde.org/kio_audiocd/")
     (synopsis "Transparent audio CD integration for applications using the KDE
 Platform")
     (description "KIO AudioCD is a KIO slave that enables KIO-aware
@@ -94,14 +96,14 @@ This package is part of the KDE multimedia module.")
 (define-public dragon
   (package
     (name "dragon")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/dragon-" version ".tar.xz"))
        (sha256
-        (base32 "1sssg20a1vpwk816lp5jgwahilaswb9f3hgfqvc73il4g11ky1xj"))))
+        (base32 "0284shnqwbh1953ym197qaqgjwrnva77zi55lvvykg5cq42x512s"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -120,12 +122,24 @@ This package is part of the KDE multimedia module.")
            kwidgetsaddons
            kwindowsystem
            kxmlgui
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            phonon
            phonon-backend-gstreamer
+           gst-plugins-base
+           gst-plugins-good
            qtbase-5
            solid))
-    (home-page "https://kde.org/applications/multimedia/org.kde.dragonplayer")
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'qt-wrap 'gst-wrap
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out             (assoc-ref outputs "out"))
+                   (gst-plugin-path (getenv "GST_PLUGIN_SYSTEM_PATH")))
+               (wrap-program (string-append out "/bin/dragon")
+                 `("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path)))
+               #t))))))
+    (home-page "https://apps.kde.org/dragonplayer/")
     (synopsis "Simple video player")
     (description "Dragon Player is a multimedia player where the focus is on
 simplicity, instead of features.  Dragon Player does one thing, and only one
@@ -140,14 +154,14 @@ This package is part of the KDE multimedia module.")
 (define-public elisa
   (package
     (name "elisa")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/elisa-" version ".tar.xz"))
        (sha256
-        (base32 "02450lsnbd37fms1i2bb9qc9wir4vym6qqd9p5hr6a6s6qwfs6qf"))))
+        (base32 "1v2h7ayyrv6f6hdkl78x1nrv5x0l6n8dh0xrfm5fnii4f694iik8"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config dbus kdoctools
@@ -163,6 +177,7 @@ This package is part of the KDE multimedia module.")
            kdeclarative
            kfilemetadata
            ki18n
+           kiconthemes
            kio
            kirigami
            kmediaplayer
@@ -170,7 +185,7 @@ This package is part of the KDE multimedia module.")
            kpackage
            kwidgetsaddons
            kxmlgui
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            phonon
            qtbase-5
            qtdeclarative-5
@@ -183,7 +198,8 @@ This package is part of the KDE multimedia module.")
            ;; TODO: upnpqt https://gitlab.com/homeautomationqt/upnp-player-qt
            vlc))
     (arguments
-     `(#:phases
+     `(#:tests? #f ;; many tests fail
+       #:phases
        (modify-phases %standard-phases
          (add-before 'check 'start-xorg-server
            (lambda* (#:key inputs #:allow-other-keys)
@@ -198,7 +214,7 @@ This package is part of the KDE multimedia module.")
                (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
                (invoke "dbus-launch" "make" test-target))
              #t)))))
-    (home-page "https://kde.org/applications/multimedia/org.kde.elisa")
+    (home-page "https://apps.kde.org/elisa/")
     (synopsis "Powerful music player for Plasma 5")
     (description "Elisa is a simple music player aiming to provide a nice
 experience for its users.  Elisa browses music by album, artist or
@@ -211,20 +227,20 @@ its own database.  You can build and play your own playlist.")
 (define-public ffmpegthumbs
   (package
     (name "ffmpegthumbs")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/ffmpegthumbs-" version ".tar.xz"))
        (sha256
-        (base32 "17l50z33a1h5zkrrfkb261yi2hms66qj36l1mndq7mvs97y2ggmc"))))
+        (base32 "1jl7l3n2lfg71kbzwjn5nrm3qlgilhnvs67iil162mnv52gf3c0v"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
     (inputs
-     (list ffmpeg kconfig ki18n kio qtbase-5))
-    (home-page "https://kde.org/applications/multimedia/org.kde.ffmpegthumbs")
+     (list ffmpeg kconfig ki18n kio taglib qtbase-5))
+    (home-page "https://apps.kde.org/ffmpegthumbs/")
     (synopsis "Video thumbnail generator for KDE using ffmpeg")
     (description "
 FFMpegThumbs is a video thumbnail generator for KDE file managers
@@ -237,14 +253,14 @@ This package is part of the KDE multimedia module.")
 (define-public juk
   (package
     (name "juk")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/juk-" version ".tar.xz"))
        (sha256
-        (base32 "06vsh7knyhcbcbf632jhldbqpzfkdyils2l8dbcdw5nj5hhgzzmr"))))
+        (base32 "12pnbx17r1103w39gglybdzs8kcpwghy5lc4q9fqk89s1r7l3c7h"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -265,13 +281,13 @@ This package is part of the KDE multimedia module.")
            kwidgetsaddons
            kwindowsystem
            kxmlgui
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            phonon
            phonon-backend-gstreamer
            qtbase-5
            qtsvg-5
            taglib))
-    (home-page "https://kde.org/applications/multimedia/org.kde.juk")
+    (home-page "https://apps.kde.org/juk/")
     (synopsis "Music jukebox / music player")
     (description "JuK is a powerful music player capable of managing a large
 music collection.
@@ -291,7 +307,7 @@ This package is part of the KDE multimedia module.")
 (define-public kid3
   (package
     (name "kid3")
-    (version "3.9.0")
+    (version "3.9.1")
     (source
      (origin
        (method git-fetch)
@@ -300,7 +316,7 @@ This package is part of the KDE multimedia module.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "02r3cnwr05mcxjawzip3jl1lfijvzfbbafq3saipjjjp4kiq9bk4"))))
+        (base32 "1rq0742rm3y5ps7878qd7xhhiizy6d6ls6hdjqa6z5sq077s5lz9"))))
     (build-system qt-build-system)
     (arguments
      (list
@@ -349,14 +365,14 @@ variety of formats.")
 (define-public k3b
   (package
     (name "k3b")
-    (version "20.04.2")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/k3b-" version ".tar.xz"))
        (sha256
-        (base32 "15wm987hz6rfs9ds9l1gbs6gdsardj1ywvk6zmpvj2i2190y4b3q"))))
+        (base32 "1bizk66ad2yq8xszjqvv2ghk069d0l6iczn5rlna1p3zigr43ysl"))))
     (build-system qt-build-system)
     (arguments
      `(#:phases
@@ -430,14 +446,14 @@ variety of formats.")
            libsamplerate
            libsndfile
            libvorbis
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            qtbase-5
            shared-mime-info
            solid
            sox
            taglib
            zlib))
-    (home-page "https://kde.org/applications/multimedia/org.kde.k3b")
+    (home-page "https://apps.kde.org/k3b/")
     (synopsis "Sophisticated CD/DVD burning application")
     (description "K3b is CD-writing software which intends to be feature-rich
 and provide an easily usable interface.  Features include burning audio CDs
@@ -473,7 +489,7 @@ available CD drives.")
            kwindowsystem
            kxmlgui
            libxscrnsaver
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            qtbase-5
            qtx11extras
            solid
@@ -488,7 +504,7 @@ available CD drives.")
                (("\\s*qPrintable\\(transponder\\.getTransmissionType\\(\\)\\)\\);")
                  "transponder.getTransmissionType());"))
              #t)))))
-    (home-page "https://kde.org/applications/multimedia/org.kde.kaffeine")
+    (home-page "https://apps.kde.org/kaffeine/")
     (synopsis "Versatile media player for KDE")
     (description "Kaffeine is a media player for KDE.  While it supports
 multiple Phonon backends, its default backend is Xine, giving Kaffeine a wide
@@ -503,14 +519,14 @@ autoloading of subtitle files for use while playing video.")
 (define-public kamoso
   (package
     (name "kamoso")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kamoso-" version ".tar.xz"))
        (sha256
-        (base32 "0c47j315kjfikd3b6x18786k3gqymicjjslpm0a58zdxl3wpqfay"))))
+        (base32 "0br7dbnm2ypdl55pscp8wr0vwrgprycrxxj206b5r1l9ysx9aqip"))))
     (build-system qt-build-system)
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
@@ -526,7 +542,7 @@ autoloading of subtitle files for use while playing video.")
            kirigami
            knotifications
            kparts
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            purpose
            qtbase-5
            qtdeclarative-5
@@ -535,12 +551,8 @@ autoloading of subtitle files for use while playing video.")
            qtquickcontrols2-5 ; not listed as dependency
            qtx11extras))
     (arguments
-     (list #:tests? #f ; test program gets built, but is not found
-           #:configure-flags
-           #~(list (string-append "-DCMAKE_CXX_FLAGS=-I"
-                                  #$(this-package-input "gst-plugins-base")
-                                  "/include/gstreamer-1.0"))))
-    (home-page "https://kde.org/applications/multimedia/org.kde.kamoso")
+     (list #:tests? #f)) ; test program gets built, but is not found
+    (home-page "https://apps.kde.org/kamoso/")
     (synopsis "Take pictures and videos out of your webcam")
     (description "Kamoso is a simple and friendly program to use your
 camera.  Use it to take pictures and make videos to share.")
@@ -550,14 +562,14 @@ camera.  Use it to take pictures and make videos to share.")
 (define-public kmix
   (package
     (name "kmix")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kmix-" version ".tar.xz"))
       (sha256
-       (base32 "1na52ypp57wqrc6pl1khinx9i6fidv1k97nnxcy8zb4l7d5sh1nd"))))
+       (base32 "0zc96l9mnn763pw54ki715sw3wm4z6rjdz2zzsjc6l5iwcqzwqq8"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools pkg-config))
@@ -578,12 +590,12 @@ camera.  Use it to take pictures and make videos to share.")
            kwindowsystem
            kxmlgui
            libcanberra
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            plasma-framework
            pulseaudio
            qtbase-5
            solid))
-    (home-page "https://kde.org/applications/multimedia/org.kde.kmix")
+    (home-page "https://apps.kde.org/kmix/")
     (synopsis "Volume control and mixer")
     (description "KMix is an audio device mixer, used to adjust volume, select
 recording inputs, and set other hardware options.
@@ -593,54 +605,59 @@ This package is part of the KDE multimedia module.")
      (list license:gpl2+ license:lgpl2.0+ license:fdl1.2+))))
 
 (define-public kmplayer
-  (package
-    (name "kmplayer")
-    (version "0.12.0b")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "mirror://kde/stable/kmplayer/0.12"
-                           "/kmplayer-" version ".tar.bz2"))
-       (sha256
-        (base32 "0wzdxym4fc83wvqyhcwid65yv59a2wvp1lq303cn124mpnlwx62y"))
-       (patches (search-patches
-                 "kmplayer-aarch64.patch"
-                 "kmplayer-upstream_Fix-build-with-Qt-5.9.patch"))))
-    (build-system qt-build-system)
-    (native-inputs
-     (list extra-cmake-modules pkg-config kdoctools))
-    (inputs
-     (list kconfig
-           kcoreaddons
-           kdelibs4support
-           ki18n
-           kinit
-           kio
-           kparts
-           kmediaplayer
-           kwidgetsaddons
-           libxcb ;; FIXME: why does cmake not find XEVIE and XPRINT?
-           oxygen-icons ; default icon set
-           phonon
-           qtbase-5
-           cairo
-           qtsvg-5
-           qtx11extras
-           xcb-util
-           xcb-util-cursor
-           xcb-util-errors
-           xcb-util-image
-           xcb-util-keysyms
-           xcb-util-wm))
-    (arguments
-     (list #:configure-flags
-           #~(list (string-append
-                    "-DCMAKE_CXX_FLAGS=-I"
-                    #$(this-package-input "qtx11extras")
-                    "/include/qt5"))))
-    (home-page "https://apps.kde.org/kmplayer/")
-    (synopsis "Media player using mplayer/phonon as backend")
-    (description "Kmplayer can play all the audio/video supported by
+  ;; The latest release was in 2016, and does not work with the newer
+  ;; KDE libraries.
+  (let ((commit "88e85308b71dc5e58cc655b5b9a13cd71b78233f")
+        (revision "1"))
+    (package
+      (name "kmplayer")
+      (version (git-version "0.12.0b" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://invent.kde.org/multimedia/kmplayer")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1pzk0js499diqabpwxjq6nnwpmj1ikpyyykzjbm844xcbm74cl19"))))
+      (build-system qt-build-system)
+      (native-inputs
+       (list extra-cmake-modules pkg-config kdoctools))
+      (inputs
+       (list kbookmarks
+             kconfig
+             kcoreaddons
+             kdelibs4support
+             ki18n
+             kinit
+             kio
+             kparts
+             kmediaplayer
+             kwidgetsaddons
+             libxcb       ;; FIXME: why does cmake not find XEVIE and XPRINT?
+             breeze-icons ; default icon set
+             phonon
+             qtbase-5
+             cairo
+             qtsvg-5
+             qtx11extras
+             xcb-util
+             xcb-util-cursor
+             xcb-util-errors
+             xcb-util-image
+             xcb-util-keysyms
+             xcb-util-wm))
+      (arguments
+       (list #:configure-flags
+             #~(list (string-append
+                      "-DCMAKE_CXX_FLAGS=-I"
+                      #$(this-package-input "qtx11extras")
+                      "/include/qt5"))))
+      (home-page "https://apps.kde.org/kmplayer/")
+      (synopsis "Media player using mplayer/phonon as backend")
+      (description "Kmplayer can play all the audio/video supported by
 mplayer/phonon from a local file or URL and be embedded in Konqueror and
 KHTML.  It also plays DVDs.
 
@@ -654,20 +671,20 @@ Some features:
 @item Broadcasting, http streaming, using ffserver/ffmpeg
 @item For TV sources, you need v4lctl (part of the xawtv package)
 @end itemize")
-    (license ;; GPL for programs, LGPL for libraries, FDL for documentation
-     (list license:gpl2+ license:lgpl2.0+ license:fdl1.2+))))
+      (license ;; GPL for programs, LGPL for libraries, FDL for documentation
+       (list license:gpl2+ license:lgpl2.0+ license:fdl1.2+)))))
 
 (define-public kwave
   (package
     (name "kwave")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kwave-" version ".tar.xz"))
        (sha256
-        (base32 "0ysa873pc2gip95cxr8yv7ifd9qql5zg6h67i9n9q3iqa6v58iyw"))))
+        (base32 "0j6ck44lkfcnaa0rymv2aqvdcy0zbybbklm1s6mvbgdpfsh0rhkm"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules (librsvg-for-system) pkg-config kdoctools))
@@ -694,12 +711,12 @@ Some features:
            libsamplerate
            libvorbis
            opus
-           oxygen-icons ; default icon set
+           breeze-icons ; default icon set
            pulseaudio
            qtbase-5
            qtmultimedia-5
            zlib))
-    (home-page "https://kde.org/applications/multimedia/org.kde.kwave")
+    (home-page "https://apps.kde.org/kwave/")
     (synopsis "Sound editor for KDE")
     (description "Kwave is a sound editor designed for the KDE Desktop
 Environment.
@@ -734,14 +751,14 @@ Its features include:
 (define-public libkcddb
   (package
     (name "libkcddb")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libkcddb-" version ".tar.xz"))
        (sha256
-        (base32 "1fwryaj8ldmsqhl5qxjda8by9i7xlb97r8p9rqzckw697hkfhs0h"))))
+        (base32 "1js5r8hxqabnygmavfjvjbfy5c7978bmwm2rqlgsfyn17fkmf2y8"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -764,14 +781,14 @@ Its features include:
 (define-public libkcompactdisc
   (package
     (name "libkcompactdisc")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libkcompactdisc-" version ".tar.xz"))
        (sha256
-        (base32 "0iy4i0hxqsrnndd4iqkww7v1rqry7kvi5paxdw5qjfffwn8kcsbx"))))
+        (base32 "0fv9dbx74xs42iiw67bvjpxga0d126q2nfs8n4hiv3z2xda9n4ic"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
diff --git a/gnu/packages/kde-pim.scm b/gnu/packages/kde-pim.scm
index 1ed90b95c1..fc3e7069f1 100644
--- a/gnu/packages/kde-pim.scm
+++ b/gnu/packages/kde-pim.scm
@@ -45,14 +45,14 @@
 (define-public akonadi
   (package
     (name "akonadi")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akonadi-" version ".tar.xz"))
        (sha256
-        (base32 "0kkn7lh3akkk9cdi8qdk9kqzs1cgv916mkl440x4ykqd1v8brzqb"))
+        (base32 "0g277jl2ay00p4yhkadvzjn1k2rkriz90ql2qcp5d4fjgs0220ky"))
        (patches (search-patches
                  "akonadi-paths.patch"
                  "akonadi-timestamps.patch"
@@ -90,9 +90,7 @@
        (modify-phases (@ (guix build qt-build-system) %standard-phases)
          (add-before 'configure 'add-definitions
            (lambda* (#:key outputs inputs #:allow-other-keys)
-             (let ((out   (assoc-ref outputs "out"))
-                   (mysql (assoc-ref inputs "mysql"))
-                   (pgsql (assoc-ref inputs "postgresql")))
+             (let ((out   (assoc-ref outputs "out")))
                (with-output-to-file "CMakeLists.txt.new"
                  (lambda _
                    (display
@@ -104,8 +102,7 @@
                    (display
                     (call-with-input-file "CMakeLists.txt"
                       get-string-all))))
-               (rename-file "CMakeLists.txt.new" "CMakeLists.txt"))
-             #t)))))
+               (rename-file "CMakeLists.txt.new" "CMakeLists.txt")))))))
     (home-page "https://kontact.kde.org/components/akonadi/")
     (synopsis "Extensible cross-desktop storage service for PIM")
     (description "Akonadi is an extensible cross-desktop Personal Information
@@ -120,14 +117,14 @@ programs.")
 (define-public akonadi-calendar
   (package
     (name "akonadi-calendar")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akonadi-calendar-" version ".tar.xz"))
        (sha256
-        (base32 "1mq76qyd3jcngb2yfanpn7qvklzllza399fxwii0mqppp1vmnb2b"))))
+        (base32 "0hcc2hpyhpd7219my7hpjcl24gsr9g8d2bwhlc66da96ray0pzg4"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -136,10 +133,13 @@ programs.")
            akonadi-contacts
            akonadi-mime
            boost
+           grantlee
+           grantleetheme
            kcalendarcore
            kcalutils
            kcodecs
            kcontacts
+           kdbusaddons
            ki18n
            kiconthemes
            kidentitymanagement
@@ -147,6 +147,7 @@ programs.")
            kitemmodels
            kmailtransport
            kmime
+           knotifications
            kpimtextedit
            ksmtp
            ktextwidgets
@@ -163,21 +164,24 @@ collection and item views.")
 (define-public akonadi-contacts
   (package
     (name "akonadi-contacts")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akonadi-contacts-" version ".tar.xz"))
        (sha256
-        (base32 "0igggarnl99s5pl73dgrpha4lf7vnr000iy69vcwmqs5lxb7cyli"))))
+        (base32 "080ba08sxb79il7na97m56k3gpwc8pj4bljca3qgw5kwhswj6gnx"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
     (inputs
      (list akonadi
            boost
+           grantlee
+           grantleetheme
            kauth
+           kcmutils
            kcodecs
            kcompletion
            kconfigwidgets
@@ -194,6 +198,7 @@ collection and item views.")
            ktextwidgets
            kwidgetsaddons
            kxmlgui
+           libkleo
            prison
            kio
            qtbase-5
@@ -214,14 +219,14 @@ to list and filter contacts.")
 (define-public akonadi-mime
   (package
     (name "akonadi-mime")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akonadi-mime-" version ".tar.xz"))
        (sha256
-        (base32 "1wd776ia3z22a79biq04y4m83n8xpvfmyg8bcsslr7lmc3avdg8w"))))
+        (base32 "1qggacdhj5b5vrhwp1srlrhapl13hcc5d1ff5wlsdip87in4jad1"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules libxslt ;; xslt for generating interface descriptions
@@ -249,12 +254,10 @@ to list and filter contacts.")
              (let ((plugins-dir "/tmp/.local/share/akonadi/plugins/serializer"))
                (mkdir-p plugins-dir)
                (copy-file "serializers/akonadi_serializer_mail.desktop"
-                          (string-append plugins-dir "/akonadi_serializer_mail.desktop")))
-             #t))
+                          (string-append plugins-dir "/akonadi_serializer_mail.desktop")))))
          (add-before 'check 'check-setup
            (lambda _
-             (setenv "HOME" "/tmp")
-             #t)))))
+             (setenv "HOME" "/tmp"))))))
     (synopsis "Akonadi MIME handling library")
     (description "Akonadi Mime is a library that effectively bridges the
 type-agnostic API of the Akonadi client libraries and the domain-specific
@@ -266,14 +269,14 @@ with emails through Akonadi easier.")
 (define-public akonadi-notes
   (package
     (name "akonadi-notes")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akonadi-notes-" version ".tar.xz"))
        (sha256
-        (base32 "04y293kjrmjjcbb7fkjl7hl4vrks4cjjxnvc6ibzyv81rn6cdhh2"))))
+        (base32 "0ps99717hvsq62fh3zagn5xgw5sc99naiiay5ym9wmfjvhr5slml"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -291,14 +294,14 @@ wrapping notes into KMime::Message objects.")
 (define-public akonadi-search
   (package
     (name "akonadi-search")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akonadi-search-" version ".tar.xz"))
        (sha256
-        (base32 "1h5p44y244gzf7ndzw7afrvq9c76ybp8ddvg82p3lzjh02rrvd50"))))
+        (base32 "0jpirnnpab6ki2gf5vlzklp04rwm05l8phlzajp2apcddb84lqvm"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules
@@ -330,12 +333,12 @@ wrapping notes into KMime::Message objects.")
                       ;; DBus communication.  See also 'korganizer'.
                       (substitute* "agent/autotests/CMakeLists.txt"
                         ((".*schedulertest\\.cpp.*")
-                         ""))
-                      #t))
+                         ""))))
                   (replace 'check
                     (lambda* (#:key tests? #:allow-other-keys)
                       (when tests?
-                        (invoke "dbus-launch" "ctest")))))))
+                        (invoke "dbus-launch" "ctest" "-E"
+                                "akonadi-sqlite-collectionindexingjobtest")))))))
     (home-page "https://api.kde.org/kdepim/akonadi/html/index.html")
     (synopsis "Akonadi search library")
     (description "This package provides a library used to search in the
@@ -346,46 +349,58 @@ Akonadi PIM data server.  It uses Xapian for indexing and querying.")
 (define-public kincidenceeditor
   (package
     (name "kincidenceeditor")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/incidenceeditor-" version ".tar.xz"))
        (sha256
-        (base32 "1xpp5lw60mvpjsjsxmicfa5y2d68wnb9vm4yb1krwkihm852ziny"))))
+        (base32 "0bm25r3l9d1qhlkxz7pd5hmg6xd0y651q8any4q71bd6a023ps0b"))))
     (properties `((upstream-name . "incidenceeditor")))
     (build-system qt-build-system)
     (native-inputs
-     (list extra-cmake-modules))
+     (list extra-cmake-modules dbus))
     (inputs
      (list akonadi
            akonadi-calendar
            akonadi-contacts
            akonadi-mime
            boost
+           grantlee
+           grantleetheme
            kcalendarcore
            kcalendarsupport
            kcalutils
            kcodecs
            kcontacts
            kdbusaddons
-           kdepim-apps-libs
            kdiagram
            keventviews
            ki18n
            kiconthemes
            kidentitymanagement
+           kimap
            kio
            kitemmodels
            kldap
            kmailtransport
            kmime
+           kpimcommon
            kpimtextedit
            ktextwidgets
            kwallet
            libkdepim
            qtbase-5))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "dbus-launch" "ctest" ;; FIXME: tests fails.
+                       "-E"
+					   "(akonadi-sqlite-incidencedatetimetest|ktimezonecomboboxtest|testindividualmaildialog)")))))))
     (home-page "https://invent.kde.org/pim/incidenceeditor")
     (synopsis "KDE PIM library for editing incidences")
     (description "This library provides an incidence editor for KDE PIM.")
@@ -395,17 +410,17 @@ Akonadi PIM data server.  It uses Xapian for indexing and querying.")
 (define-public kaddressbook
   (package
     (name "kaddressbook")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kaddressbook-" version ".tar.xz"))
        (sha256
-        (base32 "1vpdhdj87ai2sxjn2jk3mh6bzfr1n3yzydnkgv7nc8v1m2fdawap"))))
+        (base32 "18f6xjcmqgslrw12dik9immw3mw0krvzi6y6f0ryr2ry1shqvivb"))))
     (build-system qt-build-system)
     (native-inputs
-     (list extra-cmake-modules))
+     (list extra-cmake-modules kdoctools))
     (inputs
      (list akonadi
            akonadi-contacts
@@ -421,8 +436,6 @@ Akonadi PIM data server.  It uses Xapian for indexing and querying.")
            kcontacts
            kcrash
            kdbusaddons
-           kdepim-apps-libs
-           kdoctools
            ki18n
            kiconthemes
            kimap
@@ -437,7 +450,7 @@ Akonadi PIM data server.  It uses Xapian for indexing and querying.")
            kxmlgui
            libkdepim
            libkleo
-           oxygen-icons ; default icon set, required for tests
+           breeze-icons ; default icon set, required for tests
            prison
            qgpgme
            qtbase-5))
@@ -449,58 +462,17 @@ NextCloud, Kolab, Google Contacts, Microsoft Exchange (EWS) or any standard
 CalDAV server.")
     (license (list license:gpl2+ license:lgpl2.0+ license:fdl1.2+))))
 
-(define-public kalarmcal
-  (package
-    (name "kalarmcal")
-    (version "20.04.1")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "mirror://kde/stable/release-service/" version
-                           "/src/kalarmcal-" version ".tar.xz"))
-       (sha256
-        (base32 "0g0bm4zzzcpl2pqqf609349zagwrgj6a4ibxpgg4zf21aacdq8bi"))))
-    (build-system qt-build-system)
-    (native-inputs
-     (list extra-cmake-modules))
-    (inputs
-     (list akonadi
-           boost
-           kcalendarcore
-           kcalutils
-           kcompletion
-           kconfig
-           kconfigwidgets
-           kcoreaddons
-           kdbusaddons
-           kholidays
-           ki18n
-           kidentitymanagement
-           kio
-           kitemmodels
-           kpimtextedit
-           ktextwidgets
-           kxmlgui
-           qtbase-5))
-    (arguments
-     `(#:tests? #f)) ;; TODO: TZ setup
-    (home-page "https://api.kde.org/stable/kdepimlibs-apidocs/")
-    (synopsis "Library for handling kalarm calendar data")
-    (description "This library provides access to and handling of kalarm
-calendar data.")
-    (license  license:lgpl2.0+)))
-
 (define-public kblog
   (package
     (name "kblog")
-    (version "20.04.1")
+    (version "20.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kblog-" version ".tar.xz"))
        (sha256
-        (base32 "0pi3axs58wsz5vq6vyisz73s24q739zplwrblyvkcm16nll4mvhk"))))
+        (base32 "1d5r9ivc1xmhkrz780xga87p84h7dnxjl981qap16gy37sxahcjr"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -527,14 +499,14 @@ one of the APIs mentioned above.")
 (define-public kcalendarsupport
   (package
     (name "kcalendarsupport")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/calendarsupport-" version ".tar.xz"))
        (sha256
-        (base32 "1yv3hs7qw481cxw4kzbx5l8vv18bgzm1b0vj3zrlqqxwl5ac6xvy"))))
+        (base32 "05x5ps15hkbv0cm4am859wzf6r5yiyaadidw3617qcim4sh5smqd"))))
     (properties `((upstream-name . "calendarsupport")))
     (build-system qt-build-system)
     (native-inputs
@@ -543,12 +515,12 @@ one of the APIs mentioned above.")
      (list akonadi
            akonadi-calendar
            akonadi-mime
+           akonadi-notes
            boost
            kcalendarcore
            kcalutils
            kcompletion
            kdbusaddons
-           kdepim-apps-libs
            kguiaddons
            kholidays
            ki18n
@@ -572,14 +544,14 @@ calendaring applications.")
 (define-public kcalutils
   (package
     (name "kcalutils")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kcalutils-" version ".tar.xz"))
        (sha256
-        (base32 "0v268w8vhgqxq1nwv9b9cy4h7zqgjrv19r44g3zc9w5j76ivix86"))))
+        (base32 "1vv2nv4yc2hwi31b9k0jcxmxgbpaalmdc06jhbcq8qbi20pj70kh"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules libxml2)) ;; xmllint required for tests
@@ -596,7 +568,7 @@ calendaring applications.")
            kpimtextedit
            ktextwidgets
            kwidgetsaddons
-           oxygen-icons ; default icon set, required for tests
+           breeze-icons ; default icon set, required for tests
            qtbase-5))
     (arguments
      `(#:tests? #f)) ;; TODO: seem to pull in some wrong theme
@@ -607,61 +579,17 @@ data")
 functions for accessing calendar data using the kcalcore API.")
     (license  license:lgpl2.0+)))
 
-(define-public kdepim-apps-libs
-  (package
-    (name "kdepim-apps-libs")
-    (version "20.04.1")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "mirror://kde/stable/release-service/" version
-                           "/src/kdepim-apps-libs-" version ".tar.xz"))
-       (sha256
-        (base32 "0m9qrfjs97anh9h6ibggx23ddlm1zkxjap2iyf3gf672ip01fvci"))))
-    (build-system qt-build-system)
-    (native-inputs
-     (list extra-cmake-modules))
-    (inputs
-     (list akonadi
-           akonadi-contacts
-           boost
-           gpgme
-           grantlee
-           grantleetheme
-           kconfig
-           kconfigwidgets
-           kcontacts
-           kcoreaddons
-           ki18n
-           kimap
-           kio
-           kitemmodels
-           kmime
-           kpimcommon
-           kservice
-           kwidgetsaddons
-           libkleo
-           prison
-           qgpgme
-           qtbase-5))
-    (home-page "https://invent.kde.org/pim/kdepim-apps-libs")
-    (synopsis "KDE PIM mail related libraries and data files")
-    (description "This package provides mail related libraries and data files
-for KDE PIM.")
-    (license ;; GPL for programs, LGPL for libraries
-     (list license:gpl2+ license:lgpl2.0+))))
-
 (define-public kdepim-runtime
   (package
     (name "kdepim-runtime")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kdepim-runtime-" version ".tar.xz"))
        (sha256
-        (base32 "1in4x4wvgclkni72cfkw9jx35d0qd0jmfwybm3ksx5qx5sbki9gg"))))
+        (base32 "1lhkcfdjnxlm8amfczw4pi41grlq951pd67cj1z51whs6b84an27"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules dbus kdoctools libxslt shared-mime-info))
@@ -673,9 +601,11 @@ for KDE PIM.")
            akonadi-notes
            boost
            cyrus-sasl
-           kalarmcal
+           grantlee
+           grantleetheme
            kcalendarcore
            kcalutils
+           kcmutils
            kcodecs
            kconfig
            kconfigwidgets
@@ -687,6 +617,7 @@ for KDE PIM.")
            kio
            kitemmodels
            kmailtransport
+           kldap
            kmbox
            kmime
            knotifications
@@ -697,11 +628,13 @@ for KDE PIM.")
            ktextwidgets
            kwallet
            kwindowsystem
+           libkdepim
            libkgapi
            ;; TODO: libkolab
            qca
            qtbase-5
            qtdeclarative-5
+           qtkeychain
            qtnetworkauth-5
            qtspeech
            qtwebchannel-5
@@ -710,8 +643,7 @@ for KDE PIM.")
     (arguments
       ;; TODO: 5/45 tests fail for quite different reasons, even with
       ;; "offscreen" and dbus
-     `(#:tests? #f
-       #:phases (modify-phases %standard-phases
+     `(#:phases (modify-phases %standard-phases
                   (add-after 'set-paths 'extend-CPLUS_INCLUDE_PATH
                     (lambda* (#:key inputs #:allow-other-keys)
                       ;; FIXME: <Akonadi/KMime/SpecialMailCollections> is not
@@ -719,8 +651,18 @@ for KDE PIM.")
                       ;; this hack.
                       (setenv "CPLUS_INCLUDE_PATH"
                               (string-append
-                               (search-input-directory inputs "include/KF5")
-                               ":" (or (getenv "CPLUS_INCLUDE_PATH") ""))))))))
+                               (assoc-ref inputs "akonadi-mime") "/include/KF5:"
+                               (or (getenv "CPLUS_INCLUDE_PATH") "")))))
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (when tests?
+                        ;; FIXME: Atleast some appear to require network.
+                        (invoke "dbus-launch" "ctest" "-E" "\
+(akonadi-sqlite-synctest|akonadi-sqlite-pop3test|storecompacttest\
+|akonadi-sqlite-ewstest|ewsmoveitemrequest_ut|ewsdeleteitemrequest_ut\
+|ewsgetitemrequest_ut|ewsunsubscriberequest_ut|ewssettings_ut\
+|templatemethodstest|akonadi-sqlite-serverbusytest|ewsattachment_ut|\\
+testmovecollectiontask)")))))))
     (home-page "https://invent.kde.org/pim/kdepim-runtime")
     (synopsis "Runtime components for Akonadi KDE")
     (description "This package contains Akonadi agents written using KDE
@@ -735,14 +677,14 @@ package.")
 (define-public keventviews
   (package
     (name "keventviews")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/eventviews-" version ".tar.xz"))
        (sha256
-        (base32 "0si9p95rgp7mgkzhzwyy10zrwzy1kipbhm1y96yjlc9rxi3jrc73"))))
+        (base32 "1346k5fvjdgxhfjhf0mbc7s559ampxc2vfg0i4wk1a6n6d4jpmcr"))))
     (properties `((upstream-name . "eventviews")))
     (build-system qt-build-system)
     (native-inputs
@@ -784,23 +726,34 @@ package.")
 (define-public kgpg
   (package
     (name "kgpg")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kgpg-" version ".tar.xz"))
        (sha256
-        (base32 "03d3gsbara7ga2cyrhafkw11qq9cj804h9vpvxl4wd2a9c90snkh"))))
+        (base32 "196xgbvc68jzacal4wwxgdrwxyiyr49hq0h2dwpzq5yhpfh3fcrw"))))
     (build-system qt-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "dbus-launch" "ctest" "-E" ;; FIXME: Failing tests.
+                       "(kgpg-import|kgpg-disable)")))))))
     (native-inputs
      (list extra-cmake-modules gnupg ;; TODO: Remove after gpgme uses fixed path
+           dbus ;; Remove after failing test passes
            kdoctools))
     (inputs
      (list akonadi
            akonadi-contacts
            boost
            gpgme
+           grantlee
+           grantleetheme
            karchive
            kcodecs
            kcontacts
@@ -818,7 +771,7 @@ package.")
            kwidgetsaddons
            kwindowsystem
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
     (home-page "https://apps.kde.org/kgpg/")
     (synopsis "Graphical front end for GNU Privacy Guard")
@@ -831,14 +784,14 @@ cryptography to the contents of the clipboard.")
 (define-public kidentitymanagement
   (package
     (name "kidentitymanagement")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kidentitymanagement-" version ".tar.xz"))
        (sha256
-        (base32 "0flp9p9hlr1zfgvsy5i1nq55p7bvnhqxkxbif1lyw0cq6iblxhgr"))))
+        (base32 "0z1ixwlrdm7dzfxszphf2wma0gjprr0143c46li79g5gzvcrid8w"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -859,8 +812,7 @@ cryptography to the contents of the clipboard.")
        (modify-phases %standard-phases
          (add-before 'check 'set-home
            (lambda _
-             (setenv "HOME" "/tmp/dummy-home") ;; FIXME: what is this?
-             #t)))))
+             (setenv "HOME" "/tmp/dummy-home")))))) ;; FIXME: what is this?
     (home-page "https://kontact.kde.org/")
     (synopsis "Library for shared identities between mail applications")
     (description "This library provides an API for managing user identities.")
@@ -870,14 +822,14 @@ cryptography to the contents of the clipboard.")
 (define-public kimap
   (package
     (name "kimap")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kimap-" version ".tar.xz"))
        (sha256
-        (base32 "1x22wfzqp92mn1fy2xl89k9yjfk2vgcva0fd30i9rrqj4aw2rsma"))))
+        (base32 "1k5h7jmzxg8wq58iqk0f1gx5r45pr2895vl7y5ihyav9w0qfqcn0"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -901,24 +853,24 @@ easier to do so.")
 (define-public kldap
   (package
     (name "kldap")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kldap-" version ".tar.xz"))
        (sha256
-        (base32 "0whlp586ycsx0qf0nr81avwscpq62w5js46z7vayy0dxkhrhfayr"))))
+        (base32 "024xgjffz5n8zz6js06i78pf8s3nd5sbmvhzz7bm3qc05xqxyp75"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
     (inputs
-     (list ki18n kio kwidgetsaddons qtbase-5))
+     (list ki18n kio kwidgetsaddons qtbase-5 qtkeychain))
     (propagated-inputs
      (list cyrus-sasl openldap))
     (home-page "https://api.kde.org/kdepim/kldap/html/index.html")
     (synopsis "Library for accessing LDAP")
-    (description " This is a library for accessing LDAP with a convenient Qt
+    (description "This is a library for accessing LDAP with a convenient Qt
 style C++ API.  LDAP (Lightweight Directory Access Protocol) is an application
 protocol for querying and modifying directory services running over TCP/IP.")
     (license license:lgpl2.0+)))
@@ -926,14 +878,14 @@ protocol for querying and modifying directory services running over TCP/IP.")
 (define-public kleopatra
   (package
     (name "kleopatra")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kleopatra-" version ".tar.xz"))
        (sha256
-        (base32 "1m50nzb2m27fkb8z3k34cv4zi2akr0fx8zn7lk5swhg49sgrip6n"))))
+        (base32 "1dp421hniyknggirpqqdb7pmsrbidz9qshmd3qnsqvcr9pz301d5"))))
     (build-system qt-build-system)
     (native-inputs
      (list dbus extra-cmake-modules gnupg ;; TODO: Remove after gpgme uses fixed path
@@ -959,7 +911,7 @@ protocol for querying and modifying directory services running over TCP/IP.")
            kxmlgui
            libassuan
            libkleo
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qgpgme
            qtbase-5))
     (arguments
@@ -968,8 +920,7 @@ protocol for querying and modifying directory services running over TCP/IP.")
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
-               (invoke "dbus-launch" "ctest" "."))
-             #t)))))
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://apps.kde.org/kleopatra/")
     (synopsis "Certificate Manager and Unified Crypto GUI")
     (description "Kleopatra is a certificate manager and a universal crypto
@@ -981,15 +932,14 @@ and retrieving certificates from LDAP servers.")
 (define-public kmail
   (package
     (name "kmail")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kmail-" version ".tar.xz"))
        (sha256
-        (base32 "06qfxzi5pasm6p5ck44sjca96dz8xzd1nndq5lqcyvcxmmnvvz3p"))
-       (patches (search-patches "kmail-Fix-missing-link-libraries.patch"))))
+        (base32 "0x2d8w8hlb62h9q9qkh3cwyg7pwwl7px1rf89vyfp9arfbs030dq"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules dbus kdoctools))
@@ -1000,6 +950,8 @@ and retrieving certificates from LDAP servers.")
            akonadi-search
            boost
            gpgme
+           grantlee
+           grantleetheme
            kbookmarks
            kcalendarcore
            kcalutils
@@ -1010,7 +962,6 @@ and retrieving certificates from LDAP servers.")
            kcontacts
            kcrash
            kdbusaddons
-           kdepim-apps-libs
            kguiaddons
            ki18n
            kiconthemes
@@ -1025,7 +976,6 @@ and retrieving certificates from LDAP servers.")
            kmailtransport
            kmessagelib
            kmime
-           kmime
            knotifications
            knotifyconfig
            kontactinterface
@@ -1035,6 +985,7 @@ and retrieving certificates from LDAP servers.")
            kservice
            ksyntaxhighlighting
            ktextwidgets
+           kuserfeedback
            ktnef
            kwallet
            kwidgetsaddons
@@ -1044,10 +995,11 @@ and retrieving certificates from LDAP servers.")
            libkdepim
            libkleo
            libksieve
-           oxygen-icons ; default icon set, required for tests
+           breeze-icons ; default icon set, required for tests
            qgpgme
            qtbase-5
            qtdeclarative-5
+           qtkeychain
            qtwebchannel-5
            qtwebengine-5
            sonnet))
@@ -1057,8 +1009,14 @@ and retrieving certificates from LDAP servers.")
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
-               (invoke "dbus-launch" "ctest" "."))
-             #t)))))
+               (invoke "dbus-launch" "ctest" "-E" ;; FIXME: Many failing tests.
+                       "(akonadi-sqlite-kmcomposerwintest|\
+akonadi-sqlite-tagselectdialogtest|\
+akonadi-sqlite-kmcommandstest|\
+sendlateragent-sendlaterutiltest|\
+sendlateragent-sendlaterconfigtest|\
+followupreminder-followupreminderconfigtest|\
+akonadi-sqlite-unifiedmailboxmanagertest)")))))))
     (home-page "https://kontact.kde.org/components/kmail/")
     (synopsis "Full featured graphical email client")
     (description "KMail supports multiple accounts, mail filtering and email
@@ -1074,14 +1032,14 @@ manager from KDE.")
 (define-public kmailcommon
   (package
     (name "kmailcommon")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/mailcommon-" version ".tar.xz"))
        (sha256
-        (base32 "0q1k57zx1l7bnzrk1hadjxjn6r4yzz833mgsvaai9sd8qg022x2l"))))
+        (base32 "0vir2p7akihfzb86iwspz3k6j3psc6xxyak4x738dw3lhn22nfzb"))))
     (properties `((upstream-name . "mailcommon")))
     (build-system qt-build-system)
     (native-inputs
@@ -1092,6 +1050,8 @@ manager from KDE.")
            akonadi-mime
            boost
            gpgme
+           grantlee
+           grantleetheme
            karchive
            kcodecs
            kcompletion
@@ -1100,6 +1060,7 @@ manager from KDE.")
            kcontacts
            kdbusaddons
            kdesignerplugin
+           kguiaddons
            ki18n
            kiconthemes
            kidentitymanagement
@@ -1127,7 +1088,7 @@ manager from KDE.")
            qgpgme
            qtbase-5))
     (arguments
-     `(#:tests? #f))  ;; TODO: 4/56 tests fail, even with "offscreen" and dbus
+     `(#:tests? #f))  ;; TODO: 12/62 tests fail
     (home-page "https://invent.kde.org/pim/mailcommon")
     (synopsis "KDE email utility library")
     (description "The mail common library provides utility functions for
@@ -1138,32 +1099,40 @@ dealing with email.")
 (define-public kmailimporter
   (package
     (name "kmailimporter")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/mailimporter-" version ".tar.xz"))
        (sha256
-        (base32 "1929pw0shdzi0yvjnqhak680hjjibg8f8hqy3svyxxhiqbhfjm26"))))
+        (base32 "0hb4ba8vr7wrw8mcrc7hicl8f9r6ihsbwkxxr1qkzk0310yjmcbf"))))
     (properties `((upstream-name . "mailimporter")))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
     (inputs
      (list akonadi
+           akonadi-contacts
            akonadi-mime
+           grantlee
+           grantleetheme
            boost
            karchive
            kcompletion
            kconfig
            kconfigwidgets
+           kcontacts
            kcoreaddons
            kdbusaddons
            ki18n
+           kimap
            kio
            kitemmodels
            kmime
+           kpimcommon
+           kpimtextedit
+           ktextwidgets
            kxmlgui
            libkdepim
            qtbase-5))
@@ -1177,14 +1146,14 @@ e-mail client programs into KMail and KDE PIM.")
 (define-public kmailtransport
   (package
     (name "kmailtransport")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kmailtransport-" version ".tar.xz"))
        (sha256
-        (base32 "1swqlgzxzlqffm119sbhszy9lr93m8lzwygr0q4raa660b6yiavm"))))
+        (base32 "0fcgwln40d9h3r4m58mp4m79k425hianjz0ambqckdzp0aspkhzp"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -1206,7 +1175,8 @@ e-mail client programs into KMail and KDE PIM.")
            ktextwidgets
            kwallet
            libkgapi
-           qtbase-5))
+           qtbase-5
+           qtkeychain))
     (arguments
      `(#:tests? #f)) ;; TODO - 3/3 tests fail, require drkonqi
     (home-page "https://api.kde.org/kdepim/kmailtransport/html/index.html")
@@ -1218,14 +1188,14 @@ mail transport.")
 (define-public kmbox
   (package
     (name "kmbox")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kmbox-" version ".tar.xz"))
        (sha256
-        (base32 "03cny38v4y1lmcrs6d34hbj9assqgf51rqryf5rdzkiaq79c1krc"))))
+        (base32 "0d3i36zkn3apcjqkbsq633mgrk382xgx8knfg6fkyyc8i55p3dig"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1240,14 +1210,14 @@ using a Qt/KMime C++ API.")
 (define-public kmessagelib
   (package
     (name "kmessagelib")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/messagelib-" version ".tar.xz"))
        (sha256
-        (base32 "03vq4962bhps2j9c9i52majlbkmvg2gmr197igv8xamja1vs8hk1"))))
+        (base32 "06vsba8r9sh94y59hmkh8nbg8xhib83sv80qnfw4g9fv5gfjppjh"))))
     (properties `((upstream-name . "messagelib")))
     (build-system qt-build-system)
     (native-inputs
@@ -1270,7 +1240,7 @@ using a Qt/KMime C++ API.")
            kconfigwidgets
            kcontacts
            kdbusaddons
-           kdepim-apps-libs
+           kguiaddons
            ki18n
            kiconthemes
            kidentitymanagement
@@ -1284,6 +1254,7 @@ using a Qt/KMime C++ API.")
            kmbox
            kmime
            knewstuff
+           knotifications
            kpimcommon
            kpimtextedit
            kservice
@@ -1309,12 +1280,11 @@ using a Qt/KMime C++ API.")
                   (add-after 'set-paths 'extend-CPLUS_INCLUDE_PATH
                     (lambda* (#:key inputs #:allow-other-keys)
                       ;; FIXME: One of the compilation steps fail to find
-                      ;; <Libkdepim/MultiplyingLine> without this hack.
+                      ;; <QPrinter> without this hack.
                       (setenv "CPLUS_INCLUDE_PATH"
-                              (string-append
-                                (assoc-ref inputs "libkdepim")
-                                "/include/KF5:"
-                                (or (getenv "CPLUS_INCLUDE_PATH") ""))))))))
+                              (string-append (assoc-ref inputs "qtbase")
+                                             "/include/qt5/QtPrintSupport:"
+                                             (or (getenv "CPLUS_INCLUDE_PATH") ""))))))))
     (home-page "https://invent.kde.org/pim/messagelib")
     (synopsis "KDE PIM messaging libraries")
     (description "This package provides several libraries for messages,
@@ -1326,14 +1296,14 @@ kwebengineviewer.")
 (define-public kmime
   (package
     (name "kmime")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kmime-" version ".tar.xz"))
        (sha256
-        (base32 "1dkdxfr1ry10qyql5sp1ai4li11f0ncf9hipg27j59y70mlyrl2r"))))
+        (base32 "1k9lvq3a728015laj7rklg136hgg256l4snarnc5cw97ijqdm5ng"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1348,9 +1318,8 @@ kwebengineviewer.")
              ;; the Qt locale returns different. See kmime commit 3a9651d26a.
              (substitute* "autotests/dateformattertest.cpp"
                (("(Today|Yesterday) 12:34:56" line day)
-                (string-append day " 12:34 PM")))
-             #t)))))
-    (home-page "https://api.kde.org/kdepim/kmime/html/index.html")
+                (string-append day " 12:34 PM"))))))))
+    (home-page "https://api.kde.org/stable/kdepimlibs-apidocs/")
     (synopsis "Library for handling MIME data")
     (description "This library provides an API for handling MIME
 data.  MIME (Multipurpose Internet Mail Extensions) is an Internet Standard
@@ -1362,17 +1331,17 @@ information in non-ASCII character sets.")
 (define-public knotes
   (package
     (name "knotes")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/knotes-" version ".tar.xz"))
        (sha256
-        (base32 "13h4n7fb5p6g1f5kmw6pblpd76j904psm30s3a5d3kykni57dijx"))))
+        (base32 "1bbrcr2s5am7gq3im5s9kk63nrsgz0kfkm3qzhasafnz06zhf1vf"))))
     (build-system qt-build-system)
     (native-inputs
-     (list extra-cmake-modules libxslt))
+     (list extra-cmake-modules kdoctools libxslt))
     (inputs
      (list akonadi
            akonadi-contacts
@@ -1392,14 +1361,12 @@ information in non-ASCII character sets.")
            kcoreaddons
            kcrash
            kdnssd
-           kdoctools
            kglobalaccel
            kiconthemes
            kimap
            kitemmodels
            kitemviews
            kmime
-           kmime
            knewstuff
            knotifications
            knotifyconfig
@@ -1413,7 +1380,7 @@ information in non-ASCII character sets.")
            kxmlgui
            kxmlgui
            libkdepim
-           oxygen-icons ; default icon set, required for tests
+           breeze-icons ; default icon set, required for tests
            qtbase-5
            qtx11extras))
     (home-page "https://apps.kde.org/knotes/")
@@ -1434,14 +1401,14 @@ Features:
 (define-public kontactinterface
   (package
     (name "kontactinterface")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kontactinterface-" version ".tar.xz"))
        (sha256
-        (base32 "0s1qm1wjkvbb1film94r7g88d8vgh26bm0hm6gpyqv5bazw5qx3j"))))
+        (base32 "0npaxlrvgpg2p8wdaqs03k2gyppbid81k64q6cawin6wrn6zzc9m"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1462,14 +1429,14 @@ application \"Parts\" to be embedded as a Kontact component (or plugin).")
 (define-public korganizer
   (package
     (name "korganizer")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/korganizer-" version ".tar.xz"))
        (sha256
-        (base32 "04lz3ldrr0lpy9zpsg9ja1i9gxzlcjpqcwn3g7l4jjdky4frcr2r"))))
+        (base32 "0ypscdr0la4pdxz491mryjmg535d0g7c4r62y0l7an5g1ribrjq9"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules dbus qttools-5 kdoctools))
@@ -1481,6 +1448,8 @@ application \"Parts\" to be embedded as a Kontact component (or plugin).")
            akonadi-notes
            akonadi-search
            boost
+           grantlee
+           grantleetheme
            kcalendarcore
            kcalendarsupport
            kcalutils
@@ -1493,7 +1462,6 @@ application \"Parts\" to be embedded as a Kontact component (or plugin).")
            kcoreaddons
            kcrash
            kdbusaddons
-           kdepim-apps-libs
            keventviews
            kholidays
            kiconthemes
@@ -1518,7 +1486,7 @@ application \"Parts\" to be embedded as a Kontact component (or plugin).")
            kwindowsystem
            kxmlgui
            libkdepim
-           oxygen-icons ; default icon set, required for tests
+           breeze-icons ; default icon set, required for tests
            phonon
            qtbase-5))
     (arguments
@@ -1531,16 +1499,14 @@ application \"Parts\" to be embedded as a Kontact component (or plugin).")
              ;; See also 'akonadi-search' for a similar test failure.
              (substitute* "src/autotests/CMakeLists.txt"
                ((".*test_advanced\\(koeventpopupmenutest\\.cpp.*")
-                ""))
-             #t))
+                ""))))
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
-               (invoke "dbus-launch" "ctest" "."))
-             #t)))))
+               (invoke "dbus-launch" "ctest")))))))
     (home-page "https://apps.kde.org/korganizer/")
     (synopsis "Organizational assistant, providing calendars and other similar
-functionality to help you organize your life.")
+functionality to help you organize your life")
     (description "KOrganizer is the calendar and scheduling component of
 Kontact.  It provides management of events and tasks, alarm notification, web
 export, network transparent handling of data, group scheduling, import and
@@ -1569,8 +1535,7 @@ and exchanging calendar data, vCalendar and iCalendar.")
      '(#:phases (modify-phases %standard-phases
                   (replace 'check-setup
                     (lambda _
-                      (setenv "HOME" "/tmp")
-                      #t)))))
+                      (setenv "HOME" "/tmp"))))))
     (native-inputs
      (list extra-cmake-modules))
     (inputs
@@ -1585,14 +1550,14 @@ Virtual Contact File}) files to the KPeople contact management library.")
 (define-public kpimcommon
   (package
     (name "kpimcommon")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/pimcommon-" version ".tar.xz"))
        (sha256
-        (base32 "15lfqv5w4iwyjlvf4idykpkjgppl0ic59r4dw95qkbbjkps0nr7j"))))
+        (base32 "1xns3qc5n5fig898bsj3kzda6484n0r406km43gicnly1m7jpar9"))))
     (properties `((upstream-name . "pimcommon")))
     (build-system qt-build-system)
     (native-inputs
@@ -1602,9 +1567,13 @@ Virtual Contact File}) files to the KPeople contact management library.")
            akonadi
            akonadi-contacts
            akonadi-mime
+           akonadi-search
            boost
            grantlee
+           grantleetheme
            ;; TODO: ("kaccounts" ,kaccounts)
+           kcalendarcore
+           kcmutils
            kcodecs
            kconfig
            kconfigwidgets
@@ -1619,10 +1588,10 @@ Virtual Contact File}) files to the KPeople contact management library.")
            kitemmodels
            kitemviews
            kjobwidgets
+           kldap
            kmime
            knewstuff
            kpimtextedit
-           kservice
            ktextwidgets
            kwallet
            kwidgetsaddons
@@ -1644,20 +1613,21 @@ Virtual Contact File}) files to the KPeople contact management library.")
 (define-public libgravatar
   (package
     (name "libgravatar")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libgravatar-" version ".tar.xz"))
        (sha256
-        (base32 "0981ci2kr20v4fk11h57rqya0brgslfazpgq1yk5yqiwyqqm49r2"))))
+        (base32 "1zik4y1micgqyz2y6cj5w5sjccm69d49svl72bdjcj5n3r6xl9iq"))))
     (build-system qt-build-system)
     (native-inputs (list extra-cmake-modules))
     (inputs (list kconfig
                   ki18n
                   kio
                   kpimcommon
+                  kpimtextedit
                   ktextwidgets
                   kwidgetsaddons
                   qtbase-5))
@@ -1674,14 +1644,14 @@ unnecessary network operations.")
 (define-public kpimtextedit
   (package
     (name "kpimtextedit")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kpimtextedit-" version ".tar.xz"))
        (sha256
-        (base32 "0j6d4sv405c3x0ww75qsww94apidsb8aaqf59akhv96zmv0vx5wy"))))
+        (base32 "1gb0n8nrx673ya3mgkjs6khjlz7472a932lgpy5pwir48mc57g1d"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -1715,14 +1685,14 @@ text in the text edit to all kinds of markup, like HTML or BBCODE.")
 (define-public ksmtp
   (package
     (name "ksmtp")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/ksmtp-" version ".tar.xz"))
        (sha256
-        (base32 "1xyaahibm0dc3qdwiak5yqa66szxaxnylvqxi6k21ayvzn2vxbhx"))))
+        (base32 "1l0w7yxmmvkj2wbv49yf73b2ca7k0yxrishkdqgm3q5crahg8l4z"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1743,8 +1713,7 @@ text in the text edit to all kinds of markup, like HTML or BBCODE.")
              (substitute* "src/CMakeLists.txt"
                (("^(install\\(.* )\\$\\{KF5_INSTALL_TARGETS_DEFAULT_ARGS\\}\\)"
                  _ prefix)
-                (string-append prefix "${KDE_INSTALL_TARGETS_DEFAULT_ARGS})")))
-             #t)))))
+                (string-append prefix "${KDE_INSTALL_TARGETS_DEFAULT_ARGS})"))))))))
     (home-page "https://invent.kde.org/pim/ksmtp")
     (synopsis "Library for sending email through an SMTP server")
     (description "This library provides an API for handling SMTP
@@ -1755,14 +1724,14 @@ standard protocols for e-mail transmission.")
 (define-public ktnef
   (package
     (name "ktnef")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/ktnef-" version ".tar.xz"))
        (sha256
-        (base32 "0cn5p32w2kas56yyc15c22kll4hd02lvvxz2n6cz1wda8alspj19"))))
+        (base32 "0nvvaakjhciqdn0v1697d559p0py5v41iyd0ix2z8sqgw7lb7nkh"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1787,14 +1756,14 @@ and allows one to view/extract message formatted text in Rich Text Format.")
 (define-public libkdepim
   (package
     (name "libkdepim")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libkdepim-" version ".tar.xz"))
        (sha256
-        (base32 "0bask561laxgkgm3rxfpyxqs6jx1l9xjk058lhycq0pik6vwhdha"))))
+        (base32 "1r6hbj3rgma1q1fxmi982widvnq1dajslhwmd21aknnnryspfx7s"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -1834,14 +1803,14 @@ and allows one to view/extract message formatted text in Rich Text Format.")
 (define-public libkgapi
   (package
     (name "libkgapi")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libkgapi-" version ".tar.xz"))
        (sha256
-        (base32 "0nvd5fqrvyb7c3g7rf1lxbbv38q9sqnhd6irgx7awwgw92inxky4"))))
+        (base32 "0m47wqr2m147csypzm38i29msm1mcnn6mx3l0nwfhwsmycf6lsr7"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules qttools-5))
@@ -1869,14 +1838,14 @@ various Google services.")
 (define-public libkleo
   (package
     (name "libkleo")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libkleo-" version ".tar.xz"))
        (sha256
-        (base32 "0rijpmqyx4mrr7csik3vkfcra7kfywk6yz548fmq3ha8wa9ax8fv"))))
+        (base32 "0nk6bi2z4s0rf0qim00xcmvxyzwax4bjn1f4f6iyw5qdfkc6yvnp"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools qttools-5))
@@ -1895,6 +1864,17 @@ various Google services.")
            kpimtextedit
            qgpgme
            qtbase-5))
+    (propagated-inputs
+     `(("gpgme" ,gpgme)
+       ("qgpgme" ,qgpgme)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests? ;; FIXME: These tests fail.
+               (invoke "ctest" "-E"
+                       "(keyresolvercoretest|newkeyapprovaldialogtest)")))))))
     (home-page "https://invent.kde.org/pim/libkleo")
     (synopsis "KDE PIM cryptographic library")
     (description "@code{libkleo} is a library for Kleopatra and other parts of
@@ -1905,21 +1885,22 @@ KDE using certificate-based crypto.")
 (define-public libksieve
   (package
     (name "libksieve")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/libksieve-" version ".tar.xz"))
        (sha256
-        (base32 "04k2nkwg5vlgbr5wpvsq02wi54ljsy4ka7y3ns5x3d2gb06wp03c"))
-       (patches (search-patches "libksieve-Fix-missing-link-libraries.patch"))))
+        (base32
+		"0s5c49vgsqmbpyk1bhwjb04v6v6vb9xlcms8dvc6f3gyjdchk5lc"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
     (inputs
      (list akonadi
            cyrus-sasl
+           grantleetheme
            karchive
            ki18n
            kiconthemes
@@ -1950,13 +1931,7 @@ KDE using certificate-based crypto.")
              (substitute*
                  "src/ksieveui/editor/webengine/autotests/CMakeLists.txt"
                (("^\\s*(add_test|ecm_mark_as_test)\\W" line)
-                (string-append "# " line)))
-             ;; FIXME: This test fails due to time zone problems.
-             (substitute*
-                 "src/ksieveui/autocreatescripts/autotests/CMakeLists.txt"
-               ((".*sieveeditorgraphicalmodewidgettest\\.cpp.*")
-                ""))
-             #t)))))
+                (string-append "# " line))))))))
     (home-page "https://invent.kde.org/pim/libksieve")
     (synopsis "KDE Sieve library")
     (description "Sieve is a language that can be used filter emails.  KSieve
diff --git a/gnu/packages/kde-plasma.scm b/gnu/packages/kde-plasma.scm
index 39716187fd..634a44eecf 100644
--- a/gnu/packages/kde-plasma.scm
+++ b/gnu/packages/kde-plasma.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2017, 2019, 2020 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2020 Zheng Junjie <873216071@qq.com>
-;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,6 +29,7 @@
   #:use-module (guix gexp)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system qt)
+  #:use-module (gnu packages admin)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages glib)
@@ -45,14 +46,14 @@
 (define-public breeze
   (package
     (name "breeze")
-    (version "5.19.5")
+    (version "5.25.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/plasma/" version "/"
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0dpk1w7zcafrzf46j060i1qb0fwqpsflkfzr6gcar81llmjnc4b1"))))
+                "0za75ckgfcdxrh2qxgyl2c1273g2xqwmd55njsis1yvwryadypqw"))))
     (build-system qt-build-system)
     ;; TODO: Warning at /gnu/store/…-kpackage-5.34.0/…/KF5PackageMacros.cmake:
     ;;   warnings during generation of metainfo for org.kde.breezedark.desktop:
@@ -75,6 +76,7 @@
            kdecoration
            kguiaddons
            ki18n
+           kirigami
            kiconthemes ; for optional kde-frameworkintegration
            kpackage
            kwayland ; optional
@@ -115,19 +117,19 @@ Breeze is the default theme for the KDE Plasma desktop.")
 (define-public kdecoration
   (package
     (name "kdecoration")
-    (version "5.19.5")
+    (version "5.25.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/plasma/" version
                                   "/kdecoration-" version ".tar.xz"))
               (sha256
                (base32
-                "0pn8n7zyb0adzjnn92vmbcf7pmpss60k9k1rk5llamj016xzfgnf"))))
+                "0b6ynqkndmlac89hv339k365m7wykp9y238df62jlq4vpr1r9x9y"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
     (inputs
-     (list ki18n qtbase-5))
+     (list kcoreaddons ki18n qtbase-5))
     (home-page "https://invent.kde.org/plasma/kdecoration")
     (synopsis "Plugin based library to create window decorations")
     (description "KDecoration is a library to create window decorations.
@@ -138,14 +140,14 @@ manager which re-parents a Client window to a window decoration frame.")
 (define-public ksshaskpass
   (package
     (name "ksshaskpass")
-    (version "5.19.5")
+    (version "5.25.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/plasma/" version
                                   "/ksshaskpass-" version ".tar.xz"))
               (sha256
                (base32
-                "1k2va2v9051f71w78dn3gihk642iyy5yzrkcfnp97fag8g6dpisi"))))
+                "0sfl77szvfq9c7v0gsv5nnf7h5kxigyy2z2p1cwmhm1pq4n606nk"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -162,14 +164,14 @@ call it if it is not associated to a terminal.")
 (define-public layer-shell-qt
   (package
     (name "layer-shell-qt")
-    (version "5.24.1")
+    (version "5.25.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/plasma/" version
                                   "/layer-shell-qt-" version ".tar.xz"))
               (sha256
                (base32
-                "1aq089pws39w9ncsiqzgg3qvfg5hc5a74pzra0smdpy5ipfsb6a4"))))
+                "06rxqm4wh4mcszrwb2dbgpxj3dqfx0rccyyjp091lbsncqm1gib0"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -188,14 +190,14 @@ call it if it is not associated to a terminal.")
 (define-public kscreenlocker
   (package
     (name "kscreenlocker")
-    (version "5.19.5")
+    (version "5.25.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/plasma/" version
                                   "/kscreenlocker-" version ".tar.xz"))
               (sha256
                (base32
-                "1fd5sqaqx9kj3kr0bgxpllhcm5arf8bc9pkpd9yk9c8xjy0j0fxi"))))
+                "1kii3r3j89avwyb00wrw80k5sj0q4wqgmy1q0yxfps9jk729k3wc"))))
     (build-system qt-build-system)
     (arguments
      `(#:tests? #f ;; TODO: make tests pass
@@ -213,35 +215,37 @@ call it if it is not associated to a terminal.")
              (if tests?
                  (begin
                    (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
-                   (invoke "dbus-launch" "ctest" ".")))
+                   (invoke "dbus-launch" "ctest")))
              #t)))))
     (native-inputs
      (list extra-cmake-modules pkg-config
            ;; For tests.
            dbus xorg-server-for-tests))
     (inputs
-     `(("kcmutils" ,kcmutils)
-       ("kcrash" ,kcrash)
-       ("kdeclarative" ,kdeclarative)
-       ("kglobalaccel" ,kglobalaccel)
-       ("ki18n" ,ki18n)
-       ("kidletime" ,kidletime)
-       ("knotifications" ,knotifications)
-       ("ktextwidgets" ,ktextwidgets)
-       ("kwayland" ,kwayland)
-       ("kwindowsystem" ,kwindowsystem)
-       ("kxmlgui" ,kxmlgui)
-       ("libseccomp" ,libseccomp) ;for sandboxing the look'n'feel package
-       ("libxcursor" ,libxcursor) ;missing in CMakeList.txt
-       ("libxi" ,libxi)           ;XInput, required for grabbing XInput2 devices
-       ("linux-pam" ,linux-pam)
-       ("logind" ,elogind)        ;optional loginctl support
-       ("qtbase" ,qtbase-5)
-       ("qtdeclarative-5" ,qtdeclarative-5)
-       ("qtx11extras" ,qtx11extras)
-       ("solid" ,solid)
-       ("wayland" ,wayland)
-       ("xcb-util-keysyms" ,xcb-util-keysyms)))
+     (list kcmutils
+           kconfig
+           kcrash
+           kdeclarative
+           kglobalaccel
+           ki18n
+           kidletime
+           knotifications
+           ktextwidgets
+           kwayland
+           kwindowsystem
+           kxmlgui
+           layer-shell-qt
+           libseccomp ;for sandboxing the look'n'feel package
+           libxcursor ;missing in CMakeList.txt
+           libxi ;XInput, required for grabbing XInput2 devices
+           linux-pam
+           elogind ;optional loginctl support
+           qtbase-5
+           qtdeclarative-5
+           qtx11extras
+           solid
+           wayland
+           xcb-util-keysyms))
     (home-page "https://invent.kde.org/plasma/kscreenlocker")
     (synopsis "Screen locking library")
     (description
@@ -251,21 +255,22 @@ call it if it is not associated to a terminal.")
 (define-public libkscreen
   (package
     (name "libkscreen")
-    (version "5.19.5")
+    (version "5.25.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/plasma/" version "/"
                            name "-" version ".tar.xz"))
        (sha256
-        (base32 "0rf1pm0yyc069f4n5s9ipdx4glzfr9zvv5cbrmn4q9i4v6z1qd8i"))))
+        (base32 "1mxkrk04wcyw4xbfiyxbp5iwnhqr10yk39zx5bbjd9zag0vdi7z5"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules
            ;; For testing.
            dbus))
     (inputs
-     (list kwayland libxrandr qtbase-5 qtx11extras))
+     (list kwayland libxrandr plasma-wayland-protocols
+           qtbase-5 qtwayland wayland qtx11extras))
     (arguments
      '(#:tests? #f)) ; FIXME: 55% tests passed, 5 tests failed out of 11
     (home-page "https://community.kde.org/Solid/Projects/ScreenManagement")
@@ -278,56 +283,53 @@ basic needs and easy to configure for those who want special setups.")
 (define-public libksysguard
   (package
     (name "libksysguard")
-    (version "5.19.5")
+    (version "5.25.3")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://kde//stable/plasma/" version
+       (uri (string-append "mirror://kde/stable/plasma/" version
                            "/libksysguard-" version ".tar.xz"))
        (sha256
-        (base32 "1kd0h3p8bf9k5pqp0frhr81pa0yyrpkckg9zznirk9p1v88v7bfq"))))
+        (base32 "1mrrrxjvqmrnkjwafvqrd2hlvl9gr9y4hn7dv0gf70lp5bl06i89"))))
     (native-inputs
-     (list extra-cmake-modules pkg-config))
+     (list extra-cmake-modules pkg-config qttools-5))
     (inputs
-     `(("kconfigwidgets" ,kconfigwidgets)
-       ("kiconthemes" ,kiconthemes)
-       ("kwindowsystem" ,kwindowsystem)
-       ("ki18n" ,ki18n)
-       ("kauth" ,kauth)
-       ("kcompletion" ,kcompletion)
-       ("kconfig" ,kconfig)
-       ("kcoreaddons" ,kcoreaddons)
-       ("kdeclarative" ,kdeclarative)
-       ("kglobalaccel" ,kglobalaccel)
-       ("kio" ,kio)
-       ("knewstuff" ,knewstuff)
-       ("kwidgetsaddons" ,kwidgetsaddons)
-       ("kservice" ,kservice)
-       ("qtbase" ,qtbase-5)
-       ("qtdeclarative-5" ,qtdeclarative-5)
-       ("qtscript" ,qtscript)
-       ("qtwebkit" ,qtwebkit)
-       ("qtx11extras" ,qtx11extras)
-       ("plasma" ,plasma-framework)
-       ("zlib" ,zlib)))
+     (list kauth
+           kcompletion
+           kconfig
+           kconfigwidgets
+           kcoreaddons
+           kdeclarative
+           kglobalaccel
+           ki18n
+           kiconthemes
+           kio
+           knewstuff
+           kservice
+           kwidgetsaddons
+           kwindowsystem
+           libnl
+           libcap
+           libpcap
+           `(,lm-sensors "lib")
+           plasma-framework
+           qtbase-5
+           qtdeclarative-5
+           qtscript
+           qtwebchannel-5
+           qtwebengine-5
+           qtwebkit
+           qtx11extras
+           zlib))
     (build-system qt-build-system)
     (arguments
-     (list #:configure-flags
-           #~`(,(string-append "-DKDE_INSTALL_DATADIR="
-                               #$output "/share"))
-           #:phases
+     (list #:phases
            #~(modify-phases %standard-phases
-               (add-before 'configure 'patch-cmakelists
-                 (lambda _
-                   ;; TODO: Verify: This should no longer be necessary, since
-                   ;; KF5AuthConfig.cmake.in contains this already.
-                   (substitute* "processcore/CMakeLists.txt"
-                     (("KAUTH_HELPER_INSTALL_DIR")
-                      "KDE_INSTALL_LIBEXECDIR"))))
                (replace 'check
-                 (lambda _
-                   ;; TODO: Fix this failing test-case
-                   (invoke "ctest" "-E" "processtest"))))))
+                 (lambda* (#:key tests? #:allow-other-keys)
+                   (when tests?
+                     ;; TODO: Fix this failing test-case
+                     (invoke "ctest" "-E" "processtest")))))))
     (home-page "https://userbase.kde.org/KSysGuard")
     (synopsis "Network enabled task and system monitoring")
     (description "KSysGuard can obtain information on system load and
@@ -335,3 +337,52 @@ manage running processes.  It obtains this information by interacting
 with a ksysguardd daemon, which may also run on a remote system.")
     (license license:gpl3+)))
 
+(define-public kwayland-server
+  (package
+    (name "kwayland-server")
+    (version "5.24.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://kde/stable/plasma/" version
+                    "/" name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1279nqhy1qyz84dkn23rvzak8bg71hbrp09jlhv9mkjdb3bhnyfi"))))
+    (build-system qt-build-system)
+    (native-inputs
+     (list extra-cmake-modules pkg-config))
+    (inputs
+     (list plasma-wayland-protocols
+           qtbase-5
+           qtwayland
+           kwayland
+           wayland
+           wayland-protocols-next))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-install-path
+           (lambda _
+             ;; Fixes errors including nonexistant /include/KF5
+             (substitute* "src/server/CMakeLists.txt"
+               (("KF5_INSTALL") "KDE_INSTALL"))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" (getcwd))
+               (setenv "XDG_RUNTIME_DIR" (getcwd))
+               (setenv "QT_QPA_PLATFORM" "offscreen")
+               (invoke "ctest" "-E"
+                       ;; This test fails inconsistently.
+                       "kwayland-testDragAndDrop")))))))
+    (home-page "https://api.kde.org/kwayland-server/html/index.html")
+    (synopsis "KDE wayland server component")
+    (description
+     "KWayland is a Qt-style API to interact with the wayland-client and
+wayland-server API.")
+    ;; Most files are LGPL2.1 or LGPL3.0 only, at the users option.
+    (license (list license:lgpl2.1 license:lgpl3
+                   ;; src/server/drm_fourcc.h carries the MIT license.
+                   license:expat))))
+
diff --git a/gnu/packages/kde-systemtools.scm b/gnu/packages/kde-systemtools.scm
index 4e6cd1d6e1..5515c58d49 100644
--- a/gnu/packages/kde-systemtools.scm
+++ b/gnu/packages/kde-systemtools.scm
@@ -1,6 +1,8 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017, 2020 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2021 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +27,7 @@
   #:use-module (guix utils)
   #:use-module (gnu packages)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages kde)
   #:use-module (gnu packages kde-frameworks)
   #:use-module (gnu packages linux)
@@ -39,14 +42,14 @@
 (define-public dolphin
   (package
     (name "dolphin")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/dolphin-" version ".tar.xz"))
        (sha256
-        (base32 "0xr5s0s40i2bsfjfapvpa7dxh9s4604cxirg97xcaacd6fdvhpds"))))
+        (base32 "07ian9aai9mjygn6bgxanv8h16i83wf69nkl8c9qynwbz4fkwmwf"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools ruby ruby-test-unit))
@@ -69,14 +72,15 @@
            knotifications
            kparts
            ktextwidgets
+           kuserfeedback
            kwindowsystem
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            phonon
            qtbase-5
            solid))
     (arguments
      `(#:tests? #f)) ;; TODO: 4/15 tests fail even with offscreen
-    (home-page "https://kde.org/applications/system/org.kde.dolphin")
+    (home-page "https://apps.kde.org/dolphin/")
     (synopsis "File manager for KDE")
     (description "Dolphin is a file manager for KDE focusing on usability.
 The main features of Dolphin are:
@@ -95,14 +99,14 @@ The main features of Dolphin are:
 (define-public dolphin-plugins
   (package
     (name "dolphin-plugins")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/dolphin-plugins-" version ".tar.xz"))
        (sha256
-        (base32 "12g44s6g7ma6avp15l45l42qyzbglswvahm2wji79zdls5vjnz7r"))))
+        (base32 "1ii1xrz22caxcgrr9ibzkh7nvw1h9d8xb5a2fadni0makk02qjif"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -111,8 +115,9 @@ The main features of Dolphin are:
            ki18n
            kio
            ktexteditor
+           ksyntaxhighlighting
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
     (home-page "http://www.kde.org/")
     (synopsis "VCS-Plugins for Dolphin")
@@ -123,14 +128,14 @@ Dolphin with the version control systems: Bzr, Git, Mercurial, Subversion.")
 (define-public khelpcenter
   (package
     (name "khelpcenter")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/khelpcenter-" version ".tar.xz"))
        (sha256
-        (base32 "0wxzjragvjcfc7c4qja8wzpshhaywficj7f7wkmppzybcsxwn9qb"))))
+        (base32 "0ga270imh1ssifj0w3434z9hgrmn0dqrschygywy1z2hcpyx991d"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -151,12 +156,22 @@ Dolphin with the version control systems: Bzr, Git, Mercurial, Subversion.")
            kservice
            kwindowsystem
            libxml2
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5
            xapian))
     (arguments
-     `(#:tests? #f)) ;; 1/1 test fails
-    (home-page "https://kde.org/applications/system/org.kde.Help")
+     `(#:tests? #f  ;; 1/1 test fails
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'wrap-executable
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out")))
+               ;; Since qt-wrap selectors do not wrap for /share/kf5
+               ;; directories, we need this so khelpcenter can find html4.css.
+               (wrap-program (string-append out "/bin/khelpcenter")
+                 `("XDG_DATA_DIRS" suffix
+                   (,(string-append (assoc-ref inputs "khtml") "/share"))))))))))
+    (home-page "https://apps.kde.org/khelpcenter/")
     (synopsis "KDE documentation viewer")
     (description "KHelpCenter uses meta data files which describe the
 documentation available in the system.  Each document is represented by a meta
@@ -172,17 +187,17 @@ document meta data file.")
 (define-public konsole
   (package
     (name "konsole")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/konsole-" version ".tar.xz"))
        (sha256
-        (base32 "0ckr7bjkyaw0gr5kx569jfnhkhwmlk4lqk41ng61qwxlb4bsdbdm"))))
+        (base32 "19yrhjjbwq7kaip05ig8raqnh87k5dg57jck2zrsdrhq2f4nb3ql"))))
     (build-system qt-build-system)
     (native-inputs
-     (list extra-cmake-modules kdoctools))
+     (list extra-cmake-modules kdoctools zlib))
     (inputs
      (list kbookmarks
            kcompletion
@@ -207,7 +222,7 @@ document meta data file.")
            kwidgetsaddons
            kwindowsystem
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5
            qtscript))
     (arguments
@@ -226,14 +241,14 @@ This package is part of the KDE base applications module.")
 (define-public krfb
   (package
     (name "krfb")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/krfb-" version ".tar.xz"))
        (sha256
-        (base32 "092ijn88jpmgk2zwz37vzf35jisl234mc3krc9jl7bd955akx51k"))))
+        (base32 "09h05al7ivf9pzf2p6mnja1124746fawmr3vdk6rggjjw0p0wgn1"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config kdoctools))
@@ -247,19 +262,23 @@ This package is part of the KDE base applications module.")
            ki18n
            knotifications
            kwallet
+           kwayland
            kwidgetsaddons
            kwindowsystem
            kxmlgui
            libvnc
            libxcb
            libxtst
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            pipewire-0.3
+           plasma-wayland-protocols
            qtbase-5
+           qtwayland
            qtx11extras
+           wayland
            xcb-util-image
            zlib))
-    (home-page "https://kde.org/applications/internet/org.kde.krfb")
+    (home-page "https://apps.kde.org/krfb/")
     (synopsis "Desktop Sharing utility")
     (description "KDE Desktop Sharing is a server application that allows you
 to share your current session with a user on another machine.  The desktop
@@ -276,14 +295,14 @@ This package is part of the KDE networking module.")
 (define-public ksystemlog
   (package
     (name "ksystemlog")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/ksystemlog-" version ".tar.xz"))
        (sha256
-        (base32 "1826h89ynvlxdwzyqil2d79cvynglww6fax7qp41wxasgarxhsni"))))
+        (base32 "0x9j3m0kndbaxldsk2rh8zawz0nqqdpn1xf36m4zzymm3b034glv"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -300,9 +319,9 @@ This package is part of the KDE networking module.")
            ktextwidgets
            kwidgetsaddons
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
-    (home-page "https://kde.org/applications/system/org.kde.ksystemlog")
+    (home-page "https://apps.kde.org/ksystemlog/")
     (synopsis "System log viewer")
     (description "This program is developed for being used by beginner users,
 which don't know how to find information about their Linux system, and how the
@@ -315,14 +334,14 @@ This package is part of the KDE administration module.")
 (define-public yakuake
   (package
     (name "yakuake")
-    (version "20.12.1")
+    (version "22.04.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/release-service/" version
                                   "/src/yakuake-" version ".tar.xz"))
               (sha256
                (base32
-                "02pal9xx1wbpw7dimvs2aw1xnyjqlvbjlybkkfhf8x7c6m1r63aa"))))
+                "0h5c8j65m6gylvwrj4sag4rlx92brbfllyrwpi7kwfjbwf7a5j1k"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -348,7 +367,7 @@ This package is part of the KDE administration module.")
            qtbase-5
            qtsvg-5
            qtx11extras))
-    (home-page "https://www.kde.org/applications/system/yakuake/")
+    (home-page "https://apps.kde.org/yakuake/")
     (synopsis "Quad-style terminal emulator for KDE")
     (description "Yakuake is a drop-down terminal emulator based on KDE Konsole
 technology.  Features include:
diff --git a/gnu/packages/kde-utils.scm b/gnu/packages/kde-utils.scm
index 7e70f7b92b..b2295d184a 100644
--- a/gnu/packages/kde-utils.scm
+++ b/gnu/packages/kde-utils.scm
@@ -2,6 +2,8 @@
 ;;; Copyright © 2017, 2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2020, 2021 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2021 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +27,7 @@
   #:use-module (guix packages)
   #:use-module (gnu packages)
   #:use-module (gnu packages backup)
+  #:use-module (gnu packages bash)
   #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages gnome)
@@ -40,14 +43,14 @@
 (define-public ark
   (package
     (name "ark")
-    (version "20.04.1")
+    (version "22.04.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/release-service/" version
                                   "/src/ark-" version ".tar.xz"))
               (sha256
                (base32
-                "0g5bfa1lc7mhrc2ngd4ldf33dpwr7gqrj95kp897pf632wwj23iw"))
+                "1wjy90qkkzafwcw8d4v9cyhmc3sgfipc1085hq2ghqhvrgdyzs00"))
               ;; The libarchive package in Guix does not support
               ;; xar; disable related tests.
               (patches (search-patches "ark-skip-xar-test.patch"))))
@@ -79,7 +82,8 @@
     (native-inputs
      (list extra-cmake-modules pkg-config kdoctools xorg-server))
     (inputs
-     (list breeze-icons
+     (list bash-minimal
+           breeze-icons
            karchive
            kconfig
            kcrash
@@ -113,14 +117,14 @@ well as CD-ROM images.")
 (define-public kate
   (package
     (name "kate")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kate-" version ".tar.xz"))
        (sha256
-        (base32 "0nrby307syrqlxrf9lwdzc9c15ifw47418qwszqwg345ma2pww7i"))))
+        (base32 "0dnlr1cld6lqanqv98bss66w2bi2y78vqb8jx26addn2r1w4ygkf"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -139,11 +143,12 @@ well as CD-ROM images.")
            kjobwidgets
            kparts
            ktexteditor
+           ksyntaxhighlighting
            kwallet
            plasma-framework
            kwindowsystem
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5
            qtscript))
     (arguments
@@ -178,14 +183,14 @@ Kate's features include:
 (define-public kmag
   (package
     (name "kmag")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/kmag-" version ".tar.xz"))
       (sha256
-       (base32 "18lk8i2r90gvw8q5j179xgpniih92mwk06krk7w4jv98yinqf6m5"))))
+       (base32 "08jwv2wnb67vjgz5pv1nn6rwl9ldj8dfd74l6va9vz4x5pk7d859"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -193,7 +198,7 @@ Kate's features include:
      (list ki18n
            kio
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            ;; TODO: QAccessibilityClient - libqaccessibilityclien
            qtbase-5))
     (home-page "https://apps.kde.org/kmag/")
@@ -208,14 +213,14 @@ artists to web-designers to people with low vision.")
 (define-public kmousetool
   (package
     (name "kmousetool")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kmousetool-" version ".tar.xz"))
        (sha256
-        (base32 "01j6bx8zihns4ip8maj0gb3w3bhx1ha2ljhfmsm6lcyay531ay98"))))
+        (base32 "13pvdhhf3fdkaiyjp0ijqm5qdffabyw7qq2051l1nqv6i7w6lgwx"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -232,7 +237,7 @@ artists to web-designers to people with low vision.")
            libxtst
            libxt
            phonon
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
     (home-page "https://apps.kde.org/kmousetool/")
     (synopsis "Automatic mouse click and mouse manipulation tool for the
@@ -246,14 +251,14 @@ whom pressing buttons hurts.")
 (define-public kmouth
   (package
     (name "kmouth")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/kmouth-" version ".tar.xz"))
        (sha256
-        (base32 "1afgxlys9mvmc3rd33g7gchfb0ylx83x3x0a0qf3dra6cpgsgcg7"))))
+        (base32 "0lzaw7qqvpqzfz4nb2lk8l06c4yxacfg5982yk33g5q0j7r19bpy"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -267,7 +272,7 @@ whom pressing buttons hurts.")
            kio
            kwidgetsaddons
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5
            qtspeech))
     (home-page "https://apps.kde.org/kmouth/")
@@ -305,7 +310,7 @@ sentences to be re-spoken.")
            ki18n
            kwidgetsaddons
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
     (home-page "https://apps.kde.org/kronometer/")
     (synopsis "Simple stopwatch application")
@@ -348,7 +353,7 @@ to save the times and resume them later.")
            kwidgetsaddons
            kwindowsystem
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5
            solid
            zlib))
@@ -395,15 +400,14 @@ either be created or generated from a image.")
 (define-public okteta
   (package
     (name "okteta")
-    (version "17.12.3")
+    (version "0.26.9")
     (source
      (origin
        (method url-fetch)
-       ;; TODO: Why is this not in "stable" anymore
-       (uri (string-append "mirror://kde/Attic/applications/" version
+       (uri (string-append "mirror://kde/stable/okteta/" version
                            "/src/okteta-" version ".tar.xz"))
        (sha256
-        (base32 "03wsv83l1cay2dpcsksad124wzan7kh8zxdw1h0yicn398kdbck4"))))
+        (base32 "1yszs3w78dqdr5d8djf6gp4abzc5lcms859imqcq50wl9r6lr18n"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools qttools-5 shared-mime-info))
@@ -423,9 +427,10 @@ either be created or generated from a image.")
            kservice
            kwidgetsaddons
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qca
            qtbase-5
+           qtdeclarative-5
            qtscript))
     (arguments
      `(#:phases
@@ -480,7 +485,7 @@ redone.")
            ktextwidgets
            kwindowsystem
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
     (home-page "https://apps.kde.org/rsibreak/")
     (synopsis "Assists in the Recovery and Prevention of Repetitive Strain
@@ -526,7 +531,7 @@ remind you to take a break now and then.")
            kwindowsystem
            kxmlgui
            samba
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            plasma-framework
            qtbase-5
            qtdeclarative-5
@@ -566,14 +571,14 @@ Features:
 (define-public sweeper
   (package
     (name "sweeper")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/sweeper-" version ".tar.xz"))
        (sha256
-        (base32 "1az3c2khnh51bbmqpamj4p26d3a0ff4l5rd3vcrylg94mk7wgh59"))))
+        (base32 "0kda4a5d9a11am2y6f91bx8v3nb8mw9qh671nskvgkx46x1pww21"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -588,7 +593,7 @@ Features:
            kio
            ktextwidgets
            kxmlgui
-           oxygen-icons ;; default icon set
+           breeze-icons ;; default icon set
            qtbase-5))
     (home-page "https://apps.kde.org/sweeper/")
     (synopsis "Temporary file and history cleaner")
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index f187c02ba4..e83470bc53 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -15,6 +15,8 @@
 ;;; Copyright © 2021 Alexandros Theodotou <alex@zrythm.org>
 ;;; Copyright © 2021 la snesne <lasnesne@lagunposprasihopre.org>
 ;;; Copyright © 2021, 2022 Vinicius Monego <monego@posteo.net>
+;;; Copyright © 2022 Brendan Tildesley <mail@brendan.scot>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -60,6 +62,7 @@
   #:use-module (gnu packages ebook)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages geo)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages ghostscript)
@@ -81,6 +84,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages photo)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages polkit)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
@@ -95,26 +99,21 @@
 (define-public baloo-widgets
   (package
     (name "baloo-widgets")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/baloo-widgets-" version ".tar.xz"))
        (sha256
-        (base32 "1x4v79vhvc5ixkbsf3jyjz5ig1lf78rfw3r7g3llpb4j1kcp3wh0"))))
+        (base32 "0084bnrlbdypdwzxi9gfxcywhyjd1z2cmh7p6gv0zhc9f7h6ffnp"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
     (inputs
      (list baloo kconfig ki18n kio qtbase-5))
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before 'check 'check-setup
-           (lambda _
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+     `(#:tests? #f)) ;; tests fail
     (home-page "https://community.kde.org/Baloo")
     (synopsis "Wigets for use with Baloo")
     (description "Baloo is a framework for searching and managing metadata.
@@ -124,15 +123,14 @@ This package contains GUI widgets for baloo.")
 (define-public grantleetheme
   (package
     (name "grantleetheme")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/grantleetheme-" version ".tar.xz"))
        (sha256
-        (base32 "0gabc5cb0sf00s7m5v2jnq55qsrdbrq6nqd15y1i15p788zifsjx"))
-       (patches (search-patches "grantlee-merge-theme-dirs.patch"))))
+        (base32 "50c6s1g3vp5sdhpiciz1j6rsryld7hcc6lvmxdlsvms2bbcmnj7l"))))
     (build-system qt-build-system)
     (arguments `(#:tests? #f))  ; unexpected error in the test suite.
     (native-inputs
@@ -153,14 +151,14 @@ This package contains GUI widgets for baloo.")
 (define-public akregator
   (package
     (name "akregator")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/akregator-" version ".tar.xz"))
        (sha256
-        (base32 "1711yhwsdq9iyc3wm3a4xmz81p73hvvc0h58sasc89ifpry50k2p"))))
+        (base32 "9yy5c29zxpli4cddknmdvjkgii3j7pvw6lhwqfrqjc8jh83gm8f8"))))
     (build-system qt-build-system)
     (arguments
      `(#:phases
@@ -222,7 +220,7 @@ browser for easy news reading.")
 (define-public kdenlive
   (package
     (name "kdenlive")
-    (version "21.12.3")
+    (version "22.04.3")
     (source
      (origin
        (method git-fetch)
@@ -231,7 +229,7 @@ browser for easy news reading.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "19fs5zhz1nv5cvf709c5741nri139pl5mzpf2xnd4sqj0rmyv228"))))
+        (base32 "0v545kd5rm5isy4cx21fp3pi49mvsv1r1ahp0jhim8s6b7ghrh64"))))
     (build-system qt-build-system)
     (arguments
      ;; XXX: there is a single test that spawns other tests and
@@ -306,68 +304,65 @@ projects.")
 (define-public kdevelop
   (package
     (name "kdevelop")
-    (version "5.6.1")
+    (version "22.04.3")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append "mirror://kde/stable/kdevelop"
-                            "/" version "/src/kdevelop-"
-                            version ".tar.xz"))
+        (uri (string-append "mirror://kde/stable/release-service/" version
+                            "/src/kdevelop-" version ".tar.xz"))
         (sha256
-         (base32 "02ip5r67hjfpywkm3mz86n6wbqcr7996ifzfd2fyzsvm4998hi4y"))))
+         (base32 "03dwllxy96sy20kdsc3sll0n6bhh6gdmpjl821flsxv0jb5naplv"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config shared-mime-info qttools-5))
-    (inputs
-     `(("boost" ,boost)
-       ("clang" ,clang)
-       ("grantlee" ,grantlee)
-       ("karchive" ,karchive)
-       ("kcmutils" ,kcmutils)
-       ("kcrash" ,kcrash)
-       ("kdeclarative" ,kdeclarative)
-       ("kdoctools" ,kdoctools)
-       ("kguiaddons" ,kguiaddons)
-       ("ki18n" ,ki18n)
-       ("kiconthemes" ,kiconthemes)
-       ("kio" ,kio)  ;; not checked as requirement
-       ("kitemmodels" ,kitemmodels)
-       ("kitemviews" ,kitemviews)
-       ("kjobwidgets" ,kjobwidgets)
-       ("knotifications" ,knotifications)
-       ("knotifyconfig" ,knotifyconfig)
-       ("kparts" ,kparts)
-       ("kservice" ,kservice)
-       ("ktexteditor" ,ktexteditor)
-       ("kwindowsystem" ,kwindowsystem)
-       ("kxmlgui" ,kxmlgui)
-       ("libkomparediff2" ,libkomparediff2)
-       ("oxygen-icons" ,oxygen-icons)
-       ("qtbase" ,qtbase-5)
-       ("qtdeclarative-5" ,qtdeclarative-5)
-       ("qtquickcontrols-5" ,qtquickcontrols-5)  ;; not checked as requirement
-       ("qtquickcontrols2-5" ,qtquickcontrols2-5)  ;; not checked as requirement
-       ("qtwebkit" ,qtwebkit)
-       ("threadweaver" ,threadweaver)
-
-       ;; recommendes
-       ("astyle" ,astyle)
-       ("kdevelop-pg-qt" ,kdevelop-pg-qt)
-       ("libksysguard" ,libksysguard)
-
-       ;; optional
-       ("apr" ,apr)            ; required for subversion support
-       ("apr-util" ,apr-util)  ; required for subversion support
-       ("attica" ,attica)
-       ("kconfigwidgets" ,kconfigwidgets)
-       ("knewstuff" ,knewstuff)
-       ("krunner" ,krunner)
-       ;; TODO: OktetaGui, OktetaKastenControllers
-       ("plasma" ,plasma-framework)
-       ;; TODO: purpose
-       ("sonnet" ,sonnet)
-       ("subversion" ,subversion)))
+    (inputs (list boost
+                  clang
+                  grantlee
+                  karchive
+                  kcmutils
+                  kcrash
+                  kdeclarative
+                  kdoctools
+                  kguiaddons
+                  ki18n
+                  kiconthemes
+                  kio ;; not checked as requirement
+                  kitemmodels
+                  kitemviews
+                  kjobwidgets
+                  knotifications
+                  knotifyconfig
+                  kparts
+                  kservice
+                  ksyntaxhighlighting
+                  ktexteditor
+                  kwindowsystem
+                  kxmlgui
+                  libkomparediff2
+                  breeze-icons
+                  qtbase-5
+                  qtdeclarative-5
+                  qtquickcontrols-5 ;; not checked as requirement
+                  qtquickcontrols2-5 ;; not checked as requirement
+                  qtwebkit
+                  threadweaver
+                  ;; recommendes
+                  astyle
+                  kdevelop-pg-qt
+                  libksysguard
 
+                  ;; optional
+                  apr ; required for subversion support
+                  apr-util ; required for subversion support
+                  attica
+                  kconfigwidgets
+                  knewstuff
+                  krunner
+                  ;; TODO: OktetaGui, OktetaKastenControllers
+                  plasma-framework
+                  ;; TODO: purpose
+                  sonnet
+                  subversion))
        ;; run-time packages - TODO
        ;; ClazyStandalone
        ;; Cppcheck
@@ -404,7 +399,7 @@ software (Git, Subversion, Mercurial, CVS and Bazaar).")
               (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1kfab4p717acbdkcdi41d98vwch7v431gb2qi6s38hmclsf8bf8g"))))
+        (base32 "3kfab4p717acbdkcdi41d98vwch7v431gb2qi6s38hmclsf8bf8g"))))
     (native-inputs
      (list extra-cmake-modules))
     (inputs
@@ -422,14 +417,14 @@ for some KDevelop language plugins (Ruby, PHP, CSS...).")
 (define-public kdiagram
   (package
     (name "kdiagram")
-    (version "2.7.0")
+    (version "2.8.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/kdiagram/" version
                            "/kdiagram-" version ".tar.xz"))
        (sha256
-        (base32 "1pgvf2q8b59hw0jg5ajmj5nrn4q8cgnifpvdd0fynk2ml6zym8k3"))
+        (base32 "07s3kwv0mqvb64x8nz4w1yb3hbk28yzkw4qg1jibai7as4xsv7ap"))
        (patches (search-patches
                  "kdiagram-Fix-missing-link-libraries.patch"))))
     (build-system qt-build-system)
@@ -460,7 +455,7 @@ illustrate project schedules.")
               (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "088q3kkv2wq426w000iq14wy3a45rrnn0bmsdks6caz4vq04ccay"))))
+        (base32 "888q3kkv2wq426w000iq14wy3a45rrnn0bmsdks6caz4vq04ccay"))))
     (build-system qt-build-system)
     (arguments
      `(#:configure-flags (list "-DBUILD_TESTS=ON"))) ; disabled by default
@@ -485,7 +480,7 @@ expression library, that is used in Krita.")
              "mirror://kde/stable/krita/" version "/krita-" version
              ".tar.gz"))
        (sha256
-        (base32 "0iaypyv21zxvhr989r9j9nlhx642jc89xphz1qaw9q1y0yjiy7gd"))))
+        (base32 "2iaypyv21zxvhr989r9j9nlhx642jc89xphz1qaw9q1y0yjiy7gd"))))
     (build-system qt-build-system)
     (arguments
      `(#:tests? #f
@@ -525,7 +520,7 @@ expression library, that is used in Krita.")
            libheif
            libmypaint
            libpng
-           libraw-0.18
+           libraw
            libtiff
            libwebp
            libx11
@@ -577,7 +572,7 @@ features include brush stabilizers, brush engines and wrap-around mode.")
            qtbase-5
            qtsvg-5
            qtxmlpatterns))
-    (home-page "https://apps.kde.org/en/massif-visualizer")
+    (home-page "https://apps.kde.org/massif-visualizer/")
     (synopsis "Visualize massif data generated by Valgrind")
     (description
      "Massif Visualizer is a tool that visualizes massif data.
@@ -589,14 +584,14 @@ compressed massif files can also be opened transparently.")
 (define-public libkomparediff2
   (package
     (name "libkomparediff2")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "mirror://kde/stable/release-service/" version
                             "/src/libkomparediff2-" version ".tar.xz"))
         (sha256
-         (base32 "0m8m7sgpf2f4nxpaaymyvihlk0pcyblyd99mcbibrnyr5kzkzzdc"))))
+         (base32 "1vaxbx7c6r7skh3452blxyrngfcsdyjmmvcg6j2wcsn04m01mw8k"))))
     (native-inputs
      (list extra-cmake-modules pkg-config))
     (inputs
@@ -620,14 +615,14 @@ used in KDE development tools Kompare and KDevelop.")
 (define-public qca
   (package
     (name "qca")
-    (version "2.3.3")
+    (version "2.3.4")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "mirror://kde/stable/qca/" version
                             "/qca-" version ".tar.xz"))
         (sha256
-         (base32 "0rvvf97la95lah67jcj0p06n4br0pc2mri0q1hn4x522hndqybjn"))))
+         (base32 "1i7m5y3dfwij9cyjp72ya5zd2skgp7mfmrmf7bvrbzg3ly0mhsbb"))))
     (build-system cmake-build-system)
     (native-inputs
      (list pkg-config))
@@ -644,16 +639,15 @@ cards.")
 (define-public kpmcore
   (package
     (name "kpmcore")
-    (version "4.1.0")
+    (version "22.04.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "mirror://kde/stable/kpmcore"
-                    "/" version "/src/"
-                    name "-" version ".tar.xz"))
+                    "mirror://kde/stable/release-service/" version
+                    "/src/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0jsig7algmab9h0fb09my0axjqzw83zgscamhzl8931lribs6idm"))))
+                "04qslli4vnbnl329zynbinlwaigxr9xpswra5n0v710p92as0qif"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules pkg-config))
@@ -662,9 +656,19 @@ cards.")
            kcoreaddons
            ki18n
            kwidgetsaddons
+           polkit-qt
            qtbase-5
            qca
            `(,util-linux "lib")))
+    (arguments
+     `(#:tests? #f ;; 4/6 tests fail do to no plugin instance
+	   #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-cmake-install-directories
+           (lambda _
+             (substitute* "src/util/CMakeLists.txt"
+               (("DESTINATION \\$\\{POLKITQT-1_POLICY_FILES_INSTALL_DIR\\}")
+                "DESTINATION share/polkit-1/actions")))))))
     (home-page "https://community.kde.org/Frameworks")
     (synopsis "Library for managing partitions")
     (description "Library for managing partitions.")
@@ -699,7 +703,7 @@ different notification systems.")
 (define-public kdeconnect
   (package
     (name "kdeconnect")
-    (version "20.04.2")
+    (version "22.04.3")
     (source
       (origin
         (method url-fetch)
@@ -708,47 +712,47 @@ different notification systems.")
                             version ".tar.xz"))
         (sha256
          (base32
-          "0yq3afbbcc9gmlcachvh3xz3gdj57092fpagp36l5knw8gr0d9ip"))))
+          "015gxglclds2vmjr4bv51yfv840bafzgrl71cnwgnwwy8rrh9x4x"))))
     (build-system qt-build-system)
     (arguments
      `(#:configure-flags '("-DBUILD_TESTING=ON"
-                           "-DKDE_INSTALL_LIBEXECDIR=libexec")
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'adjust-include-header
-           (lambda _
-             (substitute* "plugins/runcommand/runcommandplugin.cpp"
-               (("<kcmutils_version.h>")
-                "<KF5/kcmutils_version.h>")))))
+                           "-DKDE_INSTALL_LIBEXECDIR=libexec"
+                           ;; So kdeconnect.so isn't installed to lib/plugins
+                           "-DPLUGIN_INSTALL_DIR=lib/qt5/plugins")
        #:tests? #f)) ; tests fail hard in our build environment
     (native-inputs
-     `(("extra-cmake-modules" ,extra-cmake-modules)
-       ("kdoctools" ,kdoctools)
-       ("libxtst" ,libxtst)
-       ("pkg-config" ,pkg-config)
-       ("python" ,python-wrapper)))
+     (list extra-cmake-modules
+           kdoctools
+           libxtst
+           pkg-config
+           python-wrapper))
     (inputs
      (list kcmutils
            kconfigwidgets
            kdbusaddons
+           kguiaddons
            ki18n
            kiconthemes
            kio
            kirigami
            knotifications
+           kpackage
            kpeople
            kpeoplevcard
            kwayland
            libfakekey
            pulseaudio-qt
            qca
+           qqc2-desktop-style
            qtbase-5
            qtdeclarative-5
            qtgraphicaleffects
            qtmultimedia-5
            qtquickcontrols-5
            qtquickcontrols2-5
-           qtx11extras))
+           qtx11extras
+           qtwayland
+           wayland))
     (home-page "https://community.kde.org/KDEConnect")
     (synopsis "Enable your devices to communicate with each other")
     (description "KDE Connect is a project that enables all your devices to
@@ -770,7 +774,7 @@ communicate with each other.  Here's a few things KDE Connect can do:
 (define-public labplot
   (package
     (name "labplot")
-    (version "2.8.2")
+    (version "2.9.0")
     (source
      (origin
        (method url-fetch)
@@ -778,7 +782,7 @@ communicate with each other.  Here's a few things KDE Connect can do:
                            "/" version "/labplot-"
                            version ".tar.xz"))
        (sha256
-        (base32 "1yhxnchwb4n83sxrbn4im41g2sqr0xsim2y242mvyd8pjzd83icf"))))
+        (base32 "1wi19gj18yhrim1cb2dwgpnc2yvydm87h41fcg670ampy24i98z5"))))
     (build-system qt-build-system)
     (arguments
      `(#:configure-flags
@@ -795,7 +799,7 @@ communicate with each other.  Here's a few things KDE Connect can do:
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
                ;; This test fails, I don't know why.
-               (invoke "ctest" "-E" "parsertest")))))))
+               (invoke "ctest" "-E" "(ParserTest|ReadStatFilterTest)")))))))
     (native-inputs (list bison
                          extra-cmake-modules
                          pkg-config
@@ -846,7 +850,7 @@ to perform data analysis.")
 (define-public kqtquickcharts
   (package
     (name "kqtquickcharts")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
       (origin
         (method url-fetch)
@@ -854,7 +858,7 @@ to perform data analysis.")
                             version "/src/kqtquickcharts-" version ".tar.xz"))
         (sha256
          (base32
-          "1wxp35mf9zlpgzi4msdl86b2krdq2ipqw371gyx23r7j84vdyxi3"))))
+          "0bm7rdysvlfnfnvy87ii3kxl238q83vw0ia58zsnwjmkxmlgf6mp"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -870,14 +874,14 @@ charts.")
 (define-public kdf
   (package
     (name "kdf")
-    (version "20.12.1")
+    (version "22.04.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/release-service/"
                                   version "/src/kdf-" version ".tar.xz"))
               (sha256
                (base32
-                "0ba67hs4vlb3qyvdzhnpmf8p62df12s8aqw4hzf9vnxff3qix5k1"))))
+                "1m0dwk3inqzk9kjjzgsaam15lnpbhzjfmwrzv8sazfk44scnr2v1"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
@@ -903,14 +907,14 @@ unmount drives and view them in a file manager.")
 (define-public kcachegrind
   (package
     (name "kcachegrind")
-    (version "20.04.1")
+    (version "22.04.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/release-service/" version
                                   "/src/kcachegrind-" version ".tar.xz"))
               (sha256
                (base32
-                "0fx17s6fj1pxl1mgfrqhchk8sihkbji1x8y3nhb1r0971wzd1nsc"))))
+                "12ckn90hqm2c5c58xqkzgcih64jk4kwkgz4q0f5ns1rxv3pidz5n"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules perl python qttools-5 kdoctools))
@@ -937,14 +941,14 @@ Python, PHP, and Perl.")
 (define-public libkdegames
   (package
     (name "libkdegames")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://kde/stable/release-service/" version
                           "/src/libkdegames-" version ".tar.xz"))
       (sha256
-       (base32 "1xsrrvhwjwi5aajcaxydmzc69i4yx6shs8ly8vr85njc188ycg13"))))
+       (base32 "0igq87anam9x2mclb0lkvwhrxk62y1f4xl14a4dhd97mqsc5pbzn"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -975,7 +979,7 @@ Python, PHP, and Perl.")
            qtbase-5
            qtdeclarative-5
            qtsvg-5))
-    (home-page "https://games.kde.org/")
+    (home-page "https://apps.kde.org/categories/games/")
     (synopsis "Runtime library for kdegames")
     (description "Runtime library for kdegames")
     (license (list license:gpl2+  license:fdl1.2+))))
@@ -983,7 +987,7 @@ Python, PHP, and Perl.")
 (define-public marble-qt
   (package
     (name "marble-qt")
-    (version "21.12.3")
+    (version "22.04.3")
     (source
      (origin
        (method git-fetch)
@@ -992,7 +996,8 @@ Python, PHP, and Perl.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1h5a7did4shi3z5l0ad9arl6xr79xpjr7dbzx5l8xpp771pb0pcj"))))
+        (base32
+		"1saacnrl0hkl32nq96l1bgn9yrsz455q96jdxzp7ax8iaa5nmdiz"))))
     (build-system qt-build-system)
     (arguments
      ;; FIXME: libmarblewidget-qt5.so.28 not found.  Also enable the
@@ -1039,14 +1044,14 @@ creating routes by drag and drop and more.")
 (define-public okular
   (package
     (name "okular")
-    (version "20.12.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0gpm7n47yijsjg4yba561j5pbvd98hgvr93w1kvzk851nb87m89c"))))
+        (base32 "03jpwgrhjgyx14g1h3lxhnyib88ck0qkqcxh4fpc398xwdr3amkw"))))
     (build-system qt-build-system)
     ;; The tests fail because they can't find the proper mimetype plugins:
     ;; "org.kde.okular.core: No plugin for mimetype '"image/jpeg"'."
@@ -1094,7 +1099,7 @@ creating routes by drag and drop and more.")
            threadweaver
            kcrash
            kjs))
-    (home-page "https://kde.org/applications/graphics/okular/")
+    (home-page "https://apps.kde.org/okular/")
     (synopsis "Document viewer")
     (description
      "Okular is a document viewer developed for KDE.  It can display files in
@@ -1104,7 +1109,7 @@ a variety of formats, including PDF, PostScript, DejaVu, and EPub.")
 (define-public poxml
   (package
     (name "poxml")
-    (version "20.12.1")
+    (version "22.04.3")
     (source (origin
               (method url-fetch)
               (uri
@@ -1112,13 +1117,13 @@ a variety of formats, including PDF, PostScript, DejaVu, and EPub.")
                               "/src/poxml-" version ".tar.xz"))
               (sha256
                (base32
-                "1smjvblx0jcv3afs2sr4qcmvhqd44iw24hvr9fppa3nxhrmjwmlk"))))
+                "1nrp0i3a39pw4pzcanpmjyks3pl1lyfj3zq61ii8xx402xw1ip2w"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules kdoctools))
     (inputs
      (list gettext-minimal qtbase-5))
-    (home-page "https://kde.org/applications/development")
+    (home-page "https://apps.kde.org/development/")
     (synopsis "Tools for translating DocBook XML files with Gettext")
     (description "This is a collection of tools that facilitate translating
 DocBook XML files using Gettext message files (PO files).  Also included are
@@ -1129,14 +1134,14 @@ PO template files.")
 (define-public kdegraphics-mobipocket
   (package
     (name "kdegraphics-mobipocket")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0fm880lp9g60zgrkjyh4jxws6x0s77l9ia4f8pza3w8sxcbbswk5"))))
+        (base32 "12yrwa22c4qxsf10fv76fzaaj5xlv5lmrwcqvf6qhgr6f9qsw7sj"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1151,14 +1156,14 @@ Mobipocket e-books in Dolphin and other KDE apps.")
 (define-public libkexiv2
   (package
     (name "libkexiv2")
-    (version "20.12.0")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0k0iinf7s8qlk3fwvq7iic1b4zn2gm65rfd58q7d3wb1i1j2hjjk"))))
+        (base32 "0p43z69yh5jk8m1hn3xynjpgzxpkc89h0dafj5964qx4xp4vxl19"))))
     (build-system cmake-build-system)
     (native-inputs
      (list extra-cmake-modules))
@@ -1173,20 +1178,20 @@ picture metadata as EXIF/IPTC and XMP.")
 (define-public zeroconf-ioslave
   (package
     (name "zeroconf-ioslave")
-    (version "20.04.1")
+    (version "22.04.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/release-service/" version
                            "/src/zeroconf-ioslave-" version ".tar.xz"))
        (sha256
-        (base32 "1qck5jyc4psslpibhki8sz8aj0hsnx8z791vzyn10lmdzn71vx8c"))))
+        (base32 "0jbrdbphxn77dg2a4wzsm7q24455j4d1xhd4rj5iwhq4ywiig9i1"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules))
     (inputs
      (list kdbusaddons kdnssd ki18n kio qtbase-5))
-    (home-page "https://kde.org/applications/internet/org.kde.zeroconf_ioslave")
+    (home-page "https://apps.kde.org/kio_zeroconf/")
     (synopsis "DNS-SD Service Discovery Monitor")
     (description "Adds an entry to Dolphin's Network page to show local
 services such as printers which advertise themselves with DNSSD (called Avahi
@@ -1200,14 +1205,14 @@ or Bonjour by other projects).")
   ;; FIXME: Check https://www.reddit.com/r/kde/comments/f7ojg9 for insights
   (package
     (name "kuserfeedback")
-    (version "1.0.0")
+    (version "1.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/kuserfeedback/"
                            "/kuserfeedback-" version ".tar.xz"))
        (sha256
-        (base32 "1dwx9fscnfp3zsxdir774skn8xvad2dvscnaaw3ji6mrnkmm6bss"))))
+        (base32 "0r7jcc88n5b4rc0asjzh7m7g33i35k3z99l08qkrn92kn4ickakn"))))
     (build-system qt-build-system)
     (native-inputs
      (list extra-cmake-modules
diff --git a/gnu/packages/libffi.scm b/gnu/packages/libffi.scm
index 99a07ceaac..6d16e6a03b 100644
--- a/gnu/packages/libffi.scm
+++ b/gnu/packages/libffi.scm
@@ -82,13 +82,13 @@ conversions for values passed between the two languages.")
 (define-public python-cffi
   (package
     (name "python-cffi")
-    (version "1.14.4")
+    (version "1.15.1")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "cffi" version))
       (sha256
-       (base32 "0v080s7vlrjz9z823x2yh36yc8drwpvvir6w8wfkkzd7k2z5qihs"))))
+       (base32 "1y9lr651svbzf1m03s4lqbnbv2byx8f6f0ml7hjm24vvlfwvy06l"))))
     (build-system python-build-system)
     (inputs
      (list libffi))
@@ -118,9 +118,8 @@ conversions for values passed between the two languages.")
              ;; using find_library or the like with their name fail when the
              ;; resolved .so object is a linker script rather than an ELF
              ;; binary (this is a limitation of the ctype library of Python).
-             (let* ((glibc (assoc-ref inputs "libc"))
-                    (libm (string-append glibc "/lib/libm.so.6"))
-                    (libc (string-append glibc "/lib/libc.so.6")))
+             (let ((libm (search-input-file inputs "lib/libm.so.6"))
+                   (libc (search-input-file inputs "lib/libc.so.6")))
                (substitute* '("testing/cffi0/test_function.py"
                               "testing/cffi0/test_parsing.py"
                               "testing/cffi0/test_unicode_literals.py"
@@ -140,18 +139,6 @@ conversions for values passed between the two languages.")
     (description "Foreign Function Interface for Python calling C code.")
     (license expat)))
 
-;; TODO(staging): Merge with the above.
-(define-public python-cffi-1.15
-  (package
-    (inherit python-cffi)
-    (version "1.15.0")
-    (source
-     (origin
-      (method url-fetch)
-      (uri (pypi-uri "cffi" version))
-      (sha256
-       (base32 "0m3rz2pqfmyfagx0bhj2jlbr2h58j3wr3cyv1agxkhlnm1k0s3wj"))))))
-
 (define-public python-cffi-documentation
   (package
     (name "python-cffi-documentation")
diff --git a/gnu/packages/libunwind.scm b/gnu/packages/libunwind.scm
index 03412edd25..ccbe2ec751 100644
--- a/gnu/packages/libunwind.scm
+++ b/gnu/packages/libunwind.scm
@@ -2,6 +2,8 @@
 ;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2022 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2022 Marius Bakke <marius@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,28 +22,32 @@
 
 (define-module (gnu packages libunwind)
   #:use-module (guix packages)
-  #:use-module (gnu packages)
   #:use-module (guix download)
+  #:use-module (guix utils)
+  #:use-module (gnu packages)
   #:use-module (guix build-system gnu)
   #:use-module (guix licenses))
 
 (define-public libunwind
   (package
     (name "libunwind")
-    (version "1.5.0")
+    (version "1.6.2")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://savannah/libunwind/libunwind-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "05qhzcg1xag3l5m3c805np6k342gc0f3g087b7g16jidv59pccwh"))))
+               "0xj9g6a9q7v7zz6lymf3f6011synibgawi4wi384bywid5kfqsja"))))
     (build-system gnu-build-system)
     (arguments
-     ;; FIXME: As of glibc 2.25, we get 1 out of 34 test failures (2 are
-     ;; expected to fail).
-     ;; Report them upstream.
-     '(#:tests? #f))
+     `(;; Two tests are failing with newer toolchains:
+       ;; https://github.com/libunwind/libunwind/issues/363
+       #:make-flags
+       '("XFAIL_TESTS=run-coredump-unwind run-coredump-unwind-mdi")
+       ;; A different collection of tests fails for each architecture.
+       #:tests? ,(and (not (%current-target-system))
+                      (target-x86-64?))))
     (home-page "https://www.nongnu.org/libunwind")
     (synopsis "Determining the call chain of a program")
     (description
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index f49f019e49..e7d670d63e 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -5370,7 +5370,7 @@ Bluetooth audio output devices like headphones or loudspeakers.")
 (define-public bluez
   (package
     (name "bluez")
-    (version "5.61")
+    (version "5.64")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -5378,53 +5378,49 @@ Bluetooth audio output devices like headphones or loudspeakers.")
                     version ".tar.xz"))
               (sha256
                (base32
-                "0fs2kjsdhylxniqhii63i85fjszbqbz3iddwmgz4nmbr472xdbw3"))))
+                "0d6yl7l5zrlx5w3y503k72m9xsydx6gi1c65icchq1xknrjpwhxf"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:configure-flags
-       (let ((out (assoc-ref %outputs "out")))
-         (list "--sysconfdir=/etc"
-               "--localstatedir=/var"
-               "--enable-library"
-               "--disable-systemd"
-               ;; TODO: is this needed?  Not installed by default since 5.55.
-               "--enable-hid2hci"
-               ;; Install dbus/udev files to the correct location.
-               (string-append "--with-dbusconfdir=" out "/etc")
-               (string-append "--with-udevdir=" out "/lib/udev")))
-       #:phases
-       (modify-phases %standard-phases
-         ;; Test unit/test-gatt fails unpredictably. Seems to be a timing
-         ;; issue (discussion on upstream mailing list:
-         ;; https://marc.info/?t=149578476300002&r=1&w=2)
-         (add-before 'check 'skip-wonky-test
+     (list
+      #:configure-flags
+      #~(list "--sysconfdir=/etc"
+              "--localstatedir=/var"
+              "--enable-library"
+              "--disable-systemd"
+              ;; TODO: is this needed?  Not installed by default since 5.55.
+              "--enable-hid2hci"
+              ;; Install dbus/udev files to the correct location.
+              (string-append "--with-dbusconfdir=" #$output "/etc")
+              (string-append "--with-udevdir=" #$output "/lib/udev"))
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; Test unit/test-gatt fails unpredictably. Seems to be a timing
+          ;; issue (discussion on upstream mailing list:
+          ;; https://marc.info/?t=149578476300002&r=1&w=2)
+          (add-before 'check 'skip-wonky-test
             (lambda _
               (substitute* "unit/test-gatt.c"
-                (("tester_init\\(&argc, &argv\\);") "return 77;"))
-              #t))
-         (add-after 'install 'post-install
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let* ((out        (assoc-ref outputs "out"))
-                    (servicedir (string-append out "/share/dbus-1/services"))
-                    (service    "obexd/src/org.bluez.obex.service")
-                    (rule       (string-append
-                                 out "/lib/udev/rules.d/97-hid2hci.rules")))
-               ;; Install the obex dbus service file.
-               (substitute* service
-                 (("/bin/false")
-                  (string-append out "/libexec/bluetooth/obexd")))
-               (install-file service servicedir)
-               ;; Fix paths in the udev rule.
-               (substitute* rule
-                 (("hid2hci --method")
-                  (string-append out "/lib/udev/hid2hci --method"))
-                 (("/sbin/udevadm")
-                  (search-input-file inputs "/bin/udevadm")))
-               #t))))))
+                (("tester_init\\(&argc, &argv\\);") "return 77;"))))
+          (add-after 'install 'post-install
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let* ((out        #$output)
+                     (servicedir (string-append out "/share/dbus-1/services"))
+                     (service    "obexd/src/org.bluez.obex.service")
+                     (rule       (string-append
+                                  out "/lib/udev/rules.d/97-hid2hci.rules")))
+                ;; Install the obex dbus service file.
+                (substitute* service
+                  (("/bin/false")
+                   (string-append out "/libexec/bluetooth/obexd")))
+                (install-file service servicedir)
+                ;; Fix paths in the udev rule.
+                (substitute* rule
+                  (("hid2hci --method")
+                   (string-append out "/lib/udev/hid2hci --method"))
+                  (("/sbin/udevadm")
+                   (search-input-file inputs "/bin/udevadm")))))))))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
-       ("rst2man" ,python-docutils)
-       ("gettext" ,gettext-minimal)))
+     (list pkg-config python-docutils gettext-minimal))
     (inputs
      (list glib dbus eudev libical readline))
     (home-page "http://www.bluez.org/")
diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
index 33d7b64d61..f23b4a70bb 100644
--- a/gnu/packages/lisp-xyz.scm
+++ b/gnu/packages/lisp-xyz.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2016, 2017 Nikita <nikita@n0.is>
 ;;; Copyright © 2016, 2017 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;; Copyright © 2017, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2018-2020, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Benjamin Slade <slade@jnanam.net>
 ;;; Copyright © 2018 Alex Vong <alexvong1995@gmail.com>
@@ -712,6 +712,15 @@ timeouts.")
     (inputs (list sbcl-alexandria))
     (native-inputs (list sbcl-fiveam))
     (build-system asdf-build-system/sbcl)
+    (arguments
+     (list
+       #:phases
+       #~(modify-phases %standard-phases
+           (add-after 'unpack 'adjust-test-sleep
+             (lambda _
+               ;; 0.001 is too short for some slower machines.
+               (substitute* "test/bordeaux-threads-test.lisp"
+                 (("sleep 0\\.001") "sleep 0.002")))))))
     (synopsis "Portable shared-state concurrency library for Common Lisp")
     (description "BORDEAUX-THREADS is a proposed standard for a minimal
 MP/Threading interface.  It is similar to the CLIM-SYS threading and lock
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index d3373359b8..d69770c4be 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -4873,7 +4873,7 @@ Fresnel integrals, and similar related functions as well.")
 (define-public suitesparse
   (package
     (name "suitesparse")
-    (version "5.10.1")
+    (version "5.12.0")
     (source
      (origin
        (method git-fetch)
@@ -4883,7 +4883,7 @@ Fresnel integrals, and similar related functions as well.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "19gx5wlgqnqpgz6mvam9lalyzpbfwgqhppps8z3np9sh0mgaiyw9"))
+         "0zpl51pfpv7ap7z97jlryba2la1qdmzm11bhzkn55wlb03xzi6k6"))
        (patches (search-patches "suitesparse-mongoose-cmake.patch"))
        (modules '((guix build utils)))
        (snippet
diff --git a/gnu/packages/nss.scm b/gnu/packages/nss.scm
index 5e719ad5b8..0d18592be4 100644
--- a/gnu/packages/nss.scm
+++ b/gnu/packages/nss.scm
@@ -40,52 +40,52 @@
 (define-public nspr
   (package
     (name "nspr")
-    (version "4.31")
+    (version "4.34")
     (source (origin
-             (method url-fetch)
-             (uri (string-append
-                   "https://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v"
-                   version "/src/nspr-" version ".tar.gz"))
-             (sha256
-              (base32
-               "1j5b2m8cjlhnnv8sq34587avaagkqvh521w4f95miwgvsn3xlaap"))))
+              (method url-fetch)
+              (uri (string-append
+                    "https://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v"
+                    version "/src/nspr-" version ".tar.gz"))
+              (sha256
+               (base32
+                "177rxcf3lglabs7sgwcvf72ww4v56qa71lc495wl13sxs4f03vxy"))))
     (build-system gnu-build-system)
     (inputs
-     ;; For 'compile-et.pl' and 'nspr-config'.
-     (list perl ;for 'compile-et.pl'
-           bash-minimal)) ;for 'nspr-config'
+     (list perl                         ;for 'compile-et.pl'
+           bash-minimal))               ;for 'nspr-config'
     (native-inputs
      (list perl))
     (arguments
-     `(;; Prevent the 'native' perl from sneaking into the closure.
-       ;; XXX it would be nice to do the same for 'bash-minimal',
-       ;; but using 'canonical-package' causes loops.
-       ,@(if (%current-target-system)
-             `(#:disallowed-references
-               (,(gexp-input (this-package-native-input "perl") #:native? #t)))
-             '())
-       #:tests? #f ; no check target
-       #:configure-flags
-       (list "--disable-static"
-             "--enable-64bit"
-             (string-append "LDFLAGS=-Wl,-rpath="
-                            (assoc-ref %outputs "out") "/lib")
-             ;; Mozilla deviates from Autotools conventions
-             ;; due to historical reasons.  Adjust to Mozilla conventions,
-             ;; otherwise the Makefile will try to use TARGET-gcc
-             ;; as a ‘native’ compiler.
-             ,@(if (%current-target-system)
-                   `(,(string-append "--host="
-                                     (nix-system->gnu-triplet (%current-system)))
-                     ,(string-append "--target=" (%current-target-system)))
-                   '()))
-       ;; Use fixed timestamps for reproducibility.
-       #:make-flags '("SH_DATE='1970-01-01 00:00:01'"
-                      ;; This is epoch 1 in microseconds.
-                      "SH_NOW=100000")
-       #:phases (modify-phases %standard-phases
-                  (add-before 'configure 'chdir
-                    (lambda _ (chdir "nspr") #t)))))
+     (list
+      ;; Prevent the 'native' perl from sneaking into the closure.
+      ;; XXX it would be nice to do the same for 'bash-minimal',
+      ;; but using 'canonical-package' causes loops.
+      #:disallowed-references
+      (if (%current-target-system)
+          (list (gexp-input (this-package-native-input "perl") #:native? #t))
+          #f)
+      #:tests? #f                       ;no check target
+      #:configure-flags
+      #~(list "--disable-static"
+              "--enable-64bit"
+              (string-append "LDFLAGS=-Wl,-rpath="
+                             (assoc-ref %outputs "out") "/lib")
+              ;; Mozilla deviates from Autotools conventions
+              ;; due to historical reasons.  Adjust to Mozilla conventions,
+              ;; otherwise the Makefile will try to use TARGET-gcc
+              ;; as a ‘native’ compiler.
+              #$@(if (%current-target-system)
+                     #~((string-append "--host="
+                                       #$(nix-system->gnu-triplet (%current-system)))
+                        (string-append "--target=" #$(%current-target-system)))
+                     #~()))
+      ;; Use fixed timestamps for reproducibility.
+      #:make-flags #~'("SH_DATE='1970-01-01 00:00:01'"
+                       ;; This is epoch 1 in microseconds.
+                       "SH_NOW=100000")
+      #:phases #~(modify-phases %standard-phases
+                   (add-before 'configure 'chdir
+                     (lambda _ (chdir "nspr") #t)))))
     (home-page
      "https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSPR")
     (synopsis "Netscape API for system level and libc-like functions")
@@ -112,7 +112,7 @@ in the Mozilla clients.")
     (name "nss")
     ;; Also update and test the nss-certs package, which duplicates version and
     ;; source to avoid a top-level variable reference & module cycle.
-    (version "3.72")
+    (version "3.81")
     (source (origin
               (method url-fetch)
               (uri (let ((version-with-underscores
@@ -123,7 +123,7 @@ in the Mozilla clients.")
                       "nss-" version ".tar.gz")))
               (sha256
                (base32
-                "0bnh683nij6s0gvjcgwhyw5d3yx9fpm42pxj5bm97r0ky6ghm9kf"))
+                "19ncvhz45dhr0nmymwkxspq9l44gaafkspxiwxbqs1hpnqxmzgx8"))
               ;; Create nss.pc and nss-config.
               (patches (search-patches "nss-3.56-pkgconfig.patch"
                                        "nss-getcwd-nonnull.patch"
@@ -137,82 +137,84 @@ in the Mozilla clients.")
     (build-system gnu-build-system)
     (outputs '("out" "bin"))
     (arguments
-     `(#:make-flags
-       (let* ((out (assoc-ref %outputs "out"))
-              (nspr (string-append (assoc-ref %build-inputs "nspr")))
-              (rpath (string-append "-Wl,-rpath=" out "/lib/nss")))
-         (list "-C" "nss" (string-append "PREFIX=" out)
-               "NSDISTMODE=copy"
-               "NSS_USE_SYSTEM_SQLITE=1"
-               ;; The gtests fail to compile on riscv64.
-               ;; Skipping them doesn't affect the test suite.
-               ,@(if (target-riscv64?)
-                   `("NSS_DISABLE_GTESTS=1")
-                   '())
-               (string-append "NSPR_INCLUDE_DIR=" nspr "/include/nspr")
-               ;; Add $out/lib/nss to RPATH.
-               (string-append "RPATH=" rpath)
-               (string-append "LDFLAGS=" rpath)))
-       #:modules ((guix build gnu-build-system)
+     (list
+      #:make-flags
+      #~(let ((rpath (string-append "-Wl,-rpath=" #$output "/lib/nss")))
+          (list "-C" "nss"
+                (string-append "PREFIX=" #$output)
+                "NSDISTMODE=copy"
+                "NSS_USE_SYSTEM_SQLITE=1"
+                ;; The gtests fail to compile on riscv64.
+                ;; Skipping them doesn't affect the test suite.
+                #$@(if (target-riscv64?)
+                       #~("NSS_DISABLE_GTESTS=1")
+                       #~())
+                (string-append "NSPR_INCLUDE_DIR="
+                               (search-input-directory %build-inputs
+                                                       "include/nspr"))
+                ;; Add $out/lib/nss to RPATH.
+                (string-append "RPATH=" rpath)
+                (string-append "LDFLAGS=" rpath)))
+      #:modules '((guix build gnu-build-system)
                   (guix build utils)
                   (ice-9 ftw)
                   (ice-9 match)
                   (srfi srfi-26))
-       #:tests? ,(not (or (%current-target-system)
-                          ;; Tests take more than 30 hours on riscv64-linux.
-                          (target-riscv64?)))
-       #:phases
-       (modify-phases %standard-phases
-         (replace 'configure
-           (lambda _
-             (setenv "CC" ,(cc-for-target))
-             ;; Tells NSS to build for the 64-bit ABI if we are 64-bit system.
-             ,@(if (target-64bit?)
-                   `((setenv "USE_64" "1"))
-                   '())))
-         (replace 'check
-           (lambda* (#:key tests? #:allow-other-keys)
-             (if tests?
-                 (begin
-                   ;; Use 127.0.0.1 instead of $HOST.$DOMSUF as HOSTADDR for
-                   ;; testing.  The latter requires a working DNS or /etc/hosts.
-                   (setenv "DOMSUF" "localdomain")
-                   (setenv "USE_IP" "TRUE")
-                   (setenv "IP_ADDRESS" "127.0.0.1")
+      #:tests? (not (or (%current-target-system)
+                        ;; Tests take more than 30 hours on riscv64-linux.
+                        (target-riscv64?)))
+      #:phases
+      #~(modify-phases %standard-phases
+          (replace 'configure
+            (lambda _
+              (setenv "CC" #$(cc-for-target))
+              ;; Tells NSS to build for the 64-bit ABI if we are 64-bit system.
+              #$@(if (target-64bit?)
+                     #~((setenv "USE_64" "1"))
+                     #~())))
+          (replace 'check
+            (lambda* (#:key tests? #:allow-other-keys)
+              (if tests?
+                  (begin
+                    ;; Use 127.0.0.1 instead of $HOST.$DOMSUF as HOSTADDR for
+                    ;; testing.  The latter requires a working DNS or /etc/hosts.
+                    (setenv "DOMSUF" "localdomain")
+                    (setenv "USE_IP" "TRUE")
+                    (setenv "IP_ADDRESS" "127.0.0.1")
 
-                   ;; The "PayPalEE.cert" certificate expires every six months,
-                   ;; leading to test failures:
-                   ;; <https://bugzilla.mozilla.org/show_bug.cgi?id=609734>.  To
-                   ;; work around that, set the time to roughly the release date.
-                   (invoke "faketime" "2021-09-30" "./nss/tests/all.sh"))
-                 (format #t "test suite not run~%"))))
-         (replace 'install
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (bin (string-append (assoc-ref outputs "bin") "/bin"))
-                    (inc (string-append out "/include/nss"))
-                    (lib (string-append out "/lib/nss"))
-                    (obj (match (scandir "dist" (cut string-suffix? "OBJ" <>))
-                           ((obj) (string-append "dist/" obj)))))
-               ;; Install nss-config to $out/bin.
-               (install-file (string-append obj "/bin/nss-config")
-                             (string-append out "/bin"))
-               (delete-file (string-append obj "/bin/nss-config"))
-               ;; Install nss.pc to $out/lib/pkgconfig.
-               (install-file (string-append obj "/lib/pkgconfig/nss.pc")
-                             (string-append out "/lib/pkgconfig"))
-               (delete-file (string-append obj "/lib/pkgconfig/nss.pc"))
-               (rmdir (string-append obj "/lib/pkgconfig"))
-               ;; Install other files.
-               (copy-recursively "dist/public/nss" inc)
-               (copy-recursively (string-append obj "/bin") bin)
-               (copy-recursively (string-append obj "/lib") lib)))))))
+                    ;; The "PayPalEE.cert" certificate expires every six months,
+                    ;; leading to test failures:
+                    ;; <https://bugzilla.mozilla.org/show_bug.cgi?id=609734>.  To
+                    ;; work around that, set the time to roughly the release date.
+                    (invoke "faketime" "2022-06-01" "./nss/tests/all.sh"))
+                  (format #t "test suite not run~%"))))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append (assoc-ref outputs "bin") "/bin"))
+                     (inc (string-append out "/include/nss"))
+                     (lib (string-append out "/lib/nss"))
+                     (obj (match (scandir "dist" (cut string-suffix? "OBJ" <>))
+                            ((obj) (string-append "dist/" obj)))))
+                ;; Install nss-config to $out/bin.
+                (install-file (string-append obj "/bin/nss-config")
+                              (string-append out "/bin"))
+                (delete-file (string-append obj "/bin/nss-config"))
+                ;; Install nss.pc to $out/lib/pkgconfig.
+                (install-file (string-append obj "/lib/pkgconfig/nss.pc")
+                              (string-append out "/lib/pkgconfig"))
+                (delete-file (string-append obj "/lib/pkgconfig/nss.pc"))
+                (rmdir (string-append obj "/lib/pkgconfig"))
+                ;; Install other files.
+                (copy-recursively "dist/public/nss" inc)
+                (copy-recursively (string-append obj "/bin") bin)
+                (copy-recursively (string-append obj "/lib") lib)))))))
     (inputs
      (list sqlite zlib))
     (propagated-inputs
-     (list nspr))                 ;required by nss.pc.
+     (list nspr))                       ;required by nss.pc.
     (native-inputs
-     (list perl libfaketime))   ;for tests
+     (list perl libfaketime))           ;for tests
 
     ;; The NSS test suite takes around 48 hours on Loongson 3A (MIPS) when
     ;; another build is happening concurrently on the same machine.
diff --git a/gnu/packages/patches/akonadi-not-relocatable.patch b/gnu/packages/patches/akonadi-not-relocatable.patch
index c3964c5c05..bd4cbee79f 100644
--- a/gnu/packages/patches/akonadi-not-relocatable.patch
+++ b/gnu/packages/patches/akonadi-not-relocatable.patch
@@ -1,19 +1,18 @@
-From bc018b4bc816a3b51deb9739bedbf8a2268d0684 Mon Sep 17 00:00:00 2001
-From: gnidorah <gnidorah@users.noreply.github.com>
-Date: Fri, 22 Dec 2017 17:36:03 +0300
-Subject: [PATCH] Revert "Make Akonadi installation properly relocatable"
+From 4b90a0bd4411a66bbe6ecf85ce89a60a58bee969 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Sun, 25 Apr 2021 08:01:21 -0500
+Subject: [PATCH 3/3] akonadi revert make relocatable
 
-This reverts commit b2bb55f13f2ac783f89cc414de8c39f62fa2096a.
 ---
  CMakeLists.txt            | 3 ---
  KF5AkonadiConfig.cmake.in | 6 +++---
  2 files changed, 3 insertions(+), 6 deletions(-)
 
-Index: akonadi-19.08.0/CMakeLists.txt
-===================================================================
---- akonadi-19.08.0.orig/CMakeLists.txt
-+++ akonadi-19.08.0/CMakeLists.txt
-@@ -306,9 +306,6 @@ configure_package_config_file(
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 4e8cc81..63161b7 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -368,9 +368,6 @@ configure_package_config_file(
      "${CMAKE_CURRENT_SOURCE_DIR}/KF5AkonadiConfig.cmake.in"
      "${CMAKE_CURRENT_BINARY_DIR}/KF5AkonadiConfig.cmake"
      INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
@@ -21,29 +20,25 @@ Index: akonadi-19.08.0/CMakeLists.txt
 -              AKONADI_INCLUDE_DIR
 -              KF5Akonadi_DATA_DIR
  )
- 
+
  install(FILES
-Index: akonadi-19.08.0/KF5AkonadiConfig.cmake.in
-===================================================================
---- akonadi-19.08.0.orig/KF5AkonadiConfig.cmake.in
-+++ akonadi-19.08.0/KF5AkonadiConfig.cmake.in
-@@ -26,8 +26,8 @@ if(BUILD_TESTING)
-     find_dependency(Qt5Test "@QT_REQUIRED_VERSION@")
- endif()
- 
+diff --git a/KF5AkonadiConfig.cmake.in b/KF5AkonadiConfig.cmake.in
+index bcf7320..1574319 100644
+--- a/KF5AkonadiConfig.cmake.in
++++ b/KF5AkonadiConfig.cmake.in
+@@ -1,10 +1,10 @@
+ @PACKAGE_INIT@
+
 -set_and_check(AKONADI_DBUS_INTERFACES_DIR  "@PACKAGE_AKONADI_DBUS_INTERFACES_INSTALL_DIR@")
 -set_and_check(AKONADI_INCLUDE_DIR          "@PACKAGE_AKONADI_INCLUDE_DIR@")
 +set_and_check(AKONADI_DBUS_INTERFACES_DIR  "@AKONADI_DBUS_INTERFACES_INSTALL_DIR@")
 +set_and_check(AKONADI_INCLUDE_DIR          "@AKONADI_INCLUDE_DIR@")
- 
- find_dependency(Boost "@Boost_MINIMUM_VERSION@")
- 
-@@ -35,7 +35,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/KF5Ako
- include(${CMAKE_CURRENT_LIST_DIR}/KF5AkonadiMacros.cmake)
- 
+
  # The directory where akonadi-xml.xsd and kcfg2dbus.xsl are installed
 -set(KF5Akonadi_DATA_DIR "@PACKAGE_KF5Akonadi_DATA_DIR@")
 +set(KF5Akonadi_DATA_DIR "@KF5Akonadi_DATA_DIR@")
- 
- ####################################################################################
- # CMAKE_AUTOMOC
+
+ # set the directories
+ if(NOT AKONADI_INSTALL_DIR)
+--
+2.31.1
diff --git a/gnu/packages/patches/akonadi-paths.patch b/gnu/packages/patches/akonadi-paths.patch
index ac08ec5448..bb4a19ede0 100644
--- a/gnu/packages/patches/akonadi-paths.patch
+++ b/gnu/packages/patches/akonadi-paths.patch
@@ -1,26 +1,26 @@
 This is based on the respectve patch from NixPkgs, but with the parts pinning
-mysql and postgresql executables removed. The our package definition on why.
+mysql and postgresql executables removed. See our package definition on why.
 
 diff --git a/src/akonadicontrol/agentmanager.cpp b/src/akonadicontrol/agentmanager.cpp
 --- a/src/akonadicontrol/agentmanager.cpp
 +++ b/src/akonadicontrol/agentmanager.cpp
-@@ -61,7 +61,7 @@ public:
-                 []() {
-                     QCoreApplication::instance()->exit(255);
-                 });
+@@ -47,7 +47,7 @@ public:
+         connect(this, &Akonadi::ProcessControl::unableToStart, this, []() {
+             QCoreApplication::instance()->exit(255);
+         });
 -        start(QStringLiteral("akonadiserver"), args, RestartOnCrash);
-+        start(QLatin1String(NIX_OUT "/bin/akonadiserver"), args, RestartOnCrash);
++        start(QStringLiteral(NIX_OUT "/bin/akonadiserver"), args, RestartOnCrash);
      }
- 
+
      ~StorageProcessControl() override
-@@ -84,7 +84,7 @@ public:
-                 []() {
-                     qCCritical(AKONADICONTROL_LOG) << "Failed to start AgentServer!";
-                 });
+@@ -69,7 +69,7 @@ public:
+         connect(this, &Akonadi::ProcessControl::unableToStart, this, []() {
+             qCCritical(AKONADICONTROL_LOG) << "Failed to start AgentServer!";
+         });
 -        start(QStringLiteral("akonadi_agent_server"), args, RestartOnCrash);
-+        start(QLatin1String(NIX_OUT "/bin/akonadi_agent_server"), args, RestartOnCrash);
++        start(QStringLiteral(NIX_OUT "/bin/akonadi_agent_server"), args, RestartOnCrash);
      }
- 
+
      ~AgentServerProcessControl() override
 diff --git a/src/akonadicontrol/agentprocessinstance.cpp b/src/akonadicontrol/agentprocessinstance.cpp
 --- a/src/akonadicontrol/agentprocessinstance.cpp
@@ -37,12 +37,12 @@ diff --git a/src/akonadicontrol/agentprocessinstance.cpp b/src/akonadicontrol/ag
 diff --git a/src/server/storage/dbconfigmysql.cpp b/src/server/storage/dbconfigmysql.cpp
 --- a/src/server/storage/dbconfigmysql.cpp
 +++ b/src/server/storage/dbconfigmysql.cpp
-@@ -209,7 +209,7 @@ bool DbConfigMysql::startInternalServer()
+@@ -215,7 +215,7 @@ bool DbConfigMysql::startInternalServer()
  #endif
- 
+
      // generate config file
 -    const QString globalConfig = StandardDirs::locateResourceFile("config", QStringLiteral("mysql-global.conf"));
 +    const QString globalConfig = QLatin1String(NIX_OUT "/etc/xdg/akonadi/mysql-global.conf");
-     const QString localConfig  = StandardDirs::locateResourceFile("config", QStringLiteral("mysql-local.conf"));
+     const QString localConfig = StandardDirs::locateResourceFile("config", QStringLiteral("mysql-local.conf"));
      const QString actualConfig = StandardDirs::saveDir("data") + QLatin1String("/mysql.conf");
      if (globalConfig.isEmpty()) {
diff --git a/gnu/packages/patches/akonadi-timestamps.patch b/gnu/packages/patches/akonadi-timestamps.patch
index e299a6991f..df81fdb2dc 100644
--- a/gnu/packages/patches/akonadi-timestamps.patch
+++ b/gnu/packages/patches/akonadi-timestamps.patch
@@ -2,12 +2,12 @@ Index: akonadi-19.08.0/src/server/storage/dbconfigmysql.cpp
 ===================================================================
 --- akonadi-19.08.0.orig/src/server/storage/dbconfigmysql.cpp
 +++ akonadi-19.08.0/src/server/storage/dbconfigmysql.cpp
-@@ -235,8 +235,7 @@ bool DbConfigMysql::startInternalServer(
+@@ -260,8 +260,7 @@ bool DbConfigMysql::startInternalServer(
      bool confUpdate = false;
      QFile actualFile(actualConfig);
      // update conf only if either global (or local) is newer than actual
--    if ((QFileInfo(globalConfig).lastModified() > QFileInfo(actualFile).lastModified()) ||
--            (QFileInfo(localConfig).lastModified()  > QFileInfo(actualFile).lastModified())) {
+-    if ((QFileInfo(globalConfig).lastModified() > QFileInfo(actualFile).lastModified())
+-        || (QFileInfo(localConfig).lastModified() > QFileInfo(actualFile).lastModified())) {
 +    if (true) {
          QFile globalFile(globalConfig);
          QFile localFile(localConfig);
diff --git a/gnu/packages/patches/firebird-riscv64-support-pt1.patch b/gnu/packages/patches/firebird-riscv64-support-pt1.patch
new file mode 100644
index 0000000000..a46bfe208a
--- /dev/null
+++ b/gnu/packages/patches/firebird-riscv64-support-pt1.patch
@@ -0,0 +1,42 @@
+https://salsa.debian.org/firebird-team/firebird3.0/-/raw/master/debian/patches/out/riscv64-prefix.patch
+
+Description: add builds/posix/prefix.linux_riscv64, missing upstream
+ It appears the commit adding RiscV64 support
+ (1e8e7858db84750a77006d307bf28e9686f9414e) misses the build prefix file
+ Here's one submitted by Manuel A. Fernandez Montecelo
+Author: Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>
+Bug: http://tracker.firebirdsql.org/browse/CORE-5851
+Bug-Debian: https://bugs.debian.org/895257
+Author: Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>
+
+--- /dev/null
++++ b/builds/posix/prefix.linux_riscv64
+@@ -0,0 +1,28 @@
++# The contents of this file are subject to the Interbase Public
++# License Version 1.0 (the "License"); you may not use this file
++# except in compliance with the License. You may obtain a copy
++# of the License at http://www.Inprise.com/IPL.html
++#
++# Software distributed under the License is distributed on an
++# "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
++# or implied. See the License for the specific language governing
++# rights and limitations under the License.
++#
++# The Original Code was created by Inprise Corporation
++# and its predecessors. Portions created by Inprise Corporation are
++# Copyright (C) Inprise Corporation.
++#
++# All Rights Reserved.
++# Contributor(s): ______________________________________.
++# Start of file prefix.linux:  $(VERSION)  $(PLATFORM)
++#      14 Apr 2008     Alan Barclay    alan AT escribe.co.uk
++#      2018, "Manuel A. Fernandez Montecelo" <manuel.montezelo@gmail.com>
++
++
++#LD=@CXX@
++
++#PROD_FLAGS=-ggdb -O3 -fno-omit-frame-pointer -DLINUX -pipe -MMD -fPIC
++#DEV_FLAGS=-ggdb -DLINUX -DDEBUG_GDS_ALLOC -pipe -MMD -p -fPIC -Wall -Wno-switch
++
++PROD_FLAGS=-O3 -DLINUX -DRISCV64 -pipe -p -MMD -fPIC -fsigned-char -fmessage-length=0 -std=gnu++03 -fno-delete-null-pointer-checks
++DEV_FLAGS=-ggdb -DLINUX -DRISCV64 -pipe -p -MMD -fPIC -Wall -fsigned-char -fmessage-length=0 -Wno-non-virtual-dtor
diff --git a/gnu/packages/patches/firebird-riscv64-support-pt2.patch b/gnu/packages/patches/firebird-riscv64-support-pt2.patch
new file mode 100644
index 0000000000..a6f93c1a50
--- /dev/null
+++ b/gnu/packages/patches/firebird-riscv64-support-pt2.patch
@@ -0,0 +1,108 @@
+https://salsa.debian.org/firebird-team/firebird3.0/-/raw/master/debian/patches/upstream/riscv64-support.patch
+
+1e8e7858db84750a77006d307bf28e9686f9414e Patch for CORE-5779: support for riscv64, also some code fixes related with prior ports
+ Minor corrections compared to the commit above due to whitespace/spelling
+ differences with 3.0 version
+Bug-Debian: https://bugs.debian.org/895257
+Bug: http://tracker.firebirdsql.org/browse/CORE-5779
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -251,6 +251,18 @@ dnl CPU_TYPE=ppc64
+     libdir=/usr/lib64
+     ;;
+ 
++  riscv64*-*-linux*)
++    MAKEFILE_PREFIX=linux_riscv64
++    INSTALL_PREFIX=linux
++    PLATFORM=LINUX
++    AC_DEFINE(LINUX, 1, [Define this if OS is Linux])
++    EDITLINE_FLG=Y
++    SHRLIB_EXT=so
++    STD_EDITLINE=true
++    STD_ICU=true
++    libdir=/usr/lib64
++    ;;
++
+   powerpc64le-*-linux*)
+     MAKEFILE_PREFIX=linux_powerpc64el
+     INSTALL_PREFIX=linux
+--- a/src/common/classes/DbImplementation.cpp
++++ b/src/common/classes/DbImplementation.cpp
+@@ -49,6 +49,7 @@ static const UCHAR CpuAlpha = 14;
+ static const UCHAR CpuArm64 = 15;
+ static const UCHAR CpuPowerPc64el = 16;
+ static const UCHAR CpuM68k = 17;
++static const UCHAR CpuRiscV64 = 18;
+ 
+ static const UCHAR OsWindows = 0;
+ static const UCHAR OsLinux = 1;
+@@ -89,7 +90,8 @@ const char* hardware[] = {
+ 	"Alpha",
+ 	"ARM64",
+ 	"PowerPC64el",
+-	"M68k"
++	"M68k",
++	"RiscV64"
+ };
+ 
+ const char* operatingSystem[] = {
+@@ -116,22 +118,22 @@ const char* compiler[] = {
+ // This table lists pre-fb3 implementation codes
+ const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] =
+ {
+-//				Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PowerPC64el
+-/* Windows */	50,		68,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
+-/* Linux */		60,		66,		65,		69,		86,		71,		72,		75, 	76,		79, 	78,		80,		81,		82,		83,		84,		85,
+-/* Darwin */	70,		73,		0,		63,		77,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
+-/* Solaris */	0,		0,		30,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
+-/* HPUX */		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		31,		0,		0,		0,
+-/* AIX */			0,		0,		0,		35,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
+-/* MVS */			0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
+-/* FreeBSD */	61,		67,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
+-/* NetBSD */	62,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0
++//				Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PPC64el	M68k	RiscV64
++/* Windows */	50,		68,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
++/* Linux */		60,		66,		65,		69,		86,		71,		72,		75, 	76,		79, 	78,		80,		81,		82,		83,		84,		85,		87,		88,
++/* Darwin */	70,		73,		0,		63,		77,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
++/* Solaris */	0,		0,		30,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
++/* HPUX */		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		31,		0,		0,		0,		0,		0,
++/* AIX */		0,		0,		0,		35,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
++/* MVS */		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
++/* FreeBSD */	61,		67,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,
++/* NetBSD */	62,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0
+ };
+ 
+ const UCHAR backEndianess[FB_NELEM(hardware)] =
+ {
+-//	Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PowerPC64el	M68k
+-	0,		0,		1,		1,		1,		0,		1,		0,		0,		1,		1,		0,		1,		1,		0,		0,		0,		1
++//	Intel	AMD		Sparc	PPC		PPC64	MIPSEL	MIPS	ARM		IA64	s390	s390x	SH		SHEB	HPPA	Alpha	ARM64	PPC64el	M68k	RiscV64
++	0,		0,		1,		1,		1,		0,		1,		0,		0,		1,		1,		0,		1,		1,		0,		0,		0,		1,		0,
+ };
+ 
+ } // anonymous namespace
+--- a/src/common/common.h
++++ b/src/common/common.h
+@@ -135,6 +135,10 @@
+ #define FB_CPU CpuArm64
+ #endif /* ARM64 */
+ 
++#ifdef RISCV64
++#define FB_CPU CpuRiscV64
++#endif /* RISCV64 */
++
+ #ifdef sparc
+ #define FB_CPU CpuUltraSparc
+ #define RISC_ALIGNMENT
+--- a/src/jrd/inf_pub.h
++++ b/src/jrd/inf_pub.h
+@@ -247,7 +247,7 @@ enum  info_db_implementations
+ 	isc_info_db_impl_linux_ppc64el = 85,
+ 	isc_info_db_impl_linux_ppc64 = 86,
+ 	isc_info_db_impl_linux_m68k = 87,
+-
++	isc_info_db_impl_linux_riscv64 = 88,
+ 
+ 	isc_info_db_impl_last_value   // Leave this LAST!
+ };
diff --git a/gnu/packages/patches/freeglut-gcc-compat.patch b/gnu/packages/patches/freeglut-gcc-compat.patch
deleted file mode 100644
index 126bbd89f4..0000000000
--- a/gnu/packages/patches/freeglut-gcc-compat.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-Fix build failure with GCC 10.
-
-Taken from upstream:
-https://github.com/dcnieho/FreeGLUT/commit/b9998bbc1e1c329f6bf69c24606a2be7a4973b8c
-
-diff --git a/src/fg_gl2.c b/src/fg_gl2.c
---- a/src/fg_gl2.c
-+++ b/src/fg_gl2.c
-@@ -27,6 +27,20 @@
- #include "fg_internal.h"
- #include "fg_gl2.h"
- 
-+#ifndef GL_ES_VERSION_2_0
-+/* GLES2 has the corresponding entry points built-in, and these fgh-prefixed
-+ * names are defined in fg_gl2.h header to reference them, for any other case,
-+ * define them as function pointers here.
-+ */
-+FGH_PFNGLGENBUFFERSPROC fghGenBuffers;
-+FGH_PFNGLDELETEBUFFERSPROC fghDeleteBuffers;
-+FGH_PFNGLBINDBUFFERPROC fghBindBuffer;
-+FGH_PFNGLBUFFERDATAPROC fghBufferData;
-+FGH_PFNGLENABLEVERTEXATTRIBARRAYPROC fghEnableVertexAttribArray;
-+FGH_PFNGLDISABLEVERTEXATTRIBARRAYPROC fghDisableVertexAttribArray;
-+FGH_PFNGLVERTEXATTRIBPOINTERPROC fghVertexAttribPointer;
-+#endif
-+
- void FGAPIENTRY glutSetVertexAttribCoord3(GLint attrib) {
-   if (fgStructure.CurrentWindow != NULL)
-     fgStructure.CurrentWindow->Window.attribute_v_coord = attrib;
-diff --git a/src/fg_gl2.h b/src/fg_gl2.h
---- a/src/fg_gl2.h
-+++ b/src/fg_gl2.h
-@@ -67,13 +67,13 @@ typedef void (APIENTRY *FGH_PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
- typedef void (APIENTRY *FGH_PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint);
- typedef void (APIENTRY *FGH_PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
- 
--FGH_PFNGLGENBUFFERSPROC fghGenBuffers;
--FGH_PFNGLDELETEBUFFERSPROC fghDeleteBuffers;
--FGH_PFNGLBINDBUFFERPROC fghBindBuffer;
--FGH_PFNGLBUFFERDATAPROC fghBufferData;
--FGH_PFNGLENABLEVERTEXATTRIBARRAYPROC fghEnableVertexAttribArray;
--FGH_PFNGLDISABLEVERTEXATTRIBARRAYPROC fghDisableVertexAttribArray;
--FGH_PFNGLVERTEXATTRIBPOINTERPROC fghVertexAttribPointer;
-+extern FGH_PFNGLGENBUFFERSPROC fghGenBuffers;
-+extern FGH_PFNGLDELETEBUFFERSPROC fghDeleteBuffers;
-+extern FGH_PFNGLBINDBUFFERPROC fghBindBuffer;
-+extern FGH_PFNGLBUFFERDATAPROC fghBufferData;
-+extern FGH_PFNGLENABLEVERTEXATTRIBARRAYPROC fghEnableVertexAttribArray;
-+extern FGH_PFNGLDISABLEVERTEXATTRIBARRAYPROC fghDisableVertexAttribArray;
-+extern FGH_PFNGLVERTEXATTRIBPOINTERPROC fghVertexAttribPointer;
- 
- #    endif
- 
diff --git a/gnu/packages/patches/grantlee-merge-theme-dirs.patch b/gnu/packages/patches/grantlee-merge-theme-dirs.patch
deleted file mode 100644
index 96a15a387b..0000000000
--- a/gnu/packages/patches/grantlee-merge-theme-dirs.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-Taken from nixpkgs, see
-grantleetheme: merge themes across multiple prefixes
-<https://github.com/NixOS/nixpkgs/commits/master/pkgs/applications/kde/grantleetheme/grantlee-merge-theme-dirs.patch>
-
-
-diff --git a/src/grantleetheme.cpp b/src/grantleetheme.cpp
-index 27d5bc8..8d43140 100644
---- a/src/grantleetheme.cpp
-+++ b/src/grantleetheme.cpp
-@@ -46,7 +46,7 @@ ThemePrivate::ThemePrivate(const ThemePrivate &other)
-     , description(other.description)
-     , name(other.name)
-     , dirName(other.dirName)
--    , absolutePath(other.absolutePath)
-+    , absolutePaths(other.absolutePaths)
-     , author(other.author)
-     , email(other.email)
-     , loader(other.loader)
-@@ -64,12 +64,15 @@ void ThemePrivate::setupEngine()
- 
- void ThemePrivate::setupLoader()
- {
--    // Get the parent dir with themes, we set the theme directory separately
--    QDir dir(absolutePath);
--    dir.cdUp();
-+    QStringList templateDirs;
-+    for (const QString& path : absolutePaths) {
-+        QDir dir(path);
-+        dir.cdUp();
-+        templateDirs << dir.absolutePath();
-+    }
- 
-     loader = QSharedPointer<GrantleeTheme::QtResourceTemplateLoader>::create();
--    loader->setTemplateDirs({ dir.absolutePath() });
-+    loader->setTemplateDirs(templateDirs);
-     loader->setTheme(dirName);
- 
-     if (!sEngine) {
-@@ -121,7 +124,7 @@ Theme::Theme(const QString &themePath, const QString &dirName, const QString &de
-     KConfigGroup group(&config, QStringLiteral("Desktop Entry"));
-     if (group.isValid()) {
-         d->dirName = dirName;
--        d->absolutePath = themePath;
-+        d->absolutePaths = QStringList(themePath);
-         d->name = group.readEntry("Name", QString());
-         d->description = group.readEntry("Description", QString());
-         d->themeFileName = group.readEntry("FileName", QString());
-@@ -140,7 +143,7 @@ Theme::~Theme()
- 
- bool Theme::operator==(const Theme &other) const
- {
--    return isValid() && other.isValid() && d->absolutePath == other.absolutePath();
-+    return isValid() && other.isValid() && d->absolutePaths == other.absolutePaths();
- }
- 
- Theme &Theme::operator=(const Theme &other)
-@@ -184,7 +187,15 @@ QString Theme::dirName() const
- 
- QString Theme::absolutePath() const
- {
--    return d->absolutePath;
-+    if (! d->absolutePaths.isEmpty()) {
-+      return d->absolutePaths.first();
-+    };
-+    return QString();
-+}
-+
-+QStringList Theme::absolutePaths() const
-+{
-+    return d->absolutePaths;
- }
- 
- QString Theme::author() const
-@@ -223,6 +231,13 @@ QString Theme::render(const QString &templateName, const QVariantHash &data, con
-     return result;
- }
- 
-+void Theme::addThemeDir(const QString& path)
-+{
-+    QDir dir(path);
-+    dir.cdUp();
-+    d->absolutePaths << dir.absolutePath();
-+}
-+
- void Theme::addPluginPath(const QString &path)
- {
-     if (!ThemePrivate::sEngine) {
-diff --git a/src/grantleetheme.h b/src/grantleetheme.h
-index a25c27b..be38299 100644
---- a/src/grantleetheme.h
-+++ b/src/grantleetheme.h
-@@ -48,11 +48,14 @@ public:
-     Q_REQUIRED_RESULT QStringList displayExtraVariables() const;
-     Q_REQUIRED_RESULT QString dirName() const;
-     Q_REQUIRED_RESULT QString absolutePath() const;
-+    Q_REQUIRED_RESULT QStringList absolutePaths() const;
-     Q_REQUIRED_RESULT QString author() const;
-     Q_REQUIRED_RESULT QString authorEmail() const;
- 
-     Q_REQUIRED_RESULT QString render(const QString &templateName, const QVariantHash &data, const QByteArray &applicationDomain = QByteArray());
- 
-+    void addThemeDir(const QString&);
-+
-     static void addPluginPath(const QString &path);
- 
- private:
-diff --git a/src/grantleetheme_p.h b/src/grantleetheme_p.h
-index eb73dcb..00510e9 100644
---- a/src/grantleetheme_p.h
-+++ b/src/grantleetheme_p.h
-@@ -43,7 +43,7 @@ public:
-     QString description;
-     QString name;
-     QString dirName;
--    QString absolutePath;
-+    QStringList absolutePaths;
-     QString author;
-     QString email;
- 
-diff --git a/src/grantleethememanager.cpp b/src/grantleethememanager.cpp
-index 606d717..dc99041 100644
---- a/src/grantleethememanager.cpp
-+++ b/src/grantleethememanager.cpp
-@@ -125,25 +125,18 @@ public:
- 
-         for (const QString &directory : qAsConst(themesDirectories)) {
-             QDirIterator dirIt(directory, QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot);
--            QStringList alreadyLoadedThemeName;
-             while (dirIt.hasNext()) {
-                 dirIt.next();
-                 const QString dirName = dirIt.fileName();
-                 GrantleeTheme::Theme theme = q->loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
-                 if (theme.isValid()) {
-                     QString themeName = theme.name();
--                    if (alreadyLoadedThemeName.contains(themeName)) {
--                        int i = 2;
--                        const QString originalName(theme.name());
--                        while (alreadyLoadedThemeName.contains(themeName)) {
--                            themeName = originalName + QStringLiteral(" (%1)").arg(i);
--                            ++i;
--                        }
--                        theme.d->name = themeName;
-+                    QMap<QString, GrantleeTheme::Theme>::iterator i = themes.find(dirName);
-+                    if (i != themes.end()) {
-+                        i.value().addThemeDir(dirIt.filePath());
-+                    } else {
-+                        themes.insert(dirName, theme);
-                     }
--                    alreadyLoadedThemeName << themeName;
--                    themes.insert(dirName, theme);
--                    //qDebug()<<" theme.name()"<<theme.name();
-                 }
-             }
-             watch->addDir(directory);
-@@ -366,7 +359,7 @@ QString ThemeManager::pathFromThemes(const QString &themesRelativePath, const QS
-                 GrantleeTheme::Theme theme = loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
-                 if (theme.isValid()) {
-                     if (dirName == themeName) {
--                        return theme.absolutePath();
-+                        return theme.absolutePaths().first();
-                     }
-                 }
-             }
diff --git a/gnu/packages/patches/gst-plugins-good-fix-test.patch b/gnu/packages/patches/gst-plugins-good-fix-test.patch
deleted file mode 100644
index 38ec0ba802..0000000000
--- a/gnu/packages/patches/gst-plugins-good-fix-test.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-Fix a broken test:
-
-https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/803
-
-Patches copied from upstream source repository:
-
-https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/commit/2ce5909f3a0b0da3abb7b794215d6b8b72a3b7fa
-https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/commit/f5310ce346180a717f091f2f09bcbb3ddfb15436
-
-From 2ce5909f3a0b0da3abb7b794215d6b8b72a3b7fa Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim@centricular.com>
-Date: Thu, 12 Nov 2020 23:38:21 +0000
-Subject: [PATCH 1/2] tests: qtdemux: fix crash on 32-bit architectures
-
-Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/803
-
-Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/815>
----
- tests/check/elements/qtdemux.c | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
-
-diff --git a/tests/check/elements/qtdemux.c b/tests/check/elements/qtdemux.c
-index 5271c6576..0c748278b 100644
---- a/tests/check/elements/qtdemux.c
-+++ b/tests/check/elements/qtdemux.c
-@@ -797,9 +797,10 @@ GST_START_TEST (test_qtdemux_pad_names)
-       "protection-system", G_TYPE_STRING,
-       "9a04f079-9840-4286-ab92-e65be0885f95", NULL);
-   caps =
--      gst_caps_new_simple ("video/quicktime", "variant", G_TYPE_STRING,
--      "mss-fragmented", "timesacle", G_TYPE_UINT64, 10000000, "media-caps",
--      GST_TYPE_CAPS, mediacaps, NULL);
-+      gst_caps_new_simple ("video/quicktime",
-+      "variant", G_TYPE_STRING, "mss-fragmented",
-+      "timesacle", G_TYPE_UINT64, G_GUINT64_CONSTANT (10000000),
-+      "media-caps", GST_TYPE_CAPS, mediacaps, NULL);
- 
-   /* Send segment event* */
-   event = gst_event_new_caps (caps);
-@@ -852,9 +853,10 @@ GST_START_TEST (test_qtdemux_pad_names)
-       "protection-system", G_TYPE_STRING,
-       "9a04f079-9840-4286-ab92-e65be0885f95", NULL);
-   caps =
--      gst_caps_new_simple ("video/quicktime", "variant", G_TYPE_STRING,
--      "mss-fragmented", "timesacle", G_TYPE_UINT64, 10000000, "media-caps",
--      GST_TYPE_CAPS, mediacaps, NULL);
-+      gst_caps_new_simple ("video/quicktime",
-+      "variant", G_TYPE_STRING, "mss-fragmented",
-+      "timesacle", G_TYPE_UINT64, G_GUINT64_CONSTANT (10000000),
-+      "media-caps", GST_TYPE_CAPS, mediacaps, NULL);
- 
-   /* Send segment event* */
-   event = gst_event_new_caps (caps);
--- 
-2.30.0
-
-
-From f5310ce346180a717f091f2f09bcbb3ddfb15436 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim@centricular.com>
-Date: Thu, 12 Nov 2020 23:39:21 +0000
-Subject: [PATCH 2/2] tests: qtdemux: fix typo in caps field
-
-timesacle -> timescale
-
-Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/815>
----
- tests/check/elements/qtdemux.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/tests/check/elements/qtdemux.c b/tests/check/elements/qtdemux.c
-index 0c748278b..4a14c45c0 100644
---- a/tests/check/elements/qtdemux.c
-+++ b/tests/check/elements/qtdemux.c
-@@ -799,7 +799,7 @@ GST_START_TEST (test_qtdemux_pad_names)
-   caps =
-       gst_caps_new_simple ("video/quicktime",
-       "variant", G_TYPE_STRING, "mss-fragmented",
--      "timesacle", G_TYPE_UINT64, G_GUINT64_CONSTANT (10000000),
-+      "timescale", G_TYPE_UINT64, G_GUINT64_CONSTANT (10000000),
-       "media-caps", GST_TYPE_CAPS, mediacaps, NULL);
- 
-   /* Send segment event* */
-@@ -855,7 +855,7 @@ GST_START_TEST (test_qtdemux_pad_names)
-   caps =
-       gst_caps_new_simple ("video/quicktime",
-       "variant", G_TYPE_STRING, "mss-fragmented",
--      "timesacle", G_TYPE_UINT64, G_GUINT64_CONSTANT (10000000),
-+      "timescale", G_TYPE_UINT64, G_GUINT64_CONSTANT (10000000),
-       "media-caps", GST_TYPE_CAPS, mediacaps, NULL);
- 
-   /* Send segment event* */
--- 
-2.30.0
-
diff --git a/gnu/packages/patches/kdbusaddons-kinit-file-name.patch b/gnu/packages/patches/kdbusaddons-kinit-file-name.patch
deleted file mode 100644
index ffed88e043..0000000000
--- a/gnu/packages/patches/kdbusaddons-kinit-file-name.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Add placeholder for kinit's store file name.
-
-diff --git a/src/kdeinitinterface.cpp b/src/kdeinitinterface.cpp
-index 22fa5e5..3d40937 100644
---- a/src/kdeinitinterface.cpp
-+++ b/src/kdeinitinterface.cpp
-@@ -52,7 +52,7 @@ void KDEInitInterface::ensureKdeinitRunning()
-     // If not found in system paths, search other paths
-     if (srv.isEmpty()) {
-         const QStringList searchPaths = QStringList()
--            << QCoreApplication::applicationDirPath() // then look where our application binary is located
-+            << QString::fromUtf8("@SUBSTITUTEME@/bin") // using QStringLiteral would be more efficient, but breaks guix store reference detection.
-             << QLibraryInfo::location(QLibraryInfo::BinariesPath); // look where exec path is (can be set in qt.conf)
-         srv = QStandardPaths::findExecutable(QStringLiteral("kdeinit5"), searchPaths);
-         if (srv.isEmpty()) {
diff --git a/gnu/packages/patches/kinit-kdeinit-extra_libs.patch b/gnu/packages/patches/kinit-kdeinit-extra_libs.patch
index 1271f3df7d..b27c6ed535 100644
--- a/gnu/packages/patches/kinit-kdeinit-extra_libs.patch
+++ b/gnu/packages/patches/kinit-kdeinit-extra_libs.patch
@@ -21,27 +21,6 @@ pkgs/development/libraries/kde-frameworks/kinit/kdeinit-extra_libs.patch
  #endif
  };
  #endif
-@@ -1533,20 +1531,6 @@ static int initXconnection()
- }
- #endif
- 
--#ifndef Q_OS_OSX
--// Find a shared lib in the lib dir, e.g. libkio.so.
--// Completely unrelated to plugins.
--static QString findSharedLib(const QString &lib)
--{
--    QString path = QFile::decodeName(CMAKE_INSTALL_PREFIX "/" LIB_INSTALL_DIR "/") + lib;
--    if (QFile::exists(path)) {
--        return path;
--    }
--    // We could also look in LD_LIBRARY_PATH, but really, who installs the main libs in different prefixes?
--    return QString();
--}
--#endif
--
- extern "C" {
- 
-     static void secondary_child_handler(int)
 @@ -1673,7 +1673,7 @@
  #if defined(Q_OS_UNIX) && !defined(Q_OS_OSX)
      if (!d.suicide && qEnvironmentVariableIsEmpty("KDE_IS_PRELINKED")) {
diff --git a/gnu/packages/patches/kinit-kdeinit-libpath.patch b/gnu/packages/patches/kinit-kdeinit-libpath.patch
deleted file mode 100644
index 6382e8804b..0000000000
--- a/gnu/packages/patches/kinit-kdeinit-libpath.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-Search libraries in GUIX_KF5INIT_LIB_PATH.
-
-Based on an idea by NixOs
-pkgs/development/libraries/kde-frameworks/kinit/kinit-libpath.patch
-
-===================================================================
---- kinit-5.32.0/src/kdeinit/kinit.cpp.orig	2017-10-22 21:02:20.908765455 +0200
-+++ kinit-5.32.0/src/kdeinit/kinit.cpp	2017-10-22 21:03:25.312818248 +0200
-@@ -623,20 +623,18 @@
-             if (libpath_relative) {
-                 // NB: Because Qt makes the actual dlopen() call, the
-                 //     RUNPATH of kdeinit is *not* respected - see
-                 //     https://sourceware.org/bugzilla/show_bug.cgi?id=13945
-                 //     - so we try hacking it in ourselves
--                QString install_lib_dir = QFile::decodeName(
--                        CMAKE_INSTALL_PREFIX "/" LIB_INSTALL_DIR "/");
--                QString orig_libpath = libpath;
--                libpath = install_lib_dir + libpath;
--                l.setFileName(libpath);
--                if (!l.load()) {
--                    libpath = orig_libpath;
--                    l.setFileName(libpath);
--                    l.load();
--                }
-+                // Try to load the library relative to the active profiles.
-+                QByteArrayList profiles = qgetenv("KDEINIT5_LIBRARY_PATH").split(':');
-+                for (const QByteArray &profile: profiles) {
-+                    if (!profile.isEmpty()) {
-+                        l.setFileName(QFile::decodeName(profile) + QStringLiteral("/") + libpath);
-+                        if (l.load()) break;
-+                    }
-+		}
-             } else {
-                 l.load();
-             }
-             if (!l.isLoaded()) {
-                 QString ltdlError(l.errorString());
diff --git a/gnu/packages/patches/kio-search-smbd-on-PATH.patch b/gnu/packages/patches/kio-search-smbd-on-PATH.patch
index 55535ffa11..5118c9a361 100644
--- a/gnu/packages/patches/kio-search-smbd-on-PATH.patch
+++ b/gnu/packages/patches/kio-search-smbd-on-PATH.patch
@@ -1,30 +1,24 @@
-Adopted from NixOS
-pkgs/development/libraries/kde-frameworks/kio/samba-search-path.patch
+From af54a2a37655df26a33bc6783cb472c38f65322f Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@mailbox.org>
+Date: Sun, 28 Mar 2021 10:31:12 -0500
+Subject: [PATCH 1/2] Remove impure smbd search path
 
-===================================================================
---- kio-5.17.0.orig/src/core/ksambashare.cpp
-+++ kio-5.17.0/src/core/ksambashare.cpp
-@@ -67,13 +67,18 @@ KSambaSharePrivate::~KSambaSharePrivate(
- 
+---
+ src/core/ksambashare.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/ksambashare.cpp b/src/core/ksambashare.cpp
+index e810ce4..7cfb4e6 100644
+--- a/src/core/ksambashare.cpp
++++ b/src/core/ksambashare.cpp
+@@ -61,7 +61,7 @@ KSambaSharePrivate::~KSambaSharePrivate()
  bool KSambaSharePrivate::isSambaInstalled()
  {
--    if (QFile::exists(QStringLiteral("/usr/sbin/smbd"))
--            || QFile::exists(QStringLiteral("/usr/local/sbin/smbd"))) {
--        return true;
-+    const QByteArray pathEnv = qgetenv("PATH");
-+    if (!pathEnv.isEmpty()) {
-+        QLatin1Char pathSep(':');
-+        QStringList paths = QFile::decodeName(pathEnv).split(pathSep, QString::SkipEmptyParts);
-+        for (QStringList::iterator it = paths.begin(); it != paths.end(); ++it) {
-+            it->append(QStringLiteral("/smbd"));
-+            if (QFile::exists(*it)) {
-+                return true;
-+            }
-+        }
+     const bool daemonExists =
+-        !QStandardPaths::findExecutable(QStringLiteral("smbd"), {QStringLiteral("/usr/sbin/"), QStringLiteral("/usr/local/sbin/")}).isEmpty();
++        !QStandardPaths::findExecutable(QStringLiteral("smbd")).isEmpty();
+     if (!daemonExists) {
+         qCDebug(KIO_CORE_SAMBASHARE) << "KSambaShare: Could not find smbd";
      }
- 
--    //qDebug() << "Samba is not installed!";
--
-     return false;
- }
- 
+--
+2.30.1
diff --git a/gnu/packages/patches/kmail-Fix-missing-link-libraries.patch b/gnu/packages/patches/kmail-Fix-missing-link-libraries.patch
deleted file mode 100644
index fc784d63dd..0000000000
--- a/gnu/packages/patches/kmail-Fix-missing-link-libraries.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 6b0a3a60870499b20ce9ae2ea07cbc5ee53cbdd2 Mon Sep 17 00:00:00 2001
-From: Hartmut Goebel <h.goebel@crazy-compilers.com>
-Date: Tue, 21 Jan 2020 23:23:38 +0100
-Subject: [PATCH] Fix missing link libraries.
-
-See <https://phabricator.kde.org/D26821>
-
-These are only actually missing if the libraries reside in different
-prefixes, as it is the case in Guix or Nix.
----
- agents/archivemailagent/CMakeLists.txt      | 1 +
- agents/followupreminderagent/CMakeLists.txt | 1 +
- 2 files changed, 2 insertions(+)
-
-diff --git a/agents/archivemailagent/CMakeLists.txt b/agents/archivemailagent/CMakeLists.txt
-index 95c6249de..d0ddcd475 100644
---- a/agents/archivemailagent/CMakeLists.txt
-+++ b/agents/archivemailagent/CMakeLists.txt
-@@ -22,6 +22,7 @@ ki18n_wrap_ui(libarchivemailagent_SRCS ui/archivemailwidget.ui )
- add_library(archivemailagent STATIC ${libarchivemailagent_SRCS})
- target_link_libraries(archivemailagent
-     KF5::MailCommon
-+    KF5::Libkdepim
-     KF5::I18n
-     KF5::Notifications
-     KF5::KIOWidgets
-diff --git a/agents/followupreminderagent/CMakeLists.txt b/agents/followupreminderagent/CMakeLists.txt
-index 9ae7eaa29..527044807 100644
---- a/agents/followupreminderagent/CMakeLists.txt
-+++ b/agents/followupreminderagent/CMakeLists.txt
-@@ -27,6 +27,7 @@ target_link_libraries(followupreminderagent
-     KF5::AkonadiMime
-     KF5::AkonadiAgentBase
-     KF5::DBusAddons
-+    KF5::FollowupReminder
-     KF5::XmlGui
-     KF5::KIOWidgets
-     KF5::Notifications
--- 
-2.21.1
-
diff --git a/gnu/packages/patches/kmplayer-aarch64.patch b/gnu/packages/patches/kmplayer-aarch64.patch
deleted file mode 100644
index 76f713be96..0000000000
--- a/gnu/packages/patches/kmplayer-aarch64.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-Index: b/src/moz-sdk/prcpucfg.h
-===================================================================
---- a/src/moz-sdk/prcpucfg.h
-+++ b/src/moz-sdk/prcpucfg.h
-@@ -288,6 +288,52 @@
- #define PR_BYTES_PER_WORD_LOG2  3
- #define PR_BYTES_PER_DWORD_LOG2 3
- 
-+#elif defined(__aarch64__)
-+
-+#define IS_LITTLE_ENDIAN 1
-+#undef  IS_BIG_ENDIAN
-+#define IS_64
-+
-+#define PR_BYTES_PER_BYTE   1
-+#define PR_BYTES_PER_SHORT  2
-+#define PR_BYTES_PER_INT    4
-+#define PR_BYTES_PER_INT64  8
-+#define PR_BYTES_PER_LONG   8
-+#define PR_BYTES_PER_FLOAT  4
-+#define PR_BYTES_PER_DOUBLE 8
-+#define PR_BYTES_PER_WORD   8
-+#define PR_BYTES_PER_DWORD  8
-+
-+#define PR_BITS_PER_BYTE    8
-+#define PR_BITS_PER_SHORT   16
-+#define PR_BITS_PER_INT     32
-+#define PR_BITS_PER_INT64   64
-+#define PR_BITS_PER_LONG    64
-+#define PR_BITS_PER_FLOAT   32
-+#define PR_BITS_PER_DOUBLE  64
-+#define PR_BITS_PER_WORD    64
-+
-+#define PR_BITS_PER_BYTE_LOG2   3
-+#define PR_BITS_PER_SHORT_LOG2  4
-+#define PR_BITS_PER_INT_LOG2    5
-+#define PR_BITS_PER_INT64_LOG2  6
-+#define PR_BITS_PER_LONG_LOG2   6
-+#define PR_BITS_PER_FLOAT_LOG2  5
-+#define PR_BITS_PER_DOUBLE_LOG2 6
-+#define PR_BITS_PER_WORD_LOG2   6
-+
-+#define PR_ALIGN_OF_SHORT   2
-+#define PR_ALIGN_OF_INT     4
-+#define PR_ALIGN_OF_LONG    8
-+#define PR_ALIGN_OF_INT64   8
-+#define PR_ALIGN_OF_FLOAT   4
-+#define PR_ALIGN_OF_DOUBLE  8
-+#define PR_ALIGN_OF_POINTER 8
-+#define PR_ALIGN_OF_WORD    8
-+
-+#define PR_BYTES_PER_WORD_LOG2  3
-+#define PR_BYTES_PER_DWORD_LOG2 3
-+
- #elif defined(__mc68000__)
- 
- #undef  IS_LITTLE_ENDIAN
diff --git a/gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch b/gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch
deleted file mode 100644
index 6a40dbe347..0000000000
--- a/gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 3def65075c09af4961cd399e8e78ed78cca72e65 Mon Sep 17 00:00:00 2001
-From: Wolfgang Bauer <wbauer@tmo.at>
-Date: Wed, 11 Oct 2017 22:16:02 +0200
-Subject: [PATCH] Fix build with Qt 5.9
-
-Summary:
-moc 5.9 errors out when building:
-Error: Plugin Metadata file "" could not be opened: file to open is a directory
-
-Same issue and fix as https://phabricator.kde.org/D5392 for khtml.
-
-CCBUG: 377490
-
-Test Plan: builds fine now with Qt 5.9.0rc and also earlier versions.
-
-Reviewers: vriezen, pino
-
-Reviewed By: pino
-
-Subscribers: pino
-
-Differential Revision: https://phabricator.kde.org/D5985
----
- src/kmplayer_part.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/kmplayer_part.h b/src/kmplayer_part.h
-index f90f85d..0fddbaa 100644
---- a/src/kmplayer_part.h
-+++ b/src/kmplayer_part.h
-@@ -36,7 +36,7 @@ namespace KMPlayer {
- 
- class KMPlayerFactory : public KPluginFactory {
-     Q_OBJECT
--    Q_PLUGIN_METADATA(IID "org.kde.KPluginFactory" FILE "")
-+    Q_PLUGIN_METADATA(IID "org.kde.KPluginFactory")
-     Q_INTERFACES(KPluginFactory)
- public:
-     KMPlayerFactory();
--- 
-2.14.2
-
diff --git a/gnu/packages/patches/kpackage-allow-external-paths.patch b/gnu/packages/patches/kpackage-allow-external-paths.patch
deleted file mode 100644
index c1c9efde7f..0000000000
--- a/gnu/packages/patches/kpackage-allow-external-paths.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/kpackage/package.cpp b/src/kpackage/package.cpp
-index 5aec9fd..b15c933 100644
---- a/src/kpackage/package.cpp
-+++ b/src/kpackage/package.cpp
-@@ -820,7 +820,7 @@ PackagePrivate::PackagePrivate()
-     : QSharedData(),
-       fallbackPackage(nullptr),
-       metadata(nullptr),
--      externalPaths(false),
-+      externalPaths(true),
-       valid(false),
-       checkedValid(false)
- {
diff --git a/gnu/packages/patches/kpackage-fix-KF5PackageMacros.cmake.patch b/gnu/packages/patches/kpackage-fix-KF5PackageMacros.cmake.patch
deleted file mode 100644
index d677f19a70..0000000000
--- a/gnu/packages/patches/kpackage-fix-KF5PackageMacros.cmake.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 668010ebc9fd84d9dc60f90b9a4ebf3c7054977f Mon Sep 17 00:00:00 2001
-From: Hartmut Goebel <h.goebel@crazy-compilers.com>
-Date: Sun, 25 Oct 2020 20:11:13 +0000
-Subject: [PATCH] Fix build errors if PREFIX is different from ECM's PREFIX.
-
-See <https://bugs.kde.org/424483> for details.
----
- KF5PackageMacros.cmake | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/KF5PackageMacros.cmake b/KF5PackageMacros.cmake
-index f4c1d1d..acd3798 100644
---- a/KF5PackageMacros.cmake
-+++ b/KF5PackageMacros.cmake
-@@ -1,6 +1,5 @@
- 
--find_package(ECM 1.6.0 CONFIG REQUIRED)
--include(${ECM_KDE_MODULE_DIR}/KDEInstallDirs.cmake)
-+include(KDEInstallDirs)
- 
- set(KPACKAGE_RELATIVE_DATA_INSTALL_DIR "kpackage")
- 
--- 
-GitLab
-
diff --git a/gnu/packages/patches/libksieve-Fix-missing-link-libraries.patch b/gnu/packages/patches/libksieve-Fix-missing-link-libraries.patch
index 238c4ec46c..3835c2e313 100644
--- a/gnu/packages/patches/libksieve-Fix-missing-link-libraries.patch
+++ b/gnu/packages/patches/libksieve-Fix-missing-link-libraries.patch
@@ -1,59 +1,23 @@
-From 732861dda9c466841a09329a0b2c992f2b78c40a Mon Sep 17 00:00:00 2001
-From: Hartmut Goebel <h.goebel@crazy-compilers.com>
-Date: Tue, 21 Jan 2020 23:15:23 +0100
-Subject: [PATCH] Fix missing link libraries.
-
 See <https://phabricator.kde.org/D26818>
 
-These are only actually missing if the libraries reside in different
-prefixes, as it is the case in Guix or Nix.
----
- src/ksieveui/autocreatescripts/tests/CMakeLists.txt  | 2 ++
- src/ksieveui/scriptsparsing/autotests/CMakeLists.txt | 2 +-
- src/ksieveui/scriptsparsing/tests/CMakeLists.txt     | 8 ++++++--
- 3 files changed, 9 insertions(+), 3 deletions(-)
-
-diff --git a/src/ksieveui/autocreatescripts/tests/CMakeLists.txt b/src/ksieveui/autocreatescripts/tests/CMakeLists.txt
-index 8a482b4..c43216c 100644
---- a/src/ksieveui/autocreatescripts/tests/CMakeLists.txt
-+++ b/src/ksieveui/autocreatescripts/tests/CMakeLists.txt
-@@ -15,6 +16,7 @@ set(parsingscript_gui_SRCS parsingscript_gui.cpp ../../tests/capability.cpp)
- add_executable(parsingscript_gui ${parsingscript_gui_SRCS})
- target_link_libraries(parsingscript_gui
-   KF5::KIOCore
-+  KF5::SyntaxHighlighting
-   KF5::KSieveUi
-   KF5::KSieve
-   KF5::PimCommon
-diff --git a/src/ksieveui/scriptsparsing/autotests/CMakeLists.txt b/src/ksieveui/scriptsparsing/autotests/CMakeLists.txt
-index e41a74e..31703ef 100644
---- a/src/ksieveui/scriptsparsing/autotests/CMakeLists.txt
-+++ b/src/ksieveui/scriptsparsing/autotests/CMakeLists.txt
-@@ -5,7 +5,7 @@ macro(add_sieveeditor_xmlprintingscriptbuilding _source _extrasource)
-     ecm_add_test(${_test}
-         TEST_NAME ${_name}
-         NAME_PREFIX "sieveeditor-xmlprintingscriptbuilding-"
--        LINK_LIBRARIES Qt5::Test KF5::I18n KF5::KSieveUi
-+        LINK_LIBRARIES Qt5::Test KF5::I18n KF5::KSieveUi KF5::SyntaxHighlighting
-         )
- endmacro()
- add_sieveeditor_xmlprintingscriptbuilding(xmlprintingscriptbuildertest.cpp "" "")
-diff --git a/src/ksieveui/scriptsparsing/tests/CMakeLists.txt b/src/ksieveui/scriptsparsing/tests/CMakeLists.txt
-index a252039..99a1aaa 100644
---- a/src/ksieveui/scriptsparsing/tests/CMakeLists.txt
-+++ b/src/ksieveui/scriptsparsing/tests/CMakeLists.txt
-@@ -9,5 +9,9 @@ set(xmlsieveparsing_SRCS
- )
- 
- add_executable(xmlsieveparsing ${xmlsieveparsing_SRCS} )
--target_link_libraries(xmlsieveparsing   KF5::KSieveUi KF5::KSieve KF5::I18n)
--
-+target_link_libraries(xmlsieveparsing
-+  KF5::KSieveUi
-+  KF5::SyntaxHighlighting
-+  KF5::KSieve
-+  KF5::I18n
-+)
--- 
-2.21.1
+diff --git a/src/ksieveui/CMakeLists.txt b/src/ksieveui/CMakeLists.txt
+--- a/src/ksieveui/CMakeLists.txt
++++ b/src/ksieveui/CMakeLists.txt
+@@ -255,6 +255,7 @@ target_link_libraries(KF5KSieveUi
+     KF5::KManageSieve
+     KF5::KSieve
+     KF5::PimCommon
++    KF5::SyntaxHighlighting
+     PRIVATE
+     KF5::Libkdepim
+     KF5::Archive
+@@ -269,7 +270,6 @@ target_link_libraries(KF5KSieveUi
+     KF5::I18n
+     KF5::SonnetUi
+     Qt::PrintSupport
+-    KF5::SyntaxHighlighting
+     )
 
+ set_target_properties(KF5KSieveUi PROPERTIES
+--
+2.33.0
diff --git a/gnu/packages/patches/mrustc-riscv64-support.patch b/gnu/packages/patches/mrustc-riscv64-support.patch
new file mode 100644
index 0000000000..6312116585
--- /dev/null
+++ b/gnu/packages/patches/mrustc-riscv64-support.patch
@@ -0,0 +1,48 @@
+Patch sent upstream for review:
+https://github.com/thepowersgang/mrustc/pull/276
+
+diff --git a/src/trans/target.cpp b/src/trans/target.cpp
+index 420a2870..4d5eefb3 100644
+--- a/src/trans/target.cpp
++++ b/src/trans/target.cpp
+@@ -65,6 +65,13 @@ const TargetArch ARCH_POWERPC64LE = {
+     { /*atomic(u8)=*/true, true, true, true,  true },
+     TargetArch::Alignments(2, 4, 8, 16, 4, 8, 8)
+ };
++// This is a guess
++const TargetArch ARCH_RISCV64 = {
++    "riscv64",
++    64, false,
++    { /*atomic(u8)=*/true, true, true, true,  true },
++    TargetArch::Alignments(2, 4, 8, 16, 4, 8, 8)
++};
+ TargetSpec  g_target;
+ 
+ 
+@@ -455,6 +462,13 @@ namespace
+                 ARCH_POWERPC64LE
+                 };
+         }
++        else if(target_name == "riscv64-unknown-linux-gnu")
++        {
++            return TargetSpec {
++                "unix", "linux", "gnu", {CodegenMode::Gnu11, false, "riscv64-unknown-linux-gnu", BACKEND_C_OPTS_GNU},
++                ARCH_RISCV64
++                };
++        }
+         else if(target_name == "i586-pc-windows-gnu")
+         {
+             return TargetSpec {
+diff --git a/tools/common/target_detect.h b/tools/common/target_detect.h
+index a052da6b..42fea91a 100644
+--- a/tools/common/target_detect.h
++++ b/tools/common/target_detect.h
+@@ -34,6 +34,8 @@
+ #  define DEFAULT_TARGET_NAME "powerpc64-unknown-linux-gnu"
+ # elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)
+ #  define DEFAULT_TARGET_NAME "powerpc64le-unknown-linux-gnu"
++# elif defined(__riscv) && __riscv_xlen == 64
++#  define DEFAULT_TARGET_NAME "riscv64-unknown-linux-gnu"
+ # else
+ #  warning "Unable to detect a suitable default target (linux-gnu)"
+ # endif
diff --git a/gnu/packages/patches/polkit-CVE-2021-4034.patch b/gnu/packages/patches/polkit-CVE-2021-4034.patch
deleted file mode 100644
index ca766cb3be..0000000000
--- a/gnu/packages/patches/polkit-CVE-2021-4034.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-Fixes CVE-2021-4034, local privilege escalation with 'pkexec':
-
-  https://www.openwall.com/lists/oss-security/2022/01/25/11
-
-Patch from <https://gitlab.freedesktop.org/polkit/polkit/-/commit/a2bf5c9c83b6ae46cbd5c779d3055bff81ded683>.
-
-From a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 Mon Sep 17 00:00:00 2001
-From: Jan Rybar <jrybar@redhat.com>
-Date: Tue, 25 Jan 2022 17:21:46 +0000
-Subject: [PATCH] pkexec: local privilege escalation (CVE-2021-4034)
-
----
- src/programs/pkcheck.c |  5 +++++
- src/programs/pkexec.c  | 23 ++++++++++++++++++++---
- 2 files changed, 25 insertions(+), 3 deletions(-)
-
-diff --git a/src/programs/pkcheck.c b/src/programs/pkcheck.c
-index f1bb4e1..768525c 100644
---- a/src/programs/pkcheck.c
-+++ b/src/programs/pkcheck.c
-@@ -363,6 +363,11 @@ main (int argc, char *argv[])
-   local_agent_handle = NULL;
-   ret = 126;
- 
-+  if (argc < 1)
-+    {
-+      exit(126);
-+    }
-+
-   /* Disable remote file access from GIO. */
-   setenv ("GIO_USE_VFS", "local", 1);
- 
-diff --git a/src/programs/pkexec.c b/src/programs/pkexec.c
-index 7698c5c..84e5ef6 100644
---- a/src/programs/pkexec.c
-+++ b/src/programs/pkexec.c
-@@ -488,6 +488,15 @@ main (int argc, char *argv[])
-   pid_t pid_of_caller;
-   gpointer local_agent_handle;
- 
-+
-+  /*
-+   * If 'pkexec' is called THIS wrong, someone's probably evil-doing. Don't be nice, just bail out.
-+   */
-+  if (argc<1)
-+    {
-+      exit(127);
-+    }
-+
-   ret = 127;
-   authority = NULL;
-   subject = NULL;
-@@ -614,10 +623,10 @@ main (int argc, char *argv[])
- 
-       path = g_strdup (pwstruct.pw_shell);
-       if (!path)
--	{
-+        {
-           g_printerr ("No shell configured or error retrieving pw_shell\n");
-           goto out;
--	}
-+        }
-       /* If you change this, be sure to change the if (!command_line)
- 	 case below too */
-       command_line = g_strdup (path);
-@@ -636,7 +645,15 @@ main (int argc, char *argv[])
-           goto out;
-         }
-       g_free (path);
--      argv[n] = path = s;
-+      path = s;
-+
-+      /* argc<2 and pkexec runs just shell, argv is guaranteed to be null-terminated.
-+       * /-less shell shouldn't happen, but let's be defensive and don't write to null-termination
-+       */
-+      if (argv[n] != NULL)
-+      {
-+        argv[n] = path;
-+      }
-     }
-   if (access (path, F_OK) != 0)
-     {
diff --git a/gnu/packages/patches/polkit-configure-elogind.patch b/gnu/packages/patches/polkit-configure-elogind.patch
deleted file mode 100644
index 8fefb7a0c2..0000000000
--- a/gnu/packages/patches/polkit-configure-elogind.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Even when the polkit configure script detects elogind, it does not use
-it.  This patch ensures that elogind is used when it is detected.
-
-diff -ruN a/configure b/configure
---- a/configure	1969-12-31 19:00:01.000000000 -0500
-+++ b/configure	2021-11-19 00:04:55.581385020 -0500
-@@ -20390,7 +20390,7 @@
- 
- 
- 
-- if test "$have_libsystemd" = "yes"; then
-+ if test "$have_libsystemd" = "yes" || test "$have_libelogind" = "yes"; then
-   HAVE_LIBSYSTEMD_TRUE=
-   HAVE_LIBSYSTEMD_FALSE='#'
- else
diff --git a/gnu/packages/patches/polkit-disable-systemd.patch b/gnu/packages/patches/polkit-disable-systemd.patch
new file mode 100644
index 0000000000..551fdf7de8
--- /dev/null
+++ b/gnu/packages/patches/polkit-disable-systemd.patch
@@ -0,0 +1,30 @@
+Don't install systemd units unless using libsystemd session tracking.
+
+Submitted upstream:
+
+  https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/134
+
+diff --git a/data/meson.build b/data/meson.build
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -26,7 +26,7 @@ if enable_pam
+   )
+ endif
+ 
+-if enable_logind
++if session_tracking == 'libsystemd-login'
+   configure_file(
+     input: 'polkit.service.in',
+     output: '@BASENAME@',
+diff --git a/meson.build b/meson.build
+--- a/meson.build
++++ b/meson.build
+@@ -199,7 +199,7 @@ if enable_logind
+ 
+   # systemd unit / service files
+   systemd_systemdsystemunitdir = get_option('systemdsystemunitdir')
+-  if systemd_systemdsystemunitdir == ''
++  if systemd_systemdsystemunitdir == '' and session_tracking == 'libsystemd-login'
+     systemd_dep = dependency('systemd', not_found_message: 'systemd required but not found, please provide a valid systemd user unit dir or disable it')
+     # FIXME: systemd.pc file does not use variables with relative paths, so `define_variable` cannot be used
+     systemd_systemdsystemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
diff --git a/gnu/packages/patches/polkit-use-duktape.patch b/gnu/packages/patches/polkit-use-duktape.patch
deleted file mode 100644
index 4eaa7963c2..0000000000
--- a/gnu/packages/patches/polkit-use-duktape.patch
+++ /dev/null
@@ -1,5030 +0,0 @@
-From 4f66a9549a393e4d74b93eb85301a04ea94bc750 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Wed, 24 Jul 2019 15:55:17 +0800
-Subject: [PATCH 01/16] Add duktape as javascript engine.
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- configure.ac                                  |   28 +-
- src/polkitbackend/Makefile.am                 |   14 +-
- .../polkitbackendduktapeauthority.c           | 1402 +++++++++++++++++
- 3 files changed, 1436 insertions(+), 8 deletions(-)
- create mode 100644 src/polkitbackend/polkitbackendduktapeauthority.c
-
-diff --git a/configure.ac b/configure.ac
-index e434ca2..5a03593 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -80,11 +80,22 @@ PKG_CHECK_MODULES(GLIB, [gmodule-2.0 gio-unix-2.0 >= 2.30.0])
- AC_SUBST(GLIB_CFLAGS)
- AC_SUBST(GLIB_LIBS)
- 
--PKG_CHECK_MODULES(LIBJS, [mozjs-78])
--
--AC_SUBST(LIBJS_CFLAGS)
--AC_SUBST(LIBJS_CXXFLAGS)
--AC_SUBST(LIBJS_LIBS)
-+dnl ---------------------------------------------------------------------------
-+dnl - Check javascript backend
-+dnl ---------------------------------------------------------------------------
-+AC_ARG_WITH(duktape, AS_HELP_STRING([--with-duktape],[Use Duktape as javascript backend]),with_duktape=yes,with_duktape=no)
-+AS_IF([test x${with_duktape} == xyes], [
-+  PKG_CHECK_MODULES(LIBJS, [duktape >= 2.0.0 ])
-+  AC_SUBST(LIBJS_CFLAGS)
-+  AC_SUBST(LIBJS_LIBS)
-+], [
-+  PKG_CHECK_MODULES(LIBJS, [mozjs-78])
-+
-+  AC_SUBST(LIBJS_CFLAGS)
-+  AC_SUBST(LIBJS_CXXFLAGS)
-+  AC_SUBST(LIBJS_LIBS)
-+])
-+AM_CONDITIONAL(USE_DUKTAPE, [test x$with_duktape == xyes], [Using duktape as javascript engine library])
- 
- EXPAT_LIB=""
- AC_ARG_WITH(expat, [  --with-expat=<dir>      Use expat from here],
-@@ -585,6 +596,13 @@ echo "
-         PAM support:                ${have_pam}
-         systemdsystemunitdir:       ${systemdsystemunitdir}
-         polkitd user:               ${POLKITD_USER}"
-+if test "x${with_duktape}" = xyes; then
-+echo "
-+        Javascript engine:          Duktape"
-+else
-+echo "
-+        Javascript engine:          Mozjs"
-+fi
- 
- if test "$have_pam" = yes ; then
- echo "
-diff --git a/src/polkitbackend/Makefile.am b/src/polkitbackend/Makefile.am
-index 7e3c080..abcbc6f 100644
---- a/src/polkitbackend/Makefile.am
-+++ b/src/polkitbackend/Makefile.am
-@@ -33,7 +33,7 @@ libpolkit_backend_1_la_SOURCES =                                   			\
- 	polkitbackendprivate.h								\
- 	polkitbackendauthority.h		polkitbackendauthority.c		\
- 	polkitbackendinteractiveauthority.h	polkitbackendinteractiveauthority.c	\
--	polkitbackendjsauthority.h		polkitbackendjsauthority.cpp		\
-+	polkitbackendjsauthority.h				\
- 	polkitbackendactionpool.h		polkitbackendactionpool.c		\
- 	polkitbackendactionlookup.h		polkitbackendactionlookup.c		\
-         $(NULL)
-@@ -51,19 +51,27 @@ libpolkit_backend_1_la_CFLAGS =                                        	\
-         -D_POLKIT_BACKEND_COMPILATION                                  	\
-         $(GLIB_CFLAGS)							\
- 	$(LIBSYSTEMD_CFLAGS)						\
--	$(LIBJS_CFLAGS)							\
-+	$(LIBJS_CFLAGS)						\
-         $(NULL)
- 
- libpolkit_backend_1_la_CXXFLAGS = $(libpolkit_backend_1_la_CFLAGS)
- 
- libpolkit_backend_1_la_LIBADD =                               		\
-         $(GLIB_LIBS)							\
-+        $(DUKTAPE_LIBS)							\
- 	$(LIBSYSTEMD_LIBS)						\
- 	$(top_builddir)/src/polkit/libpolkit-gobject-1.la		\
- 	$(EXPAT_LIBS)							\
--	$(LIBJS_LIBS)							\
-+	$(LIBJS_LIBS)                                                   \
-         $(NULL)
- 
-+if USE_DUKTAPE
-+libpolkit_backend_1_la_SOURCES += polkitbackendduktapeauthority.c
-+libpolkit_backend_1_la_LIBADD += -lm
-+else
-+libpolkit_backend_1_la_SOURCES += polkitbackendjsauthority.cpp
-+endif
-+
- rulesdir = $(sysconfdir)/polkit-1/rules.d
- rules_DATA = 50-default.rules
- 
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-new file mode 100644
-index 0000000..ae98453
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -0,0 +1,1402 @@
-+/*
-+ * Copyright (C) 2008-2012 Red Hat, Inc.
-+ * Copyright (C) 2015 Tangent Space <jstpierre@mecheye.net>
-+ * Copyright (C) 2019 Wu Xiaotian <yetist@gmail.com>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#include "config.h"
-+#include <sys/wait.h>
-+#include <errno.h>
-+#include <pwd.h>
-+#include <grp.h>
-+#include <netdb.h>
-+#include <string.h>
-+#include <glib/gstdio.h>
-+#include <locale.h>
-+#include <glib/gi18n-lib.h>
-+
-+#include <polkit/polkit.h>
-+#include "polkitbackendjsauthority.h"
-+
-+#include <polkit/polkitprivate.h>
-+
-+#ifdef HAVE_LIBSYSTEMD
-+#include <systemd/sd-login.h>
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+#include "initjs.h" /* init.js */
-+#include "duktape.h"
-+
-+/**
-+ * SECTION:polkitbackendjsauthority
-+ * @title: PolkitBackendJsAuthority
-+ * @short_description: JS Authority
-+ * @stability: Unstable
-+ *
-+ * An implementation of #PolkitBackendAuthority that reads and
-+ * evalates Javascript files and supports interaction with
-+ * authentication agents (virtue of being based on
-+ * #PolkitBackendInteractiveAuthority).
-+ */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+struct _PolkitBackendJsAuthorityPrivate
-+{
-+  gchar **rules_dirs;
-+  GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
-+  duk_context *cx;
-+};
-+
-+#define WATCHDOG_TIMEOUT (15 * G_TIME_SPAN_SECOND)
-+
-+static void utils_spawn (const gchar *const  *argv,
-+                         guint                timeout_seconds,
-+                         GCancellable        *cancellable,
-+                         GAsyncReadyCallback  callback,
-+                         gpointer             user_data);
-+
-+gboolean utils_spawn_finish (GAsyncResult   *res,
-+                             gint           *out_exit_status,
-+                             gchar         **out_standard_output,
-+                             gchar         **out_standard_error,
-+                             GError        **error);
-+
-+static void on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                    GFile            *file,
-+                                    GFile            *other_file,
-+                                    GFileMonitorEvent event_type,
-+                                    gpointer          user_data);
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+enum
-+{
-+  PROP_0,
-+  PROP_RULES_DIRS,
-+};
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
-+                                                                     PolkitSubject                     *caller,
-+                                                                     PolkitSubject                     *subject,
-+                                                                     PolkitIdentity                    *user_for_subject,
-+                                                                     gboolean                           subject_is_local,
-+                                                                     gboolean                           subject_is_active,
-+                                                                     const gchar                       *action_id,
-+                                                                     PolkitDetails                     *details);
-+
-+static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
-+                                                          PolkitBackendInteractiveAuthority *authority,
-+                                                          PolkitSubject                     *caller,
-+                                                          PolkitSubject                     *subject,
-+                                                          PolkitIdentity                    *user_for_subject,
-+                                                          gboolean                           subject_is_local,
-+                                                          gboolean                           subject_is_active,
-+                                                          const gchar                       *action_id,
-+                                                          PolkitDetails                     *details,
-+                                                          PolkitImplicitAuthorization        implicit);
-+
-+G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static void
-+polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-+{
-+  authority->priv = G_TYPE_INSTANCE_GET_PRIVATE (authority,
-+                                                 POLKIT_BACKEND_TYPE_JS_AUTHORITY,
-+                                                 PolkitBackendJsAuthorityPrivate);
-+}
-+
-+static gint
-+rules_file_name_cmp (const gchar *a,
-+                     const gchar *b)
-+{
-+  gint ret;
-+  const gchar *a_base;
-+  const gchar *b_base;
-+
-+  a_base = strrchr (a, '/');
-+  b_base = strrchr (b, '/');
-+
-+  g_assert (a_base != NULL);
-+  g_assert (b_base != NULL);
-+  a_base += 1;
-+  b_base += 1;
-+
-+  ret = g_strcmp0 (a_base, b_base);
-+  if (ret == 0)
-+    {
-+      /* /etc wins over /usr */
-+      ret = g_strcmp0 (a, b);
-+      g_assert (ret != 0);
-+    }
-+
-+  return ret;
-+}
-+
-+static void
-+load_scripts (PolkitBackendJsAuthority  *authority)
-+{
-+  duk_context *cx = authority->priv->cx;
-+  GList *files = NULL;
-+  GList *l;
-+  guint num_scripts = 0;
-+  GError *error = NULL;
-+  guint n;
-+
-+  files = NULL;
-+
-+  for (n = 0; authority->priv->rules_dirs != NULL && authority->priv->rules_dirs[n] != NULL; n++)
-+    {
-+      const gchar *dir_name = authority->priv->rules_dirs[n];
-+      GDir *dir = NULL;
-+
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Loading rules from directory %s",
-+                                    dir_name);
-+
-+      dir = g_dir_open (dir_name,
-+                        0,
-+                        &error);
-+      if (dir == NULL)
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error opening rules directory: %s (%s, %d)",
-+                                        error->message, g_quark_to_string (error->domain), error->code);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          const gchar *name;
-+          while ((name = g_dir_read_name (dir)) != NULL)
-+            {
-+              if (g_str_has_suffix (name, ".rules"))
-+                files = g_list_prepend (files, g_strdup_printf ("%s/%s", dir_name, name));
-+            }
-+          g_dir_close (dir);
-+        }
-+    }
-+
-+  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+
-+  for (l = files; l != NULL; l = l->next)
-+    {
-+      const gchar *filename = l->data;
-+
-+#if (DUK_VERSION >= 20000)
-+      gchar *contents;
-+      gsize length;
-+      GError *error = NULL;
-+      if (!g_file_get_contents (filename, &contents, &length, &error)){
-+        g_warning("Error when file contents of %s: %s\n", filename, error->message);
-+        g_error_free (error);
-+        continue;
-+      }
-+      if (duk_peval_lstring_noresult(cx, contents,length) != 0)
-+#else
-+      if (duk_peval_file_noresult (cx, filename) != 0)
-+#endif
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error compiling script %s: %s",
-+                                        filename, duk_safe_to_string (authority->priv->cx, -1));
-+#if (DUK_VERSION >= 20000)
-+          g_free (contents);
-+#endif
-+          continue;
-+        }
-+#if (DUK_VERSION >= 20000)
-+      g_free (contents);
-+#endif
-+      num_scripts++;
-+    }
-+
-+  polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                "Finished loading, compiling and executing %d rules",
-+                                num_scripts);
-+  g_list_free_full (files, g_free);
-+}
-+
-+static void
-+reload_scripts (PolkitBackendJsAuthority *authority)
-+{
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  duk_get_global_string (cx, "polkit");
-+  duk_push_string (cx, "_deleteRules");
-+
-+  duk_call_prop (cx, 0, 0);
-+
-+  polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                "Collecting garbage unconditionally...");
-+
-+  load_scripts (authority);
-+
-+  /* Let applications know we have new rules... */
-+  g_signal_emit_by_name (authority, "changed");
-+}
-+
-+static void
-+on_dir_monitor_changed (GFileMonitor     *monitor,
-+                        GFile            *file,
-+                        GFile            *other_file,
-+                        GFileMonitorEvent event_type,
-+                        gpointer          user_data)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
-+
-+  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
-+   *       Because when editing a file with emacs we get 4-8 events..
-+   */
-+
-+  if (file != NULL)
-+    {
-+      gchar *name;
-+
-+      name = g_file_get_basename (file);
-+
-+      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
-+      if (!g_str_has_prefix (name, ".") &&
-+          !g_str_has_prefix (name, "#") &&
-+          g_str_has_suffix (name, ".rules") &&
-+          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
-+           event_type == G_FILE_MONITOR_EVENT_DELETED ||
-+           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Reloading rules");
-+          reload_scripts (authority);
-+        }
-+      g_free (name);
-+    }
-+}
-+
-+
-+static void
-+setup_file_monitors (PolkitBackendJsAuthority *authority)
-+{
-+  guint n;
-+  GPtrArray *p;
-+
-+  p = g_ptr_array_new ();
-+  for (n = 0; authority->priv->rules_dirs != NULL && authority->priv->rules_dirs[n] != NULL; n++)
-+    {
-+      GFile *file;
-+      GError *error;
-+      GFileMonitor *monitor;
-+
-+      file = g_file_new_for_path (authority->priv->rules_dirs[n]);
-+      error = NULL;
-+      monitor = g_file_monitor_directory (file,
-+                                          G_FILE_MONITOR_NONE,
-+                                          NULL,
-+                                          &error);
-+      g_object_unref (file);
-+      if (monitor == NULL)
-+        {
-+          g_warning ("Error monitoring directory %s: %s",
-+                     authority->priv->rules_dirs[n],
-+                     error->message);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          g_signal_connect (monitor,
-+                            "changed",
-+                            G_CALLBACK (on_dir_monitor_changed),
-+                            authority);
-+          g_ptr_array_add (p, monitor);
-+        }
-+    }
-+  g_ptr_array_add (p, NULL);
-+  authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
-+}
-+
-+static duk_ret_t js_polkit_log (duk_context *cx);
-+static duk_ret_t js_polkit_spawn (duk_context *cx);
-+static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-+
-+static const duk_function_list_entry js_polkit_functions[] =
-+{
-+  { "log", js_polkit_log, 1 },
-+  { "spawn", js_polkit_spawn, 1 },
-+  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
-+  { NULL, NULL, 0 },
-+};
-+
-+static void
-+polkit_backend_js_authority_constructed (GObject *object)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+  duk_context *cx;
-+
-+  cx = duk_create_heap (NULL, NULL, NULL, authority, NULL);
-+  if (cx == NULL)
-+    goto fail;
-+
-+  authority->priv->cx = cx;
-+
-+  duk_push_global_object (cx);
-+  duk_push_object (cx);
-+  duk_put_function_list (cx, -1, js_polkit_functions);
-+  duk_put_prop_string (cx, -2, "polkit");
-+
-+  duk_eval_string (cx, init_js);
-+
-+  if (authority->priv->rules_dirs == NULL)
-+    {
-+      authority->priv->rules_dirs = g_new0 (gchar *, 3);
-+      authority->priv->rules_dirs[0] = g_strdup (PACKAGE_SYSCONF_DIR "/polkit-1/rules.d");
-+      authority->priv->rules_dirs[1] = g_strdup (PACKAGE_DATA_DIR "/polkit-1/rules.d");
-+    }
-+
-+  setup_file_monitors (authority);
-+  load_scripts (authority);
-+
-+  G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->constructed (object);
-+  return;
-+
-+ fail:
-+  g_critical ("Error initializing JavaScript environment");
-+  g_assert_not_reached ();
-+}
-+
-+static void
-+polkit_backend_js_authority_finalize (GObject *object)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+  guint n;
-+
-+  for (n = 0; authority->priv->dir_monitors != NULL && authority->priv->dir_monitors[n] != NULL; n++)
-+    {
-+      GFileMonitor *monitor = authority->priv->dir_monitors[n];
-+      g_signal_handlers_disconnect_by_func (monitor,
-+                                            G_CALLBACK (on_dir_monitor_changed),
-+                                            authority);
-+      g_object_unref (monitor);
-+    }
-+  g_free (authority->priv->dir_monitors);
-+  g_strfreev (authority->priv->rules_dirs);
-+
-+  duk_destroy_heap (authority->priv->cx);
-+
-+  G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
-+}
-+
-+static void
-+polkit_backend_js_authority_set_property (GObject      *object,
-+                                          guint         property_id,
-+                                          const GValue *value,
-+                                          GParamSpec   *pspec)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+
-+  switch (property_id)
-+    {
-+      case PROP_RULES_DIRS:
-+        g_assert (authority->priv->rules_dirs == NULL);
-+        authority->priv->rules_dirs = (gchar **) g_value_dup_boxed (value);
-+        break;
-+
-+      default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-+        break;
-+    }
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
-+{
-+  return "js";
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
-+{
-+  return PACKAGE_VERSION;
-+}
-+
-+static PolkitAuthorityFeatures
-+polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
-+{
-+  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
-+}
-+
-+static void
-+polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
-+{
-+  GObjectClass *gobject_class;
-+  PolkitBackendAuthorityClass *authority_class;
-+  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
-+
-+
-+  gobject_class = G_OBJECT_CLASS (klass);
-+  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
-+  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
-+  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
-+
-+  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
-+  authority_class->get_name                             = polkit_backend_js_authority_get_name;
-+  authority_class->get_version                          = polkit_backend_js_authority_get_version;
-+  authority_class->get_features                         = polkit_backend_js_authority_get_features;
-+
-+  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
-+  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
-+  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
-+
-+  g_object_class_install_property (gobject_class,
-+                                   PROP_RULES_DIRS,
-+                                   g_param_spec_boxed ("rules-dirs",
-+                                                       NULL,
-+                                                       NULL,
-+                                                       G_TYPE_STRV,
-+                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
-+
-+
-+  g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static void
-+set_property_str (duk_context *cx,
-+                  const gchar *name,
-+                  const gchar *value)
-+{
-+  duk_push_string (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_strv (duk_context *cx,
-+                   const gchar *name,
-+                   GPtrArray   *value)
-+{
-+  guint n;
-+  duk_push_array (cx);
-+  for (n = 0; n < value->len; n++)
-+    {
-+      duk_push_string (cx, g_ptr_array_index (value, n));
-+      duk_put_prop_index (cx, -2, n);
-+    }
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_int32 (duk_context *cx,
-+                    const gchar *name,
-+                    gint32       value)
-+{
-+  duk_push_int (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_bool (duk_context *cx,
-+                   const char  *name,
-+                   gboolean     value)
-+{
-+  duk_push_boolean (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static gboolean
-+push_subject (duk_context               *cx,
-+              PolkitSubject             *subject,
-+              PolkitIdentity            *user_for_subject,
-+              gboolean                   subject_is_local,
-+              gboolean                   subject_is_active,
-+              GError                   **error)
-+{
-+  gboolean ret = FALSE;
-+  pid_t pid;
-+  uid_t uid;
-+  gchar *user_name = NULL;
-+  GPtrArray *groups = NULL;
-+  struct passwd *passwd;
-+  char *seat_str = NULL;
-+  char *session_str = NULL;
-+
-+  duk_get_global_string (cx, "Subject");
-+  duk_new (cx, 0);
-+
-+  if (POLKIT_IS_UNIX_PROCESS (subject))
-+    {
-+      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (subject));
-+    }
-+  else if (POLKIT_IS_SYSTEM_BUS_NAME (subject))
-+    {
-+      PolkitSubject *process;
-+      process = polkit_system_bus_name_get_process_sync (POLKIT_SYSTEM_BUS_NAME (subject), NULL, error);
-+      if (process == NULL)
-+        goto out;
-+      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (process));
-+      g_object_unref (process);
-+    }
-+  else
-+    {
-+      g_assert_not_reached ();
-+    }
-+
-+#ifdef HAVE_LIBSYSTEMD
-+  if (sd_pid_get_session (pid, &session_str) == 0)
-+    {
-+      if (sd_session_get_seat (session_str, &seat_str) == 0)
-+        {
-+          /* do nothing */
-+        }
-+    }
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+  g_assert (POLKIT_IS_UNIX_USER (user_for_subject));
-+  uid = polkit_unix_user_get_uid (POLKIT_UNIX_USER (user_for_subject));
-+
-+  groups = g_ptr_array_new_with_free_func (g_free);
-+
-+  passwd = getpwuid (uid);
-+  if (passwd == NULL)
-+    {
-+      user_name = g_strdup_printf ("%d", (gint) uid);
-+      g_warning ("Error looking up info for uid %d: %m", (gint) uid);
-+    }
-+  else
-+    {
-+      gid_t gids[512];
-+      int num_gids = 512;
-+
-+      user_name = g_strdup (passwd->pw_name);
-+
-+      if (getgrouplist (passwd->pw_name,
-+                        passwd->pw_gid,
-+                        gids,
-+                        &num_gids) < 0)
-+        {
-+          g_warning ("Error looking up groups for uid %d: %m", (gint) uid);
-+        }
-+      else
-+        {
-+          gint n;
-+          for (n = 0; n < num_gids; n++)
-+            {
-+              struct group *group;
-+              group = getgrgid (gids[n]);
-+              if (group == NULL)
-+                {
-+                  g_ptr_array_add (groups, g_strdup_printf ("%d", (gint) gids[n]));
-+                }
-+              else
-+                {
-+                  g_ptr_array_add (groups, g_strdup (group->gr_name));
-+                }
-+            }
-+        }
-+    }
-+
-+  set_property_int32 (cx, "pid", pid);
-+  set_property_str (cx, "user", user_name);
-+  set_property_strv (cx, "groups", groups);
-+  set_property_str (cx, "seat", seat_str);
-+  set_property_str (cx, "session", session_str);
-+  set_property_bool (cx, "local", subject_is_local);
-+  set_property_bool (cx, "active", subject_is_active);
-+
-+  ret = TRUE;
-+
-+ out:
-+  free (session_str);
-+  free (seat_str);
-+  g_free (user_name);
-+  if (groups != NULL)
-+    g_ptr_array_unref (groups);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static gboolean
-+push_action_and_details (duk_context               *cx,
-+                         const gchar               *action_id,
-+                         PolkitDetails             *details,
-+                         GError                   **error)
-+{
-+  gchar **keys;
-+  guint n;
-+
-+  duk_get_global_string (cx, "Action");
-+  duk_new (cx, 0);
-+
-+  set_property_str (cx, "id", action_id);
-+
-+  keys = polkit_details_get_keys (details);
-+  for (n = 0; keys != NULL && keys[n] != NULL; n++)
-+    {
-+      gchar *key;
-+      const gchar *value;
-+      key = g_strdup_printf ("_detail_%s", keys[n]);
-+      value = polkit_details_lookup (details, keys[n]);
-+      set_property_str (cx, key, value);
-+      g_free (key);
-+    }
-+  g_strfreev (keys);
-+
-+  return TRUE;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static GList *
-+polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                       PolkitSubject                     *caller,
-+                                                       PolkitSubject                     *subject,
-+                                                       PolkitIdentity                    *user_for_subject,
-+                                                       gboolean                           subject_is_local,
-+                                                       gboolean                           subject_is_active,
-+                                                       const gchar                       *action_id,
-+                                                       PolkitDetails                     *details)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-+  GList *ret = NULL;
-+  guint n;
-+  GError *error = NULL;
-+  const char *ret_str = NULL;
-+  gchar **ret_strs = NULL;
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  duk_get_global_string (cx, "polkit");
-+  duk_push_string (cx, "_runAdminRules");
-+
-+  if (!push_action_and_details (cx, action_id, details, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting action and details to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!push_subject (cx, subject, user_for_subject, subject_is_local, subject_is_active, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting subject to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error evaluating admin rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto out;
-+    }
-+
-+  ret_str = duk_require_string (cx, -1);
-+
-+  ret_strs = g_strsplit (ret_str, ",", -1);
-+  for (n = 0; ret_strs != NULL && ret_strs[n] != NULL; n++)
-+    {
-+      const gchar *identity_str = ret_strs[n];
-+      PolkitIdentity *identity;
-+
-+      error = NULL;
-+      identity = polkit_identity_from_string (identity_str, &error);
-+      if (identity == NULL)
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Identity `%s' is not valid, ignoring: %s",
-+                                        identity_str, error->message);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          ret = g_list_prepend (ret, identity);
-+        }
-+    }
-+  ret = g_list_reverse (ret);
-+
-+ out:
-+  g_strfreev (ret_strs);
-+  /* fallback to root password auth */
-+  if (ret == NULL)
-+    ret = g_list_prepend (ret, polkit_unix_user_new (0));
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static PolkitImplicitAuthorization
-+polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                      PolkitSubject                     *caller,
-+                                                      PolkitSubject                     *subject,
-+                                                      PolkitIdentity                    *user_for_subject,
-+                                                      gboolean                           subject_is_local,
-+                                                      gboolean                           subject_is_active,
-+                                                      const gchar                       *action_id,
-+                                                      PolkitDetails                     *details,
-+                                                      PolkitImplicitAuthorization        implicit)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-+  PolkitImplicitAuthorization ret = implicit;
-+  GError *error = NULL;
-+  gchar *ret_str = NULL;
-+  gboolean good = FALSE;
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  duk_get_global_string (cx, "polkit");
-+  duk_push_string (cx, "_runRules");
-+
-+  if (!push_action_and_details (cx, action_id, details, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting action and details to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!push_subject (cx, subject, user_for_subject, subject_is_local, subject_is_active, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting subject to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
-+  {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error evaluating authorization rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto out;
-+  }
-+
-+  if (duk_is_null(cx, -1)) {
-+    good = TRUE;
-+    goto out;
-+  }
-+  ret_str = g_strdup (duk_require_string (cx, -1));
-+  if (!polkit_implicit_authorization_from_string (ret_str, &ret))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Returned result `%s' is not valid",
-+                                    ret_str);
-+      goto out;
-+    }
-+
-+  good = TRUE;
-+
-+ out:
-+  if (!good)
-+    ret = POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED;
-+  g_free (ret_str);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static duk_ret_t
-+js_polkit_log (duk_context *cx)
-+{
-+  const char *str = duk_require_string (cx, 0);
-+  fprintf (stderr, "%s\n", str);
-+  return 0;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static const gchar *
-+get_signal_name (gint signal_number)
-+{
-+  switch (signal_number)
-+    {
-+#define _HANDLE_SIG(sig) case sig: return #sig;
-+    _HANDLE_SIG (SIGHUP);
-+    _HANDLE_SIG (SIGINT);
-+    _HANDLE_SIG (SIGQUIT);
-+    _HANDLE_SIG (SIGILL);
-+    _HANDLE_SIG (SIGABRT);
-+    _HANDLE_SIG (SIGFPE);
-+    _HANDLE_SIG (SIGKILL);
-+    _HANDLE_SIG (SIGSEGV);
-+    _HANDLE_SIG (SIGPIPE);
-+    _HANDLE_SIG (SIGALRM);
-+    _HANDLE_SIG (SIGTERM);
-+    _HANDLE_SIG (SIGUSR1);
-+    _HANDLE_SIG (SIGUSR2);
-+    _HANDLE_SIG (SIGCHLD);
-+    _HANDLE_SIG (SIGCONT);
-+    _HANDLE_SIG (SIGSTOP);
-+    _HANDLE_SIG (SIGTSTP);
-+    _HANDLE_SIG (SIGTTIN);
-+    _HANDLE_SIG (SIGTTOU);
-+    _HANDLE_SIG (SIGBUS);
-+#ifdef SIGPOLL
-+    _HANDLE_SIG (SIGPOLL);
-+#endif
-+    _HANDLE_SIG (SIGPROF);
-+    _HANDLE_SIG (SIGSYS);
-+    _HANDLE_SIG (SIGTRAP);
-+    _HANDLE_SIG (SIGURG);
-+    _HANDLE_SIG (SIGVTALRM);
-+    _HANDLE_SIG (SIGXCPU);
-+    _HANDLE_SIG (SIGXFSZ);
-+#undef _HANDLE_SIG
-+    default:
-+      break;
-+    }
-+  return "UNKNOWN_SIGNAL";
-+}
-+
-+typedef struct
-+{
-+  GMainLoop *loop;
-+  GAsyncResult *res;
-+} SpawnData;
-+
-+static void
-+spawn_cb (GObject       *source_object,
-+          GAsyncResult  *res,
-+          gpointer       user_data)
-+{
-+  SpawnData *data = user_data;
-+  data->res = g_object_ref (res);
-+  g_main_loop_quit (data->loop);
-+}
-+
-+static duk_ret_t
-+js_polkit_spawn (duk_context *cx)
-+{
-+#if (DUK_VERSION >= 20000)
-+  duk_ret_t ret = DUK_RET_ERROR;
-+#else
-+  duk_ret_t ret = DUK_RET_INTERNAL_ERROR;
-+#endif
-+  gchar *standard_output = NULL;
-+  gchar *standard_error = NULL;
-+  gint exit_status;
-+  GError *error = NULL;
-+  guint32 array_len;
-+  gchar **argv = NULL;
-+  GMainContext *context = NULL;
-+  GMainLoop *loop = NULL;
-+  SpawnData data = {0};
-+  char *err_str = NULL;
-+  guint n;
-+
-+  if (!duk_is_array (cx, 0))
-+    goto out;
-+
-+  array_len = duk_get_length (cx, 0);
-+
-+  argv = g_new0 (gchar*, array_len + 1);
-+  for (n = 0; n < array_len; n++)
-+    {
-+      duk_get_prop_index (cx, 0, n);
-+      argv[n] = g_strdup (duk_to_string (cx, -1));
-+      duk_pop (cx);
-+    }
-+
-+  context = g_main_context_new ();
-+  loop = g_main_loop_new (context, FALSE);
-+
-+  g_main_context_push_thread_default (context);
-+
-+  data.loop = loop;
-+  utils_spawn ((const gchar *const *) argv,
-+               10, /* timeout_seconds */
-+               NULL, /* cancellable */
-+               spawn_cb,
-+               &data);
-+
-+  g_main_loop_run (loop);
-+
-+  g_main_context_pop_thread_default (context);
-+
-+  if (!utils_spawn_finish (data.res,
-+                           &exit_status,
-+                           &standard_output,
-+                           &standard_error,
-+                           &error))
-+    {
-+      err_str = g_strdup_printf ("Error spawning helper: %s (%s, %d)",
-+                                 error->message, g_quark_to_string (error->domain), error->code);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!(WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 0))
-+    {
-+      GString *gstr;
-+      gstr = g_string_new (NULL);
-+      if (WIFEXITED (exit_status))
-+        {
-+          g_string_append_printf (gstr,
-+                                  "Helper exited with non-zero exit status %d",
-+                                  WEXITSTATUS (exit_status));
-+        }
-+      else if (WIFSIGNALED (exit_status))
-+        {
-+          g_string_append_printf (gstr,
-+                                  "Helper was signaled with signal %s (%d)",
-+                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  WTERMSIG (exit_status));
-+        }
-+      g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-+                              standard_output, standard_error);
-+      err_str = g_string_free (gstr, FALSE);
-+      goto out;
-+    }
-+
-+  duk_push_string (cx, standard_output);
-+  ret = 1;
-+
-+ out:
-+  g_strfreev (argv);
-+  g_free (standard_output);
-+  g_free (standard_error);
-+  g_clear_object (&data.res);
-+  if (loop != NULL)
-+    g_main_loop_unref (loop);
-+  if (context != NULL)
-+    g_main_context_unref (context);
-+
-+  if (err_str)
-+    duk_error (cx, DUK_ERR_ERROR, err_str);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+
-+static duk_ret_t
-+js_polkit_user_is_in_netgroup (duk_context *cx)
-+{
-+  const char *user;
-+  const char *netgroup;
-+  gboolean is_in_netgroup = FALSE;
-+
-+  user = duk_require_string (cx, 0);
-+  netgroup = duk_require_string (cx, 1);
-+
-+  if (innetgr (netgroup,
-+               NULL,  /* host */
-+               user,
-+               NULL)) /* domain */
-+    {
-+      is_in_netgroup = TRUE;
-+    }
-+
-+  duk_push_boolean (cx, is_in_netgroup);
-+  return 1;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+typedef struct
-+{
-+  GSimpleAsyncResult *simple; /* borrowed reference */
-+  GMainContext *main_context; /* may be NULL */
-+
-+  GCancellable *cancellable;  /* may be NULL */
-+  gulong cancellable_handler_id;
-+
-+  GPid child_pid;
-+  gint child_stdout_fd;
-+  gint child_stderr_fd;
-+
-+  GIOChannel *child_stdout_channel;
-+  GIOChannel *child_stderr_channel;
-+
-+  GSource *child_watch_source;
-+  GSource *child_stdout_source;
-+  GSource *child_stderr_source;
-+
-+  guint timeout_seconds;
-+  gboolean timed_out;
-+  GSource *timeout_source;
-+
-+  GString *child_stdout;
-+  GString *child_stderr;
-+
-+  gint exit_status;
-+} UtilsSpawnData;
-+
-+static void
-+utils_child_watch_from_release_cb (GPid     pid,
-+                                   gint     status,
-+                                   gpointer user_data)
-+{
-+}
-+
-+static void
-+utils_spawn_data_free (UtilsSpawnData *data)
-+{
-+  if (data->timeout_source != NULL)
-+    {
-+      g_source_destroy (data->timeout_source);
-+      data->timeout_source = NULL;
-+    }
-+
-+  /* Nuke the child, if necessary */
-+  if (data->child_watch_source != NULL)
-+    {
-+      g_source_destroy (data->child_watch_source);
-+      data->child_watch_source = NULL;
-+    }
-+
-+  if (data->child_pid != 0)
-+    {
-+      GSource *source;
-+      kill (data->child_pid, SIGTERM);
-+      /* OK, we need to reap for the child ourselves - we don't want
-+       * to use waitpid() because that might block the calling
-+       * thread (the child might handle SIGTERM and use several
-+       * seconds for cleanup/rollback).
-+       *
-+       * So we use GChildWatch instead.
-+       *
-+       * Avoid taking a references to ourselves. but note that we need
-+       * to pass the GSource so we can nuke it once handled.
-+       */
-+      source = g_child_watch_source_new (data->child_pid);
-+      g_source_set_callback (source,
-+                             (GSourceFunc) utils_child_watch_from_release_cb,
-+                             source,
-+                             (GDestroyNotify) g_source_destroy);
-+      g_source_attach (source, data->main_context);
-+      g_source_unref (source);
-+      data->child_pid = 0;
-+    }
-+
-+  if (data->child_stdout != NULL)
-+    {
-+      g_string_free (data->child_stdout, TRUE);
-+      data->child_stdout = NULL;
-+    }
-+
-+  if (data->child_stderr != NULL)
-+    {
-+      g_string_free (data->child_stderr, TRUE);
-+      data->child_stderr = NULL;
-+    }
-+
-+  if (data->child_stdout_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stdout_channel);
-+      data->child_stdout_channel = NULL;
-+    }
-+  if (data->child_stderr_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stderr_channel);
-+      data->child_stderr_channel = NULL;
-+    }
-+
-+  if (data->child_stdout_source != NULL)
-+    {
-+      g_source_destroy (data->child_stdout_source);
-+      data->child_stdout_source = NULL;
-+    }
-+  if (data->child_stderr_source != NULL)
-+    {
-+      g_source_destroy (data->child_stderr_source);
-+      data->child_stderr_source = NULL;
-+    }
-+
-+  if (data->child_stdout_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stdout_fd) == 0);
-+      data->child_stdout_fd = -1;
-+    }
-+  if (data->child_stderr_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stderr_fd) == 0);
-+      data->child_stderr_fd = -1;
-+    }
-+
-+  if (data->cancellable_handler_id > 0)
-+    {
-+      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
-+      data->cancellable_handler_id = 0;
-+    }
-+
-+  if (data->main_context != NULL)
-+    g_main_context_unref (data->main_context);
-+
-+  if (data->cancellable != NULL)
-+    g_object_unref (data->cancellable);
-+
-+  g_slice_free (UtilsSpawnData, data);
-+}
-+
-+/* called in the thread where @cancellable was cancelled */
-+static void
-+utils_on_cancelled (GCancellable *cancellable,
-+                    gpointer      user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  GError *error;
-+
-+  error = NULL;
-+  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
-+  g_simple_async_result_take_error (data->simple, error);
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_read_child_stderr (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stderr, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static gboolean
-+utils_read_child_stdout (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stdout, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static void
-+utils_child_watch_cb (GPid     pid,
-+                      gint     status,
-+                      gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  gchar *buf;
-+  gsize buf_size;
-+
-+  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stdout, buf, buf_size);
-+      g_free (buf);
-+    }
-+  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stderr, buf, buf_size);
-+      g_free (buf);
-+    }
-+
-+  data->exit_status = status;
-+
-+  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
-+  data->child_pid = 0;
-+  data->child_watch_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_timeout_cb (gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+
-+  data->timed_out = TRUE;
-+
-+  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
-+  data->timeout_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+
-+  return FALSE; /* remove source */
-+}
-+
-+static void
-+utils_spawn (const gchar *const  *argv,
-+             guint                timeout_seconds,
-+             GCancellable        *cancellable,
-+             GAsyncReadyCallback  callback,
-+             gpointer             user_data)
-+{
-+  UtilsSpawnData *data;
-+  GError *error;
-+
-+  data = g_slice_new0 (UtilsSpawnData);
-+  data->timeout_seconds = timeout_seconds;
-+  data->simple = g_simple_async_result_new (NULL,
-+                                            callback,
-+                                            user_data,
-+                                            utils_spawn);
-+  data->main_context = g_main_context_get_thread_default ();
-+  if (data->main_context != NULL)
-+    g_main_context_ref (data->main_context);
-+
-+  data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL;
-+
-+  data->child_stdout = g_string_new (NULL);
-+  data->child_stderr = g_string_new (NULL);
-+  data->child_stdout_fd = -1;
-+  data->child_stderr_fd = -1;
-+
-+  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
-+  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
-+
-+  error = NULL;
-+  if (data->cancellable != NULL)
-+    {
-+      /* could already be cancelled */
-+      error = NULL;
-+      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
-+        {
-+          g_simple_async_result_take_error (data->simple, error);
-+          g_simple_async_result_complete_in_idle (data->simple);
-+          g_object_unref (data->simple);
-+          goto out;
-+        }
-+
-+      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
-+                                                            G_CALLBACK (utils_on_cancelled),
-+                                                            data,
-+                                                            NULL);
-+    }
-+
-+  error = NULL;
-+  if (!g_spawn_async_with_pipes (NULL, /* working directory */
-+                                 (gchar **) argv,
-+                                 NULL, /* envp */
-+                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
-+                                 NULL, /* child_setup */
-+                                 NULL, /* child_setup's user_data */
-+                                 &(data->child_pid),
-+                                 NULL, /* gint *stdin_fd */
-+                                 &(data->child_stdout_fd),
-+                                 &(data->child_stderr_fd),
-+                                 &error))
-+    {
-+      g_prefix_error (&error, "Error spawning: ");
-+      g_simple_async_result_take_error (data->simple, error);
-+      g_simple_async_result_complete_in_idle (data->simple);
-+      g_object_unref (data->simple);
-+      goto out;
-+    }
-+
-+  if (timeout_seconds > 0)
-+    {
-+      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
-+      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
-+      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
-+      g_source_attach (data->timeout_source, data->main_context);
-+      g_source_unref (data->timeout_source);
-+    }
-+
-+  data->child_watch_source = g_child_watch_source_new (data->child_pid);
-+  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
-+  g_source_attach (data->child_watch_source, data->main_context);
-+  g_source_unref (data->child_watch_source);
-+
-+  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
-+  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
-+  g_source_attach (data->child_stdout_source, data->main_context);
-+  g_source_unref (data->child_stdout_source);
-+
-+  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
-+  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
-+  g_source_attach (data->child_stderr_source, data->main_context);
-+  g_source_unref (data->child_stderr_source);
-+
-+ out:
-+  ;
-+}
-+
-+gboolean
-+utils_spawn_finish (GAsyncResult   *res,
-+                    gint           *out_exit_status,
-+                    gchar         **out_standard_output,
-+                    gchar         **out_standard_error,
-+                    GError        **error)
-+{
-+  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
-+  UtilsSpawnData *data;
-+  gboolean ret = FALSE;
-+
-+  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
-+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-+
-+  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
-+
-+  if (g_simple_async_result_propagate_error (simple, error))
-+    goto out;
-+
-+  data = g_simple_async_result_get_op_res_gpointer (simple);
-+
-+  if (data->timed_out)
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_TIMED_OUT,
-+                   "Timed out after %d seconds",
-+                   data->timeout_seconds);
-+      goto out;
-+    }
-+
-+  if (out_exit_status != NULL)
-+    *out_exit_status = data->exit_status;
-+
-+  if (out_standard_output != NULL)
-+    *out_standard_output = g_strdup (data->child_stdout->str);
-+
-+  if (out_standard_error != NULL)
-+    *out_standard_error = g_strdup (data->child_stderr->str);
-+
-+  ret = TRUE;
-+
-+ out:
-+  return ret;
-+}
--- 
-GitLab
-
-
-From d74aad8152a7c51999fffa9abe28e4306a052399 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:15:17 +0800
-Subject: [PATCH 02/16] check netgroup.h header file
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index ae98453..543d6fd 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -26,7 +26,11 @@
- #include <errno.h>
- #include <pwd.h>
- #include <grp.h>
-+#ifdef HAVE_NETGROUP_H
-+#include <netgroup.h>
-+#else
- #include <netdb.h>
-+#endif
- #include <string.h>
- #include <glib/gstdio.h>
- #include <locale.h>
--- 
-GitLab
-
-
-From 69c761506cbe458807e4ae2742c9e05bc60dad3d Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 10:59:03 +0800
-Subject: [PATCH 03/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 543d6fd..a54ed5b 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -249,7 +249,11 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   duk_context *cx = authority->priv->cx;
- 
-   duk_set_top (cx, 0);
--  duk_get_global_string (cx, "polkit");
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error deleting old rules, not loading new ones");
-+      return;
-+  }
-   duk_push_string (cx, "_deleteRules");
- 
-   duk_call_prop (cx, 0, 0);
--- 
-GitLab
-
-
-From f1536c4899934fd3c8243fda2d084a472fe57d2e Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 11:22:39 +0800
-Subject: [PATCH 04/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index a54ed5b..1a7e6d3 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -656,7 +656,10 @@ push_action_and_details (duk_context               *cx,
-   gchar **keys;
-   guint n;
- 
--  duk_get_global_string (cx, "Action");
-+  if (!duk_get_global_string (cx, "Action")) {
-+    return FALSE;
-+  }
-+
-   duk_new (cx, 0);
- 
-   set_property_str (cx, "id", action_id);
-@@ -699,7 +702,12 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
-   duk_context *cx = authority->priv->cx;
- 
-   duk_set_top (cx, 0);
--  duk_get_global_string (cx, "polkit");
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error deleting old rules, not loading new ones");
-+      goto out;
-+  }
-+
-   duk_push_string (cx, "_runAdminRules");
- 
-   if (!push_action_and_details (cx, action_id, details, &error))
--- 
-GitLab
-
-
-From ca15eecf5dc7755947515c1bfc651fd8770aaf8f Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:17:16 +0800
-Subject: [PATCH 05/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 10 ++++++++--
- 1 file changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 1a7e6d3..3f1b32d 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -550,7 +550,10 @@ push_subject (duk_context               *cx,
-   char *seat_str = NULL;
-   char *session_str = NULL;
- 
--  duk_get_global_string (cx, "Subject");
-+  if (!duk_get_global_string (cx, "Subject")) {
-+    return FALSE;
-+  }
-+
-   duk_new (cx, 0);
- 
-   if (POLKIT_IS_UNIX_PROCESS (subject))
-@@ -789,8 +792,11 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
-   gboolean good = FALSE;
-   duk_context *cx = authority->priv->cx;
- 
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      goto out;
-+  }
-+
-   duk_set_top (cx, 0);
--  duk_get_global_string (cx, "polkit");
-   duk_push_string (cx, "_runRules");
- 
-   if (!push_action_and_details (cx, action_id, details, &error))
--- 
-GitLab
-
-
-From 870348365cc0166e14f28e0d144ed552bba4d794 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:18:13 +0800
-Subject: [PATCH 06/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 3f1b32d..6294ad9 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -843,7 +843,8 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
-  out:
-   if (!good)
-     ret = POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED;
--  g_free (ret_str);
-+  if (ret_str != NULL)
-+      g_free (ret_str);
- 
-   return ret;
- }
--- 
-GitLab
-
-
-From 81c916ff08fdcee3c7340c4b2d4632086b89666c Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 11:23:04 +0800
-Subject: [PATCH 07/16] fix typecase
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 6294ad9..d466c9d 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -1191,7 +1191,7 @@ static void
- utils_on_cancelled (GCancellable *cancellable,
-                     gpointer      user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   GError *error;
- 
-   error = NULL;
-@@ -1206,7 +1206,7 @@ utils_read_child_stderr (GIOChannel *channel,
-                          GIOCondition condition,
-                          gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   gchar buf[1024];
-   gsize bytes_read;
- 
-@@ -1220,7 +1220,7 @@ utils_read_child_stdout (GIOChannel *channel,
-                          GIOCondition condition,
-                          gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   gchar buf[1024];
-   gsize bytes_read;
- 
-@@ -1234,7 +1234,7 @@ utils_child_watch_cb (GPid     pid,
-                       gint     status,
-                       gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   gchar *buf;
-   gsize buf_size;
- 
-@@ -1263,7 +1263,7 @@ utils_child_watch_cb (GPid     pid,
- static gboolean
- utils_timeout_cb (gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
- 
-   data->timed_out = TRUE;
- 
--- 
-GitLab
-
-
-From acb956bf52f0a78bf7aaf925876f96e97a146995 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 18:04:27 +0800
-Subject: [PATCH 08/16] typecase
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index d466c9d..237b1ad 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -915,8 +915,8 @@ spawn_cb (GObject       *source_object,
-           GAsyncResult  *res,
-           gpointer       user_data)
- {
--  SpawnData *data = user_data;
--  data->res = g_object_ref (res);
-+  SpawnData *data = (SpawnData *)user_data;
-+  data->res = (GAsyncResult*)g_object_ref (res);
-   g_main_loop_quit (data->loop);
- }
- 
-@@ -1292,12 +1292,12 @@ utils_spawn (const gchar *const  *argv,
-   data->simple = g_simple_async_result_new (NULL,
-                                             callback,
-                                             user_data,
--                                            utils_spawn);
-+                                            (gpointer*)utils_spawn);
-   data->main_context = g_main_context_get_thread_default ();
-   if (data->main_context != NULL)
-     g_main_context_ref (data->main_context);
- 
--  data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL;
-+  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
- 
-   data->child_stdout = g_string_new (NULL);
-   data->child_stderr = g_string_new (NULL);
-@@ -1397,7 +1397,7 @@ utils_spawn_finish (GAsyncResult   *res,
-   if (g_simple_async_result_propagate_error (simple, error))
-     goto out;
- 
--  data = g_simple_async_result_get_op_res_gpointer (simple);
-+  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
- 
-   if (data->timed_out)
-     {
--- 
-GitLab
-
-
-From be060e4d48aceb09af34868b555b6c73c7afdabb Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:53:23 +0800
-Subject: [PATCH 09/16] some change
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- .../polkitbackendduktapeauthority.c           | 26 +++++++++++--------
- 1 file changed, 15 insertions(+), 11 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 237b1ad..fad9017 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -207,18 +207,22 @@ load_scripts (PolkitBackendJsAuthority  *authority)
- 
-   for (l = files; l != NULL; l = l->next)
-     {
--      const gchar *filename = l->data;
--
-+      const gchar *filename = (gchar *)l->data;
- #if (DUK_VERSION >= 20000)
--      gchar *contents;
--      gsize length;
--      GError *error = NULL;
--      if (!g_file_get_contents (filename, &contents, &length, &error)){
--        g_warning("Error when file contents of %s: %s\n", filename, error->message);
--        g_error_free (error);
--        continue;
--      }
--      if (duk_peval_lstring_noresult(cx, contents,length) != 0)
-+      GFile *file = g_file_new_for_path (filename);
-+      char *contents;
-+      gsize len;
-+      if (!g_file_load_contents (file, NULL, &contents, &len, NULL, NULL))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error compiling script %s",
-+                                        filename);
-+          g_object_unref (file);
-+          continue;
-+        }
-+
-+      g_object_unref (file);
-+      if (duk_peval_lstring_noresult(cx, contents,len) != 0)
- #else
-       if (duk_peval_file_noresult (cx, filename) != 0)
- #endif
--- 
-GitLab
-
-
-From 2ffb62048a5ebedfe3bb053feb7385c7270ede28 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 15:25:45 +0800
-Subject: [PATCH 10/16] some change
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- .../polkitbackendduktapeauthority.c           | 24 +++++++++----------
- 1 file changed, 12 insertions(+), 12 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index fad9017..6fac3be 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -125,6 +125,18 @@ G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BAC
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
-+static duk_ret_t js_polkit_log (duk_context *cx);
-+static duk_ret_t js_polkit_spawn (duk_context *cx);
-+static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-+
-+static const duk_function_list_entry js_polkit_functions[] =
-+{
-+  { "log", js_polkit_log, 1 },
-+  { "spawn", js_polkit_spawn, 1 },
-+  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
-+  { NULL, NULL, 0 },
-+};
-+
- static void
- polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
- {
-@@ -347,18 +359,6 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static duk_ret_t js_polkit_log (duk_context *cx);
--static duk_ret_t js_polkit_spawn (duk_context *cx);
--static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
--
--static const duk_function_list_entry js_polkit_functions[] =
--{
--  { "log", js_polkit_log, 1 },
--  { "spawn", js_polkit_spawn, 1 },
--  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
--  { NULL, NULL, 0 },
--};
--
- static void
- polkit_backend_js_authority_constructed (GObject *object)
- {
--- 
-GitLab
-
-
-From edb70ef69eed3275f5654510d135e680eb46c85d Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 15:25:35 +0800
-Subject: [PATCH 11/16] remove WATCHDOG_TIMEOUT define
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 6fac3be..51e03fd 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -69,7 +69,6 @@ struct _PolkitBackendJsAuthorityPrivate
-   duk_context *cx;
- };
- 
--#define WATCHDOG_TIMEOUT (15 * G_TIME_SPAN_SECOND)
- 
- static void utils_spawn (const gchar *const  *argv,
-                          guint                timeout_seconds,
--- 
-GitLab
-
-
-From 906ae404f29f15ef8c529b999bf091b5d18ed7ac Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 12:46:40 +0800
-Subject: [PATCH 12/16] add meson build system support
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- meson.build                   | 11 ++++++++++-
- meson_options.txt             |  1 +
- src/polkitbackend/meson.build | 10 ++++++++--
- 3 files changed, 19 insertions(+), 3 deletions(-)
-
-diff --git a/meson.build b/meson.build
-index 858078d..4e44723 100644
---- a/meson.build
-+++ b/meson.build
-@@ -133,7 +133,13 @@ expat_dep = dependency('expat')
- assert(cc.has_header('expat.h', dependencies: expat_dep), 'Can\'t find expat.h. Please install expat.')
- assert(cc.has_function('XML_ParserCreate', dependencies: expat_dep), 'Can\'t find expat library. Please install expat.')
- 
--mozjs_dep = dependency('mozjs-78')
-+js_engine = get_option('js_engine')
-+if js_engine == 'duktape'
-+  js_dep = dependency('duktape')
-+  libm_dep = cc.find_library('m')
-+elif js_engine == 'mozjs'
-+  js_dep = dependency('mozjs-78')
-+endif
- 
- dbus_dep = dependency('dbus-1', required: false)
- dbus_policydir = pk_prefix / pk_datadir / 'dbus-1/system.d'
-@@ -361,6 +367,9 @@ if enable_logind
-   output += '        systemdsystemunitdir:     ' + systemd_systemdsystemunitdir + '\n'
- endif
- output += '        polkitd user:             ' + polkitd_user + ' \n'
-+output += '        Javascript engine:        ' + js_engine + '\n'
-+if enable_logind
-+endif
- output += '        PAM support:              ' + enable_pam.to_string() + '\n\n'
- if enable_pam
-   output += '        PAM file auth:            ' + pam_conf['PAM_FILE_INCLUDE_AUTH'] + '\n'
-diff --git a/meson_options.txt b/meson_options.txt
-index 25e3e77..76aa311 100644
---- a/meson_options.txt
-+++ b/meson_options.txt
-@@ -16,3 +16,4 @@ option('introspection', type: 'boolean', value: true, description: 'Enable intro
- 
- option('gtk_doc', type: 'boolean', value: false, description: 'use gtk-doc to build documentation')
- option('man', type: 'boolean', value: false, description: 'build manual pages')
-+option('js_engine', type: 'combo', choices: ['mozjs', 'duktape'], value: 'duktape', description: 'javascript engine')
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 64f0e4a..489897d 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -5,7 +5,6 @@ sources = files(
-   'polkitbackendactionpool.c',
-   'polkitbackendauthority.c',
-   'polkitbackendinteractiveauthority.c',
--  'polkitbackendjsauthority.cpp',
- )
- 
- output = 'initjs.h'
-@@ -21,7 +20,7 @@ sources += custom_target(
- deps = [
-   expat_dep,
-   libpolkit_gobject_dep,
--  mozjs_dep,
-+  js_dep,
- ]
- 
- c_flags = [
-@@ -31,6 +30,13 @@ c_flags = [
-   '-DPACKAGE_SYSCONF_DIR="@0@"'.format(pk_prefix / pk_sysconfdir),
- ]
- 
-+if js_engine == 'duktape'
-+  sources += files('polkitbackendduktapeauthority.c')
-+  deps += libm_dep
-+elif js_engine == 'mozjs'
-+  sources += files('polkitbackendjsauthority.cpp')
-+endif
-+
- if enable_logind
-   sources += files('polkitbackendsessionmonitor-systemd.c')
- 
--- 
-GitLab
-
-
-From 1380b505c25be4aebe54b1b4223a570d64af83cc Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 18:49:14 +0800
-Subject: [PATCH 13/16] fix run error
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 51e03fd..4b4f8fd 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -795,11 +795,11 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
-   gboolean good = FALSE;
-   duk_context *cx = authority->priv->cx;
- 
-+  duk_set_top (cx, 0);
-   if (!duk_get_global_string (cx, "polkit")) {
-       goto out;
-   }
- 
--  duk_set_top (cx, 0);
-   duk_push_string (cx, "_runRules");
- 
-   if (!push_action_and_details (cx, action_id, details, &error))
--- 
-GitLab
-
-
-From 6856a704b70378948ef5f66e9b09555d97d4070b Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
-Date: Fri, 10 Sep 2021 15:17:58 -0700
-Subject: [PATCH 14/16] Deduplicate code for "Add duktape as JS engine backend"
- effort/MR
-
-This leverages Wu Xiaotian (@yetist)'s original MR
-(https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/35), in
-an effort to complete said work.
-
-This is the first of the requests from maintainers--to reduce
-eliminate code duplication.
-
-The runaway-killer missing functionality will come in the sequence.
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/Makefile.am                 |   1 +
- src/polkitbackend/meson.build                 |   1 +
- src/polkitbackend/polkitbackendcommon.c       | 530 +++++++++++++
- src/polkitbackend/polkitbackendcommon.h       | 156 ++++
- .../polkitbackendduktapeauthority.c           | 714 ++----------------
- .../polkitbackendjsauthority.cpp              | 711 ++---------------
- 6 files changed, 790 insertions(+), 1323 deletions(-)
- create mode 100644 src/polkitbackend/polkitbackendcommon.c
- create mode 100644 src/polkitbackend/polkitbackendcommon.h
-
-diff --git a/src/polkitbackend/Makefile.am b/src/polkitbackend/Makefile.am
-index abcbc6f..6a8b4ae 100644
---- a/src/polkitbackend/Makefile.am
-+++ b/src/polkitbackend/Makefile.am
-@@ -31,6 +31,7 @@ libpolkit_backend_1_la_SOURCES =                                   			\
-         polkitbackend.h									\
- 	polkitbackendtypes.h								\
- 	polkitbackendprivate.h								\
-+	polkitbackendcommon.h			polkitbackendcommon.c			\
- 	polkitbackendauthority.h		polkitbackendauthority.c		\
- 	polkitbackendinteractiveauthority.h	polkitbackendinteractiveauthority.c	\
- 	polkitbackendjsauthority.h				\
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 489897d..9ec01b2 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -4,6 +4,7 @@ sources = files(
-   'polkitbackendactionlookup.c',
-   'polkitbackendactionpool.c',
-   'polkitbackendauthority.c',
-+  'polkitbackendcommon.c',
-   'polkitbackendinteractiveauthority.c',
- )
- 
-diff --git a/src/polkitbackend/polkitbackendcommon.c b/src/polkitbackend/polkitbackendcommon.c
-new file mode 100644
-index 0000000..6783dff
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendcommon.c
-@@ -0,0 +1,530 @@
-+/*
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#include "polkitbackendcommon.h"
-+
-+static void
-+utils_child_watch_from_release_cb (GPid     pid,
-+                                   gint     status,
-+                                   gpointer user_data)
-+{
-+}
-+
-+static void
-+utils_spawn_data_free (UtilsSpawnData *data)
-+{
-+  if (data->timeout_source != NULL)
-+    {
-+      g_source_destroy (data->timeout_source);
-+      data->timeout_source = NULL;
-+    }
-+
-+  /* Nuke the child, if necessary */
-+  if (data->child_watch_source != NULL)
-+    {
-+      g_source_destroy (data->child_watch_source);
-+      data->child_watch_source = NULL;
-+    }
-+
-+  if (data->child_pid != 0)
-+    {
-+      GSource *source;
-+      kill (data->child_pid, SIGTERM);
-+      /* OK, we need to reap for the child ourselves - we don't want
-+       * to use waitpid() because that might block the calling
-+       * thread (the child might handle SIGTERM and use several
-+       * seconds for cleanup/rollback).
-+       *
-+       * So we use GChildWatch instead.
-+       *
-+       * Avoid taking a references to ourselves. but note that we need
-+       * to pass the GSource so we can nuke it once handled.
-+       */
-+      source = g_child_watch_source_new (data->child_pid);
-+      g_source_set_callback (source,
-+                             (GSourceFunc) utils_child_watch_from_release_cb,
-+                             source,
-+                             (GDestroyNotify) g_source_destroy);
-+      g_source_attach (source, data->main_context);
-+      g_source_unref (source);
-+      data->child_pid = 0;
-+    }
-+
-+  if (data->child_stdout != NULL)
-+    {
-+      g_string_free (data->child_stdout, TRUE);
-+      data->child_stdout = NULL;
-+    }
-+
-+  if (data->child_stderr != NULL)
-+    {
-+      g_string_free (data->child_stderr, TRUE);
-+      data->child_stderr = NULL;
-+    }
-+
-+  if (data->child_stdout_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stdout_channel);
-+      data->child_stdout_channel = NULL;
-+    }
-+  if (data->child_stderr_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stderr_channel);
-+      data->child_stderr_channel = NULL;
-+    }
-+
-+  if (data->child_stdout_source != NULL)
-+    {
-+      g_source_destroy (data->child_stdout_source);
-+      data->child_stdout_source = NULL;
-+    }
-+  if (data->child_stderr_source != NULL)
-+    {
-+      g_source_destroy (data->child_stderr_source);
-+      data->child_stderr_source = NULL;
-+    }
-+
-+  if (data->child_stdout_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stdout_fd) == 0);
-+      data->child_stdout_fd = -1;
-+    }
-+  if (data->child_stderr_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stderr_fd) == 0);
-+      data->child_stderr_fd = -1;
-+    }
-+
-+  if (data->cancellable_handler_id > 0)
-+    {
-+      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
-+      data->cancellable_handler_id = 0;
-+    }
-+
-+  if (data->main_context != NULL)
-+    g_main_context_unref (data->main_context);
-+
-+  if (data->cancellable != NULL)
-+    g_object_unref (data->cancellable);
-+
-+  g_slice_free (UtilsSpawnData, data);
-+}
-+
-+/* called in the thread where @cancellable was cancelled */
-+static void
-+utils_on_cancelled (GCancellable *cancellable,
-+                    gpointer      user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  GError *error;
-+
-+  error = NULL;
-+  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
-+  g_simple_async_result_take_error (data->simple, error);
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_timeout_cb (gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+
-+  data->timed_out = TRUE;
-+
-+  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
-+  data->timeout_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+
-+  return FALSE; /* remove source */
-+}
-+
-+static void
-+utils_child_watch_cb (GPid     pid,
-+                      gint     status,
-+                      gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar *buf;
-+  gsize buf_size;
-+
-+  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stdout, buf, buf_size);
-+      g_free (buf);
-+    }
-+  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stderr, buf, buf_size);
-+      g_free (buf);
-+    }
-+
-+  data->exit_status = status;
-+
-+  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
-+  data->child_pid = 0;
-+  data->child_watch_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_read_child_stderr (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stderr, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static gboolean
-+utils_read_child_stdout (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stdout, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+void
-+polkit_backend_common_spawn (const gchar *const  *argv,
-+                             guint                timeout_seconds,
-+                             GCancellable        *cancellable,
-+                             GAsyncReadyCallback  callback,
-+                             gpointer             user_data)
-+{
-+  UtilsSpawnData *data;
-+  GError *error;
-+
-+  data = g_slice_new0 (UtilsSpawnData);
-+  data->timeout_seconds = timeout_seconds;
-+  data->simple = g_simple_async_result_new (NULL,
-+                                            callback,
-+                                            user_data,
-+                                            (gpointer*)polkit_backend_common_spawn);
-+  data->main_context = g_main_context_get_thread_default ();
-+  if (data->main_context != NULL)
-+    g_main_context_ref (data->main_context);
-+
-+  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
-+
-+  data->child_stdout = g_string_new (NULL);
-+  data->child_stderr = g_string_new (NULL);
-+  data->child_stdout_fd = -1;
-+  data->child_stderr_fd = -1;
-+
-+  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
-+  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
-+
-+  error = NULL;
-+  if (data->cancellable != NULL)
-+    {
-+      /* could already be cancelled */
-+      error = NULL;
-+      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
-+        {
-+          g_simple_async_result_take_error (data->simple, error);
-+          g_simple_async_result_complete_in_idle (data->simple);
-+          g_object_unref (data->simple);
-+          goto out;
-+        }
-+
-+      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
-+                                                            G_CALLBACK (utils_on_cancelled),
-+                                                            data,
-+                                                            NULL);
-+    }
-+
-+  error = NULL;
-+  if (!g_spawn_async_with_pipes (NULL, /* working directory */
-+                                 (gchar **) argv,
-+                                 NULL, /* envp */
-+                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
-+                                 NULL, /* child_setup */
-+                                 NULL, /* child_setup's user_data */
-+                                 &(data->child_pid),
-+                                 NULL, /* gint *stdin_fd */
-+                                 &(data->child_stdout_fd),
-+                                 &(data->child_stderr_fd),
-+                                 &error))
-+    {
-+      g_prefix_error (&error, "Error spawning: ");
-+      g_simple_async_result_take_error (data->simple, error);
-+      g_simple_async_result_complete_in_idle (data->simple);
-+      g_object_unref (data->simple);
-+      goto out;
-+    }
-+
-+  if (timeout_seconds > 0)
-+    {
-+      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
-+      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
-+      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
-+      g_source_attach (data->timeout_source, data->main_context);
-+      g_source_unref (data->timeout_source);
-+    }
-+
-+  data->child_watch_source = g_child_watch_source_new (data->child_pid);
-+  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
-+  g_source_attach (data->child_watch_source, data->main_context);
-+  g_source_unref (data->child_watch_source);
-+
-+  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
-+  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
-+  g_source_attach (data->child_stdout_source, data->main_context);
-+  g_source_unref (data->child_stdout_source);
-+
-+  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
-+  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
-+  g_source_attach (data->child_stderr_source, data->main_context);
-+  g_source_unref (data->child_stderr_source);
-+
-+ out:
-+  ;
-+}
-+
-+void
-+polkit_backend_common_on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                              GFile            *file,
-+                                              GFile            *other_file,
-+                                              GFileMonitorEvent event_type,
-+                                              gpointer          user_data)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
-+
-+  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
-+   *       Because when editing a file with emacs we get 4-8 events..
-+   */
-+
-+  if (file != NULL)
-+    {
-+      gchar *name;
-+
-+      name = g_file_get_basename (file);
-+
-+      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
-+      if (!g_str_has_prefix (name, ".") &&
-+          !g_str_has_prefix (name, "#") &&
-+          g_str_has_suffix (name, ".rules") &&
-+          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
-+           event_type == G_FILE_MONITOR_EVENT_DELETED ||
-+           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Reloading rules");
-+          polkit_backend_common_reload_scripts (authority);
-+        }
-+      g_free (name);
-+    }
-+}
-+
-+gboolean
-+polkit_backend_common_spawn_finish (GAsyncResult   *res,
-+                                    gint           *out_exit_status,
-+                                    gchar         **out_standard_output,
-+                                    gchar         **out_standard_error,
-+                                    GError        **error)
-+{
-+  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
-+  UtilsSpawnData *data;
-+  gboolean ret = FALSE;
-+
-+  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
-+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-+
-+  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == polkit_backend_common_spawn);
-+
-+  if (g_simple_async_result_propagate_error (simple, error))
-+    goto out;
-+
-+  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
-+
-+  if (data->timed_out)
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_TIMED_OUT,
-+                   "Timed out after %d seconds",
-+                   data->timeout_seconds);
-+      goto out;
-+    }
-+
-+  if (out_exit_status != NULL)
-+    *out_exit_status = data->exit_status;
-+
-+  if (out_standard_output != NULL)
-+    *out_standard_output = g_strdup (data->child_stdout->str);
-+
-+  if (out_standard_error != NULL)
-+    *out_standard_error = g_strdup (data->child_stderr->str);
-+
-+  ret = TRUE;
-+
-+ out:
-+  return ret;
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
-+{
-+  return "js";
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
-+{
-+  return PACKAGE_VERSION;
-+}
-+
-+static PolkitAuthorityFeatures
-+polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
-+{
-+  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
-+}
-+
-+void
-+polkit_backend_common_js_authority_class_init_common (PolkitBackendJsAuthorityClass *klass)
-+{
-+  GObjectClass *gobject_class;
-+  PolkitBackendAuthorityClass *authority_class;
-+  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
-+
-+  gobject_class = G_OBJECT_CLASS (klass);
-+  gobject_class->finalize                               = polkit_backend_common_js_authority_finalize;
-+  gobject_class->set_property                           = polkit_backend_common_js_authority_set_property;
-+  gobject_class->constructed                            = polkit_backend_common_js_authority_constructed;
-+
-+  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
-+  authority_class->get_name                             = polkit_backend_js_authority_get_name;
-+  authority_class->get_version                          = polkit_backend_js_authority_get_version;
-+  authority_class->get_features                         = polkit_backend_js_authority_get_features;
-+
-+  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
-+  interactive_authority_class->get_admin_identities     = polkit_backend_common_js_authority_get_admin_auth_identities;
-+  interactive_authority_class->check_authorization_sync = polkit_backend_common_js_authority_check_authorization_sync;
-+
-+  g_object_class_install_property (gobject_class,
-+                                   PROP_RULES_DIRS,
-+                                   g_param_spec_boxed ("rules-dirs",
-+                                                       NULL,
-+                                                       NULL,
-+                                                       G_TYPE_STRV,
-+                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
-+}
-+
-+gint
-+polkit_backend_common_rules_file_name_cmp (const gchar *a,
-+                                           const gchar *b)
-+{
-+  gint ret;
-+  const gchar *a_base;
-+  const gchar *b_base;
-+
-+  a_base = strrchr (a, '/');
-+  b_base = strrchr (b, '/');
-+
-+  g_assert (a_base != NULL);
-+  g_assert (b_base != NULL);
-+  a_base += 1;
-+  b_base += 1;
-+
-+  ret = g_strcmp0 (a_base, b_base);
-+  if (ret == 0)
-+    {
-+      /* /etc wins over /usr */
-+      ret = g_strcmp0 (a, b);
-+      g_assert (ret != 0);
-+    }
-+
-+  return ret;
-+}
-+
-+const gchar *
-+polkit_backend_common_get_signal_name (gint signal_number)
-+{
-+  switch (signal_number)
-+    {
-+#define _HANDLE_SIG(sig) case sig: return #sig;
-+    _HANDLE_SIG (SIGHUP);
-+    _HANDLE_SIG (SIGINT);
-+    _HANDLE_SIG (SIGQUIT);
-+    _HANDLE_SIG (SIGILL);
-+    _HANDLE_SIG (SIGABRT);
-+    _HANDLE_SIG (SIGFPE);
-+    _HANDLE_SIG (SIGKILL);
-+    _HANDLE_SIG (SIGSEGV);
-+    _HANDLE_SIG (SIGPIPE);
-+    _HANDLE_SIG (SIGALRM);
-+    _HANDLE_SIG (SIGTERM);
-+    _HANDLE_SIG (SIGUSR1);
-+    _HANDLE_SIG (SIGUSR2);
-+    _HANDLE_SIG (SIGCHLD);
-+    _HANDLE_SIG (SIGCONT);
-+    _HANDLE_SIG (SIGSTOP);
-+    _HANDLE_SIG (SIGTSTP);
-+    _HANDLE_SIG (SIGTTIN);
-+    _HANDLE_SIG (SIGTTOU);
-+    _HANDLE_SIG (SIGBUS);
-+#ifdef SIGPOLL
-+    _HANDLE_SIG (SIGPOLL);
-+#endif
-+    _HANDLE_SIG (SIGPROF);
-+    _HANDLE_SIG (SIGSYS);
-+    _HANDLE_SIG (SIGTRAP);
-+    _HANDLE_SIG (SIGURG);
-+    _HANDLE_SIG (SIGVTALRM);
-+    _HANDLE_SIG (SIGXCPU);
-+    _HANDLE_SIG (SIGXFSZ);
-+#undef _HANDLE_SIG
-+    default:
-+      break;
-+    }
-+  return "UNKNOWN_SIGNAL";
-+}
-+
-+void
-+polkit_backend_common_spawn_cb (GObject       *source_object,
-+                                GAsyncResult  *res,
-+                                gpointer       user_data)
-+{
-+  SpawnData *data = (SpawnData *)user_data;
-+  data->res = (GAsyncResult*)g_object_ref (res);
-+  g_main_loop_quit (data->loop);
-+}
-diff --git a/src/polkitbackend/polkitbackendcommon.h b/src/polkitbackend/polkitbackendcommon.h
-new file mode 100644
-index 0000000..6d0d267
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendcommon.h
-@@ -0,0 +1,156 @@
-+/*
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#if !defined (_POLKIT_BACKEND_COMPILATION) && !defined(_POLKIT_BACKEND_INSIDE_POLKIT_BACKEND_H)
-+#error "Only <polkitbackend/polkitbackend.h> can be included directly, this file may disappear or change contents."
-+#endif
-+
-+#ifndef __POLKIT_BACKEND_COMMON_H
-+#define __POLKIT_BACKEND_COMMON_H
-+
-+#include "config.h"
-+#include <sys/wait.h>
-+#include <errno.h>
-+#include <pwd.h>
-+#include <grp.h>
-+#ifdef HAVE_NETGROUP_H
-+#include <netgroup.h>
-+#else
-+#include <netdb.h>
-+#endif
-+#include <string.h>
-+#include <glib/gstdio.h>
-+#include <locale.h>
-+#include <glib/gi18n-lib.h> //here, all things glib via glib.h (including -> gspawn.h)
-+
-+#include <polkit/polkit.h>
-+#include "polkitbackendjsauthority.h"
-+
-+#include <polkit/polkitprivate.h>
-+
-+#ifdef HAVE_LIBSYSTEMD
-+#include <systemd/sd-login.h>
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+enum
-+{
-+  PROP_0,
-+  PROP_RULES_DIRS,
-+};
-+
-+typedef struct
-+{
-+  GSimpleAsyncResult *simple; /* borrowed reference */
-+  GMainContext *main_context; /* may be NULL */
-+
-+  GCancellable *cancellable;  /* may be NULL */
-+  gulong cancellable_handler_id;
-+
-+  GPid child_pid;
-+  gint child_stdout_fd;
-+  gint child_stderr_fd;
-+
-+  GIOChannel *child_stdout_channel;
-+  GIOChannel *child_stderr_channel;
-+
-+  GSource *child_watch_source;
-+  GSource *child_stdout_source;
-+  GSource *child_stderr_source;
-+
-+  guint timeout_seconds;
-+  gboolean timed_out;
-+  GSource *timeout_source;
-+
-+  GString *child_stdout;
-+  GString *child_stderr;
-+
-+  gint exit_status;
-+} UtilsSpawnData;
-+
-+typedef struct
-+{
-+  GMainLoop *loop;
-+  GAsyncResult *res;
-+} SpawnData;
-+
-+void polkit_backend_common_spawn (const gchar *const  *argv,
-+                                  guint                timeout_seconds,
-+                                  GCancellable        *cancellable,
-+                                  GAsyncReadyCallback  callback,
-+                                  gpointer             user_data);
-+void polkit_backend_common_spawn_cb (GObject       *source_object,
-+                                     GAsyncResult  *res,
-+                                     gpointer       user_data);
-+gboolean polkit_backend_common_spawn_finish (GAsyncResult   *res,
-+                                             gint           *out_exit_status,
-+                                             gchar         **out_standard_output,
-+                                             gchar         **out_standard_error,
-+                                             GError        **error);
-+
-+void polkit_backend_common_on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                                   GFile            *file,
-+                                                   GFile            *other_file,
-+                                                   GFileMonitorEvent event_type,
-+                                                   gpointer          user_data);
-+
-+void polkit_backend_common_js_authority_class_init_common (PolkitBackendJsAuthorityClass *klass);
-+
-+gint polkit_backend_common_rules_file_name_cmp (const gchar *a,
-+                                                const gchar *b);
-+
-+const gchar *polkit_backend_common_get_signal_name (gint signal_number);
-+
-+/* To be provided by each JS backend, from here onwards  ---------------------------------------------- */
-+
-+void polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority);
-+void polkit_backend_common_js_authority_finalize (GObject *object);
-+void polkit_backend_common_js_authority_constructed (GObject *object);
-+GList *polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                                     PolkitSubject                     *caller,
-+                                                                     PolkitSubject                     *subject,
-+                                                                     PolkitIdentity                    *user_for_subject,
-+                                                                     gboolean                           subject_is_local,
-+                                                                     gboolean                           subject_is_active,
-+                                                                     const gchar                       *action_id,
-+                                                                     PolkitDetails                     *details);
-+void polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                      guint         property_id,
-+                                                      const GValue *value,
-+                                                      GParamSpec   *pspec);
-+PolkitImplicitAuthorization polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                                                         PolkitSubject                     *caller,
-+                                                                                         PolkitSubject                     *subject,
-+                                                                                         PolkitIdentity                    *user_for_subject,
-+                                                                                         gboolean                           subject_is_local,
-+                                                                                         gboolean                           subject_is_active,
-+                                                                                         const gchar                       *action_id,
-+                                                                                         PolkitDetails                     *details,
-+                                                                                         PolkitImplicitAuthorization        implicit);
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* __POLKIT_BACKEND_COMMON_H */
-+
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 4b4f8fd..a2b4420 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -21,32 +21,12 @@
-  * Author: David Zeuthen <davidz@redhat.com>
-  */
- 
--#include "config.h"
--#include <sys/wait.h>
--#include <errno.h>
--#include <pwd.h>
--#include <grp.h>
--#ifdef HAVE_NETGROUP_H
--#include <netgroup.h>
--#else
--#include <netdb.h>
--#endif
--#include <string.h>
--#include <glib/gstdio.h>
--#include <locale.h>
--#include <glib/gi18n-lib.h>
--
--#include <polkit/polkit.h>
--#include "polkitbackendjsauthority.h"
--
--#include <polkit/polkitprivate.h>
-+#include "polkitbackendcommon.h"
- 
--#ifdef HAVE_LIBSYSTEMD
--#include <systemd/sd-login.h>
--#endif /* HAVE_LIBSYSTEMD */
-+#include "duktape.h"
- 
-+/* Built source and not too big to worry about deduplication */
- #include "initjs.h" /* init.js */
--#include "duktape.h"
- 
- /**
-  * SECTION:polkitbackendjsauthority
-@@ -54,10 +34,9 @@
-  * @short_description: JS Authority
-  * @stability: Unstable
-  *
-- * An implementation of #PolkitBackendAuthority that reads and
-- * evalates Javascript files and supports interaction with
-- * authentication agents (virtue of being based on
-- * #PolkitBackendInteractiveAuthority).
-+ * An (Duktape-based) implementation of #PolkitBackendAuthority that reads and
-+ * evaluates Javascript files and supports interaction with authentication
-+ * agents (virtue of being based on #PolkitBackendInteractiveAuthority).
-  */
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -66,64 +45,16 @@ struct _PolkitBackendJsAuthorityPrivate
- {
-   gchar **rules_dirs;
-   GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
--  duk_context *cx;
--};
--
--
--static void utils_spawn (const gchar *const  *argv,
--                         guint                timeout_seconds,
--                         GCancellable        *cancellable,
--                         GAsyncReadyCallback  callback,
--                         gpointer             user_data);
--
--gboolean utils_spawn_finish (GAsyncResult   *res,
--                             gint           *out_exit_status,
--                             gchar         **out_standard_output,
--                             gchar         **out_standard_error,
--                             GError        **error);
- 
--static void on_dir_monitor_changed (GFileMonitor     *monitor,
--                                    GFile            *file,
--                                    GFile            *other_file,
--                                    GFileMonitorEvent event_type,
--                                    gpointer          user_data);
--
--/* ---------------------------------------------------------------------------------------------------- */
--
--enum
--{
--  PROP_0,
--  PROP_RULES_DIRS,
-+  duk_context *cx;
- };
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
--                                                                     PolkitSubject                     *caller,
--                                                                     PolkitSubject                     *subject,
--                                                                     PolkitIdentity                    *user_for_subject,
--                                                                     gboolean                           subject_is_local,
--                                                                     gboolean                           subject_is_active,
--                                                                     const gchar                       *action_id,
--                                                                     PolkitDetails                     *details);
--
--static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
--                                                          PolkitBackendInteractiveAuthority *authority,
--                                                          PolkitSubject                     *caller,
--                                                          PolkitSubject                     *subject,
--                                                          PolkitIdentity                    *user_for_subject,
--                                                          gboolean                           subject_is_local,
--                                                          gboolean                           subject_is_active,
--                                                          const gchar                       *action_id,
--                                                          PolkitDetails                     *details,
--                                                          PolkitImplicitAuthorization        implicit);
--
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--/* ---------------------------------------------------------------------------------------------------- */
--
- static duk_ret_t js_polkit_log (duk_context *cx);
- static duk_ret_t js_polkit_spawn (duk_context *cx);
- static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-@@ -144,33 +75,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-                                                  PolkitBackendJsAuthorityPrivate);
- }
- 
--static gint
--rules_file_name_cmp (const gchar *a,
--                     const gchar *b)
--{
--  gint ret;
--  const gchar *a_base;
--  const gchar *b_base;
--
--  a_base = strrchr (a, '/');
--  b_base = strrchr (b, '/');
--
--  g_assert (a_base != NULL);
--  g_assert (b_base != NULL);
--  a_base += 1;
--  b_base += 1;
--
--  ret = g_strcmp0 (a_base, b_base);
--  if (ret == 0)
--    {
--      /* /etc wins over /usr */
--      ret = g_strcmp0 (a, b);
--      g_assert (ret != 0);
--    }
--
--  return ret;
--}
--
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
- {
-@@ -214,7 +118,7 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-         }
-     }
- 
--  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+  files = g_list_sort (files, (GCompareFunc) polkit_backend_common_rules_file_name_cmp);
- 
-   for (l = files; l != NULL; l = l->next)
-     {
-@@ -258,8 +162,8 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   g_list_free_full (files, g_free);
- }
- 
--static void
--reload_scripts (PolkitBackendJsAuthority *authority)
-+void
-+polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority)
- {
-   duk_context *cx = authority->priv->cx;
- 
-@@ -282,42 +186,6 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   g_signal_emit_by_name (authority, "changed");
- }
- 
--static void
--on_dir_monitor_changed (GFileMonitor     *monitor,
--                        GFile            *file,
--                        GFile            *other_file,
--                        GFileMonitorEvent event_type,
--                        gpointer          user_data)
--{
--  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
--
--  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
--   *       Because when editing a file with emacs we get 4-8 events..
--   */
--
--  if (file != NULL)
--    {
--      gchar *name;
--
--      name = g_file_get_basename (file);
--
--      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
--      if (!g_str_has_prefix (name, ".") &&
--          !g_str_has_prefix (name, "#") &&
--          g_str_has_suffix (name, ".rules") &&
--          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
--           event_type == G_FILE_MONITOR_EVENT_DELETED ||
--           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Reloading rules");
--          reload_scripts (authority);
--        }
--      g_free (name);
--    }
--}
--
--
- static void
- setup_file_monitors (PolkitBackendJsAuthority *authority)
- {
-@@ -349,7 +217,7 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-         {
-           g_signal_connect (monitor,
-                             "changed",
--                            G_CALLBACK (on_dir_monitor_changed),
-+                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                             authority);
-           g_ptr_array_add (p, monitor);
-         }
-@@ -358,8 +226,8 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static void
--polkit_backend_js_authority_constructed (GObject *object)
-+void
-+polkit_backend_common_js_authority_constructed (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   duk_context *cx;
-@@ -395,8 +263,8 @@ polkit_backend_js_authority_constructed (GObject *object)
-   g_assert_not_reached ();
- }
- 
--static void
--polkit_backend_js_authority_finalize (GObject *object)
-+void
-+polkit_backend_common_js_authority_finalize (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   guint n;
-@@ -405,7 +273,7 @@ polkit_backend_js_authority_finalize (GObject *object)
-     {
-       GFileMonitor *monitor = authority->priv->dir_monitors[n];
-       g_signal_handlers_disconnect_by_func (monitor,
--                                            G_CALLBACK (on_dir_monitor_changed),
-+                                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                                             authority);
-       g_object_unref (monitor);
-     }
-@@ -417,11 +285,11 @@ polkit_backend_js_authority_finalize (GObject *object)
-   G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
- }
- 
--static void
--polkit_backend_js_authority_set_property (GObject      *object,
--                                          guint         property_id,
--                                          const GValue *value,
--                                          GParamSpec   *pspec)
-+void
-+polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                 guint         property_id,
-+                                                 const GValue *value,
-+                                                 GParamSpec   *pspec)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -438,55 +306,10 @@ polkit_backend_js_authority_set_property (GObject      *object,
-     }
- }
- 
--static const gchar *
--polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
--{
--  return "js";
--}
--
--static const gchar *
--polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
--{
--  return PACKAGE_VERSION;
--}
--
--static PolkitAuthorityFeatures
--polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
--{
--  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
--}
--
- static void
- polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
- {
--  GObjectClass *gobject_class;
--  PolkitBackendAuthorityClass *authority_class;
--  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
--
--
--  gobject_class = G_OBJECT_CLASS (klass);
--  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
--  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
--  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
--
--  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
--  authority_class->get_name                             = polkit_backend_js_authority_get_name;
--  authority_class->get_version                          = polkit_backend_js_authority_get_version;
--  authority_class->get_features                         = polkit_backend_js_authority_get_features;
--
--  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
--  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
--  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
--
--  g_object_class_install_property (gobject_class,
--                                   PROP_RULES_DIRS,
--                                   g_param_spec_boxed ("rules-dirs",
--                                                       NULL,
--                                                       NULL,
--                                                       G_TYPE_STRV,
--                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
--
--
-+  polkit_backend_common_js_authority_class_init_common (klass);
-   g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
- }
- 
-@@ -689,15 +512,15 @@ push_action_and_details (duk_context               *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *
--polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
--                                                       PolkitSubject                     *caller,
--                                                       PolkitSubject                     *subject,
--                                                       PolkitIdentity                    *user_for_subject,
--                                                       gboolean                           subject_is_local,
--                                                       gboolean                           subject_is_active,
--                                                       const gchar                       *action_id,
--                                                       PolkitDetails                     *details)
-+GList *
-+polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                              PolkitSubject                     *caller,
-+                                                              PolkitSubject                     *subject,
-+                                                              PolkitIdentity                    *user_for_subject,
-+                                                              gboolean                           subject_is_local,
-+                                                              gboolean                           subject_is_active,
-+                                                              const gchar                       *action_id,
-+                                                              PolkitDetails                     *details)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   GList *ret = NULL;
-@@ -777,16 +600,16 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static PolkitImplicitAuthorization
--polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
--                                                      PolkitSubject                     *caller,
--                                                      PolkitSubject                     *subject,
--                                                      PolkitIdentity                    *user_for_subject,
--                                                      gboolean                           subject_is_local,
--                                                      gboolean                           subject_is_active,
--                                                      const gchar                       *action_id,
--                                                      PolkitDetails                     *details,
--                                                      PolkitImplicitAuthorization        implicit)
-+PolkitImplicitAuthorization
-+polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                             PolkitSubject                     *caller,
-+                                                             PolkitSubject                     *subject,
-+                                                             PolkitIdentity                    *user_for_subject,
-+                                                             gboolean                           subject_is_local,
-+                                                             gboolean                           subject_is_active,
-+                                                             const gchar                       *action_id,
-+                                                             PolkitDetails                     *details,
-+                                                             PolkitImplicitAuthorization        implicit)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   PolkitImplicitAuthorization ret = implicit;
-@@ -864,65 +687,6 @@ js_polkit_log (duk_context *cx)
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static const gchar *
--get_signal_name (gint signal_number)
--{
--  switch (signal_number)
--    {
--#define _HANDLE_SIG(sig) case sig: return #sig;
--    _HANDLE_SIG (SIGHUP);
--    _HANDLE_SIG (SIGINT);
--    _HANDLE_SIG (SIGQUIT);
--    _HANDLE_SIG (SIGILL);
--    _HANDLE_SIG (SIGABRT);
--    _HANDLE_SIG (SIGFPE);
--    _HANDLE_SIG (SIGKILL);
--    _HANDLE_SIG (SIGSEGV);
--    _HANDLE_SIG (SIGPIPE);
--    _HANDLE_SIG (SIGALRM);
--    _HANDLE_SIG (SIGTERM);
--    _HANDLE_SIG (SIGUSR1);
--    _HANDLE_SIG (SIGUSR2);
--    _HANDLE_SIG (SIGCHLD);
--    _HANDLE_SIG (SIGCONT);
--    _HANDLE_SIG (SIGSTOP);
--    _HANDLE_SIG (SIGTSTP);
--    _HANDLE_SIG (SIGTTIN);
--    _HANDLE_SIG (SIGTTOU);
--    _HANDLE_SIG (SIGBUS);
--#ifdef SIGPOLL
--    _HANDLE_SIG (SIGPOLL);
--#endif
--    _HANDLE_SIG (SIGPROF);
--    _HANDLE_SIG (SIGSYS);
--    _HANDLE_SIG (SIGTRAP);
--    _HANDLE_SIG (SIGURG);
--    _HANDLE_SIG (SIGVTALRM);
--    _HANDLE_SIG (SIGXCPU);
--    _HANDLE_SIG (SIGXFSZ);
--#undef _HANDLE_SIG
--    default:
--      break;
--    }
--  return "UNKNOWN_SIGNAL";
--}
--
--typedef struct
--{
--  GMainLoop *loop;
--  GAsyncResult *res;
--} SpawnData;
--
--static void
--spawn_cb (GObject       *source_object,
--          GAsyncResult  *res,
--          gpointer       user_data)
--{
--  SpawnData *data = (SpawnData *)user_data;
--  data->res = (GAsyncResult*)g_object_ref (res);
--  g_main_loop_quit (data->loop);
--}
--
- static duk_ret_t
- js_polkit_spawn (duk_context *cx)
- {
-@@ -962,21 +726,21 @@ js_polkit_spawn (duk_context *cx)
-   g_main_context_push_thread_default (context);
- 
-   data.loop = loop;
--  utils_spawn ((const gchar *const *) argv,
--               10, /* timeout_seconds */
--               NULL, /* cancellable */
--               spawn_cb,
--               &data);
-+  polkit_backend_common_spawn ((const gchar *const *) argv,
-+                               10, /* timeout_seconds */
-+                               NULL, /* cancellable */
-+                               polkit_backend_common_spawn_cb,
-+                               &data);
- 
-   g_main_loop_run (loop);
- 
-   g_main_context_pop_thread_default (context);
- 
--  if (!utils_spawn_finish (data.res,
--                           &exit_status,
--                           &standard_output,
--                           &standard_error,
--                           &error))
-+  if (!polkit_backend_common_spawn_finish (data.res,
-+                                           &exit_status,
-+                                           &standard_output,
-+                                           &standard_error,
-+                                           &error))
-     {
-       err_str = g_strdup_printf ("Error spawning helper: %s (%s, %d)",
-                                  error->message, g_quark_to_string (error->domain), error->code);
-@@ -998,7 +762,7 @@ js_polkit_spawn (duk_context *cx)
-         {
-           g_string_append_printf (gstr,
-                                   "Helper was signaled with signal %s (%d)",
--                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  polkit_backend_common_get_signal_name (WTERMSIG (exit_status)),
-                                   WTERMSIG (exit_status));
-         }
-       g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-@@ -1052,377 +816,3 @@ js_polkit_user_is_in_netgroup (duk_context *cx)
- }
- 
- /* ---------------------------------------------------------------------------------------------------- */
--
--typedef struct
--{
--  GSimpleAsyncResult *simple; /* borrowed reference */
--  GMainContext *main_context; /* may be NULL */
--
--  GCancellable *cancellable;  /* may be NULL */
--  gulong cancellable_handler_id;
--
--  GPid child_pid;
--  gint child_stdout_fd;
--  gint child_stderr_fd;
--
--  GIOChannel *child_stdout_channel;
--  GIOChannel *child_stderr_channel;
--
--  GSource *child_watch_source;
--  GSource *child_stdout_source;
--  GSource *child_stderr_source;
--
--  guint timeout_seconds;
--  gboolean timed_out;
--  GSource *timeout_source;
--
--  GString *child_stdout;
--  GString *child_stderr;
--
--  gint exit_status;
--} UtilsSpawnData;
--
--static void
--utils_child_watch_from_release_cb (GPid     pid,
--                                   gint     status,
--                                   gpointer user_data)
--{
--}
--
--static void
--utils_spawn_data_free (UtilsSpawnData *data)
--{
--  if (data->timeout_source != NULL)
--    {
--      g_source_destroy (data->timeout_source);
--      data->timeout_source = NULL;
--    }
--
--  /* Nuke the child, if necessary */
--  if (data->child_watch_source != NULL)
--    {
--      g_source_destroy (data->child_watch_source);
--      data->child_watch_source = NULL;
--    }
--
--  if (data->child_pid != 0)
--    {
--      GSource *source;
--      kill (data->child_pid, SIGTERM);
--      /* OK, we need to reap for the child ourselves - we don't want
--       * to use waitpid() because that might block the calling
--       * thread (the child might handle SIGTERM and use several
--       * seconds for cleanup/rollback).
--       *
--       * So we use GChildWatch instead.
--       *
--       * Avoid taking a references to ourselves. but note that we need
--       * to pass the GSource so we can nuke it once handled.
--       */
--      source = g_child_watch_source_new (data->child_pid);
--      g_source_set_callback (source,
--                             (GSourceFunc) utils_child_watch_from_release_cb,
--                             source,
--                             (GDestroyNotify) g_source_destroy);
--      g_source_attach (source, data->main_context);
--      g_source_unref (source);
--      data->child_pid = 0;
--    }
--
--  if (data->child_stdout != NULL)
--    {
--      g_string_free (data->child_stdout, TRUE);
--      data->child_stdout = NULL;
--    }
--
--  if (data->child_stderr != NULL)
--    {
--      g_string_free (data->child_stderr, TRUE);
--      data->child_stderr = NULL;
--    }
--
--  if (data->child_stdout_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stdout_channel);
--      data->child_stdout_channel = NULL;
--    }
--  if (data->child_stderr_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stderr_channel);
--      data->child_stderr_channel = NULL;
--    }
--
--  if (data->child_stdout_source != NULL)
--    {
--      g_source_destroy (data->child_stdout_source);
--      data->child_stdout_source = NULL;
--    }
--  if (data->child_stderr_source != NULL)
--    {
--      g_source_destroy (data->child_stderr_source);
--      data->child_stderr_source = NULL;
--    }
--
--  if (data->child_stdout_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stdout_fd) == 0);
--      data->child_stdout_fd = -1;
--    }
--  if (data->child_stderr_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stderr_fd) == 0);
--      data->child_stderr_fd = -1;
--    }
--
--  if (data->cancellable_handler_id > 0)
--    {
--      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
--      data->cancellable_handler_id = 0;
--    }
--
--  if (data->main_context != NULL)
--    g_main_context_unref (data->main_context);
--
--  if (data->cancellable != NULL)
--    g_object_unref (data->cancellable);
--
--  g_slice_free (UtilsSpawnData, data);
--}
--
--/* called in the thread where @cancellable was cancelled */
--static void
--utils_on_cancelled (GCancellable *cancellable,
--                    gpointer      user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  GError *error;
--
--  error = NULL;
--  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
--  g_simple_async_result_take_error (data->simple, error);
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_read_child_stderr (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stderr, buf, bytes_read);
--  return TRUE;
--}
--
--static gboolean
--utils_read_child_stdout (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stdout, buf, bytes_read);
--  return TRUE;
--}
--
--static void
--utils_child_watch_cb (GPid     pid,
--                      gint     status,
--                      gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar *buf;
--  gsize buf_size;
--
--  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stdout, buf, buf_size);
--      g_free (buf);
--    }
--  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stderr, buf, buf_size);
--      g_free (buf);
--    }
--
--  data->exit_status = status;
--
--  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
--  data->child_pid = 0;
--  data->child_watch_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_timeout_cb (gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--
--  data->timed_out = TRUE;
--
--  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
--  data->timeout_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--
--  return FALSE; /* remove source */
--}
--
--static void
--utils_spawn (const gchar *const  *argv,
--             guint                timeout_seconds,
--             GCancellable        *cancellable,
--             GAsyncReadyCallback  callback,
--             gpointer             user_data)
--{
--  UtilsSpawnData *data;
--  GError *error;
--
--  data = g_slice_new0 (UtilsSpawnData);
--  data->timeout_seconds = timeout_seconds;
--  data->simple = g_simple_async_result_new (NULL,
--                                            callback,
--                                            user_data,
--                                            (gpointer*)utils_spawn);
--  data->main_context = g_main_context_get_thread_default ();
--  if (data->main_context != NULL)
--    g_main_context_ref (data->main_context);
--
--  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
--
--  data->child_stdout = g_string_new (NULL);
--  data->child_stderr = g_string_new (NULL);
--  data->child_stdout_fd = -1;
--  data->child_stderr_fd = -1;
--
--  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
--  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
--
--  error = NULL;
--  if (data->cancellable != NULL)
--    {
--      /* could already be cancelled */
--      error = NULL;
--      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
--        {
--          g_simple_async_result_take_error (data->simple, error);
--          g_simple_async_result_complete_in_idle (data->simple);
--          g_object_unref (data->simple);
--          goto out;
--        }
--
--      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
--                                                            G_CALLBACK (utils_on_cancelled),
--                                                            data,
--                                                            NULL);
--    }
--
--  error = NULL;
--  if (!g_spawn_async_with_pipes (NULL, /* working directory */
--                                 (gchar **) argv,
--                                 NULL, /* envp */
--                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
--                                 NULL, /* child_setup */
--                                 NULL, /* child_setup's user_data */
--                                 &(data->child_pid),
--                                 NULL, /* gint *stdin_fd */
--                                 &(data->child_stdout_fd),
--                                 &(data->child_stderr_fd),
--                                 &error))
--    {
--      g_prefix_error (&error, "Error spawning: ");
--      g_simple_async_result_take_error (data->simple, error);
--      g_simple_async_result_complete_in_idle (data->simple);
--      g_object_unref (data->simple);
--      goto out;
--    }
--
--  if (timeout_seconds > 0)
--    {
--      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
--      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
--      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
--      g_source_attach (data->timeout_source, data->main_context);
--      g_source_unref (data->timeout_source);
--    }
--
--  data->child_watch_source = g_child_watch_source_new (data->child_pid);
--  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
--  g_source_attach (data->child_watch_source, data->main_context);
--  g_source_unref (data->child_watch_source);
--
--  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
--  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
--  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
--  g_source_attach (data->child_stdout_source, data->main_context);
--  g_source_unref (data->child_stdout_source);
--
--  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
--  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
--  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
--  g_source_attach (data->child_stderr_source, data->main_context);
--  g_source_unref (data->child_stderr_source);
--
-- out:
--  ;
--}
--
--gboolean
--utils_spawn_finish (GAsyncResult   *res,
--                    gint           *out_exit_status,
--                    gchar         **out_standard_output,
--                    gchar         **out_standard_error,
--                    GError        **error)
--{
--  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
--  UtilsSpawnData *data;
--  gboolean ret = FALSE;
--
--  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
--  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
--
--  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
--
--  if (g_simple_async_result_propagate_error (simple, error))
--    goto out;
--
--  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
--
--  if (data->timed_out)
--    {
--      g_set_error (error,
--                   G_IO_ERROR,
--                   G_IO_ERROR_TIMED_OUT,
--                   "Timed out after %d seconds",
--                   data->timeout_seconds);
--      goto out;
--    }
--
--  if (out_exit_status != NULL)
--    *out_exit_status = data->exit_status;
--
--  if (out_standard_output != NULL)
--    *out_standard_output = g_strdup (data->child_stdout->str);
--
--  if (out_standard_error != NULL)
--    *out_standard_error = g_strdup (data->child_stderr->str);
--
--  ret = TRUE;
--
-- out:
--  return ret;
--}
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index ca17108..e28091d 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -19,29 +19,7 @@
-  * Author: David Zeuthen <davidz@redhat.com>
-  */
- 
--#include "config.h"
--#include <sys/wait.h>
--#include <errno.h>
--#include <pwd.h>
--#include <grp.h>
--#ifdef HAVE_NETGROUP_H
--#include <netgroup.h>
--#else
--#include <netdb.h>
--#endif
--#include <string.h>
--#include <glib/gstdio.h>
--#include <locale.h>
--#include <glib/gi18n-lib.h>
--
--#include <polkit/polkit.h>
--#include "polkitbackendjsauthority.h"
--
--#include <polkit/polkitprivate.h>
--
--#ifdef HAVE_LIBSYSTEMD
--#include <systemd/sd-login.h>
--#endif /* HAVE_LIBSYSTEMD */
-+#include "polkitbackendcommon.h"
- 
- #include <js/CompilationAndEvaluation.h>
- #include <js/ContextOptions.h>
-@@ -52,6 +30,7 @@
- #include <js/Array.h>
- #include <jsapi.h>
- 
-+/* Built source and not too big to worry about deduplication */
- #include "initjs.h" /* init.js */
- 
- #ifdef JSGC_USE_EXACT_ROOTING
-@@ -67,10 +46,9 @@
-  * @short_description: JS Authority
-  * @stability: Unstable
-  *
-- * An implementation of #PolkitBackendAuthority that reads and
-- * evalates Javascript files and supports interaction with
-- * authentication agents (virtue of being based on
-- * #PolkitBackendInteractiveAuthority).
-+ * An (SpiderMonkey-based) implementation of #PolkitBackendAuthority that reads
-+ * and evaluates Javascript files and supports interaction with authentication
-+ * agents (virtue of being based on #PolkitBackendInteractiveAuthority).
-  */
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -100,57 +78,11 @@ static bool execute_script_with_runaway_killer (PolkitBackendJsAuthority *author
-                                     JS::HandleScript                 script,
-                                     JS::MutableHandleValue           rval);
- 
--static void utils_spawn (const gchar *const  *argv,
--                         guint                timeout_seconds,
--                         GCancellable        *cancellable,
--                         GAsyncReadyCallback  callback,
--                         gpointer             user_data);
--
--gboolean utils_spawn_finish (GAsyncResult   *res,
--                             gint           *out_exit_status,
--                             gchar         **out_standard_output,
--                             gchar         **out_standard_error,
--                             GError        **error);
--
--static void on_dir_monitor_changed (GFileMonitor     *monitor,
--                                    GFile            *file,
--                                    GFile            *other_file,
--                                    GFileMonitorEvent event_type,
--                                    gpointer          user_data);
--
--/* ---------------------------------------------------------------------------------------------------- */
--
--enum
--{
--  PROP_0,
--  PROP_RULES_DIRS,
--};
--
- /* ---------------------------------------------------------------------------------------------------- */
- 
- static gpointer runaway_killer_thread_func (gpointer user_data);
- static void runaway_killer_terminate (PolkitBackendJsAuthority *authority);
- 
--static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
--                                                                     PolkitSubject                     *caller,
--                                                                     PolkitSubject                     *subject,
--                                                                     PolkitIdentity                    *user_for_subject,
--                                                                     gboolean                           subject_is_local,
--                                                                     gboolean                           subject_is_active,
--                                                                     const gchar                       *action_id,
--                                                                     PolkitDetails                     *details);
--
--static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
--                                                          PolkitBackendInteractiveAuthority *authority,
--                                                          PolkitSubject                     *caller,
--                                                          PolkitSubject                     *subject,
--                                                          PolkitIdentity                    *user_for_subject,
--                                                          gboolean                           subject_is_local,
--                                                          gboolean                           subject_is_active,
--                                                          const gchar                       *action_id,
--                                                          PolkitDetails                     *details,
--                                                          PolkitImplicitAuthorization        implicit);
--
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -229,33 +161,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-                                                  PolkitBackendJsAuthorityPrivate);
- }
- 
--static gint
--rules_file_name_cmp (const gchar *a,
--                     const gchar *b)
--{
--  gint ret;
--  const gchar *a_base;
--  const gchar *b_base;
--
--  a_base = strrchr (a, '/');
--  b_base = strrchr (b, '/');
--
--  g_assert (a_base != NULL);
--  g_assert (b_base != NULL);
--  a_base += 1;
--  b_base += 1;
--
--  ret = g_strcmp0 (a_base, b_base);
--  if (ret == 0)
--    {
--      /* /etc wins over /usr */
--      ret = g_strcmp0 (a, b);
--      g_assert (ret != 0);
--    }
--
--  return ret;
--}
--
- /* authority->priv->cx must be within a request */
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
-@@ -299,7 +204,7 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-         }
-     }
- 
--  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+  files = g_list_sort (files, (GCompareFunc) polkit_backend_common_rules_file_name_cmp);
- 
-   for (l = files; l != NULL; l = l->next)
-     {
-@@ -365,8 +270,8 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   g_list_free_full (files, g_free);
- }
- 
--static void
--reload_scripts (PolkitBackendJsAuthority *authority)
-+void
-+polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority)
- {
-   JS::RootedValueArray<1> args(authority->priv->cx);
-   JS::RootedValue rval(authority->priv->cx);
-@@ -395,42 +300,6 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   g_signal_emit_by_name (authority, "changed");
- }
- 
--static void
--on_dir_monitor_changed (GFileMonitor     *monitor,
--                        GFile            *file,
--                        GFile            *other_file,
--                        GFileMonitorEvent event_type,
--                        gpointer          user_data)
--{
--  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
--
--  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
--   *       Because when editing a file with emacs we get 4-8 events..
--   */
--
--  if (file != NULL)
--    {
--      gchar *name;
--
--      name = g_file_get_basename (file);
--
--      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
--      if (!g_str_has_prefix (name, ".") &&
--          !g_str_has_prefix (name, "#") &&
--          g_str_has_suffix (name, ".rules") &&
--          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
--           event_type == G_FILE_MONITOR_EVENT_DELETED ||
--           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Reloading rules");
--          reload_scripts (authority);
--        }
--      g_free (name);
--    }
--}
--
--
- static void
- setup_file_monitors (PolkitBackendJsAuthority *authority)
- {
-@@ -462,7 +331,7 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-         {
-           g_signal_connect (monitor,
-                             "changed",
--                            G_CALLBACK (on_dir_monitor_changed),
-+                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                             authority);
-           g_ptr_array_add (p, monitor);
-         }
-@@ -471,8 +340,8 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static void
--polkit_backend_js_authority_constructed (GObject *object)
-+void
-+polkit_backend_common_js_authority_constructed (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -561,8 +430,8 @@ polkit_backend_js_authority_constructed (GObject *object)
-   g_assert_not_reached ();
- }
- 
--static void
--polkit_backend_js_authority_finalize (GObject *object)
-+void
-+polkit_backend_common_js_authority_finalize (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   guint n;
-@@ -577,7 +446,7 @@ polkit_backend_js_authority_finalize (GObject *object)
-     {
-       GFileMonitor *monitor = authority->priv->dir_monitors[n];
-       g_signal_handlers_disconnect_by_func (monitor,
--                                            (gpointer*)G_CALLBACK (on_dir_monitor_changed),
-+                                            (gpointer*)G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                                             authority);
-       g_object_unref (monitor);
-     }
-@@ -594,11 +463,11 @@ polkit_backend_js_authority_finalize (GObject *object)
-   G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
- }
- 
--static void
--polkit_backend_js_authority_set_property (GObject      *object,
--                                          guint         property_id,
--                                          const GValue *value,
--                                          GParamSpec   *pspec)
-+void
-+polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                 guint         property_id,
-+                                                 const GValue *value,
-+                                                 GParamSpec   *pspec)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -615,57 +484,12 @@ polkit_backend_js_authority_set_property (GObject      *object,
-     }
- }
- 
--static const gchar *
--polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
--{
--  return "js";
--}
--
--static const gchar *
--polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
--{
--  return PACKAGE_VERSION;
--}
--
--static PolkitAuthorityFeatures
--polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
--{
--  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
--}
--
- static void
- polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
- {
--  GObjectClass *gobject_class;
--  PolkitBackendAuthorityClass *authority_class;
--  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
--
--
--  gobject_class = G_OBJECT_CLASS (klass);
--  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
--  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
--  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
--
--  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
--  authority_class->get_name                             = polkit_backend_js_authority_get_name;
--  authority_class->get_version                          = polkit_backend_js_authority_get_version;
--  authority_class->get_features                         = polkit_backend_js_authority_get_features;
--
--  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
--  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
--  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
--
--  g_object_class_install_property (gobject_class,
--                                   PROP_RULES_DIRS,
--                                   g_param_spec_boxed ("rules-dirs",
--                                                       NULL,
--                                                       NULL,
--                                                       G_TYPE_STRV,
--                                                       GParamFlags(G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE)));
--
-+  polkit_backend_common_js_authority_class_init_common (klass);
- 
-   g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
--
-   JS_Init ();
- }
- 
-@@ -1099,15 +923,15 @@ call_js_function_with_runaway_killer (PolkitBackendJsAuthority *authority,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *
--polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
--                                                       PolkitSubject                     *caller,
--                                                       PolkitSubject                     *subject,
--                                                       PolkitIdentity                    *user_for_subject,
--                                                       gboolean                           subject_is_local,
--                                                       gboolean                           subject_is_active,
--                                                       const gchar                       *action_id,
--                                                       PolkitDetails                     *details)
-+GList *
-+polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                              PolkitSubject                     *caller,
-+                                                              PolkitSubject                     *subject,
-+                                                              PolkitIdentity                    *user_for_subject,
-+                                                              gboolean                           subject_is_local,
-+                                                              gboolean                           subject_is_active,
-+                                                              const gchar                       *action_id,
-+                                                              PolkitDetails                     *details)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   GList *ret = NULL;
-@@ -1202,16 +1026,16 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static PolkitImplicitAuthorization
--polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
--                                                      PolkitSubject                     *caller,
--                                                      PolkitSubject                     *subject,
--                                                      PolkitIdentity                    *user_for_subject,
--                                                      gboolean                           subject_is_local,
--                                                      gboolean                           subject_is_active,
--                                                      const gchar                       *action_id,
--                                                      PolkitDetails                     *details,
--                                                      PolkitImplicitAuthorization        implicit)
-+PolkitImplicitAuthorization
-+polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                             PolkitSubject                     *caller,
-+                                                             PolkitSubject                     *subject,
-+                                                             PolkitIdentity                    *user_for_subject,
-+                                                             gboolean                           subject_is_local,
-+                                                             gboolean                           subject_is_active,
-+                                                             const gchar                       *action_id,
-+                                                             PolkitDetails                     *details,
-+                                                             PolkitImplicitAuthorization        implicit)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   PolkitImplicitAuthorization ret = implicit;
-@@ -1324,65 +1148,6 @@ js_polkit_log (JSContext  *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static const gchar *
--get_signal_name (gint signal_number)
--{
--  switch (signal_number)
--    {
--#define _HANDLE_SIG(sig) case sig: return #sig;
--    _HANDLE_SIG (SIGHUP);
--    _HANDLE_SIG (SIGINT);
--    _HANDLE_SIG (SIGQUIT);
--    _HANDLE_SIG (SIGILL);
--    _HANDLE_SIG (SIGABRT);
--    _HANDLE_SIG (SIGFPE);
--    _HANDLE_SIG (SIGKILL);
--    _HANDLE_SIG (SIGSEGV);
--    _HANDLE_SIG (SIGPIPE);
--    _HANDLE_SIG (SIGALRM);
--    _HANDLE_SIG (SIGTERM);
--    _HANDLE_SIG (SIGUSR1);
--    _HANDLE_SIG (SIGUSR2);
--    _HANDLE_SIG (SIGCHLD);
--    _HANDLE_SIG (SIGCONT);
--    _HANDLE_SIG (SIGSTOP);
--    _HANDLE_SIG (SIGTSTP);
--    _HANDLE_SIG (SIGTTIN);
--    _HANDLE_SIG (SIGTTOU);
--    _HANDLE_SIG (SIGBUS);
--#ifdef SIGPOLL
--    _HANDLE_SIG (SIGPOLL);
--#endif
--    _HANDLE_SIG (SIGPROF);
--    _HANDLE_SIG (SIGSYS);
--    _HANDLE_SIG (SIGTRAP);
--    _HANDLE_SIG (SIGURG);
--    _HANDLE_SIG (SIGVTALRM);
--    _HANDLE_SIG (SIGXCPU);
--    _HANDLE_SIG (SIGXFSZ);
--#undef _HANDLE_SIG
--    default:
--      break;
--    }
--  return "UNKNOWN_SIGNAL";
--}
--
--typedef struct
--{
--  GMainLoop *loop;
--  GAsyncResult *res;
--} SpawnData;
--
--static void
--spawn_cb (GObject       *source_object,
--          GAsyncResult  *res,
--          gpointer       user_data)
--{
--  SpawnData *data = (SpawnData *)user_data;
--  data->res = (GAsyncResult*)g_object_ref (res);
--  g_main_loop_quit (data->loop);
--}
--
- static bool
- js_polkit_spawn (JSContext  *cx,
-                  unsigned    js_argc,
-@@ -1440,21 +1205,21 @@ js_polkit_spawn (JSContext  *cx,
-   g_main_context_push_thread_default (context);
- 
-   data.loop = loop;
--  utils_spawn ((const gchar *const *) argv,
--               10, /* timeout_seconds */
--               NULL, /* cancellable */
--               spawn_cb,
--               &data);
-+  polkit_backend_common_spawn ((const gchar *const *) argv,
-+                               10, /* timeout_seconds */
-+                               NULL, /* cancellable */
-+                               polkit_backend_common_spawn_cb,
-+                               &data);
- 
-   g_main_loop_run (loop);
- 
-   g_main_context_pop_thread_default (context);
- 
--  if (!utils_spawn_finish (data.res,
--                           &exit_status,
--                           &standard_output,
--                           &standard_error,
--                           &error))
-+  if (!polkit_backend_common_spawn_finish (data.res,
-+                                           &exit_status,
-+                                           &standard_output,
-+                                           &standard_error,
-+                                           &error))
-     {
-       JS_ReportErrorUTF8 (cx,
-                       "Error spawning helper: %s (%s, %d)",
-@@ -1477,7 +1242,7 @@ js_polkit_spawn (JSContext  *cx,
-         {
-           g_string_append_printf (gstr,
-                                   "Helper was signaled with signal %s (%d)",
--                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  polkit_backend_common_get_signal_name (WTERMSIG (exit_status)),
-                                   WTERMSIG (exit_status));
-         }
-       g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-@@ -1542,381 +1307,5 @@ js_polkit_user_is_in_netgroup (JSContext  *cx,
-   return ret;
- }
- 
--
--
- /* ---------------------------------------------------------------------------------------------------- */
- 
--typedef struct
--{
--  GSimpleAsyncResult *simple; /* borrowed reference */
--  GMainContext *main_context; /* may be NULL */
--
--  GCancellable *cancellable;  /* may be NULL */
--  gulong cancellable_handler_id;
--
--  GPid child_pid;
--  gint child_stdout_fd;
--  gint child_stderr_fd;
--
--  GIOChannel *child_stdout_channel;
--  GIOChannel *child_stderr_channel;
--
--  GSource *child_watch_source;
--  GSource *child_stdout_source;
--  GSource *child_stderr_source;
--
--  guint timeout_seconds;
--  gboolean timed_out;
--  GSource *timeout_source;
--
--  GString *child_stdout;
--  GString *child_stderr;
--
--  gint exit_status;
--} UtilsSpawnData;
--
--static void
--utils_child_watch_from_release_cb (GPid     pid,
--                                   gint     status,
--                                   gpointer user_data)
--{
--}
--
--static void
--utils_spawn_data_free (UtilsSpawnData *data)
--{
--  if (data->timeout_source != NULL)
--    {
--      g_source_destroy (data->timeout_source);
--      data->timeout_source = NULL;
--    }
--
--  /* Nuke the child, if necessary */
--  if (data->child_watch_source != NULL)
--    {
--      g_source_destroy (data->child_watch_source);
--      data->child_watch_source = NULL;
--    }
--
--  if (data->child_pid != 0)
--    {
--      GSource *source;
--      kill (data->child_pid, SIGTERM);
--      /* OK, we need to reap for the child ourselves - we don't want
--       * to use waitpid() because that might block the calling
--       * thread (the child might handle SIGTERM and use several
--       * seconds for cleanup/rollback).
--       *
--       * So we use GChildWatch instead.
--       *
--       * Avoid taking a references to ourselves. but note that we need
--       * to pass the GSource so we can nuke it once handled.
--       */
--      source = g_child_watch_source_new (data->child_pid);
--      g_source_set_callback (source,
--                             (GSourceFunc) utils_child_watch_from_release_cb,
--                             source,
--                             (GDestroyNotify) g_source_destroy);
--      /* attach source to the global default main context */
--      g_source_attach (source, NULL);
--      g_source_unref (source);
--      data->child_pid = 0;
--    }
--
--  if (data->child_stdout != NULL)
--    {
--      g_string_free (data->child_stdout, TRUE);
--      data->child_stdout = NULL;
--    }
--
--  if (data->child_stderr != NULL)
--    {
--      g_string_free (data->child_stderr, TRUE);
--      data->child_stderr = NULL;
--    }
--
--  if (data->child_stdout_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stdout_channel);
--      data->child_stdout_channel = NULL;
--    }
--  if (data->child_stderr_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stderr_channel);
--      data->child_stderr_channel = NULL;
--    }
--
--  if (data->child_stdout_source != NULL)
--    {
--      g_source_destroy (data->child_stdout_source);
--      data->child_stdout_source = NULL;
--    }
--  if (data->child_stderr_source != NULL)
--    {
--      g_source_destroy (data->child_stderr_source);
--      data->child_stderr_source = NULL;
--    }
--
--  if (data->child_stdout_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stdout_fd) == 0);
--      data->child_stdout_fd = -1;
--    }
--  if (data->child_stderr_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stderr_fd) == 0);
--      data->child_stderr_fd = -1;
--    }
--
--  if (data->cancellable_handler_id > 0)
--    {
--      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
--      data->cancellable_handler_id = 0;
--    }
--
--  if (data->main_context != NULL)
--    g_main_context_unref (data->main_context);
--
--  if (data->cancellable != NULL)
--    g_object_unref (data->cancellable);
--
--  g_slice_free (UtilsSpawnData, data);
--}
--
--/* called in the thread where @cancellable was cancelled */
--static void
--utils_on_cancelled (GCancellable *cancellable,
--                    gpointer      user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  GError *error;
--
--  error = NULL;
--  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
--  g_simple_async_result_take_error (data->simple, error);
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_read_child_stderr (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stderr, buf, bytes_read);
--  return TRUE;
--}
--
--static gboolean
--utils_read_child_stdout (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stdout, buf, bytes_read);
--  return TRUE;
--}
--
--static void
--utils_child_watch_cb (GPid     pid,
--                      gint     status,
--                      gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar *buf;
--  gsize buf_size;
--
--  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stdout, buf, buf_size);
--      g_free (buf);
--    }
--  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stderr, buf, buf_size);
--      g_free (buf);
--    }
--
--  data->exit_status = status;
--
--  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
--  data->child_pid = 0;
--  data->child_watch_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_timeout_cb (gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--
--  data->timed_out = TRUE;
--
--  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
--  data->timeout_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--
--  return FALSE; /* remove source */
--}
--
--static void
--utils_spawn (const gchar *const  *argv,
--             guint                timeout_seconds,
--             GCancellable        *cancellable,
--             GAsyncReadyCallback  callback,
--             gpointer             user_data)
--{
--  UtilsSpawnData *data;
--  GError *error;
--
--  data = g_slice_new0 (UtilsSpawnData);
--  data->timeout_seconds = timeout_seconds;
--  data->simple = g_simple_async_result_new (NULL,
--                                            callback,
--                                            user_data,
--                                            (gpointer*)utils_spawn);
--  data->main_context = g_main_context_get_thread_default ();
--  if (data->main_context != NULL)
--    g_main_context_ref (data->main_context);
--
--  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
--
--  data->child_stdout = g_string_new (NULL);
--  data->child_stderr = g_string_new (NULL);
--  data->child_stdout_fd = -1;
--  data->child_stderr_fd = -1;
--
--  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
--  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
--
--  error = NULL;
--  if (data->cancellable != NULL)
--    {
--      /* could already be cancelled */
--      error = NULL;
--      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
--        {
--          g_simple_async_result_take_error (data->simple, error);
--          g_simple_async_result_complete_in_idle (data->simple);
--          g_object_unref (data->simple);
--          goto out;
--        }
--
--      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
--                                                            G_CALLBACK (utils_on_cancelled),
--                                                            data,
--                                                            NULL);
--    }
--
--  error = NULL;
--  if (!g_spawn_async_with_pipes (NULL, /* working directory */
--                                 (gchar **) argv,
--                                 NULL, /* envp */
--                                 GSpawnFlags(G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD),
--                                 NULL, /* child_setup */
--                                 NULL, /* child_setup's user_data */
--                                 &(data->child_pid),
--                                 NULL, /* gint *stdin_fd */
--                                 &(data->child_stdout_fd),
--                                 &(data->child_stderr_fd),
--                                 &error))
--    {
--      g_prefix_error (&error, "Error spawning: ");
--      g_simple_async_result_take_error (data->simple, error);
--      g_simple_async_result_complete_in_idle (data->simple);
--      g_object_unref (data->simple);
--      goto out;
--    }
--
--  if (timeout_seconds > 0)
--    {
--      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
--      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
--      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
--      g_source_attach (data->timeout_source, data->main_context);
--      g_source_unref (data->timeout_source);
--    }
--
--  data->child_watch_source = g_child_watch_source_new (data->child_pid);
--  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
--  g_source_attach (data->child_watch_source, data->main_context);
--  g_source_unref (data->child_watch_source);
--
--  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
--  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
--  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
--  g_source_attach (data->child_stdout_source, data->main_context);
--  g_source_unref (data->child_stdout_source);
--
--  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
--  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
--  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
--  g_source_attach (data->child_stderr_source, data->main_context);
--  g_source_unref (data->child_stderr_source);
--
-- out:
--  ;
--}
--
--gboolean
--utils_spawn_finish (GAsyncResult   *res,
--                    gint           *out_exit_status,
--                    gchar         **out_standard_output,
--                    gchar         **out_standard_error,
--                    GError        **error)
--{
--  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
--  UtilsSpawnData *data;
--  gboolean ret = FALSE;
--
--  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
--  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
--
--  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
--
--  if (g_simple_async_result_propagate_error (simple, error))
--    goto out;
--
--  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
--
--  if (data->timed_out)
--    {
--      g_set_error (error,
--                   G_IO_ERROR,
--                   G_IO_ERROR_TIMED_OUT,
--                   "Timed out after %d seconds",
--                   data->timeout_seconds);
--      goto out;
--    }
--
--  if (out_exit_status != NULL)
--    *out_exit_status = data->exit_status;
--
--  if (out_standard_output != NULL)
--    *out_standard_output = g_strdup (data->child_stdout->str);
--
--  if (out_standard_error != NULL)
--    *out_standard_error = g_strdup (data->child_stderr->str);
--
--  ret = TRUE;
--
-- out:
--  return ret;
--}
--- 
-GitLab
-
-
-From 4858128107be9c3ab11828ee8f35c5e26efd36ce Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
-Date: Tue, 14 Sep 2021 14:38:15 -0700
-Subject: [PATCH 15/16] Gitlab CI: add duktape pkgconfig dependency
-
-Make way for the CI to be able to build with duktape too
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- .gitlab-ci.yml | 1 +
- 1 file changed, 1 insertion(+)
-
-GitLab
-
-
-From cd5d6da837fce95f8831a355dad88c83347c7337 Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
-Date: Mon, 20 Sep 2021 17:17:26 -0700
-Subject: [PATCH 16/16] duktape: implement runaway scripts killer timeout
-
-This was missing on Duktape's JS backend proposal, now in. As
-discussed in
-https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/35 and
-verified by the commit author, Duktape has no interrupt injection
-mechanism (it has no thread-safe API entry whatsoever, even). Using
-DUK_USE_EXEC_TIMEOUT_CHECK is also not feasible, because:
-
-  i) It must be enabled at build time and shared object builds of the
-  lib on distros go with the default options, something we cannot
-  change/control
-
-  ii) That does not account for non-ECMAScript explicit execution
-  contexts, like regex execution, native C calls, etc.
-
-It has been agreed, on that thread, that pthread_cond_timedwait()-ing
-and having proper Duktape evaluation/execution calls take place in a
-separate thread, to be killed after the runaway script killer's
-accorded timeout value, a reasonable approach. We have considered
-using glib wrappers for direct pthread usage, but that way would make
-it impossible to issue
-pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, ...) and we want to
-be paranoid in that regard.
-
-On Duktape, we don't get to err from the JS context (to be captured by
-the offending script), but to be forcibly killed on timeout scenarios,
-leading to null returns, thus polkit negation, by definition. It's a
-reasonable design/compromise.
-
-A fatal error handler routine, for the Duktape context, has also been
-added, using the polkit_backend_authority_log() logging infra to
-better assist users on what went wrong.
-
-Finally, the script evaluation routine has been made to use
-duk_peval_lstring() (previously using _noresult variant), so to able
-to present the user with proper error messages, should any occur.
-
-The original runaway script killer test has been adjusted to please
-both JS backends.
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- meson.build                                   |   1 +
- src/polkitbackend/meson.build                 |   1 +
- src/polkitbackend/polkitbackendcommon.h       |   2 +
- .../polkitbackendduktapeauthority.c           | 236 ++++++++++++++----
- .../polkitbackendjsauthority.cpp              |  10 +-
- .../etc/polkit-1/rules.d/10-testing.rules     |   6 +-
- .../test-polkitbackendjsauthority.c           |   2 +-
- 7 files changed, 209 insertions(+), 49 deletions(-)
-
-diff --git a/meson.build b/meson.build
-index 4e44723..46956e3 100644
---- a/meson.build
-+++ b/meson.build
-@@ -137,6 +137,7 @@ js_engine = get_option('js_engine')
- if js_engine == 'duktape'
-   js_dep = dependency('duktape')
-   libm_dep = cc.find_library('m')
-+  libpthread_dep = cc.find_library('pthread')
- elif js_engine == 'mozjs'
-   js_dep = dependency('mozjs-78')
- endif
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 9ec01b2..4dfea39 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -34,6 +34,7 @@ c_flags = [
- if js_engine == 'duktape'
-   sources += files('polkitbackendduktapeauthority.c')
-   deps += libm_dep
-+  deps += libpthread_dep
- elif js_engine == 'mozjs'
-   sources += files('polkitbackendjsauthority.cpp')
- endif
-diff --git a/src/polkitbackend/polkitbackendcommon.h b/src/polkitbackend/polkitbackendcommon.h
-index 6d0d267..dd700fc 100644
---- a/src/polkitbackend/polkitbackendcommon.h
-+++ b/src/polkitbackend/polkitbackendcommon.h
-@@ -50,6 +50,8 @@
- #include <systemd/sd-login.h>
- #endif /* HAVE_LIBSYSTEMD */
- 
-+#define RUNAWAY_KILLER_TIMEOUT (15)
-+
- #ifdef __cplusplus
- extern "C" {
- #endif
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index a2b4420..80f1976 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -47,8 +47,20 @@ struct _PolkitBackendJsAuthorityPrivate
-   GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
- 
-   duk_context *cx;
-+
-+  pthread_t runaway_killer_thread;
-+};
-+
-+enum
-+{
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS,
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE,
- };
- 
-+static gboolean execute_script_with_runaway_killer(PolkitBackendJsAuthority *authority,
-+                                                   const gchar *filename);
-+
- /* ---------------------------------------------------------------------------------------------------- */
- 
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
-@@ -67,6 +79,15 @@ static const duk_function_list_entry js_polkit_functions[] =
-   { NULL, NULL, 0 },
- };
- 
-+static void report_error (void     *udata,
-+                          const char *msg)
-+{
-+    PolkitBackendJsAuthority *authority = udata;
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "fatal Duktape JS backend error: %s",
-+                                  (msg ? msg : "no message"));
-+}
-+
- static void
- polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
- {
-@@ -78,7 +99,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
- {
--  duk_context *cx = authority->priv->cx;
-   GList *files = NULL;
-   GList *l;
-   guint num_scripts = 0;
-@@ -123,36 +143,9 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   for (l = files; l != NULL; l = l->next)
-     {
-       const gchar *filename = (gchar *)l->data;
--#if (DUK_VERSION >= 20000)
--      GFile *file = g_file_new_for_path (filename);
--      char *contents;
--      gsize len;
--      if (!g_file_load_contents (file, NULL, &contents, &len, NULL, NULL))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Error compiling script %s",
--                                        filename);
--          g_object_unref (file);
--          continue;
--        }
- 
--      g_object_unref (file);
--      if (duk_peval_lstring_noresult(cx, contents,len) != 0)
--#else
--      if (duk_peval_file_noresult (cx, filename) != 0)
--#endif
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Error compiling script %s: %s",
--                                        filename, duk_safe_to_string (authority->priv->cx, -1));
--#if (DUK_VERSION >= 20000)
--          g_free (contents);
--#endif
-+      if (!execute_script_with_runaway_killer(authority, filename))
-           continue;
--        }
--#if (DUK_VERSION >= 20000)
--      g_free (contents);
--#endif
-       num_scripts++;
-     }
- 
-@@ -232,7 +225,7 @@ polkit_backend_common_js_authority_constructed (GObject *object)
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   duk_context *cx;
- 
--  cx = duk_create_heap (NULL, NULL, NULL, authority, NULL);
-+  cx = duk_create_heap (NULL, NULL, NULL, authority, report_error);
-   if (cx == NULL)
-     goto fail;
- 
-@@ -243,6 +236,9 @@ polkit_backend_common_js_authority_constructed (GObject *object)
-   duk_put_function_list (cx, -1, js_polkit_functions);
-   duk_put_prop_string (cx, -2, "polkit");
- 
-+  /* load polkit objects/functions into JS context (e.g. addRule(),
-+   * _deleteRules(), _runRules() et al)
-+   */
-   duk_eval_string (cx, init_js);
- 
-   if (authority->priv->rules_dirs == NULL)
-@@ -510,6 +506,167 @@ push_action_and_details (duk_context               *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
-+typedef struct {
-+  PolkitBackendJsAuthority *authority;
-+  const gchar *filename;
-+  pthread_cond_t cond;
-+  pthread_mutex_t mutex;
-+  gint ret;
-+} RunawayKillerCtx;
-+
-+static gpointer
-+runaway_killer_thread_execute_js (gpointer user_data)
-+{
-+  RunawayKillerCtx *ctx = user_data;
-+  duk_context *cx = ctx->authority->priv->cx;
-+
-+  int oldtype;
-+
-+  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
-+
-+#if (DUK_VERSION >= 20000)
-+  GFile *file = g_file_new_for_path(ctx->filename);
-+  char *contents;
-+  gsize len;
-+
-+  if (!g_file_load_contents(file, NULL, &contents, &len, NULL, NULL)) {
-+    polkit_backend_authority_log(POLKIT_BACKEND_AUTHORITY(ctx->authority),
-+                                 "Error compiling script %s", ctx->filename);
-+    g_object_unref(file);
-+    goto err;
-+  }
-+
-+  g_object_unref(file);
-+
-+  /* evaluate the script, trying to print context in any syntax errors
-+     found */
-+  if (duk_peval_lstring(cx, contents, len) != 0)
-+#else
-+  if (duk_peval_file(cx, ctx->filename) != 0)
-+#endif
-+  {
-+    polkit_backend_authority_log(POLKIT_BACKEND_AUTHORITY(ctx->authority),
-+                                 "Error compiling script %s: %s", ctx->filename,
-+                                 duk_safe_to_string(cx, -1));
-+    duk_pop(cx);
-+    goto free_err;
-+  }
-+#if (DUK_VERSION >= 20000)
-+  g_free(contents);
-+#endif
-+
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+  goto end;
-+
-+free_err:
-+#if (DUK_VERSION >= 20000)
-+  g_free(contents);
-+#endif
-+err:
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+end:
-+  pthread_cond_signal(&ctx->cond);
-+  return NULL;
-+}
-+
-+static gpointer
-+runaway_killer_thread_call_js (gpointer user_data)
-+{
-+  RunawayKillerCtx *ctx = user_data;
-+  duk_context *cx = ctx->authority->priv->cx;
-+  int oldtype;
-+
-+  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_EXEC_SUCCESS)
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                    "Error evaluating admin rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto err;
-+    }
-+
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+  goto end;
-+
-+err:
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+end:
-+  pthread_cond_signal(&ctx->cond);
-+  return NULL;
-+}
-+
-+/* Blocking for at most for RUNAWAY_KILLER_TIMEOUT */
-+static gboolean
-+execute_script_with_runaway_killer(PolkitBackendJsAuthority *authority,
-+                                   const gchar *filename)
-+{
-+  gint64 end_time;
-+  gboolean cancel = FALSE;
-+  RunawayKillerCtx ctx = {.authority = authority, .filename = filename,
-+                          .ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+                          .mutex = PTHREAD_MUTEX_INITIALIZER,
-+                          .cond = PTHREAD_COND_INITIALIZER};
-+  struct timespec abs_time;
-+
-+  pthread_mutex_lock(&ctx.mutex);
-+
-+  clock_gettime(CLOCK_REALTIME, &abs_time);
-+  abs_time.tv_sec += RUNAWAY_KILLER_TIMEOUT;
-+
-+  pthread_create(&authority->priv->runaway_killer_thread, NULL, runaway_killer_thread_execute_js, &ctx);
-+
-+  while (ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET) /* loop to treat spurious wakeups */
-+    if (pthread_cond_timedwait(&ctx.cond, &ctx.mutex, &abs_time) == ETIMEDOUT) {
-+      cancel = TRUE;
-+      break;
-+    }
-+
-+  pthread_mutex_unlock(&ctx.mutex);
-+
-+  if (cancel)
-+    pthread_cancel (authority->priv->runaway_killer_thread);
-+  pthread_join (authority->priv->runaway_killer_thread, NULL);
-+
-+  return ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+}
-+
-+/* Calls already stacked function and args. Blocking for at most for
-+ * RUNAWAY_KILLER_TIMEOUT
-+ */
-+static gboolean
-+call_js_function_with_runaway_killer(PolkitBackendJsAuthority *authority)
-+{
-+  gint64 end_time;
-+  gboolean cancel = FALSE;
-+  RunawayKillerCtx ctx = {.authority = authority,
-+                          .ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+                          .mutex = PTHREAD_MUTEX_INITIALIZER,
-+                          .cond = PTHREAD_COND_INITIALIZER};
-+  struct timespec abs_time;
-+
-+  pthread_mutex_lock(&ctx.mutex);
-+
-+  clock_gettime(CLOCK_REALTIME, &abs_time);
-+  abs_time.tv_sec += RUNAWAY_KILLER_TIMEOUT;
-+
-+  pthread_create(&authority->priv->runaway_killer_thread, NULL, runaway_killer_thread_call_js, &ctx);
-+
-+  while (ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET) /* loop to treat spurious wakeups */
-+    if (pthread_cond_timedwait(&ctx.cond, &ctx.mutex, &abs_time) == ETIMEDOUT) {
-+      cancel = TRUE;
-+      break;
-+    }
-+
-+  pthread_mutex_unlock(&ctx.mutex);
-+
-+  if (cancel)
-+    pthread_cancel (authority->priv->runaway_killer_thread);
-+  pthread_join (authority->priv->runaway_killer_thread, NULL);
-+
-+  return ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+}
-+
- /* ---------------------------------------------------------------------------------------------------- */
- 
- GList *
-@@ -557,13 +714,8 @@ polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInter
-       goto out;
-     }
- 
--  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
--    {
--      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                    "Error evaluating admin rules: ",
--                                    duk_safe_to_string (cx, -1));
--      goto out;
--    }
-+  if (!call_js_function_with_runaway_killer (authority))
-+    goto out;
- 
-   ret_str = duk_require_string (cx, -1);
- 
-@@ -643,15 +795,11 @@ polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendIntera
-       goto out;
-     }
- 
--  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
--  {
--      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                    "Error evaluating authorization rules: ",
--                                    duk_safe_to_string (cx, -1));
--      goto out;
--  }
-+  if (!call_js_function_with_runaway_killer (authority))
-+    goto out;
- 
-   if (duk_is_null(cx, -1)) {
-+    /* this fine, means there was no match, use implicit authorizations */
-     good = TRUE;
-     goto out;
-   }
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index e28091d..11e91c0 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -829,11 +829,14 @@ runaway_killer_setup (PolkitBackendJsAuthority *authority)
- {
-   g_assert (authority->priv->rkt_source == NULL);
- 
--  /* set-up timer for runaway scripts, will be executed in runaway_killer_thread */
-+  /* set-up timer for runaway scripts, will be executed in
-+     runaway_killer_thread, that is one, permanent thread running a glib
-+     mainloop (rkt_loop) whose context (rkt_context) has a timeout source
-+     (rkt_source) */
-   g_mutex_lock (&authority->priv->rkt_timeout_pending_mutex);
-   authority->priv->rkt_timeout_pending = FALSE;
-   g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex);
--  authority->priv->rkt_source = g_timeout_source_new_seconds (15);
-+  authority->priv->rkt_source = g_timeout_source_new_seconds (RUNAWAY_KILLER_TIMEOUT);
-   g_source_set_callback (authority->priv->rkt_source, rkt_on_timeout, authority, NULL);
-   g_source_attach (authority->priv->rkt_source, authority->priv->rkt_context);
- 
-@@ -893,6 +896,9 @@ execute_script_with_runaway_killer (PolkitBackendJsAuthority *authority,
- {
-   bool ret;
- 
-+  // tries to JS_ExecuteScript(), may hang for > RUNAWAY_KILLER_TIMEOUT,
-+  // runaway_killer_thread makes sure the call returns, due to exception
-+  // injection
-   runaway_killer_setup (authority);
-   ret = JS_ExecuteScript (authority->priv->cx,
-                           script,
-diff --git a/test/data/etc/polkit-1/rules.d/10-testing.rules b/test/data/etc/polkit-1/rules.d/10-testing.rules
-index 98bf062..e346b5d 100644
---- a/test/data/etc/polkit-1/rules.d/10-testing.rules
-+++ b/test/data/etc/polkit-1/rules.d/10-testing.rules
-@@ -189,8 +189,10 @@ polkit.addRule(function(action, subject) {
-                 ;
-         } catch (error) {
-             if (error == "Terminating runaway script")
--                return polkit.Result.YES;
--            return polkit.Result.NO;
-+                // Inverted logic to accomodate Duktape's model as well, which
-+                // will always fail with negation, on timeouts
-+                return polkit.Result.NO;
-+            return polkit.Result.YES;
-         }
-     }
- });
-diff --git a/test/polkitbackend/test-polkitbackendjsauthority.c b/test/polkitbackend/test-polkitbackendjsauthority.c
-index f97e0e0..2103b17 100644
---- a/test/polkitbackend/test-polkitbackendjsauthority.c
-+++ b/test/polkitbackend/test-polkitbackendjsauthority.c
-@@ -328,7 +328,7 @@ static const RulesTestCase rules_test_cases[] = {
-     "net.company.run_away_script",
-     "unix-user:root",
-     NULL,
--    POLKIT_IMPLICIT_AUTHORIZATION_AUTHORIZED,
-+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
-   },
- 
-   {
--- 
-GitLab
-
diff --git a/gnu/packages/patches/postgresql-riscv-spinlocks.patch b/gnu/packages/patches/postgresql-riscv-spinlocks.patch
deleted file mode 100644
index 984a573642..0000000000
--- a/gnu/packages/patches/postgresql-riscv-spinlocks.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-https://www.postgresql.org/message-id/dea97b6d-f55f-1f6d-9109-504aa7dfa421@gentoo.org
-
-The attached patch adds native spinlock support to PostgreSQL on RISC-V 
-systems. As suspected by Richard W.M. Jones of Red Hat back in 2016, the 
-__sync_lock_test_and_set() approach applied on arm and arm64 works here 
-as well.
-
-
-Tested against PostgreSQL 13.3 on a physical rv64gc system (BeagleV 
-Starlight beta board) - builds and installs fine, all tests pass. From 
-what I can see in gcc documentation this should in theory work on rv32 
-(and possibly rv128) as well, therefore the patch as it stands covers 
-all RISC-V systems (i.e. doesn't check the value of __risc_xlen) - but I 
-haven't confirmed this experimentally.
-
---- a/src/include/storage/s_lock.h
-+++ b/src/include/storage/s_lock.h
-@@ -315,12 +315,12 @@
- #endif	 /* __ia64__ || __ia64 */
- 
- /*
-- * On ARM and ARM64, we use __sync_lock_test_and_set(int *, int) if available.
-+ * On ARM, ARM64 and RISC-V, we use __sync_lock_test_and_set(int *, int) if available.
-  *
-  * We use the int-width variant of the builtin because it works on more chips
-  * than other widths.
-  */
--#if defined(__arm__) || defined(__arm) || defined(__aarch64__) || defined(__aarch64)
-+#if defined(__arm__) || defined(__arm) || defined(__aarch64__) || defined(__aarch64) || defined(__riscv)
- #ifdef HAVE_GCC__SYNC_INT32_TAS
- #define HAS_TEST_AND_SET
- 
-@@ -337,7 +337,7 @@
- #define S_UNLOCK(lock) __sync_lock_release(lock)
- 
- #endif	 /* HAVE_GCC__SYNC_INT32_TAS */
--#endif	 /* __arm__ || __arm || __aarch64__ || __aarch64 */
-+#endif	 /* __arm__ || __arm || __aarch64__ || __aarch64 || __riscv */
- 
- 
- /* S/390 and S/390x Linux (32- and 64-bit zSeries) */
diff --git a/gnu/packages/patches/python-dateutil-pytest-compat.patch b/gnu/packages/patches/python-dateutil-pytest-compat.patch
new file mode 100644
index 0000000000..5cff57e94c
--- /dev/null
+++ b/gnu/packages/patches/python-dateutil-pytest-compat.patch
@@ -0,0 +1,43 @@
+Add compatibility with newer versions of pytest.
+
+Taken from upstream:
+
+  https://github.com/dateutil/dateutil/commit/2bdd63158b7f981fc6d70a869680451bdfd8d848
+
+diff --git a/dateutil/test/test_internals.py b/dateutil/test/test_internals.py
+index 53081314..b32e6723 100644
+--- a/dateutil/test/test_internals.py
++++ b/dateutil/test/test_internals.py
+@@ -9,6 +9,7 @@
+ 
+ import sys
+ import pytest
++import warnings
+ 
+ from dateutil.parser._parser import _ymd
+ from dateutil import tz
+@@ -65,18 +66,17 @@ def test_parser_parser_private_not_warns():
+     from dateutil.parser._parser import _timelex, _tzparser
+     from dateutil.parser._parser import _parsetz
+ 
+-    with pytest.warns(None) as recorder:
++    with warnings.catch_warnings():
++        warnings.simplefilter("error")
+         _tzparser()
+-        assert len(recorder) == 0
+ 
+-    with pytest.warns(None) as recorder:
++    with warnings.catch_warnings():
++        warnings.simplefilter("error")
+         _timelex('2014-03-03')
+ 
+-        assert len(recorder) == 0
+-
+-    with pytest.warns(None) as recorder:
++    with warnings.catch_warnings():
++        warnings.simplefilter("error")
+         _parsetz('+05:00')
+-        assert len(recorder) == 0
+ 
+ 
+ @pytest.mark.tzstr
diff --git a/gnu/packages/patches/ruby-hydra-minimal-no-byebug.patch b/gnu/packages/patches/ruby-hydra-minimal-no-byebug.patch
new file mode 100644
index 0000000000..7b338ca03e
--- /dev/null
+++ b/gnu/packages/patches/ruby-hydra-minimal-no-byebug.patch
@@ -0,0 +1,11 @@
+Description: Avoid dependency on byebug to reduce package closure
+  significantly, see https://issues.guix.gnu.org/55997
+diff --git a/lib/hydra.rb b/lib/hydra.rb
+index 29fbad2..6b5058a 100644
+--- a/lib/hydra.rb
++++ b/lib/hydra.rb
+@@ -1,4 +1,3 @@
+-require 'byebug' unless ENV['RACK_ENV'] == "production"
+ require 'pp'
+ 
+ module CoreExt
diff --git a/gnu/packages/patches/rustc-1.39.0-src.patch b/gnu/packages/patches/rustc-1.39.0-src.patch
deleted file mode 100644
index 7859bd44d5..0000000000
--- a/gnu/packages/patches/rustc-1.39.0-src.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-# This modified patch is to disable the hunk applying to LLVM, unbundled in Guix.
-
-# Add mrustc slice length intrinsics
---- src/libcore/intrinsics.rs
-+++ src/libcore/intrinsics.rs
-@@ -685,4 +685,8 @@
-     pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
- 
-+    /// Obtain the length of a slice pointer
-+    #[cfg(rust_compiler="mrustc")]
-+    pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize;
-+
-     /// Gets a static string slice containing the name of a type.
-     pub fn type_name<T: ?Sized>() -> &'static str;
-
---- src/libcore/slice/mod.rs
-+++ src/libcore/slice/mod.rs
-@@ -68,5 +68,8 @@
-     pub const fn len(&self) -> usize {
--        unsafe {
--            crate::ptr::Repr { rust: self }.raw.len
--        }
-+        #[cfg(not(rust_compiler="mrustc"))]
-+        #[cfg_attr(not(bootstrap), allow_internal_unstable(const_fn_union))]
-+        const fn len_inner<T>(s: &[T]) -> usize { unsafe { crate::ptr::Repr { rust: s }.raw.len } };
-+        #[cfg(rust_compiler="mrustc")]
-+        const fn len_inner<T>(s: &[T]) -> usize { unsafe { crate::intrinsics::mrustc_slice_len(s) } }
-+        len_inner(self)
-     }
-#
-# Static-link rustc_codegen_llvm so the generated rustc is standalone
-# > Note: Interacts with `rustc-1.39.0-overrides.toml`
-#
---- src/librustc_interface/util.rs
-+++ src/librustc_interface/util.rs
-@@ -421,2 +421,4 @@
- pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend> {
-+    #[cfg(rust_compiler="mrustc")]
-+    { if(backend_name == "llvm") { extern "Rust" { fn __rustc_codegen_backend() -> Box<dyn CodegenBackend>; } return || unsafe { __rustc_codegen_backend() } } }
-     // For now we only allow this function to be called once as it'll dlopen a
-# Disable most architecture intrinsics
---- src/stdarch/crates/std_detect/src/detect/mod.rs
-+++ src/stdarch/crates/std_detect/src/detect/mod.rs
-@@ -74,4 +74,7 @@
-         // this run-time detection logic is never called.
-         #[path = "os/other.rs"]
-         mod os;
-+    } else if #[cfg(rust_compiler="mrustc")] {
-+        #[path = "os/other.rs"]
-+        mod os;
-     } else if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] {
---- vendor/ppv-lite86/src/lib.rs
-+++ vendor/ppv-lite86/src/lib.rs
-@@ -12,10 +12,10 @@
--#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
-+#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler="mrustc")))]
- pub mod x86_64;
--#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
-+#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler="mrustc")))]
- use self::x86_64 as arch;
-
--#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
-+#[cfg(any(miri, rust_compiler="mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
- pub mod generic;
--#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
-+#[cfg(any(miri, rust_compiler="mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
- use self::generic as arch;
-
-# diff --git a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
-# index da9d9d5bfdc0..3d47471f0ef0 100644
-# --- src/llvm-project/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
-# +++ src/llvm-project/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
-# @@ -16,6 +16,8 @@
-#  #include "llvm/Demangle/DemangleConfig.h"
-#  #include "llvm/Demangle/StringView.h"
-#  #include <array>
-# +#include <cstdint>
-# +#include <string>
-
-#  namespace llvm {
-#  namespace itanium_demangle {
-##
-## gcc (used by mrustc) has 16-byte uint128_t alignment, while rustc uses 8
-##
-#--- src/libsyntax/ast.rs
-#+++ src/libsyntax/ast.rs
-#@@ -986,2 +986,2 @@
-#-#[cfg(target_arch = "x86_64")]
-#-static_assert_size!(Expr, 96);
-#+//#[cfg(target_arch = "x86_64")]
-#+//static_assert_size!(Expr, 96);
-#--- src/librustc/ty/sty.rs
-#+++ src/librustc/ty/sty.rs
-#@@ -2258,2 +2258,2 @@
-#-#[cfg(target_arch = "x86_64")]
-#-static_assert_size!(Const<'_>, 40);
-#+//#[cfg(target_arch = "x86_64")]
-#+//static_assert_size!(Const<'_>, 40);
-
diff --git a/gnu/packages/patches/rustc-1.54.0-src.patch b/gnu/packages/patches/rustc-1.54.0-src.patch
new file mode 100644
index 0000000000..d075dce39b
--- /dev/null
+++ b/gnu/packages/patches/rustc-1.54.0-src.patch
@@ -0,0 +1,117 @@
+# mrustc is much better at enum packing, so causes almost all of these to be smaller by one pointer
+--- compiler/rustc_ast/src/ast.rs
++++ compiler/rustc_ast/src/ast.rs
+@@ -1075,7 +1075,7 @@ pub struct Expr {
+ }
+ 
+ // `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(Expr, 104);
+ 
+ impl Expr {
+@@ -2779,7 +2779,7 @@ pub enum AssocItemKind {
+     MacCall(MacCall),
+ }
+ 
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(AssocItemKind, 72);
+ 
+ impl AssocItemKind {
+@@ -2831,7 +2831,7 @@ pub enum ForeignItemKind {
+     MacCall(MacCall),
+ }
+ 
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler="mrustc"),target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(ForeignItemKind, 72);
+ 
+ impl From<ForeignItemKind> for ItemKind {
+--- compiler/rustc_hir/src/hir.rs
++++ compiler/rustc_hir/src/hir.rs
+@@ -3050,3 +3050,3 @@
+ // Some nodes are used a lot. Make sure they don't unintentionally get bigger.
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler="mrustc"),target_arch = "x86_64", target_pointer_width = "64"))]
+ mod size_asserts {
+--- compiler/rustc_middle/src/mir/interpret/error.rs
++++ compiler/rustc_middle/src/mir/interpret/error.rs
+@@ -452,2 +452,2 @@
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler="mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ static_assert_size!(InterpError<'_>, 64);
+--- compiler/rustc_middle/src/mir/mod.rs
++++ compiler/rustc_middle/src/mir/mod.rs
+@@ -2203,2 +2203,2 @@
+-#[cfg(target_arch = "x86_64")]
++#[cfg(all(not(rust_compiler="mrustc"), target_arch = "x86_64"))]
+ static_assert_size!(AggregateKind<'_>, 48);
+--- compiler/rustc_middle/src/thir.rs
++++ compiler/rustc_middle/src/thir.rs
+@@ -147,2 +147,2 @@
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler="mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(Expr<'_>, 144);
+--- compiler/rustc_mir/src/interpret/place.rs
++++ compiler/rustc_mir/src/interpret/place.rs
+@@ -91,2 +91,2 @@
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(Place, 64);
+@@ -100,2 +100,2 @@
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(PlaceTy<'_>, 80);
+--- compiler/rustc_mir/src/interpret/operand.rs
++++ compiler/rustc_mir/src/interpret/operand.rs
+@@ -35,2 +35,2 @@
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(Immediate, 56);
+@@ -90,2 +90,2 @@
+-#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
++#[cfg(all(not(rust_compiler = "mrustc"), target_arch = "x86_64", target_pointer_width = "64"))]
+ rustc_data_structures::static_assert_size!(ImmTy<'_>, 72);
+
+#
+# Disable crc32fast's use of stdarch
+#
+--- vendor/crc32fast/src/specialized/mod.rs
++++ vendor/crc32fast/src/specialized/mod.rs
+@@ -1,5 +1,6 @@
+ cfg_if! {
+     if #[cfg(all(
++        not(rust_compiler = "mrustc"),
+         crc32fast_stdarchx86,
+         any(target_arch = "x86", target_arch = "x86_64")
+     ))] {
+
+#
+# Disable std_detect's detection logic (use the same logic as miri)
+#
+--- library/stdarch/crates/std_detect/src/detect/mod.rs
++++ library/stdarch/crates/std_detect/src/detect/mod.rs
+@@ -88,2 +88,2 @@
+ cfg_if! {
+-    if #[cfg(miri)] {
++    if #[cfg(any(miri, rust_compiler = "mrustc"))] {
+
+# PPV-Lite also needs to know that we're pretending to be miri
+--- vendor/ppv-lite86/src/lib.rs
++++ vendor/ppv-lite86/src/lib.rs
+@@ -12,9 +12,9 @@
+-#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
++#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler = "mrustc")))]
+ pub mod x86_64;
+-#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
++#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler = "mrustc")))]
+ use self::x86_64 as arch;
+ 
+-#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
++#[cfg(any(miri, rust_compiler = "mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
+ pub mod generic;
+-#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
++#[cfg(any(miri, rust_compiler = "mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
+ use self::generic as arch;
+
diff --git a/gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch b/gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch
new file mode 100644
index 0000000000..fb29b76ef2
--- /dev/null
+++ b/gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch
@@ -0,0 +1,13 @@
+Description: Avoid dependency on byebug to reduce package closure
+  significantly, see https://issues.guix.gnu.org/55997
+diff --git a/lib/tex/hyphen/language.rb b/lib/tex/hyphen/language.rb
+index 12831417..df6daa39 100644
+--- a/lib/tex/hyphen/language.rb
++++ b/lib/tex/hyphen/language.rb
+@@ -1,6 +1,5 @@
+ require 'yaml'
+ require 'hydra'
+-require 'byebug'
+ 
+ require_relative 'path'
+ 
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index 64868607dc..6eab98ab74 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -8573,7 +8573,7 @@ for a given module is comprehensive.")
 (define-public perl-pod-parser
   (package
     (name "perl-pod-parser")
-    (version "1.63")
+    (version "1.65")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -8581,7 +8581,7 @@ for a given module is comprehensive.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "1k8clxxdjag56zm6cv38c3q81gj7xphfhh98l21jynwp55hvbq6v"))))
+                "12mj07a34shx5h203l693fra7ip9hc49zrd7w8gsa5llcpnbv9rv"))))
     (build-system perl-build-system)
     (home-page "https://metacpan.org/release/Pod-Parser")
     (synopsis "Modules for parsing/translating POD format documents")
diff --git a/gnu/packages/photo.scm b/gnu/packages/photo.scm
index 19c171a9bb..378f60793f 100644
--- a/gnu/packages/photo.scm
+++ b/gnu/packages/photo.scm
@@ -204,17 +204,6 @@ cameras (CRW/CR2, NEF, RAF, DNG, and others).")
     ;; both two licensing modes for your changes/additions."
     (license (list license:lgpl2.1 license:cddl1.0))))
 
-(define-public libraw-0.18
-  (package (inherit libraw)
-    (name "libraw")
-    (version "0.18.12")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://www.libraw.org/data/LibRaw-"
-                                  version ".tar.gz"))
-              (sha256
-               (base32
-                "1m2khr2cij8z6lawgbmdksjn14fpnjsy8ad4qahnpqapm1slsxap"))))))
 
 (define-public libexif
   (package
diff --git a/gnu/packages/polkit.scm b/gnu/packages/polkit.scm
index 56e2589da3..a5c1b0dc98 100644
--- a/gnu/packages/polkit.scm
+++ b/gnu/packages/polkit.scm
@@ -9,6 +9,8 @@
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021 Morgan Smith <Morgan.J.Smith@outlook.com>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2022 Jean-Pierre De Jesus DIAZ <me@jeandudey.tech>
+;;; Copyright © 2022 Marius Bakke <marius@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,14 +30,16 @@
 (define-module (gnu packages polkit)
   #:use-module ((guix licenses) #:select (lgpl2.0+))
   #:use-module (guix packages)
+  #:use-module (guix gexp)
   #:use-module (guix download)
   #:use-module (guix memoization)
   #:use-module (guix utils)
   #:use-module (guix build utils)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system meson)
   #:use-module (gnu packages)
-  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages gettext)
   #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gtk)
@@ -53,102 +57,75 @@
 (define-public polkit-mozjs
   (package
     (name "polkit")
-    (version "0.120")
+    (version "121")
     (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://www.freedesktop.org/software/polkit/releases/"
                    name "-" version ".tar.gz"))
+             (patches (search-patches "polkit-disable-systemd.patch"))
              (sha256
               (base32
-               "00zfg9b9ivkcj2jcf5b92cpvvyljz8cmfwj86lkvy5rihnd5jypf"))
-             (patches (search-patches "polkit-configure-elogind.patch"
-                                      "polkit-CVE-2021-4034.patch"))
+               "1apz3bh7nbpmlp1cr00pb8z8wp0c7yb23ninb959jz3r38saxiwx"))
              (modules '((guix build utils)))
              (snippet
               '(begin
-                 (use-modules (guix build utils))
-                 ;; Disable broken test.
-                 (substitute* "test/Makefile.in"
-                   (("SUBDIRS = mocklibc . polkit polkitbackend")
-                    "SUBDIRS = mocklibc . polkit"))
                  ;; Disable a test that requires Python, D-Bus and a few
                  ;; libraries and fails with "ERROR: timed out waiting for bus
                  ;; process to terminate".
-                 (substitute* "test/polkitbackend/Makefile.am"
-                   (("TEST_PROGS \\+= polkitbackendjsauthoritytest-wrapper.py")
+                 (substitute* "test/meson.build"
+                   (("subdir\\('polkitbackend'\\)")
                     ""))
-                 ;; Guix System's polkit
-                 ;; service stores actions under /etc/polkit-1/actions.
+                 ;; Look up actions and rules from /etc/polkit ...
+                 (substitute* "src/polkitbackend/meson.build"
+                   (("'-DPACKAGE_SYSCONF_DIR=.*,")
+                    "'-DPACKAGE_SYSCONF_DIR=\"/etc\"',"))
                  (substitute* "src/polkitbackend/polkitbackendinteractiveauthority.c"
                    (("PACKAGE_DATA_DIR \"/polkit-1/actions\"")
                     "PACKAGE_SYSCONF_DIR \"/polkit-1/actions\""))
+                 ;; ... but install package files below the prefix.
+                 (substitute* "meson.build"
+                   (("pk_sysconfdir = get_option\\('sysconfdir'\\)")
+                    "pk_sysconfdir = get_option('prefix') + '/etc'"))
                  ;; Set the setuid helper's real location.
                  (substitute* "src/polkitagent/polkitagentsession.c"
                    (("PACKAGE_PREFIX \"/lib/polkit-1/polkit-agent-helper-1\"")
                     "\"/run/setuid-programs/polkit-agent-helper-1\""))))))
-    (build-system gnu-build-system)
+    (build-system meson-build-system)
     (inputs
-     (list expat linux-pam elogind mozjs nspr))
+     (list elogind
+           expat
+           linux-pam
+           mozjs-91
+           nspr))
     (propagated-inputs
-     (list glib)) ; required by polkit-gobject-1.pc
+     (list glib))                       ;required by polkit-gobject-1.pc
     (native-inputs
      (list pkg-config
-           `(,glib "bin")                         ;for glib-mkenums
-           intltool
+           gettext-minimal
+           perl
+           `(,glib "bin")               ;for glib-mkenums
            gobject-introspection
-           libxslt                                ;for man page generation
-           docbook-xsl))                          ;for man page generation
+           libxml2                      ;for man page generation
+           libxslt                      ;for man page generation
+           docbook-xsl))                ;for man page generation
     (arguments
-     `(#:configure-flags '("--sysconfdir=/etc"
-                           "--enable-man-pages"
-                           ;; Prevent ‘configure: error: cannot check for
-                           ;; file existence when cross compiling’.
-                           ,@(if (%current-target-system)
-                                 '("--with-os-type=unknown")
-                                 '()))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after
-          'unpack 'fix-introspection-install-dir
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out")))
-              (substitute* (find-files "." "Makefile.in")
-                (("@INTROSPECTION_GIRDIR@")
-                 (string-append out "/share/gir-1.0/"))
-                (("@INTROSPECTION_TYPELIBDIR@")
-                 (string-append out "/lib/girepository-1.0/"))))))
-         ;; TODO: Core-updates: Unify on the cross-build version.
-         ,@(if (%current-target-system)
-             `((add-after 'unpack 'fix-manpage-generation
-               (lambda* (#:key inputs native-inputs #:allow-other-keys)
-                 (let ((xsldoc (string-append (assoc-ref (or native-inputs inputs)
-                                                         "docbook-xsl")
-                                              "/xml/xsl/docbook-xsl-"
-                                              ,(package-version docbook-xsl))))
-                   (substitute* '("docs/man/Makefile.am" "docs/man/Makefile.in")
-                     (("http://docbook.sourceforge.net/release/xsl/current")
-                      xsldoc))))))
-             `((add-after 'unpack 'fix-manpage-generation
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (let ((xsldoc (string-append (assoc-ref inputs "docbook-xsl")
-                                              "/xml/xsl/docbook-xsl-"
-                                              ,(package-version docbook-xsl))))
-                   (substitute* '("docs/man/Makefile.am" "docs/man/Makefile.in")
-                     (("http://docbook.sourceforge.net/release/xsl/current")
-                      xsldoc)))))))
-         (replace
-          'install
-          (lambda* (#:key outputs (make-flags '()) #:allow-other-keys)
-            ;; Override sysconfdir during "make install", to avoid attempting
-            ;; to install in /etc, and to instead install the skeletons in the
-            ;; output directory.
-            (let ((out (assoc-ref outputs "out")))
-             (apply invoke "make" "install"
-                           (string-append "sysconfdir=" out "/etc")
-                           (string-append "polkit_actiondir="
-                                          out "/share/polkit-1/actions")
-                           make-flags)))))))
+     (list #:configure-flags
+           #~'("--sysconfdir=/etc"
+               "-Dsession_tracking=libelogind"
+               "-Dman=true"
+               "-Dtests=true"
+               "-Djs_engine=mozjs"
+               ;; Work around broken gobject-introspection detection when
+               ;; cross-compiling.  The build system probes for the _target_
+               ;; gobject-introspection, but if we change it to native, Meson
+               ;; fails with:
+               ;; ERROR: Pkg-config binary for machine MachineChoice.BUILD
+               ;; not found, giving up.
+               ;; Just disable introspection for now.
+               #$@(if (%current-target-system)
+                      '("-Dintrospection=false")
+                      '()))))
     (home-page "https://www.freedesktop.org/wiki/Software/polkit/")
     (synopsis "Authorization API for privilege management")
     (description "Polkit is an application-level toolkit for defining and
@@ -164,25 +141,10 @@ for unprivileged applications.")
   (let ((base polkit-mozjs))
     (package/inherit base
       (name "polkit-duktape")
-      (source
-       (origin
-         (inherit (package-source base))
-         (patches
-          (append
-              (search-patches "polkit-use-duktape.patch")
-              (origin-patches (package-source base))))))
       (arguments
        (substitute-keyword-arguments (package-arguments base)
          ((#:configure-flags flags)
-          `(cons "--with-duktape" ,flags))
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'force-gnu-build-system-bootstrap
-               (lambda _
-                 (delete-file "configure")))))))
-      (native-inputs
-       (modify-inputs (package-native-inputs base)
-         (prepend autoconf automake libtool)))
+          #~(delete "-Djs_engine=mozjs" #$flags))))
       (inputs
        (modify-inputs (package-inputs base)
          (replace "mozjs" duktape))))))
diff --git a/gnu/packages/python-crypto.scm b/gnu/packages/python-crypto.scm
index d8e52225c1..dfc0bad7a0 100644
--- a/gnu/packages/python-crypto.scm
+++ b/gnu/packages/python-crypto.scm
@@ -503,13 +503,13 @@ for example, for recording or replaying web content.")
 (define-public python-certifi
   (package
     (name "python-certifi")
-    (version "2021.10.8")
+    (version "2022.6.15")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "certifi" version))
               (sha256
                (base32
-                "0wl8ln7acd797i1q7mmb430l6hqwhmk4bd37x8ycw02b3my4x23q"))))
+                "03c2l11lgljx0kz17cvdc4hlc3p1594ajdih9zq0a4dig285mj44"))))
     (build-system python-build-system)
     (arguments '(#:tests? #f))          ;no tests
     (home-page "https://certifi.io/")
diff --git a/gnu/packages/python-science.scm b/gnu/packages/python-science.scm
index 30b75ca7f3..8ebf3d27b1 100644
--- a/gnu/packages/python-science.scm
+++ b/gnu/packages/python-science.scm
@@ -424,7 +424,7 @@ library.")
     (inputs
      (list which xclip xsel))
     (native-inputs
-     (list python-cython-0.29.32
+     (list python-cython
            python-beautifulsoup4
            python-lxml
            python-html5lib
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index 94544e1e74..41a72089ec 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -2792,13 +2792,13 @@ APIs.")
 (define-public python-requests
   (package
     (name "python-requests")
-    (version "2.27.1")
+    (version "2.28.1")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "requests" version))
              (sha256
               (base32
-               "0qcsbi919d689xqlgyhw9zkppp1fs6k09wwffa3ri6d8smpwbmv8"))))
+               "10vrr7bijzrypvms3g2sgz8vya7f9ymmcv423ikampgy0aqrjmbw"))))
     (build-system python-build-system)
     (propagated-inputs
      (list python-certifi
@@ -3142,14 +3142,14 @@ addon for removing tracking fields from URLs.")
 (define-public python-urllib3
   (package
     (name "python-urllib3")
-    (version "1.26.8")
+    (version "1.26.9")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "urllib3" version))
         (sha256
          (base32
-          "0g18xk7gfm88gr4bp3f58vgvsbzwps3sq2kqhv5xyz9ylvck6z0f"))))
+          "13j4mkk6vgix4bixfqk3fhydsl3r5f61z94ss4fmwsl0fxjg3fma"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f))
     (propagated-inputs
@@ -5671,6 +5671,12 @@ files.")
         (base32
          "1vk7g5z977mi89hamwiqawpmibwvv9ghrf3pqva1waxmyc7gyjb5"))))
     (build-system python-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (add-before 'check 'extend-test-timeout
+                 (lambda _
+                   (setenv "WEBSOCKETS_TESTS_TIMEOUT_FACTOR" "10"))))))
     (home-page "https://github.com/aaugustin/websockets")
     (synopsis
      "Python implementation of the WebSocket Protocol (RFC 6455 & 7692)")
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 54ed7fefed..580a03ec0d 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -1348,14 +1348,14 @@ by @code{binstar}, @code{binstar-build}, and @code{chalmers}.")
 (define-public python-babel
   (package
     (name "python-babel")
-    (version "2.9.0")
+    (version "2.10.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Babel" version))
        (sha256
         (base32
-         "018yg7g2pa6vjixx1nx41cfispgfi0azzp0a1chlycbj8jsil0ys"))))
+         "0l9cvfmsz0hlvcinxaf6xf2f02ldgw3xq9i1fc7lk5zf24vma53n"))))
     (build-system python-build-system)
     (native-inputs
      (list python-freezegun python-pytest tzdata-for-tests))
@@ -3455,14 +3455,14 @@ interfaces.")
 (define-public python-click
   (package
     (name "python-click")
-    (version "8.1.2")
+    (version "8.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "click" version))
        (sha256
         (base32
-         "0whs38a2i0561kwbgigs6vic9r0a1887m2v1aw3rmv6r2kz0g5s7"))))
+         "13kvp8visj5xh9d43brnda6q0kc1s40flxa5cw0p0a9hzf5dr0kn"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -3853,21 +3853,14 @@ JavaScript-like message boxes.  Types of dialog boxes include:
   (package
     (name "python-pympler")
     (home-page "https://pythonhosted.org/Pympler/")
-    (version "0.9")
+    (version "1.0.1")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "Pympler" version))
               (sha256
                (base32
-                "0ivfw2k86nbw9ck9swidl4422w7bhjldxwj90a4sy5r1cbgygjzj"))))
+                "1ynkqpv2akldmvkll5vh5zhwj433s1d59iv0f76lygyak4silgwr"))))
     (build-system python-build-system)
-    (arguments
-     `(#:phases (modify-phases %standard-phases
-                  (delete 'check)
-                  (add-after 'install 'check
-                    (lambda* (#:key inputs outputs #:allow-other-keys)
-                      (add-installed-pythonpath inputs outputs)
-                      (invoke "python" "setup.py" "test"))))))
     (synopsis "Measure, monitor and analyze memory behavior")
     (description
      "Pympler is a development tool to measure, monitor and analyze
@@ -5571,13 +5564,13 @@ provides additional functionality on the produced Mallard documents.")
 (define-public python-cython
   (package
     (name "python-cython")
-    (version "0.29.24")
+    (version "0.29.32")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Cython" version))
        (sha256
-        (base32 "0hw4gs18rh4slij1fg252argxhraypld9apbqbl60230qc3lvw6d"))))
+        (base32 "1xqsihpqnfal29nb5kmw8z71nd4jbsnbz7p3lkr094xpb13wycw7"))))
     (build-system python-build-system)
     ;; we need the full python package and not just the python-wrapper
     ;; because we need libpython3.3m.so
@@ -5613,18 +5606,6 @@ programming language and the extended Cython programming language.  It makes
 writing C extensions for Python as easy as Python itself.")
     (license license:asl2.0)))
 
-;; Newer version required for Pandas.
-(define-public python-cython-0.29.32
-  (package
-    (inherit python-cython)
-    (version "0.29.32")
-    (source (origin
-              (method url-fetch)
-              (uri (pypi-uri "Cython" version))
-              (sha256
-               (base32
-                "1xqsihpqnfal29nb5kmw8z71nd4jbsnbz7p3lkr094xpb13wycw7"))))))
-
 (define-public python-cython-3
   (package
     (inherit python-cython)
@@ -5820,7 +5801,7 @@ capabilities.")
            python-pandas
            python-pydata-sphinx-theme
            python-scipy                 ;used by matplotlib
-           python-sphinx
+           python-sphinx-4
            python-sphinx-panels
            texinfo
            texlive-bin
@@ -7125,13 +7106,13 @@ retrieve text and metadata from PDFs as well as merge entire files together.")
 (define-public python-pillow
   (package
     (name "python-pillow")
-    (version "9.0.0")
+    (version "9.2.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "Pillow" version))
               (sha256
                (base32
-                "0gjry0yqryd2678sm47jhdnbghzxn5wk8pgyaqwr4qi7x5ijjvpf"))
+                "011wgm1mssjchpva9wsi2a07im9czyjvik137xlp5f0g7vykdrkm"))
               (modules '((guix build utils)))
               (snippet '(begin
                           (delete-file-recursively "src/thirdparty")))))
@@ -13734,14 +13715,14 @@ simulation, statistical modeling, machine learning and much more.")
 (define-public python-chardet
   (package
     (name "python-chardet")
-    (version "4.0.0")
+    (version "5.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "chardet" version))
        (sha256
         (base32
-         "1ykr04qyhgpc0h5b7dhqw4g92b1xv7ki2ky910mhy4mlbnhm6vqd"))))
+         "1amqmz8731ly6f9rkbk09w4jqgmmgyxykd1bawhgrdbqzlmxys03"))))
     (native-inputs
      (list python-pytest))
     (build-system python-build-system)
@@ -13750,7 +13731,10 @@ simulation, statistical modeling, machine learning and much more.")
            #~(modify-phases %standard-phases
                (replace 'check
                  (lambda _
-                   (invoke "pytest" "-vv")))
+                   (invoke "pytest" "-vv" "-k"
+                           ;; Disable test that fails sporadically:
+                           ;; https://github.com/chardet/chardet/issues/256
+                           "not test_detect_all_and_detect_one_should_agree")))
                ;; This package provides a 'chardetect' executable that only
                ;; depends on Python, so customize the wrap phase to avoid
                ;; adding pytest and friends in order to save size.
@@ -13778,13 +13762,13 @@ automatically detect a wide range of file encodings.")
 (define-public python-charset-normalizer
   (package
     (name "python-charset-normalizer")
-    (version "2.0.11")
+    (version "2.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "charset-normalizer" version))
        (sha256
-        (base32 "071pi2kd222rjjrjdllffqv3iz4bfaj93a9bfs65907fd6fqlfcq"))))
+        (base32 "04zlajr77f6c7ai59l46as1idi0jjgbvj72lh4v5wfpz2s070pjp"))))
     (build-system python-build-system)
     (arguments
      (list #:phases
@@ -19259,15 +19243,12 @@ from the header, as well as section details and data available.")
     (build-system python-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
-                  ,@(if (target-riscv64?)
-                      ;; TODO: Remove the conditional on staging.
-                      `((add-after 'unpack 'remove-test-hypothesis-deadlines
-                          (lambda _
-                            (substitute* "tests/test_make.py"
-                              (("assume, given") "assume, given, settings")
-                              (("( +)@given" all spaces)
-                               (string-append spaces "@settings(deadline=None)\n" all))))))
-                      '())
+                  (add-after 'unpack 'remove-test-hypothesis-deadlines
+                    (lambda _
+                      (substitute* "tests/test_make.py"
+                        (("assume, given") "assume, given, settings")
+                        (("( +)@given" all spaces)
+                         (string-append spaces "@settings(deadline=None)\n" all)))))
                   (replace 'check
                     (lambda* (#:key tests? #:allow-other-keys)
                       (when tests?
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index cb7f72e698..541e1e6c06 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -269,28 +269,32 @@ system, and the core design of Django is reused in Grantlee.")
   ;; the layout differs between them.
   (list (string-append "https://download.qt.io/official_releases/qt/"
                        (version-major+minor version) "/" version
+                       "/submodules/" component "-everywhere-opensource-src-"
+                       version ".tar.xz")
+        (string-append "https://download.qt.io/official_releases/qt/"
+                       (version-major+minor version) "/" version
                        "/submodules/" component "-everywhere-src-"
                        version ".tar.xz")
         (string-append "https://download.qt.io/archive/qt/"
                        (version-major+minor version) "/" version
-                       "/submodules/" component "-everywhere-src-"
+                       "/submodules/" component "-everywhere-opensource-src-"
                        version ".tar.xz")
         (let ((directory (string-append "qt5" (string-drop component 2))))
           (string-append "http://sources.buildroot.net/" directory "/"
-                         component "-everywhere-src-" version ".tar.xz"))
+                         component "-everywhere-opensource-src-" version ".tar.xz"))
         (string-append "https://distfiles.macports.org/qt5/"
-                       component "-everywhere-src-" version ".tar.xz")))
+                       component "-everywhere-opensource-src-" version ".tar.xz")))
 
 (define-public qtbase-5
   (package
     (name "qtbase")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
               (method url-fetch)
               (uri (qt-urls name version))
               (sha256
                (base32
-                "1y70libf2x52lpbqvhz10lpk7nyl1ajjwzjxly9pjdpfj4jsv7wh"))
+                "1p2fa94m1y8qzhdfi2d7dck93qh1lgsinibwl1wy92bwmacwfhhc"))
               ;; Use TZDIR to avoid depending on package "tzdata".
               (patches (search-patches "qtbase-use-TZDIR.patch"
                                        "qtbase-moc-ignore-gcc-macro.patch"
@@ -344,8 +348,7 @@ system, and the core design of Django is reused in Grantlee.")
        ("nss" ,nss)
        ("openssl" ,openssl)
        ("pcre2" ,pcre2)
-       ;; TODO: Switch to 'postgres' in the next rebuild cycle.
-       ("postgresql" ,postgresql-13)
+       ("postgresql" ,postgresql)
        ("pulseaudio" ,pulseaudio)
        ("sqlite" ,sqlite)
        ("unixodbc" ,unixodbc)
@@ -850,13 +853,13 @@ came with the @{qtgraphicaleffects} Qt 5 package.")
   (package
     (inherit qtbase-5)
     (name "qtsvg")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
               (method url-fetch)
               (uri (qt-urls name version))
               (sha256
                (base32
-                "0pjqrdmd1991x9h4rl8sf81pkd89hfd5h1a2gp3fjw96pk0w5hwb"))))
+                "0cdhmhxngv4y7kl5vbcii4l4anbz0hj7dvhlddy1agyl19j9xky4"))))
     (propagated-inputs `())
     (native-inputs (list perl))
     (inputs
@@ -901,8 +904,7 @@ HostLibraries=lib
 [EffectiveSourcePaths]
 HostPrefix=~a
 HostData=lib/qt5
-" out out qtbase)))
-               #t)))
+" out out qtbase))))))
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
              ;; Valid QT_BUILD_PARTS variables are:
@@ -911,8 +913,7 @@ HostData=lib/qt5
          (add-before 'check 'set-display
            (lambda _
              ;; make Qt render "offscreen", required for tests
-             (setenv "QT_QPA_PLATFORM" "offscreen")
-             #t)))))
+             (setenv "QT_QPA_PLATFORM" "offscreen"))))))
     (synopsis "Qt module for displaying SVGs")
     (description "The QtSvg module provides classes for displaying the
  contents of SVG files.")))
@@ -951,28 +952,17 @@ HostData=lib/qt5
 (define-public qtimageformats
   (package (inherit qtsvg-5)
     (name "qtimageformats")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1msk8a0z8rr16hkp2fnv668vf6wayiydqgc2mcklaa04rv3qb0mz"))
+               "1xjb2z2h1ajw7z9cwq8djpdvjwalpnmirwcwrlbjqv5r4ghmi82a"))
              (modules '((guix build utils)))
              (snippet
               '(begin
-                 (delete-file-recursively "src/3rdparty")
-                 #t))))
-    (arguments
-     (substitute-keyword-arguments (package-arguments qtsvg-5)
-       ((#:phases phases)
-        `(modify-phases ,phases
-           (add-after 'unpack 'fix-build
-             (lambda _
-               (substitute* "src/plugins/imageformats/jp2/qjp2handler.cpp"
-                 (("^#include <jasper/jasper.h>")
-                  "#include <jasper/jasper.h>\n#include <QtCore/qmath.h>"))
-               #t))))))
+                 (delete-file-recursively "src/3rdparty")))))
     (native-inputs `())
     (inputs
      (list jasper
@@ -989,13 +979,13 @@ support for MNG, TGA, TIFF and WBMP image formats.")))
 (define-public qtx11extras
   (package (inherit qtsvg-5)
     (name "qtx11extras")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0gkfzj195v9flwljnqpdz3a532618yn4h2577nlsai56x4p7053h"))))
+               "0wxsrnnkkn68myy211rfz98brs7j3qmx3hmy097vh5avgsmw11bn"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -1009,23 +999,24 @@ from within Qt 5.")))
 (define-public qtxmlpatterns
   (package (inherit qtsvg-5)
     (name "qtxmlpatterns")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1ypj5jpa31rlx8yfw3y9jia212lfnxvnqkvygs6ihjf3lxi23skn"))))
+               "065vj1gk5i4cg0f9spksyb9ps4px0vssx262y77aakvw408vfmq5"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
-       ((#:tests? _ #f) #f) ; TODO: Enable the tests
        ((#:phases phases)
         `(modify-phases ,phases
            (add-after 'unpack 'disable-network-tests
              (lambda _ (substitute* "tests/auto/auto.pro"
                          (("qxmlquery") "# qxmlquery")
-                         (("xmlpatterns ") "# xmlpatterns"))
-               #t))))))
+                         (("xmlpatterns ") "# xmlpatterns"))))
+           (add-after 'unpack 'skip-qquickxmllistmodel-test
+             (lambda _ (substitute* "tests/auto/auto.pro"
+                         ((".*qquickxmllistmodel.*") ""))))))))
     (native-inputs (list perl qtdeclarative-5))
     (inputs (list qtbase-5))
     (synopsis "Qt XML patterns module")
@@ -1036,13 +1027,13 @@ xmlpatternsvalidator.")))
 (define-public qtdeclarative-5
   (package (inherit qtsvg-5)
     (name "qtdeclarative")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0lancdn7y0lrlmyn5cbdm0izd5yprvd5n77nhkb7a3wl2sbx0066"))))
+               "0ji5131g7h2mrgxw1wxc5mcvmsn3fbw64j28gzpa25gv3vcnkhaw"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f)             ;TODO: Enable the tests
@@ -1055,8 +1046,17 @@ xmlpatternsvalidator.")))
                  ;; is provided by qtdeclarative-5.
                  (substitute*
                      "lib/cmake/Qt5QuickCompiler/Qt5QuickCompilerConfig.cmake"
-                   (("\\$\\{_qt5Core_install_prefix\\}") out)))
-               #t))))))
+                   (("\\$\\{_qt5Core_install_prefix\\}") out)))))
+           ;; TODO: Add phase unconditionally.
+           ,@(if (target-riscv64?)
+               '((add-after 'unpack 'fix-linking-riscv64
+                   (lambda _
+                     (substitute* "src/qml/qml.pro"
+                       (("DEFINES \\+= QT_NO_FOREACH")
+                        (string-append
+                          "isEqual(QT_ARCH, \"riscv64\"): QMAKE_LIBS += -latomic\n\n"
+                          "DEFINES += QT_NO_FOREACH"))))))
+               '())))))
     (native-inputs
      (list perl
            pkg-config
@@ -1204,13 +1204,13 @@ integrate QML code with JavaScript and C++.")
 (define-public qtconnectivity
   (package (inherit qtsvg-5)
     (name "qtconnectivity")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "185zci61ip1wpjrygcw2m6v55lvninc0b8y2p3jh6qgpf5w35003"))))
+               "0b2dnxw1rjbp1srhgns148cwl99f50mx29588dal3avv0f73s597"))))
     (native-inputs
      (list perl pkg-config qtdeclarative-5))
     (inputs
@@ -1222,13 +1222,13 @@ with Bluetooth and NFC.")))
 (define-public qtwebsockets-5
   (package (inherit qtsvg-5)
     (name "qtwebsockets")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0gr399fn5n8j3m9d3vv01vcbr1cb7pw043j04cnnxzrlvn2jvd50"))))
+               "0f120rfqnmlffjhrm5jbpipk1qsbzp1a2v3q8gz94hz6n9dqpav6"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -1284,13 +1284,13 @@ consume data received from the server, or both.")
 (define-public qtsensors
   (package (inherit qtsvg-5)
     (name "qtsensors")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0fa81r7bn1mf9ynwsx524a55dx1q0jb4vda6j48ssb4lx7wi201z"))))
+               "0zlhm4js02niibb23rw87wf4ik0gy4ai08fwprnwy7zf4rm1ss3d"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:parallel-tests? _ #f) #f) ; can lead to race condition
@@ -1299,9 +1299,8 @@ consume data received from the server, or both.")
            (add-after 'unpack 'fix-tests
              (lambda _
                (substitute* "tests/auto/qsensorgestures_gestures/tst_sensorgestures_gestures.cpp"
-                 (("2000") "5000")      ;lengthen test timeout
-                 (("QTest::newRow(\"twist\") << \"twist\"") "")) ;failing test
-               #t))))))
+                 (("2000") "5000")                                      ;lengthen test timeout
+                 (("QTest::newRow(\"twist\") << \"twist\"") ""))))))))  ;failing test
     (native-inputs
      (list perl qtdeclarative-5))
     (inputs (list qtbase-5))
@@ -1314,13 +1313,13 @@ recognition API for devices.")))
   (package
     (inherit qtsvg-5)
     (name "qtmultimedia")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1xbd6kc7i0iablqdkvfrajpi32cbq7j6ajbfyyyalcai1s0mhdqc"))
+               "0q76iy1frcgm85mid17lh4p6gnn04n19n6zklgpv4w3md1ng97xw"))
              (modules '((guix build utils)))
              (snippet
               '(begin
@@ -1328,8 +1327,7 @@ recognition API for devices.")))
                    "examples/multimedia/spectrum/3rdparty")
                  ;; We also prevent the spectrum example from being built.
                  (substitute* "examples/multimedia/multimedia.pro"
-                   (("spectrum") "#"))
-                 #t))))
+                   (("spectrum") "#"))))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:phases phases)
@@ -1453,14 +1451,14 @@ set of plugins for interacting with pulseaudio and GStreamer.")
 (define-public qtwayland
   (package (inherit qtsvg-5)
     (name "qtwayland")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (patches (search-patches "qtwayland-gcc-11.patch"))
              (sha256
               (base32
-               "1ddfx4nak16xx0zh1kl836zxvpbixmmjyplsmfmg65pqkwi34dqr"))))
+               "0yy8qf9kn15iqsxi2r7jbcsc0vsdyfz7bbxmfn4i9qmz1yvg0jgr"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:phases phases)
@@ -1474,13 +1472,11 @@ set of plugins for interacting with pulseaudio and GStreamer.")
                                   "m_waitingFrameCallbacks\\.empty\\(\\)\\);"))
                   "")
                  (("QTRY_COMPARE\\(bufferSpy\\.count\\(\\), 1\\);")
-                  ""))
-               #t))
+                  ""))))
            (add-before 'check 'set-test-environment
              (lambda _
                ;; Do not fail just because /etc/machine-id is missing.
-               (setenv "DBUS_FATAL_WARNINGS" "0")
-               #t))))))
+               (setenv "DBUS_FATAL_WARNINGS" "0")))))))
     (native-inputs
      (list glib perl pkg-config qtdeclarative-5))
     (inputs
@@ -1503,13 +1499,13 @@ compositor libraries.")))
 (define-public qtserialport
   (package (inherit qtsvg-5)
     (name "qtserialport")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "17gp5qzg4wdg8qlxk2p3mh8x1vk33rf33wic3fy0cws193bmkiar"))))
+               "0xg2djwhrj5jqamawlp75g70nmwbp2ph2hh1pm45s36jkxm0k7al"))))
     (native-inputs (list perl))
     (inputs
      (list qtbase-5 eudev))
@@ -1524,8 +1520,7 @@ compositor libraries.")))
                ;; otherwise the lib will be searched in LD_LIBRARY_PATH which
                ;; typically is not set in guix.
                (("^\\s*(udevLibrary->setFileNameAndVersion\\(QStringLiteral\\(\")(udev\"\\),\\s*[0-9]+\\);)" _ a b)
-                (string-append a (assoc-ref inputs "eudev") "/lib/lib" b)))
-             #t))))))
+                (string-append a (assoc-ref inputs "eudev") "/lib/lib" b)))))))))
     (synopsis "Qt Serial Port module")
     (description "The Qt Serial Port module provides the library for
 interacting with serial ports from within Qt.")))
@@ -1533,13 +1528,13 @@ interacting with serial ports from within Qt.")))
 (define-public qtserialbus
   (package (inherit qtsvg-5)
     (name "qtserialbus")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "125x6756fjpldqy6wbw6cg7ngjh2016aiq92bchh719z1mf7xsxf"))))
+               "180gm1jvqfn0h3251zafdd1wd3af00phwaa5qljsbrj6s6ywj79j"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:phases phases '%standard-phases)
@@ -1551,8 +1546,7 @@ interacting with serial ports from within Qt.")))
                                                       "/lib/libsocketcan.so")))
                  (substitute* "src/plugins/canbus/socketcan/libsocketcan.cpp"
                    (("QStringLiteral\\(\"socketcan\"\\)")
-                    (format #f "QStringLiteral(~s)" libcansocket.so)))
-                 #t)))))))
+                    (format #f "QStringLiteral(~s)" libcansocket.so))))))))))
     (inputs
      (list libsocketcan qtbase-5 qtserialport))
     (synopsis "Qt Serial Bus module")
@@ -1563,13 +1557,13 @@ and others.")))
 (define-public qtwebchannel-5
   (package (inherit qtsvg-5)
     (name "qtwebchannel")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1h9y634phvvk557mhmf9z4lmxr41rl8x9mqy2lzp31mk8ffffzqj"))))
+               "1w8mcpdqlphgg3a6yfq18liwlj2nkwrafv0n80h242x5l2mk3ljf"))))
     (native-inputs
      (list perl qtdeclarative-5 qtwebsockets-5))
     (inputs (list qtbase-5))
@@ -1619,21 +1613,20 @@ application).")
 (define-public qtwebglplugin
   (package (inherit qtsvg-5)
     (name "qtwebglplugin")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0ihlnhv8ldkqz82v3j7j22lrhk17b6ghra8sx85y2agd2ysq5rw1"))))
+               "1m0p4ssykw07lbip2qyv6w34f8ng13bxb63j0w446f5w0492nn9f"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:phases phases)
         `(modify-phases ,phases
            (add-after 'unpack 'disable-network-tests
              (lambda _ (substitute* "tests/plugins/platforms/platforms.pro"
-                         (("webgl") "# webgl"))
-               #t))))))
+                         (("webgl") "# webgl"))))))))
     (native-inputs '())
     (inputs
      (list mesa qtbase-5 qtdeclarative-5 qtwebsockets-5 zlib))
@@ -1648,13 +1641,13 @@ OpenGL ES 2.0 and can be used in HTML5 canvas elements")))
 (define-public qtwebview
   (package (inherit qtsvg-5)
     (name "qtwebview")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1rw1wibmbxlj6xc86qs3y8h42al1vczqiksyxzaylxs9gqb4d7xy"))))
+               "0arwaky3jy5ql3z4d8f7k7diidzb1kncdans7pn50hsa1bzacfal"))))
     (native-inputs
      (list perl))
     (inputs
@@ -1667,19 +1660,21 @@ native APIs where it makes sense.")))
 (define-public qtlocation
   (package (inherit qtsvg-5)
     (name "qtlocation")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (string-append "https://download.qt.io/official_releases/qt/"
-                                 (version-major+minor version) "/" version
-                                 "/submodules/" name "-everywhere-src-"
-                                 version ".tar.xz"))
+             (uri (qt-urls name version))
              (sha256
               (base32
-               "184jychnlfhplpwc5cdcsapwljgwvzk5qpf3val4kpq8w44wnkwq"))))
+               "0mlhhhcxx3gpr9kh04c6fljxcj50c2j21r0wb9f7d7nk4flip7b2"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
-       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
+       ((#:tests? _ #f) #f)   ; TODO: Enable the tests
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-before 'check 'pre-check
+             (lambda _
+               (setenv "HOME" "/tmp")))))))
     (native-inputs
      (list perl qtdeclarative-5 qtquickcontrols-5 qtserialport))
     (inputs
@@ -1723,13 +1718,13 @@ plugin for Adobe After Effects.")
 (define-public qttools-5
   (package (inherit qtsvg-5)
     (name "qttools")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1k618f7v6jaj0ygy8d7jvgb8zjr47sn55kiskbdkkizp3z7d12f1"))))
+               "0v7wkzq9i8w3qrw0z8al7lb6clr57lfisyb1fm9cnhi73fvph1vd"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -1772,13 +1767,13 @@ that helps in Qt development.")
 (define-public qtscript
   (package (inherit qtsvg-5)
     (name "qtscript")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0gk74hk488k9ldacxbxcranr3arf8ifqg8kz9nm1rgdgd59p36d2"))
+               "17yk0p8ci47xlfpllc17arlycng47wrnnskimskzz85bspabc8pm"))
              (patches (search-patches "qtscript-disable-tests.patch"))))
     (native-inputs
      (list perl qttools-5))
@@ -1792,13 +1787,13 @@ ECMAScript and Qt.")))
 (define-public qtquickcontrols-5
   (package (inherit qtsvg-5)
     (name "qtquickcontrols")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1dczakl868mg0lnwpf082jjc5976ycn879li1vqlgw5ihirzp4y3"))))
+               "0mjw25wcgd2bvjz9rr4qjydb423c63615rcx1vws4jmydqdihssr"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -1812,13 +1807,13 @@ can be used to build complete interfaces in Qt Quick.")))
 (define-public qtquickcontrols2-5
   (package (inherit qtsvg-5)
     (name "qtquickcontrols2")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "06c9vrwvbjmzapmfa25y34lgjkzg57xxbm92nr6wkv5qykjnq6v7"))))
+               "1cxg4ml07k1zcyi5m4lx06sz8f5l67isb5vhk7nakxm0wnn7p8y4"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -1839,13 +1834,13 @@ not available.")))
 (define-public qtgraphicaleffects
   (package (inherit qtsvg-5)
     (name "qtgraphicaleffects")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1r6zfc0qga2ax155js7c8y5rx6vgayf582s921j09mb797v6g3gc"))))
+               "0xznn5zqp6xrqfgl54l8cig9asqf9m2hz0p3ga514rh8spmdazr3"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -1862,13 +1857,13 @@ coloring, and many more.")))
 (define-public qtgamepad
   (package (inherit qtsvg-5)
     (name "qtgamepad")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "0p07bg93fdfn4gr2kv38qgnws5znhswajrxdfs8xc9l3i7vi2xn7"))))
+               "0wa4d8f025hlp4bmdzdy5wcahm9wjg6bkwig8dpw9nrsj3idz5b0"))))
     (native-inputs
      (list perl pkg-config))
     (inputs
@@ -1888,21 +1883,23 @@ and mobile applications targeting TV-like form factors.")))
 (define-public qtscxml
   (package (inherit qtsvg-5)
     (name "qtscxml")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1p5771b9hnpchfcdgy0zkhwg09a6xq88934aggp0rij1k85mkfb0"))
+               "0xf5mqsrw16h8xjglymgfc8qg2qa5bi4fgdl4j3dkhvvpr7vrphp"))
              (modules '((guix build utils)))
              (snippet
               '(begin
                  (delete-file-recursively "tests/3rdparty")
                  ;; the scion test refers to the bundled 3rd party test code.
                  (substitute* "tests/auto/auto.pro"
-                   (("scion") "#"))
-                 #t))))
+                   (("scion") "#"))))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg-5)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (inputs
      (list qtbase-5 qtdeclarative-5))
     (synopsis "Qt SCXML module")
@@ -1945,13 +1942,13 @@ information and perform area based monitoring.")
 (define-public qtpurchasing
   (package (inherit qtsvg-5)
     (name "qtpurchasing")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "09rjx53519dfk4qj2gbn3vlxyriasyb747wpg1p11y7jkwqhs4l7"))))
+               "04z6mwzn73gg56hgs7gividinfgndx4kmcnp7w6h3wamrdlkfdx7"))))
     (inputs
      (list qtbase-5 qtdeclarative-5))
     (synopsis "Qt Purchasing module")
@@ -1961,16 +1958,22 @@ purchasing goods and services.")))
 (define-public qtcharts
   (package (inherit qtsvg-5)
     (name "qtcharts")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "049x7z8zcp9jixmdv2fjscy2ggpd6za9hkdbb2bqp2mxjm0hwxg0"))))
+               "0y051i1837bfybkf8cm7cx8k5wjmbi47pxawaaz6wm0hd2z5b4qi"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
-       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'unpack 'remove-failing-test
+             (lambda _
+               (substitute* "tests/auto/auto.pro"
+                 (("qml") "# qml")
+                 (("qml-qtquicktest") "# qml-qtquicktest"))))))))
     (inputs
      (list qtbase-5 qtdeclarative-5))
     (synopsis "Qt Charts module")
@@ -1984,13 +1987,13 @@ selecting one of the charts themes.")
 (define-public qtdatavis3d
   (package (inherit qtsvg-5)
     (name "qtdatavis3d")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1zdn3vm0nfy9ny7c783aabp3mhlnqhi9fw2rljn7ibbksmsnasi2"))))
+               "0sczwqlc36jdywf7bqxz0hm6mr7fn8p1fsnc33jliiqzn9yrg77x"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -2007,23 +2010,13 @@ customized by using themes or by adding custom items and labels to them.")
 (define-public qtnetworkauth-5
   (package (inherit qtsvg-5)
     (name "qtnetworkauth")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "11fdgacv4syr8bff2vdw7rb0dg1gcqpdf37hm3pn31d6z91frhpw"))))
-    (arguments
-     (substitute-keyword-arguments (package-arguments qtsvg-5)
-       ((#:phases phases)
-        `(modify-phases ,phases
-           (add-after 'unpack 'remove-failing-test
-             (lambda _
-               ;; These tests can't find their test data.
-               (substitute* "tests/auto/auto.pro"
-                 (("oauth1 ") "# oauth1 "))
-               #t))))))
+               "0c7mz715rlpg0cqgs6s0aszmslyamkhnpamc1iij6i571sj5j2f1"))))
     (inputs
      (list qtbase-5))
     (synopsis "Qt Network Authorization module")
@@ -2053,13 +2046,13 @@ implementation of OAuth and OAuth2 authenticathon methods for Qt.")
 (define-public qtremoteobjects
   (package (inherit qtsvg-5)
     (name "qtremoteobjects")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1hngbp0vkr35rpsrac7b9vx6f360v8v2g0fffzm590l8j2ybd0b7"))))
+               "1m0xcqlbxsfn0cd4ajin1h3i4l51dajmkw91v0r4a61xi14i0kks"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:phases phases)
@@ -2073,8 +2066,7 @@ implementation of OAuth and OAuth2 authenticathon methods for Qt.")
                ;; disable failing tests: they need network
                (substitute* "tests/auto/auto.pro"
                  (("integration_multiprocess proxy_multiprocess integration_external restart")
-                   "integration_multiprocess"))
-               #t))))))
+                   "integration_multiprocess"))))))))
     (inputs
      (list qtbase-5 qtdeclarative-5))
     (synopsis "Qt Remote Objects module")
@@ -2086,14 +2078,13 @@ processes or computers.")))
 (define-public qtspeech
   (package (inherit qtsvg-5)
     (name "qtspeech")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
              (method url-fetch)
              (uri (qt-urls name version))
              (sha256
               (base32
-               "1xc3x3ghnhgchsg1kgj156yg69wn4rwjx8r28i1jd05hxjggn468"))))
-
+               "0xskp9dzjy5nqszygk8gwvjyiylgynx5sq3nk2vi3zwgfdh5jpm4"))))
     (arguments
      (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
@@ -2142,14 +2133,14 @@ using the Enchant spell-checking library.")
   (package
     (inherit qtsvg-5)
     (name "qtwebengine")
-    (version (package-version qtbase-5))
+    (version "5.15.5")
     (source
      (origin
        (method url-fetch)
        (uri (qt-urls name version))
        (sha256
         (base32
-         "1q4idxdm81sx102xc12ixj0xpfx52d6vwvs3jpapnkyq8c7cmby8"))
+         "0zahr9w6rqdxwh2whsgk3fhcszs7wa9j95lq4sqi8xzin2wcgl17"))
        (modules '((ice-9 ftw)
                   (ice-9 match)
                   (srfi srfi-1)
@@ -2185,6 +2176,13 @@ using the Enchant spell-checking library.")
                     "third_party/boringssl/src/third_party/fiat"
                     "third_party/breakpad"
                     "third_party/brotli"
+                    "third_party/catapult/common/py_vulcanize/py_vulcanize"
+                    "third_party/catapult/common/py_vulcanize/third_party"
+                    "third_party/catapult/third_party/beautifulsoup4"
+                    "third_party/catapult/third_party/html5lib-python"
+                    "third_party/catapult/third_party/polymer/components"
+                    "third_party/catapult/tracing"
+                    "third_party/catapult/tracing/third_party"
                     "third_party/ced"
                     "third_party/cld_3"
                     "third_party/closure_compiler"
@@ -2195,10 +2193,8 @@ using the Enchant spell-checking library.")
                     "third_party/dav1d"
                     "third_party/dawn"
                     "third_party/devtools-frontend"
-                    "third_party/devtools-frontend/src/front_end/third_party/fabricjs"
-                    "third_party/devtools-frontend/src/front_end/third_party/lighthouse"
-                    "third_party/devtools-frontend/src/front_end/third_party/wasmparser"
-                    "third_party/devtools-frontend/src/third_party/axe-core"
+                    "third_party/devtools-frontend/src/front_end/third_party"
+                    "third_party/devtools-frontend/src/third_party/typescript"
                     "third_party/emoji-segmenter"
                     "third_party/ffmpeg"
                     "third_party/googletest"
@@ -2213,6 +2209,7 @@ using the Enchant spell-checking library.")
                     "third_party/khronos"
                     "third_party/leveldatabase"
                     "third_party/libaddressinput"
+                    "third_party/libavif"
                     "third_party/libgifcodec"
                     "third_party/libjingle_xmpp"
                     "third_party/libjpeg_turbo"
@@ -2226,6 +2223,7 @@ using the Enchant spell-checking library.")
                     "third_party/libxml"
                     "third_party/libxslt"
                     "third_party/libyuv"
+                    "third_party/lottie"
                     "third_party/lss"
                     "third_party/mako"
                     "third_party/markupsafe"
@@ -2233,6 +2231,7 @@ using the Enchant spell-checking library.")
                     "third_party/metrics_proto"
                     "third_party/modp_b64"
                     "third_party/nasm"
+                    "third_party/node"
                     "third_party/one_euro_filter"
                     "third_party/openh264/src/codec/api/svc"
                     "third_party/opus"
@@ -2257,15 +2256,16 @@ using the Enchant spell-checking library.")
                     "third_party/skia/include/third_party/skcms/skcms.h"
                     "third_party/skia/include/third_party/vulkan"
                     "third_party/skia/third_party/skcms"
-                    "third_party/skia/third_party/vulkanmemoryallocator"
                     "third_party/smhasher"
                     "third_party/snappy"
                     "third_party/sqlite"
                     "third_party/usb_ids"
                     "third_party/usrsctp"
+                    "third_party/vulkan_memory_allocator"
                     "third_party/web-animations-js"
                     "third_party/webrtc"
-                    "third_party/webrtc/common_audio/third_party/fft4g"
+                    "third_party/webrtc/common_audio/third_party/ooura/fft_size_128"
+                    "third_party/webrtc/common_audio/third_party/ooura/fft_size_256"
                     "third_party/webrtc/common_audio/third_party/spl_sqrt_floor"
                     "third_party/webrtc/modules/third_party/fft"
                     "third_party/webrtc/modules/third_party/g711"
@@ -2276,7 +2276,7 @@ using the Enchant spell-checking library.")
                     "third_party/widevine/cdm/widevine_cdm_common.h"
                     "third_party/widevine/cdm/widevine_cdm_version.h"
                     "third_party/woff2"
-                    "third_party/yasm"
+                    "third_party/xcbproto"
                     "third_party/zlib"
                     "url/third_party/mozilla"
                     "v8/src/third_party/utf8-decoder"
@@ -2349,16 +2349,19 @@ using the Enchant spell-checking library.")
 
                  ;; Use relative header locations instead of hard coded ones.
                  (substitute*
-                     "base/third_party/dynamic_annotations/dynamic_annotations.c"
+                   "base/third_party/dynamic_annotations/dynamic_annotations.c"
                    (("base/third_party/valgrind") "valgrind"))
                  (substitute*
-                     "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h"
+                   '("third_party/breakpad/breakpad/src/common/linux/http_upload.cc"
+                     "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h")
                    (("third_party/curl") "curl"))
                  (substitute*
-                     '("components/viz/common/gpu/vulkan_context_provider.h"
-                       "components/viz/common/resources/resource_format_utils_vulkan.h"
-                       "gpu/config/gpu_util.cc")
-                   (("third_party/vulkan/include/")
+                   '("components/viz/common/gpu/vulkan_context_provider.h"
+                     "components/viz/common/resources/resource_format_utils.h"
+                     "gpu/config/gpu_info_collector_win.cc"
+                     "gpu/config/gpu_util.cc"
+                     "gpu/config/vulkan_info.h")
+                   (("third_party/vulkan_headers/include/")
                     ""))
 
                  ;; Replace Google Analytics bundle with an empty file and hope
@@ -2378,6 +2381,7 @@ using the Enchant spell-checking library.")
            flex
            gperf
            ninja
+           node
            perl
            pkg-config
            python2-six
@@ -2405,6 +2409,7 @@ using the Enchant spell-checking library.")
            libxcb
            libxcomposite
            libxcursor
+           libxkbfile
            libxi
            libxkbcommon
            ;; FIXME: libxml2 needs to built with icu support though it links to
@@ -2981,7 +2986,7 @@ module provides support functions to the automatically generated code.")
 (define-public python-pyqt
   (package
     (name "python-pyqt")
-    (version "5.15.2")
+    (version "5.15.5")
     (source
       (origin
         (method url-fetch)
@@ -2994,7 +2999,7 @@ module provides support functions to the automatically generated code.")
         (file-name (string-append "PyQt5-" version ".tar.gz"))
         (sha256
          (base32
-          "1z74295i69cha52llsqffzhb5zz7qnbjc64h8qg21l91jgf0harp"))
+          "0aya963kkmbwfwmpd0p6k85y4g7wl5zarjqxxfgir403zalbf4dl"))
         (patches (search-patches "pyqt-configure.patch"))))
     (build-system gnu-build-system)
     (native-inputs
@@ -3072,14 +3077,14 @@ contain over 620 classes.")
 (define-public python-pyqt5-sip
   (package
     (name "python-pyqt5-sip")
-    (version "12.8.1")
+    (version "12.10.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "PyQt5_sip" version))
        (sha256
         (base32
-         "1gg032ys4pccwkdzmdryadc9a4lq85nr05pag9swrsdykbdl9s9h"))))
+         "09771b6fdn0rx34l5a0wzcd899yd57zxp5sw3bsqhd25biwhiq4p"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f)) ;; No test code.
@@ -3091,7 +3096,7 @@ contain over 620 classes.")
 (define-public python-pyqtwebengine
   (package
     (name "python-pyqtwebengine")
-    (version "5.15.2")
+    (version "5.15.5")
     (source
      (origin
        (method url-fetch)
@@ -3103,7 +3108,7 @@ contain over 620 classes.")
                                  "/PyQtWebEngine-" version ".tar.gz")))
        (sha256
         (base32
-         "0d56ak71r14w4f9r96vaj34qcn2rbln3s6ildvvyc707fjkzwwjd"))))
+         "0hdr0g0rzlhsnylhfk826pq1lw8p9dqcr8yma2wy9dgjrj6n0ixb"))))
     (build-system gnu-build-system)
     (native-inputs
      (list python python-sip
@@ -3753,7 +3758,7 @@ color-related widgets.")
 (define-public python-shiboken-2
   (package
     (name "python-shiboken-2")
-    (version "5.15.2")
+    (version "5.15.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://download.qt.io/official_releases"
@@ -3762,7 +3767,7 @@ color-related widgets.")
                                   version ".tar.xz"))
               (sha256
                (base32
-                "060ljj1nzyp4zfz2vasbv2i7gs5rfkkjwxxbisd0fdw01d5m01mk"))))
+                "0cwvw6695215498rsbm2xzkwaxdr3w7zfvy4kc62c01k6pxs881r"))))
     (build-system cmake-build-system)
     (inputs
      (list clang-toolchain
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index c7d820e9e9..0fda93fd59 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -3113,24 +3113,40 @@ two hashes.")
     (home-page "https://github.com/liufengyun/hashdiff")
     (license license:expat)))
 
-(define-public ruby-hydra
+(define-public ruby-hydra-minimal
   ;; No releases yet.
   (let ((commit "5abfa378743756ae4d9306cc134bcc482f5c9525")
         (revision "0"))
     (package
-      (name "ruby-hydra")
+      (name "ruby-hydra-minimal")
       (version (git-version "0.0" revision commit))
       (home-page "https://github.com/hyphenation/hydra")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference (url home-page) (commit commit)))
                 (file-name (git-file-name name version))
+                ;; byebug is a non-essential debugging utility that brings in
+                ;; many dependencies.
+                (patches (search-patches "ruby-hydra-minimal-no-byebug.patch"))
                 (sha256
                  (base32
                   "1cik398l2765y3d9sdhjzki3303hkry58ac6jlkiy7iy62nm529f"))))
       (build-system ruby-build-system)
       (arguments
-       '(#:phases (modify-phases %standard-phases
+       ;; Avoid rspec dependency.
+       '(#:tests? #f))
+      (synopsis "Ruby hyphenation patterns")
+      (description
+       "ruby-hydra-minimal is a Ruby library for working with hyphenation patterns.
+It is a low-dependency variant of ruby-hydra.")
+      (license license:expat))))
+
+(define-public ruby-hydra
+  (package
+    (inherit ruby-hydra-minimal)
+    (name "ruby-hydra")
+    (arguments
+        '(#:phases (modify-phases %standard-phases
                     (add-after 'unpack 'make-files-writable
                       (lambda _
                         (for-each make-file-writable (find-files "."))
@@ -3138,14 +3154,12 @@ two hashes.")
                     (replace 'check
                       (lambda _
                         (invoke "rspec"))))))
-      (native-inputs
-       (list ruby-rspec))
-      (propagated-inputs
-       (list ruby-byebug))
-      (synopsis "Ruby hyphenation patterns")
-      (description
-       "ruby-hydra is a Ruby library for working with hyphenation patterns.")
-      (license license:expat))))
+    (native-inputs
+     (list ruby-rspec))
+    (propagated-inputs
+     (list ruby-byebug))
+    (description
+     "ruby-hydra is a Ruby library for working with hyphenation patterns.")))
 
 (define-public ruby-shindo
   (package
@@ -5006,19 +5020,16 @@ to reproduce user environments.")
                (base32
                 "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy"))))))
 
-;; TODO: In the next rebuild cycle, provide texlive a version of ruby-hydra
-;; that does not depend on byebug and rspec, so that their dependencies can
-;; be updated more freely.  For now pin this version to avoid rebuilds.
-(define-public ruby-nokogiri-1.10
+(define-public ruby-nokogiri
   (package
     (name "ruby-nokogiri")
-    (version "1.10.9")
+    (version "1.12.5")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "nokogiri" version))
               (sha256
                (base32
-                "12j76d0bp608932xkzmfi638c7aqah57l437q8494znzbj610qnm"))))
+                "1v02g7k7cxiwdcahvlxrmizn3avj2q6nsjccgilq1idc89cr081b"))))
     (build-system ruby-build-system)
     (arguments
      ;; Tests fail because Nokogiri can only test with an installed extension,
@@ -5027,28 +5038,13 @@ to reproduce user environments.")
        #:gem-flags (list "--" "--use-system-libraries"
                          (string-append "--with-xml2-include="
                                         (assoc-ref %build-inputs "libxml2")
-                                        "/include/libxml2" ))
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'build 'patch-extconf
-           ;; 'pkg-config' is not included in the GEM_PATH during
-           ;; installation, so we add it directly to the load path.
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let* ((pkg-config (assoc-ref inputs "ruby-pkg-config")))
-               (substitute* "ext/nokogiri/extconf.rb"
-                 (("gem 'pkg-config'.*")
-                  (string-append "$:.unshift '"
-                                 pkg-config "/lib/ruby/vendor_ruby"
-                                 "/gems/pkg-config-"
-                                 ,(package-version ruby-pkg-config)
-                                 "/lib'\n"))))
-             #t)))))
+                                        "/include/libxml2" ))))
     (native-inputs
      (list ruby-hoe))
     (inputs
      (list zlib libxml2 libxslt))
     (propagated-inputs
-     (list ruby-mini-portile-2 ruby-pkg-config))
+     (list ruby-mini-portile-2.6.1 ruby-pkg-config))
     (synopsis "HTML, XML, SAX, and Reader parser for Ruby")
     (description "Nokogiri (鋸) parses and searches XML/HTML, and features
 both CSS3 selector and XPath 1.0 support.")
@@ -5067,26 +5063,6 @@ both CSS3 selector and XPath 1.0 support.")
                (base32
                 "1lvxm91hi0pabnkkg47wh1siv56s6slm2mdq1idfm86dyfidfprq"))))))
 
-(define-public ruby-nokogiri
-  (package
-    (inherit ruby-nokogiri-1.10)
-    (version "1.12.5")
-    (source (origin
-              (method url-fetch)
-              (uri (rubygems-uri "nokogiri" version))
-              (sha256
-               (base32
-                "1v02g7k7cxiwdcahvlxrmizn3avj2q6nsjccgilq1idc89cr081b"))))
-    (arguments
-     '(#:tests? #f                      ;XXX: no tests in rubygem
-       #:gem-flags (list "--" "--use-system-libraries"
-                         (string-append "--with-xml2-include="
-                                        (assoc-ref %build-inputs "libxml2")
-                                        "/include/libxml2"))))
-    (propagated-inputs
-     (modify-inputs (package-propagated-inputs ruby-nokogiri-1.10)
-       (replace "ruby-mini-portile" ruby-mini-portile-2.6.1)))))
-
 (define-public ruby-method-source
   (package
     (name "ruby-method-source")
@@ -6756,8 +6732,7 @@ tree-like structures.  It is similar to Ruby's built-in @code{TSort} module.")
       (build-system ruby-build-system)
       (propagated-inputs
        (list ruby-tdiff
-             ;; Use a fixed version to prevent rebuilds; see ruby-nokogiri TODO.
-             ruby-nokogiri-1.10))
+             ruby-nokogiri))
       (native-inputs
        (list ruby-rspec ruby-yard ruby-rubygems-tasks))
       (synopsis "Calculate the differences between two XML/HTML documents")
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
index 5801a00f2b..25295a283e 100644
--- a/gnu/packages/rust.scm
+++ b/gnu/packages/rust.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2016 Nikita <nikita@n0.is>
 ;;; Copyright © 2017 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2017, 2018 Nikolai Merinov <nikolai.merinov@member.fsf.org>
-;;; Copyright © 2017, 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2019-2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Danny Milosavljevic <dannym+a@scratchpost.org>
 ;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
@@ -14,6 +14,7 @@
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 (unmatched parenthesis <paren@disroot.org>
 ;;; Copyright © 2022 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2022 Jim Newsome <jnewsome@torproject.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -99,6 +100,7 @@
     ("armhf-linux"    "armv7-unknown-linux-gnueabihf")
     ("aarch64-linux"  "aarch64-unknown-linux-gnu")
     ("mips64el-linux" "mips64el-unknown-linux-gnuabi64")
+    ("riscv64-linux"  "riscv64gc-unknown-linux-gnu")
     (_                (nix-system->gnu-triplet system))))
 
 (define* (rust-uri version #:key (dist "static"))
@@ -136,25 +138,26 @@
       (file-name (git-file-name name (git-version version revision commit)))
       (sha256
        (base32
-        "0f7kh4n2663sn0z3xib8gzw0s97qpvwag40g2vs3bfjlrbpgi9z0")))))
+        "0f7kh4n2663sn0z3xib8gzw0s97qpvwag40g2vs3bfjlrbpgi9z0"))
+      (patches (search-patches "mrustc-riscv64-support.patch")))))
 
-;;; Rust 1.39 is special in that it is built with mrustc, which shortens the
+;;; Rust 1.54 is special in that it is built with mrustc, which shortens the
 ;;; bootstrap path.
-(define rust-1.39
+(define rust-bootstrap
   (package
     (name "rust")
-    (version "1.39.0")
+    (version "1.54.0")
     (source
      (origin
        (method url-fetch)
        (uri (rust-uri version))
-       (sha256 (base32 "0mwkc1bnil2cfyf6nglpvbn2y0zfbv44zfhsd5qg4c9rm6vgd8dl"))
+       (sha256 (base32 "0xk9dhfff16caambmwij67zgshd8v9djw6ha0fnnanlv7rii31dc"))
        (modules '((guix build utils)))
-       (snippet '(for-each delete-file-recursively
-                           '("src/llvm-emscripten"
-                             "src/llvm-project"
-                             "vendor/jemalloc-sys/jemalloc")))
-       (patches (search-patches "rustc-1.39.0-src.patch"))
+       (snippet
+        '(begin
+           (for-each delete-file-recursively
+                     '("src/llvm-project"))))
+       (patches (search-patches "rustc-1.54.0-src.patch"))
        (patch-flags '("-p0"))))         ;default is -p1
     (outputs '("out" "cargo"))
     (properties '((timeout . 72000)           ;20 hours
@@ -162,12 +165,19 @@
     (build-system gnu-build-system)
     (inputs
      `(("libcurl" ,curl)
-       ("libssh2" ,libssh2)
-       ("llvm" ,llvm-9)
-       ("openssl" ,openssl)
+       ("llvm" ,llvm)
+       ("openssl" ,openssl-1.1)
        ("zlib" ,zlib)))
     (native-inputs
      `(("bison" ,bison)
+       ;; A compiler bug in gcc 10/11/12/13 prevents us from using gcc-10.4. See:
+       ;; https://github.com/thepowersgang/mrustc/issues/266
+       ;; https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105860
+       ("gcc" ,gcc-9)
+       ;; TODO: STARTFILE_PREFIX_SPEC is fixed on gcc<10 on core-updates.
+       ,@(if (target-riscv64?)
+           `(("gcc:lib" ,gcc-9 "lib"))
+           '())
        ("flex" ,flex)
        ("pkg-config" ,pkg-config)
        ;; Required for the libstd sources.
@@ -206,25 +216,24 @@
              ;; to be at this location, and it simplifies things to make it
              ;; so.
              (symlink (getcwd)
-                      (string-append "../mrustc/rustc-" ,version "-src"))))
+                      (string-append "../mrustc/rustc-" ,version "-src"))
+             (with-output-to-file "dl-version"
+               (lambda _
+                 (format #t "~a~%"
+                         ,version)))))
          (add-after 'setup-mrustc-sources 'patch-makefiles
            ;; This disables building the (unbundled) LLVM.
            (lambda* (#:key inputs parallel-build? #:allow-other-keys)
-             (let ((llvm (assoc-ref inputs "llvm"))
-                   (job-spec (format #f "-j~a"
-                                     (if parallel-build?
-                                         (number->string (parallel-job-count))
-                                         "1"))))
+             (let ((llvm (assoc-ref inputs "llvm")))
                (with-directory-excursion "../mrustc"
                  (substitute* '("minicargo.mk"
                                 "run_rustc/Makefile")
                    ;; Use the system-provided LLVM.
                    (("LLVM_CONFIG := .*")
-                    (string-append "LLVM_CONFIG := " llvm "/bin/llvm-config\n"))
-                   (("\\$\\(LLVM_CONFIG\\): .*")
-                    "$(LLVM_CONFIG):\n")
-                   (("\\$Vcd \\$\\(RUSTCSRC\\)build && \\$\\(MAKE\\).*")
-                    "true\n"))
+                    (string-append "LLVM_CONFIG := " llvm "/bin/llvm-config\n")))
+                 (substitute* "minicargo.mk"
+                   ;; Do not try to fetch sources from the Internet.
+                   (("@curl.*") ""))
                  (substitute* "Makefile"
                    ;; Patch date and git obtained version information.
                    ((" -D VERSION_GIT_FULLHASH=.*")
@@ -269,9 +278,6 @@
              (setenv "CXX" "g++")
              ;; The Guix LLVM package installs only shared libraries.
              (setenv "LLVM_LINK_SHARED" "1")
-             ;; This is a workaround for
-             ;; https://github.com/thepowersgang/mrustc/issues/138.
-             (setenv "LIBSSH2_SYS_USE_PKG_CONFIG" "yes")
              ;; rustc still insists on having 'cc' on PATH in some places
              ;; (e.g. when building the 'test' library crate).
              (mkdir-p "/tmp/bin")
@@ -283,22 +289,36 @@
              (let* ((src-root (getcwd))
                     (job-count (if parallel-build?
                                    (parallel-job-count)
-                                   1))
-                    (job-spec (string-append "-j" (number->string job-count))))
+                                   1)))
                ;; Adapted from:
-               ;; https://github.com/dtolnay/bootstrap/blob/master/build.sh.
+               ;; https://github.com/dtolnay/bootstrap/blob/master/build-1.54.0.sh.
                (chdir "../mrustc")
-               (setenv "MINICARGO_FLAGS" job-spec)
+               ;; Use PARLEVEL since both minicargo and mrustc use it
+               ;; to set the level of parallelism.
+               (setenv "PARLEVEL" (number->string job-count))
                (setenv "CARGO_BUILD_JOBS" (number->string job-count))
+               (display "Building mrustc...\n")
+               (apply invoke "make" make-flags)
+
+               ;; This doesn't seem to build anything, but it
+               ;; sets additional minicargo flags.
+               (display "Building RUSTCSRC...\n")
+               (apply invoke "make" "RUSTCSRC" make-flags)
+
+               ;; This probably doesn't need to be called explicitly.
+               (display "Building LIBS...\n")
+               (apply invoke "make" "-f" "minicargo.mk" "LIBS" make-flags)
+
                (display "Building rustc...\n")
                (apply invoke "make" "-f" "minicargo.mk" "output/rustc"
-                      job-spec make-flags)
+                      make-flags)
+
                (display "Building cargo...\n")
                (apply invoke "make" "-f" "minicargo.mk" "output/cargo"
-                      job-spec make-flags)
+                      make-flags)
+
+               ;; This one isn't listed in the build script.
                (display "Rebuilding stdlib with rustc...\n")
-               ;; Note: invoking make with -j would cause a compiler error
-               ;; (unexpected panic).
                (apply invoke "make" "-C" "run_rustc" make-flags))))
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
@@ -324,42 +344,38 @@
 safety and thread safety guarantees.")
     (home-page "https://github.com/thepowersgang/mrustc")
 
-    ;; So far mrustc is (x86_64|aarch64)-only.  It may support i686 soon:
+    ;; The intermediate generated code is known to be inefficient and
+    ;; therefore the build process needs 8GB of RAM while building.
+    ;; It may support i686 soon:
     ;; <https://github.com/thepowersgang/mrustc/issues/78>.
-    (supported-systems '("x86_64-linux" "aarch64-linux"))
+    (supported-systems '("x86_64-linux" "aarch64-linux" "riscv64-linux"))
 
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define rust-1.40
+(define rust-1.55
   (package
     (name "rust")
-    (version "1.40.0")
+    (version "1.55.0")
     (source
      (origin
        (method url-fetch)
        (uri (rust-uri version))
-       (sha256 (base32 "1ba9llwhqm49w7sz3z0gqscj039m53ky9wxzhaj11z6yg1ah15yx"))
+       (sha256 (base32 "07l28f7grdmi65naq71pbmvdd61hwcpi40ry7kp7dy7m233rldxj"))
        (modules '((guix build utils)))
-       ;; llvm-emscripten is no longer bundled, as that codegen backend got
-       ;; removed.
-       (snippet '(for-each delete-file-recursively
-                           '("src/llvm-project"
-                             "vendor/jemalloc-sys/jemalloc")))))
+       (snippet
+        '(begin
+           (for-each delete-file-recursively
+                     '("src/llvm-project"
+                       "vendor/tikv-jemalloc-sys/jemalloc"))
+           ;; Add support for riscv64-linux.
+           (substitute* "vendor/tikv-jemallocator/src/lib.rs"
+             (("    target_arch = \"s390x\"," all)
+              (string-append all "\n    target_arch = \"riscv64\",")))))))
     (outputs '("out" "cargo"))
     (properties '((timeout . 72000)           ;20 hours
                   (max-silent-time . 18000))) ;5 hours (for armel)
     (build-system gnu-build-system)
-    ;; Rust 1.40 does not ship rustc-internal libraries by default (see
-    ;; rustc-dev-split). This means that librustc_driver.so is no longer
-    ;; available in lib/rustlib/$target/lib, which is the directory
-    ;; included in the runpath of librustc_codegen_llvm-llvm.so.  This is
-    ;; detected by our validate-runpath phase as an error, but it is
-    ;; harmless as the codegen backend is loaded by librustc_driver.so
-    ;; itself, which must at that point have been already loaded.  As such,
-    ;; we skip validating the runpath for Rust 1.40.  Rust 1.41 stopped
-    ;; putting the codegen backend in a separate library, which makes this
-    ;; workaround only necessary for this release.
     (arguments
      `(#:validate-runpath? #f
        ;; Only the final Rust is tested, not the intermediate bootstrap ones,
@@ -380,24 +396,16 @@ safety and thread safety guarantees.")
              (setenv "CC" (search-input-file inputs "/bin/gcc"))
              ;; The Guix LLVM package installs only shared libraries.
              (setenv "LLVM_LINK_SHARED" "1")))
+         (add-after 'unpack 'set-linker-locale-to-utf8
+           (lambda _
+             (substitute* (find-files "." "^linker.rs$")
+               (("linker.env\\(\"LC_ALL\", \"C\"\\);")
+                "linker.env(\"LC_ALL\", \"en_US.UTF-8\");"))))
          (add-after 'unpack 'add-cc-shim-to-path
            (lambda _
              (mkdir-p "/tmp/bin")
              (symlink (which "gcc") "/tmp/bin/cc")
              (setenv "PATH" (string-append "/tmp/bin:" (getenv "PATH")))))
-         (add-after 'unpack 'neuter-tidy
-           ;; We often need to patch tests with various Guix-specific paths.
-           ;; This often increases the line length and makes tidy, rustc's
-           ;; style checker, complain.  We could insert additional newlines or
-           ;; add an "// ignore-tidy-linelength" comment, but as an ignore
-           ;; comment must be used, both approaches are fragile due to
-           ;; upstream formatting changes.  As such, disable running the
-           ;; linter during tests, since it's intended for rustc developers
-           ;; anyway.
-           (lambda _
-             (substitute* "src/bootstrap/builder.rs"
-               ((".*::Tidy,.*")
-                ""))))
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
@@ -443,13 +451,14 @@ ar = \"" binutils "/bin/ar" "\"
 [dist]
 ") port))))))
          (replace 'build
+           ;; The standard library source location moved in this release.
            (lambda* (#:key parallel-build? #:allow-other-keys)
              (let ((job-spec (string-append
                               "-j" (if parallel-build?
                                        (number->string (parallel-job-count))
                                        "1"))))
                (invoke "./x.py" job-spec "build" "--stage=1"
-                       "src/libstd"
+                       "library/std"
                        "src/tools/cargo"))))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
@@ -490,12 +499,12 @@ ar = \"" binutils "/bin/ar" "\"
      `(("cmake" ,cmake-minimal)
        ("pkg-config" ,pkg-config)       ; For "cargo"
        ("python" ,python-wrapper)
-       ("rustc-bootstrap" ,rust-1.39)
-       ("cargo-bootstrap" ,rust-1.39 "cargo")
+       ("rustc-bootstrap" ,rust-bootstrap)
+       ("cargo-bootstrap" ,rust-bootstrap "cargo")
        ("which" ,which)))
     (inputs
      `(("jemalloc" ,jemalloc)
-       ("llvm" ,llvm-9)
+       ("llvm" ,llvm)
        ("openssl" ,openssl)
        ("libssh2" ,libssh2)             ; For "cargo"
        ("libcurl" ,curl)))              ; For "cargo"
@@ -519,10 +528,10 @@ safety and thread safety guarantees.")
     ;; Dual licensed.
     (license (list license:asl2.0 license:expat))))
 
-(define rust-1.41
+(define rust-1.56
   (let ((base-rust (rust-bootstrapped-package
-                    rust-1.40 "1.41.1"
-                    "0ws5x0fxv57fyllsa6025h3q6j9v3m8nb3syl4x0hgkddq0kvj9q")))
+                    rust-1.55 "1.56.1"
+                    "04cmqx7nn63hzz7z27b2b0dj2qx18rck9ifvip43s6dampx8v2f3")))
     (package
       (inherit base-rust)
       (arguments
@@ -539,115 +548,66 @@ safety and thread safety guarantees.")
                     (string-append name "\"" ,%cargo-reference-hash "\"")))
                  (generate-all-checksums "vendor"))))))))))
 
-(define rust-1.42
-  (rust-bootstrapped-package
-   rust-1.41 "1.42.0" "0x9lxs82may6c0iln0b908cxyn1cv7h03n5cmbx3j1bas4qzks6j"))
-
-(define rust-1.43
-  (rust-bootstrapped-package
-   rust-1.42 "1.43.0" "18akhk0wz1my6y9vhardriy2ysc482z0fnjdcgs9gy59kmnarxkm"))
-
-;; This version requires llvm <= 11.
-(define rust-1.44
-  (rust-bootstrapped-package
-   rust-1.43 "1.44.1"
-   "0ww4z2v3gxgn3zddqzwqya1gln04p91ykbrflnpdbmcd575n8bky"))
-
-(define rust-1.45
-  (let ((base-rust (rust-bootstrapped-package
-                    rust-1.44 "1.45.2"
-                    "0273a1g3f59plyi1n0azf21qjzwml1yqdnj5z472crz37qggr8xp")))
-    (package
-      (inherit base-rust)
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'set-linker-locale-to-utf8
-               (lambda _
-                 (substitute* (find-files "." "^linker.rs$")
-                   (("linker.env\\(\"LC_ALL\", \"C\"\\);")
-                    "linker.env(\"LC_ALL\", \"en_US.UTF-8\");")))))))))))
-
-(define rust-1.46
-  (rust-bootstrapped-package
-   rust-1.45 "1.46.0" "0a17jby2pd050s24cy4dfc0gzvgcl585v3vvyfilniyvjrqknsid"))
-
-(define rust-1.47
-  (let ((base-rust (rust-bootstrapped-package
-                    rust-1.46 "1.47.0"
-                    "07fqd2vp7cf1ka3hr207dnnz93ymxml4935vp74g4is79h3dz19i")))
-    (package/inherit base-rust
-      (arguments
-       (substitute-keyword-arguments (package-arguments base-rust)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (replace 'build
-               ;; The standard library source location moved in this release.
-               (lambda* (#:key parallel-build? #:allow-other-keys)
-                 (let ((job-spec (string-append
-                                  "-j" (if parallel-build?
-                                           (number->string (parallel-job-count))
-                                           "1"))))
-                   (invoke "./x.py" job-spec "build" "--stage=1"
-                           "library/std"
-                           "src/tools/cargo")))))))))))
-
-(define rust-1.48
-  (rust-bootstrapped-package
-   rust-1.47 "1.48.0" "0fz4gbb5hp5qalrl9lcl8yw4kk7ai7wx511jb28nypbxninkwxhf"))
-
-(define rust-1.49
-  (rust-bootstrapped-package
-   rust-1.48 "1.49.0" "0yf7kll517398dgqsr7m3gldzj0iwsp3ggzxrayckpqzvylfy2mm"))
-
-(define rust-1.50
+(define rust-1.57
   (rust-bootstrapped-package
-   rust-1.49 "1.50.0" "0pjs7j62maiyvkmhp9zrxl528g2n0fphp4rq6ap7aqdv0a6qz5wm"))
+   ;; Verified that it *doesn't* build with 1.55. e.g.:
+   ;; * feature `edition2021` is required
+   rust-1.56 "1.57.0" "06jw8ka2p3kls8p0gd4p0chhhb1ia1mlvj96zn78n7qvp71zjiim"))
 
-(define rust-1.51
+(define rust-1.58
   (rust-bootstrapped-package
-   rust-1.50 "1.51.0" "0ixqkqglv3isxbvl4ldr4byrkx692wghsz3fasy1pn5kr2prnsvs"))
+   ;; Verified that it *doesn't* build with 1.56. e.g.:
+   ;; * error: attributes starting with `rustc` are reserved for use by the
+   ;;   `rustc` compiler
+   ;; * error: cannot find attribute `rustc_do_not_const_check` in this scope
+   ;; * error[E0522]: definition of an unknown language item:
+   ;;   `const_eval_select_ct`
+   rust-1.57 "1.58.1" "1iq7kj16qfpkx8gvw50d8rf7glbm6s0pj2y1qkrz7mi56vfsyfd8"))
 
-;;; The LLVM requiriment has been bumped to version 10 in Rust 1.52.  Use the
-;;; latest available.
-(define rust-1.52
-  (let ((base-rust (rust-bootstrapped-package
-                    rust-1.51 "1.52.1"
-                    "165zs3xzp9dravybwslqs1qhn35agp6wacmzpymqg3qfdni26vrs")))
+(define rust-1.59
+  (let ((base-rust
+          (rust-bootstrapped-package
+            ;; Verified that it *doesn't* build with 1.57. e.g.:
+            ;; * error: `doc(primitive)` should never have been stable
+            ;; * error[E0522]: definition of an unknown language item:
+            ;;   `generator_return`
+            ;; * error[E0206]: the trait `Copy` may not be implemented for this type
+            rust-1.58 "1.59.0" "1yc5bwcbmbwyvpfq7zvra78l0r8y3lbv60kbr62fzz2vx2pfxj57")))
     (package
       (inherit base-rust)
-      (inputs (alist-replace "llvm" (list llvm-12)
-                             (package-inputs base-rust))))))
-
-(define rust-1.53
-  (rust-bootstrapped-package
-   rust-1.52 "1.53.0" "1f95p259dfp5ca118bg107rj3rqwlswy65dxn3hg8sqgl4wwmxsw"))
-
-(define rust-1.54
-  (let ((base-rust
-         (rust-bootstrapped-package
-          rust-1.53
-          "1.54.0" "0xk9dhfff16caambmwij67zgshd8v9djw6ha0fnnanlv7rii31dc")))
-    (package/inherit base-rust
-      (source
-       (origin
-         (inherit (package-source base-rust))
-         (snippet '(delete-file-recursively "src/llvm-project")))))))
-
-(define rust-1.55
-  (rust-bootstrapped-package
-   rust-1.54 "1.55.0" "07l28f7grdmi65naq71pbmvdd61hwcpi40ry7kp7dy7m233rldxj"))
+        (arguments
+         (if (target-riscv64?)
+           (substitute-keyword-arguments (package-arguments base-rust)
+             ((#:phases phases)
+              `(modify-phases ,phases
+                 (add-after 'unpack 'revert-riscv-pause-instruction
+                   (lambda _
+                     ;; This fails with:
+                     ;; error: unknown directive, referring to '.insn'.
+                     ;; This is due to building with llvm < 14.
+                     ;; https://github.com/rust-lang/stdarch/issues/1291
+                     ;; Partial roll-back from this commit:
+                     ;; https://github.com/rust-lang/stdarch/pull/1271
+                     (substitute*
+                       "library/stdarch/crates/core_arch/src/riscv_shared/mod.rs"
+                       (("\\.insn i 0x0F, 0, x0, x0, 0x010") ".word 0x0100000F")))))))
+           (package-arguments base-rust))))))
 
-(define rust-1.56
+(define rust-1.60
   (rust-bootstrapped-package
-   rust-1.55 "1.56.1" "04cmqx7nn63hzz7z27b2b0dj2qx18rck9ifvip43s6dampx8v2f3"))
+   ;; Verified that it *doesn't* build with 1.58. e.g.:
+   ;; * error: unknown codegen option: `symbol-mangling-version`
+   rust-1.59 "1.60.0" "1drqr0a26x1rb2w3kj0i6abhgbs3jx5qqkrcwbwdlx7n3inq5ji0"))
 
-(define rust-1.57
-  (let ((base-rust
-         (rust-bootstrapped-package
-          rust-1.56 "1.57.0"
-          "06jw8ka2p3kls8p0gd4p0chhhb1ia1mlvj96zn78n7qvp71zjiim")))
+;;; Note: Only the latest versions of Rust are supported and tested.  The
+;;; intermediate rusts are built for bootstrapping purposes and should not
+;;; be relied upon.  This is to ease maintenance and reduce the time
+;;; required to build the full Rust bootstrap chain.
+;;;
+;;; Here we take the latest included Rust, make it public, and re-enable tests
+;;; and extra components such as rustfmt.
+(define-public rust
+  (let ((base-rust rust-1.60))
     (package
       (inherit base-rust)
       (outputs (cons "rustfmt" (package-outputs base-rust)))
@@ -786,12 +746,6 @@ safety and thread safety guarantees.")
                             `("procps" ,procps)
                             (package-native-inputs base-rust))))))
 
-;;; Note: Only the latest versions of Rust are supported and tested.  The
-;;; intermediate rusts are built for bootstrapping purposes and should not
-;;; be relied upon.  This is to ease maintenance and reduce the time
-;;; required to build the full Rust bootstrap chain.
-(define-public rust rust-1.57)
-
 (define-public rust-src
   (hidden-package
    (package
diff --git a/gnu/packages/sphinx.scm b/gnu/packages/sphinx.scm
index 2d53b7f3ac..8dad118f34 100644
--- a/gnu/packages/sphinx.scm
+++ b/gnu/packages/sphinx.scm
@@ -62,17 +62,17 @@
 (define-public python-sphinx
   (package
     (name "python-sphinx")
-    (version "4.5.0")
+    (version "5.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Sphinx" version))
        (sha256
         (base32
-         "1rp28jryxwy24y8vpacclqihbizyi6b1s6id86pibvm46ybcmy3v"))))
+         "12cdy3m5c09lpf2bbxzbhm5v5y9fk7jgm94qrzggpq86waj28cms"))))
     (build-system python-build-system)
     (arguments
-     `(#:phases
+     '(#:phases
        (modify-phases %standard-phases
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
@@ -111,10 +111,6 @@
            texlive-etoolbox
            texlive-generic-ltxcmds
            texlive-hyperref
-           ;; TODO: Remove texlive-stringenc and texlive-zapfding after
-           ;; propagating them in texlive-hyperref in next rebuild cycle.
-           texlive-stringenc
-           texlive-zapfding
            texlive-latex-base           ;alltt, atbegshi, makeidx, textcomp
            texlive-latex-cmap
            texlive-latex-fancyhdr
@@ -148,6 +144,18 @@ for Python projects or other documents consisting of multiple reStructuredText
 sources.")
     (license license:bsd-2)))
 
+;; Some packages do not support Sphinx 5 yet.  Remove when unused.
+(define-public python-sphinx-4
+  (package
+    (inherit python-sphinx)
+    (version "4.5.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "Sphinx" version))
+              (sha256
+               (base32
+                "1rp28jryxwy24y8vpacclqihbizyi6b1s6id86pibvm46ybcmy3v"))))))
+
 (define-public python-sphinxcontrib-apidoc
   (package
     (name "python-sphinxcontrib-apidoc")
@@ -365,14 +373,16 @@ Blog, News or Announcements section to a Sphinx website.")
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
                (invoke "pytest")))))))
-    (propagated-inputs (list python-docutils python-sphinx))
+    (propagated-inputs (list python-docutils python-sphinx-4))
     (native-inputs
      (list python-pytest
            python-pytest-regressions))
     (home-page "https://github.com/executablebooks/sphinx-panels")
     (synopsis "Sphinx extension for creating panels in a grid layout")
     (description
-     "This package provides a sphinx extension for creating panels in a grid layout.")
+     "This package provides a sphinx extension for creating panels in a
+grid layout.  It is no longer maintained and users are encouraged to use
+@code{sphinx-design} instead.")
     (license license:expat)))
 
 (define-public python-sphinx-tabs
diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index 2dc052b1a7..1fa3178a24 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -159,6 +159,7 @@ copied to their outputs; otherwise the TEXLIVE-BUILD-SYSTEM is used."
     (file-name (string-append "hyph-utf8-scripts-"
                               (number->string %texlive-revision)
                               "-checkout"))
+    (patches (search-patches "texlive-hyph-utf8-no-byebug.patch"))
     (sha256
      (base32
       "04xzf5gr3ylyh3ls09imrx4mwq3qp1k97r9njzlan6hlff875rx2"))))
@@ -188,7 +189,8 @@ files from LOCATIONS with expected checksum HASH.  CODE is not currently in use.
                          (string-append root "/tex/generic/hyph-utf8/patterns/quote")))
                    (mkdir "scripts")
                    (copy-recursively
-                    (assoc-ref inputs "hyph-utf8-scripts") "scripts")
+                    (dirname (search-input-file inputs "hyph-utf8.rb"))
+                    "scripts")
 
                    ;; Prepare target directories
                    (mkdir-p patterns)
@@ -226,9 +228,7 @@ files from LOCATIONS with expected checksum HASH.  CODE is not currently in use.
                         (string-append "File.join(\"" ptex "\"")))
                      (invoke "ruby" "generate-ptex-patterns.rb")))))))))
       (native-inputs
-       `(("ruby" ,ruby)
-         ("ruby-hydra" ,ruby-hydra)
-         ("hyph-utf8-scripts" ,hyph-utf8-scripts)))
+       (list ruby ruby-hydra-minimal hyph-utf8-scripts))
       (home-page "https://ctan.org/pkg/hyph-utf8"))))
 
 (define texlive-extra-src
@@ -3429,12 +3429,10 @@ XML, using UTF-8 or a suitable 8-bit encoding.")
              texlive-latex-refcount
              texlive-latex-rerunfilecheck
              texlive-url
-             ;; TODO: Add this in next rebuild cycle.
-             ;;texlive-cm
-             ;;texlive-latex-graphics    ;for keyval
-             ;;texlive-stringenc
-             ;;texlive-zapfding
-             ))
+             texlive-cm
+             texlive-latex-graphics     ;for keyval
+             texlive-stringenc
+             texlive-zapfding))
       (home-page "https://www.ctan.org/pkg/hyperref")
       (synopsis "Extensive support for hypertext in LaTeX")
       (description
diff --git a/gnu/packages/time.scm b/gnu/packages/time.scm
index fea9ff25f7..9128056f78 100644
--- a/gnu/packages/time.scm
+++ b/gnu/packages/time.scm
@@ -196,6 +196,7 @@ Pendulum instances.")
      (origin
        (method url-fetch)
        (uri (pypi-uri "python-dateutil" version))
+       (patches (search-patches "python-dateutil-pytest-compat.patch"))
        (sha256
         (base32
          "11iy7m4bp2lgfkcl0r6xzf34bvk7ppjmsyn2ygfikbi72v6cl8q1"))))
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index f07fe192ed..d66c42123d 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -335,7 +335,8 @@ the SVT-HEVC encoder, it is possible to spread video encoding processing across
 multiple Intel's Xeon processors to achieve a real advantage of processing
 efficiency.")
     (home-page "https://01.org/svt")
-    (supported-systems '("x86_64-linux" "i686-linux"))
+    ;; Specifically targets x86_64 Intel hardware.
+    (supported-systems '("x86_64-linux"))
     (license (license:non-copyleft "file:///LICENSE.md"))))
 
 (define-public mediasdk
@@ -1494,14 +1495,14 @@ quality and performance.")
 (define-public libva
   (package
     (name "libva")
-    (version "2.13.0")
+    (version "2.15.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/intel/libva/releases/download/"
                            version "/libva-" version ".tar.bz2"))
        (sha256
-        (base32 "0q6l193x9whd80sjd5mx8cb7c0fcljb19nhfpla5h49nkzrq7lzs"))))
+        (base32 "1jhy8qzfp4ydbxs9qd9km7k5wq8r4s2vq20r1q07lgld8l4x93i5"))))
     (build-system gnu-build-system)
     (native-inputs
      (list pkg-config))
@@ -1513,27 +1514,24 @@ quality and performance.")
            mesa
            wayland))
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before
-          'build 'fix-dlopen-paths
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out")))
+     (list
+      ;; Most drivers are in mesa's $prefix/lib/dri, so use that.  (Can be
+      ;; overridden at run-time via LIBVA_DRIVERS_PATH.)
+      #:configure-flags
+      #~(list (string-append "--with-drivers-path="
+                             (search-input-directory %build-inputs "lib/dri")))
+      ;; However, we can't write to mesa's store directory, so override the
+      ;; following make variable to install the dummy driver to libva's
+      ;; $prefix/lib/dri directory.
+      #:make-flags
+      #~(list (string-append "dummy_drv_video_ladir=" #$output "/lib/dri"))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'build 'fix-dlopen-paths
+            (lambda _
               (substitute* "va/drm/va_drm_auth_x11.c"
                 (("\"libva-x11\\.so\\.%d\"")
-                 (string-append "\"" out "/lib/libva-x11.so.%d\"")))
-              #t))))
-       ;; Most drivers are in mesa's $prefix/lib/dri, so use that.  (Can be
-       ;; overridden at run-time via LIBVA_DRIVERS_PATH.)
-       #:configure-flags
-       (list (string-append "--with-drivers-path="
-                            (assoc-ref %build-inputs "mesa") "/lib/dri"))
-       ;; However, we can't write to mesa's store directory, so override the
-       ;; following make variable to install the dummy driver to libva's
-       ;; $prefix/lib/dri directory.
-       #:make-flags
-       (list (string-append "dummy_drv_video_ladir="
-                            (assoc-ref %outputs "out") "/lib/dri"))))
+                 (string-append "\"" #$output "/lib/libva-x11.so.%d\""))))))))
     (home-page "https://www.freedesktop.org/wiki/Software/vaapi/")
     (synopsis "Video acceleration library")
     (description "The main motivation for VA-API (Video Acceleration API) is
@@ -1722,6 +1720,10 @@ operate properly.")
          ;; The static libraries are 23 MiB
          "--disable-static"
 
+         #$@(if (target-riscv64?)
+              '("--extra-cflags=-fPIC")
+              '())
+
          ;; Runtime cpu detection is not implemented on
          ;; MIPS, so we disable some features.
          "--disable-mips32r2"
@@ -4380,7 +4382,7 @@ tools for styling them, including a built-in real-time video preview.")
            (gst-plugins/selection gst-plugins-bad #:plugins
                                   '("debugutils" "transcode")
                                   #:configure-flags
-                                  '("-Dintrospection=enabled"))
+                                  #~'("-Dintrospection=enabled"))
            gst-libav
            gsound
            gtk+
diff --git a/gnu/packages/webkit.scm b/gnu/packages/webkit.scm
index d13a8b38ca..58e8314292 100644
--- a/gnu/packages/webkit.scm
+++ b/gnu/packages/webkit.scm
@@ -236,12 +236,14 @@ engine that uses Wayland for graphics output.")
            enchant
            geoclue
            gst-plugins-base
+           gst-plugins-bad-minimal
            gtk+-2
            harfbuzz
            hyphen
            icu4c
            lcms
            libgcrypt
+           libgudev
            libjpeg-turbo
            libmanette
            libnotify