summary refs log tree commit diff
path: root/pkgs/desktops
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/desktops')
-rw-r--r--pkgs/desktops/gnome-3/apps/accerciser/default.nix1
-rw-r--r--pkgs/desktops/gnome-3/apps/cheese/default.nix50
-rw-r--r--pkgs/desktops/gnome-3/apps/file-roller/default.nix15
-rw-r--r--pkgs/desktops/gnome-3/apps/gedit/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-books/default.nix11
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix12
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix19
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-calendar/gtk_image_reset_crash.patch17
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-characters/default.nix15
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix25
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-maps/default.nix11
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-music/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-notes/default.nix17
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/apps/gnome-weather/default.nix46
-rw-r--r--pkgs/desktops/gnome-3/apps/seahorse/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/baobab/default.nix54
-rw-r--r--pkgs/desktops/gnome-3/core/dconf-editor/default.nix49
-rw-r--r--pkgs/desktops/gnome-3/core/eog/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/epiphany/default.nix20
-rw-r--r--pkgs/desktops/gnome-3/core/evince/default.nix8
-rw-r--r--pkgs/desktops/gnome-3/core/evolution-data-server/default.nix5
-rw-r--r--pkgs/desktops/gnome-3/core/gdm/default.nix15
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix62
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-calculator/default.nix65
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-contacts/default.nix8
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-control-center/default.nix45
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch94
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-desktop/default.nix79
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix16
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix68
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix10
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-initial-setup/0001-fix-paths.patch21
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-initial-setup/default.nix24
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-keyring/default.nix71
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-session/ctl.nix9
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-session/default.nix15
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix16
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-shell/default.nix32
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-shell/shew-gir-path.patch2
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-software/default.nix13
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix59
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-terminal/default.nix4
-rw-r--r--pkgs/desktops/gnome-3/core/gnome-tour/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/gvc-with-ucm-prePatch.nix17
-rw-r--r--pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix7
-rw-r--r--pkgs/desktops/gnome-3/core/mutter/default.nix17
-rw-r--r--pkgs/desktops/gnome-3/core/nautilus/default.nix10
-rw-r--r--pkgs/desktops/gnome-3/core/rygel/default.nix1
-rw-r--r--pkgs/desktops/gnome-3/core/simple-scan/default.nix8
-rw-r--r--pkgs/desktops/gnome-3/core/sushi/default.nix5
-rw-r--r--pkgs/desktops/gnome-3/core/yelp-xsl/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/core/yelp/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/default.nix4
-rw-r--r--pkgs/desktops/gnome-3/devtools/devhelp/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/extensions/gsconnect/default.nix4
-rw-r--r--pkgs/desktops/gnome-3/extensions/hot-edge/default.nix33
-rw-r--r--pkgs/desktops/gnome-3/find-latest-version.py39
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-chess/default.nix49
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-klotski/default.nix4
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-mines/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix63
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-robots/default.nix63
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/games/gnome-taquin/default.nix60
-rw-r--r--pkgs/desktops/gnome-3/games/iagno/default.nix14
-rw-r--r--pkgs/desktops/gnome-3/games/lightsoff/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/games/swell-foop/default.nix67
-rw-r--r--pkgs/desktops/gnome-3/games/tali/default.nix6
-rw-r--r--pkgs/desktops/gnome-3/misc/geary/Bump-client-test-timeout-to-300s.patch10
-rw-r--r--pkgs/desktops/gnome-3/misc/geary/default.nix33
-rw-r--r--pkgs/desktops/gnome-3/misc/gitg/default.nix44
-rw-r--r--pkgs/desktops/gnome-3/misc/gnome-applets/default.nix8
-rw-r--r--pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix4
-rw-r--r--pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix5
-rw-r--r--pkgs/desktops/gnome-3/misc/gnome-panel/default.nix5
-rw-r--r--pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix14
-rw-r--r--pkgs/desktops/gnome-3/misc/gpaste/default.nix4
-rw-r--r--pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch2
-rw-r--r--pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix5
-rw-r--r--pkgs/desktops/gnome-3/misc/metacity/default.nix5
-rw-r--r--pkgs/desktops/gnome-3/misc/nautilus-python/default.nix1
-rw-r--r--pkgs/desktops/gnome-3/update.nix4
-rw-r--r--pkgs/desktops/pantheon/apps/appcenter/default.nix11
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-calendar/default.nix2
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-code/default.nix9
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-music/default.nix9
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-photos/default.nix9
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix8
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix9
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix2
-rw-r--r--pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix15
-rw-r--r--pkgs/desktops/xfce/core/xfce4-panel/default.nix10
-rw-r--r--pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin/default.nix9
100 files changed, 1265 insertions, 654 deletions
diff --git a/pkgs/desktops/gnome-3/apps/accerciser/default.nix b/pkgs/desktops/gnome-3/apps/accerciser/default.nix
index 2f8163adc72..e634037b871 100644
--- a/pkgs/desktops/gnome-3/apps/accerciser/default.nix
+++ b/pkgs/desktops/gnome-3/apps/accerciser/default.nix
@@ -60,6 +60,7 @@ python3.pkgs.buildPythonApplication rec {
     updateScript = gnome3.updateScript {
       packageName = "accerciser";
       attrPath = "gnome3.accerciser";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/apps/cheese/default.nix b/pkgs/desktops/gnome-3/apps/cheese/default.nix
index 04c6b31563c..75c3060f51d 100644
--- a/pkgs/desktops/gnome-3/apps/cheese/default.nix
+++ b/pkgs/desktops/gnome-3/apps/cheese/default.nix
@@ -1,6 +1,8 @@
-{ lib, stdenv
+{ lib
+, stdenv
 , gettext
 , fetchurl
+, fetchpatch
 , wrapGAppsHook
 , gnome-video-effects
 , libcanberra-gtk3
@@ -9,17 +11,13 @@
 , glib
 , clutter-gtk
 , clutter-gst
-, udev
 , gst_all_1
 , itstool
-, libgudev
 , vala
 , docbook_xml_dtd_43
-, docbook_xsl
+, docbook-xsl-nons
 , appstream-glib
 , libxslt
-, yelp-tools
-, gnome-common
 , gtk-doc
 , adwaita-icon-theme
 , librsvg
@@ -38,37 +36,37 @@ stdenv.mkDerivation rec {
   pname = "cheese";
   version = "3.38.0";
 
+  outputs = [ "out" "man" "devdoc" ];
+
   src = fetchurl {
     url = "mirror://gnome/sources/cheese/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
     sha256 = "0vyim2avlgq3a48rgdfz5g21kqk11mfb53b2l883340v88mp7ll8";
   };
 
-  postPatch = ''
-    chmod +x meson_post_install.py
-    patchShebangs meson_post_install.py
-  '';
-
-  passthru = {
-    updateScript = gnome3.updateScript { packageName = "cheese"; attrPath = "gnome3.cheese"; };
-  };
+  patches = [
+    # Fix build with latest Vala or GLib
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/cheese/commit/7cf6268e54620bbbe5e6e61800c50fb0cb4bea57.patch";
+      sha256 = "WJgGNrpZLTahe7Sxr8HdTl+4Mf4VcmJb6DdiInlDcT4=";
+    })
+  ];
 
   nativeBuildInputs = [
     appstream-glib
     docbook_xml_dtd_43
-    docbook_xsl
+    docbook-xsl-nons
     gettext
-    gnome-common
     gtk-doc
     itstool
     libxml2
-    libxslt
+    libxslt # for xsltproc
     meson
     ninja
     pkg-config
     python3
     vala
     wrapGAppsHook
-    yelp-tools
+    glib # for glib-compile-schemas
   ];
 
   buildInputs = [
@@ -86,12 +84,13 @@ stdenv.mkDerivation rec {
     gst_all_1.gstreamer
     gtk3
     libcanberra-gtk3
-    libgudev
     librsvg
-    udev
   ];
 
-  outputs = [ "out" "man" "devdoc" ];
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
 
   preFixup = ''
     gappsWrapperArgs+=(
@@ -105,13 +104,18 @@ stdenv.mkDerivation rec {
     )
   '';
 
-  enableParallelBuilding = true;
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "cheese";
+      attrPath = "gnome3.cheese";
+    };
+  };
 
   meta = with lib; {
     homepage = "https://wiki.gnome.org/Apps/Cheese";
     description = "Take photos and videos with your webcam, with fun graphical effects";
     maintainers = teams.gnome.members;
-    license = licenses.gpl3;
+    license = licenses.gpl2Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/apps/file-roller/default.nix b/pkgs/desktops/gnome-3/apps/file-roller/default.nix
index 02801cd5a78..c6a2a3a6400 100644
--- a/pkgs/desktops/gnome-3/apps/file-roller/default.nix
+++ b/pkgs/desktops/gnome-3/apps/file-roller/default.nix
@@ -1,20 +1,21 @@
 { lib, stdenv, fetchurl, glib, gtk3, meson, ninja, pkg-config, gnome3, gettext, itstool, libxml2, libarchive
-, file, json-glib, python3, wrapGAppsHook, desktop-file-utils, libnotify, nautilus, glibcLocales }:
+, file, json-glib, python3, wrapGAppsHook, desktop-file-utils, libnotify, nautilus, glibcLocales
+, unzip, cpio }:
 
 stdenv.mkDerivation rec {
   pname = "file-roller";
-  version = "3.38.1";
+  version = "3.40.0";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0mxwdbfqizakxq65fa8zlvjf48v5f44lv8ckjw8sl8fk2871784l";
+    sha256 = "039w1dcpa5ypmv6sm634alk9vbcdkyvy595vkh5gn032jsiqca2a";
   };
 
   LANG = "en_US.UTF-8"; # postinstall.py
 
   nativeBuildInputs = [ meson ninja gettext itstool pkg-config libxml2 python3 wrapGAppsHook glibcLocales desktop-file-utils ];
 
-  buildInputs = [ glib gtk3 json-glib libarchive file gnome3.adwaita-icon-theme libnotify nautilus ];
+  buildInputs = [ glib gtk3 json-glib libarchive file gnome3.adwaita-icon-theme libnotify nautilus cpio ];
 
   PKG_CONFIG_LIBNAUTILUS_EXTENSION_EXTENSIONDIR = "${placeholder "out"}/lib/nautilus/extensions-3.0";
 
@@ -24,6 +25,12 @@ stdenv.mkDerivation rec {
     patchShebangs data/set-mime-type-entry.py
   '';
 
+  postFixup = ''
+    # Workaround because of https://gitlab.gnome.org/GNOME/file-roller/issues/40
+    wrapProgram "$out/bin/file-roller" \
+      --prefix PATH : ${lib.makeBinPath [ unzip ]}
+  '';
+
   passthru = {
     updateScript = gnome3.updateScript {
       packageName = "file-roller";
diff --git a/pkgs/desktops/gnome-3/apps/gedit/default.nix b/pkgs/desktops/gnome-3/apps/gedit/default.nix
index 79d31c3b8c7..1458d509e61 100644
--- a/pkgs/desktops/gnome-3/apps/gedit/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gedit/default.nix
@@ -23,11 +23,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gedit";
-  version = "3.38.1";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gedit/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0kc48a399achcz6vlqq0jk0b8ixbrzyv9xb22s5av76m5hyqalq0";
+    url = "mirror://gnome/sources/gedit/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "149ngl9qw6h59546lir1pa7hvw23ppsnqlj9mfqphmmn5jl99qsm";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/apps/gnome-books/default.nix b/pkgs/desktops/gnome-3/apps/gnome-books/default.nix
index bff7c5fb281..2b0aedc9e3e 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-books/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-books/default.nix
@@ -18,7 +18,7 @@
 , gdk-pixbuf
 , gsettings-desktop-schemas
 , adwaita-icon-theme
-, docbook_xsl
+, docbook-xsl-nons
 , docbook_xml_dtd_42
 , desktop-file-utils
 , python3
@@ -28,11 +28,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-books";
-  version = "3.34.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "153vknqisjn5f105avzm933fsc3v0pjzzbwxlqxf8vjjksh1cmya";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0c41l8m2di8h39bmk2fnhpwglwp6qhljmwqqbihzp4ay9976zrc5";
   };
 
   nativeBuildInputs = [
@@ -42,7 +42,7 @@ stdenv.mkDerivation rec {
     gettext
     libxslt
     desktop-file-utils
-    docbook_xsl
+    docbook-xsl-nons
     docbook_xml_dtd_42
     wrapGAppsHook
     python3
@@ -77,7 +77,6 @@ stdenv.mkDerivation rec {
   };
 
   meta = with lib; {
-    broken = true; # Tracker 3 not supported and it cannot start Tracker 2.
     homepage = "https://wiki.gnome.org/Apps/Books";
     description = "An e-book manager application for GNOME";
     maintainers = teams.gnome.members;
diff --git a/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix b/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix
index 302fb7f8127..779bfe6886d 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix
@@ -19,7 +19,7 @@
 , python3
 , appstream-glib
 , spice-protocol
-, libhandy_0
+, libhandy
 , libsoup
 , libosinfo
 , systemd
@@ -53,11 +53,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-boxes";
-  version = "3.38.2";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1zjvng0izbws3506998l3dwsxjbm7wnhqipb8nmqzvi096czvajl";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "seKPLH+3a/T7uGLQ1S6BG5TL6f8W8GdAiWRWhpCILvg=";
   };
 
   doCheck = true;
@@ -99,7 +99,7 @@ stdenv.mkDerivation rec {
     libcap
     libcap_ng
     libgudev
-    libhandy_0
+    libhandy
     libosinfo
     librsvg
     libsecret
@@ -138,7 +138,7 @@ stdenv.mkDerivation rec {
   meta = with lib; {
     description = "Simple GNOME 3 application to access remote or virtual systems";
     homepage = "https://wiki.gnome.org/Apps/Boxes";
-    license = licenses.gpl3;
+    license = licenses.lgpl2Plus;
     platforms = platforms.linux;
     maintainers = teams.gnome.members;
   };
diff --git a/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix b/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix
index e15125a00bf..fae4149a131 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix
@@ -1,6 +1,5 @@
 { lib, stdenv
 , fetchurl
-, fetchpatch
 , meson
 , ninja
 , pkg-config
@@ -25,25 +24,17 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-calendar";
-  version = "3.38.2";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0SG7NLCLbqYB9du6Q6SxYTpuVJP8Cx4uzJDGZnEakS0=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0d74hng9jdmwdcjgj4xfrcink2gwkbp1k1mad4wanaf7q31c6f38";
   };
 
   patches = [
-    # Port to libhandy-1
-    (fetchpatch {
-      url = "https://gitlab.gnome.org/GNOME/gnome-calendar/-/commit/8be361b6ce8f0f8053e1609decbdbdc164ec8448.patch";
-      sha256 = "Ue0pWwcbYyCZPHPPoR0dXW5n948/AZ3wVDMTIZDOnyE=";
-    })
-
     # https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/84
-    (fetchpatch {
-      url = "https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/84.patch";
-      sha256 = "czG3uIHl3tBnjDUvCOPm8IRp2o7yZYCb0/jWtv3uzIY=";
-    })
+    # A refactor has caused the PR patch to drift enough to need rebasing
+    ./gtk_image_reset_crash.patch
   ];
 
   passthru = {
diff --git a/pkgs/desktops/gnome-3/apps/gnome-calendar/gtk_image_reset_crash.patch b/pkgs/desktops/gnome-3/apps/gnome-calendar/gtk_image_reset_crash.patch
new file mode 100644
index 00000000000..5065295b57b
--- /dev/null
+++ b/pkgs/desktops/gnome-3/apps/gnome-calendar/gtk_image_reset_crash.patch
@@ -0,0 +1,17 @@
+diff --git a/src/gui/views/gcal-year-view.c b/src/gui/views/gcal-year-view.c
+index ac32a8f9..532425c1 100644
+--- a/src/gui/views/gcal-year-view.c
++++ b/src/gui/views/gcal-year-view.c
+@@ -2158,7 +2158,11 @@ update_weather (GcalYearView *self)
+   if (!updated)
+     {
+       gtk_label_set_text (self->temp_label, "");
+-      gtk_image_clear (self->weather_icon);
++      /* FIXME: This should never be NULL, but it somehow is.
++       * https://gitlab.gnome.org/GNOME/gnome-calendar/issues/299
++       */
++      if (self->weather_icon != NULL)
++        gtk_image_clear (self->weather_icon);
+     }
+ }
+ 
diff --git a/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix b/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix
index 3a65be9440e..b5abee28380 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix
@@ -1,4 +1,5 @@
-{ lib, stdenv
+{ lib
+, stdenv
 , fetchurl
 , meson
 , ninja
@@ -13,6 +14,7 @@
 , gobject-introspection
 , gjs
 , libunistring
+, libhandy
 , gsettings-desktop-schemas
 , adwaita-icon-theme
 , gnome-desktop
@@ -20,11 +22,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-characters";
-  version = "3.34.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-characters/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0mqaxsa7hcmvid3zbzvxpfkp7s01ghiq6kaibmd3169axrr8ahql";
+    url = "mirror://gnome/sources/gnome-characters/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0z2xa4w921bzpzj6gv88pvbrijcnnwni6jxynwz0ybaravyzaqha";
   };
 
   nativeBuildInputs = [
@@ -46,6 +48,7 @@ stdenv.mkDerivation rec {
     gsettings-desktop-schemas
     gtk3
     libunistring
+    libhandy
     pango
   ];
 
@@ -76,10 +79,10 @@ stdenv.mkDerivation rec {
   };
 
   meta = with lib; {
-    homepage = "https://wiki.gnome.org/Design/Apps/CharacterMap";
+    homepage = "https://wiki.gnome.org/Apps/Characters";
     description = "Simple utility application to find and insert unusual characters";
     maintainers = teams.gnome.members;
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix b/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix
index a2caaf068eb..cd91cef6687 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix
@@ -27,11 +27,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-clocks";
-  version = "3.38.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-clocks/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0f24g76ax59qnms1rjfyf1i0sa84nadgbr0r6m26p90w1w2wnmnr";
+    url = "mirror://gnome/sources/gnome-clocks/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "02d3jg46sn8d9gd4dsaly22gg5vkbz2gpq4pmwpvncb4rsqk7sn2";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix b/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix
deleted file mode 100644
index 82c40fc429d..00000000000
--- a/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix
+++ /dev/null
@@ -1,25 +0,0 @@
-{ lib, stdenv, fetchurl, gnome3, intltool, itstool, libxml2 }:
-
-stdenv.mkDerivation rec {
-  pname = "gnome-getting-started-docs";
-  version = "3.38.1";
-
-  src = fetchurl {
-    url = "mirror://gnome/sources/gnome-getting-started-docs/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "EPviPyw85CdTmk4wekYWlNOHCyMgBGT3BbfYGvmTyFk=";
-  };
-
-  passthru = {
-    updateScript = gnome3.updateScript { packageName = "gnome-getting-started-docs"; attrPath = "gnome3.gnome-getting-started-docs"; };
-  };
-
-  buildInputs = [ intltool itstool libxml2 ];
-
-  meta = with lib; {
-    homepage = "https://live.gnome.org/DocumentationProject";
-    description = "Help a new user get started in GNOME";
-    maintainers = teams.gnome.members;
-    license = licenses.cc-by-sa-30;
-    platforms = platforms.linux;
-  };
-}
diff --git a/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix b/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix
index f0a80bc525a..673013c8e60 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix
@@ -29,11 +29,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-maps";
-  version = "3.38.4";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-1WQekf/kePsqqcpIliJczxjsLqTZjjV2UXmBin2+RKM=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-mAXUwFs6NpV0bTdisoFr/+bZ19VuF7y7nZ1B3C0CYxo=";
   };
 
   doCheck = true;
@@ -82,6 +82,11 @@ stdenv.mkDerivation rec {
                   "Exec=$out/bin/gnome-maps"
   '';
 
+  preCheck = ''
+    # “time.js” included by “timeTest” and “translationsTest” depends on “org.gnome.desktop.interface” schema.
+    export XDG_DATA_DIRS="${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}:$XDG_DATA_DIRS"
+  '';
+
   passthru = {
     updateScript = gnome3.updateScript {
       packageName = pname;
diff --git a/pkgs/desktops/gnome-3/apps/gnome-music/default.nix b/pkgs/desktops/gnome-3/apps/gnome-music/default.nix
index be456071e41..b50ce59980f 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-music/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-music/default.nix
@@ -30,13 +30,13 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "gnome-music";
-  version = "3.38.2";
+  version = "40.0";
 
   format = "other";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0c2051wngf3jrifl5bv5kyqcci459n62vixxkryiryjcaqwbd1am";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1djqhd4jccvk352hwxjhiwjgbnv1qnpv450f2c6w6581vcn9pq38";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix b/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix
index c6d4a30ab0a..afeddd1bb99 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix
@@ -12,10 +12,11 @@
 , gtk3
 , evolution-data-server
 , gnome-online-accounts
+, json-glib
 , libuuid
-, libhandy_0
+, curl
+, libhandy
 , webkitgtk
-, zeitgeist
 , gnome3
 , libxml2
 , gsettings-desktop-schemas
@@ -24,11 +25,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-notes";
-  version = "3.38.0";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/bijiben/${lib.versions.majorMinor version}/bijiben-${version}.tar.xz";
-    sha256 = "H/bMCsbGKQe/KgmhchXt0vF7dNrKs6XIminDBJFyvis=";
+    url = "mirror://gnome/sources/bijiben/${lib.versions.major version}/bijiben-${version}.tar.xz";
+    sha256 = "1gvvb2klkzbmyzwkjgmscdiqcl8lyz9b0rxb4igjz079csq6z805";
   };
 
   doCheck = true;
@@ -53,19 +54,19 @@ stdenv.mkDerivation rec {
   buildInputs = [
     glib
     gtk3
+    json-glib
     libuuid
-    libhandy_0 # doesn't support libhandy-1 yet
+    curl
+    libhandy
     webkitgtk
     tracker
     gnome-online-accounts
-    zeitgeist
     gsettings-desktop-schemas
     evolution-data-server
     gnome3.adwaita-icon-theme
   ];
 
   mesonFlags = [
-    "-Dzeitgeist=true"
     "-Dupdate_mimedb=false"
   ];
 
diff --git a/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix b/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix
index 6cc5c2ab783..3b34fae714c 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix
@@ -19,11 +19,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-sound-recorder";
-  version = "3.38.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "2Z6k+WPsEInpzVl6fUQ5ihHs7xMeQUInGhyQwVuqRSE=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "00b55vsfzx877b7mj744abzjws7zclz71wbvh0axsrbl9l84ranl";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix b/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix
index 9a5079dfc64..6cbfea0f5cf 100644
--- a/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix
+++ b/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix
@@ -1,19 +1,49 @@
-{ lib, stdenv, fetchurl, pkg-config, gnome3, gtk3, wrapGAppsHook, gjs, gobject-introspection
-, libgweather, meson, ninja, geoclue2, gnome-desktop, python3, gsettings-desktop-schemas }:
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, gnome3
+, gtk3
+, libhandy
+, wrapGAppsHook
+, gjs
+, gobject-introspection
+, libgweather
+, meson
+, ninja
+, geoclue2
+, gnome-desktop
+, python3
+, gsettings-desktop-schemas
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-weather";
-  version = "3.36.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-weather/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "11z75ky6xp9hx7lm24xng7ydr20bzh4d6p9sbi9c8ccz2m3fdrk8";
+    url = "mirror://gnome/sources/gnome-weather/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1vxfcvga5waangq3rzwdrdxyy5sw40vv0l463lc651s0n8xafd9a";
   };
 
-  nativeBuildInputs = [ pkg-config meson ninja wrapGAppsHook python3 ];
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    wrapGAppsHook
+    python3
+  ];
+
   buildInputs = [
-    gtk3 gjs gobject-introspection gnome-desktop
-    libgweather gnome3.adwaita-icon-theme geoclue2 gsettings-desktop-schemas
+    gtk3
+    libhandy
+    gjs
+    gobject-introspection
+    gnome-desktop
+    libgweather
+    gnome3.adwaita-icon-theme
+    geoclue2
+    gsettings-desktop-schemas
   ];
 
   postPatch = ''
diff --git a/pkgs/desktops/gnome-3/apps/seahorse/default.nix b/pkgs/desktops/gnome-3/apps/seahorse/default.nix
index 60ec6792e5d..e44f094be1b 100644
--- a/pkgs/desktops/gnome-3/apps/seahorse/default.nix
+++ b/pkgs/desktops/gnome-3/apps/seahorse/default.nix
@@ -26,11 +26,11 @@
 
 stdenv.mkDerivation rec {
   pname = "seahorse";
-  version = "3.38.0.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    hash = "sha256-x0XdHebhog8ZorB6Q4uO98yiNaaqc0ENt/E3sCHpsqI=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-fscFezhousbqBB/aghQKOfXsnlsYi0UJFNRTvC1V0Cw=";
   };
 
   doCheck = true;
diff --git a/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix b/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix
index a1be29b0183..ceffe2f012b 100644
--- a/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix
+++ b/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix
@@ -3,11 +3,11 @@
 
 stdenv.mkDerivation rec {
   pname = "adwaita-icon-theme";
-  version = "3.38.0";
+  version = "40.1.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/adwaita-icon-theme/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "15xgz9wzk07442x3s3052as95g0223z4pp9qlsgcs323yama30v6";
+    url = "mirror://gnome/sources/adwaita-icon-theme/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "C2xDbtatmIeoitofcqAZex63OwINjTRKurTH+nJQ+PY=";
   };
 
   # For convenience, we can specify adwaita-icon-theme only in packages
diff --git a/pkgs/desktops/gnome-3/core/baobab/default.nix b/pkgs/desktops/gnome-3/core/baobab/default.nix
index 81faf79cbb6..386502a854b 100644
--- a/pkgs/desktops/gnome-3/core/baobab/default.nix
+++ b/pkgs/desktops/gnome-3/core/baobab/default.nix
@@ -1,20 +1,50 @@
-{ lib, stdenv, gettext, fetchurl, vala, desktop-file-utils
-, meson, ninja, pkg-config, python3, gtk3, glib, libxml2
-, wrapGAppsHook, itstool, gnome3 }:
+{ stdenv
+, lib
+, gettext
+, fetchurl
+, vala
+, desktop-file-utils
+, meson
+, ninja
+, pkg-config
+, python3
+, gtk3
+, libhandy
+, glib
+, libxml2
+, wrapGAppsHook
+, itstool
+, gnome3
+}:
 
-let
+stdenv.mkDerivation rec {
   pname = "baobab";
-  version = "3.38.0";
-in stdenv.mkDerivation rec {
-  name = "${pname}-${version}";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${name}.tar.xz";
-    sha256 = "0ac3fbl15l836yvgw724q4whbkws9v4b6l2xy6bnp0b0g0a6i104";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "19yii3bdgivxrcka1c4g6dpbmql5nyawwhzlsph7z6bs68nambm6";
   };
 
-  nativeBuildInputs = [ meson ninja pkg-config vala gettext itstool libxml2 desktop-file-utils wrapGAppsHook python3 ];
-  buildInputs = [ gtk3 glib gnome3.adwaita-icon-theme ];
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+    gettext
+    itstool
+    libxml2
+    desktop-file-utils
+    wrapGAppsHook
+    python3
+  ];
+
+  buildInputs = [
+    gtk3
+    libhandy
+    glib
+    gnome3.adwaita-icon-theme
+  ];
 
   doCheck = true;
 
@@ -27,7 +57,7 @@ in stdenv.mkDerivation rec {
   meta = with lib; {
     description = "Graphical application to analyse disk usage in any GNOME environment";
     homepage = "https://wiki.gnome.org/Apps/DiskUsageAnalyzer";
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     maintainers = teams.gnome.members;
     platforms = platforms.linux;
   };
diff --git a/pkgs/desktops/gnome-3/core/dconf-editor/default.nix b/pkgs/desktops/gnome-3/core/dconf-editor/default.nix
index 1374cfc9358..aab9a0db42b 100644
--- a/pkgs/desktops/gnome-3/core/dconf-editor/default.nix
+++ b/pkgs/desktops/gnome-3/core/dconf-editor/default.nix
@@ -1,21 +1,51 @@
-{ lib, stdenv, fetchurl, meson, ninja, vala, libxslt, pkg-config, glib, gtk3, gnome3, python3, dconf
-, libxml2, gettext, docbook_xsl, wrapGAppsHook, gobject-introspection }:
+{ lib
+, stdenv
+, fetchurl
+, meson
+, ninja
+, vala
+, libxslt
+, pkg-config
+, glib
+, gtk3
+, gnome3
+, python3
+, dconf
+, libxml2
+, gettext
+, docbook-xsl-nons
+, wrapGAppsHook
+, gobject-introspection
+}:
 
 stdenv.mkDerivation rec {
   pname = "dconf-editor";
-  version = "3.38.2";
+  version = "3.38.3";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-ElPa2H5iE/vzE/+eydxDWKobECYfKAcsHcDgmXuS+DU=";
+    sha256 = "sha256-Vxr0x9rU8Em1PmzXKLea3fCMJ92ra8V7OW0hGGbueeM=";
   };
 
   nativeBuildInputs = [
-    meson ninja vala libxslt pkg-config wrapGAppsHook
-    gettext docbook_xsl libxml2 gobject-introspection python3
+    meson
+    ninja
+    vala
+    libxslt
+    pkg-config
+    wrapGAppsHook
+    gettext
+    docbook-xsl-nons
+    libxml2
+    gobject-introspection
+    python3
   ];
 
-  buildInputs = [ glib gtk3 dconf ];
+  buildInputs = [
+    glib
+    gtk3
+    dconf
+  ];
 
   postPatch = ''
     chmod +x meson_post_install.py
@@ -30,7 +60,10 @@ stdenv.mkDerivation rec {
   };
 
   meta = with lib; {
-    platforms = platforms.linux;
+    description = "GSettings editor for GNOME";
+    homepage = "https://wiki.gnome.org/Apps/DconfEditor";
+    license = licenses.gpl3Plus;
     maintainers = teams.gnome.members;
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/core/eog/default.nix b/pkgs/desktops/gnome-3/core/eog/default.nix
index cec0ac7a681..671a6645674 100644
--- a/pkgs/desktops/gnome-3/core/eog/default.nix
+++ b/pkgs/desktops/gnome-3/core/eog/default.nix
@@ -28,11 +28,11 @@
 
 stdenv.mkDerivation rec {
   pname = "eog";
-  version = "3.38.2";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-ilT9+T4wag9khToYgxrIwEg4IEdxBqrgvcAKrDc4bw4=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-e+CGA3/tm2v4S6yXqD48kYMBt+nJavEwsnJS0KURFok=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/core/epiphany/default.nix b/pkgs/desktops/gnome-3/core/epiphany/default.nix
index 9f949b60738..349a1c024e4 100644
--- a/pkgs/desktops/gnome-3/core/epiphany/default.nix
+++ b/pkgs/desktops/gnome-3/core/epiphany/default.nix
@@ -19,6 +19,7 @@
 , libsecret
 , gnome-desktop
 , libnotify
+, libarchive
 , p11-kit
 , sqlite
 , gcr
@@ -36,18 +37,13 @@
 
 stdenv.mkDerivation rec {
   pname = "epiphany";
-  version = "3.38.2";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0v8iymg72m83ikxxyhapvz5v8zh8hlr1pw7n215cy3p8q6yg41cb";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1l0sb1xg16g4wg3z99xb0w2kbyczbn7q4mphs3w4lxq22xml4sk9";
   };
 
-  # Tests need an X display
-  mesonFlags = [
-    "-Dunit_tests=disabled"
-  ];
-
   nativeBuildInputs = [
     desktop-file-utils
     gettext
@@ -83,6 +79,7 @@ stdenv.mkDerivation rec {
     libhandy
     libportal
     libnotify
+    libarchive
     libsecret
     libsoup
     libxml2
@@ -92,6 +89,11 @@ stdenv.mkDerivation rec {
     webkitgtk
   ];
 
+  # Tests need an X display
+  mesonFlags = [
+    "-Dunit_tests=disabled"
+  ];
+
   postPatch = ''
     chmod +x post_install.py # patchShebangs requires executable file
     patchShebangs post_install.py
@@ -107,7 +109,7 @@ stdenv.mkDerivation rec {
     homepage = "https://wiki.gnome.org/Apps/Epiphany";
     description = "WebKit based web browser for GNOME";
     maintainers = teams.gnome.members;
-    license = licenses.gpl2;
+    license = licenses.gpl3Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/core/evince/default.nix b/pkgs/desktops/gnome-3/core/evince/default.nix
index 31828bad0af..59eb31e1918 100644
--- a/pkgs/desktops/gnome-3/core/evince/default.nix
+++ b/pkgs/desktops/gnome-3/core/evince/default.nix
@@ -19,6 +19,7 @@
 , djvulibre
 , libspectre
 , libarchive
+, libhandy
 , libsecret
 , wrapGAppsHook
 , librsvg
@@ -43,13 +44,13 @@
 
 stdenv.mkDerivation rec {
   pname = "evince";
-  version = "3.38.2";
+  version = "40.1";
 
   outputs = [ "out" "dev" "devdoc" ];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/evince/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "J9QZ1f7WMF4HRijtz94MtzT//aIF1jysMjORwEkDvZQ=";
+    url = "mirror://gnome/sources/evince/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0bfg7prmjk3z8irx1nfkkqph3igg3cy4pwd7pcxjxbshqdin6rks";
   };
 
   postPatch = ''
@@ -86,6 +87,7 @@ stdenv.mkDerivation rec {
     gspell
     gtk3
     libarchive
+    libhandy
     librsvg
     libsecret
     libspectre
diff --git a/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix b/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix
index dc43bdfd493..dc3f4b493b0 100644
--- a/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix
+++ b/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix
@@ -6,13 +6,13 @@
 
 stdenv.mkDerivation rec {
   pname = "evolution-data-server";
-  version = "3.38.4";
+  version = "3.40.1";
 
   outputs = [ "out" "dev" ];
 
   src = fetchurl {
     url = "mirror://gnome/sources/evolution-data-server/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "rFPxay1R8+f/gCX5yhn0otTOOEHXKun+K7iX3ICZ1wU=";
+    sha256 = "08iykha7zhk21b3axsp3v1jfwda612v0m8rz8zlzppm5i8s5ziza";
   };
 
   patches = [
@@ -52,6 +52,7 @@ stdenv.mkDerivation rec {
   passthru = {
     updateScript = gnome3.updateScript {
       packageName = "evolution-data-server";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/core/gdm/default.nix b/pkgs/desktops/gnome-3/core/gdm/default.nix
index 324ab865b11..6c1db6cebd9 100644
--- a/pkgs/desktops/gnome-3/core/gdm/default.nix
+++ b/pkgs/desktops/gnome-3/core/gdm/default.nix
@@ -42,13 +42,13 @@ in
 
 stdenv.mkDerivation rec {
   pname = "gdm";
-  version = "3.38.2.1";
+  version = "40.0";
 
   outputs = [ "out" "dev" ];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gdm/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "yliiBdXr/L2rVqEXFriY4Wrl3/Ia7nnQdgRkRGKOxNo=";
+    url = "mirror://gnome/sources/gdm/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "XtdLc506Iy/7HkoTK8+WW9/pVdmVtSh3NYh3WwLylQ4=";
   };
 
   mesonFlags = [
@@ -90,10 +90,13 @@ stdenv.mkDerivation rec {
   ];
 
   patches = [
-    # https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/112
+    # GDM fails to find g-s with the following error in the journal.
+    # gdm-x-session[976]: dbus-run-session: failed to exec 'gnome-session': No such file or directory
+    # https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/92
     (fetchpatch {
-      url = "https://gitlab.gnome.org/GNOME/gdm/-/commit/1d28d4b3568381b8590d2235737b924aefd1746c.patch";
-      sha256 = "ZUXKZS4T0o0hzrApxaqcR0txCRv5zBgqeQ9K9fLNX1o=";
+      url = "https://gitlab.gnome.org/GNOME/gdm/-/commit/ccecd9c975d04da80db4cd547b67a1a94fa83292.patch";
+      sha256 = "5hKS9wjjhuSAYwXct5vS0dPbmPRIINJoLC0Zm1naz6Q=";
+      revert = true;
     })
 
     # Change hardcoded paths to nix store paths.
diff --git a/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix b/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix
index 36bf7b3e92c..2ce52911595 100644
--- a/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-backgrounds";
-  version = "3.38.0";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-backgrounds/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1qqygm15rcdgm36vz2iy7b9axndjzvpi29lmygyakjc07a3jlwgp";
+    url = "mirror://gnome/sources/gnome-backgrounds/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "YN+KDaMBzkJbcEPUKuMuxAEf8I8Y4Pxi8pQBMF2jpw4=";
   };
 
   passthru = {
diff --git a/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix b/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix
index 2397b9d7be9..e057cc61da8 100644
--- a/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix
@@ -1,28 +1,62 @@
-{ lib, stdenv, fetchurl, gnome3, meson, ninja, pkg-config, gtk3, intltool, glib
-, udev, itstool, libxml2, wrapGAppsHook, libnotify, libcanberra-gtk3, gobject-introspection
-, gtk-doc, docbook_xsl, docbook_xml_dtd_43, python3, gsettings-desktop-schemas }:
+{ lib
+, stdenv
+, fetchurl
+, gnome3
+, meson
+, ninja
+, pkg-config
+, gtk3
+, gettext
+, glib
+, udev
+, itstool
+, libxml2
+, wrapGAppsHook
+, libnotify
+, libcanberra-gtk3
+, gobject-introspection
+, gtk-doc
+, docbook-xsl-nons
+, docbook_xml_dtd_43
+, python3
+, gsettings-desktop-schemas
+}:
 
-let
+stdenv.mkDerivation rec {
   pname = "gnome-bluetooth";
-in stdenv.mkDerivation rec {
-  name = "${pname}-${version}";
-  version = "3.34.3";
+  version = "3.34.5";
 
   # TODO: split out "lib"
   outputs = [ "out" "dev" "devdoc" "man" ];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${name}.tar.xz";
-    sha256 = "08k4jak4r72pvn5kjhm21planyc514j6c7jjj5lv9nmvvlxqw1ha";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1a9ynlwwkb3wpg293ym517vmrkk63y809mmcv9a21k5yr199x53c";
   };
 
   nativeBuildInputs = [
-    meson ninja intltool itstool pkg-config libxml2 wrapGAppsHook gobject-introspection
-    gtk-doc docbook_xsl docbook_xml_dtd_43 python3
+    meson
+    ninja
+    gettext
+    itstool
+    pkg-config
+    libxml2
+    wrapGAppsHook
+    gobject-introspection
+    gtk-doc
+    docbook-xsl-nons
+    docbook_xml_dtd_43
+    python3
   ];
+
   buildInputs = [
-    glib gtk3 udev libnotify libcanberra-gtk3
-    gnome3.adwaita-icon-theme gsettings-desktop-schemas
+    glib
+    gtk3
+    udev
+    libnotify
+    libcanberra-gtk3
+    gnome3.adwaita-icon-theme
+    gsettings-desktop-schemas
   ];
 
   mesonFlags = [
@@ -46,7 +80,7 @@ in stdenv.mkDerivation rec {
     homepage = "https://help.gnome.org/users/gnome-bluetooth/stable/index.html.en";
     description = "Application that let you manage Bluetooth in the GNOME destkop";
     maintainers = teams.gnome.members;
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix b/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix
index e033197b347..4bf317a4a26 100644
--- a/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix
@@ -1,25 +1,63 @@
-{ lib, stdenv, meson, ninja, vala, gettext, itstool, fetchurl, pkg-config, libxml2
-, gtk3, glib, gtksourceview4, wrapGAppsHook, gobject-introspection, python3
-, gnome3, mpfr, gmp, libsoup, libmpc, gsettings-desktop-schemas, libgee }:
+{ stdenv
+, lib
+, meson
+, ninja
+, vala
+, gettext
+, itstool
+, fetchurl
+, pkg-config
+, libxml2
+, gtk3
+, glib
+, gtksourceview4
+, wrapGAppsHook
+, gobject-introspection
+, python3
+, gnome3
+, mpfr
+, gmp
+, libsoup
+, libmpc
+, libhandy
+, gsettings-desktop-schemas
+, libgee
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-calculator";
-  version = "3.38.2";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-calculator/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0sri58cp6v07cqpdsf8dhf9dnykz305kvkx0l9dd25g06djcr0wc";
+    url = "mirror://gnome/sources/gnome-calculator/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1xkazxbkpn1z5pfphhps7fc5q4yc8lp7f6b222n8bx5iyxhwbrkz";
   };
 
   nativeBuildInputs = [
-    meson ninja pkg-config vala gettext itstool wrapGAppsHook python3
+    meson
+    ninja
+    pkg-config
+    vala
+    gettext
+    itstool
+    wrapGAppsHook
+    python3
     gobject-introspection # for finding vapi files
   ];
 
   buildInputs = [
-    gtk3 glib libxml2 gtksourceview4 mpfr gmp
-    gnome3.adwaita-icon-theme libgee
-    gsettings-desktop-schemas libsoup libmpc
+    gtk3
+    glib
+    libxml2
+    gtksourceview4
+    mpfr
+    gmp
+    gnome3.adwaita-icon-theme
+    libgee
+    gsettings-desktop-schemas
+    libsoup
+    libmpc
+    libhandy
   ];
 
   doCheck = true;
@@ -29,6 +67,11 @@ stdenv.mkDerivation rec {
     patchShebangs meson_post_install.py
   '';
 
+  preCheck = ''
+    # Currency conversion test tries to store currency data in $HOME/.cache.
+    export HOME=$TMPDIR
+  '';
+
   passthru = {
     updateScript = gnome3.updateScript {
       packageName = "gnome-calculator";
@@ -40,7 +83,7 @@ stdenv.mkDerivation rec {
     homepage = "https://wiki.gnome.org/Apps/Calculator";
     description = "Application that solves mathematical equations and is suitable as a default application in a Desktop environment";
     maintainers = teams.gnome.members;
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix b/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix
index ef5e564beb9..3146ca717d3 100644
--- a/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix
@@ -17,6 +17,7 @@
 , gnome-online-accounts
 , wrapGAppsHook
 , folks
+, libgdata
 , libxml2
 , gnome3
 , vala
@@ -28,11 +29,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-contacts";
-  version = "3.38.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-contacts/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0hsq0dwxjahcaxnm1m4r1lync9k2fkwzybfmkchrmn95vqcwwvf9";
+    url = "mirror://gnome/sources/gnome-contacts/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0w2g5xhw65adzvwzakrj5kaim4sw1w7s8qqwm3nm6inq50znzpn9";
   };
 
   propagatedUserEnvPkgs = [
@@ -58,6 +59,7 @@ stdenv.mkDerivation rec {
     evolution-data-server
     gsettings-desktop-schemas
     folks
+    libgdata # required by some dependency transitively
     gnome-desktop
     libhandy
     libxml2
diff --git a/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix b/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix
index f8c458a3df1..371f2d794a0 100644
--- a/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix
@@ -1,6 +1,7 @@
 { fetchurl
-, fetchFromGitLab
-, lib, stdenv
+, fetchpatch
+, lib
+, stdenv
 , substituteAll
 , accountsservice
 , adwaita-icon-theme
@@ -10,7 +11,7 @@
 , colord
 , colord-gtk
 , cups
-, docbook_xsl
+, docbook-xsl-nons
 , fontconfig
 , gdk-pixbuf
 , gettext
@@ -69,20 +70,32 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-control-center";
-  version = "3.38.4";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-SdxjeNTTXBxu1ZIk9WNpFsK2+km7+4tW6xmoTW6QzRk=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-zMmlc2UXOFEJrlpZkGwlgkTdh5t1A61ZhM9BZVyzAvE=";
   };
 
-  # See https://mail.gnome.org/archives/distributor-list/2020-September/msg00001.html
-  prePatch = (import ../gvc-with-ucm-prePatch.nix {
-    inherit fetchFromGitLab;
-  });
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      gcm = gnome-color-manager;
+      gnome_desktop = gnome-desktop;
+      inherit glibc libgnomekbd tzdata;
+      inherit cups networkmanagerapplet;
+    })
+
+    # Fix startup assertion in power panel.
+    # https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/974
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-control-center/commit/9acaa10567c94048657c69538e5d7813f82c4224.patch";
+      sha256 = "59GeTPcG2UiVTL4VTS/TP0p0QkAQpm3VgvuAiw64wUU=";
+    })
+  ];
 
   nativeBuildInputs = [
-    docbook_xsl
+    docbook-xsl-nons
     gettext
     libxslt
     meson
@@ -142,16 +155,6 @@ stdenv.mkDerivation rec {
     upower
   ];
 
-  patches = [
-    (substituteAll {
-      src = ./paths.patch;
-      gcm = gnome-color-manager;
-      gnome_desktop = gnome-desktop;
-      inherit glibc libgnomekbd tzdata;
-      inherit cups networkmanagerapplet;
-    })
-  ];
-
   postPatch = ''
     chmod +x build-aux/meson/meson_post_install.py # patchShebangs requires executable file
     patchShebangs build-aux/meson/meson_post_install.py
diff --git a/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch b/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch
index 361972f2635..a6787477b81 100644
--- a/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch
+++ b/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch
@@ -1,26 +1,26 @@
 diff --git a/panels/color/cc-color-panel.c b/panels/color/cc-color-panel.c
-index 49ca35220..adefb87b9 100644
+index 603178efc..c363a6a5c 100644
 --- a/panels/color/cc-color-panel.c
 +++ b/panels/color/cc-color-panel.c
-@@ -599,7 +599,7 @@ gcm_prefs_calibrate_cb (GtkWidget *widget, CcColorPanel *prefs)
+@@ -591,7 +591,7 @@ gcm_prefs_calibrate_cb (CcColorPanel *prefs)
  
    /* run with modal set */
    argv = g_ptr_array_new_with_free_func (g_free);
--  g_ptr_array_add (argv, g_build_filename (BINDIR, "gcm-calibrate", NULL));
+-  g_ptr_array_add (argv, g_strdup ("gcm-calibrate"));
 +  g_ptr_array_add (argv, g_build_filename ("@gcm@", "bin", "gcm-calibrate", NULL));
    g_ptr_array_add (argv, g_strdup ("--device"));
    g_ptr_array_add (argv, g_strdup (cd_device_get_id (prefs->current_device)));
    g_ptr_array_add (argv, g_strdup ("--parent-window"));
-@@ -1038,7 +1038,7 @@ gcm_prefs_profile_view (CcColorPanel *prefs, CdProfile *profile)
+@@ -1029,7 +1029,7 @@ gcm_prefs_profile_view (CcColorPanel *prefs, CdProfile *profile)
  
    /* open up gcm-viewer as a info pane */
    argv = g_ptr_array_new_with_free_func (g_free);
--  g_ptr_array_add (argv, g_build_filename (BINDIR, "gcm-viewer", NULL));
+-  g_ptr_array_add (argv, g_strdup ("gcm-viewer"));
 +  g_ptr_array_add (argv, g_build_filename ("@gcm@", "bin", "gcm-viewer", NULL));
    g_ptr_array_add (argv, g_strdup ("--profile"));
    g_ptr_array_add (argv, g_strdup (cd_profile_get_id (profile)));
    g_ptr_array_add (argv, g_strdup ("--parent-window"));
-@@ -1288,15 +1288,12 @@ gcm_prefs_device_clicked (CcColorPanel *prefs, CdDevice *device)
+@@ -1275,15 +1275,12 @@ gcm_prefs_device_clicked (CcColorPanel *prefs, CdDevice *device)
  static void
  gcm_prefs_profile_clicked (CcColorPanel *prefs, CdProfile *profile, CdDevice *device)
  {
@@ -38,12 +38,12 @@ index 49ca35220..adefb87b9 100644
    else
      gtk_widget_set_sensitive (prefs->toolbutton_profile_view, FALSE);
 diff --git a/panels/datetime/tz.h b/panels/datetime/tz.h
-index 96b25140c..1ad704d4a 100644
+index a2376f8a4..98769e08f 100644
 --- a/panels/datetime/tz.h
 +++ b/panels/datetime/tz.h
 @@ -27,11 +27,7 @@
  
- #include <glib.h>
+ G_BEGIN_DECLS
  
 -#ifndef __sun
 -#  define TZ_DATA_FILE "/usr/share/zoneinfo/zone.tab"
@@ -55,25 +55,42 @@ index 96b25140c..1ad704d4a 100644
  typedef struct _TzDB TzDB;
  typedef struct _TzLocation TzLocation;
 diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
-index 4541986db..da7826bfe 100644
+index bd0e07762..0e71351f8 100644
 --- a/panels/info-overview/cc-info-overview-panel.c
 +++ b/panels/info-overview/cc-info-overview-panel.c
-@@ -169,7 +169,7 @@ load_gnome_version (char **version,
+@@ -172,7 +172,7 @@ load_gnome_version (char **version,
    gsize length;
    g_autoptr(VersionData) data = NULL;
-
+ 
 -  if (!g_file_get_contents (DATADIR "/gnome/gnome-version.xml",
 +  if (!g_file_get_contents ("@gnome_desktop@/share/gnome/gnome-version.xml",
                              &contents,
                              &length,
                              &error))
+diff --git a/panels/keyboard/cc-input-list-box.c b/panels/keyboard/cc-input-list-box.c
+index 6c2cb5614..8f57159cc 100644
+--- a/panels/keyboard/cc-input-list-box.c
++++ b/panels/keyboard/cc-input-list-box.c
+@@ -223,10 +223,10 @@ row_layout_cb (CcInputListBox *self,
+   layout_variant = cc_input_source_get_layout_variant (source);
+ 
+   if (layout_variant && layout_variant[0])
+-    commandline = g_strdup_printf ("gkbd-keyboard-display -l \"%s\t%s\"",
++    commandline = g_strdup_printf ("@libgnomekbd@/bin/gkbd-keyboard-display -l \"%s\t%s\"",
+ 				   layout, layout_variant);
+   else
+-    commandline = g_strdup_printf ("gkbd-keyboard-display -l %s",
++    commandline = g_strdup_printf ("@libgnomekbd@/bin/gkbd-keyboard-display -l %s",
+ 				   layout);
+ 
+   g_spawn_command_line_async (commandline, NULL);
 diff --git a/panels/network/connection-editor/net-connection-editor.c b/panels/network/connection-editor/net-connection-editor.c
-index 9390a3308..d30b4a68e 100644
+index 505b8ee25..62e94009f 100644
 --- a/panels/network/connection-editor/net-connection-editor.c
 +++ b/panels/network/connection-editor/net-connection-editor.c
-@@ -278,9 +278,9 @@ net_connection_editor_do_fallback (NetConnectionEditor *self, const gchar *type)
+@@ -267,9 +267,9 @@ net_connection_editor_do_fallback (NetConnectionEditor *self, const gchar *type)
          g_autoptr(GError) error = NULL;
-
+ 
          if (self->is_new_connection) {
 -                cmdline = g_strdup_printf ("nm-connection-editor --type='%s' --create", type);
 +                cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --type='%s' --create", type);
@@ -84,19 +101,20 @@ index 9390a3308..d30b4a68e 100644
          }
  
 diff --git a/panels/network/net-device-bluetooth.c b/panels/network/net-device-bluetooth.c
+index 74dfb0e9a..5f53d1a20 100644
 --- a/panels/network/net-device-bluetooth.c
 +++ b/panels/network/net-device-bluetooth.c
 @@ -90,7 +90,7 @@ nm_device_bluetooth_refresh_ui (NetDeviceBluetooth *self)
          update_off_switch_from_device_state (self->device_off_switch, state, self);
-
+ 
          /* set up the Options button */
 -        path = g_find_program_in_path ("nm-connection-editor");
 +        path = g_find_program_in_path ("@networkmanagerapplet@/bin/nm-connection-editor");
          gtk_widget_set_visible (GTK_WIDGET (self->options_button), state != NM_DEVICE_STATE_UNMANAGED && path != NULL);
  }
-
+ 
 @@ -141,7 +141,7 @@ options_button_clicked_cb (NetDeviceBluetooth *self)
-
+ 
          connection = net_device_get_find_connection (self->client, self->device);
          uuid = nm_connection_get_uuid (connection);
 -        cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid);
@@ -105,19 +123,20 @@ diff --git a/panels/network/net-device-bluetooth.c b/panels/network/net-device-b
          if (!g_spawn_command_line_async (cmdline, &error))
                  g_warning ("Failed to launch nm-connection-editor: %s", error->message);
 @@ -185,7 +185,7 @@ net_device_bluetooth_init (NetDeviceBluetooth *self)
-
+ 
          gtk_widget_init_template (GTK_WIDGET (self));
-
+ 
 -        path = g_find_program_in_path ("nm-connection-editor");
 +        path = g_find_program_in_path ("@networkmanagerapplet@/bin/nm-connection-editor");
          gtk_widget_set_visible (GTK_WIDGET (self->options_button), path != NULL);
  }
-
+ 
 diff --git a/panels/network/net-device-mobile.c b/panels/network/net-device-mobile.c
+index 34eb86241..50d0a2bed 100644
 --- a/panels/network/net-device-mobile.c
 +++ b/panels/network/net-device-mobile.c
-@@ -484,7 +484,7 @@ options_button_clicked_cb (NetDeviceMobile *self)
-
+@@ -508,7 +508,7 @@ options_button_clicked_cb (NetDeviceMobile *self)
+ 
          connection = net_device_get_find_connection (self->client, self->device);
          uuid = nm_connection_get_uuid (connection);
 -        cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid);
@@ -125,21 +144,21 @@ diff --git a/panels/network/net-device-mobile.c b/panels/network/net-device-mobi
          g_debug ("Launching '%s'\n", cmdline);
          if (!g_spawn_command_line_async (cmdline, &error))
                  g_warning ("Failed to launch nm-connection-editor: %s", error->message);
-@@ -776,7 +776,7 @@ net_device_mobile_init (NetDeviceMobile *self)
-
+@@ -797,7 +797,7 @@ net_device_mobile_init (NetDeviceMobile *self)
+ 
          self->cancellable = g_cancellable_new ();
-
+ 
 -        path = g_find_program_in_path ("nm-connection-editor");
 +        path = g_find_program_in_path ("@networkmanagerapplet@/bin/nm-connection-editor");
          gtk_widget_set_visible (GTK_WIDGET (self->options_button), path != NULL);
  }
-
+ 
 diff --git a/panels/printers/pp-host.c b/panels/printers/pp-host.c
-index f53ba217e..d24bcaeb9 100644
+index a31a606e3..ed5133d29 100644
 --- a/panels/printers/pp-host.c
 +++ b/panels/printers/pp-host.c
 @@ -256,7 +256,7 @@ _pp_host_get_snmp_devices_thread (GTask        *task,
-   devices = g_new0 (PpDevicesList, 1);
+   devices = g_ptr_array_new_with_free_func (g_object_unref);
  
    argv = g_new0 (gchar *, 3);
 -  argv[0] = g_strdup ("/usr/lib/cups/backend/snmp");
@@ -147,25 +166,8 @@ index f53ba217e..d24bcaeb9 100644
    argv[1] = g_strdup (priv->hostname);
  
    /* Use SNMP to get printer's informations */
-diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
-index 35859526d..21486c917 100644
---- a/panels/region/cc-region-panel.c
-+++ b/panels/region/cc-region-panel.c
-@@ -755,10 +755,10 @@ row_layout_cb (CcRegionPanel *self,
-         layout_variant = cc_input_source_get_layout_variant (source);
- 
-         if (layout_variant && layout_variant[0])
--                commandline = g_strdup_printf ("gkbd-keyboard-display -l \"%s\t%s\"",
-+                commandline = g_strdup_printf ("@libgnomekbd@/bin/gkbd-keyboard-display -l \"%s\t%s\"",
-                                                layout, layout_variant);
-         else
--                commandline = g_strdup_printf ("gkbd-keyboard-display -l %s",
-+                commandline = g_strdup_printf ("@libgnomekbd@/bin/gkbd-keyboard-display -l %s",
-                                                layout);
- 
-         g_spawn_command_line_async (commandline, NULL);
 diff --git a/panels/user-accounts/run-passwd.c b/panels/user-accounts/run-passwd.c
-index 00239ce0f..617c98870 100644
+index 86f53d4fc..0b052856f 100644
 --- a/panels/user-accounts/run-passwd.c
 +++ b/panels/user-accounts/run-passwd.c
 @@ -150,7 +150,7 @@ spawn_passwd (PasswdHandler *passwd_handler, GError **error)
diff --git a/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix b/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix
index c6d8b319308..4294e2db240 100644
--- a/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix
@@ -1,29 +1,40 @@
-{ lib, stdenv, fetchurl, substituteAll, pkg-config, libxslt, ninja, gnome3, gtk3, glib
-, gettext, libxml2, xkeyboard_config, isocodes, meson, wayland
-, libseccomp, systemd, bubblewrap, gobject-introspection, gtk-doc, docbook_xsl, gsettings-desktop-schemas }:
+{ lib
+, stdenv
+, fetchurl
+, substituteAll
+, pkg-config
+, libxslt
+, ninja
+, gnome3
+, gtk3
+, glib
+, gettext
+, libxml2
+, xkeyboard_config
+, libxkbcommon
+, isocodes
+, meson
+, wayland
+, libseccomp
+, systemd
+, bubblewrap
+, gobject-introspection
+, gtk-doc
+, docbook-xsl-nons
+, gsettings-desktop-schemas
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-desktop";
-  version = "3.38.4";
+  version = "40.1";
 
   outputs = [ "out" "dev" "devdoc" ];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-desktop/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-P2A+pb/UdyLJLPybiFRGtGJg6gnIz7Y/a92f7+NC5Iw=";
+    url = "mirror://gnome/sources/gnome-desktop/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-igeJcwUhnFaZVJriBI9xVVFe+Xx85NZYXd2hXVhZ4c8=";
   };
 
-  nativeBuildInputs = [
-    pkg-config meson ninja gettext libxslt libxml2 gobject-introspection
-    gtk-doc docbook_xsl glib
-  ];
-  buildInputs = [
-    bubblewrap xkeyboard_config isocodes wayland
-    gtk3 glib libseccomp systemd
-  ];
-
-  propagatedBuildInputs = [ gsettings-desktop-schemas ];
-
   patches = [
     (substituteAll {
       src = ./bubblewrap-paths.patch;
@@ -32,11 +43,42 @@ stdenv.mkDerivation rec {
     })
   ];
 
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gettext
+    libxslt
+    libxml2
+    gobject-introspection
+    gtk-doc
+    docbook-xsl-nons
+    glib
+  ];
+
+  buildInputs = [
+    bubblewrap
+    xkeyboard_config
+    libxkbcommon # for xkbregistry
+    isocodes
+    wayland
+    gtk3
+    glib
+    libseccomp
+    systemd
+  ];
+
+  propagatedBuildInputs = [
+    gsettings-desktop-schemas
+  ];
+
   mesonFlags = [
     "-Dgtk_doc=true"
     "-Ddesktop_docs=false"
   ];
 
+  separateDebugInfo = stdenv.isLinux;
+
   passthru = {
     updateScript = gnome3.updateScript {
       packageName = "gnome-desktop";
@@ -46,7 +88,8 @@ stdenv.mkDerivation rec {
 
   meta = with lib; {
     description = "Library with common API for various GNOME modules";
-    license = with licenses; [ gpl2 lgpl2 ];
+    homepage = "https://gitlab.gnome.org/GNOME/gnome-desktop";
+    license = with licenses; [ gpl2Plus lgpl2Plus ];
     platforms = platforms.linux;
     maintainers = teams.gnome.members;
   };
diff --git a/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix b/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix
index bb602c8b3fa..8ff4145a271 100644
--- a/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix
@@ -1,24 +1,16 @@
-{ lib, stdenv, fetchurl, fetchpatch, meson, ninja, pkg-config, desktop-file-utils, appstream-glib, libxslt
+{ lib, stdenv, fetchurl, meson, ninja, pkg-config, desktop-file-utils, appstream-glib, libxslt
 , libxml2, gettext, itstool, wrapGAppsHook, docbook_xsl, docbook_xml_dtd_43
 , gnome3, gtk3, glib, gsettings-desktop-schemas }:
 
 stdenv.mkDerivation rec {
   pname = "gnome-dictionary";
-  version = "3.26.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-dictionary/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "16b8bc248dcf68987826d5e39234b1bb7fd24a2607fcdbf4258fde88f012f300";
+    url = "mirror://gnome/sources/gnome-dictionary/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1d8dhcfys788vv27v34i3s3x3jdvdi2kqn2a5p8c937a9hm0qr9f";
   };
 
-  patches = [
-    # fix AppStream validation
-    (fetchpatch {
-      url = "https://gitlab.gnome.org/GNOME/gnome-dictionary/commit/1c94d612030ef87c6e26a01a490470b71c39e341.patch";
-      sha256 = "0cbswmhs9mks3gsc0iy4wnidsa8sfzzf4s1kgvb80qwffgxz5m8b";
-    })
-  ];
-
   doCheck = true;
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix b/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix
index 5c573d2502c..87b89c3a05b 100644
--- a/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix
@@ -1,26 +1,66 @@
-{ lib, stdenv, gettext, fetchurl, pkg-config, udisks2, libsecret, libdvdread
-, meson, ninja, gtk3, glib, wrapGAppsHook, python3, libnotify
-, itstool, gnome3, libxml2, gsettings-desktop-schemas
-, libcanberra-gtk3, libxslt, docbook_xsl, libpwquality, systemd }:
+{ lib
+, stdenv
+, gettext
+, fetchurl
+, pkg-config
+, udisks2
+, libhandy
+, libsecret
+, libdvdread
+, meson
+, ninja
+, gtk3
+, glib
+, wrapGAppsHook
+, python3
+, libnotify
+, itstool
+, gnome3
+, libxml2
+, gsettings-desktop-schemas
+, libcanberra-gtk3
+, libxslt
+, docbook-xsl-nons
+, libpwquality
+, systemd
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-disk-utility";
-  version = "3.38.2";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-disk-utility/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-EL7d5UlL6zTjoiDW8w2TIMiCUv7rhCa9mM760YNteOk=";
+    url = "mirror://gnome/sources/gnome-disk-utility/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-KkuZrBHKIzlLKMVYS56WKE6MWk2mXPBiB95U9Csf8UE=";
   };
 
   nativeBuildInputs = [
-    meson ninja pkg-config gettext itstool libxslt docbook_xsl
-    wrapGAppsHook python3 libxml2
+    meson
+    ninja
+    pkg-config
+    gettext
+    itstool
+    libxslt
+    docbook-xsl-nons
+    wrapGAppsHook
+    python3
+    libxml2
   ];
 
   buildInputs = [
-    gtk3 glib libsecret libpwquality libnotify libdvdread libcanberra-gtk3
-    udisks2 gnome3.adwaita-icon-theme systemd
-    gnome3.gnome-settings-daemon gsettings-desktop-schemas
+    gtk3
+    glib
+    libhandy
+    libsecret
+    libpwquality
+    libnotify
+    libdvdread
+    libcanberra-gtk3
+    udisks2
+    gnome3.adwaita-icon-theme
+    systemd
+    gnome3.gnome-settings-daemon
+    gsettings-desktop-schemas
   ];
 
   postPatch = ''
@@ -36,10 +76,10 @@ stdenv.mkDerivation rec {
   };
 
   meta = with lib; {
-    homepage = "https://en.wikipedia.org/wiki/GNOME_Disks";
+    homepage = "https://wiki.gnome.org/Apps/Disks";
     description = "A udisks graphical front-end";
     maintainers = teams.gnome.members;
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix b/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix
index 83563c7d212..6e9b6d22f57 100644
--- a/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix
@@ -1,20 +1,20 @@
 { lib, stdenv, meson, ninja, gettext, fetchurl
-, pkg-config, gtk3, glib, libxml2, gnome-desktop, adwaita-icon-theme
+, pkg-config, gtk3, glib, libxml2, gnome-desktop, adwaita-icon-theme, libhandy
 , wrapGAppsHook, gnome3, harfbuzz }:
 
 stdenv.mkDerivation rec {
   pname = "gnome-font-viewer";
-  version = "3.34.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-font-viewer/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "12xrsqwmvid7hksiw4zhj4jd1qwxn8w0czskbq4yqfprwn1havxa";
+    url = "mirror://gnome/sources/gnome-font-viewer/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0hpyi0sz3gcqqs9lkwyk8b6hr39m3n27432x98kxr436jj37dk6j";
   };
 
   doCheck = true;
 
   nativeBuildInputs = [ meson ninja pkg-config gettext wrapGAppsHook libxml2 ];
-  buildInputs = [ gtk3 glib gnome-desktop adwaita-icon-theme harfbuzz ];
+  buildInputs = [ gtk3 glib gnome-desktop adwaita-icon-theme harfbuzz libhandy ];
 
   # Do not run meson-postinstall.sh
   preConfigure = "sed -i '2,$ d'  meson-postinstall.sh";
diff --git a/pkgs/desktops/gnome-3/core/gnome-initial-setup/0001-fix-paths.patch b/pkgs/desktops/gnome-3/core/gnome-initial-setup/0001-fix-paths.patch
index d4065c14499..23237595225 100644
--- a/pkgs/desktops/gnome-3/core/gnome-initial-setup/0001-fix-paths.patch
+++ b/pkgs/desktops/gnome-3/core/gnome-initial-setup/0001-fix-paths.patch
@@ -5,29 +5,10 @@ Date: Sun, 20 Sep 2020 14:46:59 -0400
 Subject: [PATCH] fix paths
 
 ---
- data/gnome-welcome-tour                               | 4 ++--
  gnome-initial-setup/pages/keyboard/cc-input-chooser.c | 6 +++---
  gnome-initial-setup/pages/timezone/tz.h               | 4 ++--
- 3 files changed, 7 insertions(+), 7 deletions(-)
+ 3 files changed, 5 insertions(+), 5 deletions(-)
 
-diff --git a/data/gnome-welcome-tour b/data/gnome-welcome-tour
-index 51c9b59..68ab0c4 100755
---- a/data/gnome-welcome-tour
-+++ b/data/gnome-welcome-tour
-@@ -3,11 +3,11 @@
- cfgdir=${XDG_CONFIG_DIR:-$HOME/.config}
- 
- # Don't do anything if gnome-tour isn't installed
--gnome_tour_path=$(which gnome-tour 2>/dev/null)
-+gnome_tour_path="@gnome_tour@"
- if test -z "${gnome_tour_path}"; then
-     rm -f $cfgdir/run-welcome-tour
-     exit
- fi
- 
--gnome-tour
-+@gnome_tour@
- rm -f $cfgdir/run-welcome-tour
 diff --git a/gnome-initial-setup/pages/keyboard/cc-input-chooser.c b/gnome-initial-setup/pages/keyboard/cc-input-chooser.c
 index 196abf6..613d0e5 100644
 --- a/gnome-initial-setup/pages/keyboard/cc-input-chooser.c
diff --git a/pkgs/desktops/gnome-3/core/gnome-initial-setup/default.nix b/pkgs/desktops/gnome-3/core/gnome-initial-setup/default.nix
index 435da4e3720..6cf549dc5ca 100644
--- a/pkgs/desktops/gnome-3/core/gnome-initial-setup/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-initial-setup/default.nix
@@ -14,7 +14,6 @@
 , geocode-glib
 , glib
 , gnome-desktop
-, gnome-getting-started-docs
 , gnome-online-accounts
 , gtk3
 , libgweather
@@ -32,18 +31,24 @@
 , tzdata
 , libgnomekbd
 , gsettings-desktop-schemas
-, gnome-tour
 }:
 
 stdenv.mkDerivation rec {
   pname = "gnome-initial-setup";
-  version = "3.38.4";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "001jdzsvc541qracn68r609pr5qwymrh85xrqmvzzc1dbg5w3mlg";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "10zf87n6c947k9rkk2rqc9cbfwcvq23axq3rf7x1an7npv3414gi";
   };
 
+  patches = [
+    (substituteAll {
+      src = ./0001-fix-paths.patch;
+      inherit tzdata libgnomekbd;
+    })
+  ];
+
   nativeBuildInputs = [
     gettext
     meson
@@ -61,7 +66,6 @@ stdenv.mkDerivation rec {
     geocode-glib
     glib
     gnome-desktop
-    gnome-getting-started-docs
     gnome-online-accounts
     gsettings-desktop-schemas
     gtk3
@@ -78,14 +82,6 @@ stdenv.mkDerivation rec {
     webkitgtk
   ];
 
-  patches = [
-    (substituteAll {
-      src = ./0001-fix-paths.patch;
-      inherit tzdata libgnomekbd;
-      gnome_tour = "${gnome-tour}/bin/gnome-tour";
-    })
-  ];
-
   mesonFlags = [
     "-Dcheese=disabled"
     "-Dibus=disabled"
diff --git a/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix b/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix
index 93453cc72e9..833f58f74a4 100644
--- a/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix
@@ -1,51 +1,72 @@
-{ lib, stdenv, fetchurl, fetchpatch, pkg-config, dbus, libgcrypt, pam, python2, glib, libxslt
-, gettext, gcr, libcap_ng, libselinux, p11-kit, openssh, wrapGAppsHook
-, docbook_xsl, docbook_xml_dtd_43, gnome3 }:
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, dbus
+, libgcrypt
+, pam
+, python2
+, glib
+, libxslt
+, gettext
+, gcr
+, libcap_ng
+, libselinux
+, p11-kit
+, openssh
+, wrapGAppsHook
+, docbook-xsl-nons
+, docbook_xml_dtd_43
+, gnome3
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-keyring";
-  version = "3.36.0";
+  version = "40.0";
+
+  outputs = [ "out" "dev" ];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-keyring/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "11sgffrrpss5cmv3b717pqlbhgq17l1xd33fsvqgsw8simxbar52";
+    url = "mirror://gnome/sources/gnome-keyring/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0cdrlcw814zayhvlaxqs1sm9bqlfijlp22dzzd0g5zg2isq4vlm3";
   };
 
-  patches = [
-    # version 3.36.0 is incompatible with libncap_ng >= 0.8.1. remove patch after update.
-    (fetchpatch {
-      url = "https://gitlab.gnome.org/GNOME/gnome-keyring/-/commit/ebc7bc9efacc17049e54da8d96a4a29943621113.diff";
-      sha256 = "07bx7zmdswqsa3dj37m729g35n1prhylkw7ya8a7h64i10la12cs";
-    })
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    libxslt
+    docbook-xsl-nons
+    docbook_xml_dtd_43
+    wrapGAppsHook
   ];
 
-  outputs = [ "out" "dev" ];
-
   buildInputs = [
-    glib libgcrypt pam openssh libcap_ng libselinux
-    gcr p11-kit
+    glib
+    libgcrypt
+    pam
+    openssh
+    libcap_ng
+    libselinux
+    gcr
+    p11-kit
   ];
 
-  nativeBuildInputs = [
-    pkg-config gettext libxslt docbook_xsl docbook_xml_dtd_43 wrapGAppsHook
-  ];
+  # In 3.20.1, tests do not support Python 3
+  checkInputs = [ dbus python2 ];
 
   configureFlags = [
     "--with-pkcs11-config=${placeholder "out"}/etc/pkcs11/" # installation directories
     "--with-pkcs11-modules=${placeholder "out"}/lib/pkcs11/"
   ];
 
-  postPatch = ''
-    patchShebangs build
-  '';
-
   # Tends to fail non-deterministically.
   # - https://github.com/NixOS/nixpkgs/issues/55293
   # - https://github.com/NixOS/nixpkgs/issues/51121
   doCheck = false;
 
-  # In 3.20.1, tests do not support Python 3
-  checkInputs = [ dbus python2 ];
+  postPatch = ''
+    patchShebangs build
+  '';
 
   checkPhase = ''
     export HOME=$(mktemp -d)
diff --git a/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix b/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix
index 432f7d9e2ad..35e7b1a0b02 100644
--- a/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix
@@ -4,13 +4,13 @@
 
 let
   pname = "gnome-screenshot";
-  version = "3.38.0";
+  version = "40.0";
 in stdenv.mkDerivation rec {
   name = "${pname}-${version}";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${name}.tar.xz";
-    sha256 = "1h4zsaybjrlkfcrvriyybg4gfr7v9d1ndh2p516k94ad2gfx6mp5";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${name}.tar.xz";
+    sha256 = "1qm544ymwibk31s30k47vnn79xg30m18r7l4di0c57g375dak31n";
   };
 
   doCheck = true;
diff --git a/pkgs/desktops/gnome-3/core/gnome-session/ctl.nix b/pkgs/desktops/gnome-3/core/gnome-session/ctl.nix
index 05d28de768a..6a274e35bf5 100644
--- a/pkgs/desktops/gnome-3/core/gnome-session/ctl.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-session/ctl.nix
@@ -1,4 +1,5 @@
-{ lib, stdenv
+{ lib
+, stdenv
 , fetchFromGitHub
 , meson
 , ninja
@@ -10,13 +11,13 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-session-ctl";
-  version = "3.38.0";
+  version = "40.0";
 
   src = fetchFromGitHub {
     owner = "nix-community";
     repo = pname;
-    rev = "c20907fea27fa96568b8375a6756c40d0bfb9e40"; # main
-    hash = "sha256-y9/yOH6N8wf93+gPqnqzRzV/lPXYD0M6v7dsLFF8lWo=";
+    rev = version;
+    hash = "sha256-gvBmLx8Qoj1vPsOwaZsd9+pTDvU5D7uUts7ZT1pXwNo=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/core/gnome-session/default.nix b/pkgs/desktops/gnome-3/core/gnome-session/default.nix
index 1fa0a0b0fc6..49363568eab 100644
--- a/pkgs/desktops/gnome-3/core/gnome-session/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-session/default.nix
@@ -1,17 +1,16 @@
 { fetchurl, lib, stdenv, substituteAll, meson, ninja, pkg-config, gnome3, glib, gtk3, gsettings-desktop-schemas
 , gnome-desktop, dbus, json-glib, libICE, xmlto, docbook_xsl, docbook_xml_dtd_412, python3
-, libxslt, gettext, makeWrapper, systemd, xorg, epoxy, gnugrep, bash, gnome-session-ctl
-, fetchpatch }:
+, libxslt, gettext, makeWrapper, systemd, xorg, epoxy, gnugrep, bash, gnome-session-ctl }:
 
 stdenv.mkDerivation rec {
   pname = "gnome-session";
-  version = "3.38.0";
+  version = "40.1.1";
 
   outputs = ["out" "sessions"];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-session/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0rrxjk3vbqy3cdgnl7rw71dvcyrvhwq3m6s53dnkyjxsrnr0xk3v";
+    url = "mirror://gnome/sources/gnome-session/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "10nzyhmgkrzk6i70kj7690na0hmsv6qy5bmr10akxq9jxqlphy4w";
   };
 
   patches = [
@@ -22,12 +21,6 @@ stdenv.mkDerivation rec {
       grep = "${gnugrep}/bin/grep";
       bash = "${bash}/bin/bash";
     })
-    # Fixes 2 minute delay at poweroff.
-    # https://gitlab.gnome.org/GNOME/gnome-session/issues/74
-    (fetchpatch {
-      url = "https://gitlab.gnome.org/GNOME/gnome-session/-/commit/9de6e40f12e8878f524f8d429d85724c156a0517.diff";
-      sha256 = "19vrjdf7d6dfl7sqxvbc5h5lcgk1krgzg5rkssrdzd1h4ma6y8fz";
-    })
   ];
 
   mesonFlags = [ "-Dsystemd=true" "-Dsystemd_session=default" ];
diff --git a/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix b/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix
index e5923e6b56a..d7e549e2893 100644
--- a/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix
@@ -42,11 +42,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-settings-daemon";
-  version = "3.38.1";
+  version = "40.0.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-settings-daemon/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0r010wzw3dj87mapzvq15zv93i86wg0x0rpii3x2wapq3bcj30g2";
+    url = "mirror://gnome/sources/gnome-settings-daemon/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "08bv32hvsmd8izw0llvldg0c2d71srch4hi8j94jwgm5d4dsrprp";
   };
 
   patches = [
diff --git a/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix b/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix
index 8b882df3b00..035633d676a 100644
--- a/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix
@@ -1,13 +1,13 @@
-{ lib, stdenv, fetchurl, meson, ninja, gettext, pkg-config, spidermonkey_68, glib
+{ lib, stdenv, fetchurl, fetchpatch, meson, ninja, gettext, pkg-config, spidermonkey_68, glib
 , gnome3, gnome-menus, substituteAll }:
 
 stdenv.mkDerivation rec {
   pname = "gnome-shell-extensions";
-  version = "3.38.2";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-shell-extensions/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0hzn975v49rv3nsqp8m0mzv8gcm7nyvn54gj3zsml8ahlxwl592p";
+    url = "mirror://gnome/sources/gnome-shell-extensions/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "15hak4prx2nx1svfii39clxy1lll8crdf7p91if85jcsh6r8ab8p";
   };
 
   passthru = {
@@ -22,6 +22,14 @@ stdenv.mkDerivation rec {
       src = ./fix_gmenu.patch;
       gmenu_path = "${gnome-menus}/lib/girepository-1.0";
     })
+
+    # Do not show welcome dialog in gnome-classic.
+    # Needed for gnome-shell 40.1.
+    # https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/169
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-shell-extensions/commit/3e8bbb07ea7109c44d5ac7998f473779e742d041.patch";
+      sha256 = "jSmPwSBgRBfPPP9mGVjw1mSWumIXQqtA6tSqHr3U+3w=";
+    })
   ];
 
   doCheck = true;
diff --git a/pkgs/desktops/gnome-3/core/gnome-shell/default.nix b/pkgs/desktops/gnome-3/core/gnome-shell/default.nix
index 97a72e379a5..078582f439f 100644
--- a/pkgs/desktops/gnome-3/core/gnome-shell/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-shell/default.nix
@@ -1,5 +1,6 @@
 { fetchurl
 , fetchpatch
+, fetchgit
 , substituteAll
 , lib, stdenv
 , meson
@@ -22,8 +23,7 @@
 , librsvg
 , geoclue2
 , perl
-, docbook_xml_dtd_42
-, docbook_xml_dtd_43
+, docbook_xml_dtd_45
 , desktop-file-utils
 , libpulseaudio
 , libical
@@ -46,6 +46,7 @@
 , mutter
 , evolution-data-server
 , gtk3
+, gtk4
 , sassc
 , systemd
 , pipewire
@@ -66,14 +67,20 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "gnome-shell";
-  version = "3.38.3";
+  version = "40.0-unstable-2021-05-01";
 
   outputs = [ "out" "devdoc" ];
 
-  src = fetchurl {
-    url = "mirror://gnome/sources/gnome-shell/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-U0W0GMsSqXKVXOXM6u1mYkgAJzNrXFHa6lcwV1tiHO0=";
+  src = fetchgit {
+    url = "https://gitlab.gnome.org/GNOME/gnome-shell.git";
+    rev = "a8a79c03330427808e776c344f7ebc42782a1b5a";
+    sha256 = "ivHV0SRpnBqsdC7fu1Xhtd/BA55O0UdbUyDLy5KHNYs=";
+    fetchSubmodules = true;
   };
+  # src = fetchurl {
+  #   url = "mirror://gnome/sources/gnome-shell/${lib.versions.major version}/${pname}-${version}.tar.xz";
+  #   sha256 = "sha256-vOcfQC36qcXiab9lv0iiI0PYlubPmiw0ZpOS1/v2hHg=";
+  # };
 
   patches = [
     # Hardcode paths to various dependencies so that they can be found at runtime.
@@ -97,6 +104,12 @@ stdenv.mkDerivation rec {
       revert = true;
       sha256 = "14h7ahlxgly0n3sskzq9dhxzbyb04fn80pv74vz1526396676dzl";
     })
+
+    # Work around failing fingerprint auth
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/gnome-shell/raw/9a647c460b651aaec0b8a21f046cc289c1999416/f/0001-gdm-Work-around-failing-fingerprint-auth.patch";
+      sha256 = "pFvZli3TilUt6YwdZztpB8Xq7O60XfuWUuPMMVSpqLw=";
+    })
   ];
 
   nativeBuildInputs = [
@@ -105,9 +118,7 @@ stdenv.mkDerivation rec {
     pkg-config
     gettext
     docbook-xsl-nons
-    # Switch to 4.5 in the 40.
-    docbook_xml_dtd_42
-    docbook_xml_dtd_43
+    docbook_xml_dtd_45
     gtk-doc
     perl
     wrapGAppsHook
@@ -137,6 +148,7 @@ stdenv.mkDerivation rec {
     evolution-data-server
     libical
     gtk3
+    gtk4
     gdm
     geoclue2
     adwaita-icon-theme
@@ -189,7 +201,7 @@ stdenv.mkDerivation rec {
 
   postFixup = ''
     # The services need typelibs.
-    for svc in org.gnome.Shell.Extensions org.gnome.Shell.Notifications org.gnome.Shell.Screencast; do
+    for svc in org.gnome.ScreenSaver org.gnome.Shell.Extensions org.gnome.Shell.Notifications org.gnome.Shell.Screencast; do
       wrapGApp $out/share/gnome-shell/$svc
     done
   '';
diff --git a/pkgs/desktops/gnome-3/core/gnome-shell/shew-gir-path.patch b/pkgs/desktops/gnome-3/core/gnome-shell/shew-gir-path.patch
index 2d7bdf30315..6d888725b5d 100644
--- a/pkgs/desktops/gnome-3/core/gnome-shell/shew-gir-path.patch
+++ b/pkgs/desktops/gnome-3/core/gnome-shell/shew-gir-path.patch
@@ -3,7 +3,7 @@
 @@ -13,7 +13,7 @@ shew_sources = [
  libshew = library(full_name,
    sources: shew_sources,
-   dependencies: [gtk_dep],
+   dependencies: [gtk_dep, x11_dep],
 -  install_dir: pkglibdir,
 +  install_dir: get_option('prefix') / pkglibdir,
    install: true,
diff --git a/pkgs/desktops/gnome-3/core/gnome-software/default.nix b/pkgs/desktops/gnome-3/core/gnome-software/default.nix
index ff80efaa4de..d26dc801d69 100644
--- a/pkgs/desktops/gnome-3/core/gnome-software/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-software/default.nix
@@ -11,8 +11,9 @@
 , packagekit
 , ostree
 , glib
-, appstream-glib
+, appstream
 , libsoup
+, libhandy
 , polkit
 , isocodes
 , gspell
@@ -42,11 +43,11 @@ in
 
 stdenv.mkDerivation rec {
   pname = "gnome-software";
-  version = "3.38.0";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-software/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0rjm486vgn6gi9mv1rqdcvr9cilmw6in4r6djqkxbxqll89cp2l7";
+    url = "mirror://gnome/sources/gnome-software/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "16q2902swxsjdxb1nj335sv1bb76rvq4w6dn4yszkwf3s0fd86in";
   };
 
   patches = [
@@ -76,8 +77,9 @@ stdenv.mkDerivation rec {
     gtk3
     glib
     packagekit
-    appstream-glib
+    appstream
     libsoup
+    libhandy
     gsettings-desktop-schemas
     gnome-desktop
     gspell
@@ -94,7 +96,6 @@ stdenv.mkDerivation rec {
   ];
 
   mesonFlags = [
-    "-Dubuntu_reviews=false"
     "-Dgudev=false"
     # FIXME: package malcontent parental controls
     "-Dmalcontent=false"
diff --git a/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix b/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix
index db978f953b7..44e24e7cdf6 100644
--- a/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix
@@ -1,26 +1,63 @@
-{ lib, stdenv, gettext, fetchurl, pkg-config, gtkmm3, libxml2
-, bash, gtk3, glib, wrapGAppsHook, meson, ninja, python3
-, gsettings-desktop-schemas, itstool, gnome3, librsvg, gdk-pixbuf, libgtop, systemd }:
+{ lib
+, stdenv
+, gettext
+, fetchurl
+, pkg-config
+, gtkmm3
+, libxml2
+, bash
+, gtk3
+, libhandy
+, glib
+, wrapGAppsHook
+, meson
+, ninja
+, python3
+, gsettings-desktop-schemas
+, itstool
+, gnome3
+, librsvg
+, gdk-pixbuf
+, libgtop
+, systemd
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-system-monitor";
-  version = "3.38.0";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-system-monitor/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1x5gd30g87im7fnqj63njlac69zywfd1r0vgsxkjag2hsns7mgvk";
+    url = "mirror://gnome/sources/gnome-system-monitor/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "06hxd4igxas2kyind5jwfq5qbfkknykpdfy2sy3anylhcx1hzczx";
   };
 
-  doCheck = true;
-
   nativeBuildInputs = [
-    pkg-config gettext itstool wrapGAppsHook meson ninja python3
+    pkg-config
+    gettext
+    itstool
+    wrapGAppsHook
+    meson
+    ninja
+    python3
   ];
+
   buildInputs = [
-    bash gtk3 glib libxml2 gtkmm3 libgtop gdk-pixbuf gnome3.adwaita-icon-theme librsvg
-    gsettings-desktop-schemas systemd
+    bash
+    gtk3
+    libhandy
+    glib
+    libxml2
+    gtkmm3
+    libgtop
+    gdk-pixbuf
+    gnome3.adwaita-icon-theme
+    librsvg
+    gsettings-desktop-schemas
+    systemd
   ];
 
+  doCheck = true;
+
   postPatch = ''
     chmod +x meson_post_install.py # patchShebangs requires executable file
     patchShebangs meson_post_install.py
diff --git a/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix b/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix
index 52aee2a004a..de5cb767d54 100644
--- a/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix
@@ -5,11 +5,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-terminal";
-  version = "3.38.3";
+  version = "3.40.1";
 
   src = fetchurl {
     url = "mirror://gnome/sources/gnome-terminal/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "EaWw1jXxX9znUINRpRD79OkqpTMVKlD/DHhF4xAuR2Q=";
+    sha256 = "1r6qd6w18gk83w32y6bvn4hg2hd7qvngak4ymwpgndyp41rwqw07";
   };
 
   buildInputs = [
diff --git a/pkgs/desktops/gnome-3/core/gnome-tour/default.nix b/pkgs/desktops/gnome-3/core/gnome-tour/default.nix
index 61f8761ce81..4e6c58a14e8 100644
--- a/pkgs/desktops/gnome-3/core/gnome-tour/default.nix
+++ b/pkgs/desktops/gnome-3/core/gnome-tour/default.nix
@@ -22,11 +22,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-tour";
-  version = "3.38.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    hash = "sha256-hV/C/Lyz6e9zhe3FRw4Sox5gMqThDP57wVCTgcekjng=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    hash = "sha256-cGMiOGmgdHJ0FL7H23ONhQYhbuhMz8O8p9rFLkmMG/k=";
   };
 
   cargoVendorDir = "vendor";
diff --git a/pkgs/desktops/gnome-3/core/gvc-with-ucm-prePatch.nix b/pkgs/desktops/gnome-3/core/gvc-with-ucm-prePatch.nix
deleted file mode 100644
index b2db2baf025..00000000000
--- a/pkgs/desktops/gnome-3/core/gvc-with-ucm-prePatch.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{ fetchFromGitLab }:
-
-let
-  # We need a gvc different then that which is shipped in the source tarball of
-  # whatever package that imports this file
-  gvc-src-with-ucm = fetchFromGitLab {
-    domain = "gitlab.gnome.org";
-    owner = "GNOME";
-    repo = "libgnome-volume-control";
-    rev = "7a621180b46421e356b33972e3446775a504139c";
-    sha256 = "07rkgh9f7qcmlpy6jqh944axzh3z38f47g48ii842f2i3a1mrbw9";
-  };
-in
-''
-  rm -r ./subprojects/gvc
-  cp -r ${gvc-src-with-ucm} ./subprojects/gvc
-''
diff --git a/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix b/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix
index 65d2bbc2157..f4b76996ac4 100644
--- a/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix
+++ b/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix
@@ -17,13 +17,6 @@ stdenv.mkDerivation rec {
   propagatedBuildInputs = [ glib gobject-introspection dbus libgcrypt ];
   nativeBuildInputs = [ pkg-config intltool ];
 
-  passthru = {
-    updateScript = gnome3.updateScript {
-      packageName = pname;
-      attrPath = "gnome3.${pname}";
-    };
-  };
-
   meta = {
     description = "Framework for managing passwords and other secrets";
     homepage = "https://wiki.gnome.org/Projects/GnomeKeyring";
diff --git a/pkgs/desktops/gnome-3/core/mutter/default.nix b/pkgs/desktops/gnome-3/core/mutter/default.nix
index 03c20e1ef6a..2dda38bb4e7 100644
--- a/pkgs/desktops/gnome-3/core/mutter/default.nix
+++ b/pkgs/desktops/gnome-3/core/mutter/default.nix
@@ -45,24 +45,31 @@
 
 let self = stdenv.mkDerivation rec {
   pname = "mutter";
-  version = "3.38.3";
+  version = "40.0";
 
   outputs = [ "out" "dev" "man" ];
 
   src = fetchurl {
-    url = "mirror://gnome/sources/mutter/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-sjIec9Hj/i6Q5jAfQrugf02UvGR1aivxPXWunW+qIB8=";
+    url = "mirror://gnome/sources/mutter/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-enGzEuWmZ8U3SJUYilBqP2tnF2i8s2K2jv3FYnc9GY4=";
   };
 
   patches = [
     # Drop inheritable cap_sys_nice, to prevent the ambient set from leaking
     # from mutter/gnome-shell, see https://github.com/NixOS/nixpkgs/issues/71381
-    ./drop-inheritable.patch
+    # ./drop-inheritable.patch
 
     (substituteAll {
       src = ./fix-paths.patch;
       inherit zenity;
     })
+
+    # Fix non-deterministic build failure:
+    # https://gitlab.gnome.org/GNOME/mutter/-/issues/1682
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/mutter/commit/91117bb052ed0d69c8ea4159c1df15c814d90627.patch";
+      sha256 = "ek8hEoPP4S2TGOm6SGGOhUVIp4OT68nz0SQzZrceFUU=";
+    })
   ];
 
   mesonFlags = [
@@ -155,7 +162,7 @@ let self = stdenv.mkDerivation rec {
   meta = with lib; {
     description = "A window manager for GNOME";
     homepage = "https://gitlab.gnome.org/GNOME/mutter";
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     maintainers = teams.gnome.members;
     platforms = platforms.linux;
   };
diff --git a/pkgs/desktops/gnome-3/core/nautilus/default.nix b/pkgs/desktops/gnome-3/core/nautilus/default.nix
index 5ca1efe1ca3..29c44ecd6e9 100644
--- a/pkgs/desktops/gnome-3/core/nautilus/default.nix
+++ b/pkgs/desktops/gnome-3/core/nautilus/default.nix
@@ -9,6 +9,8 @@
 , python3
 , wrapGAppsHook
 , gtk3
+, libhandy
+, libportal
 , gnome3
 , gnome-autoar
 , glib-networking
@@ -32,11 +34,11 @@
 
 stdenv.mkDerivation rec {
   pname = "nautilus";
-  version = "3.38.2";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "19ln84d6s05h6cvx3c500bg5pvkz4k6p6ykmr2201rblq9afp76h";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0cwxr7bfa19dvzra81s9wfshzv0zv7ycpfffn4amigd0fh0vkkwf";
   };
 
   patches = [
@@ -71,6 +73,8 @@ stdenv.mkDerivation rec {
     gsettings-desktop-schemas
     gst_all_1.gst-plugins-base
     gtk3
+    libhandy
+    libportal
     libexif
     libnotify
     libseccomp
diff --git a/pkgs/desktops/gnome-3/core/rygel/default.nix b/pkgs/desktops/gnome-3/core/rygel/default.nix
index 75b2bd29270..da82d30214e 100644
--- a/pkgs/desktops/gnome-3/core/rygel/default.nix
+++ b/pkgs/desktops/gnome-3/core/rygel/default.nix
@@ -96,6 +96,7 @@ stdenv.mkDerivation rec {
     updateScript = gnome3.updateScript {
       packageName = pname;
       attrPath = "gnome3.${pname}";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/core/simple-scan/default.nix b/pkgs/desktops/gnome-3/core/simple-scan/default.nix
index 64009cd75eb..59d61febc06 100644
--- a/pkgs/desktops/gnome-3/core/simple-scan/default.nix
+++ b/pkgs/desktops/gnome-3/core/simple-scan/default.nix
@@ -14,6 +14,7 @@
 , gtk3
 , gusb
 , packagekit
+, libhandy
 , libwebp
 , libxml2
 , sane-backends
@@ -24,11 +25,11 @@
 
 stdenv.mkDerivation rec {
   pname = "simple-scan";
-  version = "3.38.2";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-qI2AcpaCiIZJzfzfqGkrCjSs3ladwICIjyea/DqcTQs=";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-E4EbsqhhnmOkP8Lva3E1ny1cQITG1cizqtYXJLIHUa8=";
   };
 
   nativeBuildInputs = [
@@ -51,6 +52,7 @@ stdenv.mkDerivation rec {
     gnome3.adwaita-icon-theme
     gusb
     gtk3
+    libhandy
     libwebp
     packagekit
     sane-backends
diff --git a/pkgs/desktops/gnome-3/core/sushi/default.nix b/pkgs/desktops/gnome-3/core/sushi/default.nix
index f5e85a1f16c..73097f99e51 100644
--- a/pkgs/desktops/gnome-3/core/sushi/default.nix
+++ b/pkgs/desktops/gnome-3/core/sushi/default.nix
@@ -5,8 +5,6 @@
 , gettext
 , gobject-introspection
 , glib
-, clutter-gtk
-, clutter-gst
 , gnome3
 , gtksourceview4
 , gjs
@@ -40,14 +38,13 @@ stdenv.mkDerivation rec {
     gobject-introspection
     wrapGAppsHook
   ];
+
   buildInputs = [
     glib
     gtk3
     gnome3.evince
     icu
     harfbuzz
-    clutter-gtk
-    clutter-gst
     gjs
     gtksourceview4
     gdk-pixbuf
diff --git a/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix b/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix
index 22ce6c72011..c5e859954ff 100644
--- a/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix
+++ b/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix
@@ -10,11 +10,11 @@
 
 stdenv.mkDerivation rec {
   pname = "yelp-xsl";
-  version = "3.38.3";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/yelp-xsl/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-GTtqvUaXt7Qh6Yw21NMTXaCw/bUapT5gLtNo3YTR/QM=";
+    url = "mirror://gnome/sources/yelp-xsl/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-Nh7NTTP8zbO7CKaH9g5cPpCdLp47Ai2ETgSYINDPYrA=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/core/yelp/default.nix b/pkgs/desktops/gnome-3/core/yelp/default.nix
index 754a7748668..1e1d679f852 100644
--- a/pkgs/desktops/gnome-3/core/yelp/default.nix
+++ b/pkgs/desktops/gnome-3/core/yelp/default.nix
@@ -5,11 +5,11 @@
 
 stdenv.mkDerivation rec {
   pname = "yelp";
-  version = "3.38.3";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/yelp/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "sha256-r9RqTQrrRrtCXFIAcdgY+LKzLmnnVqv9mXlodpphVJ0=";
+    url = "mirror://gnome/sources/yelp/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "sha256-B3dfoGzSg2Xs2Cm7FqhaaCiXqyHYzONFlrvvXNRVquA=";
   };
 
   nativeBuildInputs = [ pkg-config gettext itstool wrapGAppsHook ];
diff --git a/pkgs/desktops/gnome-3/default.nix b/pkgs/desktops/gnome-3/default.nix
index c4e203913be..7d72e16c326 100644
--- a/pkgs/desktops/gnome-3/default.nix
+++ b/pkgs/desktops/gnome-3/default.nix
@@ -176,8 +176,6 @@ lib.makeScope pkgs.newScope (self: with self; {
 
   gnome-documents = callPackage ./apps/gnome-documents { };
 
-  gnome-getting-started-docs = callPackage ./apps/gnome-getting-started-docs { };
-
   gnome-logs = callPackage ./apps/gnome-logs { };
 
   gnome-maps = callPackage ./apps/gnome-maps { };
@@ -361,4 +359,6 @@ lib.makeScope pkgs.newScope (self: with self; {
   maintainers = lib.teams.gnome.members;
 
   mutter328 = throw "Removed as Pantheon is upgraded to mutter334.";
+
+  gnome-getting-started-docs = throw "Removed in favour of gnome-tour.";
 })
diff --git a/pkgs/desktops/gnome-3/devtools/devhelp/default.nix b/pkgs/desktops/gnome-3/devtools/devhelp/default.nix
index 173e4a9e5b8..9a68f151b4a 100644
--- a/pkgs/desktops/gnome-3/devtools/devhelp/default.nix
+++ b/pkgs/desktops/gnome-3/devtools/devhelp/default.nix
@@ -20,11 +20,11 @@
 
 stdenv.mkDerivation rec {
   pname = "devhelp";
-  version = "3.38.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/devhelp/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "13sa25mmlc49kn520hdfbskma65y7smvwmyhfggj0n9s3fazba2d";
+    url = "mirror://gnome/sources/devhelp/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0zr64qp5c6jcc3x5hmfp7jhzpi96qwr6xplyfkmz4kjzvr9xidjd";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix b/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix
index bdbe73d2f88..6349a318456 100644
--- a/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix
+++ b/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-devel-docs";
-  version = "3.38.2";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-devel-docs/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1h6481hbz1c5p69r6h96hbgf560lhp1jibszscgw0s2yikdh6q8n";
+    url = "mirror://gnome/sources/gnome-devel-docs/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0zqp01ks8m3s6jn5xqd05rw4fwbvxy5qvcfg9g50b2ar2j7v1ar8";
   };
 
   passthru = {
diff --git a/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix b/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix
index cb8ece571e7..d432043d380 100644
--- a/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix
+++ b/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix
@@ -19,7 +19,7 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-shell-gsconnect";
-  version = "44";
+  version = "46";
 
   outputs = [ "out" "installedTests" ];
 
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
     owner = "andyholmes";
     repo = "gnome-shell-extension-gsconnect";
     rev = "v${version}";
-    sha256 = "C+8mhK4UOs2iZplDyY45bCX0mMGgwVV/ZfaPpYUlWxA=";
+    sha256 = "161379kipr6z6gbhchb5b17djrkg5fbvblyyabzkc2gv05r3h6fw";
   };
 
   patches = [
diff --git a/pkgs/desktops/gnome-3/extensions/hot-edge/default.nix b/pkgs/desktops/gnome-3/extensions/hot-edge/default.nix
new file mode 100644
index 00000000000..aaa5870996a
--- /dev/null
+++ b/pkgs/desktops/gnome-3/extensions/hot-edge/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-shell-extension-hot-edge";
+  version = "jdoda";
+
+  src = fetchFromGitHub {
+    owner = "jdoda";
+    repo = "hotedge";
+    rev = "bb7f651becea5287241caf7cda246a68ab07dac8";
+    sha256 = "oeTs0kRan6b5relxzhK1IKbV0Yv2d5YdvvUPJ3fM9ik=";
+  };
+
+  dontBuild = true;
+
+  uuid = "hotedge@jonathan.jdoda.ca";
+
+  installPhase = ''
+    runHook preInstall
+    install -Dt $out/share/gnome-shell/extensions/${uuid} extension.js metadata.json stylesheet.css
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Replace the top-left hot corner with a bottom hot edge";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ jtojnar ];
+    homepage = "https://github.com/jdoda/hotedge";
+  };
+}
diff --git a/pkgs/desktops/gnome-3/find-latest-version.py b/pkgs/desktops/gnome-3/find-latest-version.py
index ad80af24bcb..3078999e3e5 100644
--- a/pkgs/desktops/gnome-3/find-latest-version.py
+++ b/pkgs/desktops/gnome-3/find-latest-version.py
@@ -3,14 +3,21 @@ import math
 import json
 import requests
 import sys
+from libversion import Version
+from typing import Optional
 
 
 def version_to_list(version):
     return list(map(int, version.split(".")))
 
 
-def odd_unstable(version_str, selected):
-    version = version_to_list(version_str)
+def odd_unstable(version: Version, selected):
+    try:
+        version = version_to_list(version.value)
+    except:
+        # Failing to parse as a list of numbers likely means the version contains a string tag like “beta”, therefore it is not a stable release.
+        return selected != "stable"
+
     if len(version) < 2:
         return True
 
@@ -23,28 +30,34 @@ def odd_unstable(version_str, selected):
         return True
 
 
-def no_policy(version, selected):
+def tagged(version: Version, selected):
+    if selected == "stable":
+        return not ("alpha" in version.value or "beta" in version.value or "rc" in version.value)
+    else:
+        return True
+
+
+def no_policy(version: Version, selected):
     return True
 
 
 version_policies = {
     "odd-unstable": odd_unstable,
+    "tagged": tagged,
     "none": no_policy,
 }
 
 
-def make_version_policy(version_predicate, selected, upper_bound):
+def make_version_policy(version_predicate, selected, upper_bound: Optional[Version]):
     if not upper_bound:
-        upper_bound = [math.inf, math.inf]
+        return lambda version: version_predicate(version, selected)
     else:
-        upper_bound = version_to_list(upper_bound)
-
-    return lambda version: version_predicate(version, selected) and version_to_list(version) < upper_bound
+        return lambda version: version_predicate(version, selected) and version < upper_bound
 
 
 parser = argparse.ArgumentParser(description="Find latest version for a GNOME package by crawling their release server.")
 parser.add_argument("package-name", help="Name of the directory in https://ftp.gnome.org/pub/GNOME/sources/ containing the package.")
-parser.add_argument("version-policy", help="Policy determining which versions are considered stable. For most GNOME packages, odd minor versions are unstable but there are exceptions.", choices=version_policies.keys(), nargs="?", default="odd-unstable")
+parser.add_argument("version-policy", help="Policy determining which versions are considered stable. GNOME packages usually denote stability by alpha/beta/rc tag in the version. For older packages, odd minor versions are unstable but there are exceptions.", choices=version_policies.keys(), nargs="?", default="tagged")
 parser.add_argument("requested-release", help="Most of the time, we will want to update to stable version but sometimes it is useful to test.", choices=["stable", "unstable"], nargs="?", default="stable")
 parser.add_argument("--upper-bound", dest="upper-bound", help="Only look for versions older than this one (useful for pinning dependencies).")
 
@@ -55,6 +68,8 @@ if __name__ == "__main__":
     package_name = getattr(args, "package-name")
     requested_release = getattr(args, "requested-release")
     upper_bound = getattr(args, "upper-bound")
+    if upper_bound:
+        upper_bound = Version(upper_bound)
     version_predicate = version_policies[getattr(args, "version-policy")]
     version_policy = make_version_policy(version_predicate, requested_release, upper_bound)
 
@@ -64,11 +79,11 @@ if __name__ == "__main__":
         print("Unknown format of cache.json file.", file=sys.stderr)
         sys.exit(1)
 
-    versions = cache[2][package_name]
-    versions = sorted(filter(version_policy, versions), key=version_to_list)
+    versions = map(Version, cache[2][package_name])
+    versions = sorted(filter(version_policy, versions))
 
     if len(versions) == 0:
         print("No versions matched.", file=sys.stderr)
         sys.exit(1)
 
-    print(versions[-1])
+    print(versions[-1].value)
diff --git a/pkgs/desktops/gnome-3/games/gnome-chess/default.nix b/pkgs/desktops/gnome-3/games/gnome-chess/default.nix
index 918adc0eccf..c8bea5a98d2 100644
--- a/pkgs/desktops/gnome-3/games/gnome-chess/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-chess/default.nix
@@ -1,17 +1,50 @@
-{ lib, stdenv, fetchurl, meson, ninja, vala, pkg-config, wrapGAppsHook, gobject-introspection
-, gettext, itstool, libxml2, python3, gnome3, glib, gtk3, librsvg }:
+{ lib
+, stdenv
+, fetchurl
+, meson
+, ninja
+, vala
+, pkg-config
+, wrapGAppsHook4
+, gobject-introspection
+, gettext
+, itstool
+, libxml2
+, python3
+, gnome3
+, glib
+, gtk4
+, librsvg
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-chess";
-  version = "3.38.1";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-chess/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1bpmi5p5vvjdq2rlm5x9k4gpci8jbrjvdxr1q62h5znzq0vz0w0l";
+    url = "mirror://gnome/sources/gnome-chess/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "132nc96z0bryyi9d5gljsbwsa71rl8wm5w57jbhpwiv4fyjhgybk";
   };
 
-  nativeBuildInputs = [ meson ninja vala pkg-config gettext itstool libxml2 python3 wrapGAppsHook gobject-introspection ];
-  buildInputs = [ glib gtk3 librsvg gnome3.adwaita-icon-theme ];
+  nativeBuildInputs = [
+    meson
+    ninja
+    vala
+    pkg-config
+    gettext
+    itstool
+    libxml2
+    python3
+    wrapGAppsHook4
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    glib
+    gtk4
+    librsvg
+    gnome3.adwaita-icon-theme
+  ];
 
   postPatch = ''
     chmod +x meson_post_install.py
@@ -29,7 +62,7 @@ stdenv.mkDerivation rec {
     homepage = "https://wiki.gnome.org/Apps/Chess";
     description = "Play the classic two-player boardgame of chess";
     maintainers = teams.gnome.members;
-    license = licenses.gpl2;
+    license = licenses.gpl3Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix b/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix
index fe1f092fbf0..4bafc3b4a8d 100644
--- a/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix
@@ -5,13 +5,13 @@
 
 let
   pname = "gnome-klotski";
-  version = "3.38.1";
+  version = "3.38.2";
 in stdenv.mkDerivation rec {
   name = "${pname}-${version}";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${name}.tar.xz";
-    sha256 = "00rwi6z0068pbq01sq2d389ffcqsh3ylq3i8zkrqvblqid1hvnlv";
+    sha256 = "1qm01hdd5yp8chig62bj10912vclbdvywwczs84sfg4zci2phqwi";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/games/gnome-mines/default.nix b/pkgs/desktops/gnome-3/games/gnome-mines/default.nix
index 600b0d98468..f074fb08daa 100644
--- a/pkgs/desktops/gnome-3/games/gnome-mines/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-mines/default.nix
@@ -3,11 +3,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-mines";
-  version = "3.36.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0m2680r94nk61imym4x73j03jwfjd8cxm592m5ybiqdfdw6i723i";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0sf6kdvhr4pr3hddnj6ql9larz2wy108sri31id6x9g459nbly8z";
   };
 
   # gobject-introspection for finding vapi files
diff --git a/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix b/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix
index 501b894a1df..c3d9fb19725 100644
--- a/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix
@@ -1,7 +1,26 @@
-{ lib, stdenv, fetchurl, pkg-config, gnome3, gtk3, wrapGAppsHook
-, librsvg, gsound, clutter-gtk, gettext, itstool, vala, python3
-, libxml2, libgee, libgnome-games-support, meson, ninja
-, desktop-file-utils, hicolor-icon-theme}:
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, pkg-config
+, gnome3
+, gtk3
+, wrapGAppsHook
+, librsvg
+, gsound
+, clutter-gtk
+, gettext
+, itstool
+, vala
+, python3
+, libxml2
+, libgee
+, libgnome-games-support
+, meson
+, ninja
+, desktop-file-utils
+, hicolor-icon-theme
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-nibbles";
@@ -12,14 +31,40 @@ stdenv.mkDerivation rec {
     sha256 = "1naknfbciydbym79a0jq039xf0033z8gyln48c0qsbcfr2qn8yj5";
   };
 
+  patches = [
+    # Fix build with recent Vala.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-nibbles/-/commit/62964e9256fcac616109af874dbb2bd8342a9853.patch";
+      sha256 = "4VijELRxycS8rwi1HU9U3h9K/VtdQjJntfdtMN9Uz34=";
+    })
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-nibbles/-/commit/1b48446068608aff9b5edf1fdbd4b8c0d9f0be94.patch";
+      sha256 = "X0+Go5ae4F06WTPDYc2HIIax8X4RDgUGO6A6Qp8UifQ=";
+    })
+  ];
+
   nativeBuildInputs = [
-    meson ninja vala python3
-    pkg-config wrapGAppsHook gettext itstool libxml2
-    desktop-file-utils hicolor-icon-theme
+    meson
+    ninja
+    vala
+    python3
+    pkg-config
+    wrapGAppsHook
+    gettext
+    itstool
+    libxml2
+    desktop-file-utils
+    hicolor-icon-theme
   ];
+
   buildInputs = [
-    gtk3 librsvg gsound clutter-gtk gnome3.adwaita-icon-theme
-    libgee libgnome-games-support
+    gtk3
+    librsvg
+    gsound
+    clutter-gtk
+    gnome3.adwaita-icon-theme
+    libgee
+    libgnome-games-support
   ];
 
   passthru = {
diff --git a/pkgs/desktops/gnome-3/games/gnome-robots/default.nix b/pkgs/desktops/gnome-3/games/gnome-robots/default.nix
index e9a079216b7..1a49ee38760 100644
--- a/pkgs/desktops/gnome-3/games/gnome-robots/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-robots/default.nix
@@ -1,26 +1,54 @@
-{ lib, stdenv, fetchurl, pkg-config, gnome3, gtk3, wrapGAppsHook
-, librsvg, gsound, gettext, itstool, libxml2, libgnome-games-support
-, libgee, meson, ninja, python3, desktop-file-utils, adwaita-icon-theme }:
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, gnome3
+, gtk3
+, wrapGAppsHook
+, librsvg
+, gsound
+, gettext
+, itstool
+, libxml2
+, libgnome-games-support
+, libgee
+, meson
+, ninja
+, vala
+, python3
+, desktop-file-utils
+, adwaita-icon-theme
+}:
 
 stdenv.mkDerivation rec {
   pname = "gnome-robots";
-  version = "3.38.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-robots/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1qpzpsyj9i5dsfy7anfb2dcm602bjkcgqj86fxvnxy6llx56ks0z";
-  };
-
-  passthru = {
-    updateScript = gnome3.updateScript { packageName = "gnome-robots"; attrPath = "gnome3.gnome-robots"; };
+    url = "mirror://gnome/sources/gnome-robots/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "04fbykj576dq1h6cycgfhh8wd6yxmlsqykvj188sbwahay42zgvg";
   };
 
   nativeBuildInputs = [
-    pkg-config meson ninja python3
-    libxml2 wrapGAppsHook gettext itstool desktop-file-utils
+    pkg-config
+    meson
+    ninja
+    vala
+    python3
+    libxml2
+    wrapGAppsHook
+    gettext
+    itstool
+    desktop-file-utils
   ];
+
   buildInputs = [
-    gtk3 librsvg gsound libgnome-games-support libgee adwaita-icon-theme
+    gtk3
+    librsvg
+    gsound
+    libgnome-games-support
+    libgee
+    adwaita-icon-theme
   ];
 
   postPatch = ''
@@ -28,11 +56,18 @@ stdenv.mkDerivation rec {
     patchShebangs build-aux/meson_post_install.py
   '';
 
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-robots";
+      attrPath = "gnome3.gnome-robots";
+    };
+  };
+
   meta = with lib; {
     homepage = "https://wiki.gnome.org/Apps/Robots";
     description = "Avoid the robots and make them crash into each other";
     maintainers = teams.gnome.members;
-    license = licenses.gpl2;
+    license = licenses.gpl3Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix b/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix
index 7c5fd8f1ac9..101f3c4f2bd 100644
--- a/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix
@@ -3,11 +3,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-sudoku";
-  version = "3.38.0";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/gnome-sudoku/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0cpxx63liczmax6ry06r5k0f221xpg2rqh49vkdj2snmqq61swrq";
+    url = "mirror://gnome/sources/gnome-sudoku/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1nr1g4q1gxqbzmaz15y3zgssnj7w01cq9l422ja4rglyg0fwjhbm";
   };
 
   nativeBuildInputs = [ meson ninja vala pkg-config gobject-introspection gettext itstool libxml2 python3 desktop-file-utils wrapGAppsHook ];
diff --git a/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix b/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix
index 9b8c78d6e4a..91bd9637344 100644
--- a/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix
+++ b/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix
@@ -1,6 +1,21 @@
-{ lib, stdenv, fetchurl, pkg-config, gnome3, gtk3, wrapGAppsHook
-, librsvg, gsound, gettext, itstool, libxml2
-, meson, ninja, vala, python3, desktop-file-utils
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, pkg-config
+, gnome3
+, gtk3
+, wrapGAppsHook
+, librsvg
+, gsound
+, gettext
+, itstool
+, libxml2
+, meson
+, ninja
+, vala
+, python3
+, desktop-file-utils
 }:
 
 stdenv.mkDerivation rec {
@@ -12,24 +27,49 @@ stdenv.mkDerivation rec {
     sha256 = "0kw131q0ad0rbsp6qifjc8fjlhvjxyihil8a76kj8ya9mn7kvnwn";
   };
 
-  passthru = {
-    updateScript = gnome3.updateScript { packageName = "gnome-taquin"; attrPath = "gnome3.gnome-taquin"; };
-  };
+  patches = [
+    # Fix build with recent Vala.
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-taquin/-/commit/99dea5e7863e112f33f16e59898c56a4f1a547b3.patch";
+      sha256 = "U7djuMhb1XJaKAPyogQjaunOkbBK24r25YD7BgH05P4=";
+    })
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-taquin/-/commit/66be44dc20d114e449fc33156e3939fd05dfbb16.patch";
+      sha256 = "RN41RCLHlJyXTARSH9qjsmpYi1UFeMRssoYxRsbngDQ=";
+    })
+  ];
 
   nativeBuildInputs = [
-    pkg-config wrapGAppsHook meson ninja python3
-    gettext itstool libxml2 vala desktop-file-utils
+    pkg-config
+    wrapGAppsHook
+    meson
+    ninja
+    python3
+    gettext
+    itstool
+    libxml2
+    vala
+    desktop-file-utils
   ];
   buildInputs = [
-    gtk3 librsvg gsound
+    gtk3
+    librsvg
+    gsound
     gnome3.adwaita-icon-theme
   ];
 
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-taquin";
+      attrPath = "gnome3.gnome-taquin";
+    };
+  };
+
   meta = with lib; {
     homepage = "https://wiki.gnome.org/Apps/Taquin";
     description = "Move tiles so that they reach their places";
     maintainers = teams.gnome.members;
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/games/iagno/default.nix b/pkgs/desktops/gnome-3/games/iagno/default.nix
index db3b0d21151..443a417da50 100644
--- a/pkgs/desktops/gnome-3/games/iagno/default.nix
+++ b/pkgs/desktops/gnome-3/games/iagno/default.nix
@@ -26,6 +26,20 @@ stdenv.mkDerivation rec {
     sha256 = "097dw1l92l73xah9l56ka5mi3dvx48ffpiv33ni5i5rqw0ng7fc4";
   };
 
+  patches = [
+    # Fix build with recent Vala.
+    # https://gitlab.gnome.org/GNOME/dconf-editor/-/merge_requests/15
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/iagno/-/commit/e8a0aeec350ea80349582142c0e8e3cd3f1bce38.patch";
+      sha256 = "OO1x0Yx56UFzHTBsPAMYAjnJHlnTjdO1Vk7q6XU8wKQ=";
+    })
+    # https://gitlab.gnome.org/GNOME/dconf-editor/-/merge_requests/13
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/iagno/-/commit/508c0f94e5f182e50ff61be6e04f72574dee97cb.patch";
+      sha256 = "U7djuMhb1XJaKAPyogQjaunOkbBK24r25YD7BgH05P4=";
+    })
+  ];
+
   nativeBuildInputs = [
     meson
     ninja
diff --git a/pkgs/desktops/gnome-3/games/lightsoff/default.nix b/pkgs/desktops/gnome-3/games/lightsoff/default.nix
index 6783147840c..7e43583d529 100644
--- a/pkgs/desktops/gnome-3/games/lightsoff/default.nix
+++ b/pkgs/desktops/gnome-3/games/lightsoff/default.nix
@@ -4,11 +4,11 @@
 
 stdenv.mkDerivation rec {
   pname = "lightsoff";
-  version = "3.38.0";
+  version = "40.0.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/lightsoff/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "0dpnnw8v1yk1p0y08f9c9xkgswqlm8x83dfn96798nif2zbypdnh";
+    url = "mirror://gnome/sources/lightsoff/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1aziy64g15bm83zfn3ifs20z9yvscdvsxbx132xnq77i0r3qvlxc";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/gnome-3/games/swell-foop/default.nix b/pkgs/desktops/gnome-3/games/swell-foop/default.nix
index 33dd9de1b42..d29ac55ce28 100644
--- a/pkgs/desktops/gnome-3/games/swell-foop/default.nix
+++ b/pkgs/desktops/gnome-3/games/swell-foop/default.nix
@@ -1,32 +1,67 @@
-{ lib, stdenv, fetchurl, meson, ninja, pkg-config, vala, glib, gtk3, gnome3, desktop-file-utils
-, clutter, clutter-gtk, gettext, itstool, libxml2, wrapGAppsHook, python3 }:
+{ lib
+, stdenv
+, fetchurl
+, meson
+, ninja
+, pkg-config
+, vala
+, glib
+, gtk3
+, libgnome-games-support
+, gnome3
+, desktop-file-utils
+, clutter
+, clutter-gtk
+, gettext
+, itstool
+, libxml2
+, wrapGAppsHook
+, python3
+}:
 
-let
+stdenv.mkDerivation rec {
   pname = "swell-foop";
-  version = "3.34.1";
-in stdenv.mkDerivation rec {
-  name = "${pname}-${version}";
+  version = "40.1";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${name}.tar.xz";
-    sha256 = "1032psxm59nissi268bh3j964m4a0n0ah4dy1pf0ph27j3zvdik1";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "17r4b0g8s7z872wdd7ngk248z7fqx43vm2sym1bdqhzsi250s1y1";
   };
 
-  passthru = {
-    updateScript = gnome3.updateScript {
-      packageName = pname;
-      attrPath = "gnome3.${pname}";
-    };
-  };
+  nativeBuildInputs = [
+    meson
+    ninja
+    vala
+    pkg-config
+    wrapGAppsHook
+    python3
+    itstool
+    gettext
+    libxml2
+    desktop-file-utils
+  ];
 
-  nativeBuildInputs = [ meson ninja vala pkg-config wrapGAppsHook python3 itstool gettext libxml2 desktop-file-utils ];
-  buildInputs = [ glib gtk3 gnome3.adwaita-icon-theme clutter clutter-gtk ];
+  buildInputs = [
+    glib
+    gtk3
+    libgnome-games-support
+    gnome3.adwaita-icon-theme
+    clutter
+    clutter-gtk
+  ];
 
   postPatch = ''
     chmod +x meson_post_install.py # patchShebangs requires executable file
     patchShebangs meson_post_install.py
   '';
 
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
   meta = with lib; {
     homepage = "https://wiki.gnome.org/Apps/Swell%20Foop";
     description = "Puzzle game, previously known as Same GNOME";
diff --git a/pkgs/desktops/gnome-3/games/tali/default.nix b/pkgs/desktops/gnome-3/games/tali/default.nix
index b9409605f24..e5aad262aa9 100644
--- a/pkgs/desktops/gnome-3/games/tali/default.nix
+++ b/pkgs/desktops/gnome-3/games/tali/default.nix
@@ -5,11 +5,11 @@
 
 stdenv.mkDerivation rec {
   pname = "tali";
-  version = "3.38.3";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/tali/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "AhVCi1DEoIJ/sN4uTmum5WZ4+bp22NJbfuyoUhXyWjk=";
+    url = "mirror://gnome/sources/tali/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "19gic6yjg3bg6jf87zvhm7ihsz1y58dz86p4x3a16xdhjyrk40q2";
   };
 
   passthru = {
diff --git a/pkgs/desktops/gnome-3/misc/geary/Bump-client-test-timeout-to-300s.patch b/pkgs/desktops/gnome-3/misc/geary/Bump-client-test-timeout-to-300s.patch
deleted file mode 100644
index abd8772cf31..00000000000
--- a/pkgs/desktops/gnome-3/misc/geary/Bump-client-test-timeout-to-300s.patch
+++ /dev/null
@@ -1,10 +0,0 @@
-diff --git a/test/meson.build b/test/meson.build
-index 6ea5e27a..450c03e3 100644
---- a/test/meson.build
-+++ b/test/meson.build
-@@ -167,4 +167,4 @@ test_integration_bin = executable('test-integration',
- )
- 
- test('engine-tests', test_engine_bin)
--test('client-tests', test_client_bin)
-+test('client-tests', test_client_bin, timeout: 300)
diff --git a/pkgs/desktops/gnome-3/misc/geary/default.nix b/pkgs/desktops/gnome-3/misc/geary/default.nix
index ff97d34f7ce..3abddaedaec 100644
--- a/pkgs/desktops/gnome-3/misc/geary/default.nix
+++ b/pkgs/desktops/gnome-3/misc/geary/default.nix
@@ -1,4 +1,5 @@
-{ lib, stdenv
+{ lib
+, stdenv
 , fetchurl
 , pkg-config
 , gtk3
@@ -15,6 +16,7 @@
 , libsecret
 , gmime3
 , isocodes
+, icu
 , libxml2
 , gettext
 , sqlite
@@ -37,6 +39,7 @@
 , gobject-introspection
 , gspell
 , appstream-glib
+, libstemmer
 , libytnef
 , libhandy
 , gsound
@@ -44,18 +47,13 @@
 
 stdenv.mkDerivation rec {
   pname = "geary";
-  version = "3.38.1";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "04p8fjkz4xp5afp0ld1m09pnv0zkcx51l7hf23amfrjkk0kj2bp7";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "1c2nd35500ng28223y5pszc7fh8g16njj34f6p5xc9594lvj0mik";
   };
 
-  patches = [
-    # Longer timeout for client test.
-    ./Bump-client-test-timeout-to-300s.patch
-  ];
-
   nativeBuildInputs = [
     appstream-glib
     desktop-file-utils
@@ -84,12 +82,14 @@ stdenv.mkDerivation rec {
     gspell
     gtk3
     isocodes
+    icu
     json-glib
     libgee
     libhandy
     libpeas
     libsecret
     libunwind
+    libstemmer
     libytnef
     sqlite
     webkitgtk
@@ -104,7 +104,8 @@ stdenv.mkDerivation rec {
   ];
 
   mesonFlags = [
-    "-Dcontractor=true" # install the contractor file (Pantheon specific)
+    "-Dprofile=release"
+    "-Dcontractor=enabled" # install the contractor file (Pantheon specific)
   ];
 
   # NOTE: Remove `build-auxyaml_to_json.py` when no longer needed, see:
@@ -118,21 +119,23 @@ stdenv.mkDerivation rec {
     patchShebangs build-aux/yaml_to_json.py
 
     chmod +x desktop/geary-attach
-
-    # Drop test that breaks after webkitgtk 2.32.0 update
-    # https://gitlab.gnome.org/GNOME/geary/-/issues/1180
-    sed -i '/add_test("edit_context_font", edit_context_font);/d' test/js/composer-page-state-test.vala
   '';
 
-  doCheck = true;
+  # Some tests time out.
+  doCheck = false;
 
   checkPhase = ''
+    runHook preCheck
+
     NO_AT_BRIDGE=1 \
     GIO_EXTRA_MODULES=$GIO_EXTRA_MODULES:${glib-networking}/lib/gio/modules \
+    HOME=$TMPDIR \
     XDG_DATA_DIRS=$XDG_DATA_DIRS:${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}:${shared-mime-info}/share:${folks}/share/gsettings-schemas/${folks.name} \
     xvfb-run -s '-screen 0 800x600x24' dbus-run-session \
       --config-file=${dbus.daemon}/share/dbus-1/session.conf \
       meson test -v --no-stdsplit
+
+    runHook postCheck
   '';
 
   preFixup = ''
diff --git a/pkgs/desktops/gnome-3/misc/gitg/default.nix b/pkgs/desktops/gnome-3/misc/gitg/default.nix
index 0f4f8e67737..49205751591 100644
--- a/pkgs/desktops/gnome-3/misc/gitg/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gitg/default.nix
@@ -1,6 +1,6 @@
-{ lib, stdenv
+{ lib
+, stdenv
 , fetchurl
-, fetchpatch
 , vala
 , gettext
 , pkg-config
@@ -36,16 +36,16 @@ stdenv.mkDerivation rec {
     sha256 = "0npg4kqpwl992fgjd2cn3fh84aiwpdp9kd8z7rw2xaj2iazsm914";
   };
 
-  postPatch = ''
-    chmod +x meson_post_install.py
-    patchShebangs meson_post_install.py
-
-    substituteInPlace tests/libgitg/test-commit.vala --replace "/bin/bash" "${bash}/bin/bash"
-  '';
-
-  doCheck = true;
-
-  enableParallelBuilding = true;
+  nativeBuildInputs = [
+    gobject-introspection
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
 
   buildInputs = [
     adwaita-icon-theme
@@ -63,16 +63,14 @@ stdenv.mkDerivation rec {
     libsoup
   ];
 
-  nativeBuildInputs = [
-    gobject-introspection
-    gettext
-    meson
-    ninja
-    pkg-config
-    python3
-    vala
-    wrapGAppsHook
-  ];
+  doCheck = false; # FAIL: tests-gitg gtk_style_context_add_provider_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+
+    substituteInPlace tests/libgitg/test-commit.vala --replace "/bin/bash" "${bash}/bin/bash"
+  '';
 
   preFixup = ''
     gappsWrapperArgs+=(
@@ -91,7 +89,7 @@ stdenv.mkDerivation rec {
     homepage = "https://wiki.gnome.org/Apps/Gitg";
     description = "GNOME GUI client to view git repositories";
     maintainers = with maintainers; [ domenkozar ];
-    license = licenses.gpl2;
+    license = licenses.gpl2Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix b/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix
index 1947179028b..21dedba16ad 100644
--- a/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix
@@ -16,17 +16,18 @@
 , adwaita-icon-theme
 , libgweather
 , gucharmap
+, tracker
 , polkit
 , gnome3
 }:
 
 stdenv.mkDerivation rec {
   pname = "gnome-applets";
-  version = "3.38.0";
+  version = "3.40.0";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "04qrzycwm7pz556agl08xw3d0r1mmr4ja9n9jfijjxs9inrhp5yc";
+    sha256 = "1k6mdkg16ia29fyg8ikf4dfs51gnrmg0f8xwpvd3192lhfsbsh19";
   };
 
   nativeBuildInputs = [
@@ -48,7 +49,7 @@ stdenv.mkDerivation rec {
     adwaita-icon-theme
     libgweather
     gucharmap
-    # tracker # Tracker 3 not supported.
+    tracker
     polkit
     wirelesstools
     linuxPackages.cpupower
@@ -65,6 +66,7 @@ stdenv.mkDerivation rec {
     updateScript = gnome3.updateScript {
       packageName = pname;
       attrPath = "gnome3.${pname}";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix b/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix
index 2d66dabb5a0..8d5f07579c6 100644
--- a/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix
@@ -11,13 +11,13 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-autoar";
-  version = "0.3.1";
+  version = "0.3.2";
 
   outputs = [ "out" "dev" ];
 
   src = fetchurl {
     url = "mirror://gnome/sources/gnome-autoar/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1y6hh5dldhdq7mpbmd571zl0yadfackvifhnxvykkqqddwz72y0f";
+    sha256 = "0wkwix44yg126xn1v4f2j60bv9yiyadfpzf8ifx0bvd9x5f4v354";
   };
 
   passthru = {
diff --git a/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix b/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix
index 935778aa649..501000f204f 100644
--- a/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix
@@ -30,7 +30,7 @@
 }:
 let
   pname = "gnome-flashback";
-  version = "3.38.0";
+  version = "3.40.0";
 
   # From data/sessions/Makefile.am
   requiredComponentsCommon = [
@@ -61,7 +61,7 @@ let
 
     src = fetchurl {
       url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${name}.tar.xz";
-      sha256 = "1r51yqdqichp4jv54kiaqrh0xhykngr4ymlvrkjhzdhivwadsg4m";
+      sha256 = "0fxv13m2q9z1q3i9jbggl35cb7jlckbdrfsr5sf030hr1w836gz0";
     };
 
     # make .desktop Execs absolute
@@ -123,6 +123,7 @@ let
       updateScript = gnome3.updateScript {
         packageName = pname;
         attrPath = "gnome3.${pname}";
+        versionPolicy = "odd-unstable";
       };
 
       mkSessionForWm = { wmName, wmLabel, wmCommand }:
diff --git a/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix b/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix
index b820f7750dc..113849b935a 100644
--- a/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix
@@ -23,13 +23,13 @@
 
 stdenv.mkDerivation rec {
   pname = "gnome-panel";
-  version = "3.38.0";
+  version = "3.40.0";
 
   outputs = [ "out" "dev" "man" ];
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    hash = "sha256-GosVrvCgKmyqm5IJyNP7Q+e5h6OAB2aRwj8DFOwwLxU=";
+    hash = "sha256-nxNQde3GZs8rnKkd41xnA+KxdxwQp3B0FPtlbCilmzs=";
   };
 
   # make .desktop Exec absolute
@@ -85,6 +85,7 @@ stdenv.mkDerivation rec {
     updateScript = gnome3.updateScript {
       packageName = pname;
       attrPath = "gnome3.${pname}";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix b/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix
index b6a12fca133..5d57d7616f0 100644
--- a/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix
@@ -10,7 +10,7 @@
 , gsettings-desktop-schemas
 , gtk3
 , itstool
-, libhandy_0
+, libhandy
 , libnotify
 , libsoup
 , libxml2
@@ -20,13 +20,13 @@
 
 python3Packages.buildPythonApplication rec {
   pname = "gnome-tweaks";
-  version = "3.34.1";
+  version = "40.0";
   format = "other";
   strictDeps = false; # https://github.com/NixOS/nixpkgs/issues/56943
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "19y62dj4n5i6v4zpjllxl51dch6ndy8xs45v5aqmmq9xyfrqk5yq";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "+V8/4DGwsBwC95oWWfiJFS03cq4+RN+EA9FGC6Xuw2o=";
   };
 
   nativeBuildInputs = [
@@ -51,7 +51,7 @@ python3Packages.buildPythonApplication rec {
     gnome3.mutter
     gsettings-desktop-schemas
     gtk3
-    libhandy_0
+    libhandy
     libnotify
     libsoup
   ];
@@ -72,10 +72,10 @@ python3Packages.buildPythonApplication rec {
   };
 
   meta = with lib; {
-    homepage = "https://wiki.gnome.org/action/show/Apps/GnomeTweakTool";
+    homepage = "https://wiki.gnome.org/Apps/Tweaks";
     description = "A tool to customize advanced GNOME 3 options";
     maintainers = teams.gnome.members;
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     platforms = platforms.linux;
   };
 }
diff --git a/pkgs/desktops/gnome-3/misc/gpaste/default.nix b/pkgs/desktops/gnome-3/misc/gpaste/default.nix
index 7dbf6daffa7..15fcfbfe390 100644
--- a/pkgs/desktops/gnome-3/misc/gpaste/default.nix
+++ b/pkgs/desktops/gnome-3/misc/gpaste/default.nix
@@ -17,14 +17,14 @@
 }:
 
 stdenv.mkDerivation rec {
-  version = "3.38.6";
+  version = "3.40.2";
   pname = "gpaste";
 
   src = fetchFromGitHub {
     owner = "Keruspe";
     repo = "GPaste";
     rev = "v${version}";
-    sha256 = "sha256-6CIzOBq/Y9XKiv/lQAtDYK6bxhT1WxjbXhu4+noO5nI=";
+    sha256 = "sha256-DUikcnkDBRkCwPLrl8lkNr+SeNpc3bPwPTWRn91nOo4=";
   };
 
   patches = [
diff --git a/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch b/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch
index c8a3fad2272..46e30ce2e2c 100644
--- a/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch
+++ b/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch
@@ -17,7 +17,7 @@
  
 +imports.gi.GIRepository.Repository.prepend_search_path('@typelibPath@');
 +
- const { GPaste } = imports.gi;
+ //const { GPaste } = imports.gi;
  
  const ExtensionUtils = imports.misc.extensionUtils;
 --- a/src/libgpaste/settings/gpaste-settings.c
diff --git a/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix b/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix
index 01899d20b57..f594c1b0a4d 100644
--- a/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix
+++ b/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix
@@ -14,11 +14,11 @@
 
 stdenv.mkDerivation rec {
   pname = "libgnome-games-support";
-  version = "1.8.0";
+  version = "1.8.1";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1pdk9hc30xdlv0ba24f7pvcr2d5370zykrmpws7hgmjgl4wfbpdb";
+    sha256 = "0gs1k88wwafn5cdyb5yq1cxpi9azachb0ysxgwh15sx77g6plyy3";
   };
 
   nativeBuildInputs = [
@@ -44,6 +44,7 @@ stdenv.mkDerivation rec {
     updateScript = gnome3.updateScript {
       packageName = pname;
       attrPath = "gnome3.${pname}";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/misc/metacity/default.nix b/pkgs/desktops/gnome-3/misc/metacity/default.nix
index c74d57d9f4d..36c6b66d5ca 100644
--- a/pkgs/desktops/gnome-3/misc/metacity/default.nix
+++ b/pkgs/desktops/gnome-3/misc/metacity/default.nix
@@ -18,11 +18,11 @@
 
 stdenv.mkDerivation rec {
   pname = "metacity";
-  version = "3.38.0";
+  version = "3.40.0";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1b0i9sq6qa540f2006cv1p8i6lxg1h6w00apxwzwjpfqn0hk26c1";
+    sha256 = "1d8mj2nshijshfiaica8dirfws1p6i9631frq7q23b3y91jiyk12";
   };
 
   patches = [
@@ -58,6 +58,7 @@ stdenv.mkDerivation rec {
     updateScript = gnome3.updateScript {
       packageName = pname;
       attrPath = "gnome3.${pname}";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix b/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix
index 4db81228a07..0008f66e9ad 100644
--- a/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix
+++ b/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix
@@ -49,6 +49,7 @@ stdenv.mkDerivation rec {
     updateScript = gnome3.updateScript {
       packageName = pname;
       attrPath = "gnome3.${pname}";
+      versionPolicy = "odd-unstable";
     };
   };
 
diff --git a/pkgs/desktops/gnome-3/update.nix b/pkgs/desktops/gnome-3/update.nix
index 1bceddf77eb..928eac45160 100644
--- a/pkgs/desktops/gnome-3/update.nix
+++ b/pkgs/desktops/gnome-3/update.nix
@@ -1,8 +1,8 @@
 { stdenv, pkgs, lib, writeScript, python3, common-updater-scripts }:
-{ packageName, attrPath ? packageName, versionPolicy ? "odd-unstable", freeze ? false }:
+{ packageName, attrPath ? packageName, versionPolicy ? "tagged", freeze ? false }:
 
 let
-  python = python3.withPackages (p: [ p.requests ]);
+  python = python3.withPackages (p: [ p.requests p.libversion ]);
   upperBoundFlag =
     let
       package = lib.attrByPath (lib.splitString "." attrPath) (throw "Cannot find attribute ‘${attrPath}’.") pkgs;
diff --git a/pkgs/desktops/pantheon/apps/appcenter/default.nix b/pkgs/desktops/pantheon/apps/appcenter/default.nix
index 1c86de61607..a3e75d231f1 100644
--- a/pkgs/desktops/pantheon/apps/appcenter/default.nix
+++ b/pkgs/desktops/pantheon/apps/appcenter/default.nix
@@ -37,9 +37,18 @@ stdenv.mkDerivation rec {
     owner = "elementary";
     repo = pname;
     rev = version;
-    sha256 = "sha256-8r0DlmG8xlCQ1uFHZQjXG2ls4VBrsRzrVY8Ey3/OYAU=";
+    sha256 = "MsaXdmL+M+NYAJrrwluleeNxqQg0soFbO/G/FqibBFI=";
   };
 
+  patches = [
+    # Allow build with appstream 0.14.x
+    # https://github.com/elementary/appcenter/pull/1493
+    (fetchpatch {
+      url = "https://github.com/elementary/appcenter/commit/5807dd13fe3c715f26225aed8d7a0abdea0c2a64.patch";
+      sha256 = "BvEahG9lU9ZdgooFDFhm5evRvnKVcmcHLdmZPb85gbo=";
+    })
+  ];
+
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
diff --git a/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix b/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
index f9ab49a72b9..cf0d0d812fe 100644
--- a/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
@@ -18,6 +18,7 @@
 , python3
 , libnotify
 , libical
+, libgdata
 , evolution-data-server
 , appstream-glib
 , elementary-icon-theme
@@ -67,6 +68,7 @@ stdenv.mkDerivation rec {
     libgee
     libical
     libnotify
+    libgdata # required by some dependency transitively
   ];
 
   postPatch = ''
diff --git a/pkgs/desktops/pantheon/apps/elementary-code/default.nix b/pkgs/desktops/pantheon/apps/elementary-code/default.nix
index 7339038b080..e8b10227eaa 100644
--- a/pkgs/desktops/pantheon/apps/elementary-code/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-code/default.nix
@@ -1,5 +1,6 @@
 { lib, stdenv
 , fetchFromGitHub
+, fetchpatch
 , nix-update-script
 , pantheon
 , pkg-config
@@ -39,6 +40,14 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-4AEayj+K/lOW6jEYmvmdan1kTqqqLL1YzwcU7/3PH5U=";
   };
 
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/code/commit/c50580d3336296823da9a2c50b824f21fde50286.patch";
+      sha256 = "F+ZYlnZWYCU68G4oayLfbTnvSnTb4YA0zHVGD/Uf3KA=";
+    })
+  ];
+
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
diff --git a/pkgs/desktops/pantheon/apps/elementary-music/default.nix b/pkgs/desktops/pantheon/apps/elementary-music/default.nix
index 24eafcabdea..5a5c314b3e9 100644
--- a/pkgs/desktops/pantheon/apps/elementary-music/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-music/default.nix
@@ -1,5 +1,6 @@
 { lib, stdenv
 , fetchFromGitHub
+, fetchpatch
 , nix-update-script
 , pantheon
 , pkg-config
@@ -41,6 +42,14 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-3GZoBCu9rF+BnNk9APBzKWO1JYg1XYWwrEvwcjWvYDE=";
   };
 
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/music/commit/9ed3bbb3a0d68e289a772b4603f58e52a4973316.patch";
+      sha256 = "fFO97SQzTc2fYFJFGfFPSUCdkCgZxfX1fjDQ7GH4BUs=";
+    })
+  ];
+
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
diff --git a/pkgs/desktops/pantheon/apps/elementary-photos/default.nix b/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
index ca0b3951351..7280051361a 100644
--- a/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
+++ b/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
@@ -1,5 +1,6 @@
 { lib, stdenv
 , fetchFromGitHub
+, fetchpatch
 , nix-update-script
 , pantheon
 , meson
@@ -45,6 +46,14 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-bTk4shryAWWMrKX3mza6xQ05qpBPf80Ey7fmYgKLUiY=";
   };
 
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/photos/commit/27e529fc96da828982563e2e19a6f0cef883a29e.patch";
+      sha256 = "w39wh45VHggCs62TN6wpUEyz/hJ1y7qL1Ox+sp0Pt2s=";
+    })
+  ];
+
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
diff --git a/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
index 06d8041339d..7387ea34e4d 100644
--- a/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
+++ b/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
@@ -25,6 +25,14 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-tnAJyyPN/Xy1pmlgBpgO2Eb5CeHrRltjQTHmuTPBt8s=";
   };
 
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-printers/commit/5eced5ddda6f229d7265ea0a713f6c1cd181a526.patch";
+      sha256 = "lPTNqka6jjvv1JnAqVzVIQBIdDXlCOQ5ASvgZNuEUC8=";
+    })
+  ];
+
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
diff --git a/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
index 6a18f6b6e23..26e26de33b1 100644
--- a/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
+++ b/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
@@ -1,5 +1,6 @@
 { lib, stdenv
 , fetchFromGitHub
+, fetchpatch
 , nix-update-script
 , pantheon
 , meson
@@ -28,6 +29,14 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-Sws6FqUL7QAROInDrcqYAp6j1TCC4aGV0/hi5Kmm5wQ=";
   };
 
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-security-privacy/commit/c8e422e630bbee0badcf4df26364c9e83e06bad0.patch";
+      sha256 = "5Gm+muZiCraJC5JaGVVo0HDJ7KxjOpclHRW1RKsk3bc=";
+    })
+  ];
+
   passthru = {
     updateScript = nix-update-script {
       attrPath = "pantheon.${pname}";
diff --git a/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
index c4e070aeacb..03954fac644 100644
--- a/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
+++ b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
@@ -15,6 +15,7 @@
 , libgee
 , libxml2
 , libsoup
+, libgdata
 , elementary-calendar
 }:
 
@@ -52,6 +53,7 @@ stdenv.mkDerivation rec {
     libical
     libsoup
     wingpanel
+    libgdata # required by some dependency transitively
   ];
 
   postPatch = ''
diff --git a/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix b/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
index a37e43cd355..a9a310ade82 100644
--- a/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
+++ b/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
@@ -2,6 +2,7 @@
 , substituteAll
 , fetchurl
 , fetchgit
+, fetchpatch
 , meson
 , ninja
 , pkg-config
@@ -73,6 +74,20 @@ stdenv.mkDerivation rec {
     #"${patchPath}/ubuntu_ibus_configs.patch"
     # https://github.com/elementary/os-patches/blob/6975d1c254cb6ab913b8e2396877203aea8eaa65/debian/patches/elementary-dpms.patch
     ./elementary-dpms.patch
+
+    # Query GWeather DB on the fly instead of caching.
+    # Needed for the next patch to apply.
+    # https://gitlab.gnome.org/GNOME/gnome-settings-daemon/merge_requests/175
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-settings-daemon/commit/df6c69f028d27b53ac86829e11df103b25ed5a74.patch";
+      sha256 = "bKZkPzN64DXMgitjn0vUzUvKl7ldhN/mNVtPKVmHd0Q=";
+    })
+    # Adjust to libgweather changes.
+    # https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/merge_requests/217
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-settings-daemon/commit/82d88014dfca2df7e081712870e1fb017c16b808.patch";
+      sha256 = "H5k/v+M2bRaswt5nrDJFNn4gS4BdB0UfzdjUCT4yLKg=";
+    })
   ];
 
   nativeBuildInputs = [
diff --git a/pkgs/desktops/xfce/core/xfce4-panel/default.nix b/pkgs/desktops/xfce/core/xfce4-panel/default.nix
index 0a08d388238..d0b1862c3f7 100644
--- a/pkgs/desktops/xfce/core/xfce4-panel/default.nix
+++ b/pkgs/desktops/xfce/core/xfce4-panel/default.nix
@@ -1,7 +1,6 @@
 { mkXfceDerivation
 , exo
 , garcon
-, gettext
 , glib
 , gobject-introspection
 , gtk3
@@ -17,9 +16,9 @@
 mkXfceDerivation {
   category = "xfce";
   pname = "xfce4-panel";
-  version = "4.16.2";
+  version = "4.16.3";
 
-  sha256 = "0wy66viwjnp1c0lgf90fp3vyqy0f1m1kbfdym8a0yrv2b6sn3958";
+  sha256 = "085hxllsf792sgi8nn0qjfj5vclbrw2dgrgzl6gy55lxcbhkml9x";
 
   nativeBuildInputs = [
     gobject-introspection
@@ -45,9 +44,6 @@ mkXfceDerivation {
   patches = [ ./xfce4-panel-datadir.patch ];
 
   postPatch = ''
-    for f in $(find . -name \*.sh); do
-      substituteInPlace $f --replace gettext ${gettext}/bin/gettext
-    done
     substituteInPlace plugins/clock/clock.c \
        --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
   '';
@@ -56,6 +52,6 @@ mkXfceDerivation {
   NIX_CFLAGS_COMPILE = "-I${glib.dev}/include/gio-unix-2.0";
 
   meta = {
-    description = "Xfce's panel";
+    description = "Panel for the Xfce desktop environment";
   };
 }
diff --git a/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin/default.nix b/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin/default.nix
index 1f79e0ffb29..d4492948ac6 100644
--- a/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin/default.nix
+++ b/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin/default.nix
@@ -3,16 +3,11 @@
 mkXfceDerivation {
   category = "panel-plugins";
   pname = "xfce4-clipman-plugin";
-  version = "1.6.1";
-  sha256 = "03akijvry1n1fkziyvxwcksl4vy4lmnpgd5izjs8jai5sndhsszl";
+  version = "1.6.2";
+  sha256 = "0pm4pzq3imc0m09mg0zk6kwcn5yzdgiqgdbpws01q3xz58jmb4a6";
 
   buildInputs = [ libXtst libxfce4ui xfce4-panel xfconf ];
 
-  postPatch = ''
-    # exo-csource has been dropped from exo
-    substituteInPlace panel-plugin/Makefile.am --replace exo-csource xdt-csource
-  '';
-
   meta = {
     description = "Clipboard manager for Xfce panel";
   };