diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 2fa1c45f98..58fe1a80c6 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -147,6 +147,7 @@ (define-module (gnu packages messaging)
   #:use-module (guix build-system meson)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system qt)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
@@ -1087,27 +1088,34 @@ (define-public znc
 (define-public python-nbxmpp
   (package
     (name "python-nbxmpp")
-    (version "3.1.0")
-    (source
-     (origin
-       (method url-fetch)
-       (uri
-        (pypi-uri "nbxmpp" version))
-       (sha256
-        (base32 "0c32090gr1fiy7hkn73dcj4ad9gfdpks8hivl1dl8bql01jsfdnj"))))
-    (build-system python-build-system)
-    (native-inputs
-     (list `(,glib "bin")))
-    (inputs
-     (list glib
-           glib-networking
-           libsoup-minimal-2
-           python-gssapi
-           python-idna
-           python-precis-i18n
-           python-pygobject))
+    (version "4.2.2")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "nbxmpp" version))
+              (sha256
+               (base32
+                "095nyy6vjildhrqigxk6vsh49in6mx17bvb3z5zpjmzhv9b8ix46"))))
+    (build-system pyproject-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  ;; XXX: This probably should be an option for pyproject-build-system
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (when tests?
+                        (invoke "python" "-m" "unittest" "-v")))))))
+    (native-inputs (list `(,glib "bin")))
+    (inputs (list glib
+                  glib-networking
+                  libsoup-minimal))
+    (propagated-inputs (list
+      python-gssapi
+      python-idna
+      python-packaging
+      python-precis-i18n
+      python-pygobject))
     (synopsis "Non-blocking XMPP Module")
-    (description "Python-nbxmpp is a Python library that provides a way for
+    (description
+     "Python-nbxmpp is a Python library that provides a way for
 Python applications to use the XMPP network.  This library was initially a fork
 of xmpppy.")
     (home-page "https://dev.gajim.org/gajim/python-nbxmpp")
@@ -1116,7 +1124,7 @@ (define-public python-nbxmpp
 (define-public gajim
   (package
     (name "gajim")
-    (version "1.4.7")
+    (version "1.7.3")
     (source
      (origin
        (method url-fetch)
@@ -1125,7 +1133,7 @@ (define-public gajim
                        (version-major+minor version)
                        "/gajim-" version ".tar.gz"))
        (sha256
-        (base32 "1ww46qlxr14nq0ka8wsf8qpn5qfi5dvgyksfh9411crl7azhfj0s"))
+        (base32 "066kvkjw3qcdanr3nczy0wgcwihk9jc9zhzfr5bwlqvcyxcv7k5p"))
        (patches (search-patches "gajim-honour-GAJIM_PLUGIN_PATH.patch"))))
     (build-system python-build-system)
     (arguments
@@ -1138,13 +1146,27 @@ (define-public gajim
          #:prefix glib-or-gtk:)
         (guix build utils))
        #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'disable-failing-tests
+       ,#~(modify-phases %standard-phases
+         (add-after 'unpack 'generate-gdk-pixbuf-loaders-cache-file
+            (assoc-ref glib-or-gtk:%standard-phases
+                       'generate-gdk-pixbuf-loaders-cache-file))
+         (add-before 'build 'build-metadata
+          (lambda _
+            (invoke "./pep517build/build_metadata.py" "-o" "dist/metadata")))
+         ;; TODO: Change to pyproject-build-system once it supports
+         ;; in-tree build backends.
+         (replace 'build
            (lambda _
-             ;; XXX Gajim builds fine on some (my) machines but fails elsewhere:
-             ;; ModuleNotFoundError: No module named 'gajim.gui.emoji_data'
-             ;; https://dev.gajim.org/gajim/gajim/-/issues/11041
-             (delete-file "test/no_gui/test_styling.py")))
+             (invoke "python" "-m" "build" "--wheel" "--no-isolation" ".")))
+         (replace 'install
+            (lambda _
+              (apply invoke "pip" "--no-cache-dir" "--no-input"
+                     "install" "--no-deps" "--prefix" #$output
+                     (find-files "dist" "\\.whl$"))))
+         (add-after 'install 'install-metadata
+          (lambda _
+            (invoke "./pep517build/install_metadata.py" "dist/metadata"
+                    (string-append "--prefix=" #$output))))
          (replace 'check
            (lambda _
              ;; Tests require a running X server.
@@ -1152,35 +1174,30 @@ (define-public gajim
              (setenv "DISPLAY" ":1")
              ;; For missing '/etc/machine-id'.
              (setenv "DBUS_FATAL_WARNINGS" "0")
-             (invoke "dbus-launch" "python" "./setup.py" "test")))
-         ;; Loading gajim_remote require running session bus,
-         ;; which in-turn requires running elogind for XDG_RUNTIME_DIR;
-         ;; neither of which are possible inside build environment.
-         (delete 'sanity-check)
+             (invoke "dbus-launch" "python" "-m" "unittest" "discover" "-s" "test")))
          (add-after 'install 'glib-or-gtk-compile-schemas
            (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-compile-schemas))
          (add-after 'install 'glib-or-gtk-wrap
            (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap))
          (add-after 'install 'wrap-env
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (for-each
-                (lambda (name)
-                  (let ((file (string-append out "/bin/" name))
-                        (gst-plugin-path (getenv "GST_PLUGIN_SYSTEM_PATH"))
-                        (gi-typelib-path (getenv "GI_TYPELIB_PATH")))
-                    (wrap-program file
-                      `("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path))
-                      `("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path)))))
-                '("gajim" "gajim-remote"))))))))
+           (lambda _
+             (for-each
+               (lambda (name)
+                 (let ((file (string-append #$output "/bin/" name))
+                       (gst-plugin-path (getenv "GST_PLUGIN_SYSTEM_PATH"))
+                       (gi-typelib-path (getenv "GI_TYPELIB_PATH"))
+                       (pixbuf-module-file (getenv "GDK_PIXBUF_MODULE_FILE")))
+                   (wrap-program file
+                     `("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path))
+                     `("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path))
+                     `("GDK_PIXBUF_MODULE_FILE" = (,pixbuf-module-file)))))
+               '("gajim" "gajim-remote")))))))
     (native-search-paths
      (list
       (search-path-specification
        (variable "GAJIM_PLUGIN_PATH")
-       (separator #f)                   ;single entry
-       (files
-        (list
-         "share/gajim/plugins")))
+       (separator #f) ; single entry
+       (files (list "share/gajim/plugins")))
       ;; Gajim needs to use the propagated inputs of its plugins.
       (search-path-specification
        (variable "GUIX_PYTHONPATH")
@@ -1191,7 +1208,7 @@ (define-public gajim
           ;; FIXME: Cannot use this expression as it would
           ;; introduce a circular dependency at the top level.
           ;; (version-major+minor (package-version python))
-          "3.9"
+          "3.10"
           "/site-packages"))))))
     (native-inputs
      (list gettext-minimal
@@ -1199,6 +1216,7 @@ (define-public gajim
            gobject-introspection
            `(,gtk+ "bin")
            python-distutils-extra
+           python-pypa-build
            python-setuptools
            xorg-server-for-tests))
     (inputs
@@ -1233,8 +1251,7 @@ (define-public gajim
            python-pycairo
            python-pygobject
            python-pyopenssl))
-    (propagated-inputs
-     (list dconf))
+    (propagated-inputs (list dconf))
     (synopsis "Fully-featured XMPP client")
     (description "Gajim aims to be an easy to use and fully-featured XMPP chat
 client.  It is extensible via plugins, supports end-to-end encryption (OMEMO
@@ -1245,7 +1262,7 @@ (define-public gajim
 (define-public gajim-omemo
   (package
     (name "gajim-omemo")
-    (version "2.8.15")
+    (version "2.9.0")
     (source
      (origin
        (method url-fetch/zipbomb)
@@ -1254,7 +1271,7 @@ (define-public gajim-omemo
          "https://ftp.gajim.org/plugins/master/omemo/omemo_"
          version ".zip"))
        (sha256
-        (base32 "1hf148ywr8knk5y3y5xvvwgw74ld1pcfjkp78g514ikcnzfycfcn"))))
+        (base32 "0yy9r9fsrlgdywiln8bskhi8faj9hnz7b19jcap5nkhv8jn9cqq7"))))
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
@@ -1281,7 +1298,7 @@ (define-public gajim-omemo
 (define-public gajim-openpgp
   (package
     (name "gajim-openpgp")
-    (version "1.4.9")
+    (version "1.5.0")
     (source
      (origin
        (method url-fetch/zipbomb)
@@ -1290,7 +1307,7 @@ (define-public gajim-openpgp
          "https://ftp.gajim.org/plugins/master/openpgp/openpgp_"
          version ".zip"))
        (sha256
-        (base32 "1xwmf6ai1z7z9x6p1ysglxji73r7d27c0gzc8ykab29cjhjyv0dq"))))
+        (base32 "193pbh9iri7bkamvjwp236i8g5zxxiqgsv64kll5sy76vx4q73c4"))))
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
