about summary refs log tree commit diff
path: root/nixpkgs/pkgs/desktops/gnome-3
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/desktops/gnome-3')
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/accerciser/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/cheese/default.nix58
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/evolution/default.nix61
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/file-roller/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gedit/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/ghex/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/glade/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-books/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix65
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-documents/default.nix60
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix25
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-logs/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-music/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-nettool/default.nix27
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-photos/default.nix60
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-power-manager/default.nix60
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-todo/default.nix86
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/nautilus-sendto/default.nix31
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/polari/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/seahorse/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/vinagre/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/baobab/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/caribou/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/dconf-editor/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/dconf/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/empathy/default.nix64
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/eog/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/epiphany/default.nix50
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/evince/default.nix130
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix64
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/fix-paths.patch11
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/hardcode-gsettings.patch36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gdm/default.nix82
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gdm/fix-paths.patch60
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch31
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_extra_args.patch38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch40
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gdm/reset-environment.patch20
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gjs/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix22
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-color-manager/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-common/default.nix27
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix61
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix85
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch167
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/bubblewrap-paths.patch15
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix73
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-accounts/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-miners/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-remote-desktop/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/default.nix67
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/fix-paths.patch38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix123
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/fix-paths.patch26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/global-backlight-helper.patch26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix65
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/fix_gmenu.patch11
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/default.nix99
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/fix-paths.patch22
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/fix-paths.patch11
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix50
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-themes-extra/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-docs/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-share/default.nix74
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/grilo-plugins/default.nix82
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/grilo/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/grilo/setup-hook.sh7
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/default.nix59
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/unicode-data.nix45
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/mutter/3.28.nix88
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/mutter/default.nix79
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths-328.patch13
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths.patch13
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/nautilus/bubblewrap-paths.patch15
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/nautilus/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/nautilus/extension_dir.patch24
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/rygel/add-option-for-installation-sysconfdir.patch38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/rygel/default.nix106
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/simple-scan/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/sushi/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/totem/default.nix65
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/default.nix101
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/fix-paths.patch20
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker/default.nix71
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker/fix-paths.patch12
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/vino/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/yelp-tools/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/yelp/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/zenity/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/default.nix401
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/devtools/anjuta/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/devtools/devhelp/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix25
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/bool_slot.patch13
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/default.nix50
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/safe_ptr.patch10
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/appindicator/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/battery-status/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/caffeine/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/chrome-gnome-shell/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/clipboard-indicator/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-dock/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-panel/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix91
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/fix-paths.patch44
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/icon-hider/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/impatience.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/mediaplayer/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/fix-paths.patch56
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/nohotcorner/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/remove-dropdown-arrows/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/sound-output-device-chooser/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/paths_and_nonexisting_dirs.patch23
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/fix-paths.patch99
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/tilingnome/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/timepp/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/topicons-plus/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/volume-mixer.nix34
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/window-corner-preview/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/workspace-grid.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/find-latest-version.py60
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/aisleriot/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/atomix/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/five-or-more/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/four-in-a-row/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-chess/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-mahjongg/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-mines/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-robots/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-tetravex/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/hitori/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/iagno/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/lightsoff/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/quadrapassel/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/swell-foop/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/tali/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/installer.nix15
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/geary/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gitg/default.nix104
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix88
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix170
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-packagekit/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix110
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/default.nix96
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/fix-dbus-service-dir.patch11
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gnome-video-effects/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gtkhtml/default.nix27
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/metacity/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/metacity/fix-paths.patch11
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix62
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/pidgin/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/pomodoro/default.nix73
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/update.nix16
184 files changed, 8904 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/accerciser/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/accerciser/default.nix
new file mode 100644
index 000000000000..efff8f846b94
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/accerciser/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook, gobject-introspection
+, itstool, libxml2, python3Packages, at-spi2-core
+, dbus, gettext, libwnck3 }:
+
+stdenv.mkDerivation rec {
+  name = "accerciser-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/accerciser/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0afzhbig5yw87zyfmid61368jj8l6i7k8gs29x0hv65fz4yiv4h4";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig wrapGAppsHook itstool gettext
+    gobject-introspection # For setup hook
+  ];
+  buildInputs = [
+    gtk3 libxml2 python3Packages.python python3Packages.pyatspi
+    python3Packages.pygobject3 python3Packages.ipython
+    at-spi2-core dbus libwnck3 gnome3.adwaita-icon-theme
+  ];
+
+  wrapPrefixVariables = [ "PYTHONPATH" ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "accerciser";
+      attrPath = "gnome3.accerciser";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Accerciser;
+    description = "Interactive Python accessibility explorer";
+    maintainers = gnome3.maintainers;
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/cheese/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/cheese/default.nix
new file mode 100644
index 000000000000..4e5595385b48
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/cheese/default.nix
@@ -0,0 +1,58 @@
+{ stdenv, intltool, fetchurl, wrapGAppsHook, gnome-video-effects, libcanberra-gtk3
+, pkgconfig, gtk3, glib, clutter-gtk, clutter-gst, udev, gst_all_1, itstool
+, libgudev, autoreconfHook, vala, docbook_xml_dtd_43, docbook_xsl, appstream-glib
+, libxslt, yelp-tools, gnome-common, gtk-doc
+, adwaita-icon-theme, librsvg, totem, gdk_pixbuf, gnome3, gnome-desktop, libxml2 }:
+
+stdenv.mkDerivation rec {
+  name = "cheese-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/cheese/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1xlmsm4zsx05ahvpd4mgy1hfhxbag0r5i6p63bksjxdligdd36kv";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "cheese"; attrPath = "gnome3.cheese"; };
+  };
+
+  nativeBuildInputs = [
+    pkgconfig intltool itstool vala wrapGAppsHook libxml2 appstream-glib
+    libxslt docbook_xml_dtd_43 docbook_xsl
+    autoreconfHook gtk-doc yelp-tools gnome-common
+  ];
+  buildInputs = [ gtk3 glib gnome-video-effects
+                  gdk_pixbuf adwaita-icon-theme librsvg udev gst_all_1.gstreamer
+                  gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good gnome-desktop
+                  gst_all_1.gst-plugins-bad clutter-gtk clutter-gst
+                  libcanberra-gtk3 libgudev ];
+
+  outputs = [ "out" "man" "devdoc" ];
+
+  patches = [
+    gtk-doc.respect_xml_catalog_files_var_patch
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Effects
+      --prefix XDG_DATA_DIRS : "${gnome-video-effects}/share"
+      # vp8enc preset
+      --prefix GST_PRESET_PATH : "${gst_all_1.gst-plugins-good}/share/gstreamer-1.0/presets"
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${gdk_pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${totem}/share"
+    )
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Cheese;
+    description = "Take photos and videos with your webcam, with fun graphical effects";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/evolution/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/evolution/default.nix
new file mode 100644
index 000000000000..a423dd85887c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/evolution/default.nix
@@ -0,0 +1,61 @@
+{ stdenv, cmake, ninja, intltool, fetchurl, libxml2, webkitgtk, highlight
+, pkgconfig, gtk3, glib, libnotify, gtkspell3, evolution-data-server
+, adwaita-icon-theme, gnome-desktop, libgdata
+, libgweather, glib-networking, gsettings-desktop-schemas
+, wrapGAppsHook, itstool, shared-mime-info, libical, db, gcr, sqlite
+, gnome3, librsvg, gdk_pixbuf, libsecret, nss, nspr, icu
+, libcanberra-gtk3, bogofilter, gst_all_1, procps, p11-kit, openldap }:
+
+let
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "evolution-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evolution/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0ns76w6vwv5k1nxpaqrizp1pnm89xzfgs60i6cwwfs35zqlmb7iq";
+  };
+
+  propagatedUserEnvPkgs = [ evolution-data-server ];
+
+  buildInputs = [
+    gtk3 glib gdk_pixbuf adwaita-icon-theme librsvg db icu
+    evolution-data-server libsecret libical gcr
+    webkitgtk shared-mime-info gnome-desktop gtkspell3
+    libcanberra-gtk3 bogofilter libgdata sqlite
+    gst_all_1.gstreamer gst_all_1.gst-plugins-base p11-kit
+    nss nspr libnotify procps highlight libgweather
+    gsettings-desktop-schemas
+    glib-networking openldap
+  ];
+
+  nativeBuildInputs = [ cmake ninja intltool itstool libxml2 pkgconfig wrapGAppsHook ];
+
+  cmakeFlags = [
+    "-DENABLE_AUTOAR=OFF"
+    "-DENABLE_LIBCRYPTUI=OFF"
+    "-DENABLE_YTNEF=OFF"
+    "-DENABLE_PST_IMPORT=OFF"
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "evolution";
+      attrPath = "gnome3.evolution";
+    };
+  };
+
+  PKG_CONFIG_LIBEDATASERVERUI_1_2_UIMODULEDIR = "${placeholder "out"}/lib/evolution-data-server/ui-modules";
+
+  requiredSystemFeatures = [ "big-parallel" ];
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Evolution;
+    description = "Personal information management application that provides integrated mail, calendaring and address book functionality";
+    maintainers = gnome3.maintainers;
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/file-roller/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/file-roller/default.nix
new file mode 100644
index 000000000000..733b8ecca920
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/file-roller/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, glib, gtk3, meson, ninja, pkgconfig, gnome3, gettext, itstool, libxml2, libarchive
+, file, json-glib, python3, wrapGAppsHook, desktop-file-utils, libnotify, nautilus, glibcLocales }:
+
+stdenv.mkDerivation rec {
+  name = "file-roller-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/file-roller/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0irm72cf8222h93skivn0nn0ckahiiiimy4rb9r3ccjvhi3hiaqw";
+  };
+
+  LANG = "en_US.UTF-8"; # postinstall.py
+
+  nativeBuildInputs = [ meson ninja gettext itstool pkgconfig libxml2 python3 wrapGAppsHook glibcLocales desktop-file-utils ];
+
+  buildInputs = [ glib gtk3 json-glib libarchive file gnome3.adwaita-icon-theme libnotify nautilus ];
+
+  PKG_CONFIG_LIBNAUTILUS_EXTENSION_EXTENSIONDIR = "${placeholder "out"}/lib/nautilus/extensions-3.0";
+
+  postPatch = ''
+    chmod +x postinstall.py # patchShebangs requires executable file
+    patchShebangs postinstall.py
+    patchShebangs data/set-mime-type-entry.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "file-roller";
+      attrPath = "gnome3.file-roller";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/FileRoller;
+    description = "Archive manager for the GNOME desktop environment";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gedit/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gedit/default.nix
new file mode 100644
index 000000000000..f767e309a65a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gedit/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, meson, fetchurl, python3
+, pkgconfig, gtk3, glib, adwaita-icon-theme
+, libpeas, gtksourceview4, gsettings-desktop-schemas
+, wrapGAppsHook, ninja, libsoup, libxml2
+, gnome3, gspell, perl, itstool, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "gedit-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gedit/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1lray9vvbcrnhjv5cr5fc4bqfd68km2x79cj50byyqn9cnlf5qn9";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig wrapGAppsHook meson ninja libxml2
+    python3 perl itstool desktop-file-utils
+  ];
+
+  buildInputs = [
+    gtk3 glib
+    adwaita-icon-theme libsoup
+    libpeas gtksourceview4
+    gsettings-desktop-schemas gspell
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/post_install.py
+    chmod +x plugins/externaltools/scripts/gedit-tool-merge.pl
+    patchShebangs build-aux/meson/post_install.py
+    patchShebangs plugins/externaltools/scripts/gedit-tool-merge.pl
+  '';
+
+  mesonFlags = [
+    "--buildtype=plain" # don't require git
+  ];
+
+  # Reliably fails to generate gedit-file-browser-enum-types.h in time
+  enableParallelBuilding = false;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gedit";
+      attrPath = "gnome3.gedit";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Gedit;
+    description = "Official text editor of the GNOME desktop environment";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/ghex/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/ghex/default.nix
new file mode 100644
index 000000000000..388808b7d646
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/ghex/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, intltool, itstool, libxml2, gtk3,
+  wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "ghex-${version}";
+  version = "3.18.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/ghex/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "c67450f86f9c09c20768f1af36c11a66faf460ea00fbba628a9089a6804808d3";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook ];
+
+  buildInputs = [ gtk3 intltool itstool libxml2 ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "ghex";
+      attrPath = "gnome3.ghex";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Ghex;
+    description = "Hex editor for GNOME desktop environment";
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/glade/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/glade/default.nix
new file mode 100644
index 000000000000..e0078d5ae410
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/glade/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, intltool, fetchurl, python3
+, pkgconfig, gtk3, glib, gobject-introspection
+, wrapGAppsHook, itstool, libxml2, docbook_xsl
+, gnome3, gdk_pixbuf, libxslt, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "glade-${version}";
+  version = "3.22.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/glade/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "16p38xavpid51qfy0s26n0n21f9ws1w9k5s65bzh1w7ay8p9my6z";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "glade"; attrPath = "gnome3.glade"; };
+  };
+
+  nativeBuildInputs = [
+    pkgconfig intltool itstool wrapGAppsHook docbook_xsl libxslt gobject-introspection
+  ];
+  buildInputs = [
+    gtk3 glib libxml2 python3 python3.pkgs.pygobject3
+    gsettings-desktop-schemas
+    gdk_pixbuf gnome3.adwaita-icon-theme
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Glade;
+    description = "User interface designer for GTK+ applications";
+    maintainers = gnome3.maintainers;
+    license = licenses.lgpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-books/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-books/default.nix
new file mode 100644
index 000000000000..b9fb2dc05a06
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-books/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, meson, ninja, gettext, fetchurl, evince, gjs
+, pkgconfig, gtk3, glib, tracker, tracker-miners, libxslt
+, webkitgtk, gnome-desktop, libgepub, gnome3, gdk_pixbuf
+, gsettings-desktop-schemas, adwaita-icon-theme, docbook_xsl
+, docbook_xml_dtd_42, desktop-file-utils, python3
+, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-books";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1wkcywcwwszj9mldr0lngczqdz7hys08rr1nd2k6rs8ykzs2z7m4";
+  };
+
+  mesonFlags = [
+    "--buildtype=plain"
+  ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext libxslt desktop-file-utils
+    docbook_xsl docbook_xml_dtd_42 wrapGAppsHook python3
+  ];
+
+  buildInputs = [
+    gtk3 glib gsettings-desktop-schemas
+    gdk_pixbuf adwaita-icon-theme evince
+    webkitgtk gjs gobject-introspection tracker
+    tracker-miners gnome-desktop libgepub
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-books";
+      attrPath = "gnome3.gnome-books";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Books;
+    description = "An e-book manager application for GNOME";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix
new file mode 100644
index 000000000000..a983c59d192e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix
@@ -0,0 +1,65 @@
+{ stdenv, fetchurl, meson, ninja, wrapGAppsHook, pkgconfig, gettext, itstool, libvirt-glib
+, glib, gobject-introspection, libxml2, gtk3, gtk-vnc, freerdp, libvirt, spice-gtk, python3
+, spice-protocol, libsoup, libosinfo, systemd, tracker, tracker-miners, vala
+, libcap, yajl, gmp, gdbm, cyrus_sasl, gnome3, librsvg, desktop-file-utils
+, mtools, cdrkit, libcdio, libusb, libarchive, acl, libgudev, qemu, libsecret
+, libcap_ng, numactl, xen, libapparmor, json-glib, webkitgtk, vte
+}:
+
+# TODO: ovirt (optional)
+
+let
+  version = "3.32.0.2";
+in stdenv.mkDerivation rec {
+  name = "gnome-boxes-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-boxes/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1239x1bbkn0gxxq82zpvjjr7srla2d5ghi5rqwxnhsab0c2ypswk";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    meson ninja vala pkgconfig gettext itstool wrapGAppsHook gobject-introspection desktop-file-utils python3
+  ];
+
+  # Required for USB redirection PolicyKit rules file
+  propagatedUserEnvPkgs = [ spice-gtk ];
+
+  buildInputs = [
+    libvirt-glib glib gtk3 gtk-vnc freerdp libxml2
+    libvirt spice-gtk spice-protocol libsoup json-glib webkitgtk libosinfo systemd
+    tracker tracker-miners libcap yajl gmp gdbm cyrus_sasl libusb libarchive
+    gnome3.adwaita-icon-theme librsvg acl libgudev libsecret
+    libcap_ng numactl xen libapparmor vte
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix PATH : "${stdenv.lib.makeBinPath [ mtools cdrkit libcdio qemu ]}")
+  '';
+
+  mesonFlags = [
+    "-Dovirt=false"
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/post_install.py # patchShebangs requires executable file
+    patchShebangs build-aux/post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-boxes";
+      attrPath = "gnome3.gnome-boxes";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Simple GNOME 3 application to access remote or virtual systems";
+    homepage = https://wiki.gnome.org/Apps/Boxes;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix
new file mode 100644
index 000000000000..3244fa639c2f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-calendar/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, wrapGAppsHook, libdazzle, libgweather, geoclue2, geocode-glib, python3
+, gettext, libxml2, gnome3, gtk3, evolution-data-server, libsoup
+, glib, gnome-online-accounts, gsettings-desktop-schemas }:
+
+let
+  pname = "gnome-calendar";
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1wip968nvp1yj34hbpc3wjbrmrgjm1f82ag5ngv90z38953vi9vl";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext libxml2 wrapGAppsHook python3 ];
+  buildInputs = [
+    gtk3 evolution-data-server libsoup glib gnome-online-accounts libdazzle libgweather geoclue2 geocode-glib
+    gsettings-desktop-schemas gnome3.adwaita-icon-theme
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/meson_post_install.py # patchShebangs requires executable file
+    patchShebangs build-aux/meson/meson_post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Calendar;
+    description = "Simple and beautiful calendar application for GNOME";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix
new file mode 100644
index 000000000000..c95d135e9e73
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-characters/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, gnome3, glib, gtk3, pango, wrapGAppsHook, python3
+, gobject-introspection, gjs, libunistring, gsettings-desktop-schemas, adwaita-icon-theme, gnome-desktop }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-characters-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-characters/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1mpg125x9k879ryg8xgbm9w1amx6b3iq9sqv7xfii7kzaanjb4js";
+  };
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-characters";
+      attrPath = "gnome3.gnome-characters";
+    };
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext wrapGAppsHook python3 gobject-introspection ];
+  buildInputs = [
+    glib gtk3 gjs pango gsettings-desktop-schemas
+    adwaita-icon-theme libunistring
+    # typelib
+    gnome-desktop
+  ];
+
+  mesonFlags = [
+    "-Ddbus_service_dir=${placeholder "out"}/share/dbus-1/services"
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Design/Apps/CharacterMap;
+    description = "Simple utility application to find and insert unusual characters";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix
new file mode 100644
index 000000000000..f29f324f2ee8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchurl
+, meson, ninja, gettext, pkgconfig, wrapGAppsHook, itstool, desktop-file-utils
+, vala, gobject-introspection, libxml2, gtk3, glib, gsound, sound-theme-freedesktop
+, gsettings-desktop-schemas, adwaita-icon-theme, gnome-desktop, geocode-glib
+, gnome3, gdk_pixbuf, geoclue2, libgweather }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-clocks-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-clocks/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1w6lgjdak3x76c9gyhd1lqrdmjfh8q77sjnrkcimylsg0jq913bc";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-clocks";
+      attrPath = "gnome3.gnome-clocks";
+    };
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    vala meson ninja pkgconfig gettext itstool wrapGAppsHook desktop-file-utils libxml2
+    gobject-introspection # for finding vapi files
+  ];
+  buildInputs = [
+    gtk3 glib gsettings-desktop-schemas gdk_pixbuf adwaita-icon-theme
+    gnome-desktop geocode-glib geoclue2 libgweather gsound
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Fallback sound theme
+      --prefix XDG_DATA_DIRS : "${sound-theme-freedesktop}/share"
+    )
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Clocks;
+    description = "Clock application designed for GNOME 3";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-documents/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-documents/default.nix
new file mode 100644
index 000000000000..4491d60a5ade
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-documents/default.nix
@@ -0,0 +1,60 @@
+{ stdenv, meson, ninja, gettext, fetchurl, fetchpatch, evince, gjs
+, pkgconfig, gtk3, glib, tracker, tracker-miners
+, itstool, libxslt, webkitgtk, libgdata
+, gnome-desktop, libzapojit, libgepub
+, gnome3, gdk_pixbuf, libsoup, docbook_xsl, docbook_xml_dtd_42
+, gobject-introspection, inkscape, poppler_utils
+, desktop-file-utils, wrapGAppsHook, python3, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-documents-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-documents/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1gqddzbr4d8s0asmrhy0sfmwggzhbmpm61mqf8rxpdjk7s26086c";
+  };
+
+  doCheck = true;
+
+  mesonFlags = [
+    "-Dgetting-started=true"
+    "--buildtype=plain"
+  ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxslt desktop-file-utils docbook_xsl docbook_xml_dtd_42 wrapGAppsHook python3
+    inkscape poppler_utils # building getting started
+  ];
+  buildInputs = [
+    gtk3 glib gsettings-desktop-schemas
+    gdk_pixbuf gnome3.adwaita-icon-theme evince
+    libsoup webkitgtk gjs gobject-introspection
+    tracker tracker-miners libgdata
+    gnome-desktop libzapojit libgepub
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  preFixup = ''
+    substituteInPlace $out/bin/gnome-documents --replace gapplication "${glib.bin}/bin/gapplication"
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-documents";
+      attrPath = "gnome3.gnome-documents";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Documents;
+    description = "Document manager application designed to work with GNOME 3";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix
new file mode 100644
index 000000000000..37f2a859488c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-getting-started-docs/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, gnome3, intltool, itstool, libxml2 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-getting-started-docs-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-getting-started-docs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0g4zaafj442gpir0hxv5hya37ax1ai40slls7sa2a02fdarilrjf";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-getting-started-docs"; attrPath = "gnome3.gnome-getting-started-docs"; };
+  };
+
+  buildInputs = [ intltool itstool libxml2 ];
+
+  meta = with stdenv.lib; {
+    homepage = https://live.gnome.org/DocumentationProject;
+    description = "Help a new user get started in GNOME";
+    maintainers = gnome3.maintainers;
+    license = licenses.cc-by-sa-30;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-logs/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-logs/default.nix
new file mode 100644
index 000000000000..d46882deb41e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-logs/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gnome3, glib, gtk3, wrapGAppsHook, desktop-file-utils
+, gettext, itstool, libxml2, libxslt, docbook_xsl, docbook_xml_dtd_43, systemd, python3, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-logs-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-logs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0hh3nnbq7q2xbflvaywanm0j3dqhb04ngphskhnjx2sg7px12068";
+  };
+
+  mesonFlags = [
+    "-Dtests=true"
+    "-Dman=true"
+  ];
+
+  nativeBuildInputs = [
+    python3
+    meson ninja pkgconfig wrapGAppsHook gettext itstool desktop-file-utils
+    libxml2 libxslt docbook_xsl docbook_xml_dtd_43
+  ];
+  buildInputs = [ glib gtk3 systemd gsettings-desktop-schemas gnome3.adwaita-icon-theme ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-logs";
+      attrPath = "gnome3.gnome-logs";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Logs;
+    description = "A log viewer for the systemd journal";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix
new file mode 100644
index 000000000000..b3b9fb0dddd6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-maps/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchurl, meson, ninja, gettext, python3, pkgconfig, gnome3, gtk3
+, gobject-introspection, gdk_pixbuf, librsvg, libgweather
+, geoclue2, wrapGAppsHook, folks, libchamplain, gfbgraph, libsoup, gsettings-desktop-schemas
+, webkitgtk, gjs, libgee, geocode-glib, evolution-data-server, gnome-online-accounts }:
+
+let
+  pname = "gnome-maps";
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1q15qsp0ca67y4l0x31518cfakrj85x9g0cbcm0wysnbddi1aik0";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext python3 wrapGAppsHook ];
+  buildInputs = [
+    gobject-introspection
+    gtk3 geoclue2 gjs libgee folks gfbgraph
+    geocode-glib libchamplain libsoup
+    gdk_pixbuf librsvg libgweather
+    gsettings-desktop-schemas evolution-data-server
+    gnome-online-accounts gnome3.adwaita-icon-theme
+    webkitgtk
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+
+    # The .service file isn't wrapped with the correct environment
+    # so misses GIR files when started. By re-pointing from the gjs
+    # entry point to the wrapped binary we get back to a wrapped
+    # binary.
+    substituteInPlace "data/org.gnome.Maps.service.in" \
+        --replace "Exec=@pkgdatadir@/org.gnome.Maps" \
+                  "Exec=$out/bin/gnome-maps"
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Maps;
+    description = "A map application for GNOME 3";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-music/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-music/default.nix
new file mode 100644
index 000000000000..4e601849a35f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-music/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, meson, ninja, gettext, fetchurl, gdk_pixbuf, tracker
+, libxml2, python3, libnotify, wrapGAppsHook, libmediaart
+, gobject-introspection, gnome-online-accounts, grilo, grilo-plugins
+, pkgconfig, gtk3, glib, desktop-file-utils, appstream-glib
+, itstool, gnome3, gst_all_1, libdazzle, libsoup, gsettings-desktop-schemas }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gnome-music";
+  version = "3.32.1";
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "11fdij1jznjsph1q5rkkvdhikzdh2lls921lv2m2di9x7i2xn3h4";
+  };
+
+  nativeBuildInputs = [ meson ninja gettext itstool pkgconfig libxml2 wrapGAppsHook desktop-file-utils appstream-glib gobject-introspection ];
+  buildInputs = with gst_all_1; [
+    gtk3 glib libmediaart gnome-online-accounts gobject-introspection
+    gdk_pixbuf gnome3.adwaita-icon-theme python3
+    grilo grilo-plugins libnotify libdazzle libsoup
+    gsettings-desktop-schemas tracker
+    gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly
+  ];
+  propagatedBuildInputs = with python3.pkgs; [ pycairo dbus-python pygobject3 ];
+
+
+  postPatch = ''
+    for f in meson_post_conf.py meson_post_install.py; do
+      chmod +x $f
+      patchShebangs $f
+    done
+  '';
+
+  doCheck = false;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Music;
+    description = "Music player and management application for the GNOME desktop environment";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-nettool/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-nettool/default.nix
new file mode 100644
index 000000000000..9bc71bb43389
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-nettool/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, libgtop, intltool, itstool, libxml2, nmap, inetutils }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-nettool-3.8.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-nettool/3.8/${name}.tar.xz";
+    sha256 = "1c9cvzvyqgfwa5zzyvp7118pkclji62fkbb33g4y9sp5kw6m397h";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    gtk3 wrapGAppsHook libgtop intltool itstool libxml2
+    gnome3.adwaita-icon-theme
+  ];
+
+  propagatedUserEnvPkgs = [ nmap inetutils ];
+
+  meta = with stdenv.lib; {
+    homepage = http://projects.gnome.org/gnome-network;
+    description = "A collection of networking tools";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix
new file mode 100644
index 000000000000..3a28b8635a11
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-notes/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, meson, ninja, gettext, fetchurl, pkgconfig
+, wrapGAppsHook, itstool, desktop-file-utils, python3
+, glib, gtk3, evolution-data-server
+, libuuid, webkitgtk, zeitgeist
+, gnome3, libxml2, gsettings-desktop-schemas }:
+
+let
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "gnome-notes-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/bijiben/${stdenv.lib.versions.majorMinor version}/bijiben-${version}.tar.xz";
+    sha256 = "02b7afg3ps0hxp5dkb4kv6315ydc2r6bxgk1kamwp581lc7ghd67";
+  };
+
+  doCheck = true;
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxml2 desktop-file-utils python3 wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib gtk3 libuuid webkitgtk gnome3.tracker
+    gnome3.gnome-online-accounts zeitgeist
+    gsettings-desktop-schemas
+    evolution-data-server
+    gnome3.adwaita-icon-theme
+  ];
+
+  mesonFlags = [
+    "-Dzeitgeist=true"
+    "-Dupdate_mimedb=false"
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "bijiben";
+      attrPath = "gnome3.gnome-notes";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Note editor designed to remain simple to use";
+    homepage = https://wiki.gnome.org/Apps/Notes;
+    license = licenses.gpl3;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-photos/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-photos/default.nix
new file mode 100644
index 000000000000..0a33a3bff559
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-photos/default.nix
@@ -0,0 +1,60 @@
+{ stdenv, gettext, fetchurl, libxml2, libgdata
+, pkgconfig, gtk3, glib, tracker, tracker-miners
+, itstool, gegl, babl, libdazzle, gfbgraph, grilo-plugins
+, grilo, gnome-online-accounts
+, desktop-file-utils, wrapGAppsHook
+, gnome3, gdk_pixbuf, gexiv2, geocode-glib
+, dleyna-renderer, dbus, meson, ninja, python3, gsettings-desktop-schemas }:
+
+let
+  pname = "gnome-photos";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "160vqmcqvyzby27wd2lzwzgbfl6jxxk7phhnqh9498r3clr73haj";
+  };
+
+  # doCheck = true;
+
+  nativeBuildInputs = [
+    pkgconfig gettext itstool meson ninja libxml2
+    desktop-file-utils wrapGAppsHook python3
+  ];
+  buildInputs = [
+    gtk3 glib gegl babl libgdata libdazzle
+    gsettings-desktop-schemas
+    gdk_pixbuf gnome3.adwaita-icon-theme
+    gfbgraph grilo-plugins grilo
+    gnome-online-accounts tracker
+    gexiv2 geocode-glib dleyna-renderer
+    tracker-miners # For 'org.freedesktop.Tracker.Miner.Files' GSettings schema
+    dbus
+  ];
+
+  mesonFlags = [
+    "--buildtype=plain" # don't do any git commands
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Photos;
+    description = "Access, organize and share your photos";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-power-manager/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-power-manager/default.nix
new file mode 100644
index 000000000000..fd47f54eb899
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-power-manager/default.nix
@@ -0,0 +1,60 @@
+{ stdenv
+, gettext
+, fetchurl
+, pkgconfig
+, gtk3
+, glib
+, meson
+, ninja
+, upower
+, python3
+, desktop-file-utils
+, wrapGAppsHook
+, gnome3 }:
+
+let
+  pname = "gnome-power-manager";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0drfn3wcc8l4n07qwv6p0rw2dwcd00hwzda282q62l6sasks2b2g";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    wrapGAppsHook
+    gettext
+
+    # needed by meson_post_install.sh
+    python3
+    glib.dev
+    desktop-file-utils
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    upower
+    gnome3.adwaita-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://projects-old.gnome.org/gnome-power-manager/;
+    description = "View battery and power statistics provided by UPower";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix
new file mode 100644
index 000000000000..c9e6356aac6c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, gettext, gobject-introspection, wrapGAppsHook, gjs, glib, gtk3, gdk_pixbuf, gst_all_1, gnome3
+, meson, ninja, python3, hicolor-icon-theme, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-sound-recorder";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "0rchzap5mg9ach3jcf4sci5v2h5pgpdjafjfllfd09w9yg3brspp";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig gettext meson ninja gobject-introspection
+    wrapGAppsHook python3 hicolor-icon-theme desktop-file-utils
+  ];
+  buildInputs = [ gjs glib gtk3 gdk_pixbuf ] ++ (with gst_all_1; [ gstreamer.dev gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad ]);
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  # TODO: fix this in gstreamer
+  # TODO: make stdenv.lib.getBin respect outputBin
+  PKG_CONFIG_GSTREAMER_1_0_TOOLSDIR = "${gst_all_1.gstreamer.dev}/bin";
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "A simple and modern sound recorder";
+    homepage = https://wiki.gnome.org/Apps/SoundRecorder;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-todo/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-todo/default.nix
new file mode 100644
index 000000000000..4ae3b629af9c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-todo/default.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, fetchurl
+, fetchpatch
+, meson
+, ninja
+, pkgconfig
+, python3
+, wrapGAppsHook
+, gettext
+, gnome3
+, glib
+, gtk3
+, libpeas
+, gnome-online-accounts
+, gsettings-desktop-schemas
+, adwaita-icon-theme
+, evolution-data-server
+, libxml2
+, libsoup
+, libical
+, librest
+, json-glib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-todo";
+  version = "3.28.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "08ygqbib72jlf9y0a16k54zz51sncpq2wa18wp81v46q8301ymy7";
+  };
+
+  patches = [
+    # fix build with e-d-s 3.32
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/gnome-todo/commit/6cdabc4dd0c6c804a093b94c269461ce376fed4f.patch;
+      sha256 = "08ldgyxv9216dgr8y9asqd7j2y82y9yqnqhkqaxc9i8a67yz1gzy";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    gettext
+    python3
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    libpeas
+    gnome-online-accounts
+    gsettings-desktop-schemas
+    gnome3.adwaita-icon-theme
+    # Plug-ins
+    evolution-data-server
+    libxml2
+    libsoup
+    libical
+    librest
+    json-glib
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Personal task manager for GNOME";
+    homepage = https://wiki.gnome.org/Apps/Todo;
+    license = licenses.gpl3Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix
new file mode 100644
index 000000000000..d21cfcfd72d2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook, gjs, gobject-introspection
+, libgweather, meson, ninja, geoclue2, gnome-desktop, python3, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-weather-${version}";
+  version = "3.32.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-weather/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0jfxdfbjkrk3x48w6nxgbmazd6jw1fh4mfw12hlly4rs0cjw698s";
+  };
+
+  nativeBuildInputs = [ pkgconfig meson ninja wrapGAppsHook python3 ];
+  buildInputs = [
+    gtk3 gjs gobject-introspection gnome-desktop
+    libgweather gnome3.adwaita-icon-theme geoclue2 gsettings-desktop-schemas
+  ];
+
+  postPatch = ''
+    # The .service file is not wrapped with the correct environment
+    # so misses GIR files when started. By re-pointing from the gjs
+    # entry point to the wrapped binary we get back to a wrapped
+    # binary.
+    substituteInPlace "data/org.gnome.Weather.service.in" \
+        --replace "Exec=@DATA_DIR@/@APP_ID@" \
+                  "Exec=$out/bin/gnome-weather"
+
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-weather";
+      attrPath = "gnome3.gnome-weather";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Weather;
+    description = "Access current weather conditions and forecasts";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/nautilus-sendto/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/nautilus-sendto/default.nix
new file mode 100644
index 000000000000..7ac8b4dfe116
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/nautilus-sendto/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl, meson, ninja, glib, pkgconfig, gnome3, appstream-glib, gettext }:
+
+let
+  pname = "nautilus-sendto";
+  version = "3.8.6";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/3.8/${name}.tar.xz";
+    sha256 = "164d7c6e8bae29c4579bcc67a7bf50d783662b1545b62f3008e7ea3c0410e04d";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig appstream-glib gettext ];
+  buildInputs = [ glib ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Integrates Evolution and Pidgin into the Nautilus file manager";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/polari/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/polari/default.nix
new file mode 100644
index 000000000000..cf056ca78413
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/polari/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, itstool, fetchurl, gdk_pixbuf, adwaita-icon-theme
+, telepathy-glib, gjs, meson, ninja, gettext, telepathy-idle, libxml2, desktop-file-utils
+, pkgconfig, gtk3, glib, libsecret, libsoup, gobject-introspection, appstream-glib
+, gnome3, wrapGAppsHook, telepathy-logger, gspell, gsettings-desktop-schemas }:
+
+let
+  pname = "polari";
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0z2dxj1hd798jn79y9a7lkb77lm8l7y5fsqh9g6lbr7pnmg559yk";
+  };
+
+  propagatedUserEnvPkgs = [ telepathy-idle telepathy-logger ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig itstool gettext wrapGAppsHook libxml2
+    desktop-file-utils gobject-introspection appstream-glib
+  ];
+
+  buildInputs = [
+    gtk3 glib adwaita-icon-theme gsettings-desktop-schemas
+    telepathy-glib telepathy-logger gjs gspell gdk_pixbuf libsecret libsoup
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Polari;
+    description = "IRC chat client designed to integrate with the GNOME desktop";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/seahorse/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/seahorse/default.nix
new file mode 100644
index 000000000000..b3feb230d0f4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/seahorse/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchurl, vala, meson, ninja, libpwquality
+, pkgconfig, gtk3, glib, gobject-introspection
+, wrapGAppsHook, itstool, gnupg, libsoup
+, gnome3, gpgme, python3, openldap, gcr
+, libsecret, avahi, p11-kit, openssh, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  pname = "seahorse";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1nh2gahiixj661a3l008yhidx952q50fqgdckg8l0d237wnwp7f6";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig vala itstool wrapGAppsHook
+    python3 gobject-introspection
+  ];
+  buildInputs = [
+    gtk3 glib gcr
+    gsettings-desktop-schemas gnupg
+    gnome3.adwaita-icon-theme gpgme
+    libsecret avahi libsoup p11-kit
+    openssh openldap libpwquality
+  ];
+
+  postPatch = ''
+    patchShebangs build-aux/
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Seahorse;
+    description = "Application for managing encryption keys and passwords in the GnomeKeyring";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/apps/vinagre/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/vinagre/default.nix
new file mode 100644
index 000000000000..ae360d73b879
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/vinagre/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, vte, libxml2, gtk-vnc, intltool
+, libsecret, itstool, wrapGAppsHook, librsvg }:
+
+stdenv.mkDerivation rec {
+  name = "vinagre-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/vinagre/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "cd1cdbacca25c8d1debf847455155ee798c3e67a20903df8b228d4ece5505e82";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool itstool wrapGAppsHook ];
+  buildInputs = [
+    gtk3 vte libxml2 gtk-vnc libsecret gnome3.adwaita-icon-theme librsvg
+  ];
+
+  NIX_CFLAGS_COMPILE = "-Wno-format-nonliteral";
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "vinagre";
+      attrPath = "gnome3.vinagre";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Remote desktop viewer for GNOME";
+    homepage = https://wiki.gnome.org/Apps/Vinagre;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix
new file mode 100644
index 000000000000..0f88372d9cfb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gnome3
+, iconnamingutils, gtk3, gdk_pixbuf, librsvg, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "adwaita-icon-theme-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/adwaita-icon-theme/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "11ij35na8nisvxx3qh527iz33h6z2q1a7iinqyp7p65v0zjbd3b9";
+  };
+
+  # For convenience, we can specify adwaita-icon-theme only in packages
+  propagatedBuildInputs = [ hicolor-icon-theme ];
+
+  buildInputs = [ gdk_pixbuf librsvg ];
+
+  nativeBuildInputs = [ pkgconfig intltool iconnamingutils gtk3 ];
+
+  # remove a tree of dirs with no files within
+  postInstall = '' rm -rf "$out/locale" '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "adwaita-icon-theme";
+      attrPath = "gnome3.adwaita-icon-theme";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    platforms = with platforms; linux ++ darwin;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/baobab/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/baobab/default.nix
new file mode 100644
index 000000000000..4734a0e96b8c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/baobab/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, gettext, fetchurl, vala, desktop-file-utils
+, meson, ninja, pkgconfig, gtk3, glib, libxml2
+, wrapGAppsHook, itstool, gnome3 }:
+
+let
+  pname = "baobab";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0b33s9bhpiffv5wl76cq2bbnqhvx3qs2vxyxmil5gcs583llqh9r";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig vala gettext itstool libxml2 desktop-file-utils wrapGAppsHook ];
+  buildInputs = [ gtk3 glib gnome3.adwaita-icon-theme ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Graphical application to analyse disk usage in any GNOME environment";
+    homepage = https://wiki.gnome.org/Apps/DiskUsageAnalyzer;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/caribou/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/caribou/default.nix
new file mode 100644
index 000000000000..bad06bae4054
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/caribou/default.nix
@@ -0,0 +1,54 @@
+{ fetchurl, stdenv, pkgconfig, gnome3, glib, gtk3, clutter, dbus, python3, libxml2
+, libxklavier, libXtst, gtk2, intltool, libxslt, at-spi2-core, autoreconfHook
+, wrapGAppsHook, libgee }:
+
+let
+  pname = "caribou";
+  version = "0.4.21";
+  pythonEnv = python3.withPackages ( ps: with ps; [ pygobject3 ] );
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0mfychh1q3dx0b96pjz9a9y112bm9yqyim40yykzxx1hppsdjhww";
+  };
+
+  patches = [
+    # Fix crash in GNOME Flashback
+    # https://bugzilla.gnome.org/show_bug.cgi?id=791001
+    (fetchurl {
+      url = https://bugzilla.gnome.org/attachment.cgi?id=364774;
+      sha256 = "15k1455grf6knlrxqbjnk7sals1730b0whj30451scp46wyvykvd";
+    })
+  ];
+
+  nativeBuildInputs = [ pkgconfig intltool libxslt libxml2 autoreconfHook wrapGAppsHook ];
+
+  buildInputs = [
+    glib gtk3 clutter at-spi2-core dbus pythonEnv python3.pkgs.pygobject3
+    libXtst gtk2
+  ];
+
+  propagatedBuildInputs = [ libgee libxklavier ];
+
+  postPatch = ''
+    patchShebangs .
+    substituteInPlace libcaribou/Makefile.am --replace "--shared-library=libcaribou.so.0" "--shared-library=$out/lib/libcaribou.so.0"
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "An input assistive technology intended for switch and pointer users";
+    homepage = https://wiki.gnome.org/Projects/Caribou;
+    license = licenses.lgpl21;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/dconf-editor/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/dconf-editor/default.nix
new file mode 100644
index 000000000000..8a6ecc5d5e19
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/dconf-editor/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, meson, ninja, vala, libxslt, pkgconfig, glib, gtk3, gnome3, python3
+, libxml2, gettext, docbook_xsl, hicolor-icon-theme, wrapGAppsHook, gobject-introspection }:
+
+let
+  pname = "dconf-editor";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1fmsmlh16njjm948grz20mzrsvb4wjj7pl1fvkrkxqi7mhr177gi";
+  };
+
+  nativeBuildInputs = [
+    meson ninja vala libxslt pkgconfig wrapGAppsHook
+    gettext docbook_xsl libxml2 gobject-introspection python3
+    hicolor-icon-theme # for setup-hook
+  ];
+
+  buildInputs = [ glib gtk3 gnome3.dconf ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "${pname}";
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/dconf/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/dconf/default.nix
new file mode 100644
index 000000000000..e20804d9e621
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/dconf/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchurl, meson, ninja, python3, vala, libxslt, pkgconfig, glib, bash-completion, dbus, gnome3
+, libxml2, gtk-doc, docbook_xsl, docbook_xml_dtd_42, fetchpatch }:
+
+let
+  pname = "dconf";
+in
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "0.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1azz4hb9z76yxn34yrrsiib3iqz5z4vpwn5q7cncp55w365ygg38";
+  };
+
+  patches = [
+    # Fix the build on Darwin
+    # Issue: https://gitlab.gnome.org/GNOME/dconf/issues/47
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/dconf/commit/49f4d916e1151af3975df52c522c69de98ed2fbb.patch";
+      sha256 = "00klkr1jzli9ap0aj6399m1bj2bxxz48pmcj4r16dsy6dfdl6325";
+    })
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py tests/test-dconf.py
+    patchShebangs meson_post_install.py
+    patchShebangs tests/test-dconf.py
+  '';
+
+  outputs = [ "out" "lib" "dev" "devdoc" ];
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig python3 libxslt libxml2 gtk-doc docbook_xsl docbook_xml_dtd_42 ];
+  buildInputs = [ glib bash-completion dbus ];
+
+  mesonFlags = [
+    "--sysconfdir=/etc"
+    "-Dgtk_doc=true"
+  ];
+
+  doCheck = !stdenv.isAarch64;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/dconf;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux ++ platforms.darwin;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/empathy/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/empathy/default.nix
new file mode 100644
index 000000000000..5a08454cb35e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/empathy/default.nix
@@ -0,0 +1,64 @@
+{ stdenv, intltool, fetchurl, webkitgtk, pkgconfig, gtk3, glib
+, file, librsvg, gnome3, gdk_pixbuf, python3
+, telepathy-glib, telepathy-farstream, glibcLocales
+, clutter-gtk, clutter-gst, gst_all_1, cogl, gnome-online-accounts
+, gcr, libsecret, folks, libpulseaudio, telepathy-mission-control
+, telepathy-logger, libnotify, clutter, libsoup, gnutls
+, evolution-data-server, yelp-xsl
+, libcanberra-gtk3, p11-kit, farstream, libtool, shared-mime-info
+, wrapGAppsHook, itstool, libxml2, libxslt, icu, libgee, gsettings-desktop-schemas
+, isocodes, enchant, libchamplain, geoclue2, geocode-glib, cheese, libgudev }:
+
+stdenv.mkDerivation rec {
+  name = "empathy-${version}";
+  version = "3.25.90";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/empathy/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0sn10fcymc6lyrabk7vx8lpvlaxxkqnmcwj9zdkfa8qf3388k4nc";
+  };
+
+  propagatedUserEnvPkgs = [
+    gnome-online-accounts shared-mime-info
+  ];
+  propagatedBuildInputs = [
+    folks telepathy-logger evolution-data-server telepathy-mission-control
+  ];
+  nativeBuildInputs = [
+    pkgconfig libtool intltool itstool file wrapGAppsHook
+    libxml2 libxslt yelp-xsl python3 glibcLocales
+  ];
+  buildInputs = [
+    gtk3 glib webkitgtk icu gnome-online-accounts
+    telepathy-glib clutter-gtk clutter-gst cogl
+    gst_all_1.gstreamer gst_all_1.gst-plugins-base
+    gcr libsecret libpulseaudio gdk_pixbuf
+    libnotify clutter libsoup gnutls libgee p11-kit
+    libcanberra-gtk3 telepathy-farstream farstream
+    gnome3.adwaita-icon-theme gsettings-desktop-schemas
+    librsvg
+    # Spell-checking
+    enchant isocodes
+    # Display maps, location awareness, geocode support
+    libchamplain geoclue2 geocode-glib
+    # Cheese webcam support, camera monitoring
+    cheese libgudev
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "empathy";
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Empathy;
+    description = "Messaging program which supports text, voice, video chat, and file transfers over many different protocols";
+    maintainers = gnome3.maintainers;
+    license = [ licenses.gpl2 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/eog/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/eog/default.nix
new file mode 100644
index 000000000000..7fd092c1efa4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/eog/default.nix
@@ -0,0 +1,51 @@
+{ fetchurl, stdenv, meson, ninja, gettext, itstool, pkgconfig, libxml2, libjpeg, libpeas, gnome3
+, gtk3, glib, gsettings-desktop-schemas, adwaita-icon-theme, gnome-desktop, lcms2, gdk_pixbuf, exempi
+, shared-mime-info, wrapGAppsHook, librsvg, libexif, gobject-introspection, python3 }:
+
+let
+  pname = "eog";
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "165axw63c2l5qk5k2xs7g9d97xnxf5a4br0hdb8s3bpv7lf5nw8q";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext itstool wrapGAppsHook libxml2 gobject-introspection python3 ];
+
+  buildInputs = [
+    libjpeg gtk3 gdk_pixbuf glib libpeas librsvg lcms2 gnome-desktop libexif exempi
+    gsettings-desktop-schemas shared-mime-info adwaita-icon-theme
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${gdk_pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${librsvg}/share"
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "GNOME image viewer";
+    homepage = https://wiki.gnome.org/Apps/EyeOfGnome;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/epiphany/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/epiphany/default.nix
new file mode 100644
index 000000000000..641cfa5236fd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/epiphany/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, meson, ninja, gettext, fetchurl, pkgconfig, gtk3, glib, icu
+, wrapGAppsHook, gnome3, libxml2, libxslt, itstool
+, webkitgtk, libsoup, glib-networking, libsecret, gnome-desktop, libnotify, p11-kit
+, sqlite, gcr, isocodes, desktop-file-utils, python3
+, gdk_pixbuf, gst_all_1, json-glib, libdazzle, libhandy }:
+
+stdenv.mkDerivation rec {
+  name = "epiphany-${version}";
+  version = "3.32.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/epiphany/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1yhc8hpylj7i2i15nrbjldhi38xpz7pdwjdj7b358dxsxaghvrwa";
+  };
+
+  # Tests need an X display
+  mesonFlags = [ "-Dunit_tests=disabled" ];
+
+  nativeBuildInputs = [
+    meson ninja libxslt pkgconfig itstool gettext wrapGAppsHook desktop-file-utils python3
+  ];
+
+  buildInputs = [
+    gtk3 glib webkitgtk libsoup libxml2 libsecret gnome-desktop libnotify
+    sqlite isocodes p11-kit icu libhandy
+    gdk_pixbuf gnome3.adwaita-icon-theme gcr
+    glib-networking gst_all_1.gstreamer gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad gst_all_1.gst-plugins-ugly
+    gst_all_1.gst-libav json-glib libdazzle
+  ];
+
+  postPatch = ''
+    chmod +x post_install.py # patchShebangs requires executable file
+    patchShebangs post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "epiphany";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Epiphany;
+    description = "WebKit based web browser for GNOME";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/evince/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/evince/default.nix
new file mode 100644
index 000000000000..4b0ae91d78f5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/evince/default.nix
@@ -0,0 +1,130 @@
+{ fetchFromGitLab
+, stdenv
+, meson
+, ninja
+, pkgconfig
+, gettext
+, libxml2
+, appstream
+, glib
+, gtk3
+, pango
+, atk
+, gdk_pixbuf
+, shared-mime-info
+, itstool
+, gnome3
+, poppler
+, ghostscriptX
+, djvulibre
+, libspectre
+, libarchive
+, libsecret
+, wrapGAppsHook
+, librsvg
+, gobject-introspection
+, yelp-tools
+, gspell
+, adwaita-icon-theme
+, gsettings-desktop-schemas
+, gnome-desktop
+, dbus
+, python3
+, texlive
+, t1lib
+, gst_all_1
+, supportMultimedia ? true # PDF multimedia
+, libgxps
+, supportXPS ? true # Open XML Paper Specification via libgxps
+}:
+
+stdenv.mkDerivation rec {
+  pname = "evince";
+  version = "3.32.0";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "GNOME";
+    repo = pname;
+    rev = version;
+    sha256 = "1klq8j70q8r8hyqv1wi6jcx8g76yh46bh8614y82zzggn4cx6y3r";
+  };
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    gobject-introspection
+    gettext
+    itstool
+    yelp-tools
+    appstream
+    wrapGAppsHook
+    python3
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    pango
+    atk
+    gdk_pixbuf
+    libxml2
+    gsettings-desktop-schemas
+    poppler
+    ghostscriptX
+    djvulibre
+    libspectre
+    libarchive
+    libsecret
+    librsvg
+    adwaita-icon-theme
+    gspell
+    gnome-desktop
+    dbus # only needed to find the service directory
+    texlive.bin.core # kpathsea for DVI support
+    t1lib
+  ] ++ stdenv.lib.optional supportXPS libgxps
+    ++ stdenv.lib.optionals supportMultimedia (with gst_all_1; [
+      gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav ]);
+
+  mesonFlags = [
+    "-Dauto_features=enabled"
+    "-Dnautilus=false"
+    "-Dps=enabled"
+    "-Dgtk_doc=false"
+  ];
+
+  NIX_CFLAGS_COMPILE = "-I${glib.dev}/include/gio-unix-2.0";
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "${shared-mime-info}/share")
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Evince;
+    description = "GNOME's document viewer";
+
+    longDescription = ''
+      Evince is a document viewer for multiple document formats.  It
+      currently supports PDF, PostScript, DjVu, TIFF and DVI.  The goal
+      of Evince is to replace the multiple document viewers that exist
+      on the GNOME Desktop with a single simple application.
+    '';
+
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers ++ [ maintainers.vcunat ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix
new file mode 100644
index 000000000000..da99fb68b858
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix
@@ -0,0 +1,64 @@
+{ fetchurl, stdenv, substituteAll, pkgconfig, gnome3, python3, gobject-introspection
+, intltool, libsoup, libxml2, libsecret, icu, sqlite, tzdata, libcanberra-gtk3, gcr
+, p11-kit, db, nspr, nss, libical, gperf, wrapGAppsHook, glib-networking, pcre
+, vala, cmake, ninja, kerberos, openldap, webkitgtk, libaccounts-glib, json-glib
+, glib, gtk3, gnome-online-accounts, libgweather, libgdata }:
+
+stdenv.mkDerivation rec {
+  name = "evolution-data-server-${version}";
+  version = "3.32.1";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evolution-data-server/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0jb8d2a4kzz7an7d3db8mfpvhb6r1wrp8dk11vpa3jby60cxbbyd";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata;
+    })
+    ./hardcode-gsettings.patch
+  ];
+
+  nativeBuildInputs = [
+    cmake ninja pkgconfig intltool python3 gperf wrapGAppsHook gobject-introspection vala
+  ];
+  buildInputs = [
+    glib libsoup libxml2 gtk3 gnome-online-accounts
+    gcr p11-kit libgweather libgdata libaccounts-glib json-glib
+    icu sqlite kerberos openldap webkitgtk glib-networking
+    libcanberra-gtk3 pcre
+  ];
+
+  propagatedBuildInputs = [ libsecret nss nspr libical db libsoup ];
+
+  cmakeFlags = [
+    "-DENABLE_UOA=OFF"
+    "-DENABLE_VALA_BINDINGS=ON"
+    "-DENABLE_INTROSPECTION=ON"
+    "-DCMAKE_SKIP_BUILD_RPATH=OFF"
+    "-DINCLUDE_INSTALL_DIR=${placeholder "dev"}/include"
+  ];
+
+  postPatch = ''
+    substituteInPlace src/libedataserver/e-source-registry.c --subst-var-by ESD_GSETTINGS_PATH $out/share/gsettings-schemas/${name}/glib-2.0/schemas
+  '';
+
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "evolution-data-server";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Unified backend for programs that work with contacts, tasks, and calendar information";
+    homepage = https://wiki.gnome.org/Apps/Evolution;
+    license = licenses.lgpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/fix-paths.patch
new file mode 100644
index 000000000000..334235516591
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/fix-paths.patch
@@ -0,0 +1,11 @@
+--- a/src/calendar/libecal/e-cal-system-timezone.c
++++ b/src/calendar/libecal/e-cal-system-timezone.c
+@@ -26,7 +26,7 @@
+ #ifdef HAVE_SOLARIS
+ #define SYSTEM_ZONEINFODIR "/usr/share/lib/zoneinfo/tab"
+ #else
+-#define SYSTEM_ZONEINFODIR "/usr/share/zoneinfo"
++#define SYSTEM_ZONEINFODIR "@tzdata@/share/zoneinfo"
+ #endif
+ 
+ #define ETC_TIMEZONE        "/etc/timezone"
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/hardcode-gsettings.patch b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/hardcode-gsettings.patch
new file mode 100644
index 000000000000..8b64b3df8015
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/hardcode-gsettings.patch
@@ -0,0 +1,36 @@
+diff --git a/src/libedataserver/e-source-registry.c b/src/libedataserver/e-source-registry.c
+index 9c166dbaf..ef368f8d4 100644
+--- a/src/libedataserver/e-source-registry.c
++++ b/src/libedataserver/e-source-registry.c
+@@ -116,6 +116,8 @@ struct _ESourceRegistryPrivate {
+ 	GHashTable *sources;
+ 	GMutex sources_lock;
+ 
++	GSettingsSchemaSource *schema_source;
++	GSettingsSchema *schema;
+ 	GSettings *settings;
+ 
+ 	gboolean initialized;
+@@ -1339,7 +1341,11 @@ source_registry_dispose (GObject *object)
+ 	if (priv->settings != NULL) {
+ 		g_signal_handlers_disconnect_by_data (priv->settings, object);
+ 		g_object_unref (priv->settings);
++		g_settings_schema_unref (priv->schema);
++		g_settings_schema_source_unref (priv->schema_source);
+ 		priv->settings = NULL;
++		priv->schema = NULL;
++		priv->schema_source = NULL;
+ 	}
+ 
+ 	/* Chain up to parent's finalize() method. */
+@@ -1743,7 +1749,9 @@ e_source_registry_init (ESourceRegistry *registry)
+ 
+ 	g_mutex_init (&registry->priv->sources_lock);
+ 
+-	registry->priv->settings = g_settings_new (GSETTINGS_SCHEMA);
++	GSettingsSchemaSource *schema_source = registry->priv->schema_source = g_settings_schema_source_new_from_directory ("@ESD_GSETTINGS_PATH@",  g_settings_schema_source_get_default (), TRUE, NULL);
++	registry->priv->schema = g_settings_schema_source_lookup (schema_source, GSETTINGS_SCHEMA, FALSE);
++	registry->priv->settings = g_settings_new_full (registry->priv->schema, NULL, NULL);
+ 
+ 	g_signal_connect (
+ 		registry->priv->settings, "changed",
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gdm/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/default.nix
new file mode 100644
index 000000000000..831343811737
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/default.nix
@@ -0,0 +1,82 @@
+{ stdenv, fetchurl, substituteAll, pkgconfig, glib, itstool, libxml2, xorg
+, accountsservice, libX11, gnome3, systemd, autoreconfHook
+, gtk3, libcanberra-gtk3, pam, libtool, gobject-introspection, plymouth
+, librsvg, coreutils, xwayland, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  name = "gdm-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gdm/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "12ypdz9i24hwbl1d1wnnxb8zlvfa4f49n9ac5cl9d6h8qp4b0gb4";
+  };
+
+  # Only needed to make it build
+  preConfigure = ''
+    substituteInPlace ./configure --replace "/usr/bin/X" "${xorg.xorgserver.out}/bin/X"
+  '';
+
+  configureFlags = [
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+    "--with-plymouth=yes"
+    "--enable-gdm-xsession"
+    "--with-initial-vt=7"
+    "--with-systemdsystemunitdir=$(out)/etc/systemd/system"
+    "--with-udevdir=$(out)/lib/udev"
+  ];
+
+  nativeBuildInputs = [ pkgconfig libxml2 itstool autoreconfHook libtool gnome3.dconf ];
+  buildInputs = [
+    glib accountsservice systemd
+    gobject-introspection libX11 gtk3
+    libcanberra-gtk3 pam plymouth librsvg
+  ];
+
+  enableParallelBuilding = true;
+
+  patches = [
+    # Change hardcoded paths to nix store paths.
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit coreutils plymouth xwayland;
+    })
+
+    # The following patches implement certain environment variables in GDM which are set by
+    # the gdm configuration module (nixos/modules/services/x11/display-managers/gdm.nix).
+
+    ./gdm-x-session_extra_args.patch
+
+    # Allow specifying a wrapper for running the session command.
+    ./gdm-x-session_session-wrapper.patch
+
+    # Forwards certain environment variables to the gdm-x-session child process
+    # to ensure that the above two patches actually work.
+    ./gdm-session-worker_forward-vars.patch
+
+    # Set up the environment properly when launching sessions
+    # https://github.com/NixOS/nixpkgs/issues/48255
+    ./reset-environment.patch
+  ];
+
+  installFlags = [
+    "sysconfdir=$(out)/etc"
+    "dbusconfdir=$(out)/etc/dbus-1/system.d"
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gdm";
+      attrPath = "gnome3.gdm";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "A program that manages graphical display servers and handles graphical user logins";
+    homepage = https://wiki.gnome.org/Projects/GDM;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gdm/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/fix-paths.patch
new file mode 100644
index 000000000000..6b5bd6152bd6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/fix-paths.patch
@@ -0,0 +1,60 @@
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -201,7 +201,7 @@
+ #ifdef ENABLE_WAYLAND_SUPPORT
+         gboolean wayland_enabled = FALSE;
+         if (gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled)) {
+-                if (wayland_enabled && g_file_test ("/usr/bin/Xwayland", G_FILE_TEST_IS_EXECUTABLE) )
++                if (wayland_enabled && g_file_test ("@xwayland@/bin/Xwayland", G_FILE_TEST_IS_EXECUTABLE) )
+                         return TRUE;
+         }
+ #endif
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -145,7 +145,7 @@
+         GError  *error;
+ 
+         error = NULL;
+-        res = g_spawn_command_line_sync ("/bin/plymouth --ping",
++        res = g_spawn_command_line_sync ("@plymouth@/bin/plymouth --ping",
+                                          NULL, NULL, &status, &error);
+         if (! res) {
+                 g_debug ("Could not ping plymouth: %s", error->message);
+@@ -163,7 +163,7 @@
+         GError  *error;
+ 
+         error = NULL;
+-        res = g_spawn_command_line_sync ("/bin/plymouth deactivate",
++        res = g_spawn_command_line_sync ("@plymouth@/bin/plymouth deactivate",
+                                          NULL, NULL, NULL, &error);
+         if (! res) {
+                 g_warning ("Could not deactivate plymouth: %s", error->message);
+@@ -178,7 +178,7 @@
+         GError  *error;
+ 
+         error = NULL;
+-        res = g_spawn_command_line_async ("/bin/plymouth quit --retain-splash", &error);
++        res = g_spawn_command_line_async ("@plymouth@/bin/plymouth quit --retain-splash", &error);
+         if (! res) {
+                 g_warning ("Could not quit plymouth: %s", error->message);
+                 g_error_free (error);
+@@ -194,7 +194,7 @@
+         GError  *error;
+ 
+         error = NULL;
+-        res = g_spawn_command_line_async ("/bin/plymouth quit", &error);
++        res = g_spawn_command_line_async ("@plymouth@/bin/plymouth quit", &error);
+         if (! res) {
+                 g_warning ("Could not quit plymouth: %s", error->message);
+                 g_error_free (error);
+--- a/data/gdm.service.in
++++ b/data/gdm.service.in
+@@ -28,7 +28,7 @@ BusName=org.gnome.DisplayManager
+ StandardOutput=syslog
+ StandardError=inherit
+ EnvironmentFile=-@LANG_CONFIG_FILE@
+-ExecReload=/bin/kill -SIGHUP $MAINPID
++ExecReload=@coreutils@/bin/kill -SIGHUP $MAINPID
+ KeyringMode=shared
+ 
+ [Install]
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch
new file mode 100644
index 000000000000..401b6aea0c28
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch
@@ -0,0 +1,31 @@
+diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
+index 9ef4c5b..94da834 100644
+--- a/daemon/gdm-session-worker.c
++++ b/daemon/gdm-session-worker.c
+@@ -1515,6 +1515,16 @@ gdm_session_worker_load_env_d (GdmSessionWorker *worker)
+         g_object_unref (dir);
+ }
+ 
++static void
++gdm_session_worker_forward_var (GdmSessionWorker *worker, char const *var)
++{
++        char const *value = g_getenv(var);
++        if (value != NULL) {
++                g_debug ("forwarding %s= %s", var, value);
++                gdm_session_worker_set_environment_variable(worker, var, value);
++        }
++}
++
+ static gboolean
+ gdm_session_worker_accredit_user (GdmSessionWorker  *worker,
+                                   GError           **error)
+@@ -1559,6 +1569,9 @@ gdm_session_worker_accredit_user (GdmSessionWorker  *worker,
+                 goto out;
+         }
+ 
++        gdm_session_worker_forward_var(worker, "GDM_X_SERVER_EXTRA_ARGS");
++        gdm_session_worker_forward_var(worker, "GDM_X_SESSION_WRAPPER");
++
+         gdm_session_worker_update_environment_from_passwd_info (worker,
+                                                                 uid,
+                                                                 gid,
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_extra_args.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_extra_args.patch
new file mode 100644
index 000000000000..66071aa4af80
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_extra_args.patch
@@ -0,0 +1,38 @@
+diff --git a/daemon/gdm-x-session.c.orig b/daemon/gdm-x-session.c
+index d835b34..1f4b7f1 100644
+--- a/daemon/gdm-x-session.c.orig
++++ b/daemon/gdm-x-session.c
+@@ -211,6 +211,7 @@ spawn_x_server (State        *state,
+         char     *vt_string = NULL;
+         char     *display_number;
+         gsize     display_number_size;
++        gchar   **xserver_extra_args = NULL;
+ 
+         auth_file = prepare_auth_file ();
+ 
+@@ -285,6 +286,17 @@ spawn_x_server (State        *state,
+         if (state->debug_enabled) {
+                 g_ptr_array_add (arguments, "-core");
+         }
++
++        if (g_getenv ("GDM_X_SERVER_EXTRA_ARGS") != NULL) {
++                g_debug ("using GDM_X_SERVER_EXTRA_ARGS: %s", g_getenv("GDM_X_SERVER_EXTRA_ARGS"));
++                xserver_extra_args = g_strsplit(g_getenv("GDM_X_SERVER_EXTRA_ARGS"), " ", -1);
++                for (gchar **extra_arg = xserver_extra_args; *extra_arg; extra_arg++) {
++                        if (strlen(*extra_arg) < 1) continue;
++			g_debug ("adding: %s", *extra_arg);
++                        g_ptr_array_add (arguments, *extra_arg);
++                }
++        }
++
+         g_ptr_array_add (arguments, NULL);
+ 
+         subprocess = g_subprocess_launcher_spawnv (launcher,
+@@ -332,6 +344,7 @@ spawn_x_server (State        *state,
+ 
+         is_running = TRUE;
+ out:
++	g_strfreev(xserver_extra_args);
+         g_clear_pointer (&auth_file, g_free);
+         g_clear_object (&data_stream);
+         g_clear_object (&subprocess);
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch
new file mode 100644
index 000000000000..58481f0730fa
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch
@@ -0,0 +1,40 @@
+diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c
+index 88fe96f..b1b140a 100644
+--- a/daemon/gdm-x-session.c
++++ b/daemon/gdm-x-session.c
+@@ -664,18 +664,34 @@ spawn_session (State        *state,
+                                                           state->session_command,
+                                                           NULL);
+         } else {
++                char const *session_wrapper;
++                char *eff_session_command;
+                 int ret;
+                 char **argv;
+ 
+-                ret = g_shell_parse_argv (state->session_command,
++                session_wrapper = g_getenv("GDM_X_SESSION_WRAPPER");
++                if (session_wrapper != NULL) {
++                        char *quoted_wrapper = g_shell_quote(session_wrapper);
++                        eff_session_command = g_strjoin(" ", quoted_wrapper, state->session_command, NULL);
++                        g_free(quoted_wrapper);
++                } else {
++                        eff_session_command = state->session_command;
++                }
++
++                ret = g_shell_parse_argv (eff_session_command,
+                                           NULL,
+                                           &argv,
+                                           &error);
+ 
++                if (session_wrapper != NULL) {
++                        g_free(eff_session_command);
++                }
++
+                 if (!ret) {
+                         g_debug ("could not parse session arguments: %s", error->message);
+                         goto out;
+                 }
++
+                 subprocess = g_subprocess_launcher_spawnv (launcher,
+                                                            (const char * const *) argv,
+                                                            &error);
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gdm/reset-environment.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/reset-environment.patch
new file mode 100644
index 000000000000..61defd9c4bc2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gdm/reset-environment.patch
@@ -0,0 +1,20 @@
+--- a/daemon/gdm-wayland-session.c
++++ b/daemon/gdm-wayland-session.c
+@@ -285,6 +285,7 @@ spawn_session (State        *state,
+                                                     "WAYLAND_DISPLAY",
+                                                     "WAYLAND_SOCKET",
+                                                     "GNOME_SHELL_SESSION_MODE",
++                                                    "__NIXOS_SET_ENVIRONMENT_DONE",
+                                                     NULL };
+ 
+         g_debug ("Running wayland session");
+--- a/daemon/gdm-x-session.c
++++ b/daemon/gdm-x-session.c
+@@ -610,6 +610,7 @@ spawn_session (State        *state,
+                                                      "WAYLAND_DISPLAY",
+                                                      "WAYLAND_SOCKET",
+                                                      "GNOME_SHELL_SESSION_MODE",
++                                                     "__NIXOS_SET_ENVIRONMENT_DONE",
+                                                      NULL };
+ 
+         g_debug ("Running X session");
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gjs/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gjs/default.nix
new file mode 100644
index 000000000000..25c3cef3f6a4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gjs/default.nix
@@ -0,0 +1,51 @@
+{ fetchurl, stdenv, pkgconfig, gnome3, gtk3, atk, gobject-introspection
+, spidermonkey_60, pango, readline, glib, libxml2, dbus, gdk_pixbuf
+, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  name = "gjs-${version}";
+  version = "1.56.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gjs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0wylq6r0c0gf558hridlyly84vb03qzdrfph21z8dbqy8l7g2937";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gjs"; attrPath = "gnome3.gjs"; };
+  };
+
+  outputs = [ "out" "installedTests" ];
+
+  nativeBuildInputs = [ pkgconfig makeWrapper ];
+  buildInputs = [ libxml2 gobject-introspection gtk3 glib pango readline dbus ];
+
+  propagatedBuildInputs = [ spidermonkey_60 ];
+
+  configureFlags = [
+    "--enable-installed-tests"
+  ];
+
+  postPatch = ''
+    for f in installed-tests/*.test.in; do
+      substituteInPlace "$f" --subst-var-by pkglibexecdir "$installedTests/libexec/gjs"
+    done
+  '';
+
+  postInstall = ''
+    sed 's|-lreadline|-L${readline.out}/lib -lreadline|g' -i $out/lib/libgjs.la
+
+    moveToOutput "share/installed-tests" "$installedTests"
+    moveToOutput "libexec/gjs/installed-tests" "$installedTests"
+
+    wrapProgram "$installedTests/libexec/gjs/installed-tests/minijasmine" \
+      --prefix GI_TYPELIB_PATH : "${stdenv.lib.makeSearchPath "lib/girepository-1.0" [ gtk3 atk pango.out gdk_pixbuf ]}:$installedTests/libexec/gjs/installed-tests"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "JavaScript bindings for GNOME";
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+    license = licenses.lgpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix
new file mode 100644
index 000000000000..1e332502db5d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-backgrounds/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gnome3, gettext }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-backgrounds-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-backgrounds/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1s5krdmd3md44p1fgr2lqm5ifxb8s1vzx6hm11sb4cgzr4dw6lrz";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-backgrounds"; attrPath = "gnome3.gnome-backgrounds"; };
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext ];
+
+  meta = with stdenv.lib; {
+    platforms = platforms.unix;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix
new file mode 100644
index 000000000000..817c8324c6b2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-bluetooth/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchurl, gnome3, meson, ninja, pkgconfig, gtk3, intltool, glib
+, udev, itstool, libxml2, wrapGAppsHook, libnotify, libcanberra-gtk3, gobject-introspection
+, gtk-doc, docbook_xsl, docbook_xml_dtd_43, python3, gsettings-desktop-schemas }:
+
+let
+  pname = "gnome-bluetooth";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "3.32.1";
+
+  # TODO: split out "lib"
+  outputs = [ "out" "dev" "devdoc" "man" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1am1gf0nzwg6x1s8ly13j0xnjzgrfj06j0dp52x4zy9s67ywlhb4";
+  };
+
+  nativeBuildInputs = [
+    meson ninja intltool itstool pkgconfig libxml2 wrapGAppsHook gobject-introspection
+    gtk-doc docbook_xsl docbook_xml_dtd_43 python3
+  ];
+  buildInputs = [
+    glib gtk3 udev libnotify libcanberra-gtk3
+    gnome3.adwaita-icon-theme gsettings-desktop-schemas
+  ];
+
+  mesonFlags = [
+    "-Dicon_update=false"
+    "-Dgtk_doc=true"
+  ];
+
+  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 stdenv.lib; {
+    homepage = https://help.gnome.org/users/gnome-bluetooth/stable/index.html.en;
+    description = "Application that let you manage Bluetooth in the GNOME destkop";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix
new file mode 100644
index 000000000000..5d980c3c347a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-calculator/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, meson, ninja, vala, gettext, itstool, fetchurl, pkgconfig, libxml2
+, gtk3, glib, gtksourceview4, wrapGAppsHook, gobject-introspection, python3
+, gnome3, mpfr, gmp, libsoup, libmpc, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-calculator-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-calculator/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "121fyhrzdf7zf3iis0rlpag7hfg8jsan2zy83x5l00rq7abdpn8d";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig vala gettext itstool wrapGAppsHook python3
+    gobject-introspection # for finding vapi files
+  ];
+
+  buildInputs = [
+    gtk3 glib libxml2 gtksourceview4 mpfr gmp
+    gnome3.adwaita-icon-theme
+    gsettings-desktop-schemas libsoup libmpc
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-calculator";
+      attrPath = "gnome3.gnome-calculator";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    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 = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-color-manager/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-color-manager/default.nix
new file mode 100644
index 000000000000..b79651ea4bc7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-color-manager/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, itstool, desktop-file-utils, gnome3, glib, gtk3, libexif, libtiff, colord, colord-gtk, libcanberra-gtk3, lcms2, vte, exiv2 }:
+
+let
+  pname = "gnome-color-manager";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1vpxa2zjz3lkq9ldjg0fl65db9s6b4kcs8nyaqfz3jygma7ifg3w";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext itstool desktop-file-utils ];
+  buildInputs = [ glib gtk3 libexif libtiff colord colord-gtk libcanberra-gtk3 lcms2 vte exiv2 ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "A set of graphical utilities for color management to be used in the GNOME desktop";
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-common/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-common/default.nix
new file mode 100644
index 000000000000..d0ab339a504d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-common/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, which, gnome3, autoconf, automake }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-common-${version}";
+  version = "3.18.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-common/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "22569e370ae755e04527b76328befc4c73b62bfd4a572499fde116b8318af8cf";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-common"; attrPath = "gnome3.gnome-common"; };
+  };
+
+  patches = [(fetchurl {
+    name = "gnome-common-patch";
+    url = "https://bug697543.bugzilla-attachments.gnome.org/attachment.cgi?id=240935";
+    sha256 = "17abp7czfzirjm7qsn2czd03hdv9kbyhk3lkjxg2xsf5fky7z7jl";
+  })];
+
+  propagatedBuildInputs = [ which autoconf automake ]; # autogen.sh which is using gnome-common tends to require which
+
+  meta = with stdenv.lib; {
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix
new file mode 100644
index 000000000000..a405ca0f8082
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix
@@ -0,0 +1,61 @@
+{ stdenv, gettext, fetchurl, evolution-data-server
+, pkgconfig, libxslt, docbook_xsl, docbook_xml_dtd_42, python3, gtk3, glib, cheese
+, libchamplain, clutter-gtk, geocode-glib, gnome-desktop, gnome-online-accounts
+, wrapGAppsHook, folks, libxml2, gnome3, telepathy-glib
+, vala, meson, ninja, libhandy, gsettings-desktop-schemas }:
+
+let
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "gnome-contacts-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-contacts/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "17g1gh8yj58cfpdx69h2szivlbjgvv982kmhnkkh0i5bwj0zs2yy";
+  };
+
+  propagatedUserEnvPkgs = [ evolution-data-server ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig vala gettext libxslt docbook_xsl docbook_xml_dtd_42 python3 wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3 glib evolution-data-server gsettings-desktop-schemas
+    folks gnome-desktop telepathy-glib libhandy
+    libxml2 gnome-online-accounts cheese
+    gnome3.adwaita-icon-theme libchamplain clutter-gtk geocode-glib
+  ];
+
+  mesonFlags = [
+    "-Dtelepathy=true"
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  # In file included from src/gnome-contacts@exe/contacts-avatar-selector.c:30:0:
+  # /nix/store/*-cheese-3.28.0/include/cheese/cheese-widget.h:26:10: fatal error: clutter-gtk/clutter-gtk.h: No such file or directory
+  #  #include <clutter-gtk/clutter-gtk.h>
+  #           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
+  NIX_CFLAGS_COMPILE = "-I${stdenv.lib.getDev clutter-gtk}/include/clutter-gtk-1.0";
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-contacts";
+      attrPath = "gnome3.gnome-contacts";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Contacts;
+    description = "GNOME’s integrated address book";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix
new file mode 100644
index 000000000000..cfd20044c6c6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix
@@ -0,0 +1,85 @@
+{ fetchurl, stdenv, substituteAll, meson, ninja, pkgconfig, gnome3, ibus, gettext, upower, wrapGAppsHook
+, libcanberra-gtk3, accountsservice, libpwquality, libpulseaudio
+, gdk_pixbuf, librsvg, libgudev, libsecret, gnome-color-manager
+, libxml2, polkit, libxslt, libgtop, libsoup, colord, colord-gtk
+, libkrb5, networkmanagerapplet, networkmanager, glibc
+, libwacom, samba, shared-mime-info, tzdata, libgnomekbd
+, docbook_xsl, modemmanager, clutter, clutter-gtk, cheese, gnome-session
+, fontconfig, sound-theme-freedesktop, grilo, python3
+, gtk3, glib, glib-networking, gsettings-desktop-schemas
+, gnome-desktop, gnome-settings-daemon, gnome-online-accounts
+, vino, gnome-bluetooth, tracker, adwaita-icon-theme
+, udisks2, gsound, libhandy, cups, mutter }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-control-center";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "0xpcmwgnn29syi2kfxc8233a5f3j8cij5wcn76xmsmwxvxz5r85l";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext wrapGAppsHook libxslt docbook_xsl
+    shared-mime-info python3
+  ];
+
+  buildInputs = [
+    ibus gtk3 glib glib-networking upower gsettings-desktop-schemas
+    libxml2 gnome-desktop gnome-settings-daemon polkit libgtop
+    gnome-online-accounts libsoup colord libpulseaudio fontconfig colord-gtk
+    accountsservice libkrb5 networkmanagerapplet libwacom samba
+    grilo libpwquality vino libcanberra-gtk3 libgudev libsecret
+    gdk_pixbuf adwaita-icon-theme librsvg clutter clutter-gtk cheese
+    networkmanager modemmanager gnome-bluetooth tracker
+    udisks2 gsound libhandy
+  ];
+
+  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
+  '';
+
+  mesonFlags = [
+    "-Dgnome_session_libexecdir=${gnome-session}/libexec"
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --prefix XDG_DATA_DIRS : "${sound-theme-freedesktop}/share"
+      # Thumbnailers (for setting user profile pictures)
+      --prefix XDG_DATA_DIRS : "${gdk_pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${librsvg}/share"
+      # WM keyboard shortcuts
+      --prefix XDG_DATA_DIRS : "${mutter}/share"
+    )
+    for i in $out/share/applications/*; do
+      substituteInPlace $i --replace "Exec=gnome-control-center" "Exec=$out/bin/gnome-control-center"
+    done
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Utilities to configure the GNOME desktop";
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch
new file mode 100644
index 000000000000..97d8f0bee683
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch
@@ -0,0 +1,167 @@
+diff --git a/panels/color/cc-color-panel.c b/panels/color/cc-color-panel.c
+index 49ca35220..adefb87b9 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)
+ 
+   /* 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_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)
+ 
+   /* 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_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)
+ static void
+ gcm_prefs_profile_clicked (CcColorPanel *prefs, CdProfile *profile, CdDevice *device)
+ {
+-  g_autofree gchar *s = NULL;
+-
+   /* get profile */
+   g_debug ("selected profile = %s",
+      cd_profile_get_filename (profile));
+ 
+   /* allow getting profile info */
+-  if (cd_profile_get_filename (profile) != NULL &&
+-      (s = g_find_program_in_path ("gcm-viewer")) != NULL)
++  if (cd_profile_get_filename (profile) != NULL)
+     gtk_widget_set_sensitive (prefs->toolbutton_profile_view, TRUE);
+   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
+--- a/panels/datetime/tz.h
++++ b/panels/datetime/tz.h
+@@ -27,11 +27,7 @@
+ 
+ #include <glib.h>
+ 
+-#ifndef __sun
+-#  define TZ_DATA_FILE "/usr/share/zoneinfo/zone.tab"
+-#else
+-#  define TZ_DATA_FILE "/usr/share/lib/zoneinfo/tab/zone_sun.tab"
+-#endif
++#define TZ_DATA_FILE "@tzdata@/share/zoneinfo/zone.tab"
+ 
+ typedef struct _TzDB TzDB;
+ typedef struct _TzLocation TzLocation;
+diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c
+index 4541986db..da7826bfe 100644
+--- a/panels/info/cc-info-overview-panel.c
++++ b/panels/info/cc-info-overview-panel.c
+@@ -187,7 +187,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/network/connection-editor/net-connection-editor.c b/panels/network/connection-editor/net-connection-editor.c
+index 9390a3308..d30b4a68e 100644
+--- a/panels/network/connection-editor/net-connection-editor.c
++++ b/panels/network/connection-editor/net-connection-editor.c
+@@ -247,9 +247,9 @@ net_connection_editor_do_fallback (NetConnectionEditor *editor, const gchar *typ
+         GError *error = NULL;
+ 
+         if (editor->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);
+         } else {
+-                cmdline = g_strdup_printf ("nm-connection-editor --edit='%s'",
++                cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --edit='%s'",
+                                            nm_connection_get_uuid (editor->connection));
+         }
+ 
+diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c
+index 360fbfc72..870157a11 100644
+--- a/panels/network/net-device-wifi.c
++++ b/panels/network/net-device-wifi.c
+@@ -1385,7 +1385,7 @@ device_wifi_edit (NetObject *object)
+                 return;
+         }
+         uuid = nm_connection_get_uuid (NM_CONNECTION (connection));
+-        cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid);
++        cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --edit %s", uuid);
+         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);
+diff --git a/panels/network/net-device.c b/panels/network/net-device.c
+index d73b537b9..e2ee54294 100644
+--- a/panels/network/net-device.c
++++ b/panels/network/net-device.c
+@@ -197,7 +197,7 @@ net_device_edit (NetObject *object)
+ 
+         connection = net_device_get_find_connection (device);
+         uuid = nm_connection_get_uuid (connection);
+-        cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid);
++        cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --edit %s", uuid);
+         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);
+diff --git a/panels/printers/pp-host.c b/panels/printers/pp-host.c
+index f53ba217e..d24bcaeb9 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);
+ 
+   argv = g_new0 (gchar *, 3);
+-  argv[0] = g_strdup ("/usr/lib/cups/backend/snmp");
++  argv[0] = g_strdup ("@cups@/lib/cups/backend/snmp");
+   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
+--- 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)
+         gchar  **envp;
+         gint    my_stdin, my_stdout, my_stderr;
+ 
+-        argv[0] = "/usr/bin/passwd";    /* Is it safe to rely on a hard-coded path? */
++        argv[0] = "/run/wrappers/bin/passwd";    /* Is it safe to rely on a hard-coded path? */
+         argv[1] = NULL;
+ 
+         envp = g_get_environ ();
+diff --git a/tests/datetime/test-endianess.c b/tests/datetime/test-endianess.c
+index 9cb92007a..84d2f0fa3 100644
+--- a/tests/datetime/test-endianess.c
++++ b/tests/datetime/test-endianess.c
+@@ -26,7 +26,7 @@ test_endianess (void)
+ 	g_autoptr(GDir) dir = NULL;
+ 	const char *name;
+ 
+-	dir = g_dir_open ("/usr/share/i18n/locales/", 0, NULL);
++	dir = g_dir_open ("@glibc@/share/i18n/locales/", 0, NULL);
+ 	if (dir == NULL) {
+ 		/* Try with /usr/share/locale/
+ 		 * https://bugzilla.gnome.org/show_bug.cgi?id=646780 */
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/bubblewrap-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/bubblewrap-paths.patch
new file mode 100644
index 000000000000..57eb4b3d44a9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/bubblewrap-paths.patch
@@ -0,0 +1,15 @@
+--- a/libgnome-desktop/gnome-desktop-thumbnail-script.c
++++ b/libgnome-desktop/gnome-desktop-thumbnail-script.c
+@@ -536,9 +536,9 @@ add_bwrap (GPtrArray   *array,
+   g_return_val_if_fail (script->s_infile != NULL, FALSE);
+ 
+   add_args (array,
+-	    "bwrap",
+-	    "--ro-bind", "/usr", "/usr",
+-	    "--ro-bind", "/etc/ld.so.cache", "/etc/ld.so.cache",
++	    "@bubblewrap_bin@",
++	    "--ro-bind", "@storeDir@", "@storeDir@",
++	    "--ro-bind", "/run/current-system", "/run/current-system",
+ 	    NULL);
+ 
+   /* These directories might be symlinks into /usr/... */
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix
new file mode 100644
index 000000000000..6f49afe82bf2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, fetchurl, substituteAll, pkgconfig, libxslt, ninja, libX11, gnome3, gtk3, glib
+, gettext, libxml2, xkeyboard_config, isocodes, meson, wayland, fetchpatch
+, libseccomp, bubblewrap, gobject-introspection, gtk-doc, docbook_xsl, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-desktop-${version}";
+  version = "3.32.1";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-desktop/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "040s8ia26xyq25zcd9xji9f5jhsddqd7a23jassy429bir34sxkg";
+  };
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [
+    pkgconfig meson ninja gettext libxslt libxml2 gobject-introspection
+    gtk-doc docbook_xsl
+  ];
+  buildInputs = [
+    libX11 bubblewrap xkeyboard_config isocodes wayland
+    gtk3 glib libseccomp
+  ];
+
+  propagatedBuildInputs = [ gsettings-desktop-schemas ];
+
+  patches = [
+    (substituteAll {
+      src = ./bubblewrap-paths.patch;
+      bubblewrap_bin = "${bubblewrap}/bin/bwrap";
+      inherit (builtins) storeDir;
+    })
+  ];
+
+  mesonFlags = [
+    "-Dgtk_doc=true"
+    "-Ddesktop_docs=false"
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-desktop";
+      attrPath = "gnome3.gnome-desktop";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Library with common API for various GNOME modules";
+    license = with licenses; [ gpl2 lgpl2 ];
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix
new file mode 100644
index 000000000000..613de6c3c164
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-dictionary/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, 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 {
+  name = "gnome-dictionary-${version}";
+  version = "3.26.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-dictionary/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "16b8bc248dcf68987826d5e39234b1bb7fd24a2607fcdbf4258fde88f012f300";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig wrapGAppsHook libxml2 gettext itstool
+    desktop-file-utils appstream-glib libxslt docbook_xsl docbook_xml_dtd_43
+  ];
+  buildInputs = [ gtk3 glib gsettings-desktop-schemas gnome3.adwaita-icon-theme ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-dictionary";
+      attrPath = "gnome3.gnome-dictionary";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Dictionary;
+    description = "Dictionary is the GNOME application to look up definitions";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix
new file mode 100644
index 000000000000..8e09b152e83a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, gettext, fetchurl, pkgconfig, udisks2, libsecret, libdvdread
+, meson, ninja, gtk3, glib, wrapGAppsHook, python3, libnotify
+, itstool, gnome3, libxml2, gsettings-desktop-schemas
+, libcanberra-gtk3, libxslt, docbook_xsl, libpwquality }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-disk-utility-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-disk-utility/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "08vwbji9m1nhjjdiyhhaqi8cncys7i89b4bpy095f8475v8y05bg";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxslt docbook_xsl
+    wrapGAppsHook python3 libxml2
+  ];
+
+  buildInputs = [
+    gtk3 glib libsecret libpwquality libnotify libdvdread libcanberra-gtk3
+    udisks2 gnome3.adwaita-icon-theme
+    gnome3.gnome-settings-daemon gsettings-desktop-schemas
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-disk-utility";
+      attrPath = "gnome3.gnome-disk-utility";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://en.wikipedia.org/wiki/GNOME_Disks;
+    description = "A udisks graphical front-end";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix
new file mode 100644
index 000000000000..317c7e915841
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, meson, ninja, gettext, fetchurl
+, pkgconfig, gtk3, glib, libxml2, gnome-desktop, adwaita-icon-theme
+, wrapGAppsHook, gnome3, harfbuzz }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-font-viewer-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-font-viewer/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "10b150sa3971i5lfnk0jkkzlril97lz09sshwsbkabc8b7kv1qa3";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext wrapGAppsHook libxml2 ];
+  buildInputs = [ gtk3 glib gnome-desktop adwaita-icon-theme harfbuzz ];
+
+  # Do not run meson-postinstall.sh
+  preConfigure = "sed -i '2,$ d'  meson-postinstall.sh";
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-font-viewer";
+      attrPath = "gnome3.gnome-font-viewer";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Program that can preview fonts and create thumbnails for fonts";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix
new file mode 100644
index 000000000000..f36d3f4a6e0a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix
@@ -0,0 +1,73 @@
+{ stdenv, fetchurl, pkgconfig, dbus, libgcrypt, pam, python2, glib, libxslt
+, gettext, gcr, libcap_ng, libselinux, p11-kit, openssh, wrapGAppsHook
+, docbook_xsl, docbook_xml_dtd_43, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-keyring-${version}";
+  version = "3.31.91";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-keyring/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1fjylqw4xp0rqsylq4gbxzw1sql2sy55h1mnz1pprrxb9py0mnd4";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  buildInputs = [
+    glib libgcrypt pam openssh libcap_ng libselinux
+    gcr p11-kit
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig gettext libxslt docbook_xsl docbook_xml_dtd_43 wrapGAppsHook
+  ];
+
+  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 ];
+
+  checkPhase = ''
+    export HOME=$(mktemp -d)
+    dbus-run-session \
+      --config-file=${dbus.daemon}/share/dbus-1/session.conf \
+      make check
+  '';
+
+  # Use wrapped gnome-keyring-daemon with cap_ipc_lock=ep
+  postFixup = ''
+    files=($out/etc/xdg/autostart/* $out/share/dbus-1/services/*)
+
+    for file in ''${files[*]}; do
+      substituteInPlace $file \
+        --replace "$out/bin/gnome-keyring-daemon" "/run/wrappers/bin/gnome-keyring-daemon"
+    done
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-keyring";
+      attrPath = "gnome3.gnome-keyring";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Collection of components in GNOME that store secrets, passwords, keys, certificates and make them available to applications";
+    homepage = https://wiki.gnome.org/Projects/GnomeKeyring;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-accounts/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-accounts/default.nix
new file mode 100644
index 000000000000..9ae4a572d93b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-accounts/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchurl, pkgconfig, vala, glib, libxslt, gtk3, wrapGAppsHook
+, webkitgtk, json-glib, librest, libsecret, gtk-doc, gobject-introspection
+, gettext, icu, glib-networking, hicolor-icon-theme
+, libsoup, docbook_xsl, docbook_xml_dtd_412, gnome3, gcr, kerberos
+}:
+
+let
+  pname = "gnome-online-accounts";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1anlx0rb2hafg9929pgfms25mdz23sd0vdva06h6zlf8f5byc68w";
+  };
+
+  outputs = [ "out" "man" "dev" "devdoc" ];
+
+  configureFlags = [
+    "--enable-media-server"
+    "--enable-kerberos"
+    "--enable-lastfm"
+    "--enable-todoist"
+    "--enable-gtk-doc"
+    "--enable-documentation"
+  ];
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [
+    pkgconfig gobject-introspection vala gettext wrapGAppsHook
+    libxslt docbook_xsl docbook_xml_dtd_412 gtk-doc
+    hicolor-icon-theme # for setup-hook
+  ];
+  buildInputs = [
+    glib gtk3 webkitgtk json-glib librest libsecret glib-networking icu libsoup
+    gcr kerberos
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-miners/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-miners/default.nix
new file mode 100644
index 000000000000..ed4c1a3da13a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-miners/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig, glib, gnome3, libxml2
+, libgdata, grilo, libzapojit, grilo-plugins, gnome-online-accounts, libmediaart
+, tracker, gfbgraph, librest, libsoup, json-glib, gmp, openssl, dleyna-server, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-online-miners-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-online-miners/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0pjamwwzn5wqgihyss357dyl2q70r0bngnqmwsqawchx5f9aja9c";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook ];
+  buildInputs = [
+    glib libgdata libxml2 libsoup gmp openssl
+    grilo libzapojit grilo-plugins
+    gnome-online-accounts libmediaart
+    tracker gfbgraph json-glib librest
+    dleyna-server
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-online-miners";
+      attrPath = "gnome3.gnome-online-miners";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/GnomeOnlineMiners;
+    description = "A set of crawlers that go through your online content and index them locally in Tracker";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-remote-desktop/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-remote-desktop/default.nix
new file mode 100644
index 000000000000..4a22fc535197
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-remote-desktop/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchFromGitLab, meson, ninja, pkgconfig, python3, wrapGAppsHook
+, glib, pipewire, systemd, libvncserver, libsecret, libnotify, gdk_pixbuf, gnome3 }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-remote-desktop";
+  version = "0.1.7";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "jadahl";
+    repo = "gnome-remote-desktop";
+    rev = version;
+    sha256 = "0gmazc8ww0lyhx9iclhi982bkpjsnflrzv4qfm3q6hcy0il21fsc";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig python3 wrapGAppsHook ];
+
+  buildInputs = [
+    glib pipewire systemd libvncserver libsecret libnotify
+    gdk_pixbuf # For libnotify
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  mesonFlags = [
+    "-Dsystemd_user_unit_dir=${placeholder "out"}/lib/systemd/user"
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/Mutter/RemoteDesktop;
+    description = "GNOME Remote Desktop server";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix
new file mode 100644
index 000000000000..1d14481e7783
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-screenshot/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, gettext, libxml2, fetchurl, pkgconfig, libcanberra-gtk3
+, gtk3, glib, meson, ninja, python3, wrapGAppsHook, appstream-glib, desktop-file-utils
+, gnome3, gsettings-desktop-schemas }:
+
+let
+  pname = "gnome-screenshot";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "09ha7dizjm5ymqpjyrqd10ijfb3xlqc1mwg9ajkrbfry11q9yq4b";
+  };
+
+  doCheck = true;
+
+  postPatch = ''
+    chmod +x build-aux/postinstall.py # patchShebangs requires executable file
+    patchShebangs build-aux/postinstall.py
+  '';
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext appstream-glib libxml2 desktop-file-utils python3 wrapGAppsHook ];
+  buildInputs = [
+    gtk3 glib libcanberra-gtk3 gnome3.adwaita-icon-theme
+    gsettings-desktop-schemas
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "${pname}";
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://en.wikipedia.org/wiki/GNOME_Screenshot;
+    description = "Utility used in the GNOME desktop environment for taking screenshots";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/default.nix
new file mode 100644
index 000000000000..38adf7137f76
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/default.nix
@@ -0,0 +1,67 @@
+{ fetchurl, stdenv, substituteAll, meson, ninja, pkgconfig, 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 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-session-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-session/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0zrzkpd406i159mla7bfs5npa32fgqh66aip1rfq02rgsgmc9m5v";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      gsettings = "${glib.bin}/bin/gsettings";
+      dbusLaunch = "${dbus.lib}/bin/dbus-launch";
+      grep = "${gnugrep}/bin/grep";
+      bash = "${bash}/bin/bash";
+    })
+  ];
+
+  mesonFlags = [ "-Dsystemd=true" ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext makeWrapper
+    xmlto libxslt docbook_xsl docbook_xml_dtd_412 python3
+    dbus # for DTD
+  ];
+
+  buildInputs = [
+    glib gtk3 libICE gnome-desktop json-glib xorg.xtrans gnome3.adwaita-icon-theme
+    gnome3.gnome-settings-daemon gsettings-desktop-schemas systemd epoxy
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  # `bin/gnome-session` will reset the environment when run in wayland, we
+  # therefor wrap `libexec/gnome-session-binary` instead which is the actual
+  # binary needing wrapping
+  preFixup = ''
+    wrapProgram "$out/libexec/gnome-session-binary" \
+      --prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
+      --suffix XDG_DATA_DIRS : "$out/share:$GSETTINGS_SCHEMAS_PATH" \
+      --suffix XDG_DATA_DIRS : "${gnome3.gnome-shell}/share"\
+      --suffix XDG_CONFIG_DIRS : "${gnome3.gnome-settings-daemon}/etc/xdg"
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-session";
+      attrPath = "gnome3.gnome-session";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "GNOME session manager";
+    homepage = https://wiki.gnome.org/Projects/SessionManagement;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/fix-paths.patch
new file mode 100644
index 000000000000..fe4feaf70857
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-session/fix-paths.patch
@@ -0,0 +1,38 @@
+--- a/gnome-session/gnome-session.in
++++ b/gnome-session/gnome-session.in
+@@ -3,11 +3,11 @@
+ if [ "x$XDG_SESSION_TYPE" = "xwayland" ] &&
+    [ "x$XDG_SESSION_CLASS" != "xgreeter" ] &&
+    [  -n "$SHELL" ] &&
+-   grep -q "$SHELL" /etc/shells &&
+-   ! (echo "$SHELL" | grep -q "false") &&
+-   ! (echo "$SHELL" | grep -q "nologin"); then
++   @grep@ -q "$SHELL" /etc/shells &&
++   ! (echo "$SHELL" | @grep@ -q "false") &&
++   ! (echo "$SHELL" | @grep@ -q "nologin"); then
+   if [ "$1" != '-l' ]; then
+-    exec bash -c "exec -l '$SHELL' -c '$0 -l $*'"
++    exec @bash@ -c "exec -l '$SHELL' -c '$0 -l $*'"
+   else
+     shift
+   fi
+@@ -13,7 +13,7 @@
+   fi
+ fi
+ 
+-SETTING=$(G_MESSAGES_DEBUG= gsettings get org.gnome.system.locale region)
++SETTING=$(G_MESSAGES_DEBUG= @gsettings@ get org.gnome.system.locale region)
+ REGION=${SETTING#\'}
+ REGION=${REGION%\'}
+ 
+--- a/gnome-session/main.c
++++ b/gnome-session/main.c
+@@ -203,7 +203,7 @@
+         }
+         new_argv[i + 2] = NULL;
+         
+-        if (!execvp ("dbus-launch", new_argv)) {
++        if (!execvp ("@dbusLaunch@", new_argv)) {
+                 g_set_error (error, 
+                              G_SPAWN_ERROR,
+                              G_SPAWN_ERROR_FAILED,
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix
new file mode 100644
index 000000000000..466e1669e18c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix
@@ -0,0 +1,123 @@
+{ stdenv
+, substituteAll
+, fetchurl
+, meson
+, ninja
+, pkgconfig
+, gnome3
+, perl
+, gettext
+, gtk3
+, glib
+, libnotify
+, libgnomekbd
+, lcms2
+, libpulseaudio
+, mousetweaks
+, alsaLib
+, libcanberra-gtk3
+, upower
+, colord
+, libgweather
+, polkit
+, gsettings-desktop-schemas
+, geoclue2
+, systemd
+, libgudev
+, libwacom
+, libxslt
+, libxml2
+, networkmanager
+, gnome-desktop
+, geocode-glib
+, docbook_xsl
+, wrapGAppsHook
+, python3
+, tzdata
+, nss
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-settings-daemon";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-settings-daemon/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "15w3sn9qf1zqlmk8c93kgrh2a20s62m5yfizkp21m5ylrrd07f63";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata mousetweaks;
+    })
+    ./global-backlight-helper.patch
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    perl
+    gettext
+    libxml2
+    libxslt
+    docbook_xsl
+    wrapGAppsHook
+    python3
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    gsettings-desktop-schemas
+    networkmanager
+    libnotify
+    libgnomekbd # for org.gnome.libgnomekbd.keyboard schema
+    gnome-desktop
+    lcms2
+    libpulseaudio
+    alsaLib
+    libcanberra-gtk3
+    upower
+    colord
+    libgweather
+    nss
+    polkit
+    geocode-glib
+    geoclue2
+    systemd
+    libgudev
+    libwacom
+  ];
+
+  mesonFlags = [
+    "-Dudev_dir=${placeholder "out"}/lib/udev"
+  ];
+
+  # So the polkit policy can reference /run/current-system/sw/bin/gnome-settings-daemon/gsd-backlight-helper
+  postFixup = ''
+    mkdir -p $out/bin/gnome-settings-daemon
+    ln -s $out/libexec/gsd-backlight-helper $out/bin/gnome-settings-daemon/gsd-backlight-helper
+  '';
+
+  postPatch = ''
+    for f in gnome-settings-daemon/codegen.py plugins/power/gsd-power-constants-update.pl meson_post_install.py; do
+      chmod +x $f
+      patchShebangs $f
+    done
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/fix-paths.patch
new file mode 100644
index 000000000000..272656fae78c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/fix-paths.patch
@@ -0,0 +1,26 @@
+--- a/plugins/datetime/tz.h
++++ b/plugins/datetime/tz.h
+@@ -27,11 +27,7 @@
+ 
+ #include <glib.h>
+ 
+-#ifndef __sun
+-#  define TZ_DATA_FILE "/usr/share/zoneinfo/zone.tab"
+-#else
+-#  define TZ_DATA_FILE "/usr/share/lib/zoneinfo/tab/zone_sun.tab"
+-#endif
++#define TZ_DATA_FILE "@tzdata@/share/zoneinfo/zone.tab"
+ 
+ typedef struct _TzDB TzDB;
+ typedef struct _TzLocation TzLocation;
+--- a/plugins/mouse/gsd-mouse-manager.c
++++ b/plugins/mouse/gsd-mouse-manager.c
+@@ -118,7 +118,7 @@ set_mousetweaks_daemon (GsdMouseManager *manager,
+         gboolean run_daemon = dwell_click_enabled || secondary_click_enabled;
+
+         if (run_daemon || manager->priv->mousetweaks_daemon_running)
+-                comm = g_strdup_printf ("mousetweaks %s",
++                comm = g_strdup_printf ("@mousetweaks@/bin/mousetweaks %s",
+                                         run_daemon ? "" : "-s");
+         else
+                 return;
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/global-backlight-helper.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/global-backlight-helper.patch
new file mode 100644
index 000000000000..8f3951af2da8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/global-backlight-helper.patch
@@ -0,0 +1,26 @@
+diff --git a/plugins/power/gsd-backlight.c b/plugins/power/gsd-backlight.c
+index d7d10fd2..5619d6ad 100644
+--- a/plugins/power/gsd-backlight.c
++++ b/plugins/power/gsd-backlight.c
+@@ -358,7 +358,7 @@ gsd_backlight_run_set_helper (GsdBacklight *backlight, GTask *task)
+                 proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE,
+                                          &error,
+                                          "pkexec",
+-                                         LIBEXECDIR "/gsd-backlight-helper",
++                                         "/run/current-system/sw/bin/gnome-settings-daemon/gsd-backlight-helper",
+                                          g_udev_device_get_sysfs_path (backlight->udev_device),
+                                          data->value_str, NULL);
+         } else {
+diff --git a/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in b/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in
+index f16300f8..79d6bd17 100644
+--- a/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in
++++ b/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in
+@@ -25,7 +25,7 @@
+       <allow_inactive>no</allow_inactive>
+       <allow_active>yes</allow_active>
+     </defaults>
+-    <annotate key="org.freedesktop.policykit.exec.path">@libexecdir@/gsd-backlight-helper</annotate>
++    <annotate key="org.freedesktop.policykit.exec.path">/run/current-system/sw/bin/gnome-settings-daemon/gsd-backlight-helper</annotate>
+   </action>
+
+ </policyconfig>
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix
new file mode 100644
index 000000000000..21281f15a5c1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix
@@ -0,0 +1,65 @@
+{ stdenv, fetchurl, meson, ninja, gettext, pkgconfig, spidermonkey_52, glib
+, gnome3, gnome-menus, substituteAll }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extensions-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-shell-extensions/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "07libf6z24n42hpdsq163w0j8xyrav0lxqrwxrvq5kbz8zxv5ch2";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-shell-extensions";
+      attrPath = "gnome3.gnome-shell-extensions";
+    };
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix_gmenu.patch;
+      gmenu_path = "${gnome-menus}/lib/girepository-1.0";
+    })
+  ];
+
+  doCheck = true;
+  # 52 is required for tests
+  # https://gitlab.gnome.org/GNOME/gnome-shell-extensions/blob/3.30.1/meson.build#L25
+  checkInputs = [ spidermonkey_52 ];
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext glib ];
+
+  mesonFlags = [ "-Dextension_set=all" ];
+
+  preFixup = ''
+    # The meson build doesn't compile the schemas.
+    # Fixup adapted from export-zips.sh in the source.
+
+    extensiondir=$out/share/gnome-shell/extensions
+    schemadir=$out/share/gsettings-schemas/${name}/glib-2.0/schemas/
+
+    glib-compile-schemas $schemadir
+
+    for f in $extensiondir/*; do
+      name=`basename ''${f%%@*}`
+      uuid=$name@gnome-shell-extensions.gcampax.github.com
+      schema=$schemadir/org.gnome.shell.extensions.$name.gschema.xml
+
+      if [ -f $schema ]; then
+        mkdir $f/schemas
+        ln -s $schema $f/schemas;
+        glib-compile-schemas $f/schemas
+      fi
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/GnomeShell/Extensions;
+    description = "Modify and extend GNOME Shell functionality and behavior";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/fix_gmenu.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/fix_gmenu.patch
new file mode 100644
index 000000000000..555664e8ae25
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/fix_gmenu.patch
@@ -0,0 +1,11 @@
+--- a/extensions/apps-menu/extension.js
++++ b/extensions/apps-menu/extension.js
+@@ -1,6 +1,8 @@
+ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
+ /* exported init enable disable */
+ 
++imports.gi.GIRepository.Repository.prepend_search_path('@gmenu_path@');
++
+ const {
+     Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Meta, Shell, St
+ } = imports.gi;
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/default.nix
new file mode 100644
index 000000000000..33095a0f1b98
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/default.nix
@@ -0,0 +1,99 @@
+{ fetchurl, fetchpatch, substituteAll, stdenv, meson, ninja, pkgconfig, gnome3, json-glib, libcroco, gettext, libsecret
+, python3, libsoup, polkit, clutter, networkmanager, docbook_xsl , docbook_xsl_ns, at-spi2-core
+, libstartup_notification, telepathy-glib, telepathy-logger, libXtst, unzip, glibcLocales, shared-mime-info
+, libgweather, libcanberra-gtk3, librsvg, geoclue2, perl, docbook_xml_dtd_42, desktop-file-utils
+, libpulseaudio, libical, gobject-introspection, gstreamer, wrapGAppsHook, libxslt, gcr, caribou
+, accountsservice, gdk_pixbuf, gdm, upower, ibus, networkmanagerapplet, libgnomekbd, gnome-desktop
+, gsettings-desktop-schemas, gnome-keyring, glib, gjs, mutter, evolution-data-server, gtk3
+, sassc, systemd, gst_all_1, adwaita-icon-theme, gnome-bluetooth, gnome-clocks, gnome-settings-daemon }:
+
+# http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/gnome-base/gnome-shell/gnome-shell-3.10.2.1.ebuild?revision=1.3&view=markup
+
+let
+  pythonEnv = python3.withPackages ( ps: with ps; [ pygobject3 ] );
+
+in stdenv.mkDerivation rec {
+  name = "gnome-shell-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-shell/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1pb00af3w4wivdhcvdy59z2xlxasg90bcm5a9ck0p5lf97adwx08";
+  };
+
+  LANG = "en_US.UTF-8";
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext docbook_xsl docbook_xsl_ns docbook_xml_dtd_42 perl wrapGAppsHook glibcLocales
+    sassc desktop-file-utils libxslt.bin python3
+  ];
+  buildInputs = [
+    systemd caribou
+    gsettings-desktop-schemas gnome-keyring glib gcr json-glib accountsservice
+    libcroco libsecret libsoup polkit gdk_pixbuf librsvg
+    clutter networkmanager libstartup_notification telepathy-glib
+    libXtst gjs mutter libpulseaudio evolution-data-server
+    libical gtk3 gstreamer gdm libcanberra-gtk3 geoclue2
+    adwaita-icon-theme gnome-bluetooth
+    gnome-clocks # schemas needed
+    at-spi2-core upower ibus gnome-desktop telepathy-logger gnome-settings-daemon
+    gst_all_1.gst-plugins-good # recording
+    gobject-introspection
+
+    # not declared at build time, but typelib is needed at runtime
+    libgweather networkmanagerapplet
+  ];
+  propagatedUserEnvPkgs = [
+    # Needed to support on-screen keyboard used with touch screen devices
+    # see https://github.com/NixOS/nixpkgs/issues/25968
+    caribou
+  ];
+
+  patches = [
+    (fetchpatch {
+      name = "0001-build-Add-missing-dependency-to-run-js-test.patch";
+      url = https://bug787864.bugzilla-attachments.gnome.org/attachment.cgi?id=360016;
+      sha256 = "1dmahd8ysbzh33rxglba0fbq127aw9h14cl2a2bw9913vjxhxijm";
+    })
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit libgnomekbd unzip;
+    })
+  ];
+
+  postPatch = ''
+    patchShebangs src/data-to-c.pl
+
+    substituteInPlace src/gnome-shell-extension-tool.in --replace "@PYTHON@" "${pythonEnv}/bin/python"
+    substituteInPlace src/gnome-shell-perf-tool.in --replace "@PYTHON@" "${pythonEnv}/bin/python"
+  '';
+
+  postInstall = ''
+    glib-compile-schemas $out/share/glib-2.0/schemas
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Until glib’s xdgmime is patched
+      # Fixes “Failed to load resource:///org/gnome/shell/theme/noise-texture.png: Unrecognized image file format”
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  passthru = {
+    mozillaPlugin = "/lib/mozilla/plugins";
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-shell";
+      attrPath = "gnome3.gnome-shell";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Core user interface for the GNOME 3 desktop";
+    homepage = https://wiki.gnome.org/Projects/GnomeShell;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/fix-paths.patch
new file mode 100644
index 000000000000..3207af110885
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/fix-paths.patch
@@ -0,0 +1,22 @@
+--- a/js/ui/extensionDownloader.js
++++ b/js/ui/extensionDownloader.js
+@@ -86,7 +86,7 @@
+     stream.output_stream.write_bytes(contents, null);
+     stream.close(null);
+     let [success, pid] = GLib.spawn_async(null,
+-                                          ['unzip', '-uod', dir.get_path(), '--', file.get_path()],
++                                          ['@unzip@/bin/unzip', '-uod', dir.get_path(), '--', file.get_path()],
+                                           null,
+                                           GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
+                                           null);
+--- a/js/ui/status/keyboard.js
++++ b/js/ui/status/keyboard.js
+@@ -1059,7 +1059,7 @@ class InputSourceIndicator extends PanelMenu.Button {
+         let description = xkbLayout;
+         if (xkbVariant.length > 0)
+             description = description + '\t' + xkbVariant;
+ 
+-        Util.spawn(['gkbd-keyboard-display', '-l', description]);
++        Util.spawn(['@libgnomekbd@/bin/gkbd-keyboard-display', '-l', description]);
+     }
+ });
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/default.nix
new file mode 100644
index 000000000000..f71df437d113
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, fetchurl, substituteAll, pkgconfig, meson, ninja, gettext, gnome3, wrapGAppsHook, packagekit, ostree
+, glib, appstream-glib, libsoup, polkit, isocodes, gspell, libxslt, gobject-introspection, flatpak, fwupd
+, gtk3, gsettings-desktop-schemas, gnome-desktop, libxmlb, gnome-online-accounts, hicolor-icon-theme
+, json-glib, libsecret, valgrind-light, docbook_xsl, docbook_xml_dtd_42, docbook_xml_dtd_43, gtk-doc, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-software-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-software/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0xxhvyqfwlcyvlqc36rpcili00dpwy8b5c5klaqccn5qrc87rl38";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit isocodes;
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext wrapGAppsHook libxslt docbook_xml_dtd_42 docbook_xml_dtd_43
+    valgrind-light docbook_xsl gtk-doc desktop-file-utils gobject-introspection
+    hicolor-icon-theme # for setup-hook
+  ];
+
+  buildInputs = [
+    gtk3 glib packagekit appstream-glib libsoup
+    gsettings-desktop-schemas gnome-desktop
+    gspell json-glib libsecret ostree
+    polkit flatpak fwupd
+    libxmlb gnome-online-accounts
+  ];
+
+  mesonFlags = [
+    "-Dubuntu_reviews=false"
+    "-Dgudev=false"
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-software";
+      attrPath = "gnome3.gnome-software";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Software store that lets you install and update applications and system extensions";
+    homepage = https://wiki.gnome.org/Apps/Software;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/fix-paths.patch
new file mode 100644
index 000000000000..6f443a8a43ed
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/fix-paths.patch
@@ -0,0 +1,11 @@
+--- a/src/gs-language.c
++++ b/src/gs-language.c
+@@ -95,7 +95,7 @@
+ 	g_autoptr(GMarkupParseContext) context = NULL;
+ 
+ 	/* find filename */
+-	filename = g_build_filename (DATADIR, "xml", "iso-codes", "iso_639.xml", NULL);
++	filename = g_build_filename ("@isocodes@", "share", "xml", "iso-codes", "iso_639.xml", NULL);
+ 	if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
+ 		g_free (filename);
+ 		filename = g_build_filename ("/usr", "share", "xml", "iso-codes", "iso_639.xml", NULL);
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix
new file mode 100644
index 000000000000..83159c2ad72f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-system-monitor/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, gettext, fetchurl, pkgconfig, gtkmm3, libxml2, polkit
+, bash, gtk3, glib, wrapGAppsHook, meson, ninja, python3
+, gsettings-desktop-schemas, itstool, gnome3, librsvg, gdk_pixbuf, libgtop, systemd }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-system-monitor-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-system-monitor/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1wd43qdgjav6xamq5z5cy8fri5zr01jga3plc9w95gcia0rk3ha8";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    pkgconfig gettext itstool wrapGAppsHook meson ninja python3
+    polkit # for ITS file
+  ];
+  buildInputs = [
+    bash gtk3 glib libxml2 gtkmm3 libgtop gdk_pixbuf gnome3.adwaita-icon-theme librsvg
+    gsettings-desktop-schemas systemd
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+    sed -i '/gtk-update-icon-cache/s/^/#/' meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-system-monitor";
+      attrPath = "gnome3.gnome-system-monitor";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/SystemMonitor;
+    description = "System Monitor shows you what programs are running and how much processor time, memory, and disk space are being used";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix
new file mode 100644
index 000000000000..9b25ae9218d4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, fetchurl, pkgconfig, libxml2, gnome3, dconf, nautilus
+, gtk3, gsettings-desktop-schemas, vte, intltool, which, libuuid, vala
+, desktop-file-utils, itstool, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-terminal-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-terminal/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0i613844gf5dmzpvwiy68lg8walhj4zr88scacp2qwpqs870si8x";
+  };
+
+  buildInputs = [
+    gtk3 gsettings-desktop-schemas vte libuuid dconf
+    # For extension
+    nautilus
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig intltool itstool which libxml2
+    vala desktop-file-utils wrapGAppsHook
+  ];
+
+  # Silly ./configure, it looks for dbus file from gnome-shell in the
+  # installation tree of the package it is configuring.
+  postPatch = ''
+    substituteInPlace configure --replace '$(eval echo $(eval echo $(eval echo ''${dbusinterfacedir})))/org.gnome.ShellSearchProvider2.xml' "${gnome3.gnome-shell}/share/dbus-1/interfaces/org.gnome.ShellSearchProvider2.xml"
+    substituteInPlace src/Makefile.in --replace '$(dbusinterfacedir)/org.gnome.ShellSearchProvider2.xml' "${gnome3.gnome-shell}/share/dbus-1/interfaces/org.gnome.ShellSearchProvider2.xml"
+  '';
+
+  configureFlags = [ "--disable-migration" ]; # TODO: remove this with 3.30
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-terminal";
+      attrPath = "gnome3.gnome-terminal";
+    };
+  };
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "The GNOME Terminal Emulator";
+    homepage = https://wiki.gnome.org/Apps/Terminal;
+    platforms = platforms.linux;
+    license = licenses.gpl3Plus;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-themes-extra/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-themes-extra/default.nix
new file mode 100644
index 000000000000..3d5cfb85d671
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-themes-extra/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, intltool, gtk3, gnome3, librsvg, pkgconfig, pango, atk, gtk2
+, gdk_pixbuf }:
+
+let
+  pname = "gnome-themes-extra";
+  version = "3.28";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "06aqg9asq2vqi9wr29bs4v8z2bf4manhbhfghf4nvw01y2zs0jvw";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+    };
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs = [ gtk3 librsvg pango atk gtk2 gdk_pixbuf gnome3.adwaita-icon-theme ];
+
+  postFixup = ''
+    gtk-update-icon-cache "$out"/share/icons/HighContrast
+  '';
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-docs/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-docs/default.nix
new file mode 100644
index 000000000000..02bcb52b3875
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-docs/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, itstool, libxml2, intltool }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-user-docs-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-user-docs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "09g6fi9b1xpk0fnp6wgh350v1x318mrf20j4bfarww25vrj6irrw";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-user-docs"; attrPath = "gnome3.gnome-user-docs"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gnome3.yelp itstool libxml2 intltool ];
+
+  meta = with stdenv.lib; {
+    homepage = https://help.gnome.org/users/gnome-help/;
+    description = "User and system administration help for the GNOME desktop";
+    maintainers = gnome3.maintainers;
+    license = licenses.cc-by-30;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-share/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-share/default.nix
new file mode 100644
index 000000000000..65f9fb0db806
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-share/default.nix
@@ -0,0 +1,74 @@
+{ stdenv
+, gettext
+, fetchurl
+, apacheHttpd
+, nautilus
+, pkgconfig
+, gtk3
+, glib
+, libxml2
+, systemd
+, wrapGAppsHook
+, itstool
+, libnotify
+, mod_dnssd
+, gnome3
+, libcanberra-gtk3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-user-share";
+  version = "3.32.0.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "16w6n0cjyzp8vln3zspvab8jhjprpvs88xc9x7bvigg0wry74945";
+  };
+
+  preConfigure = ''
+    sed -e 's,^LoadModule dnssd_module.\+,LoadModule dnssd_module ${mod_dnssd}/modules/mod_dnssd.so,' \
+      -e 's,''${HTTP_MODULES_PATH},${apacheHttpd}/modules,' \
+      -i data/dav_user_2.4.conf
+  '';
+
+  configureFlags = [
+    "--with-httpd=${apacheHttpd.out}/bin/httpd"
+    "--with-modules-path=${apacheHttpd.dev}/modules"
+    "--with-systemduserunitdir=${placeholder ''out''}/etc/systemd/user"
+    "--with-nautilusdir=${placeholder ''out''}/lib/nautilus/extensions-3.0"
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+    gettext
+    itstool
+    libxml2
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    nautilus
+    libnotify
+    libcanberra-gtk3
+    systemd
+  ];
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://help.gnome.org/users/gnome-user-share/3.8;
+    description = "Service that exports the contents of the Public folder in your home directory on the local network";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/grilo-plugins/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/grilo-plugins/default.nix
new file mode 100644
index 000000000000..2e8c3c4a0030
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/grilo-plugins/default.nix
@@ -0,0 +1,82 @@
+{ stdenv
+, fetchurl
+, meson
+, ninja
+, pkgconfig
+, gettext
+, gperf
+, sqlite
+, librest
+, libarchive
+, libsoup
+, gnome3
+, libxml2
+, lua5_3
+, liboauth
+, libgdata
+, libmediaart
+, grilo
+, gnome-online-accounts
+, gmime
+, json-glib
+, avahi
+, tracker
+, dleyna-server
+, itstool
+, totem-pl-parser
+}:
+
+stdenv.mkDerivation rec {
+  pname = "grilo-plugins";
+  version = "0.3.8";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "0nync07gah3jkpb5ph5d3gwbygmabnih2m3hfz7lkvjl2l5pgpac";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    gettext
+    itstool
+    gperf # for lua-factory
+  ];
+
+  buildInputs = [
+    grilo
+    libxml2
+    libgdata
+    lua5_3
+    liboauth
+    sqlite
+    gnome-online-accounts
+    totem-pl-parser
+    librest
+    libarchive
+    libsoup
+    gmime
+    json-glib
+    avahi
+    libmediaart
+    tracker
+    dleyna-server
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/Grilo;
+    description = "A collection of plugins for the Grilo framework";
+    maintainers = gnome3.maintainers;
+    license = licenses.lgpl21;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/grilo/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/grilo/default.nix
new file mode 100644
index 000000000000..a2bee6ac41ee
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/grilo/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, vala, glib, liboauth, gtk3
+, gtk-doc, docbook_xsl, docbook_xml_dtd_43
+, libxml2, gnome3, gobject-introspection, libsoup, totem-pl-parser }:
+
+let
+  pname = "grilo";
+  version = "0.3.7"; # if you change minor, also change ./setup-hook.sh
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  outputs = [ "out" "dev" "man" "devdoc" ];
+  outputBin = "dev";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1dz965l743r4bhj78wij9k1mb6635gnkb1lnk9j7gw9dd5qsyfza";
+  };
+
+  patches = [
+    # Fix meson build: https://gitlab.gnome.org/GNOME/grilo/merge_requests/34
+    (fetchurl {
+      url = "https://gitlab.gnome.org/GNOME/grilo/commit/166612aeff09e5fc2fec1f62185c84cbdcf8f889.diff";
+      sha256 = "07zamy927iaa7knrwq5yxz7ypl1i02pymkcdrg5l55alhdvb81pw";
+    })
+  ];
+
+  setupHook = ./setup-hook.sh;
+
+  mesonFlags = [
+    "-Dgtk_doc=true"
+  ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext gobject-introspection vala
+    gtk-doc docbook_xsl docbook_xml_dtd_43
+  ];
+  buildInputs = [ glib liboauth gtk3 libxml2 libsoup totem-pl-parser ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/Grilo;
+    description = "Framework that provides access to various sources of multimedia content, using a pluggable system";
+    maintainers = gnome3.maintainers;
+    license = licenses.lgpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/grilo/setup-hook.sh b/nixpkgs/pkgs/desktops/gnome-3/core/grilo/setup-hook.sh
new file mode 100644
index 000000000000..9337c520a207
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/grilo/setup-hook.sh
@@ -0,0 +1,7 @@
+make_grilo_find_plugins() {
+    if [ -d "$1"/lib/grilo-0.3 ]; then
+        addToSearchPath GRL_PLUGIN_PATH "$1/lib/grilo-0.3"
+    fi
+}
+
+addEnvHooks "$hostOffset" make_grilo_find_plugins
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/default.nix
new file mode 100644
index 000000000000..3d32a1c24368
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, intltool, fetchFromGitLab, fetchpatch, pkgconfig, gtk3, adwaita-icon-theme
+, glib, desktop-file-utils, gtk-doc, autoconf, automake, libtool
+, wrapGAppsHook, gnome3, itstool, libxml2, yelp-tools
+, docbook_xsl, docbook_xml_dtd_412, gsettings-desktop-schemas
+, callPackage, unzip, gobject-introspection }:
+
+let
+  unicode-data = callPackage ./unicode-data.nix {};
+in stdenv.mkDerivation rec {
+  pname = "gucharmap";
+  version = "12.0.1";
+
+  outputs = [ "out" "lib" "dev" "devdoc" ];
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "GNOME";
+    repo = pname;
+    rev = version;
+    sha256 = "0si3ymyfzc5v7ly0dmcs3qgw2wp8cyasycq5hmcr8frl09lr6gkw";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig wrapGAppsHook unzip intltool itstool
+    autoconf automake libtool gtk-doc docbook_xsl docbook_xml_dtd_412
+    yelp-tools libxml2 desktop-file-utils gobject-introspection
+  ];
+
+  buildInputs = [ gtk3 glib gsettings-desktop-schemas adwaita-icon-theme ];
+
+  configureFlags = [
+    "--with-unicode-data=${unicode-data}"
+    "--enable-gtk-doc"
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    patchShebangs gucharmap/gen-guch-unicode-tables.pl
+  '';
+
+  preConfigure = ''
+    NOCONFIGURE=1 ./autogen.sh
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "GNOME Character Map, based on the Unicode Character Database";
+    homepage = https://wiki.gnome.org/Apps/Gucharmap;
+    license = licenses.gpl3;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/unicode-data.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/unicode-data.nix
new file mode 100644
index 000000000000..cfdda920e27c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/unicode-data.nix
@@ -0,0 +1,45 @@
+{ fetchurl, stdenv, gnome3 }:
+stdenv.mkDerivation rec {
+  name = "unicode-data-${version}";
+  version = "12.0.0";
+  srcs = [
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/Blocks.txt";
+      sha256 = "041sk54v6rjzb23b9x7yjdwzdp2wc7gvfz7ybavgg4gbh51wm8x1";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/DerivedAge.txt";
+      sha256 = "04j92xp07v273z3pxkbfmi1svmw9kmnjl9nvz9fv0g5ybk9zk7r6";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/NamesList.txt";
+      sha256 = "0vsq8gx7hws8mvxy3nlglpwxw7ky57q0fs09d7w9xgb2ylk7fz61";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/Scripts.txt";
+      sha256 = "18c63hx4y5yg408a8d0wx72d2hfnlz4l560y1fsf9lpzifxpqcmx";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/UnicodeData.txt";
+      sha256 = "07d1kq190kgl92ispfx6zmdkvwvhjga0ishxsngzlw8j3kdkz4ap";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/Unihan.zip";
+      sha256 = "1kfdhgg2gm52x3s07bijb5cxjy0jxwhd097k5lqhvzpznprm6ibf";
+    })
+  ];
+  phases = "installPhase";
+  installPhase = with stdenv.lib; ''
+    mkdir $out
+    for f in $srcs;do
+      cp $f $out/$(stripHash $f)
+    done
+  '';
+  meta = with stdenv.lib; {
+    homepage = http://www.unicode.org/ucd/;
+    description = "Unicode Character Database";
+    maintainers = gnome3.maintainers;
+    license = licenses.mit;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix
new file mode 100644
index 000000000000..bc0f5683a75f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/libgnome-keyring/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, glib, dbus, libgcrypt, pkgconfig, intltool, gobject-introspection, gnome3 }:
+
+let
+  pname = "libgnome-keyring";
+  version = "3.12.0";
+in
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "c4c178fbb05f72acc484d22ddb0568f7532c409b0a13e06513ff54b91e947783";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  propagatedBuildInputs = [ glib gobject-introspection dbus libgcrypt ];
+  nativeBuildInputs = [ pkgconfig 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;
+    license = with stdenv.lib.licenses; [ gpl2Plus lgpl2Plus ];
+    inherit (glib.meta) platforms maintainers;
+
+    longDescription = ''
+      gnome-keyring is a program that keeps password and other secrets for
+      users. The library libgnome-keyring is used by applications to integrate
+      with the gnome-keyring system.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/mutter/3.28.nix b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/3.28.nix
new file mode 100644
index 000000000000..9be383220e6e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/3.28.nix
@@ -0,0 +1,88 @@
+{ fetchFromGitLab, stdenv, substituteAll, pkgconfig, gnome3, intltool, gobject-introspection, upower, cairo
+, glib, gtk3, pango, cogl, clutter, libstartup_notification, zenity, libcanberra-gtk3, fetchpatch
+, gsettings-desktop-schemas, gnome-desktop, wrapGAppsHook
+, libtool, makeWrapper, xkeyboard_config, libxkbfile, libxkbcommon, libXtst, libinput
+, geocode-glib, libgudev, libwacom, xwayland, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+  pname = "mutter";
+  version = "3.28.3";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "GNOME";
+    repo = pname;
+    rev = "4af8d9d4752a94612a98d619e65828f0070a7b0e"; # HEAD of https://gitlab.gnome.org/GNOME/mutter/tree/gnome-3-28
+    sha256 = "1rmc1bf80yq776xhygi1jzgia1y44j2mr2n94vlxgzqc0whamx2v";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths-328.patch;
+      inherit zenity;
+    })
+
+    # https://bugzilla.redhat.com/show_bug.cgi?id=1700337
+    # https://gitlab.gnome.org/GNOME/mutter/merge_requests/133
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/mutter328/raw/fff28bebda02111b4c534952465ff967ba7efced/f/0070-clutter-Add-API-to-retrieve-the-physical-size-of-abs.patch";
+      sha256 = "11xg0clrqwvssy2r6hv4iya8g87z2v5f47fimd2b4hha6ki3g1is";
+    })
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/mutter328/raw/fff28bebda02111b4c534952465ff967ba7efced/f/0071-backends-Add-MetaInputMapper.patch";
+      sha256 = "1kcp42hg8sy1q21w5586gdgmi95nf36829kkfswbah61h6bkb518";
+    })
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/mutter328/raw/fff28bebda02111b4c534952465ff967ba7efced/f/0072-backends-Delegate-on-MetaInputMapper-for-unmapped-di.patch";
+      sha256 = "0zf4yxhq5s3dnzmn15mx4yb978g27ij4vmq055my9p7xgh6h9ga8";
+    })
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/mutter328/raw/fff28bebda02111b4c534952465ff967ba7efced/f/0073-backends-Add-MetaInputMapper-method-to-lookup-device.patch";
+      sha256 = "0dnb2hqx5in6x9ar6wnr1hy3bg2wdcl3wbdx4jn66c7bi7s1k5zd";
+    })
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/mutter328/raw/fff28bebda02111b4c534952465ff967ba7efced/f/0074-backends-Turn-builtin-touchscreen-on-off-together-wi.patch";
+      sha256 = "17fvs7j5ws4sz6fkch93gjlik0nm4z426w4n348gyw5llh0r76pg";
+    })
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/mutter328/raw/fff28bebda02111b4c534952465ff967ba7efced/f/0075-backends-Update-to-new-output-setting-for-tablets-to.patch";
+      sha256 = "141p3an83s042f67fw2fqmr79i5g634ndrbpd8cs47fd4wwiwpj5";
+    })
+  ];
+
+  configureFlags = [
+    "--with-x"
+    "--disable-static"
+    "--enable-shape"
+    "--enable-sm"
+    "--enable-startup-notification"
+    "--enable-xsync"
+    "--enable-verbose-mode"
+    "--with-libcanberra"
+    "--with-xwayland-path=${xwayland}/bin/Xwayland"
+    "--enable-compile-warnings=maximum"
+  ];
+
+  propagatedBuildInputs = [
+    # required for pkgconfig to detect mutter-clutter
+    libXtst
+  ];
+
+  nativeBuildInputs = [ autoreconfHook pkgconfig intltool libtool wrapGAppsHook ];
+
+  buildInputs = [
+    glib gobject-introspection gtk3 gsettings-desktop-schemas upower
+    gnome-desktop cairo pango cogl clutter zenity libstartup_notification
+    geocode-glib libinput libgudev libwacom
+    libcanberra-gtk3 zenity xkeyboard_config libxkbfile
+    libxkbcommon
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/mutter/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/default.nix
new file mode 100644
index 000000000000..2c305f002fd5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/default.nix
@@ -0,0 +1,79 @@
+{ fetchurl, substituteAll, stdenv, pkgconfig, gnome3, gettext, gobject-introspection, upower, cairo
+, pango, cogl, clutter, libstartup_notification, zenity, libcanberra-gtk3
+, ninja, xkeyboard_config, libxkbfile, libxkbcommon, libXtst, libinput
+, gsettings-desktop-schemas, glib, gtk3, gnome-desktop
+, geocode-glib, pipewire, libgudev, libwacom, xwayland, meson
+, gnome-settings-daemon
+, xorgserver
+, python3
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mutter";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/mutter/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1q74lrb08vy0ynxbssqyxvbzf9252xgf9l6jxr9g4q0gmvpq402j";
+  };
+
+  mesonFlags = [
+    "-Dxwayland-path=${xwayland}/bin/Xwayland"
+  ];
+
+  propagatedBuildInputs = [
+    # required for pkgconfig to detect mutter-clutter
+    libXtst
+  ];
+
+  nativeBuildInputs = [
+    meson
+    pkgconfig
+    gettext
+    ninja
+    python3
+    # for cvt command
+    xorgserver
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib gobject-introspection gtk3 gsettings-desktop-schemas upower
+    gnome-desktop cairo pango cogl clutter zenity libstartup_notification
+    geocode-glib libinput libgudev libwacom
+    libcanberra-gtk3 zenity xkeyboard_config libxkbfile
+    libxkbcommon pipewire xwayland
+    gnome-settings-daemon
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit zenity;
+    })
+  ];
+
+  postPatch = ''
+    patchShebangs src/backends/native/gen-default-modes.py
+  '';
+
+  postInstall = ''
+    ${glib.dev}/bin/glib-compile-schemas "$out/share/glib-2.0/schemas"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "mutter";
+      attrPath = "gnome3.mutter";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths-328.patch b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths-328.patch
new file mode 100644
index 000000000000..6c40624a55da
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths-328.patch
@@ -0,0 +1,13 @@
+diff --git a/src/core/util.c b/src/core/util.c
+index 5b8de18c7..546352a95 100644
+--- a/src/core/util.c
++++ b/src/core/util.c
+@@ -635,7 +635,7 @@ meta_show_dialog (const char *type,
+
+   args = g_ptr_array_new ();
+
+-  append_argument (args, "zenity");
++  append_argument (args, "@zenity@/bin/zenity");
+   append_argument (args, type);
+
+   if (display)
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths.patch
new file mode 100644
index 000000000000..6ac0a431f61f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/core/util.c b/src/core/util.c
+index 57b73747d..f424cc81c 100644
+--- a/src/core/util.c
++++ b/src/core/util.c
+@@ -636,7 +636,7 @@ meta_show_dialog (const char *type,
+ 
+   args = g_ptr_array_new ();
+ 
+-  append_argument (args, "zenity");
++  append_argument (args, "@zenity@/bin/zenity");
+   append_argument (args, type);
+ 
+   if (display)
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/bubblewrap-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/bubblewrap-paths.patch
new file mode 100644
index 000000000000..37358c8432c5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/bubblewrap-paths.patch
@@ -0,0 +1,15 @@
+---   a/src/gnome-desktop/gnome-desktop-thumbnail-script.c
++++   a/src/gnome-desktop/gnome-desktop-thumbnail-script.c
+@@ -536,9 +536,9 @@ add_bwrap (GPtrArray   *array,
+   g_return_val_if_fail (script->s_infile != NULL, FALSE);
+ 
+   add_args (array,
+-	    "bwrap",
+-	    "--ro-bind", "/usr", "/usr",
+-	    "--ro-bind", "/etc/ld.so.cache", "/etc/ld.so.cache",
++	    "@bubblewrap_bin@",
++	    "--ro-bind", "@storeDir@", "@storeDir@",
++	    "--ro-bind", "/run/current-system", "/run/current-system",
+ 	    NULL);
+ 
+   /* These directories might be symlinks into /usr/... */
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/default.nix
new file mode 100644
index 000000000000..688e8cc93657
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/default.nix
@@ -0,0 +1,70 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, libxml2
+, desktop-file-utils, python3, wrapGAppsHook , gtk3, gnome3, gnome-autoar
+, glib-networking, shared-mime-info, libnotify, libexif, libseccomp , exempi
+, librsvg, tracker, tracker-miners, gexiv2, libselinux, gdk_pixbuf
+, substituteAll, bubblewrap, gst_all_1, gsettings-desktop-schemas
+}:
+
+let
+  pname = "nautilus";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1pnh32fal7dkwadga5savg1nv0zqnbakhk0hxr5726087i6y6ii2";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig libxml2 gettext python3 wrapGAppsHook
+    desktop-file-utils
+  ];
+
+  buildInputs = [
+    glib-networking shared-mime-info libexif gtk3 exempi libnotify libselinux
+    tracker tracker-miners gexiv2 libseccomp bubblewrap gst_all_1.gst-plugins-base
+    gnome3.adwaita-icon-theme gsettings-desktop-schemas
+  ];
+
+  propagatedBuildInputs = [ gnome-autoar ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${gdk_pixbuf}/share"
+      --prefix XDG_DATA_DIRS : "${librsvg}/share"
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  postPatch = ''
+    patchShebangs build-aux/meson/postinstall.py
+  '';
+
+  patches = [
+    ./extension_dir.patch
+    # 3.30 now generates it's own thummbnails,
+    # and no longer depends on `gnome-desktop`
+    (substituteAll {
+      src = ./bubblewrap-paths.patch;
+      bubblewrap_bin = "${bubblewrap}/bin/bwrap";
+      inherit (builtins) storeDir;
+    })
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "The file manager for GNOME";
+    homepage = https://wiki.gnome.org/Apps/Files;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/extension_dir.patch b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/extension_dir.patch
new file mode 100644
index 000000000000..e1313999675d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/extension_dir.patch
@@ -0,0 +1,24 @@
+diff --git a/src/nautilus-module.c b/src/nautilus-module.c
+index 6273a76..4adcc8a 100644
+--- a/src/nautilus-module.c
++++ b/src/nautilus-module.c
+@@ -242,11 +242,17 @@ void
+ nautilus_module_setup (void)
+ {
+     static gboolean initialized = FALSE;
++    const gchar* extensiondir = NULL;
+ 
+     if (!initialized)
+     {
+         initialized = TRUE;
+ 
+-        load_module_dir (NAUTILUS_EXTENSIONDIR);
++        extensiondir = g_getenv ("NAUTILUS_EXTENSION_DIR");
++        if (extensiondir == NULL) {
++            extensiondir = NAUTILUS_EXTENSIONDIR;
++        }
++
++        load_module_dir (extensiondir);
+ 
+         eel_debug_call_at_shutdown (free_module_objects);
+     }
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/rygel/add-option-for-installation-sysconfdir.patch b/nixpkgs/pkgs/desktops/gnome-3/core/rygel/add-option-for-installation-sysconfdir.patch
new file mode 100644
index 000000000000..4259f93eb24c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/rygel/add-option-for-installation-sysconfdir.patch
@@ -0,0 +1,38 @@
+diff --git a/meson.build b/meson.build
+index 209d4187..58580980 100644
+--- a/meson.build
++++ b/meson.build
+@@ -20,7 +20,11 @@ if not get_option('uninstalled')
+     rygel_datadir = join_paths(get_option('prefix'), get_option('datadir'), 'rygel')
+     rygel_libexecdir = join_paths(get_option('prefix'), get_option('libexecdir'),
+     'rygel')
+-    rygel_sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir'))
++    if get_option('sysconfdir_install') != ''
++        rygel_sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir_install'))
++    else
++        rygel_sysconfdir = join_paths(get_option('prefix'), get_option('sysconfdir'))
++    endif
+     rygel_plugindir = join_paths(rygel_libdir, 'rygel-2.6', 'plugins')
+     rygel_enginedir = join_paths(rygel_libdir, 'rygel-2.6', 'engines')
+     rygel_presetdir = join_paths(rygel_datadir, 'rygel', 'presets')
+@@ -55,7 +59,7 @@ conf.set_quoted('DATA_DIR', rygel_datadir)
+ conf.set_quoted('PLUGIN_DIR', rygel_plugindir)
+ conf.set_quoted('BIG_ICON_DIR', rygel_bigicondir)
+ conf.set_quoted('SMALL_ICON_DIR', rygel_smallicondir)
+-conf.set_quoted('SYS_CONFIG_DIR', rygel_sysconfdir)
++conf.set_quoted('SYS_CONFIG_DIR', get_option('sysconfdir'))
+ conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
+ conf.set_quoted('MX_EXTRACT_PATH', join_paths(rygel_libexecdir, 'mx-extract'))
+ conf.set_quoted('DESKTOP_DIR', join_paths(get_option('prefix'), get_option('datadir'), 'applications'))
+diff --git a/meson_options.txt b/meson_options.txt
+index f09cac58..ff11c548 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -1,6 +1,7 @@
+ option('uninstalled', type: 'boolean', value: 'false', description: 'Run Rygel from build directory only')
+ option('api-docs', type: 'boolean', value: 'false', description: 'Build the API documentation')
+ option('systemd-user-units-dir', type : 'string', value : 'auto', description : 'Where to install the systemd user unit (use special values "auto" or "none", or pass a path')
++option('sysconfdir_install', type: 'string', value: '', description: 'sysconfdir to use during installation')
+ option('plugins', type : 'array', choices : ['external', 'gst-launch', 'lms', 'media-export', 'mpris', 'playbin', 'ruih', 'tracker'])
+ option('engines', type : 'array', choices : ['simple', 'gstreamer'])
+ option('examples', type : 'boolean', value : 'true')
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/rygel/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/rygel/default.nix
new file mode 100644
index 000000000000..5e701e488f26
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/rygel/default.nix
@@ -0,0 +1,106 @@
+{ stdenv
+, fetchurl
+, meson
+, ninja
+, pkgconfig
+, vala
+, gettext
+, libxml2
+, gobject-introspection
+, wrapGAppsHook
+, python3
+, glib
+, gssdp
+, gupnp
+, gupnp-av
+, gupnp-dlna
+, gst_all_1
+, libgee
+, libsoup
+, gtk3
+, libmediaart
+, sqlite
+, systemd
+, tracker
+, shared-mime-info
+, gnome3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "rygel";
+  version = "0.38.0";
+
+  # TODO: split out lib
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "03ky18hwcz362lbhqm1zm0ax2a075r69xms5cznchn9p9w8z5axc";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    vala
+    gettext
+    libxml2
+    gobject-introspection
+    wrapGAppsHook
+    python3
+  ];
+
+  buildInputs = [
+    glib
+    gssdp
+    gupnp
+    gupnp-av
+    gupnp-dlna
+    libgee
+    libsoup
+    gtk3
+    libmediaart
+    sqlite
+    systemd
+    tracker
+    shared-mime-info
+  ] ++ (with gst_all_1; [
+    gstreamer
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-bad
+    gst-plugins-ugly
+  ]);
+
+  mesonFlags = [
+    "-Dsystemd-user-units-dir=${placeholder "out"}/lib/systemd/user"
+    "-Dapi-docs=false"
+    "--sysconfdir=/etc"
+    "-Dsysconfdir_install=${placeholder "out"}/etc"
+  ];
+
+  doCheck = true;
+
+  patches = [
+    ./add-option-for-installation-sysconfdir.patch
+  ];
+
+  postPatch = ''
+    patchShebangs data/xml/process-xml.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "A home media solution (UPnP AV MediaServer) that allows you to easily share audio, video and pictures to other devices";
+    homepage = https://wiki.gnome.org/Projects/Rygel;
+    license = licenses.lgpl21Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/simple-scan/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/simple-scan/default.nix
new file mode 100644
index 000000000000..ad2ac5d6e690
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/simple-scan/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, itstool, python3, wrapGAppsHook
+, cairo, gdk_pixbuf, colord, glib, gtk3, gusb, packagekit, libwebp
+, libxml2, sane-backends, vala, gnome3, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  name = "simple-scan-${version}";
+  version = "3.32.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/simple-scan/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "12r5hacwpf0gzca3p73xpmx3dksa1kx50nlj6w4nw8jfqzjlkq1k";
+  };
+
+  buildInputs = [
+    cairo gdk_pixbuf colord glib gnome3.adwaita-icon-theme gusb
+    gtk3 libwebp packagekit sane-backends vala
+  ];
+  nativeBuildInputs = [
+    meson ninja gettext itstool pkgconfig python3 wrapGAppsHook libxml2
+    # For setup hook
+    gobject-introspection
+  ];
+
+  postPatch = ''
+    patchShebangs data/meson_compile_gschema.py
+  '';
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "simple-scan";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Simple scanning utility";
+    longDescription = ''
+      A really easy way to scan both documents and photos. You can crop out the
+      bad parts of a photo and rotate it if it is the wrong way round. You can
+      print your scans, export them to pdf, or save them in a range of image
+      formats. Basically a frontend for SANE - which is the same backend as
+      XSANE uses. This means that all existing scanners will work and the
+      interface is well tested.
+    '';
+    homepage = https://gitlab.gnome.org/GNOME/simple-scan;
+    license = licenses.gpl3Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/sushi/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/sushi/default.nix
new file mode 100644
index 000000000000..478aac8c1731
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/sushi/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, meson, gettext, gobject-introspection, glib
+, clutter-gtk, clutter-gst, gnome3, gtksourceview, gjs
+, webkitgtk, libmusicbrainz5, icu, wrapGAppsHook, gst_all_1
+, gdk_pixbuf, librsvg, gtk3, harfbuzz, ninja }:
+
+stdenv.mkDerivation rec {
+  name = "sushi-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/sushi/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0f1i8qp39gq749h90f7nwgrj4q6y55jnyh62n1v8hxvlk0b2wqnx";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig meson ninja gettext gobject-introspection wrapGAppsHook
+  ];
+  buildInputs = [
+    glib gtk3 gnome3.evince icu harfbuzz
+    clutter-gtk clutter-gst gjs gtksourceview gdk_pixbuf
+    librsvg libmusicbrainz5 webkitgtk
+    gst_all_1.gstreamer gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "sushi";
+      attrPath = "gnome3.sushi";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = "https://en.wikipedia.org/wiki/Sushi_(software)";
+    description = "A quick previewer for Nautilus";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/totem/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/totem/default.nix
new file mode 100644
index 000000000000..d3319c4522e4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/totem/default.nix
@@ -0,0 +1,65 @@
+{ stdenv, fetchurl, meson, ninja, gettext, gst_all_1
+, clutter-gtk, clutter-gst, python3Packages, shared-mime-info
+, pkgconfig, gtk3, glib, gobject-introspection, totem-pl-parser
+, wrapGAppsHook, itstool, libxml2, vala, gnome3, grilo, grilo-plugins
+, libpeas, adwaita-icon-theme, gnome-desktop, gsettings-desktop-schemas
+, gdk_pixbuf, tracker, nautilus, xvfb_run }:
+
+stdenv.mkDerivation rec {
+  name = "totem-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/totem/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "12iykwslvnpgmrm4bcchx5rzn2g4rl5r9s86n2001djn58yw6m6r";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig gettext python3Packages.python itstool gobject-introspection wrapGAppsHook ];
+  buildInputs = [
+    gtk3 glib grilo clutter-gtk clutter-gst totem-pl-parser grilo-plugins
+    gst_all_1.gstreamer gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-ugly gst_all_1.gst-libav libpeas shared-mime-info
+    gdk_pixbuf libxml2 adwaita-icon-theme gnome-desktop
+    gsettings-desktop-schemas tracker nautilus
+    python3Packages.pygobject3 python3Packages.dbus-python # for plug-ins
+  ];
+
+  postPatch = ''
+    chmod +x meson_compile_python.py meson_post_install.py # patchShebangs requires executable file
+    patchShebangs .
+  '';
+
+  mesonFlags = [
+    "-Dwith-nautilusdir=${placeholder "out"}/lib/nautilus/extensions-3.0"
+    # https://bugs.launchpad.net/ubuntu/+source/totem/+bug/1712021
+    # https://bugzilla.gnome.org/show_bug.cgi?id=784236
+    # https://github.com/mesonbuild/meson/issues/1994
+    "-Denable-vala=no"
+  ];
+
+  checkInputs = [ xvfb_run ];
+
+  checkPhase = ''
+    xvfb-run -s '-screen 0 800x600x24' \
+      ninja test
+  '';
+
+  wrapPrefixVariables = [ "PYTHONPATH" ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "totem";
+      attrPath = "gnome3.totem";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Videos;
+    description = "Movie player for the GNOME desktop based on GStreamer";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/default.nix
new file mode 100644
index 000000000000..3f8f5cf8c888
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/default.nix
@@ -0,0 +1,101 @@
+{ stdenv, fetchurl, substituteAll, intltool, itstool, libxslt, gexiv2, tracker
+, meson, ninja, pkgconfig, vala, wrapGAppsHook, bzip2, dbus, evolution-data-server
+, exempi, flac, giflib, glib, gnome3, gst_all_1, icu, json-glib, libcue, libexif
+, libgrss, libgsf, libiptcdata, libjpeg, libpng, libseccomp, libsoup, libtiff, libuuid
+, libvorbis, libxml2, poppler, taglib, upower, totem-pl-parser }:
+
+let
+  pname = "tracker-miners";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "2.2.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1xbjbd994jxhdan7227kzdnmiblfy0f1vnsws5l809ydgk58f0qr";
+  };
+
+  nativeBuildInputs = [
+    intltool
+    itstool
+    libxslt
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  # TODO: add libenca, libosinfo
+  buildInputs = [
+    bzip2
+    dbus
+    evolution-data-server
+    exempi
+    flac
+    giflib
+    glib
+    gexiv2
+    totem-pl-parser
+    tracker
+    gst_all_1.gst-plugins-base
+    gst_all_1.gstreamer
+    icu
+    json-glib
+    libcue
+    libexif
+    libgrss
+    libgsf
+    libiptcdata
+    libjpeg
+    libpng
+    libseccomp
+    libsoup
+    libtiff
+    libuuid
+    libvorbis
+    libxml2
+    poppler
+    taglib
+    upower
+  ];
+
+  mesonFlags = [
+    # TODO: tests do not like our sandbox
+    "-Dfunctional_tests=false"
+    "-Ddbus_services=${placeholder "out"}/share/dbus-1/services"
+    "-Dsystemd_user_services=${placeholder "out"}/lib/systemd/user"
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit (gnome3) tracker;
+    })
+    # https://bugzilla.gnome.org/show_bug.cgi?id=795576
+    (fetchurl {
+      url = https://bugzilla.gnome.org/attachment.cgi?id=371427;
+      sha256 = "187flswvzymjfxwfrrhizb1cvs780zm39aa3i2vwa5fbllr7kcpf";
+    })
+  ];
+
+  postInstall = ''
+    glib-compile-schemas "$out/share/glib-2.0/schemas"
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/Tracker;
+    description = "Desktop-neutral user information store, search tool and indexer";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/fix-paths.patch
new file mode 100644
index 000000000000..724c51cb56f8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/fix-paths.patch
@@ -0,0 +1,20 @@
+--- a/src/libtracker-miners-common/tracker-domain-ontology.c
++++ b/src/libtracker-miners-common/tracker-domain-ontology.c
+@@ -323,7 +323,7 @@
+ 			goto end;
+ 		}
+ 	} else {
+-		path = g_build_filename (SHAREDIR, "tracker", "domain-ontologies",
++		path = g_build_filename ("@tracker@", "share", "tracker", "domain-ontologies",
+ 		                         DEFAULT_RULE, NULL);
+ 
+ 		if (!g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
+@@ -388,7 +388,7 @@
+ 	if (!priv->ontology_location) {
+ 		gchar *ontology_path;
+ 
+-		ontology_path = g_build_filename (SHAREDIR, "tracker", "ontologies",
++		ontology_path = g_build_filename ("@tracker@", "share", "tracker", "ontologies",
+ 		                                  priv->ontology_name, NULL);
+ 
+ 		if (!g_file_test (ontology_path, G_FILE_TEST_IS_DIR)) {
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/tracker/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/tracker/default.nix
new file mode 100644
index 000000000000..36199c3818c4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker/default.nix
@@ -0,0 +1,71 @@
+{ stdenv, fetchurl, fetchFromGitLab, intltool, meson, ninja, pkgconfig, gobject-introspection, python3
+, gtk-doc, docbook_xsl, docbook_xml_dtd_412, docbook_xml_dtd_43, glibcLocales
+, libxml2, upower, glib, wrapGAppsHook, vala, sqlite, libxslt, libstemmer
+, gnome3, icu, libuuid, networkmanager, libsoup, json-glib
+, substituteAll}:
+
+let
+  pname = "tracker";
+  version = "2.2.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1zx2mlnsv6clgh0j50f0b94b7cf1al1j7bkcz8cr31a0fkkgkkhc";
+  };
+
+  nativeBuildInputs = [
+    meson ninja vala pkgconfig intltool libxslt wrapGAppsHook gobject-introspection
+    gtk-doc docbook_xsl docbook_xml_dtd_412 docbook_xml_dtd_43 glibcLocales
+    python3 # for data-generators
+  ];
+
+  buildInputs = [
+    glib libxml2 sqlite upower icu networkmanager libsoup libuuid json-glib libstemmer
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  mesonFlags = [
+    "-Ddbus_services=${placeholder ''out''}/share/dbus-1/services"
+    "-Dsystemd_user_services=${placeholder ''out''}/lib/systemd/user"
+    # TODO: figure out wrapping unit tests, some of them fail on missing gsettings-desktop-schemas
+    "-Dfunctional_tests=false"
+    "-Ddocs=true"
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      gdbus = "${glib.bin}/bin/gdbus";
+    })
+  ];
+
+  postPatch = ''
+    patchShebangs utils/g-ir-merge/g-ir-merge
+    patchShebangs utils/data-generators/cc/generate
+  '';
+
+  postInstall = ''
+    glib-compile-schemas "$out/share/glib-2.0/schemas"
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/Tracker;
+    description = "Desktop-neutral user information store, search tool and indexer";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/tracker/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/core/tracker/fix-paths.patch
new file mode 100644
index 000000000000..f5c13c3fcdaf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker/fix-paths.patch
@@ -0,0 +1,12 @@
+--- a/src/tracker-store/tracker-store.desktop.in
++++ b/src/tracker-store/tracker-store.desktop.in
+@@ -1,8 +1,8 @@
+ [Desktop Entry]
+ Name=Tracker Store
+ Comment=Metadata database store and lookup manager
+-Exec=gdbus call -e -d org.freedesktop.DBus -o /org/freedesktop/DBus -m org.freedesktop.DBus.StartServiceByName org.freedesktop.Tracker1 0
++Exec=@gdbus@ call -e -d org.freedesktop.DBus -o /org/freedesktop/DBus -m org.freedesktop.DBus.StartServiceByName org.freedesktop.Tracker1 0
+ Terminal=false
+ Type=Application
+ Categories=Utility;
+ X-GNOME-Autostart-enabled=true
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/vino/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/vino/default.nix
new file mode 100644
index 000000000000..b3f06c2dcc1c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/vino/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, lib, wrapGAppsHook
+, pkgconfig, gnome3, gtk3, glib, intltool, libXtst, libnotify, libsoup
+, telepathySupport ? false, dbus-glib ? null, telepathy-glib ? null
+, libsecret, gnutls, libgcrypt, avahi, zlib, libjpeg, libXdamage, libXfixes, libXext
+, networkmanager }:
+
+with lib;
+
+stdenv.mkDerivation rec {
+  name = "vino-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/vino/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "2911c779b6a2c46e5bc8e5a0c94c2a4d5bd4a1ee7e35f2818702cb13d9d23bab";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [ intltool wrapGAppsHook pkgconfig ];
+
+  buildInputs = [
+    gnome3.adwaita-icon-theme gtk3 glib libXtst libnotify libsoup
+    libsecret gnutls libgcrypt avahi zlib libjpeg
+    libXdamage libXfixes libXext networkmanager
+  ] ++ optionals telepathySupport [ dbus-glib telepathy-glib ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "vino";
+      attrPath = "gnome3.vino";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Projects/Vino;
+    description = "GNOME desktop sharing server";
+    maintainers = with maintainers; [ lethalman domenkozar ];
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/yelp-tools/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/yelp-tools/default.nix
new file mode 100644
index 000000000000..41120a74b084
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/yelp-tools/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchurl, libxml2, libxslt, itstool, gnome3, pkgconfig }:
+
+stdenv.mkDerivation rec {
+  name = "yelp-tools-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp-tools/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "037fd6xpy3zab7j5p7c0vfc6c3nk6qs0prvz1hbilzc31p8l1pdz";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "yelp-tools"; attrPath = "gnome3.yelp-tools"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ libxml2 libxslt itstool gnome3.yelp-xsl ];
+
+  doCheck = true;
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Yelp/Tools;
+    description = "Small programs that help you create, edit, manage, and publish your Mallard or DocBook documentation";
+    maintainers = with maintainers; [ domenkozar ];
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix
new file mode 100644
index 000000000000..f1a393117280
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/yelp-xsl/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, intltool, fetchurl, pkgconfig
+, itstool, libxml2, libxslt, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "yelp-xsl-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp-xsl/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "013z2ixx9kfrs6hq79qpil093xfbc12y1p0mvsh6lpala30iphya";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "yelp-xsl"; attrPath = "gnome3.yelp-xsl"; };
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool itstool libxml2 libxslt ];
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Yelp;
+    description = "Yelp's universal stylesheets for Mallard and DocBook";
+    maintainers = gnome3.maintainers;
+    license = [licenses.gpl2 licenses.lgpl2];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/yelp/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/yelp/default.nix
new file mode 100644
index 000000000000..ecbb7b277ff3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/yelp/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, gettext, fetchurl, webkitgtk, pkgconfig, gtk3, glib
+, gnome3, sqlite
+, itstool, libxml2, libxslt, gst_all_1
+, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "yelp-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "159ayfyswn9yh7g5hjs6lphh510n6qkyd1cj47hnc3ynnab9hn4r";
+  };
+
+  nativeBuildInputs = [ pkgconfig gettext itstool wrapGAppsHook ];
+  buildInputs = [
+    gtk3 glib webkitgtk sqlite
+    libxml2 libxslt gnome3.yelp-xsl
+    gnome3.adwaita-icon-theme
+    gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "yelp";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Yelp;
+    description = "The help viewer in Gnome";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/core/zenity/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/zenity/default.nix
new file mode 100644
index 000000000000..89d0fd7a3b90
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/zenity/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, libxml2, libxslt, gnome3, gtk3
+, gnome-doc-utils, intltool, libX11, which, itstool, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "zenity-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/zenity/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "15fdh8xfdhnwcynyh4byx3mrjxbyprqnwxzi7qn3g5wwaqryg1p7";
+  };
+
+  preBuild = ''
+    mkdir -p $out/include
+  '';
+
+  buildInputs = [ gtk3 libxml2 libxslt libX11 itstool ];
+
+  nativeBuildInputs = [ pkgconfig intltool gnome-doc-utils which wrapGAppsHook ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "zenity";
+      attrPath = "gnome3.zenity";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/default.nix b/nixpkgs/pkgs/desktops/gnome-3/default.nix
new file mode 100644
index 000000000000..8680e3ed81da
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/default.nix
@@ -0,0 +1,401 @@
+{ config, pkgs, lib }:
+
+lib.makeScope pkgs.newScope (self: with self; {
+  updateScript = callPackage ./update.nix { };
+
+  /* Remove packages of packagesToRemove from packages, based on their names
+
+     Type:
+       removePackagesByName :: [package] -> [package] -> [package]
+
+     Example:
+       removePackagesByName [ nautilus file-roller ] [ file-roller totem ]
+       => [ nautilus ]
+  */
+  removePackagesByName = packages: packagesToRemove:
+    let
+      pkgName = drv: (builtins.parseDrvName drv.name).name;
+      namesToRemove = map pkgName packagesToRemove;
+    in
+      lib.filter (x: !(builtins.elem (pkgName x) namesToRemove)) packages;
+
+  maintainers = with pkgs.lib.maintainers; [ lethalman jtojnar hedning worldofpeace ];
+
+  corePackages = with gnome3; [
+    pkgs.desktop-file-utils
+    pkgs.shared-mime-info # for update-mime-database
+    glib # for gsettings
+    gtk3.out # for gtk-update-icon-cache
+    glib-networking gvfs dconf gnome-backgrounds gnome-control-center
+    gnome-menus gnome-settings-daemon gnome-shell
+    gnome-themes-extra adwaita-icon-theme gnome-shell-extensions
+    pkgs.hicolor-icon-theme
+  ];
+
+  optionalPackages = with gnome3; [ baobab eog epiphany evince
+    gucharmap nautilus totem vino yelp gnome-bluetooth
+    gnome-calculator gnome-contacts gnome-font-viewer gnome-screenshot
+    gnome-system-monitor simple-scan
+    gnome-terminal gnome-user-docs evolution file-roller gedit
+    gnome-clocks gnome-music gnome-tweaks gnome-photos
+    nautilus-sendto dconf-editor vinagre gnome-weather gnome-logs
+    gnome-maps gnome-characters gnome-calendar accerciser gnome-nettool
+    gnome-getting-started-docs gnome-packagekit gnome-software
+    gnome-power-manager gnome-todo gnome-usage
+  ];
+
+  gamesPackages = with gnome3; [ swell-foop lightsoff iagno
+    tali quadrapassel gnome-sudoku atomix aisleriot five-or-more
+    four-in-a-row gnome-chess gnome-klotski gnome-mahjongg
+    gnome-mines gnome-nibbles gnome-robots gnome-tetravex
+    hitori gnome-taquin
+  ];
+
+  libsoup = pkgs.libsoup.override { gnomeSupport = true; };
+  libchamplain = pkgs.libchamplain.override { libsoup = libsoup; };
+  gnome3 = self // { recurseForDerivations = false; };
+  vala = pkgs.vala_0_44;
+  gegl_0_4 = pkgs.gegl_0_4.override { gtk = pkgs.gtk3; };
+
+# ISO installer
+# installerIso = callPackage ./installer.nix {};
+
+#### Core (http://ftp.acc.umu.se/pub/GNOME/core/)
+
+  adwaita-icon-theme = callPackage ./core/adwaita-icon-theme { };
+
+  baobab = callPackage ./core/baobab { };
+
+  caribou = callPackage ./core/caribou { };
+
+  dconf = callPackage ./core/dconf { };
+  dconf-editor = callPackage ./core/dconf-editor { };
+
+  empathy = callPackage ./core/empathy { };
+
+  epiphany = callPackage ./core/epiphany { };
+
+  evince = callPackage ./core/evince { }; # ToDo: dbus would prevent compilation, enable tests
+
+  evolution-data-server = callPackage ./core/evolution-data-server { };
+
+  gdm = callPackage ./core/gdm { };
+
+  gjs = callPackage ./core/gjs { };
+
+  glib-networking = pkgs.glib-networking.override {
+    inherit (pkgs) gsettings-desktop-schemas;
+  };
+
+  gnome-backgrounds = callPackage ./core/gnome-backgrounds { };
+
+  gnome-bluetooth = callPackage ./core/gnome-bluetooth { };
+
+  gnome-color-manager = callPackage ./core/gnome-color-manager { };
+
+  gnome-contacts = callPackage ./core/gnome-contacts { };
+
+  gnome-control-center = callPackage ./core/gnome-control-center { };
+
+  gnome-calculator = callPackage ./core/gnome-calculator { };
+
+  gnome-common = callPackage ./core/gnome-common { };
+
+  gnome-desktop = callPackage ./core/gnome-desktop { };
+
+  gnome-dictionary = callPackage ./core/gnome-dictionary { };
+
+  gnome-disk-utility = callPackage ./core/gnome-disk-utility { };
+
+  gnome-font-viewer = callPackage ./core/gnome-font-viewer { };
+
+  gnome-keyring = callPackage ./core/gnome-keyring { };
+
+  libgnome-keyring = callPackage ./core/libgnome-keyring { };
+
+  gnome-online-accounts = callPackage ./core/gnome-online-accounts { };
+
+  gnome-online-miners = callPackage ./core/gnome-online-miners { };
+
+  gnome-remote-desktop = callPackage ./core/gnome-remote-desktop { };
+
+  gnome-session = callPackage ./core/gnome-session { };
+
+  gnome-shell = callPackage ./core/gnome-shell { };
+
+  gnome-shell-extensions = callPackage ./core/gnome-shell-extensions { };
+
+  gnome-screenshot = callPackage ./core/gnome-screenshot { };
+
+  gnome-settings-daemon = callPackage ./core/gnome-settings-daemon { };
+
+  gnome-software = callPackage ./core/gnome-software { };
+
+  gnome-system-monitor = callPackage ./core/gnome-system-monitor { };
+
+  gnome-terminal = callPackage ./core/gnome-terminal { };
+
+  gnome-themes-extra = callPackage ./core/gnome-themes-extra { };
+
+  gnome-user-docs = callPackage ./core/gnome-user-docs { };
+
+  gnome-user-share = callPackage ./core/gnome-user-share { };
+
+  grilo = callPackage ./core/grilo { };
+
+  grilo-plugins = callPackage ./core/grilo-plugins { };
+
+  gucharmap = callPackage ./core/gucharmap { };
+
+  gvfs = pkgs.gvfs.override { gnome = gnome3; gnomeSupport = true; };
+
+  eog = callPackage ./core/eog { };
+
+  mutter = callPackage ./core/mutter { };
+
+  # Needed for elementary's gala and greeter until they get around to adapting to all the API breaking changes in libmutter-3
+  # A more detailed explaination can be seen here https://decathorpe.com/2018/09/04/call-for-help-pantheon-on-fedora-29.html
+  # See Also: https://github.com/elementary/gala/issues/303
+  mutter328 = callPackage ./core/mutter/3.28.nix { };
+
+  nautilus = callPackage ./core/nautilus { };
+
+  networkmanager-openvpn = pkgs.networkmanager-openvpn.override {
+    withGnome = true;
+  };
+
+  networkmanager-vpnc = pkgs.networkmanager-vpnc.override {
+    withGnome = true;
+  };
+
+  networkmanager-openconnect = pkgs.networkmanager-openconnect.override {
+    withGnome = true;
+  };
+
+  networkmanager-fortisslvpn = pkgs.networkmanager-fortisslvpn.override {
+    withGnome = true;
+  };
+
+  networkmanager-l2tp = pkgs.networkmanager-l2tp.override {
+    withGnome = true;
+  };
+
+  networkmanager-iodine = pkgs.networkmanager-iodine.override {
+    withGnome = true;
+  };
+
+  networkmanagerapplet = pkgs.networkmanagerapplet.override {
+    withGnome = true;
+  };
+
+  rygel = callPackage ./core/rygel { };
+
+  simple-scan = callPackage ./core/simple-scan { };
+
+  sushi = callPackage ./core/sushi { };
+
+  totem = callPackage ./core/totem { };
+
+  tracker = callPackage ./core/tracker { };
+
+  tracker-miners = callPackage ./core/tracker-miners { };
+
+  vino = callPackage ./core/vino { };
+
+  yelp = callPackage ./core/yelp { };
+
+  yelp-xsl = callPackage ./core/yelp-xsl { };
+
+  yelp-tools = callPackage ./core/yelp-tools { };
+
+  zenity = callPackage ./core/zenity { };
+
+
+#### Apps (http://ftp.acc.umu.se/pub/GNOME/apps/)
+
+  accerciser = callPackage ./apps/accerciser { };
+
+  cheese = callPackage ./apps/cheese { };
+
+  evolution = callPackage ./apps/evolution { };
+
+  file-roller = callPackage ./apps/file-roller { };
+
+  gedit = callPackage ./apps/gedit { };
+
+  ghex = callPackage ./apps/ghex { };
+
+  glade = callPackage ./apps/glade { };
+
+  gnome-books = callPackage ./apps/gnome-books { };
+
+  gnome-boxes = callPackage ./apps/gnome-boxes { };
+
+  gnome-calendar = callPackage ./apps/gnome-calendar { };
+
+  gnome-characters = callPackage ./apps/gnome-characters { };
+
+  gnome-clocks = callPackage ./apps/gnome-clocks { };
+
+  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 { };
+
+  gnome-music = callPackage ./apps/gnome-music { };
+
+  gnome-nettool = callPackage ./apps/gnome-nettool { };
+
+  gnome-notes = callPackage ./apps/gnome-notes { };
+
+  gnome-photos = callPackage ./apps/gnome-photos {
+    gegl = gegl_0_4;
+  };
+
+  gnome-power-manager = callPackage ./apps/gnome-power-manager { };
+
+  gnome-sound-recorder = callPackage ./apps/gnome-sound-recorder { };
+
+  gnome-todo = callPackage ./apps/gnome-todo {};
+
+  gnome-weather = callPackage ./apps/gnome-weather { };
+
+  nautilus-sendto = callPackage ./apps/nautilus-sendto { };
+
+  polari = callPackage ./apps/polari { };
+
+  seahorse = callPackage ./apps/seahorse { };
+
+  vinagre = callPackage ./apps/vinagre { };
+
+#### Dev http://ftp.gnome.org/pub/GNOME/devtools/
+
+  anjuta = callPackage ./devtools/anjuta { };
+
+  devhelp = callPackage ./devtools/devhelp { };
+
+  gnome-devel-docs = callPackage ./devtools/gnome-devel-docs { };
+
+  nemiver = callPackage ./devtools/nemiver { };
+
+#### Games
+
+  aisleriot = callPackage ./games/aisleriot { };
+
+  atomix = callPackage ./games/atomix { };
+
+  five-or-more = callPackage ./games/five-or-more { };
+
+  four-in-a-row = callPackage ./games/four-in-a-row { };
+
+  gnome-chess = callPackage ./games/gnome-chess { };
+
+  gnome-klotski = callPackage ./games/gnome-klotski { };
+
+  gnome-mahjongg = callPackage ./games/gnome-mahjongg { };
+
+  gnome-mines = callPackage ./games/gnome-mines { };
+
+  gnome-nibbles = callPackage ./games/gnome-nibbles { };
+
+  gnome-robots = callPackage ./games/gnome-robots { };
+
+  gnome-sudoku = callPackage ./games/gnome-sudoku { };
+
+  gnome-taquin = callPackage ./games/gnome-taquin { };
+
+  gnome-tetravex = callPackage ./games/gnome-tetravex { };
+
+  hitori = callPackage ./games/hitori { };
+
+  iagno = callPackage ./games/iagno { };
+
+  lightsoff = callPackage ./games/lightsoff { };
+
+  swell-foop = callPackage ./games/swell-foop { };
+
+  tali = callPackage ./games/tali { };
+
+  quadrapassel = callPackage ./games/quadrapassel { };
+
+#### Misc -- other packages on http://ftp.gnome.org/pub/GNOME/sources/
+
+  geary = callPackage ./misc/geary { };
+
+  gitg = callPackage ./misc/gitg { };
+
+  libgnome-games-support = callPackage ./misc/libgnome-games-support { };
+
+  gnome-applets = callPackage ./misc/gnome-applets { };
+
+  gnome-flashback = callPackage ./misc/gnome-flashback { };
+
+  gnome-panel = callPackage ./misc/gnome-panel { };
+
+  gnome-screensaver = callPackage ./misc/gnome-screensaver { };
+
+  gnome-tweaks = callPackage ./misc/gnome-tweaks { };
+
+  gpaste = callPackage ./misc/gpaste { };
+
+  metacity = callPackage ./misc/metacity { };
+
+  nautilus-python = callPackage ./misc/nautilus-python { };
+
+  pidgin-im-gnome-shell-extension = callPackage ./misc/pidgin { };
+
+  gtkhtml = callPackage ./misc/gtkhtml { };
+
+  pomodoro = callPackage ./misc/pomodoro { };
+
+  gnome-autoar = callPackage ./misc/gnome-autoar { };
+
+  gnome-video-effects = callPackage ./misc/gnome-video-effects { };
+
+  gnome-packagekit = callPackage ./misc/gnome-packagekit { };
+} // lib.optionalAttrs (config.allowAliases or true) {
+#### Legacy aliases
+
+  bijiben = gnome-notes; # added 2018-09-26
+  evolution_data_server = evolution-data-server; # added 2018-02-25
+  geocode_glib = pkgs.geocode-glib; # added 2018-02-25
+  glib_networking = pkgs.glib-networking; # added 2018-02-25
+  gnome_common = gnome-common; # added 2018-02-25
+  gnome_control_center = gnome-control-center; # added 2018-02-25
+  gnome_desktop = gnome-desktop; # added 2018-02-25
+  gnome_keyring = gnome-keyring; # added 2018-02-25
+  gnome_online_accounts = gnome-online-accounts; # added 2018-02-25
+  gnome_session = gnome-session; # added 2018-02-25
+  gnome_settings_daemon = gnome-settings-daemon; # added 2018-02-25
+  gnome_shell = gnome-shell; # added 2018-02-25
+  gnome_terminal = gnome-terminal; # added 2018-02-25
+  gnome-themes-standard = gnome-themes-extra; # added 2018-03-14
+  gnome_themes_standard = gnome-themes-standard; # added 2018-02-25
+  gnome-tweak-tool = gnome-tweaks; # added 2018-03-21
+  gsettings_desktop_schemas = gsettings-desktop-schemas; # added 2018-02-25
+  libgames-support = libgnome-games-support; # added 2018-03-14
+  libgnome_keyring = libgnome-keyring; # added 2018-02-25
+  inherit (pkgs) rarian; # added 2018-04-25
+  networkmanager_fortisslvpn = networkmanager-fortisslvpn; # added 2018-02-25
+  networkmanager_iodine = networkmanager-iodine; # added 2018-02-25
+  networkmanager_l2tp = networkmanager-l2tp; # added 2018-02-25
+  networkmanager_openconnect = networkmanager-openconnect; # added 2018-02-25
+  networkmanager_openvpn = networkmanager-openvpn; # added 2018-02-25
+  networkmanager_vpnc = networkmanager-vpnc; # added 2018-02-25
+  yelp_xsl = yelp-xsl; # added 2018-02-25
+  yelp_tools = yelp-tools; # added 2018-02-25
+
+  # added 2019-02-08
+  inherit (pkgs) atk glib gobject-introspection gspell webkitgtk gtk3 gtkmm3
+      libgtop libgudev libhttpseverywhere librsvg libsecret gdk_pixbuf gtksourceview gtksourceviewmm gtksourceview4
+      easytag meld orca rhythmbox shotwell gnome-usage
+      clutter clutter-gst clutter-gtk cogl gtk-vnc libdazzle libgda libgit2-glib libgxps libgdata libgepub libcroco libpeas libgee geocode-glib libgweather librest libzapojit libmediaart gfbgraph gexiv2 folks totem-pl-parser gcr gsound libgnomekbd vte vte_290 vte-ng gnome-menus gdl;
+  inherit (pkgs) gsettings-desktop-schemas; # added 2019-04-16
+  defaultIconTheme = adwaita-icon-theme;
+  gtk = gtk3;
+  gtkmm = gtkmm3;
+  rest = librest;
+})
diff --git a/nixpkgs/pkgs/desktops/gnome-3/devtools/anjuta/default.nix b/nixpkgs/pkgs/desktops/gnome-3/devtools/anjuta/default.nix
new file mode 100644
index 000000000000..d1e5179063f3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/devtools/anjuta/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, flex, bison, libxml2, intltool,
+  gdl, libgda, gtksourceview, gsettings-desktop-schemas,
+  itstool, python3, ncurses, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  name = "anjuta-${version}";
+  version = "3.28.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/anjuta/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0ya7ajai9rx9g597sr5wawr6l5pb2s34bbjdsbnx0lkrhnjv11xh";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "anjuta"; attrPath = "gnome3.anjuta"; };
+  };
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [
+    pkgconfig intltool itstool python3 makeWrapper
+    # Required by python3
+    ncurses
+  ];
+  buildInputs = [
+    flex bison gtk3 libxml2 gnome3.gjs gdl
+    libgda gtksourceview
+    gsettings-desktop-schemas
+  ];
+
+  preFixup = ''
+    wrapProgram $out/bin/anjuta \
+      --prefix XDG_DATA_DIRS : \
+        "$GSETTINGS_SCHEMAS_PATH"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Software development studio";
+    homepage = http://anjuta.org/;
+    license = licenses.gpl2;
+    maintainers = with maintainers; [];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/devtools/devhelp/default.nix b/nixpkgs/pkgs/desktops/gnome-3/devtools/devhelp/default.nix
new file mode 100644
index 000000000000..80a3770b7030
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/devtools/devhelp/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, glib, amtk, appstream-glib, gobject-introspection, python3
+, webkitgtk, gettext, itstool, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "devhelp-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/devhelp/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "06sa83zggk29wcg75fl3gqh0rmi7cd3gsbk09a2z23r7vpy7xanq";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext itstool wrapGAppsHook appstream-glib gobject-introspection python3 ];
+  buildInputs = [
+    glib gtk3 webkitgtk amtk
+    gnome3.adwaita-icon-theme gsettings-desktop-schemas
+  ];
+
+  doCheck = true;
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "devhelp";
+      attrPath = "gnome3.devhelp";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "API documentation browser for GNOME";
+    homepage = https://wiki.gnome.org/Apps/Devhelp;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix b/nixpkgs/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix
new file mode 100644
index 000000000000..647e7163d0b9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/devtools/gnome-devel-docs/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, gnome3, intltool, itstool, libxml2 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-devel-docs-${version}";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-devel-docs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0xqpgf975rws60qxilq635pblbpgwspyykgzxnb4awd9zrs5lbx0";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-devel-docs"; attrPath = "gnome3.gnome-devel-docs"; };
+  };
+
+  buildInputs = [ intltool itstool libxml2 ];
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/GNOME/gnome-devel-docs;
+    description = "Developer documentation for GNOME";
+    maintainers = gnome3.maintainers;
+    license = licenses.fdl12;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/bool_slot.patch b/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/bool_slot.patch
new file mode 100644
index 000000000000..83423122110c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/bool_slot.patch
@@ -0,0 +1,13 @@
+--- a/src/dbgengine/nmv-dbg-common.h	2014-07-09 10:36:05.000000000 +0200
++++ b/src/dbgengine/nmv-dbg-common.h	2016-08-04 22:40:28.447842746 +0200
+@@ -171,7 +171,9 @@
+ 
+     bool has_slot () const
+     {
+-        return m_slot;
++        //return m_slot;
++        // https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=822502
++        return static_cast<bool> (m_slot);
+     }
+ 
+     template<class T>
diff --git a/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/default.nix b/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/default.nix
new file mode 100644
index 000000000000..9fbce7c6cc02
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, gnome3, gtk3, libxml2, intltool, itstool, gdb,
+  boost, sqlite, libgtop, glibmm, gtkmm3, vte, gtksourceview, gsettings-desktop-schemas,
+  gtksourceviewmm, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "nemiver-${version}";
+  version = "0.9.6";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/nemiver/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "85ab8cf6c4f83262f441cb0952a6147d075c3c53d0687389a3555e946b694ef2";
+  };
+
+  nativeBuildInputs = [ libxml2 intltool itstool pkgconfig wrapGAppsHook ];
+
+  buildInputs = [
+    gtk3 gdb boost sqlite libgtop
+    glibmm gtkmm3 vte gtksourceview gtksourceviewmm
+    gsettings-desktop-schemas
+  ];
+
+  patches = [
+    ./bool_slot.patch
+    ./safe_ptr.patch
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/nemiver/commit/262cf9657f9c2727a816972b348692adcc666008.patch;
+      sha256 = "03jv6z54b8nzvplplapk4aj206zl1gvnv6iz0mad19g6yvfbw7a7";
+    })
+  ];
+
+  configureFlags = [
+    "--enable-gsettings"
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "nemiver";
+      attrPath = "gnome3.nemiver";
+      versionPolicy = "none";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Nemiver;
+    description = "Easy to use standalone C/C++ debugger";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.juliendehos ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/safe_ptr.patch b/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/safe_ptr.patch
new file mode 100644
index 000000000000..e3413b224977
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/devtools/nemiver/safe_ptr.patch
@@ -0,0 +1,10 @@
+--- a/src/confmgr/nmv-gconf-mgr.cc	2014-07-08 10:24:06.000000000 +0200
++++ b/src/confmgr/nmv-gconf-mgr.cc	2016-08-04 23:50:08.143060464 +0200
+@@ -32,6 +32,7 @@
+ NEMIVER_BEGIN_NAMESPACE (nemiver)
+ 
+ using nemiver::common::GCharSafePtr;
++using nemiver::common::GErrorSafePtr;
+ 
+ class GConfMgr : public IConfMgr {
+     GConfMgr (const GConfMgr &);
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/appindicator/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/appindicator/default.nix
new file mode 100644
index 000000000000..d8180096d2f0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/appindicator/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchFromGitHub, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-appindicator-${version}";
+  version = "28";
+
+  src = fetchFromGitHub {
+    owner = "Ubuntu";
+    repo = "gnome-shell-extension-appindicator";
+    rev = "v${version}";
+    sha256 = "03sgb2xkb4lzp8pbb7g56q29y1r764qzpc0j4d4m1gi0sb39sxrl";
+  };
+
+  # This package has a Makefile, but it's used for building a zip for
+  # publication to extensions.gnome.org. Disable the build phase so
+  # installing doesn't build an unnecessary release.
+  dontBuild = true;
+
+  uuid = "appindicatorsupport@rgcjonas.gmail.com";
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp *.js $out/share/gnome-shell/extensions/${uuid}
+    cp -r interfaces-xml $out/share/gnome-shell/extensions/${uuid}
+    cp metadata.json $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  meta = with stdenv.lib; {
+    description = "AppIndicator/KStatusNotifierItem support for GNOME Shell";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ jonafato ];
+    platforms = gnome3.gnome-shell.meta.platforms;
+    homepage = https://github.com/Ubuntu/gnome-shell-extension-appindicator;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/battery-status/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/battery-status/default.nix
new file mode 100644
index 000000000000..afedd5f98e1a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/battery-status/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-battery-status-${version}";
+  version = "6";
+
+  src = fetchFromGitHub {
+    owner = "milliburn";
+    repo = "gnome-shell-extension-battery_status";
+    rev = "v${version}";
+    sha256 = "1w83h863mzffjnmk322xq90qf3y9dzay1w9yw5r0qnbsq1ljl8p4";
+  };
+
+  uuid = "battery_status@milliburn.github.com";
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r ${uuid} $out/share/gnome-shell/extensions/
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Configurable lightweight battery charge indicator and autohider";
+    license = licenses.gpl2;
+    broken = true; # not compatable with latest GNOME
+    maintainers = with maintainers; [ jonafato ];
+    homepage = https://github.com/milliburn/gnome-shell-extension-battery_status;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/caffeine/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/caffeine/default.nix
new file mode 100644
index 000000000000..e627bec8b931
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/caffeine/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, glib, gettext, bash }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-caffeine-${version}";
+  version = "unstable-2019-04-02";
+
+  src = fetchFromGitHub {
+    owner = "eonpatapon";
+    repo = "gnome-shell-extension-caffeine";
+    rev = "a6b37dee108cddf50a0f0a19f0101854a75bf173";
+    sha256 = "1j3q12j36v97551sjb0c8qc8zr7a7gmxibygczryfdfmwjzp6icl";
+  };
+
+  uuid = "caffeine@patapon.info";
+
+  nativeBuildInputs = [
+    glib gettext
+  ];
+
+  buildPhase = ''
+    ${bash}/bin/bash ./update-locale.sh
+    glib-compile-schemas --strict --targetdir=caffeine@patapon.info/schemas/ caffeine@patapon.info/schemas
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r ${uuid} $out/share/gnome-shell/extensions
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Fill the cup to inhibit auto suspend and screensaver";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ eperuffo ];
+    homepage = https://github.com/eonpatapon/gnome-shell-extension-caffeine;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/chrome-gnome-shell/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/chrome-gnome-shell/default.nix
new file mode 100644
index 000000000000..755c8e1b02fb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/chrome-gnome-shell/default.nix
@@ -0,0 +1,43 @@
+{stdenv, fetchurl, cmake, ninja, jq, python3, gnome3, wrapGAppsHook}:
+
+let
+  version = "10.1";
+
+  inherit (python3.pkgs) python pygobject3 requests;
+in stdenv.mkDerivation rec {
+  name = "chrome-gnome-shell-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/chrome-gnome-shell/${version}/${name}.tar.xz";
+    sha256 = "0f54xyamm383ypbh0ndkza0pif6ljddg2f947p265fkqj3p4zban";
+  };
+
+  nativeBuildInputs = [ cmake ninja jq wrapGAppsHook ];
+  buildInputs = [ gnome3.gnome-shell python pygobject3 requests ];
+
+  preConfigure = ''
+    substituteInPlace CMakeLists.txt --replace "/etc" "$out/etc"
+  '';
+  # cmake setup hook changes /etc/opt into /var/empty
+  dontFixCmake = true;
+
+  cmakeFlags = [ "-DBUILD_EXTENSION=OFF" ];
+  wrapPrefixVariables = [ "PYTHONPATH" ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "chrome-gnome-shell";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "GNOME Shell integration for Chrome";
+    homepage = https://wiki.gnome.org/Projects/GnomeShellIntegrationForChrome;
+    longDescription = ''
+      To use the integration, install the <link xlink:href="https://wiki.gnome.org/Projects/GnomeShellIntegrationForChrome/Installation">browser extension</link>, and then set <option>services.gnome3.chrome-gnome-shell.enable</option> to <literal>true</literal>. For Firefox based browsers, you will also need to build the wrappers with <option>nixpkgs.config.firefox.enableGnomeExtensions</option> set to <literal>true</literal>.
+    '';
+    license = licenses.gpl3;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/clipboard-indicator/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/clipboard-indicator/default.nix
new file mode 100644
index 000000000000..e41227e85139
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/clipboard-indicator/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-clipboard-indicator-${version}";
+  version = "30";
+
+  src = fetchFromGitHub {
+    owner = "Tudmotu";
+    repo = "gnome-shell-extension-clipboard-indicator";
+    rev = "v${version}";
+    sha256 = "1fmgmxv2y678bj0kmymkgnnglcpqk8ww053izlq46xg7s27jjdf6";
+  };
+
+  uuid = "clipboard-indicator@tudmotu.com";
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp -r * $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Adds a clipboard indicator to the top panel and saves clipboard history";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonafato ];
+    platforms = platforms.linux;
+    homepage = https://github.com/Tudmotu/gnome-shell-extension-clipboard-indicator;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-dock/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-dock/default.nix
new file mode 100644
index 000000000000..06e7d27c5444
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-dock/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, glib, gettext }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-dash-to-dock-${version}";
+  version = "66";
+
+  src = fetchFromGitHub {
+    owner = "micheleg";
+    repo = "dash-to-dock";
+    rev = "extensions.gnome.org-v" + version;
+    sha256 = "04krl6rxlp1qc97psraf2kwin7h0mx4c7pnfpi7vhplmvasrwkfh";
+  };
+
+  nativeBuildInputs = [
+    glib gettext
+  ];
+
+  makeFlags = [ "INSTALLBASE=$(out)/share/gnome-shell/extensions" ];
+
+  meta = with stdenv.lib; {
+    description = "A dock for the Gnome Shell";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ eperuffo ];
+    homepage = https://micheleg.github.io/dash-to-dock/;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-panel/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-panel/default.nix
new file mode 100644
index 000000000000..0d48b8359c91
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/dash-to-panel/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, glib, gettext }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-dash-to-panel-${version}";
+  version = "19";
+
+  src = fetchFromGitHub {
+    owner = "home-sweet-gnome";
+    repo = "dash-to-panel";
+    rev = "v${version}";
+    sha256 = "0r26ph6zq87kvglydv00rf24mshz7l4r38zf9niyp3mxyzz6rwys";
+  };
+
+  buildInputs = [
+    glib gettext
+  ];
+
+  makeFlags = [ "INSTALLBASE=$(out)/share/gnome-shell/extensions" ];
+
+  meta = with stdenv.lib; {
+    description = "An icon taskbar for Gnome Shell";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ mounium ];
+    homepage = https://github.com/jderose9/dash-to-panel;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix
new file mode 100644
index 000000000000..dd2a02b6be85
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix
@@ -0,0 +1,91 @@
+{ stdenv, fetchFromGitHub, substituteAll, python3, openssl, folks, gsound
+, meson, ninja, libxml2, pkgconfig, gobject-introspection, wrapGAppsHook
+, glib, gtk3, at-spi2-core, upower, openssh, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-gsconnect-${version}";
+  version = "23";
+
+  src = fetchFromGitHub {
+    owner = "andyholmes";
+    repo = "gnome-shell-extension-gsconnect";
+    rev = "v${version}";
+    sha256 = "011asrhkly9zhvnng2mh9v06yw39fx244pmqz5yk9rd9m4c32xid";
+  };
+
+  patches = [
+    # Make typelibs available in the extension
+    (substituteAll {
+      src = ./fix-paths.patch;
+      gapplication = "${glib.bin}/bin/gapplication";
+      mutter_gsettings_path = "${gnome3.mutter}/share/gsettings-schemas/${gnome3.mutter.name}/glib-2.0/schemas";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig
+    gobject-introspection # for locating typelibs
+    wrapGAppsHook # for wrapping daemons
+    libxml2 # xmllint
+  ];
+
+  buildInputs = [
+    (python3.withPackages (pkgs: [ python3.pkgs.pygobject3 ])) # for folks.py
+    glib # libgobject
+    gtk3
+    at-spi2-core # atspi
+    folks # libfolks
+    gnome3.nautilus # TODO: this contaminates the package with nautilus and gnome-autoar typelibs but it is only needed for the extension
+    gnome3.nautilus-python
+    gsound
+    upower
+    gnome3.caribou
+    gnome3.gjs # for running daemon
+    gnome3.evolution-data-server # folks.py requires org.gnome.Evolution.DefaultSources gsettings; TODO: hardcode the schema path to the library (similarly to https://github.com/NixOS/nixpkgs/issues/47226)
+  ];
+
+  mesonFlags = [
+    "-Dgnome_shell_libdir=${gnome3.gnome-shell}/lib"
+    "-Dgsettings_schemadir=${placeholder "out"}/share/gsettings-schemas/${name}/glib-2.0/schemas"
+    "-Dchrome_nmhdir=${placeholder "out"}/etc/opt/chrome/native-messaging-hosts"
+    "-Dchromium_nmhdir=${placeholder "out"}/etc/chromium/native-messaging-hosts"
+    "-Dopenssl_path=${openssl}/bin/openssl"
+    "-Dsshadd_path=${openssh}/bin/ssh-add"
+    "-Dsshkeygen_path=${openssh}/bin/ssh-keygen"
+    "-Dpost_install=true"
+  ];
+
+  postPatch = ''
+    patchShebangs meson/nmh.sh
+    patchShebangs meson/post-install.sh
+
+    # TODO: do not include every typelib everywhere
+    # for example, we definitely do not need nautilus
+    for file in src/extension.js src/prefs.js; do
+      substituteInPlace "$file" \
+        --subst-var-by typelibPath "$GI_TYPELIB_PATH"
+    done
+  '';
+
+  preFixup = ''
+    # TODO: figure out why folks GIR does not contain shared-library attribute
+    # https://github.com/NixOS/nixpkgs/issues/47226
+    gappsWrapperArgs+=(--prefix LD_LIBRARY_PATH : "${stdenv.lib.makeLibraryPath [ folks ]}")
+  '';
+
+  postFixup = ''
+    # Let’s wrap the daemons
+    for file in $out/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/{{daemon,nativeMessagingHost}.js,components/folks.py}; do
+      echo "Wrapping program ''${file}"
+      wrapProgram "''${file}" "''${gappsWrapperArgs[@]}"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "KDE Connect implementation for Gnome Shell";
+    homepage = https://github.com/andyholmes/gnome-shell-extension-gsconnect/wiki;
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ etu ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/fix-paths.patch
new file mode 100644
index 000000000000..b32d0af32721
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/fix-paths.patch
@@ -0,0 +1,44 @@
+--- a/data/org.gnome.Shell.Extensions.GSConnect.desktop
++++ b/data/org.gnome.Shell.Extensions.GSConnect.desktop
+@@ -1,7 +1,7 @@
+ [Desktop Entry]
+ Type=Application
+ Name=GSConnect
+-Exec=gapplication launch org.gnome.Shell.Extensions.GSConnect %U
++Exec=@gapplication@ launch org.gnome.Shell.Extensions.GSConnect %U
+ Terminal=false
+ NoDisplay=true
+ Icon=org.gnome.Shell.Extensions.GSConnect
+--- a/src/extension.js
++++ b/src/extension.js
+@@ -1,5 +1,7 @@
+ 'use strict';
+ 
++'@typelibPath@'.split(':').forEach(path => imports.gi.GIRepository.Repository.prepend_search_path(path));
++
+ const Gio = imports.gi.Gio;
+ const GLib = imports.gi.GLib;
+ const Gtk = imports.gi.Gtk;
+--- a/src/prefs.js
++++ b/src/prefs.js
+@@ -1,5 +1,7 @@
+ 'use strict';
+ 
++'@typelibPath@'.split(':').forEach(path => imports.gi.GIRepository.Repository.prepend_search_path(path));
++
+ const Gio = imports.gi.Gio;
+ const GLib = imports.gi.GLib;
+ const Gtk = imports.gi.Gtk;
+--- a/src/service/__init__.js
++++ b/src/service/__init__.js
+@@ -600,7 +600,9 @@
+ /**
+  * Convenience functions for saving/restoring window geometry
+  */
+-const _mutter = new Gio.Settings({schema_id: 'org.gnome.mutter'});
++const _schema_source = Gio.SettingsSchemaSource.new_from_directory('@mutter_gsettings_path@', Gio.SettingsSchemaSource.get_default(), true);
++const _schema = _schema_source.lookup('org.gnome.mutter', false);
++const _mutter = new Gio.Settings({settings_schema: _schema});
+ 
+ Gtk.Window.prototype.restore_geometry = function() {
+     let [width, height] = this.settings.get_value('window-size').deep_unpack();
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/icon-hider/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/icon-hider/default.nix
new file mode 100644
index 000000000000..d08e6f3a57df
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/icon-hider/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-icon-hider-${version}";
+  version = "23";
+
+  src = fetchFromGitHub {
+    owner = "ikalnytskyi";
+    repo = "gnome-shell-extension-icon-hider";
+    rev = "v${version}";
+    sha256 = "18c8zkdrmdbghqqz7b450vhgpykgz25mgigwn2nggcb2lxmvm9ks";
+  };
+
+  uuid = "icon-hider@kalnitsky.org";
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r ${uuid} $out/share/gnome-shell/extensions
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Icon Hider is a GNOME Shell extension for managing status area items";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonafato ];
+    platforms = gnome3.gnome-shell.meta.platforms;
+    homepage = https://github.com/ikalnytskyi/gnome-shell-extension-icon-hider;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/impatience.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/impatience.nix
new file mode 100644
index 000000000000..24b4c1cf703f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/impatience.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchFromGitHub, glib }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-impatience-${version}";
+  version = "0.4.5";
+
+  src = fetchFromGitHub {
+    owner = "timbertson";
+    repo = "gnome-shell-impatience";
+    rev = "version-${version}";
+    sha256 = "0kvdhlz41fjyqdgcfw6mrr9nali6wg2qwji3dvykzfi0aypljzpx";
+  };
+
+  buildInputs = [
+    glib
+  ];
+
+  buildPhase = ''
+    make schemas
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r impatience $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  uuid = "impatience@gfxmonk.net";
+
+  meta = with stdenv.lib; {
+    description = "Speed up builtin gnome-shell animations";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ aneeshusa timbertson tiramiseb ];
+    homepage = http://gfxmonk.net/dist/0install/gnome-shell-impatience.xml;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/mediaplayer/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/mediaplayer/default.nix
new file mode 100644
index 000000000000..686d7be91a47
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/mediaplayer/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchFromGitHub, glib, meson, gettext, ninja, python3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extensions-mediaplayer-${version}";
+  version = "unstable-2019-03-21";
+
+  src = fetchFromGitHub {
+    owner = "JasonLG1979";
+    repo = "gnome-shell-extensions-mediaplayer";
+    rev = "b382c98481fa421501684e2ff3eafc53971ef22b";
+    sha256 = "01z2dml8dvl5sljw62g7x19mz02dz1g4gkmyp0h5bx49djcw1nnh";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    python3
+  ];
+  buildInputs = [
+    glib
+    gettext
+  ];
+
+  postPatch = ''
+    rm build
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Control MPRIS Version 2 Capable Media Players";
+    license = licenses.gpl2Plus;
+    homepage = https://github.com/JasonLG1979/gnome-shell-extensions-mediaplayer/;
+    maintainers = with maintainers; [ tiramiseb ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/default.nix
new file mode 100644
index 000000000000..8c075a11bdcd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, substituteAll, glib, gettext, xorg }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-no-title-bar-${version}";
+  version = "9";
+
+  src = fetchFromGitHub {
+    owner = "franglais125";
+    repo = "no-title-bar";
+    rev = "v${version}";
+    sha256 = "02zm61fg40r005fn2rvgrbsz2hbcsmp2hkhyilqbmpilw35y0nbq";
+  };
+
+  nativeBuildInputs = [
+    glib gettext
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      xprop = "${xorg.xprop}/bin/xprop";
+      xwininfo = "${xorg.xwininfo}/bin/xwininfo";
+    })
+  ];
+
+  makeFlags = [ "INSTALLBASE=$(out)/share/gnome-shell/extensions" ];
+
+  meta = with stdenv.lib; {
+    description = "Integrates maximized windows with the top panel";
+    homepage = https://github.com/franglais125/no-title-bar;
+    license = licenses.gpl2;
+    broken = true; # https://github.com/franglais125/no-title-bar/issues/114
+    maintainers = with maintainers; [ jonafato svsdep ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/fix-paths.patch
new file mode 100644
index 000000000000..9a53d63860da
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/fix-paths.patch
@@ -0,0 +1,56 @@
+--- a/decoration.js
++++ b/decoration.js
+@@ -181,7 +181,7 @@
+         let act = win.get_compositor_private();
+         let xwindow = act && act['x-window'];
+         if (xwindow) {
+-            let xwininfo = GLib.spawn_command_line_sync('xwininfo -children -id 0x%x'.format(xwindow));
++            let xwininfo = GLib.spawn_command_line_sync('@xwininfo@ -children -id 0x%x'.format(xwindow));
+             if (xwininfo[0]) {
+                 let str = xwininfo[1].toString();
+ 
+@@ -207,7 +207,7 @@
+         // Try enumerating all available windows and match the title. Note that this
+         // may be necessary if the title contains special characters and `x-window`
+         // is not available.
+-        let result = GLib.spawn_command_line_sync('xprop -root _NET_CLIENT_LIST');
++        let result = GLib.spawn_command_line_sync('@xprop@ -root _NET_CLIENT_LIST');
+         if (result[0]) {
+             let str = result[1].toString();
+ 
+@@ -218,7 +218,7 @@
+ 
+             // For each window ID, check if the title matches the desired title.
+             for (var i = 0; i < windowList.length; ++i) {
+-                let cmd = 'xprop -id "' + windowList[i] + '" _NET_WM_NAME _NO_TITLE_BAR_ORIGINAL_STATE';
++                let cmd = '@xprop@ -id "' + windowList[i] + '" _NET_WM_NAME _NO_TITLE_BAR_ORIGINAL_STATE';
+                 let result = GLib.spawn_command_line_sync(cmd);
+ 
+                 if (result[0]) {
+@@ -258,7 +258,7 @@
+         }
+ 
+         let id = this._guessWindowXID(win);
+-        let cmd = 'xprop -id ' + id;
++        let cmd = '@xprop@ -id ' + id;
+ 
+         let xprops = GLib.spawn_command_line_sync(cmd);
+         if (!xprops[0]) {
+@@ -277,7 +277,7 @@
+         m = str.match(/^_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED(\(CARDINAL\))? = ([0-9]+)$/m);
+         if (m) {
+             let state = !!parseInt(m[2]);
+-            cmd = ['xprop', '-id', id,
++            cmd = ['@xprop@', '-id', id,
+                   '-f', '_NO_TITLE_BAR_ORIGINAL_STATE', '32c',
+                   '-set', '_NO_TITLE_BAR_ORIGINAL_STATE',
+                   (state ? '0x1' : '0x0')];
+@@ -358,7 +358,7 @@
+         let winXID = this._guessWindowXID(win);
+         if (winXID == null)
+             return;
+-        let cmd = ['xprop', '-id', winXID,
++        let cmd = ['@xprop@', '-id', winXID,
+                    '-f', '_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED', '32c',
+                    '-set', '_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED',
+                    (hide ? '0x1' : '0x0')];
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/nohotcorner/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/nohotcorner/default.nix
new file mode 100644
index 000000000000..21ff70140be1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/nohotcorner/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-nohotcorner-${version}";
+  version = "19.0";
+
+  src = fetchFromGitHub {
+    owner = "HROMANO";
+    repo = "nohotcorner";
+    rev = "v${version}";
+    sha256 = "059n4gyz7d686hknaifyjax8gygrda1xab5m15a09p98jdrdfdhi";
+  };
+
+  # Taken from the extension download link at
+  # https://extensions.gnome.org/extension/118/no-topleft-hot-corner/
+  uuid = "nohotcorner@azuri.free.fr";
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp extension.js $out/share/gnome-shell/extensions/${uuid}
+    cp metadata.json $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Disables the top left hot corner";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ jonafato ];
+    homepage = https://github.com/HROMANO/nohotcorner;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/remove-dropdown-arrows/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/remove-dropdown-arrows/default.nix
new file mode 100644
index 000000000000..5faa55652d8a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/remove-dropdown-arrows/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-remove-dropdown-arrows-${version}";
+  version = "11";
+
+  src = fetchFromGitHub {
+    owner = "mpdeimos";
+    repo = "gnome-shell-remove-dropdown-arrows";
+    rev = "version/${version}";
+    sha256 = "1g99r9bpjdhab3xj74wkl40gdnaf2w51kswcr8mi6bq72n4wjxwh";
+  };
+
+  # This package has a Makefile, but it's used for publishing and linting, not
+  # for building. Disable the build phase so installing doesn't attempt to
+  # publish the extension.
+  dontBuild = true;
+
+  uuid = "remove-dropdown-arrows@mpdeimos.com";
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp extension.js $out/share/gnome-shell/extensions/${uuid}
+    cp metadata.json $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Remove dropdown arrows from GNOME Shell Menus";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ jonafato ];
+    homepage = https://github.com/mpdeimos/gnome-shell-remove-dropdown-arrows;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/sound-output-device-chooser/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/sound-output-device-chooser/default.nix
new file mode 100644
index 000000000000..33c127f449b8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/sound-output-device-chooser/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-shell-extension-sound-output-device-chooser";
+  version = "unstable-2019-04-01";
+
+  src = fetchFromGitHub {
+    owner = "kgshank";
+    repo = "gse-sound-output-device-chooser";
+    rev = "37098909a50bafe2f2538819f988cb2327ed7c60";
+    sha256 = "09sbby8zi9xn21lbdry57bp1vwgd5c73anvqpw9css3x2ryda5li";
+  };
+
+  dontBuild = true;
+
+  uuid = "sound-output-device-chooser@kgshank.net";
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r ${uuid} $out/share/gnome-shell/extensions
+  '';
+
+  meta = with stdenv.lib; {
+    description = "GNOME Shell extension adding audio device chooser to panel";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ jtojnar ];
+    homepage = https://github.com/kgshank/gse-sound-output-device-chooser;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/default.nix
new file mode 100644
index 000000000000..7046e6737269
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, substituteAll, fetchFromGitHub, glib, glib-networking, libgtop }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-system-monitor-${version}";
+  version = "36";
+
+  src = fetchFromGitHub {
+    owner = "paradoxxxzero";
+    repo = "gnome-shell-system-monitor-applet";
+    rev = "v${version}";
+    sha256 = "0x3r189h5264kjxsm18d34gzb5ih8l4pz7i9qks9slcnzaiw4y0z";
+  };
+
+  buildInputs = [
+    glib
+    glib-networking
+    libgtop
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./paths_and_nonexisting_dirs.patch;
+      gtop_path = "${libgtop}/lib/girepository-1.0";
+      glib_net_path = "${glib-networking}/lib/girepository-1.0";
+    })
+  ];
+
+  buildPhase = ''
+    glib-compile-schemas --targetdir=${uuid}/schemas ${uuid}/schemas
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r ${uuid} $out/share/gnome-shell/extensions
+  '';
+
+  uuid = "system-monitor@paradoxxx.zero.gmail.com";
+
+  meta = with stdenv.lib; {
+    description = "Display system informations in gnome shell status bar";
+    license = licenses.gpl3Plus;
+    broken = true; # GNOME 3.32 support WIP: https://github.com/paradoxxxzero/gnome-shell-system-monitor-applet/pull/510
+    maintainers = with maintainers; [ aneeshusa tiramiseb ];
+    homepage = https://github.com/paradoxxxzero/gnome-shell-system-monitor-applet;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/paths_and_nonexisting_dirs.patch b/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/paths_and_nonexisting_dirs.patch
new file mode 100644
index 000000000000..82e3d7c541ba
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/paths_and_nonexisting_dirs.patch
@@ -0,0 +1,23 @@
+diff --git a/system-monitor@paradoxxx.zero.gmail.com/extension.js b/system-monitor@paradoxxx.zero.gmail.com/extension.js
+index b4b7f15..d139135 100644
+--- a/system-monitor@paradoxxx.zero.gmail.com/extension.js
++++ b/system-monitor@paradoxxx.zero.gmail.com/extension.js
+@@ -18,6 +18,9 @@
+ 
+ // Author: Florian Mounier aka paradoxxxzero
+ 
++imports.gi.GIRepository.Repository.prepend_search_path('@gtop_path@');
++imports.gi.GIRepository.Repository.prepend_search_path('@glib_net_path@');
++
+ /* Ugly. This is here so that we don't crash old libnm-glib based shells unnecessarily
+  * by loading the new libnm.so. Should go away eventually */
+ const libnm_glib = imports.gi.GIRepository.Repository.get_default().is_registered("NMClient", "1.0");
+@@ -386,7 +389,7 @@ const smMountsMonitor = new Lang.Class({
+     connected: false,
+     _init: function () {
+         this._volumeMonitor = Gio.VolumeMonitor.get();
+-        let sys_mounts = ['/home', '/tmp', '/boot', '/usr', '/usr/local'];
++        let sys_mounts = ['/home', '/tmp', '/boot'];
+         this.base_mounts = ['/'];
+         sys_mounts.forEach(Lang.bind(this, function (sMount) {
+             if (this.is_sys_mount(sMount + '/')) {
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/default.nix
new file mode 100644
index 000000000000..c72d72cce126
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, substituteAll, fetchFromGitHub, taskwarrior, gettext, runtimeShell }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-taskwhisperer-${version}";
+  version = "12";
+
+  src = fetchFromGitHub {
+    owner = "cinatic";
+    repo = "taskwhisperer";
+    rev = "v${version}";
+    sha256 = "187p6p498dd258avsfqqsm322g58y75pc2wbhb4jpmm9insqm1bj";
+  };
+
+  nativeBuildInputs = [
+    gettext
+  ];
+
+  buildInputs = [
+    taskwarrior
+  ];
+
+  uuid = "taskwhisperer-extension@infinicode.de";
+
+  makeFlags = [
+    "INSTALLBASE=${placeholder ''out''}/share/gnome-shell/extensions"
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      task = "${taskwarrior}/bin/task";
+      shell = "${runtimeShell}";
+    })
+  ];
+
+  meta = with stdenv.lib; {
+    description = "GNOME Shell TaskWarrior GUI";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jonafato ];
+    homepage = https://github.com/cinatic/taskwhisperer;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/fix-paths.patch
new file mode 100644
index 000000000000..2ea54f4b0897
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/fix-paths.patch
@@ -0,0 +1,99 @@
+diff --git a/taskwhisperer-extension@infinicode.de/extra/create.sh b/taskwhisperer-extension@infinicode.de/extra/create.sh
+index a69e369..35d5ea1 100755
+--- a/taskwhisperer-extension@infinicode.de/extra/create.sh
++++ b/taskwhisperer-extension@infinicode.de/extra/create.sh
+@@ -1 +1 @@
+-bash -c "task add $1"
++bash -c "@task@ add $1"
+diff --git a/taskwhisperer-extension@infinicode.de/extra/modify.sh b/taskwhisperer-extension@infinicode.de/extra/modify.sh
+index 7964a26..8edd21b 100755
+--- a/taskwhisperer-extension@infinicode.de/extra/modify.sh
++++ b/taskwhisperer-extension@infinicode.de/extra/modify.sh
+@@ -1 +1 @@
+-bash -c "task $1 modify $2"
++bash -c "@task@ $1 modify $2"
+diff --git a/taskwhisperer-extension@infinicode.de/taskService.js b/taskwhisperer-extension@infinicode.de/taskService.js
+index ead7a12..aa36db4 100644
+--- a/taskwhisperer-extension@infinicode.de/taskService.js
++++ b/taskwhisperer-extension@infinicode.de/taskService.js
+@@ -182,7 +182,7 @@ const TaskService = class TaskService {
+ 
+         let project = projectName ? "project:" + projectName : "";
+ 
+-        let command = ['task', 'rc.json.array=on', status, project, 'export'];
++        let command = ['@task@', 'rc.json.array=on', status, project, 'export'];
+         let reader = new SpawnReader.SpawnReader();
+ 
+         let buffer = "";
+@@ -220,7 +220,7 @@ const TaskService = class TaskService {
+                 break;
+         }
+ 
+-        let shellProc = Gio.Subprocess.new(['task', status, 'projects'], Gio.SubprocessFlags.STDOUT_PIPE);
++        let shellProc = Gio.Subprocess.new(['@task@', status, 'projects'], Gio.SubprocessFlags.STDOUT_PIPE);
+ 
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+@@ -261,7 +261,7 @@ const TaskService = class TaskService {
+             return;
+         }
+ 
+-        let shellProc = Gio.Subprocess.new(['task', taskID.toString(), 'done'], Gio.SubprocessFlags.STDOUT_PIPE);
++        let shellProc = Gio.Subprocess.new(['@task@', taskID.toString(), 'done'], Gio.SubprocessFlags.STDOUT_PIPE);
+ 
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+@@ -290,7 +290,7 @@ const TaskService = class TaskService {
+             return;
+         }
+ 
+-        let shellProc = Gio.Subprocess.new(['task', 'modify', taskID.toString(), 'status:pending'], Gio.SubprocessFlags.STDOUT_PIPE);
++        let shellProc = Gio.Subprocess.new(['@task@', 'modify', taskID.toString(), 'status:pending'], Gio.SubprocessFlags.STDOUT_PIPE);
+ 
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+@@ -318,7 +318,7 @@ const TaskService = class TaskService {
+         if (!taskID) {
+             return;
+         }
+-        let shellProc = Gio.Subprocess.new(['task', taskID.toString(), 'start'], Gio.SubprocessFlags.STDOUT_PIPE);
++        let shellProc = Gio.Subprocess.new(['@task@', taskID.toString(), 'start'], Gio.SubprocessFlags.STDOUT_PIPE);
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+             shellProc.wait_finish(result);
+@@ -344,7 +344,7 @@ const TaskService = class TaskService {
+         if (!taskID) {
+             return;
+         }
+-        let shellProc = Gio.Subprocess.new(['task', taskID.toString(), 'stop'], Gio.SubprocessFlags.STDOUT_PIPE);
++        let shellProc = Gio.Subprocess.new(['@task@', taskID.toString(), 'stop'], Gio.SubprocessFlags.STDOUT_PIPE);
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+             shellProc.wait_finish(result);
+@@ -374,7 +374,7 @@ const TaskService = class TaskService {
+         // FIXME: Gio.Subprocess: due to only passing string vector is allowed, it's not possible to directly pass the
+         //        input of the user to subprocess (why & how, if you can answer then please send msg to fh@infinicode.de)
+         //        bypassing problem with own shell script
+-        let shellProc = Gio.Subprocess.new(['/bin/sh', EXTENSIONDIR + '/extra/modify.sh', taskID.toString(), params], Gio.SubprocessFlags.STDOUT_PIPE + Gio.SubprocessFlags.STDERR_MERGE);
++        let shellProc = Gio.Subprocess.new(['@shell@', EXTENSIONDIR + '/extra/modify.sh', taskID.toString(), params], Gio.SubprocessFlags.STDOUT_PIPE + Gio.SubprocessFlags.STDERR_MERGE);
+ 
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+@@ -403,7 +403,7 @@ const TaskService = class TaskService {
+         // FIXME: Gio.Subprocess: due to only passing string vector is allowed, it's not possible to directly pass the
+         //        input of the user to subprocess (why & how, if you can answer then please send msg to fh@infinicode.de)
+         //        bypassing problem with own shell script
+-        let shellProc = Gio.Subprocess.new(['/bin/sh', EXTENSIONDIR + '/extra/create.sh', params], Gio.SubprocessFlags.STDOUT_PIPE + Gio.SubprocessFlags.STDERR_MERGE);
++        let shellProc = Gio.Subprocess.new(['@shell@', EXTENSIONDIR + '/extra/create.sh', params], Gio.SubprocessFlags.STDOUT_PIPE + Gio.SubprocessFlags.STDERR_MERGE);
+ 
+         shellProc.wait_async(null, function (obj, result) {
+             let shellProcExited = true;
+@@ -432,7 +432,7 @@ const TaskService = class TaskService {
+         let shellProc;
+ 
+         try {
+-            shellProc = Gio.Subprocess.new(['task', 'sync'], Gio.SubprocessFlags.STDOUT_PIPE);
++            shellProc = Gio.Subprocess.new(['@task@', 'sync'], Gio.SubprocessFlags.STDOUT_PIPE);
+         } catch (err) {
+             onError(err);
+             return;
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/tilingnome/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/tilingnome/default.nix
new file mode 100644
index 000000000000..293918bd2b11
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/tilingnome/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, fetchFromGitHub, glib, gnome3 }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-shell-extension-tilingnome";
+  version = "unstable-2019-01-18";
+
+  src = fetchFromGitHub {
+    owner = "rliang";
+    repo = pname;
+    rev = "bd4fb8c19f7a6282b38724b30e62645143390226";
+    sha256 = "1y4s4n88gdkpvgd3v3dg0181ccyhlixbvkx3bwyvdxyyyxbqibid";
+  };
+
+  nativeBuildInputs = [ glib ];
+
+  buildPhase = ''
+    glib-compile-schemas .
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp -r * $out/share/gnome-shell/extensions/${uuid}/
+  '';
+
+  uuid = "tilingnome@rliang.github.com";
+
+  meta = with stdenv.lib; {
+    description = "Tiling window management for GNOME Shell";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ benley ];
+    homepage = https://github.com/rliang/gnome-shell-extension-tilingnome;
+    platforms = gnome3.gnome-shell.meta.platforms;
+    broken = lib.versionAtLeast gnome3.gnome-shell.version "3.31";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/timepp/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/timepp/default.nix
new file mode 100644
index 000000000000..604b7433ccb4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/timepp/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-timepp-${version}";
+  version = "unstable-2019-03-30";
+
+  src = fetchFromGitHub {
+    owner = "zagortenay333";
+    repo = "timepp__gnome";
+    rev = "f90fb5573b37ac89fb57bf62e07d6d3bdb6a2c63";
+    sha256 = "0p6rsbm6lf61vzly775qkwc2rcjjl38bkqdxnv4sccqmw2wwclnp";
+  };
+
+  uuid = "timepp@zagortenay333";
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp -r . $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A todo.txt manager, time tracker, timer, stopwatch, pomodoro, and alarms gnome-shell extension.";
+    homepage = https://github.com/zagortenay333/timepp__gnome;
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ svsdep ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/topicons-plus/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/topicons-plus/default.nix
new file mode 100644
index 000000000000..9a151a6ac8f7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/topicons-plus/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, glib, gettext }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-topicons-plus-${version}";
+  version = "22";
+
+  src = fetchFromGitHub {
+    owner = "phocean";
+    repo = "TopIcons-plus";
+    rev = "v${version}";
+    sha256 = "196s1gdir52gbc444pzrb5l7gn5xr5vqk5ajqaiqryqlmp3i8vil";
+  };
+
+  buildInputs = [ glib ];
+
+  nativeBuildInputs = [ gettext ];
+
+  makeFlags = [ "INSTALL_PATH=$(out)/share/gnome-shell/extensions" ];
+
+  meta = with stdenv.lib; {
+    description = "Brings all icons back to the top panel, so that it's easier to keep track of apps running in the backround";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ eperuffo ];
+    homepage = https://github.com/phocean/TopIcons-plus;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/volume-mixer.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/volume-mixer.nix
new file mode 100644
index 000000000000..19ced0b5252c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/volume-mixer.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchFromGitHub, glib }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-volume-mixer-${version}";
+  version = "844ed80ad448855d8f6218847183a80474b523c7";
+
+  src = fetchFromGitHub {
+    owner = "aleho";
+    repo = "gnome-shell-volume-mixer";
+    rev = version;
+    sha256 = "1vcj2spbymhdi1nazvhldvcfgad23r3h7f0ihh4nianbxn7hjs9w";
+  };
+
+  buildInputs = [
+    glib
+  ];
+
+  buildPhase = ''
+    glib-compile-schemas --targetdir=${uuid}/schemas ${uuid}/schemas
+  '';
+
+  installPhase = ''
+    cp -r ${uuid} $out
+  '';
+
+  uuid = "shell-volume-mixer@derhofbauer.at";
+
+  meta = with stdenv.lib; {
+    description = "GNOME Shell Extension allowing separate configuration of PulseAudio devices";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ aneeshusa ];
+    homepage = https://github.com/aleho/gnome-shell-volume-mixer;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/window-corner-preview/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/window-corner-preview/default.nix
new file mode 100644
index 000000000000..7d5de1062b16
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/window-corner-preview/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-shell-extension-window-corner-preview";
+  version = "unstable-2019-04-03";
+
+  src = fetchFromGitHub {
+    owner = "medenagan";
+    repo = "window-corner-preview";
+    rev = "a95bb1389d94474efab7509aac592fb58fff6006";
+    sha256 = "03v18j9l0fb64xrg3swf1vcgl0kpgwjlp8ddn068bpvghrsvgfah";
+  };
+
+  dontBuild = true;
+
+  uuid = "window-corner-preview@fabiomereu.it";
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions
+    cp -r ${uuid} $out/share/gnome-shell/extensions
+  '';
+
+  meta = with stdenv.lib; {
+    description = "GNOME Shell extension showing a video preview on the corner of the screen";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jtojnar ];
+    homepage = https://github.com/medenagan/window-corner-preview;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/extensions/workspace-grid.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/workspace-grid.nix
new file mode 100644
index 000000000000..10aee5cafe6e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/workspace-grid.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchFromGitHub, glib }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-workspace-grid-${version}";
+  version = "0f3a430e7d04bb5465a17c1225aab0f574426d6b";
+
+  src = fetchFromGitHub {
+    owner = "zakkak";
+    repo = "workspace-grid-gnome-shell-extension";
+    rev = version;
+    sha256 = "0503b7lmydrbblfvf9b56pv5hpmykzgyc6v8y99rckg58h2jhs69";
+  };
+
+  buildInputs = [
+    glib
+  ];
+
+  installPhase = ''
+    cp -r ${uuid} $out
+  '';
+
+  uuid = "workspace-grid@mathematical.coffee.gmail.com";
+
+  meta = with stdenv.lib; {
+    description = "Arranges workspaces in a configurable grid";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ aneeshusa ];
+    homepage = https://github.com/zakkak/workspace-grid-gnome-shell-extension;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/find-latest-version.py b/nixpkgs/pkgs/desktops/gnome-3/find-latest-version.py
new file mode 100644
index 000000000000..b0359f799699
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/find-latest-version.py
@@ -0,0 +1,60 @@
+import argparse
+import json
+import requests
+import sys
+
+def version_to_list(version):
+    return list(map(int, version.split('.')))
+
+def odd_unstable(version_str, selected):
+    version = version_to_list(version_str)
+    if len(version) < 2:
+        return True
+
+    even = version[1] % 2 == 0
+    prerelease = (version[1] >= 90 and version[1] < 100) or (version[1] >= 900 and version[1] < 1000)
+    stable = even and not prerelease
+    if selected == 'stable':
+        return stable
+    else:
+        return True
+
+def no_policy(version, selected):
+    return True
+
+version_policies = {
+    'odd-unstable': odd_unstable,
+    'none': no_policy,
+}
+
+def make_version_policy(version_predicate, selected):
+    return lambda version: version_predicate(version, selected)
+
+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('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')
+
+
+if __name__ == '__main__':
+    args = parser.parse_args()
+
+    package_name = getattr(args, 'package-name')
+    requested_release = getattr(args, 'requested-release')
+    version_predicate = version_policies[getattr(args, 'version-policy')]
+    version_policy = make_version_policy(version_predicate, requested_release)
+
+    # The structure of cache.json: https://gitlab.gnome.org/Infrastructure/sysadmin-bin/blob/master/ftpadmin#L762
+    cache = json.loads(requests.get('https://ftp.gnome.org/pub/GNOME/sources/{}/cache.json'.format(package_name)).text)
+    if type(cache) != list or cache[0] != 4:
+        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)
+
+    if len(versions) == 0:
+        print('No versions matched.', file=sys.stderr)
+        sys.exit(1)
+
+    print(versions[-1])
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/aisleriot/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/aisleriot/default.nix
new file mode 100644
index 000000000000..3e274c35cdd9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/aisleriot/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, intltool, itstool, gtk3
+, wrapGAppsHook, librsvg, libxml2, desktop-file-utils
+, guile_2_0, libcanberra-gtk3 }:
+
+stdenv.mkDerivation rec {
+  pname = "aisleriot";
+  version = "3.22.8";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "15pm39679ymxki07sb5nvhycz4z53zwbvascyp5wm4864bn98815";
+  };
+
+  configureFlags = [
+    "--with-card-theme-formats=svg"
+    "--with-platform=gtk-only" # until they remove GConf
+  ];
+
+  nativeBuildInputs = [ pkgconfig intltool itstool wrapGAppsHook libxml2 desktop-file-utils ];
+  buildInputs = [ gtk3 librsvg guile_2_0 libcanberra-gtk3 ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Aisleriot;
+    description = "A collection of patience games written in guile scheme";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/atomix/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/atomix/default.nix
new file mode 100644
index 000000000000..00b3a04a1683
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/atomix/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, wrapGAppsHook, python3
+, gettext, gnome3, glib, gtk3, libgnome-games-support, gdk_pixbuf }:
+
+let
+  pname = "atomix";
+  version = "3.32.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "19wpm7mn6r7x6jz1r0kkqg3xa69iycvgb7g7i8wi0d3cx0rsgjkl";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext wrapGAppsHook python3 ];
+  buildInputs = [ glib gtk3 gdk_pixbuf libgnome-games-support gnome3.adwaita-icon-theme ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Puzzle game where you move atoms to build a molecule";
+    homepage = https://wiki.gnome.org/Apps/Atomix;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/five-or-more/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/five-or-more/default.nix
new file mode 100644
index 000000000000..21f089b324ef
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/five-or-more/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libgnome-games-support, gettext, itstool, libxml2, python3, vala }:
+
+stdenv.mkDerivation rec {
+  name = "five-or-more-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/five-or-more/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0v52i22ygv6y4zqs8nyb1qmacmj9whhqrw7qss6vn7by4nsikhrn";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxml2 python3 wrapGAppsHook
+    vala
+  ];
+  buildInputs = [
+    gtk3 librsvg libgnome-games-support gnome3.adwaita-icon-theme
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "five-or-more";
+      attrPath = "gnome3.five-or-more";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Five_or_more;
+    description = "Remove colored balls from the board by forming lines";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/four-in-a-row/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/four-in-a-row/default.nix
new file mode 100644
index 000000000000..94428d6640d0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/four-in-a-row/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, gettext, meson, libcanberra-gtk3, librsvg, itstool, vala
+, python3, ninja, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "four-in-a-row-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/four-in-a-row/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0h4wmbkdp7x3gp9sbxmvla316m8n6iy4f5sq0ksldj0z7ghlx9zl";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig wrapGAppsHook gettext meson itstool vala
+    ninja python3 desktop-file-utils
+  ];
+  buildInputs = [ gtk3 libcanberra-gtk3 librsvg gnome3.adwaita-icon-theme ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "four-in-a-row";
+      attrPath = "gnome3.four-in-a-row";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Four-in-a-row;
+    description = "Make lines of the same color to win";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-chess/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-chess/default.nix
new file mode 100644
index 000000000000..c6c24be4be8c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-chess/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, meson, ninja, vala, pkgconfig, wrapGAppsHook, gobject-introspection
+, gettext, itstool, libxml2, python3, gnome3, glib, gtk3, librsvg }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-chess-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-chess/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0hzb6s4wmfy1fysagc5hmn1ijvrwyd2cg7iz41mpn7gfdjyak639";
+  };
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig gettext itstool libxml2 python3 wrapGAppsHook gobject-introspection ];
+  buildInputs = [ glib gtk3 librsvg gnome3.adwaita-icon-theme ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-chess";
+      attrPath = "gnome3.gnome-chess";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Chess;
+    description = "Play the classic two-player boardgame of chess";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix
new file mode 100644
index 000000000000..c913a9e87294
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, pkgconfig, vala, gnome3, gtk3, wrapGAppsHook, appstream-glib, desktop-file-utils
+, glib, librsvg, libxml2, gettext, itstool, libgee, libgnome-games-support
+, meson, ninja, python3
+}:
+
+let
+  pname = "gnome-klotski";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1p4s15gxj6gasix22z9vlx2yrx196fvcxr6v6qrl569idfgjbi72";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig vala meson ninja python3 wrapGAppsHook
+    gettext itstool libxml2 appstream-glib desktop-file-utils
+    gnome3.adwaita-icon-theme
+  ];
+  buildInputs = [ glib gtk3 librsvg libgee libgnome-games-support ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "${pname}";
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Klotski;
+    description = "Slide blocks to solve the puzzle";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mahjongg/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mahjongg/default.nix
new file mode 100644
index 000000000000..ee55b5a65a5d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mahjongg/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, gettext, itstool, libxml2
+, meson, ninja, python3, vala, desktop-file-utils
+}:
+
+stdenv.mkDerivation rec {
+  name = "gnome-mahjongg-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-mahjongg/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "12kamxnxbh26k4iykhbs873mx25a2wrjnhr013lfkwbyl52kg12j";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-mahjongg"; attrPath = "gnome3.gnome-mahjongg"; };
+  };
+
+  nativeBuildInputs = [
+    meson ninja vala python3 desktop-file-utils
+    pkgconfig gnome3.adwaita-icon-theme
+    libxml2 itstool gettext wrapGAppsHook
+  ];
+  buildInputs = [
+    gtk3 librsvg
+  ];
+
+  postPatch = ''
+    chmod +x data/meson_post_install.py
+    patchShebangs data/meson_post_install.py
+  '';
+
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Mahjongg;
+    description = "Disassemble a pile of tiles by removing matching pairs";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mines/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mines/default.nix
new file mode 100644
index 000000000000..9ceb65f83083
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mines/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, meson, ninja, vala, gobject-introspection, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, gettext, itstool, python3, libxml2, libgnome-games-support, libgee, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-mines-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-mines/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "13ia8a7bmdnp1281lwp8nvdqqkclvg1n3pw4bbr2dgsrsswfkscj";
+  };
+
+  # gobject-introspection for finding vapi files
+  nativeBuildInputs = [
+    meson ninja vala gobject-introspection pkgconfig gettext itstool python3
+    libxml2 wrapGAppsHook desktop-file-utils
+  ];
+  buildInputs = [ gtk3 librsvg gnome3.adwaita-icon-theme libgnome-games-support libgee ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-mines";
+      attrPath = "gnome3.gnome-mines";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Mines;
+    description = "Clear hidden mines from a minefield";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix
new file mode 100644
index 000000000000..cbac95c8f41e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-nibbles/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libcanberra-gtk3, clutter-gtk, intltool, itstool
+, libxml2, libgee, libgnome-games-support }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-nibbles-${version}";
+  version = "3.31.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-nibbles/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0wg0l3aghkxcwp74liw115qjzy6w18hn80mhsz4lrjpnbpaivi18";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook intltool itstool libxml2 ];
+  buildInputs = [
+    gtk3 librsvg libcanberra-gtk3 clutter-gtk gnome3.adwaita-icon-theme
+    libgee libgnome-games-support
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-nibbles";
+      attrPath = "gnome3.gnome-nibbles";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Guide a worm around a maze";
+    homepage = https://wiki.gnome.org/Apps/Nibbles;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-robots/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-robots/default.nix
new file mode 100644
index 000000000000..2b40548d37ce
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-robots/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libcanberra-gtk3, gettext, itstool, libxml2, libgnome-games-support
+, libgee, meson, ninja, python3, desktop-file-utils , hicolor-icon-theme, adwaita-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-robots-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-robots/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1xp1sijl5k7wmnbb0hdgh4ajxgp74k7fcnmd5c6rw6lf51wpinyh";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-robots"; attrPath = "gnome3.gnome-robots"; };
+  };
+
+  nativeBuildInputs = [
+    pkgconfig meson ninja python3
+    libxml2 wrapGAppsHook gettext itstool desktop-file-utils
+    hicolor-icon-theme # For setup-hook
+  ];
+  buildInputs = [
+    gtk3 librsvg libcanberra-gtk3 libgnome-games-support libgee adwaita-icon-theme
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Robots;
+    description = "Avoid the robots and make them crash into each other";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix
new file mode 100644
index 000000000000..5c3fafd3d02a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-sudoku/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, meson, ninja, vala, pkgconfig, gobject-introspection, gettext, gtk3, gnome3, wrapGAppsHook
+, libgee, json-glib, qqwing, itstool, libxml2, python3, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-sudoku-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-sudoku/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1wwdjflw1lbx3cv6gvqcgp5jnjkrq37ld6mjbjj03g3vr90qaf0l";
+  };
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig gobject-introspection gettext itstool libxml2 python3 desktop-file-utils wrapGAppsHook ];
+  buildInputs = [ gtk3 libgee json-glib qqwing ];
+
+  postPatch = ''
+    chmod +x build-aux/post_install.py
+    patchShebangs build-aux/post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-sudoku";
+      attrPath = "gnome3.gnome-sudoku";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Sudoku;
+    description = "Test your logic skills in this number grid puzzle";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix
new file mode 100644
index 000000000000..06914d9817c7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libcanberra-gtk3, gettext, itstool, libxml2
+, meson, ninja, vala, python3, desktop-file-utils
+}:
+
+stdenv.mkDerivation rec {
+  name = "gnome-taquin-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-taquin/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1kyxh68gg7clxg22ls4sliisxb2sydwccbxqgfvxjg2fklr6r1lm";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-taquin"; attrPath = "gnome3.gnome-taquin"; };
+  };
+
+  nativeBuildInputs = [
+    pkgconfig wrapGAppsHook meson ninja python3
+    gettext itstool libxml2 vala desktop-file-utils
+  ];
+  buildInputs = [
+    gtk3 librsvg libcanberra-gtk3
+    gnome3.adwaita-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Taquin;
+    description = "Move tiles so that they reach their places";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/gnome-tetravex/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-tetravex/default.nix
new file mode 100644
index 000000000000..ab0f0f0faf2d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-tetravex/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, libxml2, gettext, itstool, meson, ninja, python3
+, vala, desktop-file-utils
+}:
+
+stdenv.mkDerivation rec {
+  name = "gnome-tetravex-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-tetravex/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "18drxp43j2jnywxl6qa7mn1iv33jxr0dpc1l9xza3lnrb0jp0kjl";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-tetravex"; attrPath = "gnome3.gnome-tetravex"; };
+  };
+
+  nativeBuildInputs = [
+    wrapGAppsHook itstool libxml2 gnome3.adwaita-icon-theme
+    pkgconfig gettext meson ninja python3 vala desktop-file-utils
+  ];
+  buildInputs = [
+    gtk3
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Tetravex;
+    description = "Complete the puzzle by matching numbered tiles";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/hitori/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/hitori/default.nix
new file mode 100644
index 000000000000..72cce760b03e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/hitori/default.nix
@@ -0,0 +1,66 @@
+{ stdenv
+, fetchurl
+, meson
+, ninja
+, pkgconfig
+, gnome3
+, glib
+, gtk3
+, cairo
+, wrapGAppsHook
+, libxml2
+, python3
+, gettext
+, itstool
+, desktop-file-utils
+, adwaita-icon-theme
+}:
+
+stdenv.mkDerivation rec {
+  pname = "hitori";
+  version = "3.31.92";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/hitori/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "0m2w3zz6v1bsd1fn78ab79d72ywd9vq60rziazsblxsi4qy9dva5";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    gettext
+    itstool
+    desktop-file-utils
+    libxml2
+    python3
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    cairo
+    adwaita-icon-theme
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Hitori;
+    description = "GTK+ application to generate and let you play games of Hitori";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/iagno/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/iagno/default.nix
new file mode 100644
index 000000000000..8ef4b2f30751
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/iagno/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, gdk_pixbuf, librsvg, wrapGAppsHook
+, intltool, itstool, libcanberra-gtk3, libxml2
+, meson, ninja, python3, vala, desktop-file-utils
+}:
+
+stdenv.mkDerivation rec {
+  name = "iagno-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/iagno/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1rcqb4gpam16xw87n4q2akkrg94ksrn16ry21pr6bsd7qs7hw17d";
+  };
+
+  nativeBuildInputs = [
+    meson ninja python3 vala desktop-file-utils
+    pkgconfig wrapGAppsHook itstool libxml2
+  ];
+  buildInputs = [ gtk3 gnome3.adwaita-icon-theme gdk_pixbuf librsvg libcanberra-gtk3 ];
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "iagno";
+      attrPath = "gnome3.iagno";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Iagno;
+    description = "Computer version of the game Reversi, more popularly called Othello";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/lightsoff/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/lightsoff/default.nix
new file mode 100644
index 000000000000..18c6f43b3b36
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/lightsoff/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, vala, pkgconfig, gtk3, gnome3, gdk_pixbuf, librsvg, wrapGAppsHook
+, gettext, itstool, clutter, clutter-gtk, libxml2, appstream-glib
+, meson, ninja, python3 }:
+
+stdenv.mkDerivation rec {
+  name = "lightsoff-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/lightsoff/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0vc3ibjs9ynnm0gxlhhin7jpnsx22vnn4ygaybxwmv9w2q49cs9f";
+  };
+
+  nativeBuildInputs = [
+    vala pkgconfig wrapGAppsHook itstool gettext appstream-glib libxml2
+    meson ninja python3
+  ];
+  buildInputs = [ gtk3 gnome3.adwaita-icon-theme gdk_pixbuf librsvg clutter clutter-gtk ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "lightsoff";
+      attrPath = "gnome3.lightsoff";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Lightsoff;
+    description = "Puzzle game, where the objective is to turn off all of the tiles on the board";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/quadrapassel/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/quadrapassel/default.nix
new file mode 100644
index 000000000000..712f984cbf9a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/quadrapassel/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, gdk_pixbuf
+, librsvg, libcanberra-gtk3, libmanette
+, gettext, itstool, libxml2, clutter, clutter-gtk, wrapGAppsHook
+, meson, ninja, python3, vala, desktop-file-utils
+}:
+
+let
+  pname = "quadrapassel";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/quadrapassel/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1zhi1957knz9dm98drn2dh95mr33sdch590yddh1f8r6bzsfjvpy";
+  };
+
+  nativeBuildInputs = [
+    meson ninja python3 vala desktop-file-utils
+    pkgconfig gnome3.adwaita-icon-theme
+    libxml2 itstool gettext wrapGAppsHook
+  ];
+  buildInputs = [
+    gtk3 gdk_pixbuf librsvg libmanette
+    libcanberra-gtk3 clutter libxml2 clutter-gtk
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Classic falling-block game, Tetris";
+    homepage = https://wiki.gnome.org/Apps/Quadrapassel;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/swell-foop/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/swell-foop/default.nix
new file mode 100644
index 000000000000..a944e0c568a2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/swell-foop/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, vala, glib, gtk3, gnome3, desktop-file-utils
+, clutter, clutter-gtk, gettext, itstool, libxml2, wrapGAppsHook, python3 }:
+
+let
+  pname = "swell-foop";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0jpci3c1wyzbvsq86j30rcl166skhi2wf12001amfgh0dmmwipci";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig wrapGAppsHook python3 itstool gettext libxml2 desktop-file-utils ];
+  buildInputs = [ glib gtk3 gnome3.adwaita-icon-theme clutter clutter-gtk ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Swell%20Foop;
+    description = "Puzzle game, previously known as Same GNOME";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/games/tali/default.nix b/nixpkgs/pkgs/desktops/gnome-3/games/tali/default.nix
new file mode 100644
index 000000000000..5ec29554b363
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/tali/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, gdk_pixbuf
+, librsvg, gettext, itstool, libxml2, wrapGAppsHook
+, meson, ninja, python3, desktop-file-utils
+}:
+
+stdenv.mkDerivation rec {
+  name = "tali-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/tali/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0s5clkn0qm298mvphx1xdymg67w1p8vvgvypvs97k6lfjqijkx3v";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "tali"; attrPath = "gnome3.tali"; };
+  };
+
+  nativeBuildInputs = [
+    meson ninja python3 desktop-file-utils
+    pkgconfig gnome3.adwaita-icon-theme
+    libxml2 itstool gettext wrapGAppsHook
+  ];
+  buildInputs = [ gtk3 gdk_pixbuf librsvg ];
+
+  postPatch = ''
+    chmod +x build-aux/meson_post_install.py
+    patchShebangs build-aux/meson_post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Tali;
+    description = "Sort of poker with dice and less money";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/installer.nix b/nixpkgs/pkgs/desktops/gnome-3/installer.nix
new file mode 100644
index 000000000000..4999e1f3343c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/installer.nix
@@ -0,0 +1,15 @@
+{ isoBaseName ? "nixos-graphical-gnome", system ? builtins.currentSystem
+, extraModules ? [] }:
+
+let
+
+  module = ../../../../nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix;
+
+  config = (import ../../../../nixos/lib/eval-config.nix {
+    inherit system;
+    modules = [ module { isoImage.isoBaseName = isoBaseName; } ] ++ extraModules;
+  }).config;
+
+in
+  config.system.build.isoImage
+
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/geary/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/geary/default.nix
new file mode 100644
index 000000000000..c43daf2ebb2f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/geary/default.nix
@@ -0,0 +1,70 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, vala, enchant2, wrapGAppsHook, meson, ninja
+, desktop-file-utils, gnome-online-accounts, gsettings-desktop-schemas, adwaita-icon-theme
+, libnotify, libcanberra-gtk3, libsecret, gmime, isocodes, libxml2, gettext
+, sqlite, gcr, json-glib, itstool, libgee, gnome3, webkitgtk, python3
+, xvfb_run, dbus, shared-mime-info, libunwind, folks, glib-networking }:
+
+stdenv.mkDerivation rec {
+  pname = "geary";
+  version = "3.32.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "07y5ii5bn7fgdpr88307fwxiafm5fwdxmzwhi6h1y4z880nnzp7f";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils gettext itstool libxml2 meson ninja
+    pkgconfig vala wrapGAppsHook python3
+  ];
+
+  buildInputs = [
+    adwaita-icon-theme enchant2 gcr gmime gnome-online-accounts
+    gsettings-desktop-schemas gtk3 isocodes json-glib libcanberra-gtk3
+    libgee libnotify libsecret sqlite webkitgtk glib-networking
+    libunwind folks
+  ];
+
+  checkInputs = [ xvfb_run dbus ];
+
+  mesonFlags = [
+    "-Dcontractor=true" # install the contractor file (Pantheon specific)
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/post_install.py
+    patchShebangs build-aux/post_install.py
+
+    chmod +x desktop/geary-attach
+  '';
+
+  doCheck = true;
+
+  checkPhase = ''
+    NO_AT_BRIDGE=1 \
+    XDG_DATA_DIRS=:$XDG_DATA_DIRS:${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}:${shared-mime-info}/share \
+    xvfb-run -s '-screen 0 800x600x24' dbus-run-session \
+      --config-file=${dbus.daemon}/share/dbus-1/session.conf \
+      meson test -v --no-stdsplit
+  '';
+
+  preFixup = ''
+    # Add geary to path for geary-attach
+    gappsWrapperArgs+=(--prefix PATH : "$out/bin")
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Geary;
+    description = "Mail client for GNOME 3";
+    maintainers = gnome3.maintainers;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gitg/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gitg/default.nix
new file mode 100644
index 000000000000..cb4c5c05cb0b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gitg/default.nix
@@ -0,0 +1,104 @@
+{ stdenv
+, fetchurl
+, fetchpatch
+, vala_0_42
+, intltool
+, pkgconfig
+, gtk3
+, glib
+, json-glib
+, wrapGAppsHook
+, libpeas
+, bash
+, gobject-introspection
+, libsoup
+, gtksourceview
+, gsettings-desktop-schemas
+, adwaita-icon-theme
+, gnome3
+, gtkspell3
+, shared-mime-info
+, libgee
+, libgit2-glib
+, libsecret
+, meson
+, ninja
+, python3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gitg";
+  version = "3.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1fz8q1aiql6k740savdjh0vzbyhcflgf94cfdhvzcrrvm929n2ss";
+  };
+
+  patches = [
+    # Fix build with latest libgit2-glib
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/gitg/commit/42bceea265f53fe7fd4a41037b936deed975fc6c.patch;
+      sha256 = "1xq245rsi1bi66lswk33pdiazfaagxf77836ds5q73900rx4r7fw";
+    })
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.py
+    sed -i '/gtk-update-icon-cache/s/^/#/' meson_post_install.py
+
+    substituteInPlace tests/libgitg/test-commit.vala --replace "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  doCheck = false; # FAIL: tests-gitg gtk_style_context_add_provider_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed
+
+  enableParallelBuilding = true;
+
+  buildInputs = [
+    adwaita-icon-theme
+    glib
+    gsettings-desktop-schemas
+    gtk3
+    gtksourceview
+    gtkspell3
+    json-glib
+    libgee
+    libgit2-glib
+    libpeas
+    libsecret
+    libsoup
+  ];
+
+  nativeBuildInputs = [
+    gobject-introspection
+    intltool
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala_0_42 # fails build with 0.44, drop in >3.30.1
+    wrapGAppsHook
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # Thumbnailers
+      --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
+    )
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/Apps/Gitg;
+    description = "GNOME GUI client to view git repositories";
+    maintainers = with maintainers; [ domenkozar ];
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix
new file mode 100644
index 000000000000..de0d70ae42f4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-applets/default.nix
@@ -0,0 +1,88 @@
+{ stdenv
+, fetchurl
+, intltool
+, itstool
+, libxml2
+, libxslt
+, pkgconfig
+, gnome-panel
+, gtk3
+, glib
+, libwnck3
+, libgtop
+, libnotify
+, upower
+, dbus-glib
+, wirelesstools
+, linuxPackages
+, adwaita-icon-theme
+, libgweather
+, gucharmap
+, gnome-settings-daemon
+, tracker
+, polkit
+, gnome3
+}:
+
+let
+  pname = "gnome-applets";
+  version = "3.30.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1cvl32486kqw301wy40l1a1sdhanra7bx4smq0a3lmnl3x01zg43";
+  };
+
+  nativeBuildInputs = [
+    intltool
+    itstool
+    pkgconfig
+    libxml2
+    libxslt
+  ];
+
+  buildInputs = [
+    gnome-panel
+    gtk3
+    glib
+    libxml2
+    libwnck3
+    libgtop
+    libnotify
+    upower
+    dbus-glib
+    adwaita-icon-theme
+    libgweather
+    gucharmap
+    gnome-settings-daemon
+    tracker
+    polkit
+    wirelesstools
+    linuxPackages.cpupower
+  ];
+
+  enableParallelBuilding = true;
+
+  doCheck = true;
+
+  configureFlags = [
+    "--with-libpanel-applet-dir=$(out)/share/gnome-panel/applets"
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Applets for use with the GNOME panel";
+    homepage = https://wiki.gnome.org/Projects/GnomeApplets;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix
new file mode 100644
index 000000000000..c80c8b977cf5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-autoar/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchurl, pkgconfig, gnome3
+, gtk3, glib, gobject-introspection, libarchive
+}:
+
+stdenv.mkDerivation rec {
+  name = "gnome-autoar-${version}";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-autoar/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "02i4zgqqqj56h7bcys6dz7n78m4nj2x4dv1ggjmnrk98n06xpsax";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-autoar"; attrPath = "gnome3.gnome-autoar"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk3 glib ];
+  propagatedBuildInputs = [ libarchive gobject-introspection ];
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+    license = licenses.lgpl21;
+    description = "Library to integrate compressed files management with GNOME";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix
new file mode 100644
index 000000000000..f9387c11b819
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-flashback/default.nix
@@ -0,0 +1,170 @@
+{ stdenv
+, autoreconfHook
+, fetchurl
+, fetchpatch
+, gettext
+, glib
+, gnome-bluetooth
+, gnome-desktop
+, gnome-panel
+, gnome-session
+, gnome3
+, gsettings-desktop-schemas
+, gtk3
+, ibus
+, intltool
+, libcanberra-gtk3
+, libpulseaudio
+, libxkbfile
+, libxml2
+, pkgconfig
+, polkit
+, substituteAll
+, upower
+, wrapGAppsHook
+, writeTextFile
+, writeShellScriptBin
+, xkeyboard_config
+}:
+
+let
+  pname = "gnome-flashback";
+  version = "3.30.0";
+  requiredComponents = wmName: "RequiredComponents=${wmName};gnome-flashback-init;gnome-flashback;gnome-panel;org.gnome.SettingsDaemon.A11ySettings;org.gnome.SettingsDaemon.Clipboard;org.gnome.SettingsDaemon.Color;org.gnome.SettingsDaemon.Datetime;org.gnome.SettingsDaemon.Housekeeping;org.gnome.SettingsDaemon.Keyboard;org.gnome.SettingsDaemon.MediaKeys;org.gnome.SettingsDaemon.Mouse;org.gnome.SettingsDaemon.Power;org.gnome.SettingsDaemon.PrintNotifications;org.gnome.SettingsDaemon.Rfkill;org.gnome.SettingsDaemon.ScreensaverProxy;org.gnome.SettingsDaemon.Sharing;org.gnome.SettingsDaemon.Smartcard;org.gnome.SettingsDaemon.Sound;org.gnome.SettingsDaemon.Wacom;org.gnome.SettingsDaemon.XSettings;";
+  gnome-flashback = stdenv.mkDerivation rec {
+    name = "${pname}-${version}";
+
+    src = fetchurl {
+      url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+      sha256 = "18rwql2pi78155l9zp1i50xfi5z8xz2l08m9d81x6qqbfr1nyy57";
+    };
+
+    patches =[
+      # overrides do not respect gsettingsschemasdir
+      # https://gitlab.gnome.org/GNOME/gnome-flashback/issues/9
+      (fetchpatch {
+       url = https://gitlab.gnome.org/GNOME/gnome-flashback/commit/a55530f58ccd600414a5420b287868ab7d219705.patch;
+       sha256 = "1la94lhhb9zlw7bnbpl6hl26zv3kxbsvgx996mhph720wxg426mh";
+      })
+    ];
+
+    # make .desktop Execs absolute
+    postPatch = ''
+      patch -p0 <<END_PATCH
+      +++ data/applications/gnome-flashback-init.desktop.in
+      @@ -4 +4 @@
+      -Exec=gnome-flashback --initialize
+      +Exec=$out/bin/gnome-flashback --initialize
+      +++ data/applications/gnome-flashback.desktop.in
+      @@ -4 +4 @@
+      -Exec=gnome-flashback
+      +Exec=$out/bin/gnome-flashback
+      END_PATCH
+    '';
+
+    postInstall = ''
+      # Check that our expected RequiredComponents match the stock session files, but then don't install them.
+      # They can be installed using mkSessionForWm.
+      grep '${requiredComponents "metacity"}' $out/share/gnome-session/sessions/gnome-flashback-metacity.session || (echo "RequiredComponents have changed, please update gnome-flashback/default.nix."; false)
+
+      rm -r $out/share/gnome-session
+      rm -r $out/share/xsessions
+      rm -r $out/libexec
+    '';
+
+    nativeBuildInputs = [
+      autoreconfHook
+      gettext
+      libxml2
+      pkgconfig
+      wrapGAppsHook
+    ];
+
+    buildInputs = [
+      glib
+      gnome-bluetooth
+      gnome-desktop
+      gsettings-desktop-schemas
+      gtk3
+      ibus
+      libcanberra-gtk3
+      libpulseaudio
+      libxkbfile
+      polkit
+      upower
+      xkeyboard_config
+    ];
+
+    doCheck = true;
+
+    enableParallelBuilding = true;
+
+    passthru = {
+      updateScript = gnome3.updateScript {
+        packageName = pname;
+        attrPath = "gnome3.${pname}";
+      };
+
+      mkSessionForWm = { wmName, wmLabel, wmCommand }:
+        let
+          wmApplication = writeTextFile {
+            name = "gnome-flashback-${wmName}-wm";
+            destination = "/share/applications/${wmName}.desktop";
+            text = ''
+              [Desktop Entry]
+              Type=Application
+              Encoding=UTF-8
+              Name=${wmLabel}
+              Exec=${wmCommand}
+              NoDisplay=true
+              X-GNOME-WMName=${wmLabel}
+              X-GNOME-Autostart-Phase=WindowManager
+              X-GNOME-Provides=windowmanager
+              X-GNOME-Autostart-Notify=false
+            '';
+          };
+
+        gnomeSession = writeTextFile {
+          name = "gnome-flashback-${wmName}-gnome-session";
+          destination = "/share/gnome-session/sessions/gnome-flashback-${wmName}.session";
+          text = ''
+            [GNOME Session]
+            Name=GNOME Flashback (${wmLabel})
+            ${requiredComponents wmName}
+          '';
+        };
+
+        executable = writeShellScriptBin "gnome-flashback-${wmName}" ''
+          if [ -z $XDG_CURRENT_DESKTOP ]; then
+            export XDG_CURRENT_DESKTOP="GNOME-Flashback:GNOME"
+          fi
+
+          export XDG_DATA_DIRS=${wmApplication}/share:${gnomeSession}/share:${gnome-flashback}/share:${gnome-panel}/share:$XDG_DATA_DIRS
+
+          exec ${gnome-session}/bin/gnome-session --session=gnome-flashback-${wmName} "$@"
+        '';
+
+      in writeTextFile {
+        name = "gnome-flashback-${wmName}-xsession";
+        destination = "/share/xsessions/gnome-flashback-${wmName}.desktop";
+        text = ''
+          [Desktop Entry]
+          Name=GNOME Flashback (${wmLabel})
+          Comment=This session logs you into GNOME Flashback with ${wmLabel}
+          Exec=${executable}/bin/gnome-flashback-${wmName}
+          TryExec=${wmCommand}
+          Type=Application
+          DesktopNames=GNOME-Flashback;GNOME;
+        '';
+      };
+    };
+
+    meta = with stdenv.lib; {
+      description = "GNOME 2.x-like session for GNOME 3";
+      homepage = https://wiki.gnome.org/Projects/GnomeFlashback;
+      license = licenses.gpl2;
+      maintainers = gnome3.maintainers;
+      platforms = platforms.linux;
+    };
+  };
+  in gnome-flashback
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-packagekit/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-packagekit/default.nix
new file mode 100644
index 000000000000..d819961d2819
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-packagekit/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchurl, pkgconfig, meson, ninja, gettext, gnome3, packagekit, polkit
+, gtk3, systemd, wrapGAppsHook, desktop-file-utils, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-packagekit-${version}";
+  version = "3.32.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-packagekit/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "08rhsisdvx7pnx3rrg5v7c09jbw4grglkdj979gwl4a31j24zjsd";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig meson ninja gettext wrapGAppsHook desktop-file-utils
+    hicolor-icon-theme # for setup-hook
+  ];
+
+  buildInputs = [ gtk3 packagekit systemd polkit ];
+
+  postPatch = ''
+    patchShebangs meson_post_install.sh
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = "gnome-packagekit";
+      attrPath = "gnome3.gnome-packagekit";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://www.freedesktop.org/software/PackageKit/;
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+    description = "Tools for installing software on the GNOME desktop using PackageKit";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix
new file mode 100644
index 000000000000..db00758fb55f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-panel/default.nix
@@ -0,0 +1,110 @@
+{ stdenv
+, fetchurl
+, autoreconfHook
+, fetchpatch
+, dconf
+, evolution-data-server
+, gdm
+, gettext
+, glib
+, gnome-desktop
+, gnome-flashback
+, gnome-menus
+, gnome3
+, gtk3
+, itstool
+, libgweather
+, libsoup
+, libwnck3
+, libxml2
+, pkgconfig
+, polkit
+, systemd
+, wrapGAppsHook }:
+
+let
+  pname = "gnome-panel";
+  version = "3.30.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  outputs = [ "out" "dev" "man" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "12q0l7wy6hzl46i7xpvv82ka3bn14z0jg6fhv5xhnk7j9mkbmgqw";
+  };
+
+  patches = [
+    # https://github.com/NixOS/nixpkgs/issues/36468
+    # https://gitlab.gnome.org/GNOME/gnome-panel/issues/8
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/gnome-panel/commit/77be9c3507bd1b5d70d97649b85ec9f47f6c359c.patch;
+      sha256 = "00b1ihnc6hp2g6x1v1njbc6mhsk44izl2wigviibmka2znfk03nv";
+    })
+  ];
+
+  # make .desktop Exec absolute
+  postPatch = ''
+    patch -p0 <<END_PATCH
+    +++ gnome-panel/gnome-panel.desktop.in
+    @@ -7 +7 @@
+    -Exec=gnome-panel
+    +Exec=$out/bin/gnome-panel
+    END_PATCH
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --prefix XDG_DATA_DIRS : "${gnome-menus}/share:${gnome-flashback}/share"
+      --prefix XDG_CONFIG_DIRS : "${gnome-menus}/etc/xdg:${gnome-flashback}/etc/xdg"
+    )
+  '';
+
+  nativeBuildInputs = [
+    autoreconfHook
+    gettext
+    itstool
+    libxml2
+    pkgconfig
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    dconf
+    evolution-data-server
+    gdm
+    glib
+    gnome-desktop
+    gnome-menus
+    gtk3
+    libgweather
+    libsoup
+    libwnck3
+    polkit
+    systemd
+  ];
+
+  configureFlags = [
+    "--enable-eds"
+  ];
+
+  enableParallelBuilding = true;
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Component of Gnome Flashback that provides panels and default applets for the desktop";
+    homepage = https://wiki.gnome.org/Projects/GnomePanel;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/default.nix
new file mode 100644
index 000000000000..5afc92aa482b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/default.nix
@@ -0,0 +1,96 @@
+{ stdenv
+, fetchgit
+, fetchurl
+, autoreconfHook
+, dbus-glib
+, glib
+, gnome-common
+, gnome-desktop
+, gnome3
+, gtk3
+, gsettings-desktop-schemas
+, pkgconfig
+, intltool
+, pam
+, systemd
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-screensaver";
+  version = "3.6.1";
+
+  # the original package is deprecated and the Ubuntu version has a number of useful patches
+  src = fetchgit {
+    url = "https://git.launchpad.net/ubuntu/+source/gnome-screensaver";
+    rev =  "4f7b666131dec060a5aac9117f395ac522a627b4";
+    sha256 = "15xqgcpm825cy3rm8pj00qlblq66svmh06lcw8qi74a3g0xcir87";
+  };
+
+  # from debian/patches/series
+  patches = map (patch: "debian/patches/${patch}") [
+    "00git_logind_check.patch"
+    "01_no_autostart.patch"
+    "03_fix_ltsp-fading.patch"
+    "05_dbus_service.patch"
+    "10_legacy_scrsvr_inhibit.patch"
+    "13_nvidia_gamma_fade_fallback.patch"
+    "14_no_fade_on_user_switch.patch"
+    "15_dont_crash_on_no_fade.patch"
+    "16_dont_crash_in_kvm.patch"
+    "17_remove_top_panel.patch"
+    "18_unity_dialog_layout.patch"
+    "24_use_user_settings.patch"
+    "25_fix_lock_command.patch"
+    "27_lightdm_switch_user.patch"
+    "28_blocking_return.patch"
+    "29_handle_expired_creds.patch"
+    # these two patches are ubuntu-specific
+    # "30_ubuntu-lock-on-suspend_gsetting.patch"
+    # "31_lock_screen_on_suspend.patch"
+    "32_input_sources_switcher.patch"
+    "move-not-nuke.patch"
+    "allow-replacement"
+    "libsystemd.patch"
+    "0001-gs-lock-plug-Disconnect-signal-handler-from-right-ob.patch"
+    "33_budgie_support.patch"
+  ] ++ [ ./fix-dbus-service-dir.patch ];
+
+  nativeBuildInputs = [
+    autoreconfHook
+    intltool
+    wrapGAppsHook
+    gnome-common
+    pkgconfig
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    gnome-desktop
+    dbus-glib
+    pam
+    systemd
+  ];
+
+  configureFlags = [ "--enable-locking" "--with-systemd=yes" ];
+
+  enableParallelBuilding = true;
+
+  doCheck = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Component of Gnome Flashback that provides screen locking";
+    homepage = https://wiki.gnome.org/Projects/GnomeScreensaver;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/fix-dbus-service-dir.patch b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/fix-dbus-service-dir.patch
new file mode 100644
index 000000000000..81e037ee690d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-screensaver/fix-dbus-service-dir.patch
@@ -0,0 +1,11 @@
+--- a/configure.ac  2019-01-20 20:28:01.309231507 +0100
++++ b/configure.ac  2019-01-20 20:31:54.927978927 +0100
+@@ -137,7 +137,7 @@
+ 
+ # Find out where the session service file goes
+ # The sad sed hack is recomended by section 27.10 of the automake manual.
+-DBUS_SESSION_SERVICE_DIR=`pkg-config --variable session_bus_services_dir dbus-1 | sed -e 's,/usr/share,${datarootdir},g'`
++DBUS_SESSION_SERVICE_DIR=`pkg-config --variable session_bus_services_dir dbus-1 --define-variable 'datadir=${datadir}'`
+ AC_SUBST(DBUS_SESSION_SERVICE_DIR)
+ 
+ dnl ---------------------------------------------------------------------------
\ No newline at end of file
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix
new file mode 100644
index 000000000000..fd7f7ef609df
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-tweaks/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, meson, ninja, gettext, fetchurl
+, pkgconfig, gtk3, glib, libsoup, gsettings-desktop-schemas
+, itstool, libxml2, python3Packages
+, gnome3, gdk_pixbuf, libnotify, gobject-introspection, wrapGAppsHook }:
+
+let
+  pname = "gnome-tweaks";
+  version = "3.32.0";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "037r35cw34ifcs676fq9n2v4mh1nkqx0qk474bznf18mr6r62h55";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxml2 wrapGAppsHook python3Packages.python
+  ];
+  buildInputs = [
+    gtk3 glib gsettings-desktop-schemas
+    gdk_pixbuf gnome3.adwaita-icon-theme
+    libnotify gnome3.gnome-shell python3Packages.pygobject3
+    libsoup gnome3.gnome-settings-daemon gnome3.nautilus
+    gnome3.mutter gnome3.gnome-desktop gobject-introspection
+    gnome3.nautilus
+    # Makes it possible to select user themes through the `user-theme` extension
+    gnome3.gnome-shell-extensions
+  ];
+
+  postPatch = ''
+    patchShebangs meson-postinstall.py
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --prefix PYTHONPATH : "$out/${python3Packages.python.sitePackages}:$PYTHONPATH")
+  '';
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    homepage = https://wiki.gnome.org/action/show/Apps/GnomeTweakTool;
+    description = "A tool to customize advanced GNOME 3 options";
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-video-effects/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-video-effects/default.nix
new file mode 100644
index 000000000000..b65e9c1021e7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-video-effects/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gnome3 }:
+let
+  pname = "gnome-video-effects";
+  version = "0.4.3";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "06c2f1kihyhawap1s3zg5w7q7fypsybkp7xry4hxkdz4mpsy0zjs";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "A collection of GStreamer effects to be used in different GNOME Modules";
+    homepage = https://wiki.gnome.org/Projects/GnomeVideoEffects;
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/default.nix
new file mode 100644
index 000000000000..3da7031b5114
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, autoreconfHook, pkgconfig, vala, glib, gjs, mutter, fetchpatch
+, pango, gtk3, gnome3, dbus, clutter, appstream-glib, wrapGAppsHook, systemd, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  version = "3.32.0";
+  name = "gpaste-${version}";
+
+  src = fetchurl {
+    url = "https://github.com/Keruspe/GPaste/archive/v${version}.tar.gz";
+    sha256 = "1fvpl9vqmrr1w22hm0ybabn9pjfii5qj9ghnc2jzihgrn2h486v6";
+  };
+
+  patches = [
+    ./fix-paths.patch
+  ];
+
+  # TODO: switch to substituteAll with placeholder
+  # https://github.com/NixOS/nix/issues/1846
+  postPatch = ''
+    substituteInPlace src/gnome-shell/extension.js \
+      --subst-var-by typelibPath "${placeholder "out"}/lib/girepository-1.0"
+    substituteInPlace src/gnome-shell/prefs.js \
+      --subst-var-by typelibPath "${placeholder "out"}/lib/girepository-1.0"
+    substituteInPlace src/libgpaste/settings/gpaste-settings.c \
+      --subst-var-by gschemasCompiled "${placeholder "out"}/share/gsettings-schemas/${name}/glib-2.0/schemas"
+  '';
+
+  nativeBuildInputs = [
+    autoreconfHook pkgconfig vala appstream-glib wrapGAppsHook
+  ];
+  buildInputs = [
+    glib gjs mutter gtk3 dbus
+    clutter pango gobject-introspection
+  ];
+
+  configureFlags = [
+    "--with-controlcenterdir=${placeholder "out"}/share/gnome-control-center/keybindings"
+    "--with-dbusservicesdir=${placeholder "out"}/share/dbus-1/services"
+    "--with-systemduserunitdir=${placeholder "out"}/etc/systemd/user"
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/Keruspe/GPaste;
+    description = "Clipboard management system with GNOME3 integration";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch
new file mode 100644
index 000000000000..c8a3fad2272b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch
@@ -0,0 +1,37 @@
+--- a/src/gnome-shell/extension.js
++++ b/src/gnome-shell/extension.js
+@@ -6,6 +6,8 @@
+ 
+ const Config = imports.misc.config;
+ 
++imports.gi.GIRepository.Repository.prepend_search_path('@typelibPath@');
++
+ imports.gi.versions.Clutter = Config.LIBMUTTER_API_VERSION;
+ imports.gi.versions.GLib = '2.0';
+ imports.gi.versions.GPaste = '1.0';
+--- a/src/gnome-shell/prefs.js
++++ b/src/gnome-shell/prefs.js
+@@ -6,6 +6,8 @@
+ 
+ const Gettext = imports.gettext;
+ 
++imports.gi.GIRepository.Repository.prepend_search_path('@typelibPath@');
++
+ const { GPaste } = imports.gi;
+ 
+ const ExtensionUtils = imports.misc.extensionUtils;
+--- a/src/libgpaste/settings/gpaste-settings.c
++++ b/src/libgpaste/settings/gpaste-settings.c
+@@ -1013,7 +1013,11 @@
+     }
+     else
+     {
+-        return g_settings_new (G_PASTE_SETTINGS_NAME);
++        // library used by introspection requires schemas but we cannot set XDG_DATA_DIRS for the library
++        GSettingsSchemaSource *schema_source = g_settings_schema_source_new_from_directory ("@gschemasCompiled@", NULL, FALSE, NULL);
++        g_autoptr (GSettingsSchema) schema = g_settings_schema_source_lookup (schema_source, G_PASTE_SETTINGS_NAME, FALSE);
++        g_settings_schema_source_unref (schema_source);
++        return g_settings_new_full (schema, NULL, NULL);
+     }
+ }
+ 
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/gtkhtml/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/gtkhtml/default.nix
new file mode 100644
index 000000000000..543453a2bd31
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gtkhtml/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, intltool
+, gnome3, enchant, isocodes, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  name = "gtkhtml-${version}";
+  version = "4.10.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gtkhtml/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "ca3b6424fb2c7ac5d9cb8fdafb69318fa2e825c9cf6ed17d1e38d9b29e5606c3";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gtkhtml"; attrPath = "gnome3.gtkhtml"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk3 intltool gnome3.adwaita-icon-theme
+                  gsettings-desktop-schemas ];
+
+  propagatedBuildInputs = [ enchant isocodes ];
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix
new file mode 100644
index 000000000000..3776a9adbf2c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/libgnome-games-support/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, pkgconfig, glib, gtk3, libgee, intltool, gnome3
+, libintl }:
+
+let
+  pname = "libgnome-games-support";
+  version = "1.4.3";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0g6a1vvhrbs0pfnzjfg3lgqvppwkydn6j3dn713zhrjhma9pljkh";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs = [ libintl ];
+  propagatedBuildInputs = [
+    # Required by libgnome-games-support-1.pc
+    glib gtk3 libgee
+  ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Small library intended for internal use by GNOME Games, but it may be used by others";
+    homepage = https://wiki.gnome.org/Apps/Games;
+    license = licenses.lgpl3;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/default.nix
new file mode 100644
index 000000000000..c42356aa16aa
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, fetchurl
+, gettext
+, glib
+, gnome3
+, gsettings-desktop-schemas
+, gtk3
+, libcanberra-gtk3
+, libgtop
+, libstartup_notification
+, libxml2
+, pkgconfig
+, substituteAll
+, wrapGAppsHook
+, zenity }:
+
+let
+  pname = "metacity";
+  version = "3.30.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "12kr472gblx7jxh9rvnamy09bkg29ms2pgc0c3373piqmavi24qg";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit zenity;
+    })
+  ];
+
+  nativeBuildInputs = [
+    gettext
+    libxml2
+    pkgconfig
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    gsettings-desktop-schemas
+    gtk3
+    libcanberra-gtk3
+    libgtop
+    libstartup_notification
+    zenity
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  doCheck = true;
+
+  meta = with stdenv.lib; {
+    description = "Window manager used in Gnome Flashback";
+    homepage = https://wiki.gnome.org/Projects/Metacity;
+    license = licenses.gpl2;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/fix-paths.patch b/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/fix-paths.patch
new file mode 100644
index 000000000000..ff3a244e67d9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/fix-paths.patch
@@ -0,0 +1,11 @@
+--- a/src/core/util.c
++++ b/src/core/util.c
+@@ -424,7 +424,7 @@
+                                  g_slist_length (columns)*2 +
+                                  g_slist_length (entries)));
+ 
+-  argvl[i++] = "zenity";
++  argvl[i++] = "@zenity@/bin/zenity";
+   argvl[i++] = type;
+   argvl[i++] = "--display";
+   argvl[i++] = display;
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix
new file mode 100644
index 000000000000..4aec5ba4d848
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/nautilus-python/default.nix
@@ -0,0 +1,62 @@
+{ stdenv
+, fetchurl
+, pkgconfig
+, which
+, gtk-doc
+, docbook_xsl
+, docbook_xml_dtd_412
+, python3
+, ncurses
+, nautilus
+, gtk3
+, gnome3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "nautilus-python";
+  version = "1.2.2";
+
+  outputs = [ "out" "dev" "doc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "04pib6fan6cq8x0fhf5gll2f5d2dh5pxrhj79qhi5l1yc7ys7kch";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    which
+    gtk-doc
+    docbook_xsl
+    docbook_xml_dtd_412
+  ];
+
+  buildInputs = [
+    python3
+    ncurses # required by python3
+    python3.pkgs.pygobject3
+    nautilus
+    gtk3 # required by libnautilus-extension
+  ];
+
+  makeFlags = [
+    "PYTHON_LIB_LOC=${python3}/lib"
+  ];
+
+  PKG_CONFIG_LIBNAUTILUS_EXTENSION_EXTENSIONDIR = "${placeholder "out"}/lib/nautilus/extensions-3.0";
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  meta = with stdenv.lib; {
+    description = "Python bindings for the Nautilus Extension API";
+    homepage = https://wiki.gnome.org/Projects/NautilusPython;
+    license = licenses.gpl2Plus;
+    maintainers = gnome3.maintainers;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/pidgin/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/pidgin/default.nix
new file mode 100644
index 000000000000..c11fdfa6099e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/pidgin/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchFromGitHub, glib }:
+
+stdenv.mkDerivation rec {
+  version = "1.0.1";
+  basename = "pidgin-im-gnome-shell-extension";
+  name = "${basename}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "muffinmad";
+    repo = "${basename}";
+    rev = "v${version}";
+    sha256 = "1567s2sfqig4jw0nrn134f5vkx0yq31q044grv3xk4vpl1f3z2lr";
+  };
+
+  buildInputs = [ glib ];
+
+  configurePhase = "";
+  buildPhase = "";
+  installPhase = ''
+    share_dir="$prefix/share"
+    extensions_dir="$share_dir/gnome-shell/extensions/pidgin@muffinmad"
+    mkdir -p "$extensions_dir"
+    mv *.js metadata.json dbus.xml gnome-shell-extension-pidgin.pot "$extensions_dir"
+
+    schemas_dir="$share_dir/gsettings-schemas/${name}/glib-2.0/schemas"
+    mkdir -p "$schemas_dir"
+    mv schemas/* "$schemas_dir" # fix Emacs syntax highlighting: */
+    glib-compile-schemas "$schemas_dir"
+
+    locale_dir="$share_dir/locale"
+    mkdir -p "$locale_dir"
+    mv locale/* $locale_dir # fix Emacs syntax highlighting: */
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/muffinmad/pidgin-im-gnome-shell-extension;
+    description = "Make Pidgin IM conversations appear in the Gnome Shell message tray";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/misc/pomodoro/default.nix b/nixpkgs/pkgs/desktops/gnome-3/misc/pomodoro/default.nix
new file mode 100644
index 000000000000..fcbceab24eab
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/pomodoro/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, fetchFromGitHub
+, autoconf-archive
+, appstream-glib
+, pkgconfig
+, wrapGAppsHook
+, libcanberra
+, gst_all_1
+, vala
+, gtk3
+, gom
+, sqlite
+, libxml2
+, autoreconfHook
+, glib
+, gobject-introspection
+, libpeas
+, gnome-shell
+, gsettings-desktop-schemas
+, adwaita-icon-theme
+, gettext
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-shell-pomodoro";
+  version = "0.15.1";
+
+  src = fetchFromGitHub {
+    owner = "codito";
+    repo = "gnome-pomodoro";
+    rev = version;
+    sha256 = "0nmgd122gsfka0p50mila88iwrzckq2r36a3h20lswn5qkn321i1";
+  };
+
+  nativeBuildInputs = [
+    appstream-glib
+    autoconf-archive
+    autoreconfHook
+    gettext
+    gobject-introspection
+    libxml2
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    adwaita-icon-theme
+    glib
+    gnome-shell
+    gom
+    gsettings-desktop-schemas
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good
+    gst_all_1.gstreamer
+    gtk3
+    libcanberra
+    libpeas
+    sqlite
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://gnomepomodoro.org/;
+    description = "Time management utility for GNOME based on the pomodoro technique";
+    longDescription = ''
+      This GNOME utility helps to manage time according to Pomodoro Technique.
+      It intends to improve productivity and focus by taking short breaks.
+    '';
+    maintainers = with maintainers; [ worldofpeace ];
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-3/update.nix b/nixpkgs/pkgs/desktops/gnome-3/update.nix
new file mode 100644
index 000000000000..2ee72d46993d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/update.nix
@@ -0,0 +1,16 @@
+{ stdenv, lib, writeScript, python3, common-updater-scripts, coreutils, gnugrep, gnused }:
+{ packageName, attrPath ? packageName, versionPolicy ? "odd-unstable" }:
+
+let
+  python = python3.withPackages (p: [ p.requests ]);
+  updateScript = writeScript "gnome-update-script" ''
+    #!${stdenv.shell}
+    set -o errexit
+    package_name="$1"
+    attr_path="$2"
+    version_policy="$3"
+    PATH=${lib.makeBinPath [ common-updater-scripts coreutils gnugrep gnused python ]}
+    latest_tag=$(python "${./find-latest-version.py}" "$package_name" "$version_policy" "stable")
+    update-source-version "$attr_path" "$latest_tag"
+  '';
+in [ updateScript packageName attrPath versionPolicy ]