about summary refs log tree commit diff
path: root/nixpkgs/pkgs/desktops
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/desktops')
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dbus-factory/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-api/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-api/deps.nix102
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-calendar/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-daemon/default.nix92
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-daemon/deps.nix111
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-qt-dbus-factory/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dde-session-ui/default.nix62
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-desktop-base/default.nix47
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-desktop-schemas/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-gettext-tools/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-gtk-theme/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-icon-theme/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-image-viewer/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-menu/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-metacity/default.nix64
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-movie-reborn/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-mutter/default.nix62
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-shortcut-viewer/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-sound-theme/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-terminal/default.nix71
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-wallpapers/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/deepin/deepin-wm/default.nix60
-rw-r--r--nixpkgs/pkgs/desktops/deepin/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dtkcore/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dtkwidget/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/deepin/dtkwm/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/deepin/go-dbus-factory/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/deepin/go-dbus-generator/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/deepin/go-gir-generator/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/deepin/go-lib/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/deepin/qt5dxcb-plugin/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/deepin/qt5integration/default.nix53
-rw-r--r--nixpkgs/pkgs/desktops/deepin/update.nix38
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/default.nix14
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/econnman.nix29
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/efl-elua.patch14
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/efl.nix94
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/elementary.patch18
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/enlightenment.nix78
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/enlightenment.suid-exes.patch25
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/ephoto.nix30
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/rage.nix37
-rw-r--r--nixpkgs/pkgs/desktops/enlightenment/terminology.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python-desktop/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python/default.nix33
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/bindings/libglademm/default.nix17
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/default.nix88
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/gnome-icon-theme/default.nix20
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/gtksourceview/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/patches/mail-notification-dont-link-against-bsd-compat.patch10
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/scrollkeeper/default.nix20
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/vte/alt.patch50
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/vte/change-scroll-region.patch67
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/desktop/vte/default.nix61
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/GConf/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/ORBit2/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gnome-common/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gnome-mime-data/default.nix10
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gnome-vfs/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gtkglext/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/01_remove-disable-deprecated.patch17
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/4.x.nix16
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/default.nix20
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libIDL/default.nix15
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libart_lgpl/default.nix9
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libbonobo/default.nix21
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libbonoboui/default.nix18
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libglade/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/default.nix23
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/new-glib.patch65
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvas/default.nix17
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvasmm/default.nix13
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/cups_1.6.patch285
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/glib.patch38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/bug653388.patch21
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/default.nix22
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprintui/default.nix13
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeui/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/gnome-2/platform/libgtkhtml/default.nix16
-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.nix59
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/file-roller/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gedit/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/ghex/default.nix27
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/glade/default.nix37
-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.nix47
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-documents/default.nix65
-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.nix48
-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.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-todo/default.nix47
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix43
-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.nix35
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/dconf/default.nix46
-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.nix68
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix63
-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.nix57
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix78
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch78
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/bubblewrap-paths.patch19
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix53
-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.nix41
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix63
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-accounts/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-miners/default.nix33
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-remote-desktop/default.nix41
-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.nix54
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/fix-paths.patch15
-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.patch24
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/default.nix98
-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.nix52
-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.nix52
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/grilo-plugins/default.nix39
-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/gsettings-desktop-schemas/default.nix36
-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.nix55
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/mutter/default.nix59
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/nautilus/bubblewrap-paths.patch19
-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/default.nix54
-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.nix59
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/default.nix100
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/fix-paths.patch42
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/core/tracker/default.nix78
-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.nix29
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/default.nix402
-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.nix33
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/battery-status/default.nix27
-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.nix35
-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/system-monitor/default.nix45
-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.nix43
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/fix-paths.patch81
-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/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.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/four-in-a-row/default.nix30
-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.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-mahjongg/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-mines/default.nix36
-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.nix31
-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.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/gnome-tetravex/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/hitori/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/iagno/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/lightsoff/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/quadrapassel/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/swell-foop/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/games/tali/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/installer.nix15
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/geary/default.nix74
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/misc/gitg/default.nix65
-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.nix34
-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.patch55
-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.nix49
-rw-r--r--nixpkgs/pkgs/desktops/gnome-3/update.nix16
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/back/default.nix24
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/back/fixup-tools.patch14
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/base/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/base/fixup-base-makefile-installdir.patch29
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/base/fixup-paths.patch373
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/default.nix21
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gorm/default.nix17
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gorm/fix-gs-makefiles.patch27
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gui/default.nix16
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gui/fixup-all.patch56
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-makefile-installdir.patch28
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-textconverters-preamble.patch11
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-tools-preamble.patch14
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/gworkspace/default.nix22
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/libobjc2/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/GNUstep.conf126
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/builder.sh122
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/fixup-paths.patch197
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/gs-makefiles-additional.patch145
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/gsmakeDerivation.nix19
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/setup-hook.sh77
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/make/wrapper.sh4
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/projectcenter/default.nix23
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/projectcenter/fixup-preamble.patch14
-rw-r--r--nixpkgs/pkgs/desktops/gnustep/systempreferences/default.nix17
-rw-r--r--nixpkgs/pkgs/desktops/lumina/LuminaOS-NixOS.cpp.patch26
-rw-r--r--nixpkgs/pkgs/desktops/lumina/avoid-absolute-path-on-sessdir.patch11
-rw-r--r--nixpkgs/pkgs/desktops/lumina/default.nix84
-rw-r--r--nixpkgs/pkgs/desktops/lxde/core/lxappearance/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/lxde/core/lxappearance/lxappearance-0.6.3-xdg.system.data.dirs.patch27
-rw-r--r--nixpkgs/pkgs/desktops/lxde/core/lxmenu-data.nix20
-rw-r--r--nixpkgs/pkgs/desktops/lxde/core/lxpanel/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/lxde/core/lxrandr/default.nix23
-rw-r--r--nixpkgs/pkgs/desktops/lxde/core/lxtask/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/compton-conf/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/default.nix109
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/libfm-qt/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/liblxqt/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/libqtxdg/default.nix33
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/libsysstat/default.nix25
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lximage-qt/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-about/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-admin/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-build-tools/default.nix27
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-config/default.nix69
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-globalkeys/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-notificationd/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-openssh-askpass/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-panel/default.nix73
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-policykit/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-powermanagement/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-qtplugin/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-runner/default.nix50
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-session/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-sudo/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/lxqt-themes/default.nix33
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/obconf-qt/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/pavucontrol-qt/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/pcmanfm-qt/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/qlipper/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/qps/default.nix26
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/qterminal/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/qtermwidget/default.nix25
-rw-r--r--nixpkgs/pkgs/desktops/lxqt/screengrab/default.nix38
-rwxr-xr-xnixpkgs/pkgs/desktops/lxqt/update.sh39
-rw-r--r--nixpkgs/pkgs/desktops/mate/atril/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/mate/caja-dropbox/default.nix33
-rw-r--r--nixpkgs/pkgs/desktops/mate/caja-extensions/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/mate/caja/caja-extension-dirs.patch30
-rw-r--r--nixpkgs/pkgs/desktops/mate/caja/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/mate/default.nix96
-rw-r--r--nixpkgs/pkgs/desktops/mate/engrampa/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/mate/eom/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/mate/libmatekbd/default.nix23
-rw-r--r--nixpkgs/pkgs/desktops/mate/libmatemixer/default.nix31
-rw-r--r--nixpkgs/pkgs/desktops/mate/libmateweather/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/mate/marco/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-applets/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-backgrounds/default.nix21
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-calc/default.nix31
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-common/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-control-center/default.nix49
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-desktop/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-icon-theme-faenza/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-icon-theme/default.nix29
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-indicator-applet/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-media/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-menus/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-netbook/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-notification-daemon/default.nix34
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-panel/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-polkit/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-power-manager/default.nix41
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-screensaver/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-sensors-applet/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-session-manager/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-settings-daemon/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-system-monitor/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-terminal/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-themes/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-user-guide/default.nix23
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-user-share/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/mate/mate-utils/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/mate/mozo/default.nix28
-rw-r--r--nixpkgs/pkgs/desktops/mate/pluma/default.nix37
-rw-r--r--nixpkgs/pkgs/desktops/mate/python-caja/default.nix34
-rwxr-xr-xnixpkgs/pkgs/desktops/mate/update.sh54
-rw-r--r--nixpkgs/pkgs/desktops/maxx/default.nix94
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix58
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix64
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix80
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix76
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch22
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix78
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix81
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix67
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix28
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix63
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch55
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix47
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch12
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch22
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch43
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch26
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix63
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch23
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix64
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch20
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix47
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix62
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch36
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix49
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch25
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix19
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix55
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/default.nix222
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch25
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix60
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist6
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch25
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix103
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop8
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix107
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix50
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix39
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch34
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch22
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch24
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix72
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix71
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch26
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix50
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix49
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix49
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix59
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix61
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch21
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix23
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/granite/default.nix63
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/cerbere/default.nix48
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix45
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix58
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix117
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch15
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix49
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/update.nix18
-rwxr-xr-xnixpkgs/pkgs/desktops/pantheon/update.sh223
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/bluedevil.nix14
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/breeze-grub.nix15
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/breeze-gtk.nix14
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/default.nix44
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/install-paths.patch19
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/series1
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/breeze-qt5.nix20
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/default.nix142
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/fetch.sh1
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kactivitymanagerd.nix15
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kde-cli-tools.nix14
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/default.nix25
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/follow-symlinks.patch49
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/gsettings.patch21
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/series2
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kdecoration.nix8
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kdeplasma-addons.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kgamma5.nix11
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/khotkeys.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kinfocenter.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kmenuedit.nix14
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kscreen.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kscreenlocker.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/ksshaskpass.nix11
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/ksysguard.nix16
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwallet-pam.nix10
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwayland-integration.nix11
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwin/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwin/follow-symlinks.patch13
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwin/no-setcap-install.patch24
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwin/series3
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwin/xwayland.patch13
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/kwrited.nix11
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/libkscreen/default.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/libkscreen/libkscreen-backends-path.patch27
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/libkscreen/series1
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/libksysguard/0001-qdiriterator-follow-symlinks.patch25
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/libksysguard/default.nix21
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/milou.nix15
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/oxygen.nix18
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-browser-integration.nix11
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/hwclock-path.patch24
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/series2
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/tzdir.patch18
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-integration/default.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0001-mobile-broadband-provider-info-path.patch25
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0002-openvpn-binary-path.patch13
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-nm/default.nix31
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-pa.nix15
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-vault/cryfs-path.patch13
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-vault/default.nix40
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-vault/encfs-path.patch22
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-vault/fusermount-path.patch18
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-workspace-wallpapers.nix6
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/default.nix81
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch1079
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/polkit-kde-agent.nix15
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/powerdevil.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/sddm-kcm.nix16
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/srcs.nix365
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/systemsettings.nix17
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/user-manager.nix13
-rw-r--r--nixpkgs/pkgs/desktops/plasma-5/xdg-desktop-portal-kde.nix15
-rw-r--r--nixpkgs/pkgs/desktops/rox/rox-filer/default.nix79
-rw-r--r--nixpkgs/pkgs/desktops/rox/rox-filer/rox-filer-2.11-in-source-build.patch16
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/gigolo.nix22
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/mousepad-12134.patch90
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/mousepad.nix38
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/orage.nix44
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/parole.nix38
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/ristretto.nix34
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/terminal.nix25
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/xfce4-mixer.nix51
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/xfce4-notifyd.nix32
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/xfce4-screenshooter.nix29
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/xfce4-taskmanager.nix22
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed-pulse.nix31
-rw-r--r--nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed.nix46
-rw-r--r--nixpkgs/pkgs/desktops/xfce/art/xfce4-icon-theme.nix23
-rw-r--r--nixpkgs/pkgs/desktops/xfce/art/xfwm4-themes.nix21
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/exo.nix27
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/garcon-10967.patch14
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/garcon-12700.patch44
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/garcon.nix27
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/gtk-xfce-engine.nix31
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/libxfce4ui.nix42
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/libxfce4util.nix27
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/libxfcegui4.nix37
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/thunar-build.nix42
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/thunar-volman.nix30
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/thunar.nix68
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/thunarx_plugins_directory.patch48
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/tumbler.nix42
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-appfinder.nix29
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-dev-tools.nix28
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-light-locker.patch25
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-panel-datadir.patch24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-panel.nix59
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-power-manager.nix45
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-session.nix45
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-settings-default-icon-theme.patch11
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfce4-settings.nix54
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfconf.nix30
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfdesktop.nix36
-rw-r--r--nixpkgs/pkgs/desktops/xfce/core/xfwm4.nix32
-rw-r--r--nixpkgs/pkgs/desktops/xfce/default.nix211
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-battery-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpufreq-plugin.nix29
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpugraph-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-datetime-plugin.nix26
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dict-plugin.nix25
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dockbarx-plugin.nix40
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-embed-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-eyes-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-fsguard-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-genmon-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-hardware-monitor-plugin.nix41
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mailwatch-plugin.nix26
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mpc-plugin.nix26
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-namebar-plugin.nix31
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-netload-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-notes-plugin.nix25
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-pulseaudio-plugin.nix34
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-sensors-plugin.nix46
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-systemload-plugin.nix24
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-timer-plugin.nix30
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/appmenu-gtk-module.nix31
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/default.nix49
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/fix-bamf-dependency.patch12
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-verve-plugin.nix27
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-weather-plugin.nix29
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-whiskermenu-plugin.nix36
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-windowck-plugin.nix34
-rw-r--r--nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-xkb-plugin.nix28
-rw-r--r--nixpkgs/pkgs/desktops/xfce/thunar-plugins/archive/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/xfce/thunar-plugins/dropbox/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/automakeAddFlags.sh7
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/default.nix113
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/exo/default.nix23
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/exo/gtk3-only.patch28
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/garcon/12700.patch37
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/garcon/13785.patch75
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/garcon/default.nix12
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/gigolo/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/libxfce4ui/default.nix18
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/libxfce4util/default.nix16
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/mkXfceDerivation.nix40
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/mousepad/default.nix12
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/orage/default.nix35
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/parole/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/ristretto/default.nix18
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/thunar-volman/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/thunar/default.nix30
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/tumbler/default.nix14
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfburn/default.nix18
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-appfinder/default.nix12
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-battery-plugin/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-clipman-plugin/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-cpufreq-plugin/default.nix10
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/setup-hook.sh12
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/configure-gio.patch11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-mixer/default.nix32
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-netload-plugin/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-notifyd/default.nix12
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-panel/default.nix36
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-power-manager/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-pulseaudio-plugin/default.nix19
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-screenshooter/default.nix12
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-session/default.nix27
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-settings/default.nix38
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-taskmanager/default.nix18
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-terminal/default.nix16
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-volumed-pulse/default.nix15
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-whiskermenu-plugin/default.nix18
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfce4-xkb-plugin/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfconf/default.nix11
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfdesktop/default.nix22
-rw-r--r--nixpkgs/pkgs/desktops/xfce4-13/xfwm4/default.nix26
650 files changed, 27273 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/desktops/deepin/dbus-factory/default.nix b/nixpkgs/pkgs/desktops/deepin/dbus-factory/default.nix
new file mode 100644
index 000000000000..3c99c40ee807
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dbus-factory/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, jq, libxml2, go-dbus-generator, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dbus-factory";
+  version = "3.1.17";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "1llq8wzgikgpzj7z36fyzk8kjych2h9nzi3x6zv53z0xc1xn4256";
+  };
+
+  nativeBuildInputs = [
+    jq
+    libxml2
+    go-dbus-generator
+  ];
+
+  makeFlags = [ "GOPATH=$(out)/share/go" ];
+
+  postPatch = ''
+    sed -i -e 's:/share/gocode:/share/go:' Makefile
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Generates static DBus bindings for Golang and QML at build-time";
+    homepage = https://github.com/linuxdeepin/dbus-factory;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-api/default.nix b/nixpkgs/pkgs/desktops/deepin/dde-api/default.nix
new file mode 100644
index 000000000000..c1321acb853e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-api/default.nix
@@ -0,0 +1,66 @@
+{ stdenv, buildGoPackage, fetchFromGitHub, pkgconfig,
+  deepin-gettext-tools, go-dbus-factory, go-gir-generator, go-lib,
+  alsaLib, glib, gtk3, libcanberra, libgudev, librsvg, poppler,
+  pulseaudio, go, deepin }:
+
+buildGoPackage rec {
+  name = "${pname}-${version}";
+  pname = "dde-api";
+  version = "3.5.0";
+
+  goPackagePath = "pkg.deepin.io/dde/api";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "1g3s0i5wa6qyv00yksz4r4cy2vhiknq8v0yx7aribvwm3gxf7jw3";
+  };
+
+  goDeps = ./deps.nix;
+
+  nativeBuildInputs = [
+    pkgconfig
+    deepin-gettext-tools
+    go-dbus-factory
+    go-gir-generator
+    go-lib
+  ];
+
+  buildInputs = [
+    alsaLib
+    glib
+    gtk3
+    libcanberra
+    libgudev
+    librsvg
+    poppler
+    pulseaudio
+  ];
+
+  postPatch = ''
+    patchShebangs .
+    sed -i -e "s|/var|$bin/var|" Makefile
+  '';
+
+  buildPhase = ''
+    make -C go/src/${goPackagePath}
+  '';
+
+  installPhase = ''
+    make install PREFIX="$bin" SYSTEMD_LIB_DIR="$bin/lib" -C go/src/${goPackagePath}
+    mkdir -p $out/share
+    mv $bin/share/gocode $out/share/go
+    remove-references-to -t ${go} $bin/bin/* $bin/lib/deepin-api/*
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Go-lang bindings for dde-daemon";
+    homepage = https://github.com/linuxdeepin/dde-api;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-api/deps.nix b/nixpkgs/pkgs/desktops/deepin/dde-api/deps.nix
new file mode 100644
index 000000000000..bd7a13043da2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-api/deps.nix
@@ -0,0 +1,102 @@
+# This file was generated by https://github.com/kamilchm/go2nix v1.2.1
+[
+  {
+    goPackagePath = "github.com/alecthomas/template";
+    fetch = {
+      type = "git";
+      url = "https://github.com/alecthomas/template";
+      rev = "a0175ee3bccc567396460bf5acd36800cb10c49c";
+      sha256 = "0qjgvvh26vk1cyfq9fadyhfgdj36f1iapbmr5xp6zqipldz8ffxj";
+    };
+  }
+  {
+    goPackagePath = "github.com/alecthomas/units";
+    fetch = {
+      type = "git";
+      url = "https://github.com/alecthomas/units";
+      rev = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a";
+      sha256 = "1j65b91qb9sbrml9cpabfrcf07wmgzzghrl7809hjjhrmbzri5bl";
+    };
+  }
+  {
+    goPackagePath = "github.com/cryptix/wav";
+    fetch = {
+      type = "git";
+      url = "https://github.com/cryptix/wav";
+      rev = "8bdace674401f0bd3b63c65479b6a6ff1f9d5e44";
+      sha256 = "18nyqv0ic35fs9fny8sj84c00vbxs8mnric6vr6yl42624fh5id6";
+    };
+  }
+  {
+    goPackagePath = "github.com/disintegration/imaging";
+    fetch = {
+      type = "git";
+      url = "https://github.com/disintegration/imaging";
+      rev = "9458da53d1e65e098d48467a4317c403327e4424";
+      sha256 = "1b0ma9if8s892qfx5b1vjinxn00ah9vsyxijs8knkilrhf5vqcx4";
+    };
+  }
+  {
+    goPackagePath = "github.com/fogleman/gg";
+    fetch = {
+      type = "git";
+      url = "https://github.com/fogleman/gg";
+      rev = "0e0ff3ade7039063fe954cc1b45fad6cd4ac80db";
+      sha256 = "06gvsngfwizdxin90nldix5503fqgnwqmqvxzrz0xg5hfazwfra5";
+    };
+  }
+  {
+    goPackagePath = "github.com/golang/freetype";
+    fetch = {
+      type = "git";
+      url = "https://github.com/golang/freetype";
+      rev = "e2365dfdc4a05e4b8299a783240d4a7d5a65d4e4";
+      sha256 = "194w3djc6fv1rgcjqds085b9fq074panc5vw582bcb8dbfzsrqxc";
+    };
+  }
+  {
+    goPackagePath = "github.com/linuxdeepin/go-x11-client";
+    fetch = {
+      type = "git";
+      url = "https://github.com/linuxdeepin/go-x11-client";
+      rev = "03541136501cab4910ad8852fe749ef8e18907ca";
+      sha256 = "1iiw8qclpklim81hz1sdjp2ajw0ljvjz19n9jly86nbw6m8x4gkp";
+    };
+  }
+  {
+    goPackagePath = "github.com/nfnt/resize";
+    fetch = {
+      type = "git";
+      url = "https://github.com/nfnt/resize";
+      rev = "83c6a9932646f83e3267f353373d47347b6036b2";
+      sha256 = "005cpiwq28krbjf0zjwpfh63rp4s4is58700idn24fs3g7wdbwya";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/image";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/image";
+      rev = "69cc3646b96e61de0b417f4815b86c36e65783ee";
+      sha256 = "0nkywb3r0qvwkmykpswnf0svxi463ycn293y5jjididzxv9qxdp9";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/net";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/net";
+      rev = "c44066c5c816ec500d459a2a324a753f78531ae0";
+      sha256 = "0mgww74bl15d0jvsh4f3qr1ckjzb8icb8hn0mgs5ppa0b2fgpc4f";
+    };
+  }
+  {
+    goPackagePath = "gopkg.in/alecthomas/kingpin.v2";
+    fetch = {
+      type = "git";
+      url = "https://gopkg.in/alecthomas/kingpin.v2";
+      rev = "947dcec5ba9c011838740e680966fd7087a71d0d";
+      sha256 = "0mndnv3hdngr3bxp7yxfd47cas4prv98sqw534mx7vp38gd88n5r";
+    };
+  }
+]
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-calendar/default.nix b/nixpkgs/pkgs/desktops/deepin/dde-calendar/default.nix
new file mode 100644
index 000000000000..631471527f3a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-calendar/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, qttools,
+  deepin-gettext-tools, dtkcore, dtkwidget, deepin
+}:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dde-calendar";
+  version = "1.2.6";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0k973rv0prvr7cg1xwg7kr14fkx13aslhiqc3q7vpakfk53qsw4n";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+    qttools
+    deepin-gettext-tools
+  ];
+
+  buildInputs = [
+    dtkcore
+    dtkwidget
+  ];
+
+  postPatch = ''
+    patchShebangs .
+    sed -i translate_desktop.sh \
+      -e "s,/usr/bin/deepin-desktop-ts-convert,deepin-desktop-ts-convert,"
+    sed -i com.deepin.Calendar.service \
+      -e "s,/usr,$out,"
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Calendar for Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/dde-calendar;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-daemon/default.nix b/nixpkgs/pkgs/desktops/deepin/dde-daemon/default.nix
new file mode 100644
index 000000000000..3678694be9ee
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-daemon/default.nix
@@ -0,0 +1,92 @@
+{ stdenv, buildGoPackage, fetchFromGitHub, fetchpatch, pkgconfig,
+  dbus-factory, go-dbus-factory, go-gir-generator, go-lib,
+  deepin-gettext-tools, dde-api, alsaLib, glib, gtk3, libinput, libnl,
+  librsvg, linux-pam, networkmanager, pulseaudio, xorg, gnome3,
+  python3Packages, hicolor-icon-theme, go, deepin }:
+
+buildGoPackage rec {
+  name = "${pname}-${version}";
+  pname = "dde-daemon";
+  version = "3.6.0";
+
+  goPackagePath = "pkg.deepin.io/dde/daemon";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0gn2zp34wg79lvzdfla6yb4gs3f9ll83kj765zvig1wpx51nq1aj";
+  };
+
+  patches = [
+    # https://github.com/linuxdeepin/dde-daemon/issues/51
+    (fetchpatch {
+      name = "dde-daemon_3.2.3.patch";
+      url = https://github.com/jouyouyun/tap-gesture-patches/raw/master/patches/dde-daemon_3.2.3.patch;
+      sha256 = "0a3xb15czpfl2vajpf7ycw37vr7fbw2png1a67mvjjkgx7d1k7dg";
+    })
+  ];
+
+  goDeps = ./deps.nix;
+
+  outputs = [ "out" ];
+
+  nativeBuildInputs = [
+    pkgconfig
+    dbus-factory
+    go-dbus-factory
+    go-gir-generator
+    go-lib
+    deepin-gettext-tools
+    dde-api
+    linux-pam
+    networkmanager
+    networkmanager.dev
+    python3Packages.python
+  ];
+
+  buildInputs = [
+    alsaLib
+    glib
+    gnome3.libgudev
+    gtk3
+    hicolor-icon-theme
+    libinput
+    libnl
+    librsvg
+    pulseaudio
+  ];
+
+  postPatch = ''
+    patchShebangs .
+
+    sed -i network/nm_generator/Makefile -e 's,/usr/share/gir-1.0/NM-1.0.gir,${networkmanager.dev}/share/gir-1.0/NM-1.0.gir,'
+
+    sed -i -e "s|{DESTDIR}/etc|{DESTDIR}$out/etc|" Makefile
+    sed -i -e "s|{DESTDIR}/var|{DESTDIR}$out/var|" Makefile
+    sed -i -e "s|{DESTDIR}/lib|{DESTDIR}$out/lib|" Makefile
+
+    find -type f -exec sed -i -e "s,/usr/lib/deepin-daemon,$out/lib/deepin-daemon," {} +
+  '';
+
+  buildPhase = ''
+    make -C go/src/${goPackagePath}
+    # compilation of the nm module is failing
+    #make -C go/src/${goPackagePath}/network/nm_generator gen-nm-code
+  '';
+
+  installPhase = ''
+    make install PREFIX="$out" -C go/src/${goPackagePath}
+    remove-references-to -t ${go} $out/lib/deepin-daemon/*
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Daemon for handling Deepin Desktop Environment session settings";
+    homepage = https://github.com/linuxdeepin/dde-daemon;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-daemon/deps.nix b/nixpkgs/pkgs/desktops/deepin/dde-daemon/deps.nix
new file mode 100644
index 000000000000..3d241baa3260
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-daemon/deps.nix
@@ -0,0 +1,111 @@
+# This file was generated by https://github.com/kamilchm/go2nix v1.2.1
+[
+  {
+    goPackagePath = "github.com/alecthomas/template";
+    fetch = {
+      type = "git";
+      url = "https://github.com/alecthomas/template";
+      rev = "a0175ee3bccc567396460bf5acd36800cb10c49c";
+      sha256 = "0qjgvvh26vk1cyfq9fadyhfgdj36f1iapbmr5xp6zqipldz8ffxj";
+    };
+  }
+  {
+    goPackagePath = "github.com/alecthomas/units";
+    fetch = {
+      type = "git";
+      url = "https://github.com/alecthomas/units";
+      rev = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a";
+      sha256 = "1j65b91qb9sbrml9cpabfrcf07wmgzzghrl7809hjjhrmbzri5bl";
+    };
+  }
+  {
+    goPackagePath = "github.com/axgle/mahonia";
+    fetch = {
+      type = "git";
+      url = "https://github.com/axgle/mahonia";
+      rev = "3358181d7394e26beccfae0ffde05193ef3be33a";
+      sha256 = "0b8wsrxmv8a0cqbnsg55lpf29pxy2zw8azvgh3ck664lqpcfybhq";
+    };
+  }
+  {
+    goPackagePath = "github.com/cryptix/wav";
+    fetch = {
+      type = "git";
+      url = "https://github.com/cryptix/wav";
+      rev = "8bdace674401f0bd3b63c65479b6a6ff1f9d5e44";
+      sha256 = "18nyqv0ic35fs9fny8sj84c00vbxs8mnric6vr6yl42624fh5id6";
+    };
+  }
+  {
+    goPackagePath = "github.com/linuxdeepin/go-x11-client";
+    fetch = {
+      type = "git";
+      url = "https://github.com/linuxdeepin/go-x11-client";
+      rev = "03541136501cab4910ad8852fe749ef8e18907ca";
+      sha256 = "1iiw8qclpklim81hz1sdjp2ajw0ljvjz19n9jly86nbw6m8x4gkp";
+    };
+  }
+  {
+    goPackagePath = "github.com/msteinert/pam";
+    fetch = {
+      type = "git";
+      url = "https://github.com/msteinert/pam";
+      rev = "f4cd9f5e29232537a12db1678f48c702ad6896b7";
+      sha256 = "1vjawxswy3f23v4d72kk95y3b557580670ai9ffvrwy6wy85qync";
+    };
+  }
+  {
+    goPackagePath = "github.com/nfnt/resize";
+    fetch = {
+      type = "git";
+      url = "https://github.com/nfnt/resize";
+      rev = "83c6a9932646f83e3267f353373d47347b6036b2";
+      sha256 = "005cpiwq28krbjf0zjwpfh63rp4s4is58700idn24fs3g7wdbwya";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/image";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/image";
+      rev = "69cc3646b96e61de0b417f4815b86c36e65783ee";
+      sha256 = "0nkywb3r0qvwkmykpswnf0svxi463ycn293y5jjididzxv9qxdp9";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/net";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/net";
+      rev = "c44066c5c816ec500d459a2a324a753f78531ae0";
+      sha256 = "0mgww74bl15d0jvsh4f3qr1ckjzb8icb8hn0mgs5ppa0b2fgpc4f";
+    };
+  }
+  {
+    goPackagePath = "golang.org/x/text";
+    fetch = {
+      type = "git";
+      url = "https://go.googlesource.com/text";
+      rev = "6f44c5a2ea40ee3593d98cdcc905cc1fdaa660e2";
+      sha256 = "00mwzxly5isgf0glz7k3k2dkyqkjfc4z55qxajx4lgcp3h8xn9xj";
+    };
+  }
+  {
+    goPackagePath = "gopkg.in/alecthomas/kingpin.v2";
+    fetch = {
+      type = "git";
+      url = "https://gopkg.in/alecthomas/kingpin.v2";
+      rev = "947dcec5ba9c011838740e680966fd7087a71d0d";
+      sha256 = "0mndnv3hdngr3bxp7yxfd47cas4prv98sqw534mx7vp38gd88n5r";
+    };
+  }
+  {
+    goPackagePath = "pkg.deepin.io/lib";
+    fetch = {
+      type = "git";
+      url = "https://github.com/linuxdeepin/go-lib.git";
+      rev = "b199d0dc96e979398ea3985334ccf9c20236d1a7";
+      sha256 = "0g84v1adnnyqc1mv45n3wlvnivkm1fi8ywszzgwx8irl3iddfvxv";
+    };
+  }
+]
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-qt-dbus-factory/default.nix b/nixpkgs/pkgs/desktops/deepin/dde-qt-dbus-factory/default.nix
new file mode 100644
index 000000000000..f28d8f77b3c3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-qt-dbus-factory/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, python, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dde-qt-dbus-factory";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0cz55hsbhy1ab1mndv0sp6xnqrhz2y66w7pcxy8v9k87ii32czf8";
+  };
+
+  nativeBuildInputs = [
+    qmake
+    python
+  ];
+
+  postPatch = ''
+    sed -i libdframeworkdbus/{DFrameworkdbusConfig.in,libdframeworkdbus.pro} \
+      -e "s,/usr,$out,"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Qt DBus interface library for Deepin software";
+    homepage = https://github.com/linuxdeepin/dde-qt-dbus-factory;
+    license = with licenses; [ gpl3Plus lgpl2Plus ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dde-session-ui/default.nix b/nixpkgs/pkgs/desktops/deepin/dde-session-ui/default.nix
new file mode 100644
index 000000000000..d3970cf87108
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dde-session-ui/default.nix
@@ -0,0 +1,62 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, qtsvg, qttools,
+  qtx11extras, xkeyboard_config, xorg, lightdm_qt, gsettings-qt,
+  dde-qt-dbus-factory, deepin-gettext-tools, dtkcore, dtkwidget,
+  hicolor-icon-theme, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dde-session-ui";
+  version = "4.6.2";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "1fxlrj7vv7nqllwpwc8mxiv9bfqcj9b2qwkpjaq326pfmg5p5lhq";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+    qttools
+    deepin-gettext-tools
+  ];
+
+  buildInputs = [
+    dde-qt-dbus-factory
+    dtkcore
+    dtkwidget
+    gsettings-qt
+    lightdm_qt
+    qtsvg
+    qtx11extras
+    xorg.libXcursor
+    xorg.libXrandr
+    xorg.libXtst
+    xkeyboard_config
+    hicolor-icon-theme
+  ];
+
+  postPatch = ''
+    patchShebangs .
+    sed -i translate_desktop.sh -e "s,/usr/bin/deepin-desktop-ts-convert,deepin-desktop-ts-convert,"
+    find -type f -exec sed -i -e "s,path = /etc,path = $out/etc," {} +
+    find -type f -exec sed -i -e "s,path = /usr,path = $out," {} +
+    find -type f -exec sed -i -e "s,Exec=/usr,Exec=$out," {} +
+    find -type f -exec sed -i -e "s,/usr/share/dde-session-ui,$out/share/dde-session-ui," {} +
+    sed -i global_util/xkbparser.h -e "s,/usr/share/X11/xkb/rules/base.xml,${xkeyboard_config}/share/X11/xkb/rules/base.xml,"
+    sed -i lightdm-deepin-greeter/scripts/lightdm-deepin-greeter -e "s,/usr/bin/lightdm-deepin-greeter,$out/bin/lightdm-deepin-greeter,"
+    # fix default background url
+    sed -i widgets/*.cpp boxframe/*.cpp -e 's,/usr/share/backgrounds/default_background.jpg,/usr/share/backgrounds/deepin/desktop.jpg,'
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin desktop-environment - Session UI module";
+    homepage = https://github.com/linuxdeepin/dde-session-ui;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-desktop-base/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-desktop-base/default.nix
new file mode 100644
index 000000000000..80a368c5be99
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-desktop-base/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchFromGitHub, deepin-wallpapers, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-desktop-base";
+  version = "2018.10.29";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0l2zb7rpag2q36lqsgvirhjgmj7w243nsi1rywkypf2xm7g2v235";
+  };
+
+  buildInputs = [ deepin-wallpapers ];
+
+  postPatch = ''
+    sed -i Makefile -e "s:/usr:$out:" -e "s:/etc:$out/etc:"
+  '';
+
+  postInstall = ''
+    # Remove Deepin distro's lsb-release
+    rm $out/etc/lsb-release
+
+    # Don't override systemd timeouts
+    rm -r $out/etc/systemd
+
+    # Remove apt-specific templates
+    rm -r $out/share/python-apt
+
+    # Remove empty backgrounds directory
+    rm -r $out/share/backgrounds
+
+    # Make a symlink for deepin-version
+    ln -s ../lib/deepin/desktop-version $out/etc/deepin-version
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Base assets and definitions for Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/deepin-desktop-base;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-desktop-schemas/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-desktop-schemas/default.nix
new file mode 100644
index 000000000000..d2b70ec4a896
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-desktop-schemas/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchFromGitHub, python, deepin-gtk-theme,
+  deepin-icon-theme, deepin-sound-theme, deepin-wallpapers, gnome3,
+  deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-desktop-schemas";
+  version = "3.4.0";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "10x0rh9z925yzyp8h0vgmg4313smvran06lvr12c3931qkmkzwgq";
+  };
+
+  nativeBuildInputs = [
+    python
+  ];
+
+  buildInputs = [
+    gnome3.dconf
+    deepin-gtk-theme
+    deepin-icon-theme
+    deepin-sound-theme
+    deepin-wallpapers
+  ];
+
+  postPatch = ''
+    # fix default background url
+    sed -i '/picture-uri/s|/usr/share/backgrounds/default_background.jpg|$out/share/backgrounds/deepin/default.png|' \
+      overrides/common/com.deepin.wrap.gnome.desktop.override
+  '';
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "GSettings deepin desktop-wide schemas";
+    homepage = https://github.com/linuxdeepin/deepin-desktop-schemas;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-gettext-tools/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-gettext-tools/default.nix
new file mode 100644
index 000000000000..779fae6a113e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-gettext-tools/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchFromGitHub, gettext, python3Packages, perlPackages, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-gettext-tools";
+  version = "1.0.8";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "03cwa82dd14a31v44jd3z0kpiri6g21ar4f48s8ph78nvjy55880";
+  };
+
+  nativeBuildInputs = [
+    python3Packages.wrapPython
+  ];
+
+  buildInputs = [
+    gettext
+    perlPackages.perl
+    perlPackages.XMLLibXML
+    perlPackages.ConfigTiny
+    python3Packages.python
+  ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postPatch = ''
+    sed -e 's/sudo cp/cp/' -i src/generate_mo.py
+  '';
+
+  postFixup = ''
+    wrapPythonPrograms
+    wrapPythonProgramsIn "$out/lib/${pname}"
+    wrapProgram $out/bin/deepin-desktop-ts-convert --set PERL5LIB $PERL5LIB
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin Internationalization utilities";
+    homepage = https://github.com/linuxdeepin/deepin-gettext-tools;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-gtk-theme/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-gtk-theme/default.nix
new file mode 100644
index 000000000000..8d11ca8bf42a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-gtk-theme/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub, gtk-engine-murrine, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-gtk-theme";
+  version = "17.10.10";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = "deepin-gtk-theme";
+    rev = version;
+    sha256 = "0vwly24cvjwhvda7g3l595vpf99d2z7b2zr0q5kna4df4iql7vn4";
+  };
+
+  propagatedUserEnvPkgs = [ gtk-engine-murrine ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin GTK Theme";
+    homepage = https://github.com/linuxdeepin/deepin-gtk-theme;
+    license = licenses.lgpl3;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-icon-theme/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-icon-theme/default.nix
new file mode 100644
index 000000000000..ef4574206019
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-icon-theme/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, gtk3, papirus-icon-theme, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-icon-theme";
+  version = "15.12.64";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0z1yrp6yg2hb67azrbd9ac743jjh83vxdf2j0mmv2lfpd4fqw8qc";
+  };
+
+  nativeBuildInputs = [ gtk3 papirus-icon-theme ];
+
+  postPatch = ''
+    patchShebangs .
+
+    # install in $out
+    sed -i -e "s|/usr|$out|g" Makefile tools/hicolor.links
+
+    # keep icon-theme.cache
+    sed -i -e 's|\(-rm -f .*/icon-theme.cache\)|# \1|g' Makefile
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Icons for the Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/deepin-icon-theme;
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-image-viewer/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-image-viewer/default.nix
new file mode 100644
index 000000000000..0b08f7cd39a0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-image-viewer/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, qttools, qtsvg,
+  qtx11extras, dtkcore, dtkwidget, qt5integration, freeimage, libraw,
+  libexif, deepin
+}:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-image-viewer";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0dxdvm6hzj6izfxka35za8y7vacd06nksfgzx6xsv7ywzagri4k5";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+    qttools
+  ];
+
+  buildInputs = [
+    qtsvg
+    qtx11extras
+    dtkcore
+    dtkwidget
+    qt5integration
+    freeimage
+    libraw
+    libexif
+  ];
+
+  postPatch = ''
+    patchShebangs .
+    sed -i qimage-plugins/freeimage/freeimage.pro \
+           qimage-plugins/libraw/libraw.pro \
+      -e "s,\$\$\[QT_INSTALL_PLUGINS\],$out/$qtPluginPrefix,"
+    sed -i viewer/com.deepin.ImageViewer.service \
+      -e "s,/usr,$out,"
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Image Viewer for Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/deepin-image-viewer;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    badPlatforms = [ "aarch64-linux" ]; # See https://github.com/NixOS/nixpkgs/pull/46463#issuecomment-420274189
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-menu/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-menu/default.nix
new file mode 100644
index 000000000000..645abfedad71
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-menu/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, dtkcore, dtkwidget,
+  qt5integration, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-menu";
+  version = "3.4.1";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0aga4d4qwd7av6aa4cynhk0sidns7m7y6x0rq1swnkpr9ksr80gi";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+  ];
+
+  buildInputs = [
+    dtkcore
+    dtkwidget
+    qt5integration
+  ];
+
+  postPatch = ''
+    sed -i deepin-menu.pro -e "s,/usr,$out,"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin menu service";
+    homepage = https://github.com/linuxdeepin/deepin-menu;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-metacity/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-metacity/default.nix
new file mode 100644
index 000000000000..78b6303188a2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-metacity/default.nix
@@ -0,0 +1,64 @@
+{ stdenv, fetchFromGitHub, pkgconfig, intltool, libtool, gnome3, bamf,
+  json-glib, libcanberra-gtk3, libxkbcommon, libstartup_notification,
+  deepin-wallpapers, deepin-desktop-schemas, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-metacity";
+  version = "3.22.22";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0gr10dv8vphla6z7zqiyyg3n3ag4rrlz43c4kr7fd5xwx2bfvp3d";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    libtool
+    gnome3.gnome-common
+    gnome3.glib.dev
+  ];
+
+  buildInputs = [
+    gnome3.dconf
+    gnome3.gtk
+    gnome3.libgtop
+    gnome3.zenity
+    bamf
+    json-glib
+    libcanberra-gtk3
+    libstartup_notification
+    libxkbcommon
+    deepin-wallpapers
+    deepin-desktop-schemas
+  ];
+
+  postPatch = ''
+    sed -i src/ui/deepin-background-cache.c \
+      -e 's;/usr/share/backgrounds/default_background.jpg;${deepin-wallpapers}/share/backgrounds/deepin/desktop.jpg;'
+  '';
+
+  NIX_CFLAGS_COMPILE = "-I${gnome3.glib.dev}/include/gio-unix-2.0";
+
+  configureFlags = [ "--disable-themes-documentation" ];
+
+  preConfigure = ''
+    HOME=$TMP
+    NOCONFIGURE=1 ./autogen.sh
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "2D window manager for Deepin";
+    homepage = https://github.com/linuxdeepin/deepin-metacity;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-movie-reborn/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-movie-reborn/default.nix
new file mode 100644
index 000000000000..3d195f8f1c0c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-movie-reborn/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, qttools, qtx11extras,
+  dtkcore, dtkwidget, ffmpeg, ffmpegthumbnailer, mpv, pulseaudio,
+  libdvdnav, libdvdread, xorg, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-movie-reborn";
+  version = "3.2.14";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "1i9sdg2p6qp57rqzrnjbxnqj3mg1qggzyq3yykw271vs8h85a707";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    qttools
+  ];
+
+  buildInputs = [
+    dtkcore
+    dtkwidget
+    ffmpeg
+    ffmpegthumbnailer
+    libdvdnav
+    libdvdread
+    mpv
+    pulseaudio
+    qtx11extras
+    xorg.libXdmcp
+    xorg.libXtst
+    xorg.libpthreadstubs
+    xorg.xcbproto
+  ];
+
+  NIX_LDFLAGS = "-ldvdnav";
+
+  postPatch = ''
+    sed -i src/CMakeLists.txt -e "s,/usr/lib/dtk2,${dtkcore}/lib/dtk2,"
+    sed -i src/libdmr/libdmr.pc.in -e "s,/usr,$out," -e 's,libdir=''${prefix}/,libdir=,'
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin movie player";
+    homepage = https://github.com/linuxdeepin/deepin-movie-reborn;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-mutter/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-mutter/default.nix
new file mode 100644
index 000000000000..be845d3c6bac
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-mutter/default.nix
@@ -0,0 +1,62 @@
+{ stdenv, fetchFromGitHub, pkgconfig, intltool, libtool, gnome3, xorg,
+  libcanberra-gtk3, upower, xkeyboard_config, libxkbcommon,
+  libstartup_notification, libinput, cogl, clutter, systemd, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-mutter";
+  version = "3.20.35";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0mwk06kgw8qp8rg1j6px1zlya4x5rr9llax0qks59j56b3m9yim7";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    libtool
+    gnome3.gnome-common
+  ];
+
+  buildInputs = [
+    gnome3.gtk
+    gnome3.gnome-desktop
+    gnome3.gsettings-desktop-schemas
+    gnome3.libgudev
+    gnome3.zenity
+    upower
+    xorg.libxkbfile
+    libxkbcommon
+    libcanberra-gtk3
+    libstartup_notification
+    libinput
+    xkeyboard_config
+    cogl
+    clutter
+    systemd
+  ];
+
+  enableParallelBuilding = true;
+
+  configureFlags = [
+    "--enable-native-backend"
+    "--enable-compile-warnings=minimum"
+  ];
+
+  preConfigure = ''
+    NOCONFIGURE=1 ./autogen.sh
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Base window manager for deepin, fork of gnome mutter";
+    homepage = https://github.com/linuxdeepin/deepin-mutter;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-shortcut-viewer/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-shortcut-viewer/default.nix
new file mode 100644
index 000000000000..737c99261f9d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-shortcut-viewer/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, dtkcore, dtkwidget,
+  qt5integration, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-shortcut-viewer";
+  version = "1.3.5";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "13vz8kjdqkrhgpvdgrvwn62vwzbyqp88hjm5m4rcqg3bh56709ma";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+  ];
+
+  buildInputs = [
+    dtkcore
+    dtkwidget
+    qt5integration
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Pop-up shortcut viewer for Deepin applications";
+    homepage = https://github.com/linuxdeepin/deepin-shortcut-viewer;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-sound-theme/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-sound-theme/default.nix
new file mode 100644
index 000000000000..bb004372497f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-sound-theme/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-sound-theme";
+  version = "15.10.3";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = "deepin-sound-theme";
+    rev = version;
+    sha256 = "1sw4nrn7q7wk1hpicm05apyc0mihaw42iqm52wb8ib8gm1qiylr9";
+  };
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin sound theme";
+    homepage = https://github.com/linuxdeepin/deepin-sound-theme;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-terminal/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-terminal/default.nix
new file mode 100644
index 000000000000..70e15441436d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-terminal/default.nix
@@ -0,0 +1,71 @@
+{ stdenv, fetchurl, fetchFromGitHub, pkgconfig, cmake, ninja, vala,
+  gettext, gobject-introspection, at-spi2-core, dbus, epoxy, expect,
+  gtk3, json-glib, libXdmcp, libgee, libpthreadstubs, librsvg,
+  libsecret, libtasn1, libxcb, libxkbcommon, p11-kit, pcre, vte, wnck,
+  deepin-menu, deepin-shortcut-viewer, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-terminal";
+  version = "3.0.10.2";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = "deepin-terminal";
+    rev = version;
+    sha256 = "0ylhp8q9kfdq9l69drawjaf0q8vcqyflb2a3zfnwbnf06dlpvkz6";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    cmake
+    ninja
+    vala
+    gettext
+    gobject-introspection # For setup hook
+  ];
+
+  buildInputs = [
+    at-spi2-core
+    dbus
+    deepin-menu
+    deepin-shortcut-viewer
+    epoxy
+    expect
+    gtk3
+    json-glib
+    libXdmcp
+    libgee
+    libpthreadstubs
+    librsvg
+    libsecret
+    libtasn1
+    libxcb
+    libxkbcommon
+    p11-kit
+    pcre
+    vte
+    wnck
+  ];
+
+  postPatch = ''
+    patchShebangs .
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "The default terminal emulation for Deepin";
+    longDescription = ''
+      Deepin terminal, it sharpens your focus in the world of command line!
+      It is an advanced terminal emulator with workspace, multiple
+      windows, remote management, quake mode and other features.
+     '';
+    homepage = https://github.com/linuxdeepin/deepin-terminal;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-wallpapers/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-wallpapers/default.nix
new file mode 100644
index 000000000000..8f04bd482184
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-wallpapers/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchFromGitHub, dde-api, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-wallpapers";
+  version = "1.7.5";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = "deepin-wallpapers";
+    rev = version;
+    sha256 = "0mfjkh81ci0gjwmgycrh32by7v9b73nyvyjbqd29ccpb8bpyyakn";
+  };
+
+  nativeBuildInputs = [ dde-api.bin ];
+
+  postPatch = ''
+    sed -i -e "s:/usr/lib/deepin-api:${dde-api.bin}/lib/deepin-api:" Makefile
+    sed -i -e "s:/usr/share/wallpapers:$out/share/wallpapers:" Makefile
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/wallpapers/deepin
+    cp -a deepin/* deepin-community/* deepin-private/* $out/share/wallpapers/deepin
+    mkdir -p $out/var/cache
+    cp -a image-blur $out/var/cache
+    
+    # Suggested by upstream
+    mkdir -p $out/share/backgrounds/deepin
+    ln -s ../../wallpapers/deepin/Hummingbird_by_Shu_Le.jpg $out/share/backgrounds/deepin/desktop.jpg
+    ln -s $(echo -n $out/share/wallpapers/deepin/Hummingbird_by_Shu_Le.jpg | md5sum | cut -d " " -f 1).jpg \
+      $out/var/cache/image-blur/$(echo -n $out/share/backgrounds/deepin/desktop.jpg | md5sum | cut -d " " -f 1).jpg
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Wallpapers for Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/deepin-wallpapers;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/deepin-wm/default.nix b/nixpkgs/pkgs/desktops/deepin/deepin-wm/default.nix
new file mode 100644
index 000000000000..ea2f06aae607
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/deepin-wm/default.nix
@@ -0,0 +1,60 @@
+{ stdenv, fetchFromGitHub, pkgconfig, intltool, libtool, vala, gnome3,
+  bamf, clutter-gtk, pantheon, libcanberra-gtk3, libwnck3,
+  deepin-mutter, deepin-wallpapers, deepin-desktop-schemas,
+  hicolor-icon-theme, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "deepin-wm";
+  version = "1.9.34";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "13hydcalifdc6723k8l4pk905y9sxic5x1fqww0fyx7j6b3hm13f";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    libtool
+    gnome3.gnome-common
+    vala
+  ];
+
+  buildInputs = [
+    gnome3.gnome-desktop
+    gnome3.libgee
+    bamf
+    clutter-gtk
+    pantheon.granite
+    libcanberra-gtk3
+    libwnck3
+    deepin-mutter
+    deepin-wallpapers
+    deepin-desktop-schemas
+    hicolor-icon-theme
+  ];
+
+  postPatch = ''
+    sed -i src/Background/BackgroundSource.vala \
+      -e 's;/usr/share/backgrounds/default_background.jpg;${deepin-wallpapers}/share/backgrounds/deepin/desktop.jpg;'
+  '';
+
+  preConfigure = ''
+    ./autogen.sh
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin Window Manager";
+    homepage = https://github.com/linuxdeepin/deepin-wm;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/default.nix b/nixpkgs/pkgs/desktops/deepin/default.nix
new file mode 100644
index 000000000000..4fe787bc5d4b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/default.nix
@@ -0,0 +1,44 @@
+{ pkgs, makeScope, libsForQt5 }:
+
+let
+  packages = self: with self; {
+    updateScript = callPackage ./update.nix { };
+
+    dbus-factory = callPackage ./dbus-factory { };
+    dde-api = callPackage ./dde-api { };
+    dde-calendar = callPackage ./dde-calendar { };
+    dde-daemon = callPackage ./dde-daemon { };
+    dde-qt-dbus-factory = callPackage ./dde-qt-dbus-factory { };
+    dde-session-ui = callPackage ./dde-session-ui { };
+    deepin-desktop-base = callPackage ./deepin-desktop-base { };
+    deepin-desktop-schemas = callPackage ./deepin-desktop-schemas { };
+    deepin-gettext-tools = callPackage ./deepin-gettext-tools { };
+    deepin-gtk-theme = callPackage ./deepin-gtk-theme { };
+    deepin-icon-theme = callPackage ./deepin-icon-theme { };
+    deepin-image-viewer = callPackage ./deepin-image-viewer { };
+    deepin-menu = callPackage ./deepin-menu { };
+    deepin-metacity = callPackage ./deepin-metacity { };
+    deepin-movie-reborn = callPackage ./deepin-movie-reborn { };
+    deepin-mutter = callPackage ./deepin-mutter { };
+    deepin-shortcut-viewer = callPackage ./deepin-shortcut-viewer { };
+    deepin-sound-theme = callPackage ./deepin-sound-theme { };
+    deepin-terminal = callPackage ./deepin-terminal {
+      inherit (pkgs.gnome3) libgee;
+      wnck = pkgs.libwnck3;
+    };
+    deepin-wallpapers = callPackage ./deepin-wallpapers { };
+    deepin-wm = callPackage ./deepin-wm { };
+    dtkcore = callPackage ./dtkcore { };
+    dtkwm = callPackage ./dtkwm { };
+    dtkwidget = callPackage ./dtkwidget { };
+    go-dbus-factory = callPackage ./go-dbus-factory { };
+    go-dbus-generator = callPackage ./go-dbus-generator { };
+    go-gir-generator = callPackage ./go-gir-generator { };
+    go-lib = callPackage ./go-lib { };
+    qt5dxcb-plugin = callPackage ./qt5dxcb-plugin { };
+    qt5integration = callPackage ./qt5integration { };
+
+  };
+
+in
+  makeScope libsForQt5.newScope packages
diff --git a/nixpkgs/pkgs/desktops/deepin/dtkcore/default.nix b/nixpkgs/pkgs/desktops/deepin/dtkcore/default.nix
new file mode 100644
index 000000000000..9904c58128f5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dtkcore/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, gsettings-qt, pythonPackages, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dtkcore";
+  version = "2.0.9.8";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "06jj5gpy2qbmc21nf0fnbvgw7nbjjgvzx7m2vg9byw5il8l4g22h";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+    pythonPackages.wrapPython
+  ];
+
+  buildInputs = [
+    gsettings-qt
+  ];
+
+  postPatch = ''
+    # Only define QT_HOST_DATA if it is empty
+    sed '/QT_HOST_DATA=/a }' -i src/dtk_module.prf
+    sed '/QT_HOST_DATA=/i isEmpty(QT_HOST_DATA) {' -i src/dtk_module.prf
+
+    # Fix shebang
+    sed -i tools/script/dtk-translate.py -e "s,#!env,#!/usr/bin/env,"
+  '';
+
+  preConfigure = ''
+    qmakeFlags="$qmakeFlags QT_HOST_DATA=$out"
+  '';
+
+  postFixup = ''
+    chmod +x $out/lib/dtk2/*.py
+    wrapPythonProgramsIn "$out/lib/dtk2" "$out $pythonPath"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin tool kit core modules";
+    homepage = https://github.com/linuxdeepin/dtkcore;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dtkwidget/default.nix b/nixpkgs/pkgs/desktops/deepin/dtkwidget/default.nix
new file mode 100644
index 000000000000..b61f31e40ee9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dtkwidget/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, qttools, qtmultimedia,
+  qtsvg, qtx11extras, librsvg, libstartup_notification, gsettings-qt,
+  dde-qt-dbus-factory, dtkcore, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dtkwidget";
+  version = "2.0.9.10";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0757dzy82bfv97b1gzkwa9zx3jzfbap20v3r1h7lkfcfw95410iw";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+    qttools
+  ];
+
+  buildInputs = [
+    qtmultimedia
+    qtsvg
+    qtx11extras
+    librsvg
+    libstartup_notification
+    gsettings-qt
+    dde-qt-dbus-factory
+    dtkcore
+  ];
+
+  preConfigure = ''
+    qmakeFlags="$qmakeFlags \
+      INCLUDE_INSTALL_DIR=$out/include \
+      LIB_INSTALL_DIR=$out/lib \
+      QT_HOST_DATA=$out"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin graphical user interface library";
+    homepage = https://github.com/linuxdeepin/dtkwidget;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/dtkwm/default.nix b/nixpkgs/pkgs/desktops/deepin/dtkwm/default.nix
new file mode 100644
index 000000000000..7154ae3da6a9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/dtkwm/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, qtx11extras, dtkcore,
+  deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "dtkwm";
+  version = "2.0.9";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0vkx6vlz83pgawhdwqkwpq3dy8whxmjdzfpgrvm2m6jmspfk9bab";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+  ];
+
+  buildInputs = [
+    dtkcore
+    qtx11extras
+  ];
+
+  preConfigure = ''
+    qmakeFlags="$qmakeFlags \
+      QT_HOST_DATA=$out \
+      INCLUDE_INSTALL_DIR=$out/include \
+      LIB_INSTALL_DIR=$out/lib"
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Deepin graphical user interface library";
+    homepage = https://github.com/linuxdeepin/dtkwm;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/go-dbus-factory/default.nix b/nixpkgs/pkgs/desktops/deepin/go-dbus-factory/default.nix
new file mode 100644
index 000000000000..01d504eda896
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/go-dbus-factory/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchFromGitHub, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "go-dbus-factory";
+  version = "0.0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0gj2xxv45gh7wr5ry3mcsi46kdsyq9nbd7znssn34kapiv40ixcx";
+  };
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postPatch = ''
+    sed -i -e 's:/share/gocode:/share/go:' Makefile
+  '';
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "GoLang DBus factory for the Deepin Desktop Environment";
+    homepage = https://github.com/linuxdeepin/go-dbus-factory;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/go-dbus-generator/default.nix b/nixpkgs/pkgs/desktops/deepin/go-dbus-generator/default.nix
new file mode 100644
index 000000000000..28873d8459ec
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/go-dbus-generator/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchFromGitHub, go, go-lib, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "go-dbus-generator";
+  version = "0.6.6";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "17rzicqizyyrhjjf4rild7py1cyd07b2zdcd9nabvwn4gvj6lhfb";
+  };
+
+  nativeBuildInputs = [
+    go
+    go-lib
+  ];
+
+  makeFlags = [
+    "PREFIX=$(out)"
+    "GOCACHE=off"
+  ];
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Convert dbus interfaces to go-lang or qml wrapper code";
+    homepage = https://github.com/linuxdeepin/go-dbus-generator;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/go-gir-generator/default.nix b/nixpkgs/pkgs/desktops/deepin/go-gir-generator/default.nix
new file mode 100644
index 000000000000..d33837b21c31
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/go-gir-generator/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchFromGitHub, pkgconfig, go, gobject-introspection,
+  libgudev, deepin, fetchurl }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "go-gir-generator";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0grp4ffy3vmlknzmymnxq1spwshff2ylqsw82pj4y2v2fcvnqfvb";
+  };
+
+  patches = [
+    # fix: dde-api build error with gobject-introspection 1.58+
+    (fetchurl {
+      url = https://github.com/linuxdeepin/go-gir-generator/commit/a7ab229201e28d1be727f5021b3588fa4a1acf5f.patch;
+      sha256 = "13ywalwkjg8wwvd0pvmc2rv1h38airyvimdn9jfb5wis9xm48401";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+    go
+  ];
+
+  buildInputs = [
+    gobject-introspection
+    libgudev
+  ];
+
+  postPatch = ''
+    sed -i -e 's:/share/gocode:/share/go:' Makefile
+  '';
+
+  makeFlags = [
+    "PREFIX=$(out)"
+    "GOCACHE=off"
+  ];
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Generate static golang bindings for GObject";
+    homepage = https://github.com/linuxdeepin/go-gir-generator;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/go-lib/default.nix b/nixpkgs/pkgs/desktops/deepin/go-lib/default.nix
new file mode 100644
index 000000000000..684f1dd7f32d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/go-lib/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchFromGitHub, glib, xorg, gdk_pixbuf, pulseaudio,
+  mobile-broadband-provider-info, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "go-lib";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "0g84v1adnnyqc1mv45n3wlvnivkm1fi8ywszzgwx8irl3iddfvxv";
+  };
+
+  buildInputs = [
+    glib
+    xorg.libX11
+    gdk_pixbuf
+    pulseaudio
+    mobile-broadband-provider-info
+  ];
+
+  makeFlags = [
+    "PREFIX=$(out)"
+    "GOSITE_DIR=$(out)/share/go"
+  ];
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Go bindings for Deepin Desktop Environment development";
+    homepage = https://github.com/linuxdeepin/go-lib;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/qt5dxcb-plugin/default.nix b/nixpkgs/pkgs/desktops/deepin/qt5dxcb-plugin/default.nix
new file mode 100644
index 000000000000..c4ce0ca563bd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/qt5dxcb-plugin/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, qtx11extras, libSM,
+  mtdev, cairo, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "qt5dxcb-plugin";
+  version = "1.1.13";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "12lvh3agw3qdviqf32brmzba5kscnj5al5jhc08lq69a9kmip05x";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+  ];
+
+  buildInputs = [
+    qtx11extras
+    libSM
+    mtdev
+    cairo
+  ];
+
+  preConfigure = ''
+    qmakeFlags="$qmakeFlags INSTALL_PATH=$out/$qtPluginPrefix/platforms"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Qt platform theme integration plugin for DDE";
+    homepage = https://github.com/linuxdeepin/qt5dxcb-plugin;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/qt5integration/default.nix b/nixpkgs/pkgs/desktops/deepin/qt5integration/default.nix
new file mode 100644
index 000000000000..809156377225
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/qt5integration/default.nix
@@ -0,0 +1,53 @@
+{ stdenv, fetchFromGitHub, pkgconfig, qmake, mtdev, gsettings-qt ,
+  lxqt, qtx11extras, qtmultimedia, qtsvg, fontconfig, freetype ,
+  qt5dxcb-plugin, qtstyleplugins, dtkcore, dtkwidget, deepin }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "qt5integration";
+  version = "0.3.6";
+
+  src = fetchFromGitHub {
+    owner = "linuxdeepin";
+    repo = pname;
+    rev = version;
+    sha256 = "1v9whlqn07c5c8xnaiicdshj9n88a667gfbn8y8bk5bfylilfzcy";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    qmake
+  ];
+
+  buildInputs = [
+    dtkcore
+    dtkwidget
+    qt5dxcb-plugin
+    mtdev
+    lxqt.libqtxdg
+    qtstyleplugins
+    qtx11extras
+    qtmultimedia
+    qtsvg
+  ];
+
+  postPatch = ''
+    sed -i dstyleplugin/dstyleplugin.pro \
+           platformthemeplugin/qt5deepintheme-plugin.pro \
+           iconengineplugins/svgiconengine/svgiconengine.pro \
+           imageformatplugins/svg/svg.pro \
+      -e "s,\$\$\[QT_INSTALL_PLUGINS\],$out/$qtPluginPrefix,"
+  '';
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = deepin.updateScript { inherit name; };
+
+  meta = with stdenv.lib; {
+    description = "Qt platform theme integration plugins for DDE";
+    homepage = https://github.com/linuxdeepin/qt5integration;
+    license = with licenses; [ gpl3 lgpl2Plus bsd2 ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/deepin/update.nix b/nixpkgs/pkgs/desktops/deepin/update.nix
new file mode 100644
index 000000000000..22a6acb8ce31
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/deepin/update.nix
@@ -0,0 +1,38 @@
+{ stdenv, lib, writeScript, coreutils, curl, gnugrep, gnused, jq, common-updater-scripts, nix }:
+{ name, ignored-versions ? "^2014\\.|^v[0-9]+" }:
+
+let
+  nameAndVersion = builtins.parseDrvName name;
+  packageVersion = nameAndVersion.version;
+  packageName = nameAndVersion.name;
+  attrPath = "deepin.${packageName}";
+in
+
+writeScript "update-${packageName}" ''
+  #!${stdenv.shell}
+  set -o errexit
+  set -x
+
+  # search for the latest version of the package on github
+  PATH=${lib.makeBinPath [ common-updater-scripts coreutils curl gnugrep gnused jq ]}
+  tags=$(curl -s https://api.github.com/repos/linuxdeepin/${packageName}/tags)
+  tags=$(echo "$tags" | jq -r '.[] | .name')
+  echo "# ${name}" >> git-commits.txt
+  echo "#   available tags:" >> git-commits.txt
+  echo "$tags" | ${gnused}/bin/sed -e 's/^/#      /' >> git-commits.txt
+  if [ -n "${ignored-versions}" ]; then
+    tags=$(echo "$tags" | grep -vE "${ignored-versions}")
+  fi
+  latest_tag=$(echo "$tags" | sort --version-sort | tail -1)
+
+  # generate commands to commit the changes
+  if [ "${packageVersion}" != "$latest_tag" ]; then
+    pfile=$(EDITOR=echo ${nix}/bin/nix edit -f. ${attrPath})
+    echo "   git add $pfile " >> git-commits.txt
+    echo "   git commit -m \"${attrPath}: ${packageVersion} -> $latest_tag\"" >> git-commits.txt
+  fi
+
+  # update the nix expression
+  update-source-version "${attrPath}" "$latest_tag"
+  echo "" >> git-commits.txt
+''
diff --git a/nixpkgs/pkgs/desktops/enlightenment/default.nix b/nixpkgs/pkgs/desktops/enlightenment/default.nix
new file mode 100644
index 000000000000..a8b5e08abd65
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/default.nix
@@ -0,0 +1,14 @@
+{ callPackage, pkgs }:
+rec {
+  #### CORE EFL
+  efl = callPackage ./efl.nix { openjpeg = pkgs.openjpeg_1; };
+
+  #### WINDOW MANAGER
+  enlightenment = callPackage ./enlightenment.nix { };
+
+  #### APPLICATIONS
+  econnman = callPackage ./econnman.nix { };
+  terminology = callPackage ./terminology.nix { };
+  rage = callPackage ./rage.nix { };
+  ephoto = callPackage ./ephoto.nix { };
+}
diff --git a/nixpkgs/pkgs/desktops/enlightenment/econnman.nix b/nixpkgs/pkgs/desktops/enlightenment/econnman.nix
new file mode 100644
index 000000000000..60e63dc68ed9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/econnman.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, efl, python2Packages, dbus, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  name = "econnman-${version}";
+  version = "1.1";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/apps/econnman/${name}.tar.gz";
+    sha256 = "057pwwavlvrrq26bncqnfrf449zzaim0zq717xv86av4n940gwv0";
+  };
+
+  nativeBuildInputs = [ makeWrapper pkgconfig python2Packages.wrapPython ];
+
+  buildInputs = [ efl python2Packages.python dbus ];
+
+  pythonPath = [ python2Packages.pythonefl python2Packages.dbus-python ];
+
+  postInstall = ''
+    wrapPythonPrograms
+  '';
+
+  meta = {
+    description = "A user interface for the connman network connection manager";
+    homepage = http://enlightenment.org/;
+    maintainers = with stdenv.lib.maintainers; [ matejc tstrobel ftrvxmtrx ];
+    platforms = stdenv.lib.platforms.linux;
+    license = stdenv.lib.licenses.lgpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/enlightenment/efl-elua.patch b/nixpkgs/pkgs/desktops/enlightenment/efl-elua.patch
new file mode 100644
index 000000000000..96c42b3ff3ca
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/efl-elua.patch
@@ -0,0 +1,14 @@
+--- ./src/scripts/elua/core/util.lua.old	2015-05-17 11:59:57.307743243 +0200
++++ ./src/scripts/elua/core/util.lua	2015-05-17 12:39:11.906797377 +0200
+@@ -159,7 +159,10 @@
+         local ev = os.getenv("ELUA_" .. libname:upper() .. "_LIBRARY_PATH")
+         local succ, v = load_lib(libname, ev)
+         if not succ then
+-            error(v, 2)
++            succ, v = load_lib(libname, "$out/lib")
++            if not succ then
++                error(v, 2)
++            end
+         end
+         lib = v
+         loaded_libs[libname] = lib
diff --git a/nixpkgs/pkgs/desktops/enlightenment/efl.nix b/nixpkgs/pkgs/desktops/enlightenment/efl.nix
new file mode 100644
index 000000000000..ea4e6cd1f1c9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/efl.nix
@@ -0,0 +1,94 @@
+{ stdenv, fetchurl, pkgconfig, openssl, libjpeg, zlib, lz4, freetype, fontconfig
+, fribidi, SDL2, SDL, libGL, giflib, libpng, libtiff, glib, gst_all_1, libpulseaudio
+, libsndfile, xorg, libdrm, libxkbcommon, udev, utillinux, bullet, luajit
+, python27Packages, openjpeg, doxygen, expat, harfbuzz, jbig2dec, librsvg
+, dbus, alsaLib, poppler, ghostscript, libraw, libspectre, xineLib, libwebp
+, curl, libinput, systemd, mesa_noglu, writeText, gtk3
+}:
+
+stdenv.mkDerivation rec {
+  name = "efl-${version}";
+  version = "1.21.1";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/libs/efl/${name}.tar.xz";
+    sha256 = "0a5907h896pvpix7a6idc2fspzy6d78xrzf84k8y9fyvnd14nxs4";
+  };
+
+  nativeBuildInputs = [ pkgconfig gtk3 ];
+
+  buildInputs = [ openssl zlib lz4 freetype fontconfig SDL libGL mesa_noglu
+    giflib libpng libtiff glib gst_all_1.gstreamer gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good
+    gst_all_1.gst-libav libpulseaudio libsndfile xorg.libXcursor xorg.xorgproto
+    xorg.libX11 udev systemd ];
+
+  propagatedBuildInputs = [ libxkbcommon python27Packages.dbus-python dbus libjpeg xorg.libXcomposite
+    xorg.libXdamage xorg.libXinerama xorg.libXp xorg.libXtst xorg.libXi xorg.libXext
+    bullet xorg.libXScrnSaver xorg.libXrender xorg.libXfixes xorg.libXrandr
+    xorg.libxkbfile xorg.libxcb xorg.xcbutilkeysyms openjpeg doxygen expat luajit
+    harfbuzz jbig2dec librsvg dbus alsaLib poppler ghostscript libraw libspectre xineLib libwebp curl libdrm
+    libinput utillinux fribidi SDL2 ];
+
+  # as of 1.21.0 compilation will fail due to -Werror=format-security
+  hardeningDisable = [ "format" ];
+
+  # ac_ct_CXX must be set to random value, because then it skips some magic which does alternative searching for g++
+  configureFlags = [
+    "--enable-sdl"
+    "--enable-drm"
+    "--enable-elput"
+    "--with-opengl=full"
+    "--enable-image-loader-jp2k"
+    "--enable-xinput22"
+    "--enable-multisense"
+    "--enable-liblz4"
+    "--enable-systemd"
+    "--enable-image-loader-webp"
+    "--enable-harfbuzz"
+    "--enable-xine"
+    "--enable-fb"
+    "--disable-tslib"
+    "--with-systemdunitdir=$out/systemd/user"
+    "ac_ct_CXX=foo"
+  ];
+
+  patches = [ ./efl-elua.patch ];
+
+  # bin/edje_cc creates $HOME/.run, which would break build of reverse dependencies.
+  setupHook = writeText "setupHook.sh" ''
+    export HOME="$TEMPDIR"
+  '';
+
+  preConfigure = ''
+    export LD_LIBRARY_PATH="$(pwd)/src/lib/eina/.libs:$LD_LIBRARY_PATH"
+    source "$setupHook"
+  '';
+
+  NIX_CFLAGS_COMPILE = [ "-DluaL_reg=luaL_Reg" ]; # needed since luajit-2.1.0-beta3
+
+  postInstall = ''
+    substituteInPlace "$out/share/elua/core/util.lua" --replace '$out' "$out"
+    modules=$(for i in "$out/include/"*/; do printf ' -I''${includedir}/'`basename $i`; done)
+    substituteInPlace "$out/lib/pkgconfig/efl.pc" --replace 'Cflags: -I''${includedir}/efl-1' \
+      'Cflags: -I''${includedir}/eina-1/eina'"$modules"
+
+    # build icon cache
+    gtk-update-icon-cache "$out"/share/icons/Enlightenment-X
+  '';
+
+  # EFL applications depend on libcurl, although it is linked at
+  # runtime by hand in code (it is dlopened).
+  postFixup = ''
+    patchelf --add-needed ${curl.out}/lib/libcurl.so $out/lib/libecore_con.so
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "Enlightenment foundation libraries";
+    homepage = http://enlightenment.org/;
+    platforms = stdenv.lib.platforms.linux;
+    license = stdenv.lib.licenses.lgpl3;
+    maintainers = with stdenv.lib.maintainers; [ matejc tstrobel ftrvxmtrx ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/enlightenment/elementary.patch b/nixpkgs/pkgs/desktops/enlightenment/elementary.patch
new file mode 100644
index 000000000000..32080c81cb38
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/elementary.patch
@@ -0,0 +1,18 @@
+--- a/elementary.pc.in	2015-05-16 21:08:14.321148417 +0200
++++ b/elementary.pc.in	2015-05-16 21:08:30.643412725 +0200
+@@ -14,4 +14,4 @@
+ Requires.private: @requirement_elm_pc@
+ Version: @VERSION@
+ Libs: -L${libdir} -lelementary @ELEMENTARY_PC_LIBS@
+-Cflags: -I${includedir}/elementary-@VMAJ@
++Cflags: -I${includedir}/elementary-@VMAJ@ @ELEMENTARY_PC_CFLAGS@
+--- a/Makefile.am	2015-05-16 21:08:14.322148433 +0200
++++ b/Makefile.am	2015-05-16 21:08:30.643412725 +0200
+@@ -84,6 +84,7 @@
+ -e 's,@requirement_elm_pc\@,$(requirement_elm_pc),g' \
+ -e 's,@ELEMENTARY_LIBS\@,$(ELEMENTARY_LIBS),g' \
+ -e 's,@ELEMENTARY_PC_LIBS\@,$(ELEMENTARY_PC_LIBS),g' \
++-e 's,@ELEMENTARY_PC_CFLAGS\@,$(ELEMENTARY_PC_CFLAGS),g' \
+ < $< > $@ || rm $@
+ 
+ pc_verbose = $(pc_verbose_@AM_V@)
diff --git a/nixpkgs/pkgs/desktops/enlightenment/enlightenment.nix b/nixpkgs/pkgs/desktops/enlightenment/enlightenment.nix
new file mode 100644
index 000000000000..8edf702a24c6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/enlightenment.nix
@@ -0,0 +1,78 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, efl,
+  xcbutilkeysyms, libXrandr, libXdmcp, libxcb, libffi, pam, alsaLib,
+  luajit, bzip2, libpthreadstubs, gdbm, libcap, mesa_noglu,
+  xkeyboard_config, pcre
+}:
+
+stdenv.mkDerivation rec {
+  name = "enlightenment-${version}";
+  version = "0.22.4";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/apps/enlightenment/${name}.tar.xz";
+    sha256 = "0ygy891rrw5c7lhk539nhif77j88phvz2h0fhx172iaridy9kx2r";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    (pkgconfig.override { vanilla = true; })
+    gettext
+  ];
+
+  buildInputs = [
+    efl
+    libXdmcp
+    libxcb
+    xcbutilkeysyms
+    libXrandr
+    libffi
+    pam
+    alsaLib
+    luajit
+    bzip2
+    libpthreadstubs
+    gdbm
+    pcre
+    mesa_noglu
+    xkeyboard_config
+  ] ++
+    stdenv.lib.optionals stdenv.isLinux [ libcap ];
+
+  patches = [
+    # Some programs installed by enlightenment (to set the cpu frequency,
+    # for instance) need root ownership and setuid/setgid permissions, which
+    # are not allowed for files in /nix/store. Instead of allowing the
+    # installer to try to do this, the file $out/e-wrappers.nix is created,
+    # containing the needed configuration for wrapping those programs. It
+    # can be used in the enlightenment module. The idea is:
+    # 
+    #  1) rename the original binary adding the extension .orig
+    #  2) wrap the renamed binary at /run/wrappers/bin/
+    #  3) create a new symbolic link using the original binary name (in the
+    #     original directory where enlightenment wants it) pointing to the
+    #     wrapper
+
+    ./enlightenment.suid-exes.patch
+  ];
+
+  postPatch = ''
+    # edge_cc is a binary provided by efl and cannot be found at the directory
+    # given by e_prefix_bin_get(), which is $out/bin
+
+    substituteInPlace src/bin/e_import_config_dialog.c \
+      --replace "e_prefix_bin_get()" "\"${efl}/bin\""
+  '';
+
+  mesonFlags = [ "-Dsystemdunitdir=lib/systemd/user" ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "The Compositing Window Manager and Desktop Shell";
+    homepage = https://www.enlightenment.org;
+    license = licenses.bsd2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ matejc tstrobel ftrvxmtrx romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/enlightenment/enlightenment.suid-exes.patch b/nixpkgs/pkgs/desktops/enlightenment/enlightenment.suid-exes.patch
new file mode 100644
index 000000000000..f53f6ffa7ca8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/enlightenment.suid-exes.patch
@@ -0,0 +1,25 @@
+--- enlightenment-0.22.0.orig/meson/meson_inst.sh	2017-09-25 10:55:43.000000000 -0300
++++ enlightenment-0.22.0/meson/meson_inst.sh	2017-11-15 08:31:03.336844920 -0200
+@@ -1,6 +1,19 @@
+-#!/bin/sh
++#!/bin/sh -x
++
++w="$out"/e-wrappers.nix
++
++echo "# Wrappers for programs installed by enlightenment that should be setuid" > $w
++echo "" >> $w
++echo "{" >> $w
++echo "  security.wrappers = {" >> $w
+ 
+ for x in "$@" ; do
+-	chown root "$DESTDIR/$x"
+-	chmod a=rx,u+xs "$DESTDIR/$x"
++	f="$DESTDIR$x";
++	b=$(basename "$f".orig)
++	mv -v "$f" "$f".orig
++	ln -sv /run/wrappers/bin/"$b" "$f"
++	echo "    \"$b\".source = \"$f.orig\";" >> $w
+ done
++
++echo "  };" >> $w
++echo "}" >> $w
diff --git a/nixpkgs/pkgs/desktops/enlightenment/ephoto.nix b/nixpkgs/pkgs/desktops/enlightenment/ephoto.nix
new file mode 100644
index 000000000000..ad4620d4f450
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/ephoto.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, efl, pcre, mesa_noglu, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  name = "ephoto-${version}";
+  version = "1.5";
+  
+  src = fetchurl {
+    url = "http://www.smhouston.us/stuff/${name}.tar.gz";
+    sha256 = "09kraa5zz45728h2dw1ssh23b87j01bkfzf977m48y1r507sy3vb";
+  };
+
+  nativeBuildInputs = [
+    (pkgconfig.override { vanilla = true; })
+    mesa_noglu.dev # otherwise pkg-config does not find gbm
+    makeWrapper
+  ];
+
+  buildInputs = [
+    efl
+    pcre
+  ];
+
+  meta = {
+    description = "Image viewer and editor written using the Enlightenment Foundation Libraries";
+    homepage = http://smhouston.us/ephoto/;
+    license = stdenv.lib.licenses.bsd2;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/enlightenment/rage.nix b/nixpkgs/pkgs/desktops/enlightenment/rage.nix
new file mode 100644
index 000000000000..e7dfb5ca3989
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/rage.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, efl, gst_all_1, pcre, mesa_noglu, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "rage-${version}";
+  version = "0.3.0";
+  
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/apps/rage/${name}.tar.xz";
+    sha256 = "0gfzdd4jg78bkmj61yg49w7bzspl5m1nh6agqgs8k7qrq9q26xqy";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    (pkgconfig.override { vanilla = true; })
+    mesa_noglu.dev
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    efl
+    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-libav
+    pcre
+  ];
+
+  meta = {
+    description = "Video + Audio player along the lines of mplayer";
+    homepage = http://enlightenment.org/;
+    maintainers = with stdenv.lib.maintainers; [ matejc ftrvxmtrx romildo ];
+    platforms = stdenv.lib.platforms.linux;
+    license = stdenv.lib.licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/enlightenment/terminology.nix b/nixpkgs/pkgs/desktops/enlightenment/terminology.nix
new file mode 100644
index 000000000000..f11f21f5b955
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/enlightenment/terminology.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, efl, pcre, mesa_noglu, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  name = "terminology-${version}";
+  version = "1.3.2";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/apps/terminology/${name}.tar.xz";
+    sha256 = "1kclxzadmk272s9spa7n704pcb1c611ixxrq88w5zk22va0i25xm";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    (pkgconfig.override { vanilla = true; })
+    makeWrapper
+  ];
+
+  buildInputs = [
+    efl
+    pcre
+    mesa_noglu
+  ];
+
+  meta = {
+    description = "Powerful terminal emulator based on EFL";
+    homepage = https://www.enlightenment.org/about-terminology;
+    platforms = stdenv.lib.platforms.linux;
+    license = stdenv.lib.licenses.bsd2;
+    maintainers = with stdenv.lib.maintainers; [ matejc tstrobel ftrvxmtrx ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python-desktop/default.nix b/nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python-desktop/default.nix
new file mode 100644
index 000000000000..e7f687d96068
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python-desktop/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, gnome_python, librsvg, libwnck, libgtop, pkgconfig, python2, gtk }:
+
+let
+  inherit (python2.pkgs) python pygtk;
+in stdenv.mkDerivation rec {
+  ver_maj = "2.32";
+  ver_min = "0";
+  version = "${ver_maj}.${ver_min}";
+  name = "gnome-python-desktop-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-python-desktop/${ver_maj}/gnome-python-desktop-${version}.tar.bz2";
+    sha256 = "1s8f9rns9v7qlwjv9qh9lr8crp88dpzfm45hj47zc3ivpy0dbnq9";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk librsvg libwnck libgtop python ];
+  propagatedBuildInputs = [ gnome_python pygtk ];
+
+  # gnome-python-desktop expects that .pth file is already installed by PyGTK
+  # in the same directory. This is not the case for Nix.
+  postInstall = ''
+    echo "gtk-2.0" > $out/${python2.sitePackages}/${name}.pth
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = http://www.pygtk.org;
+    description = "Python bindings for GNOME desktop packages";
+    license = licenses.lgpl21;
+    maintainers = [ maintainers.goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python/default.nix b/nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python/default.nix
new file mode 100644
index 000000000000..f571cf8738f6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/bindings/gnome-python/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchurl, python2, pkgconfig, libgnome, GConf, glib, gtk, gnome_vfs }:
+
+with stdenv.lib;
+
+let
+  inherit (python2.pkgs) python pygobject2 pygtk dbus-python;
+in stdenv.mkDerivation rec {
+  version = "2.28";
+  name = "gnome-python-${version}.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-python/${version}/${name}.tar.bz2";
+    sha256 = "759ce9344cbf89cf7f8449d945822a0c9f317a494f56787782a901e4119b96d8";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ python glib gtk GConf libgnome gnome_vfs ];
+  propagatedBuildInputs = [ pygobject2 pygtk dbus-python ];
+
+  # gnome-python expects that .pth file is already installed by PyGTK in the
+  # same directory. This is not the case for Nix.
+  postInstall = ''
+    echo "gtk-2.0" > $out/${python2.sitePackages}/${name}.pth
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = http://pygtk.org/;
+    description = "Python wrapper for GNOME libraries";
+    platforms = platforms.linux;
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ qknight ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/bindings/libglademm/default.nix b/nixpkgs/pkgs/desktops/gnome-2/bindings/libglademm/default.nix
new file mode 100644
index 000000000000..d4813eb2a938
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/bindings/libglademm/default.nix
@@ -0,0 +1,17 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtkmm, libglade }:
+
+stdenv.mkDerivation rec {
+  name = "libglademm-2.6.7";
+  
+  src = fetchurl {
+    url = "mirror://gnome/sources/libglademm/2.6/${name}.tar.bz2";
+    sha256 = "1hrbg9l5qb7w0xvr7013qamkckyj0fqc426c851l69zpmhakqm1q";
+  };
+
+  outputs = [ "out" "devdoc" ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool ];
+  
+  propagatedBuildInputs = [ gtkmm libglade ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/default.nix b/nixpkgs/pkgs/desktops/gnome-2/default.nix
new file mode 100644
index 000000000000..f67dc13c8545
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/default.nix
@@ -0,0 +1,88 @@
+{ callPackage, self, stdenv, gettext, gvfs, libunique, bison2, rarian
+, libstartup_notification, overrides ? {} }:
+
+let overridden = set // overrides; set = with overridden; {
+  # Backward compatibility.
+  gtkdoc = self.gtk-doc;
+  startup_notification = libstartup_notification;
+  startupnotification = libstartup_notification;
+  gnomedocutils = self.gnome-doc-utils;
+  gnomeicontheme = self.gnome_icon_theme;
+  gnome_common = gnome-common;
+  inherit rarian;
+
+#### PLATFORM
+
+  libIDL = callPackage ./platform/libIDL {
+    gettext = if stdenv.isDarwin then gettext else null;
+  };
+
+  ORBit2 = callPackage ./platform/ORBit2 { };
+
+  libart_lgpl = callPackage ./platform/libart_lgpl { };
+
+  libglade = callPackage ./platform/libglade { };
+
+  libgnomeprint = callPackage ./platform/libgnomeprint {
+    bison = bison2;
+  };
+
+  libgnomeprintui = callPackage ./platform/libgnomeprintui { };
+
+  libgnomecups = callPackage ./platform/libgnomecups { };
+
+  libgtkhtml = callPackage ./platform/libgtkhtml { };
+
+  GConf = callPackage ./platform/GConf { };
+
+  libgnomecanvas = callPackage ./platform/libgnomecanvas { };
+
+  libgnomecanvasmm = callPackage ./platform/libgnomecanvasmm { };
+
+  # for git-head builds
+  gnome-common = callPackage platform/gnome-common { };
+
+  gnome_mime_data = callPackage ./platform/gnome-mime-data { };
+
+  gnome_python = callPackage ./bindings/gnome-python { };
+
+  gnome_python_desktop = callPackage ./bindings/gnome-python-desktop { };
+  python_rsvg = overridden.gnome_python_desktop;
+
+  gnome_vfs = callPackage ./platform/gnome-vfs { };
+
+  libgnome = callPackage ./platform/libgnome { };
+
+  libgnomeui = callPackage ./platform/libgnomeui { };
+
+  libbonobo = callPackage ./platform/libbonobo { };
+
+  libbonoboui = callPackage ./platform/libbonoboui { };
+
+  gtkhtml = callPackage ./platform/gtkhtml { };
+
+  gtkhtml4 = callPackage ./platform/gtkhtml/4.x.nix { };
+
+  # Required for nautilus
+  inherit (libunique);
+
+  gtkglext = callPackage ./platform/gtkglext { };
+
+#### DESKTOP
+
+  gvfs = gvfs.override { gnome = self; };
+
+  # Removed from recent GNOME releases, but still required
+  scrollkeeper = callPackage ./desktop/scrollkeeper { };
+
+  gtksourceview = callPackage ./desktop/gtksourceview { };
+
+  gnome_icon_theme = callPackage ./desktop/gnome-icon-theme { };
+
+  vte = callPackage ./desktop/vte { };
+
+#### BINDINGS
+
+  libglademm = callPackage ./bindings/libglademm { };
+
+}; in overridden
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/gnome-icon-theme/default.nix b/nixpkgs/pkgs/desktops/gnome-2/desktop/gnome-icon-theme/default.nix
new file mode 100644
index 000000000000..dd7e269f94e5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/gnome-icon-theme/default.nix
@@ -0,0 +1,20 @@
+{ stdenv, fetchurl, pkgconfig, intltool, iconnamingutils, gtk }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-icon-theme-2.91.93";
+
+  src = fetchurl {
+    #url = "mirror://gnome/sources/gnome-icon-theme/3.4/${name}.tar.xz";
+    url = "mirror://gnome/sources/gnome-icon-theme/2.91/${name}.tar.bz2";
+    sha256 = "cc7f15e54e2640697b58c26e74cc3f6ebadeb4ef6622bffe9c1e6874cc3478d6";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool iconnamingutils gtk ];
+
+  # remove a tree of dirs with no files within
+  postInstall = '' rm -r "$out/share/locale" '';
+
+  meta = {
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/gtksourceview/default.nix b/nixpkgs/pkgs/desktops/gnome-2/desktop/gtksourceview/default.nix
new file mode 100644
index 000000000000..b40cb98cbefc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/gtksourceview/default.nix
@@ -0,0 +1,43 @@
+{stdenv, fetchpatch, fetchurl, autoreconfHook, pkgconfig, atk, cairo, glib
+, gnome-common, gtk, pango
+, libxml2Python, perl, intltool, gettext, gtk-mac-integration-gtk2 }:
+
+with stdenv.lib;
+
+stdenv.mkDerivation rec {
+  name = "gtksourceview-${version}";
+  version = "2.10.5";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gtksourceview/2.10/${name}.tar.bz2";
+    sha256 = "c585773743b1df8a04b1be7f7d90eecdf22681490d6810be54c81a7ae152191e";
+  };
+
+  patches = optionals stdenv.isDarwin [
+    (fetchpatch {
+      name = "change-igemacintegration-to-gtkosxapplication.patch";
+      url = "https://gitlab.gnome.org/GNOME/gtksourceview/commit/e88357c5f210a8796104505c090fb6a04c213902.patch";
+      sha256 = "0h5q79q9dqbg46zcyay71xn1pm4aji925gjd5j93v4wqn41wj5m7";
+    })
+    (fetchpatch {
+      name = "update-to-gtk-mac-integration-2.0-api.patch";
+      url = "https://gitlab.gnome.org/GNOME/gtksourceview/commit/ab46e552e1d0dae73f72adac8d578e40bdadaf95.patch";
+      sha256 = "0qzrbv4hpa0v8qbmpi2vp575n13lkrvp3cgllwrd2pslw1v9q3aj";
+    })
+  ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    atk cairo glib gtk
+    pango libxml2Python perl intltool
+    gettext
+  ] ++ optionals stdenv.isDarwin [
+    autoreconfHook gnome-common gtk-mac-integration-gtk2
+  ];
+
+  preConfigure = optionalString stdenv.isDarwin ''
+    intltoolize --force
+  '';
+
+  doCheck = false; # requires X11 daemon
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/default.nix b/nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/default.nix
new file mode 100644
index 000000000000..ac9a87299ab8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchFromGitHub, pkgconfig, glib, gnome2, dbus-glib, gmime, libnotify, libgnome-keyring, openssl, cyrus_sasl, gnonlin, sylpheed, gob2, gettext, intltool, libxml2, hicolor-icon-theme, tango-icon-theme }:
+
+stdenv.mkDerivation rec {
+  rev = "9ae8768";
+  version = "5.4";
+  name = "mail-notification-${version}";
+
+  src = fetchFromGitHub {
+    inherit rev;
+    owner = "epienbroek";
+    repo = "mail-notification";
+    sha256 = "1slb7gajn30vdaq0hf5rikwdly1npmg1cf83hpjs82xd98knl13d";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+   buildInputs = [ glib dbus-glib gmime libnotify libgnome-keyring openssl cyrus_sasl gnonlin sylpheed gob2 gettext intltool gnome2.GConf gnome2.libgnomeui dbus-glib gmime libnotify gnome2.scrollkeeper libxml2 gnome2.gnome_icon_theme hicolor-icon-theme tango-icon-theme ];
+
+  prePatch = ''
+    sed -i  -e '/jb_rule_set_install_message/d' -e '/jb_rule_add_install_command/d' jbsrc/jb.c
+
+    # currently disable the check for missing sheme until a better solution
+    # is found; needed, because otherwise the application doesn't even start
+    # and fails saying it unable to find gconf scheme values.
+    sed -i -e 's/(schema_missing)/(!schema_missing)/g' src/mn-conf.c
+  '';
+
+  patches = [
+    ./patches/mail-notification-dont-link-against-bsd-compat.patch
+  ];
+
+  patchFlags = "-p0";
+  NIX_CFLAGS_COMPILE = "-Wno-error";
+
+  preConfigure = "./jb configure prefix=$out";
+
+  postConfigure = ''
+    substituteInPlace build/config \
+      --replace "omf-dir|string|1|${gnome2.scrollkeeper}/share/omf" "omf-dir|string|1|$out/share/omf" \
+      --replace "scrollkeeper-dir|string|1|${gnome2.scrollkeeper}/var/lib/scrollkeeper" "omf-dir|string|1|$out/var/lib/scrollkeeper" \
+  '';
+
+  buildPhase = "./jb build";
+  installPhase = "./jb install";
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "Tray status icon, which notifies us when new email arrives";
+    homepage = https://www.nongnu.org/mailnotify/;
+    license = with licenses; [ gpl3 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.eleanor ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/patches/mail-notification-dont-link-against-bsd-compat.patch b/nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/patches/mail-notification-dont-link-against-bsd-compat.patch
new file mode 100644
index 000000000000..e246a8cc9389
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/mail-notification/patches/mail-notification-dont-link-against-bsd-compat.patch
@@ -0,0 +1,10 @@
+--- jbsrc/jb.c.orig	2014-01-19 20:06:48.525462981 +0100
++++ jbsrc/jb.c	2014-01-19 20:07:36.087934897 +0100
+@@ -425,7 +425,6 @@
+        */
+       jb_compile_options_add_cflags(object->compile_options, "-std=c99");
+       jb_compile_options_add_cppflags(object->compile_options, "-D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L");
+-      jb_compile_options_add_libs(object->compile_options, "-lbsd-compat");
+     }
+ 
+   jb_compile_options_add_string_defines(object->compile_options,
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/scrollkeeper/default.nix b/nixpkgs/pkgs/desktops/gnome-2/desktop/scrollkeeper/default.nix
new file mode 100644
index 000000000000..7c713cb91221
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/scrollkeeper/default.nix
@@ -0,0 +1,20 @@
+{stdenv, fetchurl, pkgconfig, perlPackages, libxml2, libxslt, docbook_xml_dtd_42, automake, gettext}:
+
+stdenv.mkDerivation {
+  name = "scrollkeeper-0.3.14";
+  src = fetchurl {
+    url = mirror://gnome/sources/scrollkeeper/0.3/scrollkeeper-0.3.14.tar.bz2;
+    sha256 = "08n1xgj1f53zahwm0wpn3jid3rfbhi3iwby0ilaaldnid5qriqgc";
+  };
+
+  # The fuloong2f is not supported by scrollkeeper-0.3.14 config.guess
+  preConfigure = "
+    substituteInPlace extract/dtds/Makefile.am --replace /usr/bin/xmlcatalog xmlcatalog
+    cp ${automake}/share/automake*/config.{sub,guess} .
+  ";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ libxml2 libxslt gettext ]
+    ++ (with perlPackages; [ perl XMLParser ]);
+  configureFlags = [ "--with-xml-catalog=${docbook_xml_dtd_42}/xml/dtd/docbook/catalog.xml" ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/alt.patch b/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/alt.patch
new file mode 100644
index 000000000000..65c3ddf1fcf8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/alt.patch
@@ -0,0 +1,50 @@
+From a9d6a34708f846952f423d078397352858f7b1a4 Mon Sep 17 00:00:00 2001
+From: Christian Persch <chpe@gnome.org>
+Date: Sat, 12 May 2012 18:48:05 +0200
+Subject: [PATCH] keymap: Treat ALT as META
+
+https://bugzilla.gnome.org/show_bug.cgi?id=663779
+---
+ src/vte.c |   23 ++++++++++++++---------
+ 1 files changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/src/vte.c b/src/vte.c
+index dd27e9a..0657921 100644
+--- a/src/vte.c
++++ b/src/vte.c
+@@ -5170,19 +5170,24 @@ static void
+ vte_terminal_read_modifiers (VteTerminal *terminal,
+ 			     GdkEvent *event)
+ {
++        GdkKeymap *keymap;
+ 	GdkModifierType modifiers;
+ 
+ 	/* Read the modifiers. */
+-	if (gdk_event_get_state((GdkEvent*)event, &modifiers)) {
+-		GdkKeymap *keymap;
+-#if GTK_CHECK_VERSION (2, 90, 8)
+-                keymap = gdk_keymap_get_for_display(gdk_window_get_display(((GdkEventAny*)event)->window));
+-#else
+-                keymap = gdk_keymap_get_for_display(gdk_drawable_get_display(((GdkEventAny*)event)->window));
++	if (!gdk_event_get_state((GdkEvent*)event, &modifiers))
++                return;
++
++        keymap = gdk_keymap_get_for_display(gdk_window_get_display(((GdkEventAny*)event)->window));
++
++        gdk_keymap_add_virtual_modifiers (keymap, &modifiers);
++
++#if 1
++        /* HACK! Treat ALT as META; see bug #663779. */
++        if (modifiers & GDK_MOD1_MASK)
++                modifiers |= VTE_META_MASK;
+ #endif
+-                gdk_keymap_add_virtual_modifiers (keymap, &modifiers);
+-		terminal->pvt->modifiers = modifiers;
+-	}
++
++        terminal->pvt->modifiers = modifiers;
+ }
+ 
+ /* Read and handle a keypress event. */
+-- 
+1.7.5.1.217.g4e3aa.dirty
\ No newline at end of file
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/change-scroll-region.patch b/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/change-scroll-region.patch
new file mode 100644
index 000000000000..9e3e83b1262a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/change-scroll-region.patch
@@ -0,0 +1,67 @@
+Index: vte-0.26.0/src/vte.c
+===================================================================
+--- vte-0.26.0.orig/src/vte.c	2010-11-30 23:04:53.000000000 -0800
++++ vte-0.26.0/src/vte.c	2010-12-07 20:05:07.865548000 -0800
+@@ -3862,6 +3862,7 @@ vte_terminal_process_incoming(VteTermina
+ 	long wcount, start, delta;
+ 	gboolean leftovers, modified, bottom, again;
+ 	gboolean invalidated_text;
++	gboolean in_scroll_region;
+ 	GArray *unichars;
+ 	struct _vte_incoming_chunk *chunk, *next_chunk, *achunk = NULL;
+ 
+@@ -3881,6 +3882,10 @@ vte_terminal_process_incoming(VteTermina
+ 	cursor = screen->cursor_current;
+ 	cursor_visible = terminal->pvt->cursor_visible;
+ 
++	in_scroll_region = screen->scrolling_restricted
++	    && (screen->cursor_current.row >= (screen->insert_delta + screen->scrolling_region.start))
++	    && (screen->cursor_current.row <= (screen->insert_delta + screen->scrolling_region.end));
++
+ 	/* We should only be called when there's data to process. */
+ 	g_assert(terminal->pvt->incoming ||
+ 		 (terminal->pvt->pending->len > 0));
+@@ -3979,6 +3984,8 @@ skip_chunk:
+ 		 * points to the first character which isn't part of this
+ 		 * sequence. */
+ 		if ((match != NULL) && (match[0] != '\0')) {
++			gboolean new_in_scroll_region;
++
+ 			/* Call the right sequence handler for the requested
+ 			 * behavior. */
+ 			_vte_terminal_handle_sequence(terminal,
+@@ -3989,12 +3996,20 @@ skip_chunk:
+ 			start = (next - wbuf);
+ 			modified = TRUE;
+ 
+-			/* if we have moved during the sequence handler, restart the bbox */
++			new_in_scroll_region = screen->scrolling_restricted
++			    && (screen->cursor_current.row >= (screen->insert_delta + screen->scrolling_region.start))
++			    && (screen->cursor_current.row <= (screen->insert_delta + screen->scrolling_region.end));
++
++			delta = screen->scroll_delta;	/* delta may have changed from sequence. */
++
++			/* if we have moved greatly during the sequence handler, or moved into a scroll_region
++                         * from outside it, restart the bbox */
+ 			if (invalidated_text &&
+-					(screen->cursor_current.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK ||
+-					 screen->cursor_current.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK     ||
+-					 screen->cursor_current.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK ||
+-					 screen->cursor_current.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK)) {
++					((new_in_scroll_region && !in_scroll_region) ||
++					 (screen->cursor_current.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK ||
++					  screen->cursor_current.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK     ||
++					  screen->cursor_current.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK ||
++					  screen->cursor_current.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK))) {
+ 				/* Clip off any part of the box which isn't already on-screen. */
+ 				bbox_topleft.x = MAX(bbox_topleft.x, 0);
+ 				bbox_topleft.y = MAX(bbox_topleft.y, delta);
+@@ -4014,6 +4029,8 @@ skip_chunk:
+ 				bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
+ 				bbox_topleft.x = bbox_topleft.y = G_MAXINT;
+ 			}
++
++			in_scroll_region = new_in_scroll_region;
+ 		} else
+ 		/* Second, we have a NULL match, and next points to the very
+ 		 * next character in the buffer.  Insert the character which
diff --git a/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/default.nix b/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/default.nix
new file mode 100644
index 000000000000..0c8efc57c71f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/desktop/vte/default.nix
@@ -0,0 +1,61 @@
+{ stdenv, fetchurl, fetchpatch, intltool, pkgconfig, glib, gtk, ncurses
+, pythonSupport ? false, python27Packages}:
+
+let
+  inherit (python27Packages) python pygtk;
+in stdenv.mkDerivation rec {
+  name = "vte-0.28.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/vte/0.28/${name}.tar.bz2";
+    sha256 = "00zrip28issgmz2cqk5k824cbqpbixi5x7k88zxksdqpnq1f414d";
+  };
+
+  patches = [
+    ./alt.patch
+    ./change-scroll-region.patch
+    # CVE-2012-2738
+    # fixed in upstream version 0.32.2
+    (fetchpatch{
+      name = "CVE-2012-2738-1.patch";
+      url = https://gitlab.gnome.org/GNOME/vte/commit/feeee4b5832b17641e505b7083e0d299fdae318e.patch;
+      sha256 = "1455i6zxcx4rj2cz639s8qdc04z2nshprwl7k00mcsw49gv3hk5n";
+    })
+    (fetchpatch{
+      name = "CVE-2012-2738-2.patch";
+      url = https://gitlab.gnome.org/GNOME/vte/commit/98ce2f265f986fb88c38d508286bb5e3716b9e74.patch;
+      sha256 = "0n24vw49h89w085ggq23iwlnnb6ajllfh2dg4vsar21d82jxc0sn";
+    })
+  ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool glib gtk ncurses ] ++
+                stdenv.lib.optionals pythonSupport [python pygtk];
+
+  configureFlags = [
+    (stdenv.lib.enableFeature pythonSupport "python")
+  ];
+
+  postInstall = stdenv.lib.optionalString pythonSupport ''
+    cd $(toPythonPath $out)/gtk-2.0
+    for n in *; do
+      ln -s "gtk-2.0/$n" "../$n"
+    done
+  '';
+
+  meta = {
+    homepage = https://www.gnome.org/;
+    description = "A library implementing a terminal emulator widget for GTK+";
+    longDescription = ''
+      VTE is a library (libvte) implementing a terminal emulator widget for
+      GTK+, and a minimal sample application (vte) using that.  Vte is
+      mainly used in gnome-terminal, but can also be used to embed a
+      console/terminal in games, editors, IDEs, etc. VTE supports Unicode and
+      character set conversion, as well as emulating any terminal known to
+      the system's terminfo database.
+    '';
+    license = stdenv.lib.licenses.lgpl2;
+    maintainers = with stdenv.lib.maintainers; [ astsmtl ];
+    platforms = with stdenv.lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/GConf/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/GConf/default.nix
new file mode 100644
index 000000000000..df3de11e738d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/GConf/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, dbus-glib, glib, ORBit2, libxml2, polkit, python2, intltool }:
+
+stdenv.mkDerivation rec {
+  name = "gconf-${version}";
+  version = "3.2.6";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/GConf/${stdenv.lib.versions.majorMinor version}/GConf-${version}.tar.xz";
+    sha256 = "0k3q9nh53yhc9qxf1zaicz4sk8p3kzq4ndjdsgpaa2db0ccbj4hr";
+  };
+
+  outputs = [ "out" "dev" "man" ];
+
+  buildInputs = [ ORBit2 libxml2 python2 ]
+    # polkit requires pam, which requires shadow.h, which is not available on
+    # darwin
+    ++ stdenv.lib.optional (!stdenv.isDarwin) polkit;
+
+  propagatedBuildInputs = [ glib dbus-glib ];
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  configureFlags =
+    # fixes the "libgconfbackend-oldxml.so is not portable" error on darwin
+    stdenv.lib.optional stdenv.isDarwin [ "--enable-static" ];
+
+  meta = with stdenv.lib; {
+    homepage = https://projects.gnome.org/gconf/;
+    description = "Deprecated system for storing application preferences";
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/ORBit2/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/ORBit2/default.nix
new file mode 100644
index 000000000000..ef18f0783ce3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/ORBit2/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, pkgconfig, glib, libIDL, libintl }:
+
+stdenv.mkDerivation rec {
+  name = "ORBit2-${minVer}.19";
+  minVer = "2.14";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/ORBit2/${minVer}/${name}.tar.bz2";
+    sha256 = "0l3mhpyym9m5iz09fz0rgiqxl2ym6kpkwpsp1xrr4aa80nlh1jam";
+  };
+
+  nativeBuildInputs = [ pkgconfig libintl ];
+  propagatedBuildInputs = [ glib libIDL ];
+
+  outputs = [ "out" "dev" ];
+
+  preBuild = ''
+    sed 's/-DG_DISABLE_DEPRECATED//' -i linc2/src/Makefile
+  '';
+
+  preFixup = ''
+    moveToOutput "bin/orbit2-config" "$dev"
+  '';
+
+  meta = with stdenv.lib; {
+    homepage    = https://projects.gnome.org/ORBit2/;
+    description = "A CORBA 2.4-compliant Object Request Broker";
+    platforms   = platforms.unix;
+    maintainers = with maintainers; [ lovek323 ];
+
+    longDescription = ''
+      ORBit2 is a CORBA 2.4-compliant Object Request Broker (ORB) featuring
+      mature C, C++ and Python bindings. Bindings (in various degrees of
+      completeness) are also available for Perl, Lisp, Pascal, Ruby, and TCL;
+      others are in-progress. It supports POA, DII, DSI, TypeCode, Any, IR and
+      IIOP. Optional features including INS and threading are available. ORBit2
+      is engineered for the desktop workstation environment, with a focus on
+      performance, low resource usage, and security. The core ORB is written in
+      C, and runs under Linux, UNIX (BSD, Solaris, HP-UX, ...), and Windows.
+      ORBit2 is developed and released as open source software under GPL/LGPL.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-common/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-common/default.nix
new file mode 100644
index 000000000000..54a2bd526a94
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-common/default.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, which }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-common-${minVer}.0";
+  minVer = "2.34";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-common/${minVer}/${name}.tar.bz2";
+    sha256 = "1pz13mpp09q5s3bikm8ml92s1g0scihsm4iipqv1ql3mp6d4z73s";
+  };
+
+  propagatedBuildInputs = [ which ]; # autogen.sh which is using gnome-common tends to require which
+
+  patches = [(fetchurl {
+    name = "gnome-common-patch";
+    url = "https://bug697543.bugzilla-attachments.gnome.org/attachment.cgi?id=240935";
+    sha256 = "17abp7czfzirjm7qsn2czd03hdv9kbyhk3lkjxg2xsf5fky7z7jl";
+  })];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-mime-data/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-mime-data/default.nix
new file mode 100644
index 000000000000..c3aee9024a20
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-mime-data/default.nix
@@ -0,0 +1,10 @@
+{stdenv, fetchurl, intltool}:
+
+stdenv.mkDerivation {
+  name = "gnome-mime-data-2.18.0";
+  src = fetchurl {
+    url = mirror://gnome/sources/gnome-mime-data/2.18/gnome-mime-data-2.18.0.tar.bz2;
+    sha256 = "1mvg8glb2a40yilmyabmb7fkbzlqd3i3d31kbkabqnq86xdnn69p";
+  };
+  buildInputs = [ intltool ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-vfs/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-vfs/default.nix
new file mode 100644
index 000000000000..c15f43b542aa
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gnome-vfs/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, pkgconfig, libxml2, bzip2, openssl, dbus-glib
+, glib, gamin, cdparanoia, intltool, GConf, gnome_mime_data, avahi, acl }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-vfs-${minVer}.4";
+  minVer = "2.24";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-vfs/${minVer}/${name}.tar.bz2";
+    sha256 = "1ajg8jb8k3snxc7rrgczlh8daxkjidmcv3zr9w809sq4p2sn9pk2";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ intltool pkgconfig ];
+  buildInputs =
+    [ libxml2 bzip2 openssl dbus-glib gamin cdparanoia
+      gnome_mime_data avahi acl
+    ];
+
+  propagatedBuildInputs = [ GConf glib ];
+
+  postPatch = "find . -name Makefile.in | xargs sed 's/-DG_DISABLE_DEPRECATED//g' -i ";
+
+  doCheck = false; # needs dbus daemon
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gtkglext/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkglext/default.nix
new file mode 100644
index 000000000000..834ec2201581
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkglext/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, glib, gtk, libGLU_combined, pango, pangox_compat, xorg }:
+
+stdenv.mkDerivation rec {
+  name = "gtkglext-1.2.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gtkglext/1.2/${name}.tar.bz2";
+    sha256 = "0lbz96jwz57hnn52b8rfj54inwpwcc9fkdq6ya043cgnfih77g8n";
+  };
+
+  buildInputs = with xorg;
+    [ pkgconfig glib gtk libGLU_combined pango libX11 libXmu ];
+  propagatedBuildInputs = [ pangox_compat ];
+
+  patches = [
+    # The library uses `GTK_WIDGET_REALIZED', `GTK_WIDGET_TOPLEVEL', and
+    # `GTK_WIDGET_NO_WINDOW', all of which appear to be deprecated nowadays.
+    (fetchpatch {
+      name = "02_fix_gtk-2.20_deprecated_symbols.diff";
+      url = https://git.gnome.org/browse/gtkglext/patch/?id=d8f285d1397f6c41099c67e668288eecc1cdae67;
+      sha256 = "1zxak73plhy3m6psil1q9ssvjh9aqrif7kcbcz69y480qfb4ja08";
+    })
+    # Fix build with glibc ≥ 2.27
+    (fetchurl {
+      url = https://salsa.debian.org/gewo/gtkglext/raw/3b002677c907890c7de002c9f5b4b3ec71d11b31/debian/patches/04_glibc2.27-ftbfs.diff;
+      sha256 = "1l1swkjkai6pnah23xfsfpbq2fgbhp5pzj3l0ybsx6b858cxqzj5";
+    })
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://projects.gnome.org/gtkglext/;
+    description = "GtkGLExt, an OpenGL extension to GTK+";
+    longDescription =
+      '' GtkGLExt is an OpenGL extension to GTK+. It provides additional GDK
+         objects which support OpenGL rendering in GTK+ and GtkWidget API
+         add-ons to make GTK+ widgets OpenGL-capable.  In contrast to Janne
+         Löf's GtkGLArea, GtkGLExt provides a GtkWidget API that enables
+         OpenGL drawing for standard and custom GTK+ widgets.
+      '';
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/01_remove-disable-deprecated.patch b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/01_remove-disable-deprecated.patch
new file mode 100644
index 000000000000..1d9a179d236b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/01_remove-disable-deprecated.patch
@@ -0,0 +1,17 @@
+diff -Naur gtkhtml-3.32.2-orig/configure gtkhtml-3.32.2/configure
+--- gtkhtml-3.32.2-orig/configure	2011-02-05 23:12:31.000000000 -0500
++++ gtkhtml-3.32.2/configure	2011-04-22 13:03:18.228874636 -0400
+@@ -5761,12 +5761,7 @@
+ 
+ if test "x${enable_deprecated_flags}" = "xyes"; then
+ 
+-  list="-DG_DISABLE_DEPRECATED
+-		-DPANGO_DISABLE_DEPRECATED
+-		-DGDK_DISABLE_DEPRECATED
+-		-DGDK_PIXBUF_DISABLE_DEPRECATED
+-		-DGTK_DISABLE_DEPRECATED
+-		-DGNOME_DISABLE_DEPRECATED"
++  list=""
+   flags_supported=""
+   flags_unsupported=""
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supported compiler flags" >&5
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/4.x.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/4.x.nix
new file mode 100644
index 000000000000..493f88290f3a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/4.x.nix
@@ -0,0 +1,16 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, intltool,
+GConf, enchant, isocodes, gnome_icon_theme, gsettings-desktop-schemas }:
+
+stdenv.mkDerivation rec {
+  version = "4.10.0";
+  name = "gtkhtml-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gtkhtml/4.10/${name}.tar.xz";
+    sha256 = "1hq6asgb5n9q3ryx2vngr4jyi8lg65lzpnlgrgcwayiczcj68fya";
+  };
+
+  propagatedBuildInputs = [ gsettings-desktop-schemas gtk3 gnome_icon_theme GConf ];
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool enchant isocodes ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/default.nix
new file mode 100644
index 000000000000..b4615683939f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/gtkhtml/default.nix
@@ -0,0 +1,20 @@
+{ stdenv, fetchurl, pkgconfig, gtk, intltool,
+GConf, enchant, isocodes, gnome_icon_theme }:
+
+stdenv.mkDerivation rec {
+  name = "gtkhtml-3.32.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gtkhtml/3.32/${name}.tar.bz2";
+    sha256 = "17z3jwvpn8waz7bhwrk7a6vs9pad6sqmlxxcqwvxxq89ywy0ail7";
+  };
+
+  #From Debian, fixes build issue described here:
+  #http://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg250091.html
+  patches = [ ./01_remove-disable-deprecated.patch ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk intltool GConf enchant isocodes gnome_icon_theme ];
+
+  NIX_LDFLAGS = [ "-lgthread-2.0" ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libIDL/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libIDL/default.nix
new file mode 100644
index 000000000000..1fc780026064
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libIDL/default.nix
@@ -0,0 +1,15 @@
+{stdenv, fetchurl, flex, bison, pkgconfig, glib, gettext}:
+
+stdenv.mkDerivation rec {
+  name = "libIDL-${minVer}.14";
+  minVer = "0.8";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libIDL/${minVer}/${name}.tar.bz2";
+    sha256 = "08129my8s9fbrk0vqvnmx6ph4nid744g5vbwphzkaik51664vln5";
+  };
+
+  buildInputs = [ glib gettext ];
+
+  nativeBuildInputs = [ flex bison pkgconfig ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libart_lgpl/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libart_lgpl/default.nix
new file mode 100644
index 000000000000..7b1ccb97dc4b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libart_lgpl/default.nix
@@ -0,0 +1,9 @@
+{stdenv, fetchurl}:
+
+stdenv.mkDerivation rec {
+  name = "libart_lgpl-2.3.21";
+  src = fetchurl {
+    url = "mirror://gnome/sources/libart_lgpl/2.3/${name}.tar.bz2";
+    sha256 = "1yknfkyzgz9s616is0l9gp5aray0f2ry4dw533jgzj8gq5s1xhgx";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libbonobo/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libbonobo/default.nix
new file mode 100644
index 000000000000..bf0cec8dfbe6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libbonobo/default.nix
@@ -0,0 +1,21 @@
+{ stdenv, fetchurl, flex, bison, pkgconfig, glib, libxml2, popt
+, intltool, ORBit2, procps }:
+
+stdenv.mkDerivation rec {
+  name = "libbonobo-${minVer}.1";
+  minVer = "2.32";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libbonobo/${minVer}/${name}.tar.bz2";
+    sha256 = "0swp4kk6x7hy1rvd1f9jba31lvfc6qvafkvbpg9h0r34fzrd8q4i";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = # still using stuff deprecated in new glib versions
+    "sed 's/-DG_DISABLE_DEPRECATED//g' -i configure activation-server/Makefile.in";
+
+  nativeBuildInputs = [ flex bison pkgconfig intltool procps ];
+  buildInputs = [ libxml2 ];
+  propagatedBuildInputs = [ popt glib ORBit2 ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libbonoboui/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libbonoboui/default.nix
new file mode 100644
index 000000000000..a71d6eb789ba
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libbonoboui/default.nix
@@ -0,0 +1,18 @@
+{ stdenv, fetchurl, bison, pkgconfig, popt, libxml2, gtk, libtool
+, intltool, libbonobo, GConf, libgnomecanvas, libgnome, libglade }:
+
+stdenv.mkDerivation rec {
+  name = "libbonoboui-${minVer}.5";
+  minVer = "2.24";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libbonoboui/${minVer}/${name}.tar.bz2";
+    sha256 = "1kbgqh7bw0fdx4f1a1aqwpff7gp5mwhbaz60c6c98bc4djng5dgs";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs = [ bison popt gtk libxml2 GConf libglade libtool ];
+  propagatedBuildInputs = [ libbonobo libgnomecanvas libgnome ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libglade/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libglade/default.nix
new file mode 100644
index 000000000000..1f4af86ffeb6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libglade/default.nix
@@ -0,0 +1,19 @@
+{stdenv, fetchurl, pkgconfig, gtk, libxml2, python, gettext}:
+
+stdenv.mkDerivation {
+  name = "libglade-2.6.4";
+
+  src = fetchurl {
+    url = mirror://gnome/sources/libglade/2.6/libglade-2.6.4.tar.bz2;
+    sha256 = "1v2x2s04jry4gpabws92i0wq2ghd47yr5n9nhgnkd7c38xv1wdk4";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk python gettext ];
+
+  NIX_LDFLAGS = "-lgmodule-2.0";
+
+  propagatedBuildInputs = [ libxml2 ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/default.nix
new file mode 100644
index 000000000000..42f47bc5a83f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, pkgconfig, glib, popt, zlib, libcanberra-gtk2
+, intltool, libbonobo, GConf, gnome_vfs, libtool, libogg
+}:
+
+stdenv.mkDerivation rec {
+  name = "libgnome-${minVer}.1";
+  minVer = "2.32";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libgnome/${minVer}/${name}.tar.bz2";
+    sha256 = "197pnq8y0knqjhm2fg4j6hbqqm3qfzfnd0irhwxpk1b4hqb3kimj";
+  };
+
+  patches = [ ./new-glib.patch ];
+  /* There's a comment containing an invalid utf-8 sequence, breaking glib-mkenums. */
+  postPatch = "sed '/returns the true filename/d' -i libgnome/gnome-config.h";
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ popt zlib intltool GConf gnome_vfs libcanberra-gtk2 libtool ];
+  propagatedBuildInputs = [ glib libbonobo libogg ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/new-glib.patch b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/new-glib.patch
new file mode 100644
index 000000000000..ceabfbdd158e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnome/new-glib.patch
@@ -0,0 +1,65 @@
+Porting libgnome to newer glib:
+ * remove g_thread_init and g_thread_supported, which are longer needed
+   https://developer.gnome.org/glib/2.36/glib-Deprecated-Thread-APIs.html#g-thread-init
+ * replace GStaticRecMutex by GRecMutex
+   https://developer.gnome.org/glib/2.36/glib-Deprecated-Thread-APIs.html#GStaticRecMutex
+
+diff --git a/libgnome/gnome-i18n.c b/libgnome/gnome-i18n.c
+index 531c56c..f13d61e 100644
+--- a/libgnome/gnome-i18n.c
++++ b/libgnome/gnome-i18n.c
+@@ -55,12 +55,14 @@
+ const GList *
+ gnome_i18n_get_language_list (const gchar *ignored)
+ {
+-  static GStaticRecMutex lang_list_lock = G_STATIC_REC_MUTEX_INIT;
++  static GRecMutex lang_list_lock;
++  g_rec_mutex_init (&lang_list_lock);
++
+   static GList *list = NULL;
+   const char * const* langs;
+   int i;
+ 
+-  g_static_rec_mutex_lock (&lang_list_lock);
++  g_rec_mutex_lock (&lang_list_lock);
+ 
+   if (list == NULL) {
+     langs = g_get_language_names ();
+@@ -71,7 +73,7 @@ gnome_i18n_get_language_list (const gchar *ignored)
+     list = g_list_reverse (list);
+   }
+ 
+-  g_static_rec_mutex_unlock (&lang_list_lock);
++  g_rec_mutex_unlock (&lang_list_lock);
+ 
+   return list;
+ }
+diff --git a/libgnome/gnome-init.c b/libgnome/gnome-init.c
+index fe3efd4..c6619af 100644
+--- a/libgnome/gnome-init.c
++++ b/libgnome/gnome-init.c
+@@ -115,9 +115,6 @@ gnome_bonobo_module_info_get (void)
+ static void
+ bonobo_activation_pre_args_parse (GnomeProgram *program, GnomeModuleInfo *mod_info)
+ {
+-        if (!g_thread_supported ())
+-		g_thread_init (NULL);
+-
+ 	if (!bonobo_activation_is_initialized ())
+ 		bonobo_activation_preinit (program, mod_info);
+ }
+diff --git a/libgnome/gnome-program.c b/libgnome/gnome-program.c
+index 739765e..cd14999 100644
+--- a/libgnome/gnome-program.c
++++ b/libgnome/gnome-program.c
+@@ -1878,10 +1878,6 @@ gnome_program_init (const char *app_id, const char *app_version,
+     GnomeProgram *program;
+     va_list args;
+ 
+-    /* g_thread_init() has to be the first GLib function called ever */
+-    if (!g_threads_got_initialized)
+-        g_thread_init (NULL);
+-
+     g_type_init ();
+ 
+     va_start(args, first_property_name);
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvas/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvas/default.nix
new file mode 100644
index 000000000000..2be8c29e4931
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvas/default.nix
@@ -0,0 +1,17 @@
+{ stdenv, fetchurl, pkgconfig, gtk, intltool, libart_lgpl, libglade }:
+
+stdenv.mkDerivation rec {
+  name = "libgnomecanvas-${minVer}.3";
+  minVer = "2.30";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libgnomecanvas/${minVer}/${name}.tar.bz2";
+    sha256 = "0h6xvswbqspdifnyh5pm2pqq55yp3kn6yrswq7ay9z49hkh7i6w5";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  buildInputs = [ libglade ];
+  nativeBuildInputs = [ pkgconfig intltool ];
+  propagatedBuildInputs = [ libart_lgpl gtk ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvasmm/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvasmm/default.nix
new file mode 100644
index 000000000000..9d22488c25da
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecanvasmm/default.nix
@@ -0,0 +1,13 @@
+{ stdenv, fetchurl, pkgconfig, libgnomecanvas, gtkmm }:
+
+stdenv.mkDerivation {
+  name = "libgnomecanvasmm-2.26.0";
+
+  src = fetchurl {
+    url = mirror://gnome/sources/libgnomecanvasmm/2.26/libgnomecanvasmm-2.26.0.tar.bz2;
+    sha256 = "996577f97f459a574919e15ba7fee6af8cda38a87a98289e9a4f54752d83e918";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ libgnomecanvas gtkmm ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/cups_1.6.patch b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/cups_1.6.patch
new file mode 100644
index 000000000000..68f379c25109
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/cups_1.6.patch
@@ -0,0 +1,285 @@
+From ae783efde4fa69578651994505462f02b8639220 Mon Sep 17 00:00:00 2001
+From: Alexandre Rostovtsev <tetromino@gentoo.org>
+Date: Tue, 7 Aug 2012 06:53:09 -0400
+Subject: [PATCH] Use CUPS-1.6 IPP API getter/setter functions
+
+CUPS 1.6 makes various structures private and introduces these ippGet
+and ippSet functions for all of the fields in these structures.
+http://www.cups.org/str.php?L3928
+
+We define our own accessors when building against CUPS < 1.6.
+
+Based on work by Jiri Popelka <jpopelka@redhat.com> at
+https://bugzilla.gnome.org/show_bug.cgi?id=679759
+---
+ libgnomecups/gnome-cups-printer.c |   48 +++++++++++++++++++++++++++++-------
+ libgnomecups/gnome-cups-queue.c   |   43 +++++++++++++++++++++++++++------
+ libgnomecups/gnome-cups-request.c |   44 ++++++++++++++++++++++++++++-----
+ 3 files changed, 110 insertions(+), 25 deletions(-)
+
+diff --git a/libgnomecups/gnome-cups-printer.c b/libgnomecups/gnome-cups-printer.c
+index c924af0..f5e1ef7 100644
+--- a/libgnomecups/gnome-cups-printer.c
++++ b/libgnomecups/gnome-cups-printer.c
+@@ -37,6 +37,34 @@
+ 
+ #define UPDATE_TIMEOUT 5000
+ 
++#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
++#define HAVE_CUPS_1_6 1
++#endif
++
++#ifndef HAVE_CUPS_1_6
++#define ippGetCount(attr)     attr->num_values
++#define ippGetName(attr)      attr->name
++#define ippGetInteger(attr, element) attr->values[element].integer
++#define ippGetString(attr, element, language) attr->values[element].string.text
++
++static ipp_attribute_t *
++ippFirstAttribute(ipp_t *ipp)
++{
++  if (!ipp)
++    return (NULL);
++  return (ipp->current = ipp->attrs);
++}
++
++static ipp_attribute_t *
++ippNextAttribute(ipp_t *ipp)
++{
++  if (!ipp || !ipp->current)
++    return (NULL);
++  return (ipp->current = ipp->current->next);
++}
++#endif
++
++
+ struct _GnomeCupsPPDFile {
+ 	char name[1];
+ };
+@@ -173,9 +201,9 @@ map_reasons (GnomeCupsPrinter *printer,
+ 	printer->details->state_reasons = NULL;
+ 
+ 	/* cf. RFC2911 4.4.12 */
+-	for (i = 0; i < attr->num_values; i++) {
++	for (i = 0; i < ippGetCount (attr); i++) {
+ 		const char *p;
+-		const char *keyword = attr->values [i].string.text;
++		const char *keyword = ippGetString (attr, i, NULL);
+ 
+ 		reason = g_new (GnomeCupsPrinterReason, 1);
+ 
+@@ -224,8 +252,8 @@ gnome_cups_printer_get_info (GnomeCupsPrinter *printer)
+ 	return printer->details->info;
+ }
+ 
+-#define MAP_INT(v,a) {if (!g_ascii_strcasecmp (attr->name, (a))) { if ((v) != attr->values[0].integer) { changed = TRUE; } (v) = attr->values[0].integer; }}
+-#define MAP_STRING(v,a) {if (!g_ascii_strcasecmp (attr->name, (a))) { if (!v || strcmp (v, attr->values[0].string.text)) { g_free (v); changed = TRUE; (v) = g_strdup (attr->values[0].string.text); }}}
++#define MAP_INT(v,a) {if (!g_ascii_strcasecmp (ippGetName (attr), (a))) { if ((v) != ippGetInteger (attr, 0)) { changed = TRUE; } (v) = ippGetInteger (attr, 0); }}
++#define MAP_STRING(v,a) {if (!g_ascii_strcasecmp (ippGetName (attr), (a))) { if (!v || strcmp (v, ippGetString (attr, 0, NULL))) { g_free (v); changed = TRUE; (v) = g_strdup (ippGetString (attr, 0, NULL)); }}}
+ 
+ static void
+ attributes_update_cb (guint id,
+@@ -243,14 +271,14 @@ attributes_update_cb (guint id,
+ 	changed = FALSE;
+ 
+ 	if (!error && response) {
+-		for (attr = response->attrs; attr != NULL; attr = attr->next) {
+-			if (!attr->name) {
++		for (attr = ippFirstAttribute (response); attr != NULL; attr = ippNextAttribute (response)) {
++			if (!ippGetName (attr)) {
+ 				continue;
+ 			} 
+-			if (!g_ascii_strcasecmp (attr->name, "attributes-charset") || !strcmp (attr->name, "attributes-charset")) {
++			if (!g_ascii_strcasecmp (ippGetName (attr), "attributes-charset") || !strcmp (ippGetName (attr), "attributes-charset")) {
+ 				continue;
+ 			}
+-			if (!g_ascii_strcasecmp (attr->name, "printer-state-reasons")) {
++			if (!g_ascii_strcasecmp (ippGetName (attr), "printer-state-reasons")) {
+ 				map_reasons (printer, attr);
+ 			}
+ 			MAP_INT (printer->details->state, "printer-state");
+@@ -570,7 +598,7 @@ get_default (void)
+ 	
+ 	attr = ippFindAttribute (response, "printer-name", IPP_TAG_NAME);
+ 	if (attr) {
+-		name = g_strdup (attr->values[0].string.text);
++		name = g_strdup (ippGetString (attr, 0, NULL));
+ 	} else {
+ 		name = NULL;
+ 	}
+@@ -698,7 +726,7 @@ get_printer_names (void)
+ 	attr = ippFindAttribute (response, "printer-name", IPP_TAG_NAME);
+ 	while (attr) {
+ 		ret = g_list_prepend (ret, 
+-				      g_strdup (attr->values[0].string.text));
++				      g_strdup (ippGetString (attr, 0, NULL)));
+ 		
+ 		attr = ippFindNextAttribute (response, 
+ 					     "printer-name", 
+diff --git a/libgnomecups/gnome-cups-queue.c b/libgnomecups/gnome-cups-queue.c
+index 9f98ed9..298db42 100644
+--- a/libgnomecups/gnome-cups-queue.c
++++ b/libgnomecups/gnome-cups-queue.c
+@@ -15,6 +15,33 @@
+ 
+ #define UPDATE_TIMEOUT 3000
+ 
++#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
++#define HAVE_CUPS_1_6 1
++#endif
++
++#ifndef HAVE_CUPS_1_6
++#define ippGetName(attr)      attr->name
++#define ippGetInteger(attr, element) attr->values[element].integer
++#define ippGetString(attr, element, language) attr->values[element].string.text
++
++static ipp_attribute_t *
++ippFirstAttribute(ipp_t *ipp)
++{
++  if (!ipp)
++    return (NULL);
++  return (ipp->current = ipp->attrs);
++}
++
++static ipp_attribute_t *
++ippNextAttribute(ipp_t *ipp)
++{
++  if (!ipp || !ipp->current)
++    return (NULL);
++  return (ipp->current = ipp->current->next);
++}
++#endif
++
++
+ struct _GnomeCupsQueueDetails {
+ 	char *queue_name;
+ 	GList *jobs;
+@@ -199,8 +226,8 @@ finish_job (GnomeCupsJob *job)
+ 	job->size = job->size * 1024;
+ }
+ 
+-#define MAP_STR(dest, src) { if (!g_ascii_strcasecmp (attr->name, (src))) { if ((dest) != NULL) g_free (dest); (dest) = g_strdup (attr->values[0].string.text);}}
+-#define MAP_INT(dest, src) { if (!g_ascii_strcasecmp (attr->name, (src))) { (dest) = attr->values[0].integer; } }
++#define MAP_STR(dest, src) { if (!g_ascii_strcasecmp (ippGetName (attr), (src))) { if ((dest) != NULL) g_free (dest); (dest) = g_strdup (ippGetString (attr, 0, NULL));}}
++#define MAP_INT(dest, src) { if (!g_ascii_strcasecmp (ippGetName (attr), (src))) { (dest) = ippGetInteger (attr, 0); } }
+ 
+ static void
+ get_jobs_cb (guint id,
+@@ -231,8 +258,8 @@ get_jobs_cb (guint id,
+ 	
+ 	if (response) {
+ 		job = g_new0 (GnomeCupsJob, 1);
+-		for (attr = response->attrs; attr != NULL; attr = attr->next) {
+-			if (attr->name == NULL) {
++		for (attr = ippFirstAttribute (response); attr != NULL; attr = ippNextAttribute (response)) {
++			if (ippGetName (attr) == NULL) {
+ 				if (job->name) {
+ 					finish_job (job);
+ 					jobs = g_list_prepend (jobs, job);	
+@@ -244,7 +271,7 @@ get_jobs_cb (guint id,
+ 				continue;
+ 			}
+ 			
+-			if (!g_ascii_strcasecmp (attr->name, "attributes-charset") || !g_ascii_strcasecmp (attr->name, "attributes-charset")) {
++			if (!g_ascii_strcasecmp (ippGetName (attr), "attributes-charset") || !g_ascii_strcasecmp (ippGetName (attr), "attributes-charset")) {
+ 				continue;
+ 				
+ 			}
+@@ -355,8 +382,8 @@ gnome_cups_queue_get_job_nocache (GnomeCupsQueue *queue,
+ 
+ 	if (response) {
+ 		job = g_new0 (GnomeCupsJob, 1);
+-		for (attr = response->attrs; attr != NULL; attr = attr->next) {
+-			if (attr->name == NULL) {
++		for (attr = ippFirstAttribute (response); attr != NULL; attr = ippNextAttribute (response)) {
++			if (ippGetName (attr) == NULL) {
+ 				if (job->name) {
+ 					finish_job (job);
+ 				} else {
+@@ -366,7 +393,7 @@ gnome_cups_queue_get_job_nocache (GnomeCupsQueue *queue,
+ 				break;
+ 			}
+ 			
+-			if (!g_ascii_strcasecmp (attr->name, "attributes-charset") || !g_ascii_strcasecmp (attr->name, "attributes-charset")) {
++			if (!g_ascii_strcasecmp (ippGetName (attr), "attributes-charset") || !g_ascii_strcasecmp (ippGetName (attr), "attributes-charset")) {
+ 				continue;
+ 			}
+ 			
+diff --git a/libgnomecups/gnome-cups-request.c b/libgnomecups/gnome-cups-request.c
+index c94f623..13f0948 100644
+--- a/libgnomecups/gnome-cups-request.c
++++ b/libgnomecups/gnome-cups-request.c
+@@ -19,6 +19,36 @@
+ #define STOP_UNUSED_THREADS_TIMEOUT 60
+ #define CLOSE_UNUSED_CONNECTIONS_TIMEOUT 30
+ 
++#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
++#define HAVE_CUPS_1_6 1
++#endif
++
++#ifndef HAVE_CUPS_1_6
++#define ippGetCount(attr)     attr->num_values
++#define ippGetValueTag(attr)  attr->value_tag
++#define ippGetName(attr)      attr->name
++#define ippGetBoolean(attr, element) attr->values[element].boolean
++#define ippGetInteger(attr, element) attr->values[element].integer
++#define ippGetString(attr, element, language) attr->values[element].string.text
++
++static ipp_attribute_t *
++ippFirstAttribute(ipp_t *ipp)
++{
++  if (!ipp)
++    return (NULL);
++  return (ipp->current = ipp->attrs);
++}
++
++static ipp_attribute_t *
++ippNextAttribute(ipp_t *ipp)
++{
++  if (!ipp || !ipp->current)
++    return (NULL);
++  return (ipp->current = ipp->current->next);
++}
++#endif
++
++
+ typedef struct
+ {
+ 	GMutex *mutex;
+@@ -276,14 +306,14 @@ dump_request (ipp_t const *req)
+ 	unsigned i;
+ 	ipp_attribute_t *attr;
+ 
+-	for (attr = req->attrs; attr != NULL; attr = attr->next) {
+-		g_print ("%s", attr->name);
+-		for (i = 0 ; i < attr->num_values ; i++) {
++	for (attr = ippFirstAttribute (req); attr != NULL; attr = ippNextAttribute (req)) {
++		g_print ("%s", ippGetName (attr));
++		for (i = 0 ; i < ippGetCount (attr) ; i++) {
+ 			g_print ("\t[%d] = ", i);
+-			switch (attr->value_tag & ~IPP_TAG_COPY) {
++			switch (ippGetValueTag (attr) & ~IPP_TAG_COPY) {
+ 			case IPP_TAG_INTEGER:
+ 			case IPP_TAG_ENUM:
+-				g_print ("%d\n", attr->values[i].integer);
++				g_print ("%d\n", ippGetInteger (attr, i));
+ 				break;
+ 
+ 			case IPP_TAG_STRING:
+@@ -294,11 +324,11 @@ dump_request (ipp_t const *req)
+ 			case IPP_TAG_CHARSET:
+ 			case IPP_TAG_LANGUAGE:
+ 			case IPP_TAG_MIMETYPE:
+-				g_print ("'%s'\n", attr->values[i].string.text);
++				g_print ("'%s'\n", ippGetString (attr, i, NULL));
+ 				break;
+ 
+ 			case IPP_TAG_BOOLEAN:
+-				g_print ("%s\n", (int)attr->values[i].boolean ? "true" : "false");
++				g_print ("%s\n", (int)ippGetBoolean (attr, i) ? "true" : "false");
+ 				break;
+ 
+ 			default:
+-- 
+1.7.8.6
+
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/default.nix
new file mode 100644
index 000000000000..2365e166d5ee
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/default.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, pkgconfig, gtk, gettext, libxml2, intltool, libart_lgpl }:
+
+stdenv.mkDerivation rec {
+  name = "libgnomecups-0.2.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libgnomecups/0.2/${name}.tar.bz2";
+    sha256 = "0a8xdaxzz2wc0n1fjcav65093gixzyac3948l8cxx1mk884yhc71";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  patches = [ ./glib.patch ./cups_1.6.patch ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk gettext intltool libart_lgpl ];
+
+  propagatedBuildInputs = [ libxml2 ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/glib.patch b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/glib.patch
new file mode 100644
index 000000000000..3f73af861c04
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomecups/glib.patch
@@ -0,0 +1,38 @@
+From d84eee9450b3b6f6155074915efc61bedcc8d446 Mon Sep 17 00:00:00 2001
+From: Dominique Leuenberger <dimstar@opensuse.org>
+Date: Sun, 27 Nov 2011 21:36:41 +0100
+Subject: [PATCH] Fix: Only glib.h can be included
+
+---
+ libgnomecups/gnome-cups-i18n.c |    2 +-
+ libgnomecups/gnome-cups-init.h |    3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/libgnomecups/gnome-cups-i18n.c b/libgnomecups/gnome-cups-i18n.c
+index 8987c5c..127756d 100644
+--- a/libgnomecups/gnome-cups-i18n.c
++++ b/libgnomecups/gnome-cups-i18n.c
+@@ -1,5 +1,5 @@
+ #include <config.h>
+-#include <glib/gmacros.h>
++#include <glib.h>
+ #include "gnome-cups-i18n.h"
+ 
+ #ifdef ENABLE_NLS
+diff --git a/libgnomecups/gnome-cups-init.h b/libgnomecups/gnome-cups-init.h
+index 22b682a..c4600fc 100644
+--- a/libgnomecups/gnome-cups-init.h
++++ b/libgnomecups/gnome-cups-init.h
+@@ -1,8 +1,7 @@
+ #ifndef GNOME_CUPS_INIT
+ #define GNOME_CUPS_INIT
+ 
+-#include <glib/gtypes.h>
+-#include <glib/gmacros.h>
++#include <glib.h>
+ 
+ G_BEGIN_DECLS
+ 
+-- 
+1.7.7
+
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/bug653388.patch b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/bug653388.patch
new file mode 100644
index 000000000000..468f8e287a7c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/bug653388.patch
@@ -0,0 +1,21 @@
+From 9b82b7e75b83395e7c5692085e1934202cf7f65f Mon Sep 17 00:00:00 2001
+From: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date: Wed, 12 Oct 2011 15:08:59 +0000
+Subject: Add missing include
+
+https://bugzilla.gnome.org/show_bug.cgi?id=653388
+---
+diff --git a/libgnomeprint/modules/cups/gnome-print-cups-transport.c b/libgnomeprint/modules/cups/gnome-print-cups-transport.c
+index aeb7111..85de91b 100644
+--- a/libgnomeprint/modules/cups/gnome-print-cups-transport.c
++++ b/libgnomeprint/modules/cups/gnome-print-cups-transport.c
+@@ -34,6 +34,7 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
++#include <stdio.h>
+ #include <unistd.h>
+ #include <locale.h>
+ 
+--
+cgit v0.9.0.2
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/default.nix
new file mode 100644
index 000000000000..6945ad1f04b9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprint/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchurl, pkgconfig, gtk, gettext, libxml2, intltool, libart_lgpl
+, libgnomecups, bison, flex }:
+
+stdenv.mkDerivation rec {
+  name = "libgnomeprint-2.18.8";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libgnomeprint/2.18/${name}.tar.bz2";
+    sha256 = "1034ec8651051f84d2424e7a1da61c530422cc20ce5b2d9e107e1e46778d9691";
+  };
+
+  patches = [ ./bug653388.patch ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk gettext intltool libart_lgpl libgnomecups bison flex ];
+
+  propagatedBuildInputs = [ libxml2 ];
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprintui/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprintui/default.nix
new file mode 100644
index 000000000000..a8072aa37525
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeprintui/default.nix
@@ -0,0 +1,13 @@
+{stdenv, fetchurl, pkgconfig, gtk, gettext, intltool, libgnomecanvas, libgnomeprint, gnomeicontheme}:
+
+stdenv.mkDerivation {
+  name = "libgnomeprintui-2.18.6";
+
+  src = fetchurl {
+    url = mirror://gnome/sources/libgnomeprintui/2.18/libgnomeprintui-2.18.6.tar.bz2;
+    sha256 = "0spl8vinb5n6n1krnfnr61dwaxidg67h8j94z9p59k2xdsvfashm";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk gettext intltool libgnomecanvas libgnomeprint gnomeicontheme];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeui/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeui/default.nix
new file mode 100644
index 000000000000..838e51337453
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgnomeui/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, libxml2, xorg, glib, pango
+, intltool, libgnome, libgnomecanvas, libbonoboui, GConf, libtool
+, gnome_vfs, libgnome-keyring, libglade }:
+
+stdenv.mkDerivation rec {
+  name = "libgnomeui-${minVer}.5";
+  minVer = "2.24";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/libgnomeui/${minVer}/${name}.tar.bz2";
+    sha256 = "03rwbli76crkjl6gp422wrc9lqpl174k56cp9i96b7l8jlj2yddf";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  patches = [
+    (fetchpatch {
+      name = "0001-gnome-scores.h-Convert-to-UTF-8.patch";
+      url = https://github.com/GNOME/libgnomeui/commit/30334c28794ef85d8973f4ed0779b5ceed6594f2.diff;
+      sha256 = "1sn8j8dkam14wfkpw8nga3gk63wniff243mzv3jp0fvv52q8sqhk";
+    })
+  ];
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs =
+    [ xorg.xlibsWrapper libxml2 GConf pango glib libgnome-keyring libglade libtool ];
+
+  propagatedBuildInputs = [ libgnome libbonoboui libgnomecanvas gnome_vfs ];
+}
diff --git a/nixpkgs/pkgs/desktops/gnome-2/platform/libgtkhtml/default.nix b/nixpkgs/pkgs/desktops/gnome-2/platform/libgtkhtml/default.nix
new file mode 100644
index 000000000000..b9db3422723e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-2/platform/libgtkhtml/default.nix
@@ -0,0 +1,16 @@
+{stdenv, fetchurl, pkgconfig, gtk, gettext, libxml2 }:
+
+stdenv.mkDerivation {
+  name = "libgtkhtml-2.11.1";
+
+  src = fetchurl {
+    url = mirror://gnome/sources/libgtkhtml/2.11/libgtkhtml-2.11.1.tar.bz2;
+    sha256 = "0msajafd42545dxzyr5zqka990cjrxw2yz09ajv4zs8m1w6pm9rw";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk gettext ];
+  propagatedBuildInputs = [ libxml2 ];
+
+  hardeningDisable = [ "format" ];
+}
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..5de7d93f49c6
--- /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, intltool, libwnck3 }:
+
+stdenv.mkDerivation rec {
+  name = "accerciser-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/accerciser/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "883306274442c7ecc076b24afca5190c835c40871ded1b9790da69347e9ca3c5";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig wrapGAppsHook itstool intltool
+    gobject-introspection # For setup hook
+  ];
+  buildInputs = [
+    gtk3 libxml2 python3Packages.python python3Packages.pyatspi
+    python3Packages.pygobject3 python3Packages.ipython
+    at-spi2-core dbus libwnck3 gnome3.defaultIconTheme
+  ];
+
+  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..ea2091524c9c
--- /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.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/cheese/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0zz2bgjaf2lsmfs3zn24925vbjb0rycr39i288brlbzixrpcyljr";
+  };
+
+  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..310f8ccb63b9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/evolution/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, cmake, ninja, intltool, fetchurl, libxml2, webkitgtk, highlight
+, pkgconfig, gtk3, glib, libnotify, gtkspell3
+, 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.30.5";
+in stdenv.mkDerivation rec {
+  name = "evolution-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evolution/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1hhxj3rh921pp3l3c5k33bdypcas1p66krzs65k1qn82c5fpgl2h";
+  };
+
+  propagatedUserEnvPkgs = [ gnome3.evolution-data-server ];
+
+  buildInputs = [
+    gtk3 glib gdk_pixbuf gnome3.defaultIconTheme librsvg db icu
+    gnome3.evolution-data-server libsecret libical gcr
+    webkitgtk shared-mime-info gnome3.gnome-desktop gtkspell3
+    libcanberra-gtk3 bogofilter gnome3.libgdata sqlite
+    gst_all_1.gstreamer gst_all_1.gst-plugins-base p11-kit
+    nss nspr libnotify procps highlight gnome3.libgweather
+    gnome3.gsettings-desktop-schemas
+    gnome3.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..fe307bca797b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/file-roller/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, glib, gtk, 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.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/file-roller/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0kiragsqyixyx15747b71qc4nw8y4jx9d55wgg612xb0hp5l9pj1";
+  };
+
+  LANG = "en_US.UTF-8"; # postinstall.py
+
+  nativeBuildInputs = [ meson ninja gettext itstool pkgconfig libxml2 python3 wrapGAppsHook glibcLocales desktop-file-utils ];
+
+  buildInputs = [ glib gtk json-glib libarchive file gnome3.defaultIconTheme 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..61eda9421945
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gedit/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, intltool, fetchurl
+, pkgconfig, gtk3, glib
+, wrapGAppsHook, itstool, libsoup, libxml2
+, gnome3, gspell }:
+
+stdenv.mkDerivation rec {
+  name = "gedit-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gedit/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0qwig35hzvjaqic9x92jcpmycnvcybsbnbiw6rppryx0arwb3wza";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook intltool itstool libxml2 ];
+
+  buildInputs = [
+    gtk3 glib
+    gnome3.defaultIconTheme libsoup
+    gnome3.libpeas gnome3.gtksourceview
+    gnome3.gsettings-desktop-schemas gspell
+  ];
+
+  enableParallelBuilding = true;
+
+  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..d9f1e7850afd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/ghex/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, intltool, itstool, libxml2,
+  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";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "ghex"; attrPath = "gnome3.ghex"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook ];
+
+  buildInputs = [ gnome3.gtk intltool itstool libxml2 ];
+
+  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..39e0f2ba23e1
--- /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 }:
+
+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
+    gnome3.gsettings-desktop-schemas
+    gdk_pixbuf gnome3.defaultIconTheme
+  ];
+
+  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-boxes/default.nix b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-boxes/default.nix
new file mode 100644
index 000000000000..357cd42d66bd
--- /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
+}:
+
+# TODO: ovirt (optional)
+
+let
+  version = "3.30.3";
+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 = "0a9ljwhkanszzyzl0bhad8vmzk7v4wafl9b1zn09pf57znyymf3s";
+  };
+
+  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.defaultIconTheme librsvg acl libgudev libsecret
+    libcap_ng numactl xen libapparmor
+  ];
+
+  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..8cc8712a15de
--- /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, gtk, evolution-data-server, libsoup
+, glib, gnome-online-accounts, gsettings-desktop-schemas }:
+
+let
+  pname = "gnome-calendar";
+  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 = "1avi7a29y8d8kzwslp51nwy6s692alms7917454j0xpfc6hnw62s";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "gnome3.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext libxml2 wrapGAppsHook python3 ];
+  buildInputs = [
+    gtk evolution-data-server libsoup glib gnome-online-accounts libdazzle libgweather geoclue2 geocode-glib
+    gsettings-desktop-schemas gnome3.defaultIconTheme
+  ];
+
+  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..047f9bc22102
--- /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 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-characters-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-characters/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "08cwz39iwgsyyb2wqhb8vfbmh1cwfkgfiy7adp08w7rwqi99x3dp";
+  };
+
+  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 gnome3.gsettings-desktop-schemas
+    gnome3.defaultIconTheme libunistring
+    # typelib
+    gnome3.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..30323cf62f53
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-clocks/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchurl
+, meson, ninja, gettext, pkgconfig, wrapGAppsHook, itstool, desktop-file-utils
+, vala, gobject-introspection, libxml2, gtk3, glib, gsound, sound-theme-freedesktop
+, gnome3, gdk_pixbuf, geoclue2, libgweather }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-clocks-${version}";
+  version = "3.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-clocks/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "009fr6zwv37wryi0c0syi4i7pxpdbn3gliws68l99cjsbn2qd6pc";
+  };
+
+  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 gnome3.gsettings-desktop-schemas gdk_pixbuf gnome3.defaultIconTheme
+    gnome3.gnome-desktop gnome3.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..d2792304016f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-documents/default.nix
@@ -0,0 +1,65 @@
+{ 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 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-documents-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-documents/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0zchkjpc9algmxrpj0f9i2lc4h1yp8z0h76vn32xa9jr46x4lsh6";
+  };
+
+  doCheck = true;
+
+  mesonFlags = [ "-Dgetting-started=true" ];
+
+  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 gnome3.gsettings-desktop-schemas
+    gdk_pixbuf gnome3.defaultIconTheme evince
+    libsoup webkitgtk gjs gobject-introspection
+    tracker tracker-miners libgdata
+    gnome-desktop libzapojit libgepub
+  ];
+
+  patches = [
+    # fix RPATH to libgd
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-documents/commit/d18a92e0a940073ac766f609937539e4fc6cdbb7.patch";
+      sha256 = "0s3mk8vrl1gzk93yvgqbnz44i27qw1d9yvvmnck3fv23phrxkzk9";
+    })
+  ];
+
+  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..e7a1954c8924
--- /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.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-getting-started-docs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "10vihv6n8703rapf915waz1vzr7axk43bjlhmm3hb7kwm32rc61k";
+  };
+
+  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..c6140a53fd9b
--- /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 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-logs-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-logs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1rsk2whps7rwl01mmjmhwwww4iv09fsszils9zmgqd79y7l3fmyh";
+  };
+
+  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 gnome3.gsettings-desktop-schemas gnome3.defaultIconTheme ];
+
+  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..2f7e5bbe8071
--- /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
+, webkitgtk, gjs, libgee, geocode-glib, evolution-data-server, gnome-online-accounts }:
+
+let
+  pname = "gnome-maps";
+  version = "3.30.3";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0s1k6v1yzchbv6big09fdhmm0rzyjdh2y7qg6fsp7d0x4qnch9nq";
+  };
+
+  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
+    gnome3.gsettings-desktop-schemas evolution-data-server
+    gnome-online-accounts gnome3.defaultIconTheme
+    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..3edf1f5dd402
--- /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 }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gnome-music";
+  version = "3.30.2";
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1d9gd9rqy71hibfrz4zglimvgv6yn1pw22cnrn7pbdz6k4yq209d";
+  };
+
+  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
+    gdk_pixbuf gnome3.defaultIconTheme python3
+    grilo grilo-plugins libnotify libdazzle libsoup
+    gnome3.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..dcee87dc799c
--- /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.defaultIconTheme
+  ];
+
+  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..e39ce00fd658
--- /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 }:
+
+let
+  version = "3.30.3";
+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 = "1mkpi2i9nqpip5l15ihjcscyiri113s0705sjgh6b89164ahyn5k";
+  };
+
+  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
+    gnome3.gsettings-desktop-schemas
+    evolution-data-server
+    gnome3.defaultIconTheme
+  ];
+
+  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..508b8af3f4f7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-photos/default.nix
@@ -0,0 +1,48 @@
+{ 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 }:
+
+let
+  pname = "gnome-photos";
+  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 = "1mf1887x0pk46h6l51rfkpn29fwp3yvmqkk99kr1iwpz0lakyx6f";
+  };
+
+  # doCheck = true;
+
+  nativeBuildInputs = [ pkgconfig gettext itstool libxml2 desktop-file-utils wrapGAppsHook ];
+  buildInputs = [
+    gtk3 glib gegl babl libgdata libdazzle
+    gnome3.gsettings-desktop-schemas
+    gdk_pixbuf gnome3.defaultIconTheme
+    gfbgraph grilo-plugins grilo
+    gnome-online-accounts tracker
+    gexiv2 geocode-glib dleyna-renderer
+    tracker-miners # For 'org.freedesktop.Tracker.Miner.Files' GSettings schema
+  ];
+
+
+  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..3f8ce7f4a51a
--- /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.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 = "0m15x6i279wrfimz9ma2gfjv7jlkca2qbl2wcnxgx1pb3hzrwggm";
+  };
+
+  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.defaultIconTheme
+  ];
+
+  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..1f902dc9c80a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-sound-recorder/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, intltool, gobject-introspection, wrapGAppsHook, gjs, glib, gtk3, gdk_pixbuf, gst_all_1, gnome3 }:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-sound-recorder";
+  version = "3.28.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1k63xr3d16qbzi88md913ndaf2mzwmhmi6hipj0123sm7nsz1p94";
+  };
+
+  patches = [
+    # Fix crash when trying to play recordings
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/gnome-sound-recorder/commit/2b311ef67909bc20d0e87f334fe37bf5c4e9f29f.patch;
+      sha256 = "0hqmk846bxma0p66cqp94zd02zc1if836ywjq3sv5dsfwnz7jv3f";
+    })
+  ];
+
+  nativeBuildInputs = [ pkgconfig intltool gobject-introspection wrapGAppsHook ];
+  buildInputs = [ gjs glib gtk3 gdk_pixbuf ] ++ (with gst_all_1; [ gstreamer.dev gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad ]);
+
+  # 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..37b48a744822
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-todo/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, python3, wrapGAppsHook
+, gettext, gnome3, glib, gtk, libpeas
+, gnome-online-accounts, gsettings-desktop-schemas
+, evolution-data-server, libxml2, libsoup, libical, rest, json-glib }:
+
+let
+  pname = "gnome-todo";
+  version = "3.28.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "08ygqbib72jlf9y0a16k54zz51sncpq2wa18wp81v46q8301ymy7";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext python3 wrapGAppsHook
+  ];
+  buildInputs = [
+    glib gtk libpeas gnome-online-accounts
+    gsettings-desktop-schemas gnome3.defaultIconTheme
+    # Plug-ins
+    evolution-data-server libxml2 libsoup libical
+    rest 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..6a827b7f0e3c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/gnome-weather/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook, gjs, gobject-introspection
+, libgweather, intltool, itstool, geoclue2, gnome-desktop }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-weather-${version}";
+  version = "3.26.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-weather/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "965cc0d1b4d4e53c06d494db96f0b124d232af5c0e731ca900edd10f77a74c78";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool itstool wrapGAppsHook ];
+  buildInputs = [
+    gtk3 gjs gobject-introspection gnome-desktop
+    libgweather gnome3.defaultIconTheme geoclue2 gnome3.gsettings-desktop-schemas
+  ];
+
+  # 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.
+  preConfigure = ''
+    substituteInPlace "data/org.gnome.Weather.Application.service.in" \
+        --replace "Exec=@pkgdatadir@/@PACKAGE_NAME@.Application" \
+                  "Exec=$out/bin/gnome-weather"
+  '';
+
+  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..080fa664b0db
--- /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 }:
+
+let
+  pname = "polari";
+  version = "3.30.2";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "02wxkdq5s5ami9wj9vpqhs6n8qxr299bpmvpvd89mn49x73lq2w2";
+  };
+
+  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 gnome3.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..9ef2b57e6d14
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/apps/seahorse/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchurl, vala, meson, ninja
+, pkgconfig, gtk3, glib, gobject-introspection
+, wrapGAppsHook, itstool, gnupg, libsoup
+, gnome3, gpgme, python3, openldap, gcr
+, libsecret, avahi, p11-kit, openssh }:
+
+stdenv.mkDerivation rec {
+  pname = "seahorse";
+  version = "3.30.1.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "12x7xmwh62yl0ax90v8nkx3jqzviaz9hz2g56yml78wzww20gawy";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig vala itstool wrapGAppsHook
+    python3 gobject-introspection
+  ];
+  buildInputs = [
+    gtk3 glib gcr
+    gnome3.gsettings-desktop-schemas gnupg
+    gnome3.defaultIconTheme gpgme
+    libsecret avahi libsoup p11-kit
+    openssh openldap
+  ];
+
+  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..00037f526b64
--- /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.defaultIconTheme 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..4fa40a6c1b08
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/adwaita-icon-theme/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gnome3
+, iconnamingutils, gtk, gdk_pixbuf, librsvg, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "adwaita-icon-theme-${version}";
+  version = "3.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/adwaita-icon-theme/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1kp1lis3dr16jmlgycz1b29jsr6ir8wmqj6laqwlhs663cmjlxbd";
+  };
+
+  # For convenience, we can specify adwaita-icon-theme only in packages
+  propagatedBuildInputs = [ hicolor-icon-theme ];
+
+  buildInputs = [ gdk_pixbuf librsvg ];
+
+  nativeBuildInputs = [ pkgconfig intltool iconnamingutils gtk ];
+
+  # 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..c29e3ff5200d
--- /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.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 = "0kx721s1hhw1g0nvbqhb93g8iq6f852imyhfhl02zcqy4ipx0kay";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig vala gettext itstool libxml2 desktop-file-utils wrapGAppsHook ];
+  buildInputs = [ gtk3 glib gnome3.defaultIconTheme ];
+
+  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..fe2b50f296a4
--- /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 }:
+
+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 = [ gnome3.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..0d583dccf766
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/dconf-editor/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, meson, ninja, vala, libxslt, pkgconfig, glib, gtk3, gnome3, python3
+, libxml2, gettext, docbook_xsl, wrapGAppsHook, gobject-introspection }:
+
+let
+  pname = "dconf-editor";
+  version = "3.30.2";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "06f736spn20s7qjsz00xw44v8r8bjhyrz1v3bix6v416jc5jp6ia";
+  };
+
+  nativeBuildInputs = [ meson ninja vala libxslt pkgconfig wrapGAppsHook gettext docbook_xsl libxml2 gobject-introspection python3 ];
+
+  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..9c1d7d7d1a98
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/dconf/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, meson, ninja, python3, vala, libxslt, pkgconfig, glib, bash-completion, dbus, gnome3
+, libxml2, gtk-doc, docbook_xsl, docbook_xml_dtd_42 }:
+
+let
+  pname = "dconf";
+in
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "0.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1dq2dn7qmxr4fxzx9wnag89ck24gxq17p2n4gl81h4w8qdy3m6jl";
+  };
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs meson_post_install.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 = true;
+
+  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..1a4ef2a1cf41
--- /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
+, 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.defaultIconTheme gnome3.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..5b6281869cc5
--- /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.28.4";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1wrq3l3z0x6q0hnc1vqr2hnyb1b14qw6aqvc5dldfgbs0yys6p55";
+  };
+
+  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..c8ca0016d57d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/epiphany/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, meson, ninja, gettext, fetchurl, pkgconfig, gtk, 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 }:
+
+stdenv.mkDerivation rec {
+  name = "epiphany-${version}";
+  version = "3.30.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/epiphany/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "05qdzx18ld1m3xiajpz6y6snfj56bgyjsgm7f4rqrnpjdbdvikbn";
+  };
+
+  # Tests need an X display
+  mesonFlags = [ "-Dunit_tests=false" ];
+
+  nativeBuildInputs = [
+    meson ninja libxslt pkgconfig itstool gettext wrapGAppsHook desktop-file-utils python3
+  ];
+
+  buildInputs = [
+    gtk glib webkitgtk libsoup libxml2 libsecret gnome-desktop libnotify
+    sqlite isocodes p11-kit icu
+    gdk_pixbuf gnome3.defaultIconTheme 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..94d39964bc48
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/evince/default.nix
@@ -0,0 +1,68 @@
+{ fetchurl, stdenv, pkgconfig, intltool, libxml2
+, glib, gtk3, pango, atk, gdk_pixbuf, shared-mime-info, itstool, gnome3
+, poppler, ghostscriptX, djvulibre, libspectre, libarchive, libsecret, wrapGAppsHook
+, librsvg, gobject-introspection, yelp-tools, gspell
+, recentListSize ? null # 5 is not enough, allow passing a different number
+, supportXPS ? false    # Open XML Paper Specification via libgxps
+, autoreconfHook, pruneLibtoolFiles
+}:
+
+stdenv.mkDerivation rec {
+  name = "evince-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evince/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0k7jln6dpg4bpv61niicjzkzyq6fhb3yfld7pc8ck71c8pmvsnx9";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "evince"; };
+  };
+
+  nativeBuildInputs = [
+    pkgconfig gobject-introspection intltool itstool wrapGAppsHook yelp-tools autoreconfHook pruneLibtoolFiles
+  ];
+
+  buildInputs = [
+    glib gtk3 pango atk gdk_pixbuf libxml2
+    gnome3.gsettings-desktop-schemas
+    poppler ghostscriptX djvulibre libspectre libarchive
+    libsecret librsvg gnome3.adwaita-icon-theme gspell
+  ] ++ stdenv.lib.optional supportXPS gnome3.libgxps;
+
+  configureFlags = [
+    "--disable-nautilus" # Do not build nautilus plugin
+    "--enable-introspection"
+    (if supportXPS then "--enable-xps" else "--disable-xps")
+  ];
+
+  NIX_CFLAGS_COMPILE = "-I${gnome3.glib.dev}/include/gio-unix-2.0";
+
+  preConfigure = stdenv.lib.optionalString (recentListSize != null) ''
+    sed -i 's/\(gtk_recent_chooser_set_limit .*\)5)/\1${builtins.toString recentListSize})/' shell/ev-open-recent-action.c
+    sed -i 's/\(if (++n_items == \)5\(.*\)/\1${builtins.toString recentListSize}\2/' shell/ev-window.c
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "${shared-mime-info}/share")
+  '';
+
+  enableParallelBuilding = true;
+
+  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..a27bc2cc9ae5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/evolution-data-server/default.nix
@@ -0,0 +1,63 @@
+{ 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 }:
+
+stdenv.mkDerivation rec {
+  name = "evolution-data-server-${version}";
+  version = "3.30.5";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/evolution-data-server/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1s952wyhgcbmq9nfgk75v15zdy1h3wy5p5rmkqibaavmc0pk3mli";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata;
+    })
+    ./hardcode-gsettings.patch
+  ];
+
+  nativeBuildInputs = [
+    cmake ninja pkgconfig intltool python3 gperf wrapGAppsHook gobject-introspection vala
+  ];
+  buildInputs = with gnome3; [
+    glib libsoup libxml2 gtk 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 ];
+
+  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..135200ee3c4f
--- /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
+, gtk, libcanberra-gtk3, pam, libtool, gobject-introspection, plymouth
+, librsvg, coreutils, xwayland, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  name = "gdm-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gdm/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1handy65r1n0zby09jr492b3643wszzigdkxp7q2ypgxb3hyv45y";
+  };
+
+  # 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 gtk
+    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..ac3a25b7dc74
--- /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.54.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gjs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1cd65d4nq5xxlyjz1b83hm5zklyry6lillzf782nr0z97k60vcvn";
+  };
+
+  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..a938a59f7a01
--- /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.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-backgrounds/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1179jrl16bp9gqabqhw7nnfp8qzf5y1vf9fi45bni6rfmwm3mrpc";
+  };
+
+  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..b065025327ff
--- /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 }:
+
+let
+  pname = "gnome-bluetooth";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "3.28.2";
+
+  # 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 = "0ch7lll5n8v7m26y6y485gnrik19ml42rsh1drgcxydm6fn62j8z";
+  };
+
+  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.defaultIconTheme gnome3.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..4a37599b136d
--- /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, gtksourceview3, wrapGAppsHook, gobject-introspection, python3
+, gnome3, mpfr, gmp, libsoup, libmpc }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-calculator-${version}";
+  version = "3.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-calculator/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0qkzcmj51cjmljxl1nc84h6jgq1a51xj4g6jwh3ymgm19m3sqypc";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig vala gettext itstool wrapGAppsHook python3
+    gobject-introspection # for finding vapi files
+  ];
+
+  buildInputs = [
+    gtk3 glib libxml2 gtksourceview3 mpfr gmp
+    gnome3.defaultIconTheme
+    gnome3.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..782a77499f9e
--- /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.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 = "105bqqq3yvdn5lx94mkl0d450f0l8lmwfjjcwyls1pycmj0vifwh";
+  };
+
+  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..a7347f74ca4b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-contacts/default.nix
@@ -0,0 +1,57 @@
+{ 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 }:
+
+let
+  version = "3.30.2";
+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 = "1b0pkdwz9yqcv82zzdf76rs2w3wa5zli8pka09wnahikx1ykk43h";
+  };
+
+  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 gnome3.gsettings-desktop-schemas
+    folks gnome-desktop telepathy-glib
+    libxml2 gnome-online-accounts cheese
+    gnome3.defaultIconTheme libchamplain clutter-gtk geocode-glib
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py
+    patchShebangs 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..58afc0ab85d0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/default.nix
@@ -0,0 +1,78 @@
+{ fetchurl, stdenv, substituteAll, meson, ninja, pkgconfig, gnome3, ibus, gettext, upower, wrapGAppsHook
+, libcanberra-gtk3, accountsservice, libpwquality, libpulseaudio
+, gdk_pixbuf, librsvg, libnotify, libgudev, libsecret, gnome-color-manager
+, libxml2, polkit, libxslt, libgtop, libsoup, colord, colord-gtk
+, cracklib, libkrb5, networkmanagerapplet, networkmanager, glibc
+, libwacom, samba, shared-mime-info, tzdata, libtool, libgnomekbd
+, docbook_xsl, modemmanager, clutter, clutter-gtk, cheese, gnome-session
+, fontconfig, sound-theme-freedesktop, grilo, python3 }:
+
+let
+  pname = "gnome-control-center";
+  version = "3.30.2";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0rn4r0ng4pd9smpay4rf4dkcl09b2ipr9srryybhd1srmd02ps51";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext wrapGAppsHook libtool libxslt docbook_xsl
+    shared-mime-info python3
+  ];
+
+  buildInputs = with gnome3; [
+    ibus gtk 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 libnotify
+    grilo libpwquality cracklib vino libcanberra-gtk3 libgudev libsecret
+    gdk_pixbuf defaultIconTheme librsvg clutter clutter-gtk cheese
+    networkmanager modemmanager gnome-bluetooth tracker
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      gcm = gnome-color-manager;
+      inherit glibc libgnomekbd tzdata;
+    })
+  ];
+
+  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"
+    )
+    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..0c11a7626e40
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-control-center/paths.patch
@@ -0,0 +1,78 @@
+--- a/panels/color/cc-color-panel.c
++++ b/panels/color/cc-color-panel.c
+@@ -599,7 +599,7 @@
+ 
+   /* 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 @@
+ 
+   /* 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 @@
+ 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);
+--- 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;
+--- a/panels/region/cc-region-panel.c
++++ b/panels/region/cc-region-panel.c
+@@ -1265,10 +1265,10 @@
+         }
+ 
+         if (variant && 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, 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);
+--- a/tests/datetime/test-endianess.c
++++ b/tests/datetime/test-endianess.c
+@@ -26,7 +26,7 @@
+ 	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..59191bddd9af
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/bubblewrap-paths.patch
@@ -0,0 +1,19 @@
+--- a/libgnome-desktop/gnome-desktop-thumbnail-script.c
++++ b/libgnome-desktop/gnome-desktop-thumbnail-script.c
+@@ -504,14 +504,10 @@
+   g_return_val_if_fail (script->s_infile != NULL, FALSE);
+ 
+   add_args (array,
+-	    "bwrap",
+-	    "--ro-bind", "/usr", "/usr",
+-	    "--ro-bind", "/lib", "/lib",
+-	    "--ro-bind", "/lib64", "/lib64",
++	    "@bubblewrap_bin@",
++      "--ro-bind", "/nix/store", "/nix/store",
+ 	    "--proc", "/proc",
+ 	    "--dev", "/dev",
+-	    "--symlink", "usr/bin", "/bin",
+-	    "--symlink", "usr/sbin", "/sbin",
+ 	    "--chdir", "/",
+ 	    "--setenv", "GIO_USE_VFS", "local",
+ 	    "--unshare-all",
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..b98a6a2d676f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-desktop/default.nix
@@ -0,0 +1,53 @@
+{ stdenv, fetchurl, substituteAll, pkgconfig, libxslt, which, libX11, gnome3, gtk3, glib
+, gettext, libxml2, xkeyboard_config, isocodes, itstool, wayland
+, libseccomp, bubblewrap, gobject-introspection, gtk-doc, docbook_xsl }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-desktop-${version}";
+  version = "3.30.2";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-desktop/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0k6iccfj9naw42dl2mgljfvk12dmvg06plg86qd81nksrf9ycxal";
+  };
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [
+    pkgconfig which itstool gettext libxslt libxml2 gobject-introspection
+    gtk-doc docbook_xsl
+  ];
+  buildInputs = [
+    libX11 bubblewrap xkeyboard_config isocodes wayland
+    gtk3 glib libseccomp
+  ];
+
+  propagatedBuildInputs = [ gnome3.gsettings-desktop-schemas ];
+
+  patches = [
+    (substituteAll {
+      src = ./bubblewrap-paths.patch;
+      bubblewrap_bin = "${bubblewrap}/bin/bwrap";
+    })
+  ];
+
+  configureFlags = [
+    "--enable-gtk-doc"
+  ];
+
+  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..1019a809d7f8
--- /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, gtk, glib }:
+
+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 = [ gtk glib gnome3.gsettings-desktop-schemas gnome3.defaultIconTheme ];
+
+  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..5d224623c3ca
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-disk-utility/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, gettext, fetchurl, pkgconfig, udisks2, libsecret, libdvdread
+, meson, ninja, gtk, glib, wrapGAppsHook, python3, libnotify
+, itstool, gnome3, libxml2
+, libcanberra-gtk3, libxslt, docbook_xsl, libpwquality }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-disk-utility-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-disk-utility/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1365fabz3q7n3bl775z82m1nzg18birxxyd7l2ssbbkqrx3h7wgi";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-disk-utility"; attrPath = "gnome3.gnome-disk-utility"; };
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxslt docbook_xsl
+    wrapGAppsHook python3 libxml2
+  ];
+  buildInputs = [
+    gtk glib libsecret libpwquality libnotify libdvdread libcanberra-gtk3
+    udisks2 gnome3.defaultIconTheme
+    gnome3.gnome-settings-daemon gnome3.gsettings-desktop-schemas
+  ];
+
+  postPatch = ''
+    chmod +x meson_post_install.py # patchShebangs requires executable file
+    patchShebangs meson_post_install.py
+  '';
+
+  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..06a5b258c80f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-font-viewer/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, meson, ninja, gettext, fetchurl
+, pkgconfig, gtk3, glib, libxml2
+, wrapGAppsHook, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-font-viewer-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-font-viewer/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1wwnx2zrlbd2d6np7m9s78alx6j6ranrnh1g2z6zrv9qcj8rpzz5";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-font-viewer"; attrPath = "gnome3.gnome-font-viewer"; };
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext wrapGAppsHook libxml2 ];
+  buildInputs = [ gtk3 glib gnome3.gnome-desktop gnome3.defaultIconTheme ];
+
+  # Do not run meson-postinstall.sh
+  preConfigure = "sed -i '2,$ d'  meson-postinstall.sh";
+
+  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..a72efc61e2fe
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-keyring/default.nix
@@ -0,0 +1,63 @@
+{ 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.28.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-keyring/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0sk4las4ji8wv9nx8mldzqccmpmkvvr9pdwv9imj26r10xyin5w1";
+  };
+
+  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
+  '';
+
+  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..4ceb0335c183
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-accounts/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, pkgconfig, vala, glib, libxslt, gtk, wrapGAppsHook
+, webkitgtk, json-glib, rest, libsecret, gtk-doc, gobject-introspection
+, gettext, icu, glib-networking
+, libsoup, docbook_xsl, docbook_xml_dtd_412, gnome3, gcr, kerberos
+}:
+
+let
+  pname = "gnome-online-accounts";
+  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 = "0havx26cfy0ln17jzmzbrrx35afknv2s9mdy34j0p7wmbqr8m5ky";
+  };
+
+  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
+  ];
+  buildInputs = [
+    glib gtk webkitgtk json-glib rest 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..6deefaa36732
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-online-miners/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchurl, pkgconfig, glib, gnome3, libxml2
+, 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";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-online-miners"; attrPath = "gnome3.gnome-online-miners"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook ];
+  buildInputs = [ glib gnome3.libgdata libxml2 libsoup gmp openssl
+                  gnome3.grilo gnome3.libzapojit gnome3.grilo-plugins
+                  gnome3.gnome-online-accounts gnome3.libmediaart
+                  gnome3.tracker gnome3.gfbgraph json-glib gnome3.rest
+                  dleyna-server ];
+
+  enableParallelBuilding = true;
+
+  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..6fab2d5b0b7f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-remote-desktop/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchFromGitLab, meson, ninja, pkgconfig, python3, wrapGAppsHook
+, glib, pipewire, systemd, libvncserver, libsecret, libnotify, gdk_pixbuf, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-remote-desktop-${version}";
+  version = "0.1.6";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "jadahl";
+    repo = "gnome-remote-desktop";
+    rev = version;
+    sha256 = "1d49kxhi1bn8ssh6nybg7d6zajqwc653czbsms2d59dbhj8mn75f";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig python3 wrapGAppsHook ];
+
+  buildInputs = [
+    glib pipewire systemd libvncserver libsecret libnotify
+    gdk_pixbuf # For libnotify
+  ];
+
+  postPatch = ''
+    substituteInPlace meson.build --replace pipewire-0.1 pipewire-0.2
+
+    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..fc39ea812237
--- /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 }:
+
+let
+  pname = "gnome-screenshot";
+  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 = "06dx3svxq6sar4913mrz5lzb7hmc66wck138vmyxj8x8iv1iw0w8";
+  };
+
+  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.defaultIconTheme
+    gnome3.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..2f44a4e168df
--- /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, gtk, 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.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-session/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0fbpq103md4g9gi67rxnwvha21629nxx7qazddy6q6494sbqbzpa";
+  };
+
+  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 gtk libICE gnome-desktop json-glib xorg.xtrans gnome3.defaultIconTheme
+    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..c76ba218c9ac
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/default.nix
@@ -0,0 +1,54 @@
+{ fetchurl, substituteAll, stdenv, meson, ninja, pkgconfig, gnome3, perl, gettext, glib, libnotify, lcms2, libXtst
+, libxkbfile, libpulseaudio, alsaLib, libcanberra-gtk3, upower, colord, libgweather, polkit
+, geoclue2, librsvg, xf86_input_wacom, udev, libgudev, libwacom, libxslt, libxml2, networkmanager
+, docbook_xsl, wrapGAppsHook, python3, ibus, xkeyboard_config, tzdata, nss }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-settings-daemon-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-settings-daemon/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0c663csa3gnsr6wm0xfll6aani45snkdj7zjwjfzcwfh8w4a3z12";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata;
+    })
+  ];
+
+  nativeBuildInputs = [ meson ninja pkgconfig perl gettext libxml2 libxslt docbook_xsl wrapGAppsHook python3 ];
+
+  buildInputs = with gnome3; [
+    ibus gtk glib gsettings-desktop-schemas networkmanager
+    libnotify gnome-desktop lcms2 libXtst libxkbfile libpulseaudio alsaLib
+    libcanberra-gtk3 upower colord libgweather xkeyboard_config nss
+    polkit geocode-glib geoclue2 librsvg xf86_input_wacom udev libgudev libwacom
+  ];
+
+  mesonFlags = [
+    "-Dudev_dir=${placeholder "out"}/lib/udev"
+  ];
+
+  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 = "gnome-settings-daemon";
+      attrPath = "gnome3.gnome-settings-daemon";
+    };
+  };
+
+  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..2229302cab7c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-settings-daemon/fix-paths.patch
@@ -0,0 +1,15 @@
+--- 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;
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..ec6d1af015a5
--- /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.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-shell-extensions/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1grxn4f5x754r172wmnf0h0xpy69afmj359zsj1rwgqlzw4i4c5p";
+  };
+
+  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..c384826de617
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell-extensions/fix_gmenu.patch
@@ -0,0 +1,24 @@
+From f72924a59d4a30daefccf84526bd854ebbe65ac8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tor=20Hedin=20Br=C3=B8nner?= <torhedinbronner@gmail.com>
+Date: Tue, 3 Apr 2018 14:13:12 +0200
+Subject: [PATCH] Fix gmenu typelib path
+
+---
+ extensions/apps-menu/extension.js | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/extensions/apps-menu/extension.js b/extensions/apps-menu/extension.js
+index 5b38213..d706f64 100644
+--- a/extensions/apps-menu/extension.js
++++ b/extensions/apps-menu/extension.js
+@@ -1,5 +1,7 @@
+ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
+ 
++imports.gi.GIRepository.Repository.prepend_search_path('@gmenu_path@');
++
+ const Atk = imports.gi.Atk;
+ const DND = imports.ui.dnd;
+ const GMenu = imports.gi.GMenu;
+-- 
+2.16.2
+
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..76e5bd13522e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-shell/default.nix
@@ -0,0 +1,98 @@
+{ fetchurl, fetchpatch, substituteAll, stdenv, meson, ninja, pkgconfig, gnome3, json-glib, libcroco, gettext, libsecret
+, python3Packages, 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
+, accountsservice, gdk_pixbuf, gdm, upower, ibus, networkmanagerapplet, libgnomekbd
+, sassc, systemd, gst_all_1 }:
+
+# 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 = python3Packages.python.withPackages ( ps: with ps; [ pygobject3 ] );
+
+in stdenv.mkDerivation rec {
+  name = "gnome-shell-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-shell/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0kacd4w9lc5finsvs170i7827qkxwd1ddj0g2giizwffpjdjqqr2";
+  };
+
+  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
+  ];
+  buildInputs = with gnome3; [
+    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 gtk gstreamer gdm libcanberra-gtk3 geoclue2
+    defaultIconTheme gnome3.gnome-bluetooth
+    gnome3.gnome-clocks # schemas needed
+    at-spi2-core upower ibus gnome-desktop telepathy-logger gnome3.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
+    gnome3.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..32a0cc476da0
--- /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
+@@ -1019,7 +1019,7 @@
+         if (xkbVariant.length > 0)
+             description = description + '\t' + xkbVariant;
+ 
+-        Util.spawn(['gkbd-keyboard-display', '-l', description]);
++        Util.spawn(['@libgnomekbd@/bin/gkbd-keyboard-display', '-l', description]);
+     },
+ 
+     _containerGetPreferredWidth: function(container, for_height, alloc) {
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..3c45842fdd40
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-software/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchurl, substituteAll, pkgconfig, meson, ninja, gettext, gnome3, wrapGAppsHook, packagekit, ostree
+, glib, appstream-glib, libsoup, polkit, isocodes, gspell, libxslt, gobject-introspection, flatpak, fwupd
+, 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.30.6";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-software/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "00lh1ifgcs888i0774qdz2pzd5vnzcc5kvx20lcmgk37vvf0qqsl";
+  };
+
+  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
+  ];
+
+  buildInputs = [
+    gnome3.gtk glib packagekit appstream-glib libsoup
+    gnome3.gsettings-desktop-schemas gnome3.gnome-desktop
+    gspell json-glib libsecret ostree
+    polkit flatpak fwupd
+  ];
+
+  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..a1e3ece3db40
--- /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
+, itstool, gnome3, librsvg, gdk_pixbuf, libgtop, systemd }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-system-monitor-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-system-monitor/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0g0y565bjs6bdszrnxsz1f7hcm1x59i3mfvplysirh7nz3hpz888";
+  };
+
+  doCheck = true;
+
+  nativeBuildInputs = [
+    pkgconfig gettext itstool wrapGAppsHook meson ninja python3
+    polkit # for ITS file
+  ];
+  buildInputs = [
+    bash gtk3 glib libxml2 gtkmm3 libgtop gdk_pixbuf gnome3.defaultIconTheme librsvg
+    gnome3.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..4765edbcf7e5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-terminal/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, fetchurl, pkgconfig, libxml2, gnome3, dconf, nautilus
+, gtk, gsettings-desktop-schemas, vte, intltool, which, libuuid, vala
+, desktop-file-utils, itstool, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-terminal-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-terminal/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0f2y76gs72sw5l5lkkkvxzsvvwm0sg83h7nl8lk5kz1v1rrc47vb";
+  };
+
+  buildInputs = [
+    gtk 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..b6c40b28ab1a
--- /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.defaultIconTheme ];
+
+  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..7062dbafce8a
--- /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.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-user-docs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1pgsrvd79rqxa183wsmzh422y2zsg7fl5hskgc0s87jsc8b57fkg";
+  };
+
+  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..6a5d2fde5018
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gnome-user-share/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, intltool, fetchurl, apacheHttpd, nautilus
+, pkgconfig, gtk3, glib, libxml2, systemd
+, wrapGAppsHook, itstool, libnotify, libtool, mod_dnssd
+, gnome3, librsvg, gdk_pixbuf, file, libcanberra-gtk3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-user-share-${version}";
+  version = "3.28.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-user-share/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "04wjnrcdlmyszj582nsda32sgi44nwgrw2ksy11xp17nb09d7m09";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-user-share"; attrPath = "gnome3.gnome-user-share"; };
+  };
+
+  doCheck = true;
+
+  NIX_CFLAGS_COMPILE = "-I${gnome3.glib.dev}/include/gio-unix-2.0";
+
+  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=$(out)/etc/systemd/user"
+                     "--with-nautilusdir=$(out)/lib/nautilus/extensions-3.0" ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk3 glib intltool itstool libxml2 libtool
+                  wrapGAppsHook file gdk_pixbuf gnome3.defaultIconTheme librsvg
+                  nautilus libnotify libcanberra-gtk3 systemd ];
+
+  postInstall = ''
+    mkdir -p $out/share/gsettings-schemas/$name
+    mv $out/share/glib-2.0 $out/share/gsettings-schemas/$name
+    glib-compile-schemas "$out/share/gsettings-schemas/$name/glib-2.0/schemas"
+  '';
+
+  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..ab2ead7d3449
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/grilo-plugins/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gettext, sqlite
+, gnome3, libxml2, gupnp, gssdp, lua5, liboauth, gupnp-av
+, gmime, json-glib, avahi, tracker, dleyna-server, itstool, totem-pl-parser }:
+
+let
+  pname = "grilo-plugins";
+  version = "0.3.8";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0nync07gah3jkpb5ph5d3gwbygmabnih2m3hfz7lkvjl2l5pgpac";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext itstool ];
+  buildInputs = [
+    gnome3.grilo libxml2 gupnp gssdp gnome3.libgdata
+    lua5 liboauth gupnp-av sqlite gnome3.gnome-online-accounts
+    totem-pl-parser gnome3.rest gmime json-glib
+    avahi gnome3.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/gsettings-desktop-schemas/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/gsettings-desktop-schemas/default.nix
new file mode 100644
index 000000000000..dad0c8850b22
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gsettings-desktop-schemas/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, gobject-introspection
+  # just for passthru
+, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gsettings-desktop-schemas-${version}";
+  version = "3.28.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gsettings-desktop-schemas/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0bshwm49cd01ighsxqlbqn10q0ch71ff99gcrx8pr2gyky2ad3pq";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gsettings-desktop-schemas"; };
+  };
+
+  preInstall = ''
+    mkdir -p $out/share/gsettings-schemas/${name}/glib-2.0/schemas
+    cat - > $out/share/gsettings-schemas/${name}/glib-2.0/schemas/remove-backgrounds.gschema.override <<- EOF
+      [org.gnome.desktop.background]
+      picture-uri='''
+
+      [org.gnome.desktop.screensaver]
+      picture-uri='''
+    EOF
+  '';
+
+  buildInputs = [ glib gobject-introspection ];
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  meta = with stdenv.lib; {
+    maintainers = gnome3.maintainers;
+  };
+}
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..a968bfd2b569
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/gucharmap/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, intltool, fetchFromGitLab, fetchpatch, pkgconfig, gtk3, defaultIconTheme
+, 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 {
+  name = "gucharmap-${version}";
+  version = "11.0.3";
+
+  outputs = [ "out" "lib" "dev" "devdoc" ];
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "GNOME";
+    repo = "gucharmap";
+    rev = version;
+    sha256 = "1a590nxy8jdf6zxh6jdsyvhxyaz94ixx3aa1pj7gicf1aqp26vnh";
+  };
+
+  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 defaultIconTheme ];
+
+  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 = "gucharmap";
+    };
+  };
+
+  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..6bf2fd39a2d3
--- /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 = "11.0.0";
+  srcs = [
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/Blocks.txt";
+      sha256 = "0lnh9iazikpr548bd7nkaq9r3vfljfvz0rg2462prac8qxk7ni8b";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/DerivedAge.txt";
+      sha256 = "0rlqqd0b1sqbzvrj29dwdizx8lyvrbfirsnn8za9lb53x5fml4gb";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/NamesList.txt";
+      sha256 = "0yr2h0nfqhirfi3bxl33z6cc94qqshlpgi06c25xh9754irqsgv8";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/Scripts.txt";
+      sha256 = "1mbnvf97nwa3pvyzx9nd2wa94f8s0npg9740kic2p2ag7jmc1wz9";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/UnicodeData.txt";
+      sha256 = "16b0jzvvzarnlxdvs2izd5ia0ipbd87md143dc6lv6xpdqcs75s9";
+    })
+    (fetchurl {
+      url = "http://www.unicode.org/Public/${version}/ucd/Unihan.zip";
+      sha256 = "0cy8gxb17ksi5h4ysypk4c09z61am1svjrvg97hm5m5ccjfrs1vj";
+    })
+  ];
+  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..e80212713aae
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/3.28.nix
@@ -0,0 +1,55 @@
+{ fetchurl, stdenv, fetchpatch, pkgconfig, gnome3, intltool, gobject-introspection, upower, cairo
+, pango, cogl, clutter, libstartup_notification, zenity, libcanberra-gtk3
+, libtool, makeWrapper, xkeyboard_config, libxkbfile, libxkbcommon, libXtst, libinput
+, pipewire, libgudev, libwacom, xwayland, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+  name = "mutter-${version}";
+  version = "3.28.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/mutter/3.28/${name}.tar.xz";
+    sha256 = "0vq3rmq20d6b1mi6sf67wkzqys6hw5j7n7fd4hndcp19d5i26149";
+  };
+
+  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 makeWrapper ];
+
+  buildInputs = with gnome3; [
+    glib gobject-introspection gtk gsettings-desktop-schemas upower
+    gnome-desktop cairo pango cogl clutter zenity libstartup_notification
+    gnome3.geocode-glib libinput libgudev libwacom
+    libcanberra-gtk3 zenity xkeyboard_config libxkbfile
+    libxkbcommon pipewire
+  ];
+
+  preFixup = ''
+    wrapProgram "$out/bin/mutter" \
+      --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
+  '';
+
+  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..9a1418cbe0a9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/mutter/default.nix
@@ -0,0 +1,59 @@
+{ fetchurl, stdenv, pkgconfig, gnome3, intltool, gobject-introspection, upower, cairo
+, pango, cogl, clutter, libstartup_notification, zenity, libcanberra-gtk3
+, libtool, makeWrapper, xkeyboard_config, libxkbfile, libxkbcommon, libXtst, libinput
+, pipewire, libgudev, libwacom, xwayland, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+  name = "mutter-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/mutter/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0qr3w480p31nbiad49213rj9rk6p9fl82a68pzznpz36p30dq96z";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "mutter"; attrPath = "gnome3.mutter"; };
+  };
+
+  configureFlags = [
+    "--with-x"
+    "--disable-static"
+    "--enable-remote-desktop"
+    "--enable-shape"
+    "--enable-sm"
+    "--enable-startup-notification"
+    "--enable-xsync"
+    "--enable-verbose-mode"
+    "--with-libcanberra"
+    "--with-xwayland-path=${xwayland}/bin/Xwayland"
+  ];
+
+  propagatedBuildInputs = [
+    # required for pkgconfig to detect mutter-clutter
+    libXtst
+  ];
+
+  nativeBuildInputs = [ autoreconfHook pkgconfig intltool libtool makeWrapper ];
+
+  buildInputs = with gnome3; [
+    glib gobject-introspection gtk gsettings-desktop-schemas upower
+    gnome-desktop cairo pango cogl clutter zenity libstartup_notification
+    gnome3.geocode-glib libinput libgudev libwacom
+    libcanberra-gtk3 zenity xkeyboard_config libxkbfile
+    libxkbcommon pipewire
+  ];
+
+  preFixup = ''
+    wrapProgram "$out/bin/mutter" \
+      --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    platforms = platforms.linux;
+    maintainers = gnome3.maintainers;
+    license = licenses.gpl2;
+  };
+}
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..051b7618612c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/nautilus/bubblewrap-paths.patch
@@ -0,0 +1,19 @@
+---   a/src/gnome-desktop/gnome-desktop-thumbnail-script.c
++++   a/src/gnome-desktop/gnome-desktop-thumbnail-script.c
+@@ -514,14 +514,10 @@ add_bwrap (GPtrArray   *array,
+   g_return_val_if_fail (script->s_infile != NULL, FALSE);
+ 
+   add_args (array,
+-	    "bwrap",
+-	    "--ro-bind", "/usr", "/usr",
+-	    "--ro-bind", "/lib", "/lib",
+-	    "--ro-bind", "/lib64", "/lib64",
++      "@bubblewrap_bin@",
++      "--ro-bind", "@storeDir@", "@storeDir@",
+ 	    "--proc", "/proc",
+ 	    "--dev", "/dev",
+-	    "--symlink", "usr/bin", "/bin",
+-	    "--symlink", "usr/sbin", "/sbin",
+ 	    "--chdir", "/",
+ 	    "--setenv", "GIO_USE_VFS", "local",
+ 	    "--unshare-all",
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..b581d8f09837
--- /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 , gtk, gnome3, gnome-autoar
+, glib-networking, shared-mime-info, libnotify, libexif, libseccomp , exempi
+, librsvg, tracker, tracker-miners, gexiv2, libselinux, gdk_pixbuf
+, substituteAll, bubblewrap
+}:
+
+let
+  pname = "nautilus";
+  version = "3.30.5";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "144r4py9b8w9ycsg6fggjg05kwvymh003qsb3h6apgpch5y3zgnv";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig libxml2 gettext python3 wrapGAppsHook
+    desktop-file-utils
+  ];
+
+  buildInputs = [
+    glib-networking shared-mime-info libexif gtk exempi libnotify libselinux
+    tracker tracker-miners gexiv2 libseccomp bubblewrap
+    gnome3.adwaita-icon-theme gnome3.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/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/rygel/default.nix
new file mode 100644
index 000000000000..5d60500b3636
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/rygel/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchurl, pkgconfig, vala, gettext, libxml2, gobject-introspection, gtk-doc, wrapGAppsHook, glib, gssdp, gupnp, gupnp-av, gupnp-dlna, gst_all_1, libgee, libsoup, gtk3, libmediaart, sqlite, systemd, tracker, shared-mime-info, gnome3 }:
+
+let
+  pname = "rygel";
+  version = "0.36.2";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  # TODO: split out lib
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0i12z6bzfzgcjidhxa2jsvpm4hqpab0s032z13jy2vbifrncfcnk";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig vala gettext libxml2 gobject-introspection gtk-doc wrapGAppsHook
+  ];
+  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
+  ]);
+
+  configureFlags = [
+    "--with-systemduserunitdir=$(out)/lib/systemd/user"
+    "--enable-apidocs"
+    "--sysconfdir=/etc"
+  ];
+
+  installFlags = [
+    "sysconfdir=$(out)/etc"
+  ];
+
+  doCheck = true;
+
+  enableParallelBuilding = true;
+
+  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..ef79f972ff0f
--- /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, gtk, gusb, packagekit, libwebp
+, libxml2, sane-backends, vala, gnome3, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  name = "simple-scan-${version}";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/simple-scan/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0dknvdjlnxrp9nxd3yr8wyjc4kv94nwglss8pr6rfvl4hnlly53i";
+  };
+
+  buildInputs = [
+    cairo gdk_pixbuf colord glib gnome3.defaultIconTheme gusb
+    gtk 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..77c216e73764
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/sushi/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, file, intltool, gobject-introspection, glib
+, clutter-gtk, clutter-gst, gnome3, aspell, hspell, gtksourceview, gjs
+, webkitgtk, libmusicbrainz5, icu, wrapGAppsHook, gst_all_1
+, gdk_pixbuf, librsvg, gtk3, harfbuzz }:
+
+stdenv.mkDerivation rec {
+  name = "sushi-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/sushi/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0zpaiw5r734fky3zq95a6szwn7srbkpixajqg2xvdivhhx4mbnnj";
+  };
+
+  nativeBuildInputs = [ pkgconfig file intltool 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
+    # cannot find -laspell, -lhspell
+    aspell hspell
+  ];
+
+  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..3565931e4df1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/totem/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, fetchurl, meson, ninja, intltool, gst_all_1
+, clutter-gtk, clutter-gst, python3Packages, shared-mime-info
+, pkgconfig, gtk3, glib, gobject-introspection, totem-pl-parser
+, wrapGAppsHook, itstool, libxml2, vala, gnome3
+, gdk_pixbuf, tracker, nautilus }:
+
+stdenv.mkDerivation rec {
+  name = "totem-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/totem/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0rahkybxbmxhlmrrgrzxny1xm7wycx7ib4blxp1i2l1q3i8s84b0";
+  };
+
+  doCheck = true;
+
+  NIX_CFLAGS_COMPILE = "-I${gnome3.glib.dev}/include/gio-unix-2.0";
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig intltool python3Packages.python itstool gobject-introspection wrapGAppsHook ];
+  buildInputs = [
+    gtk3 glib gnome3.grilo clutter-gtk clutter-gst totem-pl-parser gnome3.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 gnome3.libpeas shared-mime-info
+    gdk_pixbuf libxml2 gnome3.defaultIconTheme gnome3.gnome-desktop
+    gnome3.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"
+  ];
+
+  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..7127ab71b1fc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/default.nix
@@ -0,0 +1,100 @@
+{ stdenv, fetchurl, substituteAll, intltool, itstool, libxslt
+, 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.1.5";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1kdq7fk9c80ngg65p31pjdk4za0fq7nfhblqsma9alvkam5kvzgm";
+  };
+
+  nativeBuildInputs = [
+    intltool
+    itstool
+    libxslt
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  # TODO: add libenca, libosinfo
+  buildInputs = [
+    bzip2
+    dbus
+    evolution-data-server
+    exempi
+    flac
+    giflib
+    glib
+    gnome3.gexiv2
+    totem-pl-parser
+    gnome3.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"
+  ];
+
+  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..47ad114eb0b5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker-miners/fix-paths.patch
@@ -0,0 +1,42 @@
+--- a/meson.build
++++ b/meson.build
+@@ -25,15 +25,15 @@
+   #
+   # This check acts as a guard to make sure we are being configured with the
+   # right prefix, among other things.
+-  tracker_store = find_program(join_paths(get_option('prefix'), get_option('libexecdir'), 'tracker-store'))
++  tracker_store = find_program(join_paths(tracker_miner.get_pkgconfig_variable('prefix'), 'libexec', 'tracker-store'))
+   tracker_store_path = tracker_store.path()
+ 
+   # If we are building against an installed version of tracker core rather than
+   # having it as a subproject, these 'uninstalled' locations point to the actual
+   # installed locations.
+-  tracker_uninstalled_domain_rule = join_paths(get_option('prefix'), get_option('datadir'), 'tracker', 'domain-ontologies', 'default.rule')
+-  tracker_uninstalled_nepomuk_ontologies_dir = join_paths(get_option('prefix'), get_option('datadir'), 'tracker', 'ontologies', 'nepomuk')
+-  tracker_uninstalled_stop_words_dir = join_paths(get_option('prefix'), get_option('datadir'), 'tracker', 'stop-words', 'default.rule')
++  tracker_uninstalled_domain_rule = join_paths(tracker_miner.get_pkgconfig_variable('prefix'), 'share', 'tracker', 'domain-ontologies', 'default.rule')
++  tracker_uninstalled_nepomuk_ontologies_dir = join_paths(tracker_miner.get_pkgconfig_variable('prefix'), 'share', 'tracker', 'ontologies', 'nepomuk')
++  tracker_uninstalled_stop_words_dir = join_paths(tracker_miner.get_pkgconfig_variable('prefix'), 'share', 'tracker', 'stop-words', 'default.rule')
+ else
+   tracker_subproject = subproject('tracker',
+     default_options: [
+--- 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..d744fc6c87c7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/tracker/default.nix
@@ -0,0 +1,78 @@
+{ stdenv, fetchurl, fetchFromGitLab, intltool, meson, ninja, pkgconfig, gobject-introspection, python2
+, 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 }:
+
+let
+  pname = "tracker";
+  version = "2.1.6";
+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 = "143zapq50lggj3mpqg2y4rh1hgnkbn9vgvzpqxr7waiawsmx0awq";
+  };
+
+  nativeBuildInputs = [
+    meson ninja vala pkgconfig intltool libxslt wrapGAppsHook gobject-introspection
+    gtk-doc docbook_xsl docbook_xml_dtd_412 docbook_xml_dtd_43 glibcLocales
+    python2 # for data-generators
+  ];
+
+  buildInputs = [
+    glib libxml2 sqlite upower icu networkmanager libsoup libuuid json-glib libstemmer
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  mesonFlags = [
+    "-Ddbus_services=share/dbus-1/services"
+    "-Dsystemd_user_services=lib/systemd/user"
+    # TODO: figure out wrapping unit tests, some of them fail on missing gsettings-desktop-schemas
+    "-Dfunctional_tests=false"
+  ];
+
+  patches = [
+    # Always generate tracker-sparql.h in time
+    (fetchurl {
+      url = https://gitlab.gnome.org/GNOME/tracker/commit/3cbfaa5b374e615098e60eb4430f108b642ebe76.diff;
+      sha256 = "0smavzvsglpghggrcl8sjflki13nh7pr0jl2yv6ymbf5hr1c4dws";
+    })
+  ];
+
+  postPatch = ''
+    patchShebangs utils/g-ir-merge/g-ir-merge
+    patchShebangs utils/data-generators/cc/generate
+
+    # make .desktop Exec absolute
+    patch -p0 <<END_PATCH
+    +++ src/tracker-store/tracker-store.desktop.in.in
+    @@ -4 +4 @@
+    -Exec=gdbus call -e -d org.freedesktop.DBus -o /org/freedesktop/DBus -m org.freedesktop.DBus.StartServiceByName org.freedesktop.Tracker1 0
+    +Exec=${glib.dev}/bin/gdbus call -e -d org.freedesktop.DBus -o /org/freedesktop/DBus -m org.freedesktop.DBus.StartServiceByName org.freedesktop.Tracker1 0
+    END_PATCH
+  '';
+
+  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/vino/default.nix b/nixpkgs/pkgs/desktops/gnome-3/core/vino/default.nix
new file mode 100644
index 000000000000..6ec2b0a17edb
--- /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.defaultIconTheme 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..6f487eacf972
--- /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.28.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp-tools/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1b61dmlb1sd50fgq6zgnkcpx2s1py33q0x9cx67fzpsr4gmgxnw2";
+  };
+
+  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..7e98012998dc
--- /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.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp-xsl/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0ffgp3ymcc11r9sdndliwwngljcy1mfqpfxsdfbm8rlcjg2k3vzw";
+  };
+
+  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..26bcb3171902
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/yelp/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, intltool, fetchurl, webkitgtk, pkgconfig, gtk3, glib
+, gnome3, sqlite
+, itstool, libxml2, libxslt, gst_all_1
+, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "yelp-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/yelp/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "060a902j15k76fyhk8xfl38ipvrrcc0qd7nm2mcck4ifb45b0zv4";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool itstool wrapGAppsHook ];
+  buildInputs = [
+    gtk3 glib webkitgtk sqlite
+    libxml2 libxslt gnome3.yelp-xsl
+    gnome3.defaultIconTheme
+    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..e80c437afdae
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/core/zenity/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, libxml2, libxslt, gnome3
+, gnome-doc-utils, intltool, libX11, which, itstool, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "zenity-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/zenity/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1wipnp46pd238z9ck5rsckbaw7yla6c936fswq5w94k4c6bgcplr";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "zenity"; attrPath = "gnome3.zenity"; };
+  };
+
+  preBuild = ''
+    mkdir -p $out/include
+  '';
+
+  buildInputs = [ gnome3.gtk libxml2 libxslt libX11 itstool ];
+
+  nativeBuildInputs = [ pkgconfig intltool gnome-doc-utils which wrapGAppsHook ];
+
+  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..34b3faf71a41
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/default.nix
@@ -0,0 +1,402 @@
+{ 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 defaultIconTheme 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
+  ];
+
+  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;
+
+  libsoup = pkgs.libsoup.override { gnomeSupport = true; };
+  libchamplain = pkgs.libchamplain.override { libsoup = libsoup; };
+  gnome3 = self // { recurseForDerivations = false; };
+  gtk = gtk3;
+  gtkmm = gtkmm3;
+  vala = pkgs.vala_0_42;
+  gegl_0_4 = pkgs.gegl_0_4.override { inherit gtk; };
+  rest = librest;
+
+# Simplify the nixos module and gnome packages
+  defaultIconTheme = adwaita-icon-theme;
+
+# 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 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 { };
+
+  gsettings-desktop-schemas = callPackage ./core/gsettings-desktop-schemas { };
+
+  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-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 = geocode-glib; # added 2018-02-25
+  glib_networking = 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
+
+})
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..dcf0bd439420
--- /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,
+  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
+    gnome3.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..052cd49998d1
--- /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.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/devhelp/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "036sddvhs0blqpc2ixmjdl9vxynvkn5jpgn0jxr1fxcm4rh3q07a";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext itstool wrapGAppsHook appstream-glib gobject-introspection python3 ];
+  buildInputs = [
+    glib gtk3 webkitgtk amtk
+    gnome3.defaultIconTheme 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..534c23da82c9
--- /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.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-devel-docs/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1sssxagf0aaiyld8731247qq74bnrnq4arr7mpjrg0j6gwdfgxia";
+  };
+
+  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..c8440037d3c9
--- /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, gtkmm, 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 gtkmm 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..c576112d57b9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/appindicator/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-appindicator-${version}";
+  version = "22";
+
+  src = fetchFromGitHub {
+    owner = "Ubuntu";
+    repo = "gnome-shell-extension-appindicator";
+    rev = "v${version}";
+    sha256 = "1gqw54d55hxjj2hh04p0dx2j40bhi4ck9hgwlz8f7j4v7r37z0qw";
+  };
+
+  # 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 ];
+    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..e1fe15c19d80
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/battery-status/default.nix
@@ -0,0 +1,27 @@
+{ 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;
+    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..1de85ab36d25
--- /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-2018-09-25";
+
+  src = fetchFromGitHub {
+    owner = "eonpatapon";
+    repo = "gnome-shell-extension-caffeine";
+    rev = "71b6392c53e063563602c3d919c0ec6a4c5c9733";
+    sha256 = "170zyxa41hvyi463as650nw3ygr297901inr3xslrhvjq1qacxri";
+  };
+
+  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..3064b62f2a4a
--- /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";
+
+  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 = "1wp6qvcp758yfj8xlj15sk1d3jsb1p8136y8xxwpi9wfdjpzjs8j";
+  };
+
+  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..62420bf42b26
--- /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 = "64";
+
+  src = fetchFromGitHub {
+    owner = "micheleg";
+    repo = "dash-to-dock";
+    rev = "extensions.gnome.org-v" + version;
+    sha256 = "1cfkdi4raim50wif47fly4c0lzyamysv40qd5ppr1h824bamzxcm";
+  };
+
+  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..de442d912b32
--- /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 = "16";
+
+  src = fetchFromGitHub {
+    owner = "jderose9";
+    repo = "dash-to-panel";
+    rev = "v${version}";
+    sha256 = "1gi2qfinafihax0j0rbs1k5nf6msdv86gzl2vfkc8s6gfkncv9bp";
+  };
+
+  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..9c2f72cce664
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/gsconnect/default.nix
@@ -0,0 +1,91 @@
+{ stdenv, fetchFromGitHub, substituteAll, python3, openssl
+, meson, ninja, libxml2, pkgconfig, gobject-introspection, wrapGAppsHook
+, glib, gtk3, at-spi2-core, upower, openssh, gnome3 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-gsconnect-${version}";
+  version = "20";
+
+  src = fetchFromGitHub {
+    owner = "andyholmes";
+    repo = "gnome-shell-extension-gsconnect";
+    rev = "v${version}";
+    sha256 = "1x5lrb4hdw482hr5dh4ki0p1651w1s0ijs96vs65vrh15cd60h02";
+  };
+
+  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
+    gnome3.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
+    gnome3.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 [ gnome3.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..bc397dc7122a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/icon-hider/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-icon-hider-${version}";
+  version = "21";
+
+  src = fetchFromGitHub {
+    owner = "ikalnytskyi";
+    repo = "gnome-shell-extension-icon-hider";
+    rev = "v${version}";
+    sha256 = "0l0jb0ishaq00d4kdfvv5p7pj7b45dz57y3j2ihqr695bzb6b9hr";
+  };
+
+  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 = platforms.linux;
+    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..6038443944f2
--- /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 = "3.5";
+
+  src = fetchFromGitHub {
+    owner = "JasonLG1979";
+    repo = "gnome-shell-extensions-mediaplayer";
+    rev = version;
+    sha256 = "0b8smid9vdybgs0601q9chlbgfm1rzrj3vmd3i6p2a5d1n4fyvsc";
+  };
+
+  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..e1dedd2a88be
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/no-title-bar/default.nix
@@ -0,0 +1,35 @@
+{ 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;
+    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..07622e07a725
--- /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 = "18.0";
+
+  src = fetchFromGitHub {
+    owner = "HROMANO";
+    repo = "nohotcorner";
+    rev = "v${version}";
+    sha256 = "0vajiys93gs7fs9v6brgf8fplkmh28j103in3wq04l34cx5sqkks";
+  };
+
+  # 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..42cd6d217de7
--- /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 = "9";
+
+  src = fetchFromGitHub {
+    owner = "mpdeimos";
+    repo = "gnome-shell-remove-dropdown-arrows";
+    rev = "version/${version}";
+    sha256 = "1z9icxr75rd3cas28xjlmsbbd3j3sm1qvj6mp95jhfaqj821q665";
+  };
+
+  # 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/system-monitor/default.nix b/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/default.nix
new file mode 100644
index 000000000000..8bafbd003d51
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/system-monitor/default.nix
@@ -0,0 +1,45 @@
+{ 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;
+    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..fcaa868c06f2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, substituteAll, fetchFromGitHub, taskwarrior }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-shell-extension-taskwhisperer-${version}";
+  version = "11";
+
+  src = fetchFromGitHub {
+    owner = "cinatic";
+    repo = "taskwhisperer";
+    rev = "v${version}";
+    sha256 = "1g1301rwnfg5jci78bjpmgxrn78ra80m1zp2inhfsm8jssr1i426";
+  };
+
+  buildInputs = [ taskwarrior ];
+
+  uuid = "taskwhisperer-extension@infinicode.de";
+
+  installPhase = ''
+    mkdir -p $out/share/gnome-shell/extensions/${uuid}
+    cp *.js $out/share/gnome-shell/extensions/${uuid}
+    cp -r extra $out/share/gnome-shell/extensions/${uuid}
+    cp -r icons $out/share/gnome-shell/extensions/${uuid}
+    cp -r locale $out/share/gnome-shell/extensions/${uuid}
+    cp -r schemas $out/share/gnome-shell/extensions/${uuid}
+    cp metadata.json $out/share/gnome-shell/extensions/${uuid}
+    cp settings.ui $out/share/gnome-shell/extensions/${uuid}
+    cp stylesheet.css $out/share/gnome-shell/extensions/${uuid}
+  '';
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      task = "${taskwarrior}/bin/task";
+    })
+  ];
+
+  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..310d6ea1b305
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/extensions/taskwhisperer/fix-paths.patch
@@ -0,0 +1,81 @@
+diff --git a/extra/create.sh b/extra/create.sh
+index a69e369..35d5ea1 100755
+--- a/extra/create.sh
++++ b/extra/create.sh
+@@ -1 +1 @@
+-bash -c "task add $1"
++bash -c "@task@ add $1"
+diff --git a/extra/modify.sh b/extra/modify.sh
+index 7964a26..8edd21b 100755
+--- a/extra/modify.sh
++++ b/extra/modify.sh
+@@ -1 +1 @@
+-bash -c "task $1 modify $2"
++bash -c "@task@ $1 modify $2"
+diff --git a/taskService.js b/taskService.js
+index dea40d8..ff35a80 100644
+--- a/taskService.js
++++ b/taskService.js
+@@ -186,7 +186,7 @@ const TaskService = new Lang.Class({
+ 
+         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 = "";
+@@ -227,7 +227,7 @@ const TaskService = new Lang.Class({
+                 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;
+@@ -274,7 +274,7 @@ const TaskService = new Lang.Class({
+             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;
+@@ -307,7 +307,7 @@ const TaskService = new Lang.Class({
+             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;
+@@ -339,7 +339,7 @@ const TaskService = new Lang.Class({
+         {
+             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);
+@@ -369,7 +369,7 @@ const TaskService = new Lang.Class({
+         {
+             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);
+@@ -468,7 +468,7 @@ const TaskService = new Lang.Class({
+ 
+         try
+         {
+-            shellProc = Gio.Subprocess.new(['task', 'sync'], Gio.SubprocessFlags.STDOUT_PIPE);
++            shellProc = Gio.Subprocess.new(['@task@', 'sync'], Gio.SubprocessFlags.STDOUT_PIPE);
+         }
+         catch(err)
+         {
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..dcc018d18837
--- /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 = "2018.03.17";
+
+  src = fetchFromGitHub {
+    owner = "zagortenay333";
+    repo = "timepp__gnome";
+    rev = "440cf85dc68d9e6ba876793f13910ee6239622cf";
+    sha256 = "0idsqsii5rvynvj78w2j7xiiz9rrl3384m5mj6bf6rg8vprpfi8v";
+  };
+
+  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/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..d77439b30c52
--- /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 {
+  name = "aisleriot-${version}";
+  version = "3.22.7";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/aisleriot/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1ysljnrlvzssgbhxcgb28n9k3l0rybxi5lkrm8pg6a4nspaw5mc4";
+  };
+
+  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 = "aisleriot";
+      attrPath = "gnome3.aisleriot";
+    };
+  };
+
+  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..b8171ef31856
--- /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.30.0.1";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0hvr36m8ixa172zblv29fga1cn9yb84zqbisb21msfkwia2pabw3";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext wrapGAppsHook python3 ];
+  buildInputs = [ glib gtk3 gdk_pixbuf libgnome-games-support gnome3.defaultIconTheme ];
+
+  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..4e302e9f8b11
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/five-or-more/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, meson, ninja, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libgnome-games-support, gettext, itstool, libxml2, python3 }:
+
+stdenv.mkDerivation rec {
+  name = "five-or-more-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/five-or-more/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "00d729p251kh96624i7qg2370r5mxwafs016i6hy01vsr71jzb9x";
+  };
+
+  nativeBuildInputs = [ meson ninja pkgconfig gettext itstool libxml2 python3 wrapGAppsHook ];
+  buildInputs = [
+    gtk3 librsvg libgnome-games-support gnome3.defaultIconTheme
+  ];
+
+  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..110e2e5c4393
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/four-in-a-row/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, gettext, itstool, libcanberra-gtk3, librsvg, libxml2 }:
+
+stdenv.mkDerivation rec {
+  name = "four-in-a-row-${version}";
+  version = "3.28.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/four-in-a-row/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1iszaay2r92swb0q67lmip6r1w3hw2dwmlgnz9v2h6blgdyncs4k";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook gettext itstool libxml2 ];
+  buildInputs = [ gtk3 libcanberra-gtk3 librsvg gnome3.defaultIconTheme ];
+
+  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..8e5cf198d9db
--- /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.30.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-chess/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1gzdm6z54kxx06lh616g33klrp4dby2a68wxvjpsavdll28kgwgl";
+  };
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig gettext itstool libxml2 python3 wrapGAppsHook gobject-introspection ];
+  buildInputs = [ glib gtk3 librsvg gnome3.defaultIconTheme ];
+
+  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..0b4d6d770b0d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-klotski/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, vala, gnome3, gtk3, wrapGAppsHook, appstream-glib, desktop-file-utils
+, glib, librsvg, libxml2, intltool, itstool, libgee, libgnome-games-support }:
+
+let
+  pname = "gnome-klotski";
+  version = "3.22.3";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0prc0s28pdflgzyvk1g0yfx982q2grivmz3858nwpqmbkha81r7f";
+  };
+
+  nativeBuildInputs = [ pkgconfig vala wrapGAppsHook intltool itstool libxml2 appstream-glib desktop-file-utils ];
+  buildInputs = [ glib gtk3 librsvg libgee libgnome-games-support gnome3.defaultIconTheme ];
+
+  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..29763abba559
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mahjongg/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, intltool, itstool, libxml2 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-mahjongg-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-mahjongg/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "f5972a14fa4ad04153bd6e68475b85cd79c6b44f6cac1fe1edb64dbad4135218";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-mahjongg"; attrPath = "gnome3.gnome-mahjongg"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    gtk3 wrapGAppsHook librsvg intltool itstool libxml2
+    gnome3.defaultIconTheme
+  ];
+
+  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..7896595de187
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-mines/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, meson, ninja, vala, gobject-introspection, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, gettext, itstool, python3, libxml2, libgnome-games-support, libgee }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-mines-${version}";
+  version = "3.30.1.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-mines/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "08ddk400sg1g3q26gnm5mgv81vdqyix0yl7pd47p50vkc1w6f33z";
+  };
+
+  # gobject-introspection for finding vapi files
+  nativeBuildInputs = [ meson ninja vala gobject-introspection pkgconfig gettext itstool python3 libxml2 wrapGAppsHook ];
+  buildInputs = [ gtk3 librsvg gnome3.defaultIconTheme libgnome-games-support libgee ];
+
+  postPatch = ''
+    chmod +x data/meson_compile_gschema.py # patchShebangs requires executable file
+    patchShebangs data/meson_compile_gschema.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..e36ca2a639d1
--- /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.24.1";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-nibbles/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "19g44cnrb191v50bdvy2qkrfhvyfsahd0kx9hz95x9gkjfn2nn35";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook intltool itstool libxml2 ];
+  buildInputs = [
+    gtk3 librsvg libcanberra-gtk3 clutter-gtk gnome3.defaultIconTheme
+    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..19a6b60fb5bd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-robots/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libcanberra-gtk3, intltool, itstool, libxml2, libgnome-games-support
+, libgee}:
+
+stdenv.mkDerivation rec {
+  name = "gnome-robots-${version}";
+  version = "3.22.3";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-robots/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0dzcjd7rdmlzgr6rmljhrbccwif8wj0cr1xcrrj7malj33098wwk";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-robots"; attrPath = "gnome3.gnome-robots"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    gtk3 wrapGAppsHook intltool itstool librsvg libcanberra-gtk3
+    libxml2 gnome3.defaultIconTheme libgnome-games-support libgee
+  ];
+
+  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..eaa9f3a1c8dc
--- /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
+, json-glib, qqwing, itstool, libxml2, python3, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-sudoku-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-sudoku/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1xy986s51jnrcqwan2hy4bjdg6797yr9s7gxx2z2q4j4gkx3qa1f";
+  };
+
+  nativeBuildInputs = [ meson ninja vala pkgconfig gobject-introspection gettext itstool libxml2 python3 desktop-file-utils wrapGAppsHook ];
+  buildInputs = [ gtk3 gnome3.libgee json-glib qqwing ];
+
+  postPatch = ''
+    chmod +x post_install.py # patchShebangs requires executable file
+    patchShebangs 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..75f511b17d05
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-taquin/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, librsvg, libcanberra-gtk3, intltool, itstool, libxml2 }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-taquin-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-taquin/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0qijv7wyrjlj56m79la4k7m00712v2m1m994vfx43x3v4isxidgp";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-taquin"; attrPath = "gnome3.gnome-taquin"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    gtk3 wrapGAppsHook librsvg libcanberra-gtk3
+    intltool itstool libxml2 gnome3.defaultIconTheme
+  ];
+
+  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..fe81b429e999
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/gnome-tetravex/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, libxml2, intltool, itstool }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-tetravex-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-tetravex/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0a6d7ff5ffcd6c05454a919d46a2e389d6b5f87bc80e82c52c2f20d9d914e18d";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "gnome-tetravex"; attrPath = "gnome3.gnome-tetravex"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    gtk3 wrapGAppsHook intltool itstool libxml2 gnome3.defaultIconTheme
+  ];
+
+  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..8d4be7f1c6b0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/hitori/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, gnome3, gtk3, wrapGAppsHook
+, libxml2, intltool, itstool }:
+
+stdenv.mkDerivation rec {
+  name = "hitori-${version}";
+  version = "3.22.4";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/hitori/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "dcac6909b6007857ee425ac8c65fed179f2c71da138d5e5300cd62c8b9ea15d3";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "hitori"; attrPath = "gnome3.hitori"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    gtk3 wrapGAppsHook intltool itstool libxml2
+    gnome3.defaultIconTheme
+  ];
+
+  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..a60ebe9590bc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/iagno/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, gdk_pixbuf, librsvg, wrapGAppsHook
+, intltool, itstool, libcanberra-gtk3, libxml2, dconf }:
+
+stdenv.mkDerivation rec {
+  name = "iagno-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/iagno/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "15skh7186gp0k1lvzpv0l7dsr7mhb57njc3wjbgjwixym67h2d1z";
+  };
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook itstool libxml2 ];
+  buildInputs = [ gtk3 gnome3.defaultIconTheme 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..ccd90c071fee
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/lightsoff/default.nix
@@ -0,0 +1,40 @@
+{ 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.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/lightsoff/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1cv5pkw0n8k5wb98ihx0z1z615w1wc09y884wk608wy40bgq46wp";
+  };
+
+  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
+  '';
+
+  nativeBuildInputs = [
+    vala pkgconfig wrapGAppsHook itstool gettext appstream-glib libxml2
+    meson ninja python3
+  ];
+  buildInputs = [ gtk3 gnome3.defaultIconTheme gdk_pixbuf librsvg clutter clutter-gtk ];
+
+  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..c57ab1a9e14d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/quadrapassel/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, gdk_pixbuf
+, librsvg, libcanberra-gtk3
+, intltool, itstool, libxml2, clutter, clutter-gtk, wrapGAppsHook }:
+
+let
+  pname = "quadrapassel";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/quadrapassel/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0ed44ef73c8811cbdfc3b44c8fd80eb6e2998d102d59ac324e4748f5d9dddb55";
+  };
+
+  nativeBuildInputs = [ pkgconfig itstool intltool wrapGAppsHook ];
+  buildInputs = [
+    gtk3 gnome3.defaultIconTheme gdk_pixbuf librsvg
+    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..5e0f01174e41
--- /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.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 = "00h795clcyzch1sgcxflslv2q03vsz2j5xyy4ghbg6a6dgg8a0ax";
+  };
+
+  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.defaultIconTheme 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..e6cdd3c88b72
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/games/tali/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, gnome3, gdk_pixbuf
+, librsvg, intltool, itstool, libxml2, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "tali-${version}";
+  version = "3.22.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/tali/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "5ba17794d6fb06b794daaffa62a6aaa372b7de8886ce5ec596c37e62bb71728b";
+  };
+
+  passthru = {
+    updateScript = gnome3.updateScript { packageName = "tali"; attrPath = "gnome3.tali"; };
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ gtk3 gnome3.defaultIconTheme gdk_pixbuf librsvg
+                  libxml2 itstool intltool wrapGAppsHook ];
+
+  enableParallelBuilding = true;
+
+  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..8f1080ccc2e0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/geary/default.nix
@@ -0,0 +1,74 @@
+{ stdenv, fetchurl, intltool, pkgconfig, gtk3, vala_0_40, enchant
+, wrapGAppsHook, gdk_pixbuf, cmake, ninja, desktop-file-utils
+, libnotify, libcanberra-gtk3, libsecret, gmime, isocodes
+, gobject-introspection, libpthreadstubs, sqlite, gcr
+, gnome3, librsvg, gnome-doc-utils, webkitgtk, fetchpatch }:
+
+let
+  pname = "geary";
+  version = "0.12.4";
+in
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "01ykhkjfkprvh9kp4rzrl6xs2pqibiw44ckvqsn5cs3xy2rlq8mm";
+  };
+
+  patches = [
+    # Fix build with webkitgtk-2.22
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/geary/commit/5d0f711426d76f878cf9b71f7e8f785199c7cde1.patch;
+      sha256 = "1yifng5lfsc6wp7irmi8gjdcfig1cr0chf7rdv3asrk567nmwrsi";
+    })
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/geary/commit/0d966950a2cba888873cd3a7f4f42bb7a017dc6d.patch;
+      sha256 = "1y6v4fnik4w3paj9nl0yqs54998sx1zr9w3940d579p6dsa8f3fg";
+    })
+    (fetchpatch {
+      url = https://gitlab.gnome.org/GNOME/geary/commit/e091f24b00ec421e1aadd5e360d1550e658ad5ef.patch;
+      sha256 = "0d5hc4h9c1hnn2sk18nkpmzdvwm3h746n2zj8n22ax9rj6lxl38l";
+    })
+    # Fix build with vala 0.40.12
+    # See: https://gitlab.gnome.org/GNOME/vala/blob/0.40.12/NEWS#L22
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/geary/commit/088cb2c0aa35ad4b54ea5a0a2edaf0ff96c64b45.patch";
+      sha256 = "0cnjmbd3snm8ggmprqa32f7i3w86gs3ylab9p5ffj921dcpvvlb2";
+    })
+  ];
+
+  nativeBuildInputs = [ vala_0_40 intltool pkgconfig wrapGAppsHook cmake ninja desktop-file-utils gnome-doc-utils gobject-introspection ];
+  buildInputs = [
+    gtk3 enchant webkitgtk libnotify libcanberra-gtk3 gnome3.libgee libsecret gmime sqlite
+    libpthreadstubs gnome3.gsettings-desktop-schemas gcr isocodes
+    gdk_pixbuf librsvg gnome3.defaultIconTheme
+  ];
+
+  cmakeFlags = [
+    "-DISOCODES_DIRECTORY=${isocodes}/share/xml/iso-codes"
+  ];
+
+  # TODO: This is bad, upstream should fix their code.
+  PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_GIRDIR = "${webkitgtk.dev}/share/gir-1.0";
+
+  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.lgpl2;
+    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..a447d2aa5903
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gitg/default.nix
@@ -0,0 +1,65 @@
+{ stdenv, fetchurl, fetchpatch, vala, intltool, pkgconfig, gtk3, glib
+, json-glib, wrapGAppsHook, libpeas, bash, gobject-introspection
+, gnome3, gtkspell3, shared-mime-info, libgee, libgit2-glib, libsecret
+, meson, ninja, python3
+ }:
+
+let
+  pname = "gitg";
+  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 = "1fz8q1aiql6k740savdjh0vzbyhcflgf94cfdhvzcrrvm929n2ss";
+  };
+
+  patches = [
+    (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 = true;
+
+  enableParallelBuilding = true;
+
+  buildInputs = [
+    gtk3 glib json-glib libgee libpeas gnome3.libsoup
+    libgit2-glib gtkspell3 gnome3.gtksourceview gnome3.gsettings-desktop-schemas
+    libsecret gobject-introspection gnome3.adwaita-icon-theme
+  ];
+
+  nativeBuildInputs = [ meson ninja python3 vala wrapGAppsHook intltool pkgconfig ];
+
+  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..716988252d54
--- /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
+, gtk
+, 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
+      gtk
+      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..8fbe24220b69
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gnome-packagekit/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, meson, ninja, gettext, gnome3, packagekit, polkit
+, systemd, wrapGAppsHook, desktop-file-utils }:
+
+stdenv.mkDerivation rec {
+  name = "gnome-packagekit-${version}";
+  version = "3.30.0";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-packagekit/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "1i1hf6833psnq174xm0gjlz5rbrkl8i512y47w7nk8mrrrc31b35";
+  };
+
+  nativeBuildInputs = [ pkgconfig meson ninja gettext wrapGAppsHook desktop-file-utils ];
+  buildInputs = [ gnome3.gtk 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..f9cc0a8aa4f9
--- /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
+, gtk
+, 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
+    gtk
+    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..be8ab81457ea
--- /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
+, gtk
+, 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
+    gtk
+    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..77edf27fbdd6
--- /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
+, itstool, libxml2, python3Packages
+, gnome3, gdk_pixbuf, libnotify, gobject-introspection, wrapGAppsHook }:
+
+let
+  pname = "gnome-tweaks";
+  version = "3.30.2";
+in stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${name}.tar.xz";
+    sha256 = "0j63siy1i5pl2g6di1r9vjn54m9ahh42wj20j6689pza2lamay1z";
+  };
+
+  nativeBuildInputs = [
+    meson ninja pkgconfig gettext itstool libxml2 wrapGAppsHook python3Packages.python
+  ];
+  buildInputs = [
+    gtk3 glib gnome3.gsettings-desktop-schemas
+    gdk_pixbuf gnome3.defaultIconTheme
+    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..fd71f1f2a23c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, autoreconfHook, pkgconfig, vala, glib, gjs, mutter
+, pango, gtk3, gnome3, dbus, clutter, appstream-glib, wrapGAppsHook, systemd, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  version = "3.30.2";
+  name = "gpaste-${version}";
+
+  src = fetchurl {
+    url = "https://github.com/Keruspe/GPaste/archive/v${version}.tar.gz";
+    sha256 = "0vlbvv6rjxq7h9cl3ilndjk7d51ac1x7agj8k6a7bwjx8h1fr62x";
+  };
+
+  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..ca6b9a5b22ed
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gpaste/fix-paths.patch
@@ -0,0 +1,55 @@
+--- a/src/gnome-shell/extension.js
++++ b/src/gnome-shell/extension.js
+@@ -7,6 +7,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
+@@ -7,6 +7,8 @@
+ 
+ const Gettext = imports.gettext;
+ 
++imports.gi.GIRepository.Repository.prepend_search_path('@typelibPath@');
++
+ const GPaste = imports.gi.GPaste;
+ 
+ const ExtensionUtils = imports.misc.extensionUtils;
+--- a/src/libgpaste/settings/gpaste-settings.c
++++ b/src/libgpaste/settings/gpaste-settings.c
+@@ -22,6 +22,8 @@
+ 
+ typedef struct
+ {
++    GSettingsSchemaSource *schema_source;
++    GSettingsSchema *schema;
+     GSettings *settings;
+     GSettings *shell_settings;
+ 
+@@ -919,6 +921,8 @@
+     {
+         g_signal_handler_disconnect (settings, priv->c_signals[C_CHANGED]);
+         g_clear_object (&priv->settings);
++        g_settings_schema_unref (priv->schema);
++        g_settings_schema_source_unref (priv->schema_source);
+     }
+ 
+     if (shell_settings)
+@@ -1000,7 +1004,11 @@
+ g_paste_settings_init (GPasteSettings *self)
+ {
+     GPasteSettingsPrivate *priv = g_paste_settings_get_instance_private (self);
+-    GSettings *settings = priv->settings = 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 = priv->schema_source = g_settings_schema_source_new_from_directory ("@gschemasCompiled@", NULL, FALSE, NULL);
++    priv->schema = g_settings_schema_source_lookup (schema_source, G_PASTE_SETTINGS_NAME, FALSE);
++    GSettings *settings = priv->settings = g_settings_new_full (priv->schema, NULL, NULL);
+ 
+     priv->history_name = NULL;
+     priv->launch_ui = 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..67f2552b4348
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/gtkhtml/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, intltool
+, gnome3, enchant, isocodes }:
+
+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
+                  gnome3.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..86e12b585364
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/metacity/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, fetchurl
+, gettext
+, glib
+, gnome3
+, gsettings-desktop-schemas
+, gtk
+, 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
+    gtk
+    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..0a9b9bcfe9be
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnome-3/misc/pomodoro/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchFromGitHub, fetchpatch, autoconf-archive, appstream-glib, intltool, pkgconfig, libtool, wrapGAppsHook,
+  dbus-glib, libcanberra, gst_all_1, vala, gnome3, gtk3, libxml2, autoreconfHook,
+  glib, gobject-introspection, libpeas
+}:
+
+stdenv.mkDerivation rec {
+  version = "0.13.4";
+  name = "gnome-shell-pomodoro-${version}";
+
+  src = fetchFromGitHub {
+    owner = "codito";
+    repo = "gnome-pomodoro";
+    rev = "${version}";
+    sha256 = "0fiql99nhj168wbfhvzrhfcm4c4569gikd2zaf10vzszdqjahrl1";
+  };
+
+  patches = [
+    # build with Vala ≥ 0.42
+    (fetchpatch {
+      url = https://github.com/codito/gnome-pomodoro/commit/36778823ca5bd94b2aa948e5d8718f84d99d9af0.patch;
+      sha256 = "0a9x0p5wny3an9xawam9nhpffw5m4kgwj5jvv0g6c2lwlfzrx2rh";
+    })
+  ];
+
+  nativeBuildInputs = [
+    autoreconfHook vala autoconf-archive libtool intltool appstream-glib
+    wrapGAppsHook pkgconfig libxml2
+  ];
+
+  buildInputs = [
+    glib gobject-introspection libpeas
+    dbus-glib libcanberra gst_all_1.gstreamer
+    gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good
+    gnome3.gsettings-desktop-schemas
+    gnome3.gnome-shell gtk3 gnome3.defaultIconTheme
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = http://gnomepomodoro.org/;
+    description = "A 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; [ jgeerds ];
+    license = licenses.gpl3;
+    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 ]
diff --git a/nixpkgs/pkgs/desktops/gnustep/back/default.nix b/nixpkgs/pkgs/desktops/gnustep/back/default.nix
new file mode 100644
index 000000000000..54ea8dcf4875
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/back/default.nix
@@ -0,0 +1,24 @@
+{ gsmakeDerivation
+, cairo
+, fetchurl
+, base, gui
+, xlibsWrapper
+, freetype
+, pkgconfig
+, libXmu
+}:
+let
+  version = "0.27.0";
+in
+gsmakeDerivation {
+  name = "gnustep-back-${version}";
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-back-${version}.tar.gz";
+    sha256 = "0j400892ysxygh50i3918nn87vkxh15h892jwvphmkd34j8wdn9f";
+  };
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ cairo base gui freetype xlibsWrapper libXmu ];
+  meta = {
+    description = "A generic backend for GNUstep";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/back/fixup-tools.patch b/nixpkgs/pkgs/desktops/gnustep/back/fixup-tools.patch
new file mode 100644
index 000000000000..a47de5478e36
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/back/fixup-tools.patch
@@ -0,0 +1,14 @@
+diff -c gnustep-back-0.24.0/Tools/GNUmakefile.preamble gnustep-back-0.24.0.patched/Tools/GNUmakefile.preamble
+--- gnustep-back-0.24.0/Tools/GNUmakefile.preamble	2013-07-04 22:44:28.000000000 +0600
++++ gnustep-back-0.24.0.patched/Tools/GNUmakefile.preamble	2014-12-01 16:40:37.000000000 +0600
+@@ -52,6 +52,9 @@
+ # Additional libraries when linking applications
+ #ADDITIONAL_GUI_LIBS +=
+ 
++# Additional libraries when linking tools
++gpbs_TOOL_LIBS += -lgnustep-gui -lgnustep-base $(SYSTEM_LIBS)
++
+ #
+ # Flags dealing with installing and uninstalling
+ #
+
diff --git a/nixpkgs/pkgs/desktops/gnustep/base/default.nix b/nixpkgs/pkgs/desktops/gnustep/base/default.nix
new file mode 100644
index 000000000000..e96dbf0b6fc5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/base/default.nix
@@ -0,0 +1,38 @@
+{ aspell, audiofile
+, gsmakeDerivation
+, cups
+, fetchurl
+, gmp, gnutls
+, libffi, libbfd
+, libjpeg, libtiff, libpng, giflib, libungif
+, libxml2, libxslt, libiconv
+, libobjc, libgcrypt
+, icu
+, pkgconfig, portaudio
+}:
+let
+  version = "1.26.0";
+in
+gsmakeDerivation {
+  name = "gnustep-base-${version}";
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-base-${version}.tar.gz";
+    sha256 = "0ws16rwqx0qvqpyjsxbdylfpkgjr19nqc9i3b30wywqcqrkc12zn";
+  };
+  nativeBuildInputs = [ pkgconfig ];
+  propagatedBuildInputs = [
+    aspell audiofile
+    cups
+    gmp gnutls
+    libffi libbfd
+    libjpeg libtiff libpng giflib libungif
+    libxml2 libxslt libiconv
+    libobjc libgcrypt
+    icu
+    portaudio
+  ];
+  patches = [ ./fixup-paths.patch ];
+  meta = {
+    description = "An implementation of AppKit and Foundation libraries of OPENSTEP and Cocoa";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/base/fixup-base-makefile-installdir.patch b/nixpkgs/pkgs/desktops/gnustep/base/fixup-base-makefile-installdir.patch
new file mode 100644
index 000000000000..482c72a51904
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/base/fixup-base-makefile-installdir.patch
@@ -0,0 +1,29 @@
+--- gnustep-base-1.24.7/Makefile.postamble	2011-07-15 19:53:45.000000000 +0600
++++ gnustep-base-1.24.7.patched/Makefile.postamble	2014-11-29 22:25:07.000000000 +0600
+@@ -38,13 +38,13 @@
+ # Things to do after compiling
+ # after-all::
+ 
+-$(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional:
+-	$(ECHO_CREATING)$(MKDIRS) $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional$(END_ECHO)
++$(DESTDIR_GNUSTEP_MAKEFILES)/Additional:
++	$(ECHO_CREATING)$(MKDIRS) $(DESTDIR_GNUSTEP_MAKEFILES)/Additional$(END_ECHO)
+ 
+ # Things to do before installing
+-before-install:: $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional
++before-install:: $(DESTDIR_GNUSTEP_MAKEFILES)/Additional
+ 	$(ECHO_NOTHING)$(INSTALL_DATA) base.make \
+-	    $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
++	    $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
+ 
+ # Things to do after installing
+ # after-install::
+@@ -54,7 +54,7 @@
+ 
+ # Things to do after uninstalling
+ after-uninstall::
+-	$(ECHO_NOTHING)rm -f $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
++	$(ECHO_NOTHING)rm -f $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
+ 
+ # Things to do before cleaning
+ # before-clean::
diff --git a/nixpkgs/pkgs/desktops/gnustep/base/fixup-paths.patch b/nixpkgs/pkgs/desktops/gnustep/base/fixup-paths.patch
new file mode 100644
index 000000000000..fa28412dbf62
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/base/fixup-paths.patch
@@ -0,0 +1,373 @@
+diff -r -u gnustep-base-1.24.7/Makefile.postamble gnustep-base-1.24.7.patched/Makefile.postamble
+--- gnustep-base-1.24.7/Makefile.postamble	2011-07-15 19:53:45.000000000 +0600
++++ gnustep-base-1.24.7.patched/Makefile.postamble	2014-11-29 22:25:07.000000000 +0600
+@@ -38,13 +38,13 @@
+ # Things to do after compiling
+ # after-all::
+ 
+-$(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional:
+-	$(ECHO_CREATING)$(MKDIRS) $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional$(END_ECHO)
++$(DESTDIR_GNUSTEP_MAKEFILES)/Additional:
++	$(ECHO_CREATING)$(MKDIRS) $(DESTDIR_GNUSTEP_MAKEFILES)/Additional$(END_ECHO)
+ 
+ # Things to do before installing
+-before-install:: $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional
++before-install:: $(DESTDIR_GNUSTEP_MAKEFILES)/Additional
+ 	$(ECHO_NOTHING)$(INSTALL_DATA) base.make \
+-	    $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
++	    $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
+ 
+ # Things to do after installing
+ # after-install::
+@@ -54,7 +54,7 @@
+ 
+ # Things to do after uninstalling
+ after-uninstall::
+-	$(ECHO_NOTHING)rm -f $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
++	$(ECHO_NOTHING)rm -f $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO)
+ 
+ # Things to do before cleaning
+ # before-clean::
+diff -r -u gnustep-base-1.24.7/Source/NSPathUtilities.m gnustep-base-1.24.7.patched/Source/NSPathUtilities.m
+--- gnustep-base-1.24.7/Source/NSPathUtilities.m	2014-01-14 13:21:10.000000000 +0600
++++ gnustep-base-1.24.7.patched/Source/NSPathUtilities.m	2015-01-25 13:59:37.000000000 +0600
+@@ -153,16 +153,27 @@
+ static NSString *gnustepLocalUsersDir = nil;
+ 
+ static NSString *gnustepSystemApps = nil;
++static NSArray *gnustepSystemAppsNix = nil;
+ static NSString *gnustepSystemAdminApps = nil;
++static NSArray *gnustepSystemAdminAppsNix = nil;
+ static NSString *gnustepSystemWebApps = nil;
++static NSArray *gnustepSystemWebAppsNix = nil;
+ static NSString *gnustepSystemTools = nil;
++static NSArray *gnustepSystemToolsNix = nil;
+ static NSString *gnustepSystemAdminTools = nil;
++static NSArray *gnustepSystemAdminToolsNix = nil;
+ static NSString *gnustepSystemLibrary = nil;
++static NSArray *gnustepSystemLibraryNix = nil;
+ static NSString *gnustepSystemLibraries = nil;
++static NSArray *gnustepSystemLibrariesNix = nil;
+ static NSString *gnustepSystemHeaders = nil;
++static NSArray *gnustepSystemHeadersNix = nil;
+ static NSString *gnustepSystemDocumentation = nil;
++static NSArray *gnustepSystemDocumentationNix = nil;
+ static NSString *gnustepSystemDocumentationInfo = nil;
++static NSArray *gnustepSystemDocumentationInfoNix = nil;
+ static NSString *gnustepSystemDocumentationMan = nil;
++static NSArray *gnustepSystemDocumentationManNix = nil;
+ 
+ static NSString *gnustepNetworkApps = nil;
+ static NSString *gnustepNetworkAdminApps = nil;
+@@ -258,6 +269,18 @@
+     }\
+ })
+ 
++/* Like ASSIGN_PATH, but permits multiple components in a path
++ */
++#define ASSIGN_PATH_NIX(var, dictionary, key) ({\
++  id val = getPathConfigNix(dictionary, key);\
++  if (val != nil)\
++    {\
++      RELEASE(var);\
++      var = RETAIN(val);\
++      [dictionary removeObjectForKey: key];\
++    }\
++})
++
+ /* Like ASSIGN_PATH(), but permits the result to be a relative path as that
+  * is what we normally use (the path is within the user's home directory).
+  */
+@@ -368,7 +391,7 @@
+ /* Get a full path string */
+ static inline NSString *
+ getPath(NSString *path)
+-{
++{  
+   if ([path hasPrefix: @"./"] == YES)
+     {
+       path = [gnustepConfigPath stringByAppendingPathComponent:
+@@ -383,6 +406,33 @@
+   return path;
+ }
+ 
++static inline NSArray *
++getPathConfigNix(NSDictionary *dict, NSString *key)
++{
++  NSArray *res = nil;
++  NSMutableArray *paths = nil;
++  NSString *path;
++#if defined(__MINGW_)
++  NSString *sep = @";";
++#else
++  NSString *sep = @":";
++#endif
++
++  path = [dict objectForKey: key];
++  if (path != nil)
++    {
++      if ([path rangeOfString:sep].location != NSNotFound)
++	{
++	  res = [path componentsSeparatedByString:sep];
++	}
++      else
++	{
++	  res = [[NSArray alloc] initWithObjects:path, nil];
++	}
++    }
++  return res;
++}
++
+ /* Get a full path string from a dictionary */
+ static inline NSString *
+ getPathConfig(NSDictionary *dict, NSString *key)
+@@ -468,6 +518,29 @@
+   ASSIGN_PATH(gnustepSystemDocumentationInfo, c,
+     @"GNUSTEP_SYSTEM_DOC_INFO");
+ 
++  ASSIGN_PATH_NIX(gnustepSystemAppsNix, c,
++    @"NIX_GNUSTEP_SYSTEM_APPS");
++  ASSIGN_PATH_NIX(gnustepSystemAdminAppsNix, c,
++    @"NIX_GNUSTEP_SYSTEM_ADMIN_APPS");
++  ASSIGN_PATH_NIX(gnustepSystemWebAppsNix, c,
++    @"NIX_GNUSTEP_SYSTEM_WEB_APPS");
++  ASSIGN_PATH_NIX(gnustepSystemToolsNix, c,
++    @"NIX_GNUSTEP_SYSTEM_TOOLS");
++  ASSIGN_PATH_NIX(gnustepSystemAdminToolsNix, c,
++    @"NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS");
++  ASSIGN_PATH_NIX(gnustepSystemLibraryNix, c,
++    @"NIX_GNUSTEP_SYSTEM_LIBRARY");
++  ASSIGN_PATH_NIX(gnustepSystemLibrariesNix, c,
++    @"NIX_GNUSTEP_SYSTEM_LIBRARIES");
++  ASSIGN_PATH_NIX(gnustepSystemHeadersNix, c,
++    @"NIX_GNUSTEP_SYSTEM_HEADERS");
++  ASSIGN_PATH_NIX(gnustepSystemDocumentationNix, c,
++    @"NIX_GNUSTEP_SYSTEM_DOC");
++  ASSIGN_PATH_NIX(gnustepSystemDocumentationManNix, c,
++    @"NIX_GNUSTEP_SYSTEM_DOC_MAN");
++  ASSIGN_PATH_NIX(gnustepSystemDocumentationInfoNix, c,
++    @"NIX_GNUSTEP_SYSTEM_DOC_INFO");
++
+   ASSIGN_PATH(gnustepNetworkApps, c,
+     @"GNUSTEP_NETWORK_APPS");
+   ASSIGN_PATH(gnustepNetworkAdminApps, c,
+@@ -1235,6 +1308,18 @@
+   DESTROY(gnustepSystemDocumentationMan);
+   DESTROY(gnustepSystemDocumentationInfo);
+ 
++  DESTROY(gnustepSystemAppsNix);
++  DESTROY(gnustepSystemAdminAppsNix);
++  DESTROY(gnustepSystemWebAppsNix);
++  DESTROY(gnustepSystemToolsNix);
++  DESTROY(gnustepSystemAdminToolsNix);
++  DESTROY(gnustepSystemLibraryNix);
++  DESTROY(gnustepSystemLibrariesNix);
++  DESTROY(gnustepSystemHeadersNix);
++  DESTROY(gnustepSystemDocumentationNix);
++  DESTROY(gnustepSystemDocumentationManNix);
++  DESTROY(gnustepSystemDocumentationInfoNix);
++
+   DESTROY(gnustepNetworkApps);
+   DESTROY(gnustepNetworkAdminApps);
+   DESTROY(gnustepNetworkWebApps);
+@@ -2183,6 +2268,27 @@
+   if ([add_dir length] > 0 && [paths containsObject: add_dir] == NO) \
+     [paths addObject: add_dir]; \
+ }
++#define ADD_PATH_NIX(mask, base_dirs, add_dir) \
++if ((domainMask & mask) && (base_dirs != nil)) \
++{ \
++  NSEnumerator *e = [base_dirs objectEnumerator]; \
++  NSString *dir = nil; \
++  while (dir = [e nextObject]) { \
++    path = [dir stringByAppendingPathComponent: add_dir]; \
++    if ([path length] > 0 && [paths containsObject: path] == NO) \
++      [paths addObject: path]; \
++  } \
++}
++#define ADD_PLATFORM_PATH_NIX(mask, add_dirs) \
++if ((domainMask & mask) && (add_dirs != nil)) \
++{ \
++  NSEnumerator *e = [add_dirs objectEnumerator]; \
++  NSString *dir = nil; \
++  while (dir = [e nextObject]) { \
++    if ([dir length] > 0 && [paths containsObject: dir] == NO) \
++      [paths addObject:dir]; \
++  } \
++}
+ 
+   switch (directoryKey)
+     {
+@@ -2191,11 +2297,13 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps);
+ 
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserAdminApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalAdminApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkAdminApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemAdminApps);
+ 	}
+ 	break;
+@@ -2205,6 +2313,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps);
+ 	}
+ 	break;
+@@ -2214,6 +2323,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps);
+ 
+ 	  /* I imagine if ever wanted a separate Demo directory, the
+@@ -2231,6 +2341,7 @@
+ 
+       case NSCoreServicesDirectory:
+ 	{
++	  ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix, @"CoreServices");
+ 	  ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"CoreServices");
+ 	}
+ 	break;
+@@ -2248,6 +2359,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps);
+ 	}
+ 	break;
+@@ -2257,6 +2369,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserAdminApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalAdminApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkAdminApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemAdminApps);
+ 	}
+ 	break;
+@@ -2266,6 +2379,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserLibrary);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalLibrary);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkLibrary);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemLibrary);
+ 	}
+ 	break;
+@@ -2281,6 +2395,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserLibrary);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalLibrary);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkLibrary);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemLibrary);
+ 	}
+ 	break;
+@@ -2418,6 +2533,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserDocumentation);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalDocumentation);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkDocumentation);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemDocumentationNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemDocumentation);
+ 	}
+ 	break;
+@@ -2449,6 +2565,7 @@
+ 	  ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"Caches");
+ 	  ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"Caches");
+ 	  ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"Caches");
++	  ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix, @"Caches");
+ 	  ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"Caches");
+ 	}
+ 	break;
+@@ -2460,6 +2577,8 @@
+ 	    @"ApplicationSupport");
+ 	  ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary,
+ 	    @"ApplicationSupport");
++	  ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix,
++            @"ApplicationSupport");
+ 	  ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary,
+ 	    @"ApplicationSupport");
+ 	}
+@@ -2471,6 +2590,7 @@
+ 	  ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"Frameworks");
+ 	  ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"Frameworks");
+ 	  ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"Frameworks");
++	  ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix, @"Frameworks");
+ 	  ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"Frameworks");
+ 	}
+ 	break;
+@@ -2480,6 +2600,7 @@
+ 	  ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"Fonts");
+ 	  ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"Fonts");
+ 	  ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"Fonts");
++	  ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibraryNix, @"Fonts");
+ 	  ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"Fonts");
+ 	}
+ 	break;
+@@ -2518,6 +2639,12 @@
+ 	  if (part)
+ 	    ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibraries, part);
+ 
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemLibrariesNix);
++	  if (full)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibrariesNix, full);
++	  if (part)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemLibrariesNix, part);	  
++
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemLibraries);
+ 	  if (full)
+ 	    ADD_PATH(NSSystemDomainMask, gnustepSystemLibraries, full);
+@@ -2560,6 +2687,12 @@
+ 	  if (part)
+ 	    ADD_PATH(NSNetworkDomainMask, gnustepNetworkTools, part);
+ 
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemToolsNix);
++	  if (full)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemToolsNix, full);
++	  if (part)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemToolsNix, part);
++
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemTools);
+ 	  if (full)
+ 	    ADD_PATH(NSSystemDomainMask, gnustepSystemTools, full);
+@@ -2602,6 +2735,18 @@
+ 	  if (part)
+ 	    ADD_PATH(NSNetworkDomainMask, gnustepNetworkAdminTools, part);
+ 
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminToolsNix);
++	  if (full)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminToolsNix, full);
++	  if (part)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminToolsNix, part);
++
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminToolsNix);
++	  if (full)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminToolsNix, full);
++	  if (part)
++	    ADD_PATH_NIX(NSSystemDomainMask, gnustepSystemAdminToolsNix, part);
++	  
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemAdminTools);
+ 	  if (full)
+ 	    ADD_PATH(NSSystemDomainMask, gnustepSystemAdminTools, full);
+@@ -2615,6 +2760,7 @@
+ 	  ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserWebApps);
+ 	  ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalWebApps);
+ 	  ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkWebApps);
++	  ADD_PLATFORM_PATH_NIX(NSSystemDomainMask, gnustepSystemWebAppsNix);
+ 	  ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemWebApps);
+ 	}
+ 	break;
+@@ -2622,6 +2768,8 @@
+ 
+ #undef ADD_PATH
+ #undef ADD_PLATFORM_PATH
++#undef ADD_PATH_NIX
++#undef ADD_PLATFORM_PATH_NIX
+ 
+   count = [paths count];
+   for (i = 0; i < count; i++)
diff --git a/nixpkgs/pkgs/desktops/gnustep/default.nix b/nixpkgs/pkgs/desktops/gnustep/default.nix
new file mode 100644
index 000000000000..ac324bc89a85
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/default.nix
@@ -0,0 +1,21 @@
+{ pkgs, newScope }:
+
+let
+  callPackage = newScope self;
+
+  self = rec {
+    stdenv = pkgs.clangStdenv;
+
+    gsmakeDerivation = callPackage ./make/gsmakeDerivation.nix {};
+    gorm = callPackage ./gorm {};
+    projectcenter = callPackage ./projectcenter {};
+    system_preferences = callPackage ./systempreferences {};
+    libobjc = callPackage ./libobjc2 {};
+    make = callPackage ./make {};
+    back = callPackage ./back {};
+    base = callPackage ./base { giflib = pkgs.giflib_4_1; };
+    gui = callPackage ./gui {};
+    gworkspace = callPackage ./gworkspace {};
+  };
+
+in self
diff --git a/nixpkgs/pkgs/desktops/gnustep/gorm/default.nix b/nixpkgs/pkgs/desktops/gnustep/gorm/default.nix
new file mode 100644
index 000000000000..9f1b0ef47fe5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gorm/default.nix
@@ -0,0 +1,17 @@
+{ fetchurl, base, back, gsmakeDerivation, gui }:
+let
+  version = "1.2.23";
+in
+gsmakeDerivation {
+  name = "gorm-${version}";
+  
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/dev-apps/gorm-${version}.tar.gz";
+    sha256 = "18pf9vvzvdk8bg4lhjb96y1kdkmb9ahmvrqv2581vn45pjxmmlnb";
+  };
+  buildInputs = [ base back gui ];
+
+  meta = {
+    description = "Graphical Object Relationship Modeller is an easy-to-use interface designer for GNUstep";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/gorm/fix-gs-makefiles.patch b/nixpkgs/pkgs/desktops/gnustep/gorm/fix-gs-makefiles.patch
new file mode 100644
index 000000000000..c4b3d1e1d815
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gorm/fix-gs-makefiles.patch
@@ -0,0 +1,27 @@
+diff -ru gorm-1.2.20/GNUmakefile gorm-1.2.20.patched/GNUmakefile
+--- gorm-1.2.20/GNUmakefile	2010-05-30 12:55:26.000000000 +0600
++++ gorm-1.2.20.patched/GNUmakefile	2014-12-10 22:21:18.000000000 +0600
+@@ -24,6 +24,23 @@
+ #   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ #
+ 
++ifeq ($(GNUSTEP_MAKEFILES),)
++ GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null)
++  ifeq ($(GNUSTEP_MAKEFILES),)
++    $(warning )
++    $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!)
++    $(warning Perhaps gnustep-make is not properly installed,)
++    $(warning so gnustep-config is not in your PATH.)
++    $(warning )
++    $(warning Your PATH is currently $(PATH))
++    $(warning )
++  endif
++endif
++
++ifeq ($(GNUSTEP_MAKEFILES),)
++  $(error You need to set GNUSTEP_MAKEFILES before compiling!)
++endif
++
+ PACKAGE_NAME = gorm
+ export PACKAGE_NAME
+ include $(GNUSTEP_MAKEFILES)/common.make
diff --git a/nixpkgs/pkgs/desktops/gnustep/gui/default.nix b/nixpkgs/pkgs/desktops/gnustep/gui/default.nix
new file mode 100644
index 000000000000..72d109b69796
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gui/default.nix
@@ -0,0 +1,16 @@
+{ gsmakeDerivation, fetchurl, base }:
+let
+  version = "0.27.0";
+in
+gsmakeDerivation {
+  name = "gnustep-gui-${version}";
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-gui-${version}.tar.gz";
+    sha256 = "1m6k3fa2ndxv0kl2fazi76mwa27gn5jyp24q0rk96f2djhsy94br";
+  };
+  buildInputs = [ base ];
+  patches = [ ./fixup-all.patch ];
+  meta = {
+    description = "A GUI class library of GNUstep";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/gui/fixup-all.patch b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-all.patch
new file mode 100644
index 000000000000..4b412db409ae
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-all.patch
@@ -0,0 +1,56 @@
+diff -r -u gnustep-gui-0.24.0/GNUmakefile.postamble gnustep-gui-0.24.0.patched/GNUmakefile.postamble
+--- gnustep-gui-0.24.0/GNUmakefile.postamble	2010-05-17 22:38:59.000000000 +0600
++++ gnustep-gui-0.24.0.patched/GNUmakefile.postamble	2014-12-01 13:44:05.000000000 +0600
+@@ -40,20 +40,20 @@
+ # The following rule is important mainly for packaging, because in that case 
+ # you install into a fake system tree, and the directory is not there.
+ #
+-$(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional:
+-	$(MKDIRS) $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional
++$(DESTDIR_GNUSTEP_MAKEFILES)/Additional:
++	$(MKDIRS) $(DESTDIR_GNUSTEP_MAKEFILES)/Additional
+ 
+ # Things to do before installing
+-before-install:: $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional
++before-install:: $(DESTDIR_GNUSTEP_MAKEFILES)/Additional
+ 	$(INSTALL_DATA) gui.make \
+-	   $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/gui.make
++	   $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/gui.make
+ 
+ # Things to do after installing
+ # after-install::
+ 
+ # Things to do before uninstalling
+  before-uninstall::
+-	rm -f $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/gui.make
++	rm -f $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/gui.make
+ 
+ # Things to do after uninstalling
+ # after-uninstall::
+diff -r -u gnustep-gui-0.24.0/TextConverters/RTF/GNUmakefile.preamble gnustep-gui-0.24.0.patched/TextConverters/RTF/GNUmakefile.preamble
+--- gnustep-gui-0.24.0/TextConverters/RTF/GNUmakefile.preamble	2008-06-10 10:01:49.000000000 +0600
++++ gnustep-gui-0.24.0.patched/TextConverters/RTF/GNUmakefile.preamble	2014-12-01 13:02:11.000000000 +0600
+@@ -49,7 +49,7 @@
+ ADDITIONAL_INCLUDE_DIRS +=-I../../Headers/Additions -I../../Headers
+ 
+ # Additional LDFLAGS to pass to the linker
+-#ADDITIONAL_LDFLAGS += 
++ADDITIONAL_LDFLAGS += -lgnustep-gui
+ 
+ # Additional library directories the linker should search
+ ADDITIONAL_LIB_DIRS += -L../../Source/$(GNUSTEP_OBJ_DIR)
+diff -r -u gnustep-gui-0.24.0/Tools/GNUmakefile.preamble gnustep-gui-0.24.0.patched/Tools/GNUmakefile.preamble
+--- gnustep-gui-0.24.0/Tools/GNUmakefile.preamble	2006-02-22 12:43:48.000000000 +0600
++++ gnustep-gui-0.24.0.patched/Tools/GNUmakefile.preamble	2014-12-01 12:52:41.000000000 +0600
+@@ -32,9 +32,11 @@
+ ADDITIONAL_LIB_DIRS += -L../Source/$(GNUSTEP_OBJ_DIR) -L../Model/$(GNUSTEP_OBJ_DIR)
+ 
+ # Additional libraries when linking tools
++make_services_TOOL_LIBS += -lgnustep-base
+ gpbs_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
+ set_show_service_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
+ gopen_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
++gclose_TOOL_LIBS += -lgnustep-base
+ gcloseall_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
+ GSspell_TOOL_LIBS += $(ADDITIONAL_DEPENDS)
+ 
diff --git a/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-makefile-installdir.patch b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-makefile-installdir.patch
new file mode 100644
index 000000000000..30c6f56c032c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-makefile-installdir.patch
@@ -0,0 +1,28 @@
+--- gnustep-gui-0.24.0/GNUmakefile.postamble	2010-05-17 22:38:59.000000000 +0600
++++ gnustep-gui-0.24.0.patched/GNUmakefile.postamble	2014-12-01 13:44:05.000000000 +0600
+@@ -40,20 +40,20 @@
+ # The following rule is important mainly for packaging, because in that case 
+ # you install into a fake system tree, and the directory is not there.
+ #
+-$(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional:
+-	$(MKDIRS) $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional
++$(DESTDIR_GNUSTEP_MAKEFILES)/Additional:
++	$(MKDIRS) $(DESTDIR_GNUSTEP_MAKEFILES)/Additional
+ 
+ # Things to do before installing
+-before-install:: $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional
++before-install:: $(DESTDIR_GNUSTEP_MAKEFILES)/Additional
+ 	$(INSTALL_DATA) gui.make \
+-	   $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/gui.make
++	   $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/gui.make
+ 
+ # Things to do after installing
+ # after-install::
+ 
+ # Things to do before uninstalling
+  before-uninstall::
+-	rm -f $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/gui.make
++	rm -f $(DESTDIR_GNUSTEP_MAKEFILES)/Additional/gui.make
+ 
+ # Things to do after uninstalling
+ # after-uninstall::
diff --git a/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-textconverters-preamble.patch b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-textconverters-preamble.patch
new file mode 100644
index 000000000000..23ec2db0fbd3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-textconverters-preamble.patch
@@ -0,0 +1,11 @@
+--- gnustep-gui-0.24.0/TextConverters/RTF/GNUmakefile.preamble	2008-06-10 10:01:49.000000000 +0600
++++ gnustep-gui-0.24.0.patched/TextConverters/RTF/GNUmakefile.preamble	2014-12-01 13:02:11.000000000 +0600
+@@ -49,7 +49,7 @@
+ ADDITIONAL_INCLUDE_DIRS +=-I../../Headers/Additions -I../../Headers
+ 
+ # Additional LDFLAGS to pass to the linker
+-#ADDITIONAL_LDFLAGS += 
++ADDITIONAL_LDFLAGS += -lgnustep-gui
+ 
+ # Additional library directories the linker should search
+ ADDITIONAL_LIB_DIRS += -L../../Source/$(GNUSTEP_OBJ_DIR)
diff --git a/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-tools-preamble.patch b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-tools-preamble.patch
new file mode 100644
index 000000000000..e57ddec75ad2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gui/fixup-gui-tools-preamble.patch
@@ -0,0 +1,14 @@
+--- gnustep-gui-0.24.0/Tools/GNUmakefile.preamble	2006-02-22 12:43:48.000000000 +0600
++++ gnustep-gui-0.24.0.patched/Tools/GNUmakefile.preamble	2014-12-01 12:52:41.000000000 +0600
+@@ -32,9 +32,11 @@
+ ADDITIONAL_LIB_DIRS += -L../Source/$(GNUSTEP_OBJ_DIR) -L../Model/$(GNUSTEP_OBJ_DIR)
+ 
+ # Additional libraries when linking tools
++make_services_TOOL_LIBS += -lgnustep-base
+ gpbs_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
+ set_show_service_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
+ gopen_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
++gclose_TOOL_LIBS += -lgnustep-base
+ gcloseall_TOOL_LIBS += -lgnustep-gui $(SYSTEM_LIBS)
+ GSspell_TOOL_LIBS += $(ADDITIONAL_DEPENDS)
+ 
diff --git a/nixpkgs/pkgs/desktops/gnustep/gworkspace/default.nix b/nixpkgs/pkgs/desktops/gnustep/gworkspace/default.nix
new file mode 100644
index 000000000000..d5018a4350f8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/gworkspace/default.nix
@@ -0,0 +1,22 @@
+{ back, base, gui, gsmakeDerivation
+, fetchurl
+, system_preferences
+}:
+let
+  version = "0.9.4";
+in
+gsmakeDerivation {
+  name = "gworkspace-${version}";
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/usr-apps/gworkspace-${version}.tar.gz";
+    sha256 = "0cjn83m7qmbwdpldlyhs239nwswgip3yaz01ahls130dq5qq7hgk";
+  };
+  # additional dependencies:
+  # - PDFKit framework from http://gap.nongnu.org/
+  # - TODO: to --enable-gwmetadata, need libDBKit as well as sqlite!
+  buildInputs = [ back base gui system_preferences ];
+  configureFlags = [ "--with-inotify" ];
+  meta = {
+    description = "A workspace manager for GNUstep";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/libobjc2/default.nix b/nixpkgs/pkgs/desktops/gnustep/libobjc2/default.nix
new file mode 100644
index 000000000000..3aba235b3a79
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/libobjc2/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, lib, fetchFromGitHub, cmake }:
+
+let
+  version = "1.8.1";
+in
+
+stdenv.mkDerivation rec {
+  name = "libobjc2-${version}";
+
+  src = fetchFromGitHub {
+    owner = "gnustep";
+    repo = "libobjc2";
+    rev = "v${version}";
+    sha256 = "12v9pjg97h56mb114cqd22q1pdwhmxrgdw5hal74ddlrhiq1nzvi";
+  };
+
+  buildInputs = [ cmake ];
+
+  cmakeFlags = [ "-DCMAKE_INSTALL_LIBDIR=lib" ];
+
+  meta = with lib; {
+    description = "Objective-C runtime for use with GNUstep";
+    homepage = http://gnustep.org/;
+    license = licenses.mit;
+    maintainers = with maintainers; [ ashalkhakov matthewbauer ];
+    platforms = platforms.unix;
+    badPlatforms = [ "aarch64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/GNUstep.conf b/nixpkgs/pkgs/desktops/gnustep/make/GNUstep.conf
new file mode 100644
index 000000000000..f4e0e3b81629
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/GNUstep.conf
@@ -0,0 +1,126 @@
+# These GNUSTEP_*_ROOT variables are obsolete, and will be removed.
+#GNUSTEP_SYSTEM_ROOT=/nix/store/ky64z3j9l18wjcssb9pxnc792ihh3bvw-gnustep-make-2.6.6/System
+#GNUSTEP_LOCAL_ROOT=/nix/store/ky64z3j9l18wjcssb9pxnc792ihh3bvw-gnustep-make-2.6.6/Local
+#GNUSTEP_NETWORK_ROOT=/nix/store/ky64z3j9l18wjcssb9pxnc792ihh3bvw-gnustep-make-2.6.6/Network
+
+# The name of the user config file.  This file can override
+# some settings in this file.  Usually used by users that want
+# to install things into their GNUstep user domain and/or have
+# many such domains.
+GNUSTEP_USER_CONFIG_FILE=.GNUstep.conf
+
+# The name of the user directory, if any.  This is obsolete,
+# and will be removed.
+GNUSTEP_USER_DIR=GNUstep
+
+# The name of the user directory where defaults (eg, preferences) are
+# stored.  If it does not start with a '/', it will be considered
+# relative to the user home directory.
+GNUSTEP_USER_DEFAULTS_DIR=GNUstep/Defaults
+
+
+# This is where the gnustep-make Makefiles are installed.
+# Traditionally, this is /usr/GNUstep/System/Library/Makefiles
+GNUSTEP_MAKEFILES=@gnustepMakefiles@
+
+# This is where the user home directories are.  Only used to provide
+# NSUserDirectory in gnustep-base.  Never used anywhere else.
+GNUSTEP_SYSTEM_USERS_DIR=/home
+GNUSTEP_NETWORK_USERS_DIR=/home
+GNUSTEP_LOCAL_USERS_DIR=/home
+
+
+# This is where System GUI Applications get installed.
+# Traditionally it is /usr/GNUstep/System/Applications.
+GNUSTEP_SYSTEM_APPS=@systemApps@
+
+# This is where System GUI Applications that only the
+# Administrator can use get installed.
+# Traditionally it is /usr/GNUstep/System/Applications/Admin.
+GNUSTEP_SYSTEM_ADMIN_APPS=@systemAdminApps@
+
+# This is where System Web Applications (GSWeb, SOPE) get
+# installed.
+# Traditionally it is /usr/GNUstep/System/Library/WebApplications.
+GNUSTEP_SYSTEM_WEB_APPS=@systemWebApps@
+
+# This is where System Command-Line Tools get installed.
+# Traditionally it is /usr/GNUstep/System/Tools.
+GNUSTEP_SYSTEM_TOOLS=@systemTools@
+
+# This is where System Command-Line Tools that only the
+# Administrator can use get installed.  Important: this
+# should not be in the PATH of normal users.
+# Traditionally it is /usr/GNUstep/System/Tools/Admin.
+GNUSTEP_SYSTEM_ADMIN_TOOLS=@systemAdminTools@
+
+# This is where System resources get installed.  This directory will
+# contain a lot of executable code since *step traditionally likes to
+# bundle executables and resources together.
+# Traditionally it is /usr/GNUstep/System/Library.
+GNUSTEP_SYSTEM_LIBRARY=@systemLibrary@
+
+# This is where System headers get installed.  They are the
+# library .h headers.
+# Traditionally it is /usr/GNUstep/System/Library/Headers.
+GNUSTEP_SYSTEM_HEADERS=@systemHeaders@
+
+# This is where System libraries get installed.  By libraries we mean
+# the shared/static object files that you can link into programs.
+# Traditionally it is /usr/GNUstep/System/Library/Libraries.
+GNUSTEP_SYSTEM_LIBRARIES=@systemLibraries@
+
+# This is where System documentation get installed.  This is known
+# not to contain any executable, so we keep it separate.
+# Traditionally it is /usr/GNUstep/System/Library/Documentation.
+GNUSTEP_SYSTEM_DOC=@systemDoc@
+
+# This is where System man pages get installed.
+# Traditionally it is /usr/GNUstep/System/Library/Documentation/man.
+GNUSTEP_SYSTEM_DOC_MAN=@systemDocMan@
+
+# This is where System info pages get installed.
+# Traditionally it is /usr/GNUstep/System/Library/Documentation/info.
+GNUSTEP_SYSTEM_DOC_INFO=@systemDocInfo@
+
+
+GNUSTEP_NETWORK_APPS=@systemApps@
+GNUSTEP_NETWORK_ADMIN_APPS=@systemAdminApps@
+GNUSTEP_NETWORK_WEB_APPS=@systemWebApps@
+GNUSTEP_NETWORK_TOOLS=@systemTools@
+GNUSTEP_NETWORK_ADMIN_TOOLS=@systemAdminTools@
+GNUSTEP_NETWORK_LIBRARY=@systemLibrary@
+GNUSTEP_NETWORK_HEADERS=@systemHeaders@
+GNUSTEP_NETWORK_LIBRARIES=@systemLibraries@
+GNUSTEP_NETWORK_DOC=@systemDoc@
+GNUSTEP_NETWORK_DOC_MAN=@systemDocMan@
+GNUSTEP_NETWORK_DOC_INFO=@systemDocInfo@
+
+GNUSTEP_LOCAL_APPS=@systemApps@
+GNUSTEP_LOCAL_ADMIN_APPS=@systemAdminApps@
+GNUSTEP_LOCAL_WEB_APPS=@systemWebApps@
+GNUSTEP_LOCAL_TOOLS=@systemTools@
+GNUSTEP_LOCAL_ADMIN_TOOLS=@systemAdminTools@
+GNUSTEP_LOCAL_LIBRARY=@systemLibrary@
+GNUSTEP_LOCAL_HEADERS=@systemHeaders@
+GNUSTEP_LOCAL_LIBRARIES=@systemLibraries@
+GNUSTEP_LOCAL_DOC=@systemDoc@
+GNUSTEP_LOCAL_DOC_MAN=@systemDocMan@
+GNUSTEP_LOCAL_DOC_INFO=@systemDocInfo@
+
+# Important: settings in the User should normally be relative paths,
+# and will be interpreted as relative to the user's directory.  This
+# allows each user to have their own domain to install things.  You
+# can set them to be absolute, mostly if you want to disable them
+# by setting them equal to the ones in the Network domain.
+GNUSTEP_USER_DIR_APPS=GNUstep/Applications
+GNUSTEP_USER_DIR_ADMIN_APPS=GNUstep/Applications/Admin
+GNUSTEP_USER_DIR_WEB_APPS=GNUstep/WebApplications
+GNUSTEP_USER_DIR_TOOLS=GNUstep/Tools
+GNUSTEP_USER_DIR_ADMIN_TOOLS=GNUstep/Tools/Admin
+GNUSTEP_USER_DIR_LIBRARY=GNUstep/Library
+GNUSTEP_USER_DIR_HEADERS=GNUstep/Library/Headers
+GNUSTEP_USER_DIR_LIBRARIES=GNUstep/Library/Libraries
+GNUSTEP_USER_DIR_DOC=GNUstep/Library/Documentation
+GNUSTEP_USER_DIR_DOC_MAN=GNUstep/Library/Documentation/man
+GNUSTEP_USER_DIR_DOC_INFO=GNUstep/Library/Documentation/info
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/builder.sh b/nixpkgs/pkgs/desktops/gnustep/make/builder.sh
new file mode 100644
index 000000000000..1655a75eeba3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/builder.sh
@@ -0,0 +1,122 @@
+source $stdenv/setup
+
+preConfigure() {
+    . $GNUSTEP_MAKEFILES/GNUstep.sh
+}
+
+wrapGSMake() {
+    local program="$1"
+    local config="$2"
+    local wrapped="$(dirname $program)/.$(basename $program)-wrapped"
+
+    mv "$program" "$wrapped"
+
+    cat > "$program"<<EOF
+#! $SHELL -e
+
+export GNUSTEP_CONFIG_FILE="$config"
+
+exec "$wrapped" "\$@" "\${extraFlagsArray[@]}"
+EOF
+    chmod +x "$program"
+}
+
+postInstall() {
+    local conf="$out/share/.GNUstep.conf"
+
+    mkdir -p "$out/share"
+    touch $conf
+
+    # add the current package to the paths
+    local tmp="$out/lib/GNUstep/Applications"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_APPS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_APPS "$tmp"
+    fi
+    tmp="$out/lib/GNUstep/Applications"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_ADMIN_APPS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_ADMIN_APPS "$tmp"
+    fi
+    tmp="$out/lib/GNUstep/WebApplications"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_WEB_APPS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_WEB_APPS "$tmp"
+    fi
+    tmp="$out/bin"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_TOOLS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_TOOLS "$tmp"
+    fi
+    tmp="$out/sbin"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS "$tmp"
+    fi
+    tmp="$out/lib/GNUstep"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_LIBRARY" in *"${tmp}"*) false;; *) true;; esac; then
+    	addToSearchPath NIX_GNUSTEP_SYSTEM_LIBRARY "$tmp"
+    fi
+    tmp="$out/include"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_HEADERS" in *"${tmp}"*) false;; *) true;; esac; then
+    	if [ -z "$NIX_GNUSTEP_SYSTEM_HEADERS" ]; then
+    	    export NIX_GNUSTEP_SYSTEM_HEADERS="$tmp"
+    	else
+    	    export NIX_GNUSTEP_SYSTEM_HEADERS+=" $tmp"
+    	fi
+    fi
+    tmp="$out/lib"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_LIBRARIES" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_LIBRARIES "$tmp"
+    fi
+    tmp="$out/share/GNUstep/Documentation"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_DOC" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_DOC "$tmp"
+    fi
+    tmp="$out/share/man"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_DOC_MAN" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_DOC_MAN "$tmp"
+    fi
+    tmp="$out/share/info"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_DOC_INFO" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_DOC_INFO "$tmp"
+    fi
+    
+    # write the config file
+    echo GNUSTEP_MAKEFILES=$GNUSTEP_MAKEFILES >> $conf
+    if [ -n "$NIX_GNUSTEP_SYSTEM_APPS" ]; then
+	echo NIX_GNUSTEP_SYSTEM_APPS="$NIX_GNUSTEP_SYSTEM_APPS"
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_ADMIN_APPS" ]; then
+	echo NIX_GNUSTEP_SYSTEM_ADMIN_APPS="$NIX_GNUSTEP_SYSTEM_ADMIN_APPS" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_WEB_APPS" ]; then
+	echo NIX_GNUSTEP_SYSTEM_WEB_APPS="$NIX_GNUSTEP_SYSTEM_WEB_APPS" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_TOOLS" ]; then
+	echo NIX_GNUSTEP_SYSTEM_TOOLS="$NIX_GNUSTEP_SYSTEM_TOOLS" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS" ]; then
+	echo NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS="$NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_LIBRARY" ]; then
+	echo NIX_GNUSTEP_SYSTEM_LIBRARY="$NIX_GNUSTEP_SYSTEM_LIBRARY" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_HEADERS" ]; then
+	echo NIX_GNUSTEP_SYSTEM_HEADERS="$NIX_GNUSTEP_SYSTEM_HEADERS" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_LIBRARIES" ]; then
+	echo NIX_GNUSTEP_SYSTEM_LIBRARIES="$NIX_GNUSTEP_SYSTEM_LIBRARIES" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_DOC" ]; then
+	echo NIX_GNUSTEP_SYSTEM_DOC="$NIX_GNUSTEP_SYSTEM_DOC" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_DOC_MAN" ]; then
+	echo NIX_GNUSTEP_SYSTEM_DOC_MAN="$NIX_GNUSTEP_SYSTEM_DOC_MAN" >> $conf
+    fi
+    if [ -n "$NIX_GNUSTEP_SYSTEM_DOC_INFO" ]; then
+	echo NIX_GNUSTEP_SYSTEM_DOC_INFO="$NIX_GNUSTEP_SYSTEM_DOC_INFO" >> $conf
+    fi
+    
+    for i in $out/bin/*; do
+	echo "wrapping $(basename $i)"
+	wrapGSMake "$i" "$out/share/.GNUstep.conf"
+    done
+}
+
+genericBuild
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/default.nix b/nixpkgs/pkgs/desktops/gnustep/make/default.nix
new file mode 100644
index 000000000000..6ef87cece4e4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchurl, clang, which, libobjc }:
+
+let
+  version = "2.7.0";
+in
+
+stdenv.mkDerivation rec {
+  name = "gnustep-make-${version}";
+
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-make-${version}.tar.gz";
+    sha256 = "1khiygfkz0zhh9b5nybn40g0xnnjxchk24n49hff1bwanszir84h";
+  };
+
+  configureFlags = [
+    "--with-layout=fhs-system"
+    "--disable-install-p"
+  ];
+
+  preConfigure = ''
+    configureFlags="$configureFlags --with-config-file=$out/etc/GNUstep/GNUstep.conf"
+  '';
+
+  makeFlags = [
+    "GNUSTEP_INSTALLATION_DOMAIN=SYSTEM"
+  ];
+
+  buildInputs = [ clang which libobjc ];
+  patches = [ ./fixup-paths.patch ];
+  setupHook = ./setup-hook.sh;
+  meta = {
+    description = "A build manager for GNUstep";
+    homepage = http://gnustep.org/;
+    license = stdenv.lib.licenses.lgpl2Plus;
+    maintainers = with stdenv.lib.maintainers; [ ashalkhakov matthewbauer ];
+    platforms = stdenv.lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/fixup-paths.patch b/nixpkgs/pkgs/desktops/gnustep/make/fixup-paths.patch
new file mode 100644
index 000000000000..b5eb093ad964
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/fixup-paths.patch
@@ -0,0 +1,197 @@
+diff -r -u gnustep-make-2.6.6/common.make gnustep-make-2.6.6.patched/common.make
+--- gnustep-make-2.6.6/common.make	2013-03-04 17:21:55.000000000 +0600
++++ gnustep-make-2.6.6.patched/common.make	2015-01-18 14:36:25.000000000 +0600
+@@ -135,7 +135,9 @@
+ endif
+ # Then include makefiles with flags/config options installed by the 
+ # libraries themselves
+--include $(GNUSTEP_MAKEFILES)/Additional/*.make
++ifneq ($(NIX_GNUSTEP_MAKEFILES_ADDITIONAL),)
++include $(NIX_GNUSTEP_MAKEFILES_ADDITIONAL)
++endif
+ 
+ #
+ # Determine target specific settings
+diff -r -u gnustep-make-2.6.6/GNUmakefile.in gnustep-make-2.6.6.patched/GNUmakefile.in
+--- gnustep-make-2.6.6/GNUmakefile.in	2013-09-20 12:13:15.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUmakefile.in	2014-12-07 20:35:27.000000000 +0600
+@@ -173,7 +173,6 @@
+ 		"$(makedir)/$(GNUSTEP_TARGET_CPU)" \
+ 		"$(makedir)/$(GNUSTEP_TARGET_DIR)" \
+ 		"$(makedir)/$(GNUSTEP_TARGET_LDIR)" \
+-		"$(makedir)/Additional" \
+ 		"$(makedir)/Auxiliary" \
+ 		"$(makedir)/Master" \
+ 		"$(makedir)/Instance" \
+@@ -314,7 +313,6 @@
+ 	-rmdir "$(makedir)/Instance"
+ 	-rmdir "$(makedir)/Master"
+ 	-rmdir "$(makedir)/Auxiliary"
+-	-rmdir "$(makedir)/Additional"
+ 	-rmdir "$(makedir)/$(GNUSTEP_TARGET_LDIR)"
+ 	-rmdir "$(makedir)/$(GNUSTEP_TARGET_DIR)"
+ 	-rmdir "$(makedir)/$(GNUSTEP_TARGET_CPU)"
+diff -r -u gnustep-make-2.6.6/gnustep-config.in gnustep-make-2.6.6.patched/gnustep-config.in
+--- gnustep-make-2.6.6/gnustep-config.in	2013-07-02 16:06:24.000000000 +0600
++++ gnustep-make-2.6.6.patched/gnustep-config.in	2014-12-09 21:29:49.000000000 +0600
+@@ -66,6 +66,7 @@
+     echo "    --variable=OBJCXX"
+     echo "    --variable=GNUMAKE"
+     echo "    --variable=GNUSTEP_MAKEFILES"
++    echo "    --variable=NIX_GNUSTEP_MAKEFILES_ADDITIONAL"
+     echo "    --variable=GNUSTEP_USER_DEFAULTS_DIR"
+     echo "    --variable=GNUSTEP_HOST"
+     echo "    --variable=GNUSTEP_HOST_CPU"
+@@ -153,6 +154,8 @@
+ 
+ export GNUSTEP_MAKEFILES
+ 
++export NIX_GNUSTEP_MAKEFILES_ADDITIONAL
++
+ #
+ # If all they want to know if GNUSTEP_MAKEFILES or anything that
+ # we can compute only using GNUSTEP_MAKEFILES, we can print it out
+@@ -168,6 +171,8 @@
+               exit 0;;
+   --variable=GNUSTEP_MAKEFILES) echo "$GNUSTEP_MAKEFILES"
+               exit 0;;
++  --variable=NIX_GNUSTEP_MAKEFILES_ADDITIONAL) echo "$NIX_GNUSTEP_MAKEFILES_ADDITIONAL"
++              exit 0;;
+   --variable=GNUMAKE) echo "@GNUMAKE@"
+               exit 0;;
+   --debug-flags) @GNUMAKE@ -s -f "$GNUSTEP_MAKEFILES/empty.make" print-gnustep-make-objc-flags quiet=yes debug=yes 2>/dev/null
+Only in gnustep-make-2.6.6.patched: gnustep-config.in~
+diff -r -u gnustep-make-2.6.6/GNUstep.csh.in gnustep-make-2.6.6.patched/GNUstep.csh.in
+--- gnustep-make-2.6.6/GNUstep.csh.in	2011-05-03 13:40:10.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUstep.csh.in	2014-12-09 20:14:05.000000000 +0600
+@@ -130,6 +130,10 @@
+   setenv GNUSTEP_MAKEFILES "@GNUSTEP_MAKEFILES@"
+ endif
+ 
++if ( ! ${?NIX_GNUSTEP_MAKEFILES_ADDITIONAL} ) then
++  setenv NIX_GNUSTEP_MAKEFILES_ADDITIONAL "@NIX_GNUSTEP_MAKEFILES_ADDITIONAL@"
++endif
++
+ if ( "${GNUSTEP_MAKE_STRICT_V2_MODE}" == "yes" ) then
+   unsetenv GNUSTEP_USER_DIR
+   unsetenv GNUSTEP_USER_ROOT
+Only in gnustep-make-2.6.6.patched: GNUstep.csh.in~
+diff -r -u gnustep-make-2.6.6/GNUstep.sh.in gnustep-make-2.6.6.patched/GNUstep.sh.in
+--- gnustep-make-2.6.6/GNUstep.sh.in	2012-02-21 20:21:38.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUstep.sh.in	2015-01-18 14:48:09.000000000 +0600
+@@ -173,7 +173,6 @@
+ fi
+ export GNUSTEP_MAKEFILES
+ 
+-
+ if [ "$GNUSTEP_MAKE_STRICT_V2_MODE" = "yes" ]; then
+   # Make sure this is never set in gnustep-make v2 strict mode; it
+   # might have been set in the config file.
+@@ -300,7 +299,7 @@
+ # for each duplicate.  When there are many duplicates it's faster to
+ # use print_unique_pathlist.sh first to remove them and skip the
+ # echos+greps later.
+-GNUSTEP_TOOLS_PATHLIST=`$GNUSTEP_MAKEFILES/print_unique_pathlist.sh "$GNUSTEP_USER_TOOLS" "$GNUSTEP_LOCAL_TOOLS" "$GNUSTEP_NETWORK_TOOLS" "$GNUSTEP_SYSTEM_TOOLS" $fixup_paths`
++GNUSTEP_TOOLS_PATHLIST=$NIX_GNUSTEP_SYSTEM_TOOLS
+ 
+ # Now, we check the paths in GNUSTEP_*_ADMIN_TOOLS.  These paths
+ # should only be used by Administrators -- normal users don't have
+@@ -313,7 +312,7 @@
+ 
+ # So we examine GNUSTEP_*_ADMIN_TOOLS; if we find any path in that
+ # list that exists and that we can write to, we add it to our PATH.
+-for dir in "$GNUSTEP_SYSTEM_ADMIN_TOOLS" "$GNUSTEP_NETWORK_ADMIN_TOOLS" "$GNUSTEP_LOCAL_ADMIN_TOOLS" "$GNUSTEP_USER_ADMIN_TOOLS"; do
++for dir in $(echo "$NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS" | tr ":" "\n"); do
+   if [ -d "$dir"  -a  -w "$dir" ]; then
+     # Only add the new dir if it's not already in GNUSTEP_TOOLS_PATHLIST
+     if (echo ":${GNUSTEP_TOOLS_PATHLIST}:" \
+@@ -356,7 +355,7 @@
+ export PATH
+ 
+ # Determine the library paths
+-GNUSTEP_LIBRARIES_PATHLIST=`$GNUSTEP_MAKEFILES/print_unique_pathlist.sh "$GNUSTEP_USER_LIBRARIES" "$GNUSTEP_LOCAL_LIBRARIES" "$GNUSTEP_NETWORK_LIBRARIES" "$GNUSTEP_SYSTEM_LIBRARIES" $fixup_paths`
++GNUSTEP_LIBRARIES_PATHLIST=$NIX_GNUSTEP_SYSTEM_LIBRARIES
+ 
+ old_IFS="$IFS"
+ IFS=:
+@@ -486,7 +485,7 @@
+ #
+ # Setup Java CLASSPATH and Guile GUILE_LOAD_PATH
+ #
+-GNUSTEP_LIBRARY_PATHLIST=`$GNUSTEP_MAKEFILES/print_unique_pathlist.sh "$GNUSTEP_USER_LIBRARY" "$GNUSTEP_LOCAL_LIBRARY" "$GNUSTEP_NETWORK_LIBRARY" "$GNUSTEP_SYSTEM_LIBRARY" $fixup_paths`
++GNUSTEP_LIBRARY_PATHLIST=$NIX_GNUSTEP_SYSTEM_LIBRARY
+ 
+ old_IFS="$IFS"
+ IFS=:
+@@ -526,7 +525,7 @@
+ # xxx/Library/Documentation/info, are found by the info browsing
+ # programs.  To get this effect, we add those paths to INFOPATH.
+ #
+-GNUSTEP_INFO_PATHLIST=`$GNUSTEP_MAKEFILES/print_unique_pathlist.sh "$GNUSTEP_USER_DOC_INFO" "$GNUSTEP_LOCAL_DOC_INFO" "$GNUSTEP_NETWORK_DOC_INFO" "$GNUSTEP_SYSTEM_DOC_INFO" $fixup_paths`
++GNUSTEP_INFO_PATHLIST=$NIX_GNUSTEP_SYSTEM_DOC_INFO
+ old_IFS="$IFS"
+ IFS=:
+ for dir in $GNUSTEP_INFO_PATHLIST; do
+@@ -559,6 +558,7 @@
+ 
+   unset GNUSTEP_KEEP_CONFIG_FILE GNUSTEP_KEEP_USER_CONFIG_FILE
+ 
++  
+   export GNUSTEP_CONFIG_FILE GNUSTEP_USER_CONFIG_FILE
+ 
+   export GNUSTEP_USER_DEFAULTS_DIR
+diff -r -u gnustep-make-2.6.6/GNUstep-strict-v2.conf.in gnustep-make-2.6.6.patched/GNUstep-strict-v2.conf.in
+--- gnustep-make-2.6.6/GNUstep-strict-v2.conf.in	2008-01-15 20:35:36.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUstep-strict-v2.conf.in	2014-12-07 22:04:56.000000000 +0600
+@@ -47,7 +47,6 @@
+ # Traditionally, this is /usr/GNUstep/System/Library/Makefiles
+ GNUSTEP_MAKEFILES=@GNUSTEP_MAKEFILES@
+ 
+-
+ # This is where the user home directories are.  Only used to provide
+ # NSUserDirectory in gnustep-base.  Never used anywhere else.
+ GNUSTEP_SYSTEM_USERS_DIR=@GNUSTEP_SYSTEM_USERS_DIR@
+diff -r -u gnustep-make-2.6.6/library-combo.make gnustep-make-2.6.6.patched/library-combo.make
+--- gnustep-make-2.6.6/library-combo.make	2012-02-21 19:53:02.000000000 +0600
++++ gnustep-make-2.6.6.patched/library-combo.make	2014-12-09 20:15:05.000000000 +0600
+@@ -142,7 +142,7 @@
+ #
+ # Third-party foundations not using make package
+ # Our own foundation will install a base.make file into 
+-# $GNUSTEP_MAKEFILES/Additional/ to set the needed flags
++# $NIX_GNUSTEP_MAKEFILES_ADDITIONAL to set the needed flags
+ #
+ ifeq ($(FOUNDATION_LIB), nx)
+   # -framework Foundation is used both to find headers, and to link
+@@ -166,7 +166,7 @@
+ 
+ #
+ # FIXME - Ask Helge to move this inside his libFoundation, and have 
+-# it installed as a $(GNUSTEP_MAKEFILES)/Additional/libFoundation.make
++# it installed as a $(NIX_GNUSTEP_MAKEFILES_ADDITIONAL)/libFoundation.make
+ #
+ ifeq ($(FOUNDATION_LIB),fd)
+   -include $(GNUSTEP_MAKEFILES)/libFoundation.make
+@@ -193,7 +193,7 @@
+ GUI_LIBS = 
+ #
+ # Third-party GUI libraries - our own sets its flags into 
+-# $(GNUSTEP_MAKEFILES)/Additional/gui.make
++# $(NIX_GNUSTEP_MAKEFILES_ADDITIONAL)/gui.make
+ #
+ ifeq ($(GUI_LIB), nx)
+   GUI_DEFINE = -DNeXT_GUI_LIBRARY=1
+diff -r -u gnustep-make-2.6.6/rules.make gnustep-make-2.6.6.patched/rules.make
+--- gnustep-make-2.6.6/rules.make	2013-07-04 16:05:44.000000000 +0600
++++ gnustep-make-2.6.6.patched/rules.make	2014-12-09 21:31:04.000000000 +0600
+@@ -667,7 +667,9 @@
+ 	exit 1$(END_ECHO)
+ endif
+ 
+-$(GNUSTEP_MAKEFILES)/Additional/*.make: ;
++ifneq ($(NIX_GNUSTEP_MAKEFILES_ADDITIONAL),)
++$(NIX_GNUSTEP_MAKEFILES_ADDITIONAL): ;
++endif
+ 
+ $(GNUSTEP_MAKEFILES)/Master/*.make: ;
+ 
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/gs-makefiles-additional.patch b/nixpkgs/pkgs/desktops/gnustep/make/gs-makefiles-additional.patch
new file mode 100644
index 000000000000..98e22f37ee7d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/gs-makefiles-additional.patch
@@ -0,0 +1,145 @@
+diff -ru gnustep-make-2.6.6/common.make gnustep-make-2.6.6.patched/common.make
+--- gnustep-make-2.6.6/common.make	2013-03-04 17:21:55.000000000 +0600
++++ gnustep-make-2.6.6.patched/common.make	2014-12-09 21:29:10.000000000 +0600
+@@ -135,7 +135,9 @@
+ endif
+ # Then include makefiles with flags/config options installed by the 
+ # libraries themselves
+--include $(GNUSTEP_MAKEFILES)/Additional/*.make
++ifneq ($(NIX_GNUSTEP_MAKEFILES_ADDITIONAL),)
++-include $(NIX_GNUSTEP_MAKEFILES_ADDITIONAL)
++endif
+ 
+ #
+ # Determine target specific settings
+diff -ru gnustep-make-2.6.6/GNUmakefile.in gnustep-make-2.6.6.patched/GNUmakefile.in
+--- gnustep-make-2.6.6/GNUmakefile.in	2013-09-20 12:13:15.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUmakefile.in	2014-12-07 20:35:27.000000000 +0600
+@@ -173,7 +173,6 @@
+ 		"$(makedir)/$(GNUSTEP_TARGET_CPU)" \
+ 		"$(makedir)/$(GNUSTEP_TARGET_DIR)" \
+ 		"$(makedir)/$(GNUSTEP_TARGET_LDIR)" \
+-		"$(makedir)/Additional" \
+ 		"$(makedir)/Auxiliary" \
+ 		"$(makedir)/Master" \
+ 		"$(makedir)/Instance" \
+@@ -314,7 +313,6 @@
+ 	-rmdir "$(makedir)/Instance"
+ 	-rmdir "$(makedir)/Master"
+ 	-rmdir "$(makedir)/Auxiliary"
+-	-rmdir "$(makedir)/Additional"
+ 	-rmdir "$(makedir)/$(GNUSTEP_TARGET_LDIR)"
+ 	-rmdir "$(makedir)/$(GNUSTEP_TARGET_DIR)"
+ 	-rmdir "$(makedir)/$(GNUSTEP_TARGET_CPU)"
+diff -ru gnustep-make-2.6.6/gnustep-config.in gnustep-make-2.6.6.patched/gnustep-config.in
+--- gnustep-make-2.6.6/gnustep-config.in	2013-07-02 16:06:24.000000000 +0600
++++ gnustep-make-2.6.6.patched/gnustep-config.in	2014-12-09 21:29:49.000000000 +0600
+@@ -66,6 +66,7 @@
+     echo "    --variable=OBJCXX"
+     echo "    --variable=GNUMAKE"
+     echo "    --variable=GNUSTEP_MAKEFILES"
++    echo "    --variable=NIX_GNUSTEP_MAKEFILES_ADDITIONAL"
+     echo "    --variable=GNUSTEP_USER_DEFAULTS_DIR"
+     echo "    --variable=GNUSTEP_HOST"
+     echo "    --variable=GNUSTEP_HOST_CPU"
+@@ -153,6 +154,8 @@
+ 
+ export GNUSTEP_MAKEFILES
+ 
++export NIX_GNUSTEP_MAKEFILES_ADDITIONAL
++
+ #
+ # If all they want to know if GNUSTEP_MAKEFILES or anything that
+ # we can compute only using GNUSTEP_MAKEFILES, we can print it out
+@@ -168,6 +171,8 @@
+               exit 0;;
+   --variable=GNUSTEP_MAKEFILES) echo "$GNUSTEP_MAKEFILES"
+               exit 0;;
++  --variable=NIX_GNUSTEP_MAKEFILES_ADDITIONAL) echo "$NIX_GNUSTEP_MAKEFILES_ADDITIONAL"
++              exit 0;;
+   --variable=GNUMAKE) echo "@GNUMAKE@"
+               exit 0;;
+   --debug-flags) @GNUMAKE@ -s -f "$GNUSTEP_MAKEFILES/empty.make" print-gnustep-make-objc-flags quiet=yes debug=yes 2>/dev/null
+diff -ru gnustep-make-2.6.6/GNUstep.csh.in gnustep-make-2.6.6.patched/GNUstep.csh.in
+--- gnustep-make-2.6.6/GNUstep.csh.in	2011-05-03 13:40:10.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUstep.csh.in	2014-12-09 20:14:05.000000000 +0600
+@@ -130,6 +130,10 @@
+   setenv GNUSTEP_MAKEFILES "@GNUSTEP_MAKEFILES@"
+ endif
+ 
++if ( ! ${?NIX_GNUSTEP_MAKEFILES_ADDITIONAL} ) then
++  setenv NIX_GNUSTEP_MAKEFILES_ADDITIONAL "@NIX_GNUSTEP_MAKEFILES_ADDITIONAL@"
++endif
++
+ if ( "${GNUSTEP_MAKE_STRICT_V2_MODE}" == "yes" ) then
+   unsetenv GNUSTEP_USER_DIR
+   unsetenv GNUSTEP_USER_ROOT
+diff -ru gnustep-make-2.6.6/GNUstep.sh.in gnustep-make-2.6.6.patched/GNUstep.sh.in
+--- gnustep-make-2.6.6/GNUstep.sh.in	2012-02-21 20:21:38.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUstep.sh.in	2014-12-09 20:14:19.000000000 +0600
+@@ -173,6 +173,10 @@
+ fi
+ export GNUSTEP_MAKEFILES
+ 
++if [ -z "$NIX_GNUSTEP_MAKEFILES_ADDITIONAL" ]; then
++  NIX_GNUSTEP_MAKEFILES_ADDITIONAL=@NIX_GNUSTEP_MAKEFILES_ADDITIONAL@
++fi
++export NIX_GNUSTEP_MAKEFILES_ADDITIONAL
+ 
+ if [ "$GNUSTEP_MAKE_STRICT_V2_MODE" = "yes" ]; then
+   # Make sure this is never set in gnustep-make v2 strict mode; it
+diff -ru gnustep-make-2.6.6/GNUstep-strict-v2.conf.in gnustep-make-2.6.6.patched/GNUstep-strict-v2.conf.in
+--- gnustep-make-2.6.6/GNUstep-strict-v2.conf.in	2008-01-15 20:35:36.000000000 +0600
++++ gnustep-make-2.6.6.patched/GNUstep-strict-v2.conf.in	2014-12-07 22:04:56.000000000 +0600
+@@ -47,7 +47,6 @@
+ # Traditionally, this is /usr/GNUstep/System/Library/Makefiles
+ GNUSTEP_MAKEFILES=@GNUSTEP_MAKEFILES@
+ 
+-
+ # This is where the user home directories are.  Only used to provide
+ # NSUserDirectory in gnustep-base.  Never used anywhere else.
+ GNUSTEP_SYSTEM_USERS_DIR=@GNUSTEP_SYSTEM_USERS_DIR@
+diff -ru gnustep-make-2.6.6/library-combo.make gnustep-make-2.6.6.patched/library-combo.make
+--- gnustep-make-2.6.6/library-combo.make	2012-02-21 19:53:02.000000000 +0600
++++ gnustep-make-2.6.6.patched/library-combo.make	2014-12-09 20:15:05.000000000 +0600
+@@ -142,7 +142,7 @@
+ #
+ # Third-party foundations not using make package
+ # Our own foundation will install a base.make file into 
+-# $GNUSTEP_MAKEFILES/Additional/ to set the needed flags
++# $NIX_GNUSTEP_MAKEFILES_ADDITIONAL to set the needed flags
+ #
+ ifeq ($(FOUNDATION_LIB), nx)
+   # -framework Foundation is used both to find headers, and to link
+@@ -166,7 +166,7 @@
+ 
+ #
+ # FIXME - Ask Helge to move this inside his libFoundation, and have 
+-# it installed as a $(GNUSTEP_MAKEFILES)/Additional/libFoundation.make
++# it installed as a $(NIX_GNUSTEP_MAKEFILES_ADDITIONAL)/libFoundation.make
+ #
+ ifeq ($(FOUNDATION_LIB),fd)
+   -include $(GNUSTEP_MAKEFILES)/libFoundation.make
+@@ -193,7 +193,7 @@
+ GUI_LIBS = 
+ #
+ # Third-party GUI libraries - our own sets its flags into 
+-# $(GNUSTEP_MAKEFILES)/Additional/gui.make
++# $(NIX_GNUSTEP_MAKEFILES_ADDITIONAL)/gui.make
+ #
+ ifeq ($(GUI_LIB), nx)
+   GUI_DEFINE = -DNeXT_GUI_LIBRARY=1
+diff -ru gnustep-make-2.6.6/rules.make gnustep-make-2.6.6.patched/rules.make
+--- gnustep-make-2.6.6/rules.make	2013-07-04 16:05:44.000000000 +0600
++++ gnustep-make-2.6.6.patched/rules.make	2014-12-09 21:31:04.000000000 +0600
+@@ -667,7 +667,9 @@
+ 	exit 1$(END_ECHO)
+ endif
+ 
+-$(GNUSTEP_MAKEFILES)/Additional/*.make: ;
++ifneq ($(NIX_GNUSTEP_MAKEFILES_ADDITIONAL),)
++$(NIX_GNUSTEP_MAKEFILES_ADDITIONAL): ;
++endif
+ 
+ $(GNUSTEP_MAKEFILES)/Master/*.make: ;
+ 
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/gsmakeDerivation.nix b/nixpkgs/pkgs/desktops/gnustep/make/gsmakeDerivation.nix
new file mode 100644
index 000000000000..7bb287c3fa59
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/gsmakeDerivation.nix
@@ -0,0 +1,19 @@
+{ stdenv, make, makeWrapper, which }:
+{ buildInputs ? [], ...} @ args:
+stdenv.mkDerivation (args // {
+  buildInputs = [ makeWrapper make which ] ++ buildInputs;
+
+  builder = ./builder.sh;
+  setupHook = ./setup-hook.sh;
+
+  GNUSTEP_MAKEFILES = "${make}/share/GNUstep/Makefiles";
+
+  meta = {
+    homepage = http://gnustep.org/;
+
+    license = stdenv.lib.licenses.lgpl2Plus;
+
+    maintainers = with stdenv.lib.maintainers; [ ashalkhakov matthewbauer ];
+    platforms = stdenv.lib.platforms.linux;
+  } // (if builtins.hasAttr "meta" args then args.meta else {});
+})
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/setup-hook.sh b/nixpkgs/pkgs/desktops/gnustep/make/setup-hook.sh
new file mode 100644
index 000000000000..531389011164
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/setup-hook.sh
@@ -0,0 +1,77 @@
+# this path is used by some packages to install additional makefiles
+export DESTDIR_GNUSTEP_MAKEFILES=$out/share/GNUstep/Makefiles
+
+installFlagsArray=( \
+  "GNUSTEP_INSTALLATION_DOMAIN=SYSTEM" \
+  "GNUSTEP_SYSTEM_APPS=$out/lib/GNUstep/Applications" \
+  "GNUSTEP_SYSTEM_ADMIN_APPS=$out/lib/GNUstep/Applications" \
+  "GNUSTEP_SYSTEM_WEB_APPS=$out/lib/GNUstep/WebApplications" \
+  "GNUSTEP_SYSTEM_TOOLS=$out/bin" \
+  "GNUSTEP_SYSTEM_ADMIN_TOOLS=$out/sbin" \
+  "GNUSTEP_SYSTEM_LIBRARY=$out/lib/GNUstep" \
+  "GNUSTEP_SYSTEM_HEADERS=$out/include" \
+  "GNUSTEP_SYSTEM_LIBRARIES=$out/lib" \
+  "GNUSTEP_SYSTEM_DOC=$out/share/GNUstep/Documentation" \
+  "GNUSTEP_SYSTEM_DOC_MAN=$out/share/man" \
+  "GNUSTEP_SYSTEM_DOC_INFO=$out/share/info" \
+)
+
+addEnvVars() {
+    local filename
+
+    for filename in $1/share/GNUstep/Makefiles/Additional/*.make ; do
+	if case "$NIX_GNUSTEP_MAKEFILES_ADDITIONAL" in *"{$filename}"*) false;; *) true;; esac; then
+	    export NIX_GNUSTEP_MAKEFILES_ADDITIONAL+=" $filename"
+	fi
+    done
+
+    local tmp="$1/lib/GNUstep/Applications"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_APPS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_APPS "$tmp"
+    fi
+    tmp="$1/lib/GNUstep/Applications"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_ADMIN_APPS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_ADMIN_APPS "$tmp"
+    fi
+    tmp="$1/lib/GNUstep/WebApplications"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_WEB_APPS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_WEB_APPS "$tmp"
+    fi
+    tmp="$1/bin"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_TOOLS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_TOOLS "$tmp"
+    fi
+    tmp="$1/sbin"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_ADMIN_TOOLS "$tmp"
+    fi
+    tmp="$1/lib/GNUstep"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_LIBRARY" in *"${tmp}"*) false;; *) true;; esac; then
+    	addToSearchPath NIX_GNUSTEP_SYSTEM_LIBRARY "$tmp"
+    fi
+    tmp="$1/include"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_HEADERS" in *"${tmp}"*) false;; *) true;; esac; then
+    	if [ -z "$NIX_GNUSTEP_SYSTEM_HEADERS" ]; then
+    	    export NIX_GNUSTEP_SYSTEM_HEADERS="$tmp"
+    	else
+    	    export NIX_GNUSTEP_SYSTEM_HEADERS+=" $tmp"
+    	fi
+    fi
+    tmp="$1/lib"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_LIBRARIES" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_LIBRARIES "$tmp"
+    fi
+    tmp="$1/share/GNUstep/Documentation"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_DOC" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_DOC "$tmp"
+    fi
+    tmp="$1/share/man"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_DOC_MAN" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_DOC_MAN "$tmp"
+    fi
+    tmp="$1/share/info"
+    if [ -d "$tmp" ] && case "$NIX_GNUSTEP_SYSTEM_DOC_INFO" in *"${tmp}"*) false;; *) true;; esac; then
+	addToSearchPath NIX_GNUSTEP_SYSTEM_DOC_INFO "$tmp"
+    fi
+}
+addEnvHooks "$targetOffset" addEnvVars
diff --git a/nixpkgs/pkgs/desktops/gnustep/make/wrapper.sh b/nixpkgs/pkgs/desktops/gnustep/make/wrapper.sh
new file mode 100644
index 000000000000..1bc2e130d88d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/make/wrapper.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+. $GNUSTEP_MAKEFILES/GNUstep.sh
+$1
diff --git a/nixpkgs/pkgs/desktops/gnustep/projectcenter/default.nix b/nixpkgs/pkgs/desktops/gnustep/projectcenter/default.nix
new file mode 100644
index 000000000000..abfdac1e7afb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/projectcenter/default.nix
@@ -0,0 +1,23 @@
+{ fetchurl
+, base, back, gsmakeDerivation, gui, gorm
+, gnumake, gdb
+}:
+let
+  version = "0.6.2";
+in
+gsmakeDerivation {
+  name = "projectcenter-${version}";
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/dev-apps/ProjectCenter-${version}.tar.gz";
+    sha256 = "0wwlbpqf541apw192jb633d634zkpjhcrrkd1j80y9hihphll465";
+  };
+
+  # NOTE: need a patch for ProjectCenter to help it locate some necessary tools:
+  # 1. Framework/PCProjectLauncher.m, locate gdb (say among NIX_GNUSTEP_SYSTEM_TOOLS)
+  # 2. Framework/PCProjectBuilder.m, locate gmake (similar)
+  propagatedBuildInputs = [ base back gui gnumake gdb gorm ];
+  
+  meta = {
+    description = "GNUstep's integrated development environment";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/gnustep/projectcenter/fixup-preamble.patch b/nixpkgs/pkgs/desktops/gnustep/projectcenter/fixup-preamble.patch
new file mode 100644
index 000000000000..3fe19a6a58b9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/projectcenter/fixup-preamble.patch
@@ -0,0 +1,14 @@
+diff -c ProjectCenter-0.6.2/GNUmakefile.preamble ProjectCenter-0.6.2.patched/GNUmakefile.preamble
+--- ProjectCenter-0.6.2/GNUmakefile.preamble	2010-08-08 03:56:04.000000000 +0600
++++ artyom/ProjectCenter-0.6.2.patched/GNUmakefile.preamble	2014-12-01 20:08:31.000000000 +0600
+@@ -39,7 +39,7 @@
+ ADDITIONAL_INCLUDE_DIRS += -I./ -I./Headers
+ 
+ # Additional LDFLAGS to pass to the linker
+-ADDITIONAL_LDFLAGS += 
++ADDITIONAL_LDFLAGS += -lgnustep-base -lgnustep-gui
+ 
+ # Additional library directories the linker should search
+ ADDITIONAL_LIB_DIRS += -L./Framework/ProjectCenter.framework/$(GNUSTEP_TARGET_LDIR)
+
+Diff finished.  Mon Dec  1 20:08:50 2014
diff --git a/nixpkgs/pkgs/desktops/gnustep/systempreferences/default.nix b/nixpkgs/pkgs/desktops/gnustep/systempreferences/default.nix
new file mode 100644
index 000000000000..096520f08f36
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/gnustep/systempreferences/default.nix
@@ -0,0 +1,17 @@
+{ back, base, gui, gsmakeDerivation, fetchurl }:
+let
+  version = "1.2.0";
+in
+gsmakeDerivation {
+  name = "system_preferences-${version}";
+  src = fetchurl {
+    url = "ftp://ftp.gnustep.org/pub/gnustep/usr-apps/SystemPreferences-${version}.tar.gz";
+    sha256 = "1fg7c3ihfgvl6n21rd17fs9ivx3l8ps874m80vz86n1callgs339";
+  };
+#  GNUSTEP_MAKEFILES = "${gnustep_make}/share/GNUstep/Makefiles";
+  buildInputs = [ back base gui ];
+#  propagatedBuildInputs = [ gnustep_back gnustep_base gnustep_gui ];
+  meta = {
+    description = "The settings manager for the GNUstep environment and its applications";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lumina/LuminaOS-NixOS.cpp.patch b/nixpkgs/pkgs/desktops/lumina/LuminaOS-NixOS.cpp.patch
new file mode 100644
index 000000000000..6ddd9c76591b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lumina/LuminaOS-NixOS.cpp.patch
@@ -0,0 +1,26 @@
+diff --git a/src-qt5/core/libLumina/LuminaOS-NixOS.cpp b/src-qt5/core/libLumina/LuminaOS-NixOS.cpp
+index b92d1b0..441b1bf 100644
+--- a/src-qt5/core/libLumina/LuminaOS-NixOS.cpp
++++ b/src-qt5/core/libLumina/LuminaOS-NixOS.cpp
+@@ -13,17 +13,17 @@
+ //can't read xbrightness settings - assume invalid until set
+ static int screenbrightness = -1;
+ 
+-QString LOS::OSName(){ return "Gentoo Linux"; }
++QString LOS::OSName(){ return "NixOS"; }
+ 
+ //OS-specific prefix(s)
+ // NOTE: PREFIX, L_ETCDIR, L_SHAREDIR are defined in the OS-detect.pri project file and passed in
+ QString LOS::LuminaShare(){ return (L_SHAREDIR+"/lumina-desktop/"); } //Install dir for Lumina share files
+-QString LOS::AppPrefix(){ return "/usr/"; } //Prefix for applications
+-QString LOS::SysPrefix(){ return "/"; } //Prefix for system
++QString LOS::AppPrefix(){ return PREFIX+"/usr"; } //Prefix for applications
++QString LOS::SysPrefix(){ return PREFIX; } //Prefix for system
+ 
+ //OS-specific application shortcuts (*.desktop files)
+ QString LOS::ControlPanelShortcut(){ return ""; } //system control panel
+-QString LOS::AppStoreShortcut(){ return LOS::AppPrefix() + "/share/applications/porthole.desktop"; } //graphical app/pkg manager
++QString LOS::AppStoreShortcut(){ return ""; } //graphical app/pkg manager
+ //OS-specific RSS feeds (Format: QStringList[ <name>::::<url> ]; )
+ QStringList LOS::RSSFeeds(){ return QStringList(); } 
+ 
diff --git a/nixpkgs/pkgs/desktops/lumina/avoid-absolute-path-on-sessdir.patch b/nixpkgs/pkgs/desktops/lumina/avoid-absolute-path-on-sessdir.patch
new file mode 100644
index 000000000000..f5ef6cba41f6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lumina/avoid-absolute-path-on-sessdir.patch
@@ -0,0 +1,11 @@
+diff -Naur lumina-1.0.0-Release-p1-OLD/src-qt5/OS-detect.pri lumina-1.0.0-Release-p1-PATCH/src-qt5/OS-detect.pri
+--- lumina-1.0.0-Release-p1-OLD/src-qt5/OS-detect.pri	2016-08-09 12:04:30.000000000 -0300
++++ lumina-1.0.0-Release-p1-PATCH/src-qt5/OS-detect.pri	2016-08-13 17:32:18.272137900 -0300
+@@ -55,7 +55,6 @@
+     #Use the defaults for everything else
+ 
+   }else : linux-*{
+-    L_SESSDIR=/usr/share/xsessions
+     OS=Linux
+     LIBS += -L/usr/local/lib -L/usr/lib -L/lib
+ 
diff --git a/nixpkgs/pkgs/desktops/lumina/default.nix b/nixpkgs/pkgs/desktops/lumina/default.nix
new file mode 100644
index 000000000000..00ebfd8a7253
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lumina/default.nix
@@ -0,0 +1,84 @@
+{ stdenv, fetchFromGitHub, fluxbox, xscreensaver, desktop-file-utils,
+  numlockx, xorg, qtbase, qtsvg, qtmultimedia, qtx11extras, qmake,
+  qttools, poppler, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  name = "lumina-${version}";
+  version = "1.4.0-p1";
+
+  src = fetchFromGitHub {
+    owner = "trueos";
+    repo = "lumina";
+    rev = "v${version}";
+    sha256 = "0jin0a2s6pjbpw7w1bz67dgqp0xlpw1a7nh8zv0qwdf954zczanp";
+  };
+
+  nativeBuildInputs = [
+    qmake
+    qttools
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    xorg.libxcb
+    xorg.libXdamage
+    xorg.xcbutilwm
+    xorg.xcbutilimage
+    qtbase
+    qtsvg
+    qtmultimedia
+    qtx11extras
+    poppler
+    fluxbox
+    xscreensaver
+    desktop-file-utils
+    numlockx
+  ];
+
+  patches = [
+    ./avoid-absolute-path-on-sessdir.patch
+    ./LuminaOS-NixOS.cpp.patch
+  ];
+
+  prePatch = ''
+    # Copy Gentoo setup as NixOS setup and then patch it
+    # TODO: write a complete NixOS setup?
+    cp -a src-qt5/core/libLumina/LuminaOS-Gentoo.cpp src-qt5/core/libLumina/LuminaOS-NixOS.cpp
+  '';
+
+  postPatch = ''
+    # Fix location of poppler-qt5.h
+    substituteInPlace src-qt5/desktop-utils/lumina-pdf/mainUI.h \
+      --replace '#include <poppler-qt5.h>' '#include <poppler/qt5/poppler-qt5.h>'
+
+    # Fix plugin dir
+    substituteInPlace src-qt5/core/lumina-theme-engine/lthemeengine.pri \
+      --replace "\$\$[QT_INSTALL_PLUGINS]" "$out/$qtPluginPrefix"
+
+    # Fix location of fluxbox styles
+    substituteInPlace src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.cpp \
+      --replace 'LOS::AppPrefix()+"share/fluxbox' "\"${fluxbox}/share/fluxbox"
+  '';
+
+  qmakeFlags = [
+    "LINUX_DISTRO=NixOS"
+    "CONFIG+=WITH_I18N"
+    "LRELEASE=${stdenv.lib.getDev qttools}/bin/lrelease"
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "A lightweight, portable desktop environment";
+    longDescription = ''
+      The Lumina Desktop Environment is a lightweight system interface
+      that is designed for use on any Unix-like operating system. It
+      is based on QT5.
+    '';
+    homepage = https://lumina-desktop.org;
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxde/core/lxappearance/default.nix b/nixpkgs/pkgs/desktops/lxde/core/lxappearance/default.nix
new file mode 100644
index 000000000000..c06a99eb36c2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxde/core/lxappearance/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, intltool, pkgconfig, libX11, gtk2, withGtk3 ? false, gtk3 }:
+
+stdenv.mkDerivation rec {
+  name = "lxappearance-0.6.3";
+
+  src = fetchurl{
+    url = "mirror://sourceforge/project/lxde/LXAppearance/${name}.tar.xz";
+    sha256 = "0f4bjaamfxxdr9civvy55pa6vv9dx1hjs522gjbbgx7yp1cdh8kj";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ libX11 (if withGtk3 then gtk3 else gtk2) ];
+
+  patches = [ ./lxappearance-0.6.3-xdg.system.data.dirs.patch ];
+
+  configureFlags = stdenv.lib.optional withGtk3 "--enable-gtk3";
+
+  meta = {
+    description = "A lightweight program for configuring the theme and fonts of gtk applications";
+    homepage = https://lxde.org/;
+    maintainers = [ stdenv.lib.maintainers.hinton ];
+    platforms = stdenv.lib.platforms.linux;
+    license = stdenv.lib.licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxde/core/lxappearance/lxappearance-0.6.3-xdg.system.data.dirs.patch b/nixpkgs/pkgs/desktops/lxde/core/lxappearance/lxappearance-0.6.3-xdg.system.data.dirs.patch
new file mode 100644
index 000000000000..a63882aa2a7a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxde/core/lxappearance/lxappearance-0.6.3-xdg.system.data.dirs.patch
@@ -0,0 +1,27 @@
+--- lxappearance-0.6.3/src/widget-theme.c.orig	2016-02-20 20:48:38.000000000 -0200
++++ lxappearance-0.6.3/src/widget-theme.c	2017-06-09 17:37:53.369555085 -0300
+@@ -66,6 +66,7 @@
+ static void load_themes()
+ {
+     char* dir;
++    const gchar * const * dirs;
+     GSList* themes = NULL, *l;
+     GtkTreeIter sel_it = {0};
+     GtkTreeSelection* tree_sel;
+@@ -85,6 +86,16 @@
+     themes = load_themes_in_dir(dir, themes);
+     g_free(dir);
+ 
++    /* load from sharedata theme dirs */
++    dirs = g_get_system_data_dirs();
++    while (*dirs != NULL)
++    {
++        dir = g_build_filename(*dirs, "themes", NULL);
++        themes = load_themes_in_dir(dir, themes);
++        g_free(dir);
++        dirs++;
++    }
++
+     themes = g_slist_sort(themes, (GCompareFunc)strcmp);
+     for(l = themes; l; l=l->next)
+     {
diff --git a/nixpkgs/pkgs/desktops/lxde/core/lxmenu-data.nix b/nixpkgs/pkgs/desktops/lxde/core/lxmenu-data.nix
new file mode 100644
index 000000000000..6e8644b19b0c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxde/core/lxmenu-data.nix
@@ -0,0 +1,20 @@
+{ stdenv, fetchurl, intltool }:
+
+stdenv.mkDerivation rec {
+  name = "lxmenu-data-${version}";
+  version = "0.1.5";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lxde/${name}.tar.xz";
+    sha256 = "9fe3218d2ef50b91190162f4f923d6524c364849f87bcda8b4ed8eb59b80bab8";
+  };
+
+  buildInputs = [ intltool ];
+
+  meta = {
+    homepage = https://lxde.org/;
+    license = stdenv.lib.licenses.gpl2;
+    description = "Freedesktop.org desktop menus for LXDE";
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxde/core/lxpanel/default.nix b/nixpkgs/pkgs/desktops/lxde/core/lxpanel/default.nix
new file mode 100644
index 000000000000..af9570a2c733
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxde/core/lxpanel/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchurl, pkgconfig, gettext, m4, intltool, libxmlxx, keybinder
+, gtk2, libX11, libfm, libwnck, libXmu, libXpm, cairo, gdk_pixbuf
+, menu-cache, lxmenu-data, wirelesstools
+, supportAlsa ? false, alsaLib
+}:
+
+stdenv.mkDerivation rec {
+  name = "lxpanel-0.9.3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lxde/${name}.tar.xz";
+    sha256 = "1ccgv7jgl3y865cpb6w7baaz7468fxncm83bqxlwyni5bwhglb1l";
+  };
+
+  nativeBuildInputs = [ pkgconfig gettext m4 intltool libxmlxx ];
+  buildInputs = [
+    keybinder gtk2 libX11 libfm libwnck libXmu libXpm cairo gdk_pixbuf
+    menu-cache lxmenu-data m4 wirelesstools
+  ] ++ stdenv.lib.optional supportAlsa alsaLib;
+
+  meta = {
+    description = "Lightweight X11 desktop panel for LXDE";
+    homepage = https://lxde.org/;
+    license = stdenv.lib.licenses.gpl2;
+    maintainers = [ stdenv.lib.maintainers.ryneeverett ];
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxde/core/lxrandr/default.nix b/nixpkgs/pkgs/desktops/lxde/core/lxrandr/default.nix
new file mode 100644
index 000000000000..49a71987e754
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxde/core/lxrandr/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk2, libX11, xrandr, withGtk3 ? false, gtk3 }:
+
+stdenv.mkDerivation rec {
+  name = "lxrandr-0.3.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lxde/${name}.tar.xz";
+    sha256 = "6d98338485a90d9e47f6d08184df77ca0d9715517f8a45a914e861750589184e";
+  };
+
+  configureFlags = stdenv.lib.optional withGtk3 "--enable-gtk3";
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs = [ libX11 (if withGtk3 then gtk3 else gtk2) xrandr ];
+
+  meta = with stdenv.lib; {
+    description = "LXRandR is the standard screen manager of LXDE.";
+    homepage = https://lxde.org/;
+    license = stdenv.lib.licenses.gpl2;
+    maintainers = with maintainers; [ rawkode ];
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxde/core/lxtask/default.nix b/nixpkgs/pkgs/desktops/lxde/core/lxtask/default.nix
new file mode 100644
index 000000000000..ad4b89165fa1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxde/core/lxtask/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, libintl }:
+
+stdenv.mkDerivation rec {
+  name = "lxtask-${version}";
+  version = "0.1.8";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lxde/${name}.tar.xz";
+    sha256 = "0h7g1fdngv939z1d05nzs86dplww5a3bpm0isxd7p1bjby047d6z";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ gtk3 libintl ];
+
+  configureFlags = [ "--enable-gtk3" ];
+
+  meta = {
+    description = "Lightweight and desktop independent task manager";
+    longDescription = ''
+      LXTask is a lightweight task manager derived from xfce4 task manager
+      with all xfce4 dependencies removed, some bugs fixed, and some
+      improvement of UI. Although being part of LXDE, the Lightweight X11
+      Desktop Environment, it's totally desktop independent and only
+      requires pure gtk+.
+    '';
+    homepage = https://wiki.lxde.org/en/LXTask;
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/compton-conf/default.nix b/nixpkgs/pkgs/desktops/lxqt/compton-conf/default.nix
new file mode 100644
index 000000000000..479491b35d80
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/compton-conf/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, qtbase, qttools, lxqt,
+  libconfig }:
+
+stdenv.mkDerivation rec {
+  pname = "compton-conf";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1vxbh0vr7wknr7rbmdbmy5md1fdkw3zwlgpbv16cwdplbv9m97xi";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt.lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    libconfig
+  ];
+
+  preConfigure = ''
+    substituteInPlace autostart/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg" \
+    '';
+
+  meta = with stdenv.lib; {
+    description = "GUI configuration tool for compton X composite manager";
+    homepage = https://github.com/lxqt/compton-conf;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/default.nix b/nixpkgs/pkgs/desktops/lxqt/default.nix
new file mode 100644
index 000000000000..db21a72cb9b1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/default.nix
@@ -0,0 +1,109 @@
+{ pkgs, makeScope, libsForQt5 }:
+
+let
+  packages = self: with self; {
+
+    # For compiling information, see:
+    # - https://github.com/lxqt/lxqt/wiki/Building-from-source
+
+    ### BASE
+    libqtxdg = callPackage ./libqtxdg { };
+    lxqt-build-tools = callPackage ./lxqt-build-tools { };
+    libsysstat = callPackage ./libsysstat { };
+    liblxqt = callPackage ./liblxqt { };
+
+    ### CORE 1
+    libfm-qt = callPackage ./libfm-qt { };
+    lxqt-about = callPackage ./lxqt-about { };
+    lxqt-admin = callPackage ./lxqt-admin { };
+    lxqt-config = callPackage ./lxqt-config { };
+    lxqt-globalkeys = callPackage ./lxqt-globalkeys { };
+    lxqt-notificationd = callPackage ./lxqt-notificationd { };
+    lxqt-openssh-askpass = callPackage ./lxqt-openssh-askpass { };
+    lxqt-policykit = callPackage ./lxqt-policykit { };
+    lxqt-powermanagement = callPackage ./lxqt-powermanagement { };
+    lxqt-qtplugin = callPackage ./lxqt-qtplugin { };
+    lxqt-session = callPackage ./lxqt-session { };
+    lxqt-sudo = callPackage ./lxqt-sudo { };
+    lxqt-themes = callPackage ./lxqt-themes { };
+    pavucontrol-qt = libsForQt5.callPackage ./pavucontrol-qt { };
+    qtermwidget = callPackage ./qtermwidget { };
+
+    ### CORE 2
+    lxqt-panel = callPackage ./lxqt-panel { };
+    lxqt-runner = callPackage ./lxqt-runner { };
+    pcmanfm-qt = callPackage ./pcmanfm-qt { };
+
+    ### OPTIONAL
+    qterminal = callPackage ./qterminal { };
+    compton-conf = pkgs.qt5.callPackage ./compton-conf { };
+    obconf-qt = callPackage ./obconf-qt { };
+    lximage-qt = callPackage ./lximage-qt { };
+    qps = callPackage ./qps { };
+    screengrab = callPackage ./screengrab { };
+    qlipper = callPackage ./qlipper { };
+
+    preRequisitePackages = [
+      pkgs.gvfs # virtual file systems support for PCManFM-QT
+      pkgs.libsForQt5.kwindowsystem # provides some QT5 plugins needed by lxqt-panel
+      pkgs.libsForQt5.libkscreen # provides plugins for screen management software
+      pkgs.libfm
+      pkgs.libfm-extra
+      pkgs.lxmenu-data
+      pkgs.menu-cache
+      pkgs.openbox # default window manager
+      pkgs.qt5.qtsvg # provides QT5 plugins for svg icons
+    ];
+
+    corePackages = [
+      ### BASE
+      libqtxdg
+      libsysstat
+      liblxqt
+
+      ### CORE 1
+      libfm-qt
+      lxqt-about
+      lxqt-admin
+      lxqt-config
+      lxqt-globalkeys
+      lxqt-notificationd
+      lxqt-openssh-askpass
+      lxqt-policykit
+      lxqt-powermanagement
+      lxqt-qtplugin
+      lxqt-session
+      lxqt-sudo
+      lxqt-themes
+      pavucontrol-qt
+
+      ### CORE 2
+      lxqt-panel
+      lxqt-runner
+      pcmanfm-qt
+    ];
+
+    optionalPackages = [
+      ### LXQt project
+      qterminal
+      compton-conf
+      obconf-qt
+      lximage-qt
+
+      ### QtDesktop project
+      qps
+      screengrab
+
+      ### Qlipper
+      qlipper
+
+      ### Default icon theme
+      pkgs.oxygen-icons5
+
+      ### Screen saver
+      pkgs.xscreensaver
+    ];
+
+  };
+
+in makeScope libsForQt5.newScope packages
diff --git a/nixpkgs/pkgs/desktops/lxqt/libfm-qt/default.nix b/nixpkgs/pkgs/desktops/lxqt/libfm-qt/default.nix
new file mode 100644
index 000000000000..70675e1408cf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/libfm-qt/default.nix
@@ -0,0 +1,43 @@
+{
+  stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt-build-tools,
+  pcre, libexif, xorg, libfm, menu-cache,
+  qtx11extras, qttools
+}:
+
+stdenv.mkDerivation rec {
+  pname = "libfm-qt";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1siqqn4waglymfi7c7lrmlxkylddw8qz0qfwqxr1hnmx3dsj9c36";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    pcre
+    libexif
+    xorg.libpthreadstubs
+    xorg.libxcb
+    xorg.libXdmcp
+    qtx11extras
+    qttools
+    libfm
+    menu-cache
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Core library of PCManFM-Qt (Qt binding for libfm)";
+    homepage = https://github.com/lxqt/libfm-qt;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/liblxqt/default.nix b/nixpkgs/pkgs/desktops/lxqt/liblxqt/default.nix
new file mode 100644
index 000000000000..1b19275ece92
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/liblxqt/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtx11extras,
+  qttools, qtsvg, libqtxdg, polkit-qt, kwindowsystem, xorg }:
+
+stdenv.mkDerivation rec {
+  pname = "liblxqt";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1cpl6sd2fifpflahm8fvrrscrv03sinfm03m7yc1k59y6nsbwi36";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtx11extras
+    qttools
+    qtsvg
+    polkit-qt
+    kwindowsystem
+    libqtxdg
+    xorg.libXScrnSaver
+  ];
+
+  cmakeFlags = [
+    "-DLXQT_ETC_XDG_DIR=/run/current-system/sw/etc/xdg"
+  ];
+
+  postPatch = ''
+    sed -i 's|set(LXQT_SHARE_DIR .*)|set(LXQT_SHARE_DIR "/run/current-system/sw/share/lxqt")|' CMakeLists.txt
+    sed -i "s|\''${POLKITQT-1_POLICY_FILES_INSTALL_DIR}|''${out}/share/polkit-1/actions|" CMakeLists.txt
+    substituteInPlace CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Core utility library for all LXQt components";
+    homepage = https://github.com/lxqt/liblxqt;
+    license = licenses.lgpl21Plus;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/libqtxdg/default.nix b/nixpkgs/pkgs/desktops/lxqt/libqtxdg/default.nix
new file mode 100644
index 000000000000..852c4bddec83
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/libqtxdg/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchFromGitHub, cmake, qtbase, qtsvg }:
+
+stdenv.mkDerivation rec {
+  pname = "libqtxdg";
+  version = "3.3.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0qgqqgy15h0d1fwk4mnbv2hirz8njjjlng64bv33rc6wwrsaa50b";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ qtbase qtsvg ];
+
+  preConfigure = ''
+    cmakeFlagsArray+=(
+    "-DQTXDGX_ICONENGINEPLUGIN_INSTALL_PATH=$out/$qtPluginPrefix"
+    "-DCMAKE_INSTALL_INCLUDEDIR=include"
+    "-DCMAKE_INSTALL_LIBDIR=lib"
+    )
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Qt implementation of freedesktop.org xdg specs";
+    homepage = https://github.com/lxqt/libqtxdg;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/libsysstat/default.nix b/nixpkgs/pkgs/desktops/lxqt/libsysstat/default.nix
new file mode 100644
index 000000000000..74fa1b03fa6b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/libsysstat/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchFromGitHub, cmake, qtbase, lxqt-build-tools }:
+
+stdenv.mkDerivation rec {
+  pname = "libsysstat";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "10h9n7km7yx8bnmzxi4nn1yqq03hizjkrx4745j0mczy7niiffsz";
+  };
+
+  nativeBuildInputs = [ cmake lxqt-build-tools ];
+
+  buildInputs = [ qtbase ];
+
+  meta = with stdenv.lib; {
+    description = "Library used to query system info and statistics";
+    homepage = https://github.com/lxqt/libsysstat;
+    license = licenses.lgpl21Plus;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lximage-qt/default.nix b/nixpkgs/pkgs/desktops/lxqt/lximage-qt/default.nix
new file mode 100644
index 000000000000..a0a83ad3469a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lximage-qt/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, qtbase, qttools,
+  qtx11extras, qtsvg, xorg, lxqt-build-tools, libfm-qt, libexif }:
+
+stdenv.mkDerivation rec {
+  pname = "lximage-qt";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0zx9903ym5a9zk4m9khr22fj5sy57mg2v8wnk177wjm11lhic5v8";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    libfm-qt
+    xorg.libpthreadstubs
+    xorg.libXdmcp
+    libexif
+  ];
+
+  meta = with stdenv.lib; {
+    description = "The image viewer and screenshot tool for lxqt";
+    homepage = https://github.com/lxqt/lximage-qt;
+    license = licenses.gpl2;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-about/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-about/default.nix
new file mode 100644
index 000000000000..013be8eea4f9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-about/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtx11extras, qttools, qtsvg, kwindowsystem, liblxqt, libqtxdg }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-about";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "14b13v1r5ncz4ycg25ac9ppafiifc37qws8kcw078if72rp9n121";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtx11extras
+    qttools
+    qtsvg
+    kwindowsystem
+    liblxqt
+    libqtxdg
+  ];
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Dialogue window providing information about LXQt and the system it's running on";
+    homepage = https://github.com/lxqt/lxqt-about;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-admin/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-admin/default.nix
new file mode 100644
index 000000000000..528f9a390f92
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-admin/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtx11extras, qttools, qtsvg, kwindowsystem, liblxqt, libqtxdg, polkit-qt }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-admin";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0sdb514hgha5yvmbzi6nm1yx1rmbkh5fam09ybidjwpdwl2l4pxx";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtx11extras
+    qttools
+    qtsvg
+    kwindowsystem
+    liblxqt
+    libqtxdg
+    polkit-qt
+  ];
+
+  postPatch = ''
+    sed "s|\''${POLKITQT-1_POLICY_FILES_INSTALL_DIR}|''${out}/share/polkit-1/actions|" \
+      -i lxqt-admin-user/CMakeLists.txt
+
+    for f in lxqt-admin-{user,time}/CMakeLists.txt; do
+      substituteInPlace $f \
+        --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "LXQt system administration tool";
+    homepage = https://github.com/lxqt/lxqt-admin;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-build-tools/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-build-tools/default.nix
new file mode 100644
index 000000000000..f55fa579ff45
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-build-tools/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, pcre, qtbase, glib }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-build-tools";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0i7m9s4g5rsw28vclc9nh0zcapx85cqfwxkx7rrw7wa12svy7pm2";
+  };
+
+  nativeBuildInputs = [ cmake pkgconfig ];
+
+  buildInputs = [ qtbase glib pcre ];
+
+  preConfigure = ''cmakeFlags+=" -DLXQT_ETC_XDG_DIR=$out/etc/xdg"'';
+
+  meta = with stdenv.lib; {
+    description = "Various packaging tools and scripts for LXQt applications";
+    homepage = https://github.com/lxqt/lxqt-build-tools;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-config/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-config/default.nix
new file mode 100644
index 000000000000..d2c583b53fa9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-config/default.nix
@@ -0,0 +1,69 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt-build-tools, qtbase,
+  qtx11extras, qttools, qtsvg, kwindowsystem, libkscreen, liblxqt,
+  libqtxdg, xorg }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-config";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1pp2pw43zh8kwi2cxk909wn6bw7kba95b6bv96l2gmzhdqpfw2a7";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qtx11extras
+    qttools
+    qtsvg
+    kwindowsystem
+    libkscreen
+    liblxqt
+    libqtxdg
+    xorg.libpthreadstubs
+    xorg.libXdmcp
+    xorg.libXScrnSaver
+    xorg.libxcb
+    xorg.libXcursor
+    xorg.xf86inputlibinput
+    xorg.xf86inputlibinput.dev
+  ];
+
+  postPatch = ''
+    substituteInPlace src/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+
+    for f in \
+      lxqt-config-file-associations/CMakeLists.txt \
+      lxqt-config-brightness/CMakeLists.txt \
+      lxqt-config-appearance/CMakeLists.txt \
+      lxqt-config-locale/CMakeLists.txt \
+      lxqt-config-monitor/CMakeLists.txt \
+      lxqt-config-input/CMakeLists.txt \
+      liblxqt-config-cursor/CMakeLists.txt \
+      src/CMakeLists.txt
+    do
+      substituteInPlace $f \
+        --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+    done
+
+    sed -i "/\''${XORG_LIBINPUT_INCLUDE_DIRS}/a ${xorg.xf86inputlibinput.dev}/include/xorg" lxqt-config-input/CMakeLists.txt
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Tools to configure LXQt and the underlying operating system";
+    homepage = https://github.com/lxqt/lxqt-config;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-globalkeys/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-globalkeys/default.nix
new file mode 100644
index 000000000000..5382be304ae3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-globalkeys/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtbase, qttools, qtx11extras, qtsvg, kwindowsystem, liblxqt, libqtxdg }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-globalkeys";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "14bfkh54mn3jyq8g9ipy3xmc3n9lmlqpvm26kpqig7567hbncv7n";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    kwindowsystem
+    liblxqt
+    libqtxdg
+  ];
+
+  postPatch = ''
+    for dir in autostart xdg; do
+      substituteInPlace $dir/CMakeLists.txt \
+        --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+    done
+
+    substituteInPlace config/CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Daemon used to register global keyboard shortcuts";
+    homepage = https://github.com/lxqt/lxqt-globalkeys;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-notificationd/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-notificationd/default.nix
new file mode 100644
index 000000000000..53826f62bccf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-notificationd/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtbase, qttools, qtsvg, kwindowsystem, liblxqt, libqtxdg, qtx11extras }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-notificationd";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1nawcxy2qnrngcxvwjwmmh4fn7mhnfgy1g77rn90243jvy29wv5f";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  postPatch = ''
+    substituteInPlace autostart/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+
+    for f in {config,src}/CMakeLists.txt; do
+      substituteInPlace $f \
+        --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+    done
+  '';
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtsvg
+    kwindowsystem
+    liblxqt
+    libqtxdg
+    qtx11extras
+  ];
+
+  meta = with stdenv.lib; {
+    description = "The LXQt notification daemon";
+    homepage = https://github.com/lxqt/lxqt-notificationd;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-openssh-askpass/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-openssh-askpass/default.nix
new file mode 100644
index 000000000000..f880aed63f8a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-openssh-askpass/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtbase, qttools, qtsvg, qtx11extras, kwindowsystem, liblxqt, libqtxdg }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-openssh-askpass";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "19xcc6i7jg35780r4dfg4vwfp9x4pz5sqzagxnpzspz61jaj5ibv";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    kwindowsystem
+    liblxqt
+    libqtxdg
+  ];
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "GUI to query passwords on behalf of SSH agents";
+    homepage = https://github.com/lxqt/lxqt-openssh-askpass;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-panel/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-panel/default.nix
new file mode 100644
index 000000000000..f691357f25f6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-panel/default.nix
@@ -0,0 +1,73 @@
+{
+  stdenv, fetchFromGitHub,
+  cmake, pkgconfig, lxqt-build-tools,
+  qtbase, qttools, qtx11extras, qtsvg, libdbusmenu, kwindowsystem, solid,
+  kguiaddons, liblxqt, libqtxdg, lxqt-globalkeys, libsysstat,
+  xorg, libstatgrab, lm_sensors, libpulseaudio, alsaLib, menu-cache,
+  lxmenu-data, pcre, libXdamage
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-panel";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0jr7ylf6d35m0ckn884arjk4armknnw8iyph00gcphn5bqycbn8l";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    libdbusmenu
+    kwindowsystem
+    solid
+    kguiaddons
+    liblxqt
+    libqtxdg
+    lxqt-globalkeys
+    libsysstat
+    xorg.libpthreadstubs
+    xorg.libXdmcp
+    libstatgrab
+    lm_sensors
+    libpulseaudio
+    alsaLib
+    menu-cache
+    lxmenu-data
+    pcre
+    libXdamage
+  ];
+
+  postPatch = ''
+    for dir in  autostart menu; do
+      substituteInPlace $dir/CMakeLists.txt \
+        --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+    done
+    substituteInPlace panel/CMakeLists.txt \
+      --replace "DESTINATION \''${LXQT_ETC_XDG_DIR}" "DESTINATION etc/xdg"
+
+    for f in cmake/BuildPlugin.cmake panel/CMakeLists.txt; do
+      substituteInPlace $f \
+        --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "The LXQt desktop panel";
+    homepage = https://github.com/lxqt/lxqt-panel;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-policykit/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-policykit/default.nix
new file mode 100644
index 000000000000..862e0c08cedf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-policykit/default.nix
@@ -0,0 +1,51 @@
+{
+  stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt-build-tools,
+  qtbase, qttools, qtx11extras, qtsvg, polkit-qt, kwindowsystem, liblxqt,
+  libqtxdg, pcre
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-policykit";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "05k39819nsdyg2pp1vk6g2hdpxqp78h6bhb0hp5rclf9ap5fpvvc";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    polkit-qt
+    kwindowsystem
+    liblxqt
+    libqtxdg
+    pcre
+  ];
+
+  postPatch = ''
+    substituteInPlace autostart/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+
+    substituteInPlace CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "The LXQt PolicyKit agent";
+    homepage = https://github.com/lxqt/lxqt-policykit;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-powermanagement/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-powermanagement/default.nix
new file mode 100644
index 000000000000..9ebff5d4de58
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-powermanagement/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtbase, qttools, qtx11extras, qtsvg, kwindowsystem, solid, kidletime, liblxqt, libqtxdg }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-powermanagement";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "08xdnb54lji09izzzfip8fw0gp17qkx66jm6i04zby4whx4mqniv";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    kwindowsystem
+    solid
+    kidletime
+    liblxqt
+    libqtxdg
+  ];
+
+  postPatch = ''
+    substituteInPlace autostart/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+
+    for f in {config,src}/CMakeLists.txt; do
+      substituteInPlace $f \
+        --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Power management module for LXQt";
+    homepage = https://github.com/lxqt/lxqt-powermanagement;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-qtplugin/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-qtplugin/default.nix
new file mode 100644
index 000000000000..82f393cf8d52
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-qtplugin/default.nix
@@ -0,0 +1,45 @@
+{
+  stdenv, fetchFromGitHub,
+  cmake, lxqt-build-tools,
+  qtbase, qtx11extras, qttools, qtsvg, libdbusmenu, libqtxdg, libfm-qt
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-qtplugin";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "16n50lxnya03zcviw65sy5dyg9dsrn64k91mrqfvraf6d90md4al";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qtx11extras
+    qttools
+    qtsvg
+    libdbusmenu
+    libqtxdg
+    libfm-qt
+  ];
+
+  postPatch = ''
+    substituteInPlace src/CMakeLists.txt \
+      --replace "DESTINATION \"\''${QT_PLUGINS_DIR}" "DESTINATION \"$qtPluginPrefix"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "LXQt Qt platform integration plugin";
+    homepage = https://github.com/lxqt/lxqt-qtplugin;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-runner/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-runner/default.nix
new file mode 100644
index 000000000000..dc2d8c58cafe
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-runner/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt-build-tools, qtbase, qttools, qtsvg, kwindowsystem, liblxqt, libqtxdg, lxqt-globalkeys, qtx11extras,
+menu-cache, muparser, pcre }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-runner";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1qyacig9ksnjrhws8cpk6arlaxn7kl0z39l3c62ql3m89mibsm88";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtsvg
+    qtx11extras
+    kwindowsystem
+    liblxqt
+    libqtxdg
+    lxqt-globalkeys
+    menu-cache
+    muparser
+    pcre
+  ];
+
+  postPatch = ''
+    substituteInPlace autostart/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+
+    substituteInPlace CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Tool used to launch programs quickly by typing their names";
+    homepage = https://github.com/lxqt/lxqt-runner;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-session/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-session/default.nix
new file mode 100644
index 000000000000..5b4d7b606c75
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-session/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt-build-tools, qtbase, qttools, qtsvg, qtx11extras, kwindowsystem, liblxqt, libqtxdg, xorg, xdg-user-dirs }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-session";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0nla1ki23p1bwzw5hbmh9l8yg3b0f55kflgnvyfakmvpivjbz3k6";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtsvg
+    qtx11extras
+    kwindowsystem
+    liblxqt
+    libqtxdg
+    xorg.libpthreadstubs
+    xorg.libXdmcp
+    xdg-user-dirs
+  ];
+
+  postPatch = ''
+    for dir in autostart config; do
+      substituteInPlace $dir/CMakeLists.txt \
+        --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+    done
+
+    for f in lxqt-{config-session,leave,session}/CMakeLists.txt; do
+      substituteInPlace $f \
+        --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "An alternative session manager ported from the original razor-session";
+    homepage = https://github.com/lxqt/lxqt-session;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-sudo/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-sudo/default.nix
new file mode 100644
index 000000000000..7e3ca84109fd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-sudo/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtbase, qttools, qtx11extras, qtsvg, kwindowsystem, liblxqt, libqtxdg, sudo }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-sudo";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0l8fq06kfsrmvg2fr8lqdsxr6fwxmxsa9zwaa3fs9inzaylm0jkh";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    kwindowsystem
+    liblxqt
+    libqtxdg
+    sudo
+  ];
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace "\''${LXQT_TRANSLATIONS_DIR}" "''${out}/share/lxqt/translations"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "GUI frontend for sudo/su";
+    homepage = https://github.com/lxqt/lxqt-sudo;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/lxqt-themes/default.nix b/nixpkgs/pkgs/desktops/lxqt/lxqt-themes/default.nix
new file mode 100644
index 000000000000..02591b9eb86e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/lxqt-themes/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools }:
+
+stdenv.mkDerivation rec {
+  pname = "lxqt-themes";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "09dkcgnf3lmfly8v90p6wjlj5rin83pbailvvpx2jr8a48a8zb9f";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_GRAPHICS_DIR}" "DESTINATION \"share/lxqt/graphics"
+    substituteInPlace themes/CMakeLists.txt \
+      --replace "DESTINATION \"\''${LXQT_SHARE_DIR}" "DESTINATION \"share/lxqt"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Themes, graphics and icons for LXQt";
+    homepage = https://github.com/lxqt/lxqt-themes;
+    license = licenses.lgpl21;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/obconf-qt/default.nix b/nixpkgs/pkgs/desktops/lxqt/obconf-qt/default.nix
new file mode 100644
index 000000000000..a0d0a973ad7e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/obconf-qt/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, pcre, qtbase, qttools,
+  qtx11extras, xorg, lxqt-build-tools, openbox, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  pname = "obconf-qt";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "00v5w8qr3vs0k91flij9lz7y1cpp2g8ivgnmmm43ymjfiz5j6l27";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    pcre
+    qtbase
+    qttools
+    qtx11extras
+    xorg.libpthreadstubs
+    xorg.libXdmcp
+    xorg.libSM
+    openbox
+    hicolor-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    description = "The Qt port of obconf, the Openbox configuration tool";
+    homepage = https://github.com/lxqt/obconf-qt;
+    license = licenses.gpl2;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/pavucontrol-qt/default.nix b/nixpkgs/pkgs/desktops/lxqt/pavucontrol-qt/default.nix
new file mode 100644
index 000000000000..dcc3ead31bfd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/pavucontrol-qt/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt, libpulseaudio,
+  pcre, qtbase, qttools, qtx11extras }:
+
+stdenv.mkDerivation rec {
+  pname = "pavucontrol-qt";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1vyjm6phgbxglk65c889bd73b0p2ffb5bsc89dmb07qzllyrjb4h";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt.lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    libpulseaudio
+    pcre
+  ];
+
+  meta = with stdenv.lib; {
+    description = "A Pulseaudio mixer in Qt (port of pavucontrol)";
+    homepage = https://github.com/lxqt/pavucontrol-qt;
+    license = licenses.gpl2;
+    platforms = with platforms; linux;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/pcmanfm-qt/default.nix b/nixpkgs/pkgs/desktops/lxqt/pcmanfm-qt/default.nix
new file mode 100644
index 000000000000..aa7479b02f83
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/pcmanfm-qt/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, lxqt, qtbase, qttools,
+  qtx11extras, libfm-qt, menu-cache, lxmenu-data }:
+
+stdenv.mkDerivation rec {
+  pname = "pcmanfm-qt";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0hf4qyn12mpr6rrla9mf6ka5gb4y36amk7d14ayr7yka1r16p8lz";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    lxqt.lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    libfm-qt
+    libfm-qt
+    menu-cache
+    lxmenu-data
+  ];
+
+  postPatch = ''
+    for dir in autostart config; do
+      substituteInPlace $dir/CMakeLists.txt \
+        --replace "DESTINATION \"\''${LXQT_ETC_XDG_DIR}" "DESTINATION \"etc/xdg"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "File manager and desktop icon manager (Qt port of PCManFM and libfm)";
+    homepage = https://github.com/lxqt/pcmanfm-qt;
+    license = licenses.gpl2;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/qlipper/default.nix b/nixpkgs/pkgs/desktops/lxqt/qlipper/default.nix
new file mode 100644
index 000000000000..f5bdcf064fd8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/qlipper/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, cmake, qtbase, qttools }:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname = "qlipper";
+  version = "5.1.1";
+
+  src = fetchFromGitHub {
+    owner = "pvanek";
+    repo = pname;
+    rev = version;
+    sha256 = "0vlm4ab9isi7i2bimnyrk6083j2dfdrs14qj59vjcjri7mcwmf76";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ qtbase qttools ];
+
+  meta = with stdenv.lib; {
+    description = "Cross-platform clipboard history applet";
+    homepage = https://github.com/pvanek/qlipper;
+    license = licenses.gpl2Plus;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/qps/default.nix b/nixpkgs/pkgs/desktops/lxqt/qps/default.nix
new file mode 100644
index 000000000000..d46b7e14e33b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/qps/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchFromGitHub, cmake, qtbase, qtx11extras, qttools,
+  lxqt-build-tools }:
+
+stdenv.mkDerivation rec {
+  pname = "qps";
+  version = "1.10.19";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1vyi1vw4z5j2sp9yhhv91wl2sbg4fh0djqslg1ssc7fww2ka6dx3";
+  };
+
+  nativeBuildInputs = [ cmake lxqt-build-tools ];
+
+  buildInputs = [ qtbase qtx11extras qttools ];
+
+  meta = with stdenv.lib; {
+    description = "The Qt process manager";
+    homepage = https://github.com/lxqt/qps;
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ romildo ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/qterminal/default.nix b/nixpkgs/pkgs/desktops/lxqt/qterminal/default.nix
new file mode 100644
index 000000000000..f9a2e5ff0a14
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/qterminal/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchFromGitHub, cmake, lxqt-build-tools, qtermwidget,
+  qtbase, qttools, qtx11extras }:
+
+stdenv.mkDerivation rec {
+  pname = "qterminal";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "071qz248j9gcqzchnrz8xamm07g4r2xyrmnb0a2vjkjd63pk2r8f";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    lxqt-build-tools
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtermwidget
+  ];
+
+  meta = with stdenv.lib; {
+    description = "A lightweight Qt-based terminal emulator";
+    homepage = https://github.com/lxqt/qterminal;
+    license = licenses.gpl2;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/qtermwidget/default.nix b/nixpkgs/pkgs/desktops/lxqt/qtermwidget/default.nix
new file mode 100644
index 000000000000..9e0798ecb52a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/qtermwidget/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchFromGitHub, cmake, qtbase, qttools, lxqt-build-tools }:
+
+stdenv.mkDerivation rec {
+  pname = "qtermwidget";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "0wv8fssbc2w7kkpq9ngsa8wyjraggdhsbz36gyxyv8fy5m78jq0n";
+  };
+
+  nativeBuildInputs = [ cmake lxqt-build-tools ];
+
+  buildInputs = [ qtbase qttools];
+
+  meta = with stdenv.lib; {
+    description = "A terminal emulator widget for Qt 5";
+    homepage = https://github.com/lxqt/qtermwidget;
+    license = licenses.gpl2;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/screengrab/default.nix b/nixpkgs/pkgs/desktops/lxqt/screengrab/default.nix
new file mode 100644
index 000000000000..cc7f113b7d19
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/screengrab/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, qtbase, qttools, qtx11extras, qtsvg, kwindowsystem, libqtxdg, xorg, autoPatchelfHook }:
+
+stdenv.mkDerivation rec {
+  pname = "screengrab";
+  version = "1.100";
+
+  src = fetchFromGitHub {
+    owner = "lxqt";
+    repo = pname;
+    rev = version;
+    sha256 = "1iqrmf581x9ab6zzjxm2509gg6fkn7hwril4v0aki7n7dgxw1c4g";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkgconfig
+    autoPatchelfHook # fix libuploader.so and libextedit.so not found
+  ];
+
+  buildInputs = [
+    qtbase
+    qttools
+    qtx11extras
+    qtsvg
+    kwindowsystem
+    libqtxdg
+    xorg.libpthreadstubs
+    xorg.libXdmcp
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Crossplatform tool for fast making screenshots";
+    homepage = https://github.com/lxqt/screengrab;
+    license = licenses.gpl2;
+    platforms = with platforms; unix;
+    maintainers = with maintainers; [ romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/lxqt/update.sh b/nixpkgs/pkgs/desktops/lxqt/update.sh
new file mode 100755
index 000000000000..f3dfc4d59758
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/lxqt/update.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p libarchive curl common-updater-scripts
+
+set -eu -o pipefail
+
+cd "$(dirname "${BASH_SOURCE[0]}")"
+root=../../..
+export NIXPKGS_ALLOW_UNFREE=1
+
+lxqt_version=0.14.0
+lxqtrepo=https://downloads.lxqt.org/${lxqt_version}.html
+
+version() {
+    (cd "$root" && nix-instantiate --eval --strict -A "$1.version" 2>/dev/null | tr -d '"')
+}
+
+update_lxqt() {
+    local pname
+    local pversion
+    curl -sS ${lxqtrepo} | sed -rne 's|.*<a href=.*>(.+) (.+)</a><br>|\1 \2|p' |
+        while read pname pversion; do
+            local pversionold=$(version lxqt.$pname)
+            if [[ "$pversion" = "$pversionold" ]]; then
+                echo "nothing to do, $pname $pversion is current"
+            else
+                echo "$pname: $pversionold -> $pversion"
+                (cd "$root"
+                 local pfile=$(EDITOR=echo nix edit -f. lxqt.$pname 2>/dev/null)
+                 update-source-version lxqt.$pname "$pversion"
+                 git add $pfile
+                 git commit -m "lxqt.$pname: $pversionold -> $pversion"
+                )
+            fi
+            echo
+        done
+    echo DONE
+}
+
+update_lxqt
diff --git a/nixpkgs/pkgs/desktops/mate/atril/default.nix b/nixpkgs/pkgs/desktops/mate/atril/default.nix
new file mode 100644
index 000000000000..57f721f49a28
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/atril/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, glib, libxml2, libsecret, poppler, itstool, hicolor-icon-theme, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "atril-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "https://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "00vrqyfk370fdhlfv3m6n0l6hnx30hrsrcg1xja03957cgvcvnvr";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    glib
+    itstool
+    libsecret
+    libxml2
+    poppler
+    mate.caja
+    mate.mate-desktop
+    hicolor-icon-theme
+  ];
+
+  NIX_CFLAGS_COMPILE = "-I${glib.dev}/include/gio-unix-2.0";
+
+  makeFlags = [ "cajaextensiondir=$$out/lib/caja/extensions-2.0" ];
+
+  meta = {
+    description = "A simple multi-page document viewer for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/caja-dropbox/default.nix b/nixpkgs/pkgs/desktops/mate/caja-dropbox/default.nix
new file mode 100644
index 000000000000..f84fe2fef2eb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/caja-dropbox/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchurl, pkgconfig, gtk3, mate, pythonPackages }:
+
+stdenv.mkDerivation rec {
+  name = "caja-dropbox-${version}";
+  version = "1.20.0";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0xjqcfi5n6hsfyw77blplkn30as0slkfzngxid1n6z7jz5yjq7vj";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+  ];
+
+  buildInputs = [
+    gtk3
+    mate.caja
+    pythonPackages.python
+    pythonPackages.pygtk
+    pythonPackages.docutils
+  ];
+
+  configureFlags = [ "--with-caja-extension-dir=$$out/lib/caja/extensions-2.0" ];
+
+  meta = with stdenv.lib; {
+    description = "Dropbox extension for Caja file manager";
+    homepage = https://github.com/mate-desktop/caja-dropbox;
+    license = with licenses; [ gpl3 cc-by-nd-30 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/caja-extensions/default.nix b/nixpkgs/pkgs/desktops/mate/caja-extensions/default.nix
new file mode 100644
index 000000000000..64ef0cb57f27
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/caja-extensions/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, dbus-glib, gupnp, mate, imagemagick, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "caja-extensions-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "14w1xd33ggn6wdzqvcmj8rqc68w4k094lai6mqrgmv1zljifydqz";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    dbus-glib
+    gupnp
+    mate.caja
+    mate.mate-desktop
+    imagemagick
+  ];
+
+  postPatch = ''
+    for f in image-converter/caja-image-{resizer,rotator}.c; do
+      substituteInPlace $f --replace "/usr/bin/convert" "${imagemagick}/bin/convert"
+    done
+  '';
+  
+  configureFlags = [ "--with-cajadir=$$out/lib/caja/extensions-2.0" ];
+
+  meta = with stdenv.lib; {
+    description = "Set of extensions for Caja file manager";
+    homepage = http://mate-desktop.org;
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/caja/caja-extension-dirs.patch b/nixpkgs/pkgs/desktops/mate/caja/caja-extension-dirs.patch
new file mode 100644
index 000000000000..7490a368efd9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/caja/caja-extension-dirs.patch
@@ -0,0 +1,30 @@
+diff --git a/libcaja-private/caja-module.c b/libcaja-private/caja-module.c
+index 023c22e..414913b 100644
+--- a/libcaja-private/caja-module.c
++++ b/libcaja-private/caja-module.c
+@@ -258,11 +258,25 @@ caja_module_setup (void)
+ {
+     static gboolean initialized = FALSE;
+     GList *res;
++    gchar *caja_extension_dirs;
++    gchar **dir_vector;
+ 
+     if (!initialized)
+     {
+         initialized = TRUE;
+ 
++        caja_extension_dirs = (gchar *) g_getenv ("CAJA_EXTENSION_DIRS");
++
++        if (caja_extension_dirs)
++        {
++            dir_vector = g_strsplit (caja_extension_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
++
++            for (gchar **dir = dir_vector; *dir != NULL; ++ dir)
++                load_module_dir (*dir);
++
++            g_strfreev(dir_vector);
++        }
++
+         load_module_dir (CAJA_EXTENSIONDIR);
+ 
+         eel_debug_call_at_shutdown (free_module_objects);
diff --git a/nixpkgs/pkgs/desktops/mate/caja/default.nix b/nixpkgs/pkgs/desktops/mate/caja/default.nix
new file mode 100644
index 000000000000..130d44d6a1a1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/caja/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, libnotify, libxml2, libexif, exempi, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "caja-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "1wlrhcvhqving3pphbz50xnbp7z57mlkf7m36lfh8mim62kfmmd0";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libnotify
+    libxml2
+    libexif
+    exempi
+    mate.mate-desktop
+    hicolor-icon-theme
+  ];
+
+  patches = [
+    ./caja-extension-dirs.patch
+  ];
+  
+  configureFlags = [ "--disable-update-mimedb" ];
+  
+  meta = {
+    description = "File manager for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = with stdenv.lib.licenses; [ gpl2 lgpl2 ];
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/default.nix b/nixpkgs/pkgs/desktops/mate/default.nix
new file mode 100644
index 000000000000..7441a8f73ae7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/default.nix
@@ -0,0 +1,96 @@
+{ pkgs, newScope }:
+
+let
+  callPackage = newScope self;
+
+  self = rec {
+
+    getRelease = version:
+      pkgs.stdenv.lib.concatStringsSep "." (pkgs.stdenv.lib.take 2 (pkgs.stdenv.lib.splitString "." version));
+  
+    atril = callPackage ./atril { };
+    caja = callPackage ./caja { };
+    caja-dropbox = callPackage ./caja-dropbox { };
+    caja-extensions = callPackage ./caja-extensions { };
+    engrampa = callPackage ./engrampa { };
+    eom = callPackage ./eom { };
+    libmatekbd = callPackage ./libmatekbd { };
+    libmatemixer = callPackage ./libmatemixer { };
+    libmateweather = callPackage ./libmateweather { };
+    marco = callPackage ./marco { };
+    mate-applets = callPackage ./mate-applets { };
+    mate-backgrounds = callPackage ./mate-backgrounds { };
+    mate-calc = callPackage ./mate-calc { };
+    mate-common = callPackage ./mate-common { };
+    mate-control-center = callPackage ./mate-control-center { };
+    mate-desktop = callPackage ./mate-desktop { };
+    mate-icon-theme = callPackage ./mate-icon-theme { };
+    mate-icon-theme-faenza = callPackage ./mate-icon-theme-faenza { };
+    mate-indicator-applet = callPackage ./mate-indicator-applet { };
+    mate-media = callPackage ./mate-media { };
+    mate-menus = callPackage ./mate-menus { };
+    mate-netbook = callPackage ./mate-netbook { };
+    mate-notification-daemon = callPackage ./mate-notification-daemon { };
+    mate-panel = callPackage ./mate-panel { };
+    mate-polkit = callPackage ./mate-polkit { };
+    mate-power-manager = callPackage ./mate-power-manager { };
+    mate-sensors-applet = callPackage ./mate-sensors-applet { };
+    mate-session-manager = callPackage ./mate-session-manager { };
+    mate-settings-daemon = callPackage ./mate-settings-daemon { };
+    mate-screensaver = callPackage ./mate-screensaver { };
+    mate-system-monitor = callPackage ./mate-system-monitor { };
+    mate-terminal = callPackage ./mate-terminal { };
+    mate-themes = callPackage ./mate-themes { };
+    mate-user-guide = callPackage ./mate-user-guide { };
+    mate-user-share = callPackage ./mate-user-share { };
+    mate-utils = callPackage ./mate-utils { };
+    mozo = callPackage ./mozo { };
+    pluma = callPackage ./pluma { };
+    python-caja = callPackage ./python-caja { };
+
+    basePackages = [
+      caja
+      libmatekbd
+      libmatemixer
+      libmateweather
+      marco
+      mate-common
+      mate-control-center
+      mate-desktop
+      mate-icon-theme
+      mate-menus
+      mate-notification-daemon
+      mate-panel
+      mate-polkit
+      mate-session-manager
+      mate-settings-daemon
+      mate-themes
+    ];
+
+    extraPackages = [
+      atril
+      caja-extensions
+      engrampa
+      eom
+      mate-applets
+      mate-backgrounds
+      mate-calc
+      mate-icon-theme-faenza
+      mate-indicator-applet
+      mate-media
+      mate-netbook
+      mate-power-manager
+      mate-screensaver
+      mate-sensors-applet
+      mate-system-monitor
+      mate-terminal
+      mate-user-guide
+      # mate-user-share
+      mate-utils
+      mozo
+      pluma
+    ];
+  
+  };
+
+in self
diff --git a/nixpkgs/pkgs/desktops/mate/engrampa/default.nix b/nixpkgs/pkgs/desktops/mate/engrampa/default.nix
new file mode 100644
index 000000000000..1989ac8e12cc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/engrampa/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, libxml2, gnome3, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "engrampa-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0fj957dfagw6p7mq5545h9j2w3hv18yqnkpypnr719r4g13d3f2v";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    libxml2
+    gnome3.gtk
+    mate.caja
+    hicolor-icon-theme
+    mate.mate-desktop
+  ];
+
+  configureFlags = [ "--with-cajadir=$$out/lib/caja/extensions-2.0" ];
+
+  meta = {
+    description = "Archive Manager for MATE";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/eom/default.nix b/nixpkgs/pkgs/desktops/mate/eom/default.nix
new file mode 100644
index 000000000000..3b830f73c76a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/eom/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, dbus-glib, exempi, lcms2, libexif, libjpeg, librsvg, libxml2, shared-mime-info, gnome3, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "eom-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0440sfbidizn860w5avgwld08qc2fslrm0nx2659651cf3r7rw05";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    dbus-glib
+    exempi
+    lcms2
+    libexif
+    libjpeg
+    librsvg
+    libxml2
+    shared-mime-info
+    gnome3.gtk
+    gnome3.libpeas
+    mate.mate-desktop
+    hicolor-icon-theme
+  ];
+
+  meta = {
+    description = "An image viewing and cataloging program for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/libmatekbd/default.nix b/nixpkgs/pkgs/desktops/mate/libmatekbd/default.nix
new file mode 100644
index 000000000000..15b81a628863
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/libmatekbd/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, mate, libxklavier }:
+
+stdenv.mkDerivation rec {
+  name = "libmatekbd-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "1l1zbphs4snswf4bkrwkk6gsmb44bdhymcfgaaspzbrcmw3y7hr1";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ gtk3 libxklavier ];
+
+  meta = with stdenv.lib; {
+    description = "Keyboard management library for MATE";
+    homepage = https://github.com/mate-desktop/libmatekbd;
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/libmatemixer/default.nix b/nixpkgs/pkgs/desktops/mate/libmatemixer/default.nix
new file mode 100644
index 000000000000..8bf0d9bec18c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/libmatemixer/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, mate
+, alsaSupport ? stdenv.isLinux, alsaLib
+, pulseaudioSupport ? stdenv.config.pulseaudio or true, libpulseaudio
+, ossSupport ? false
+ }:
+
+stdenv.mkDerivation rec {
+  name = "libmatemixer-${version}";
+  version = "1.20.1";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "00p67mi0flsbgn15qpwq60rzf917s5islbmhirbvz6npcvv0d493";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ glib ]
+    ++ stdenv.lib.optional alsaSupport alsaLib
+    ++ stdenv.lib.optional pulseaudioSupport libpulseaudio;
+
+  configureFlags = stdenv.lib.optional ossSupport "--enable-oss";
+
+  meta = with stdenv.lib; {
+    description = "Mixer library for MATE";
+    homepage = https://github.com/mate-desktop/libmatemixer;
+    license = with licenses; [ gpl2 lgpl2 ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/libmateweather/default.nix b/nixpkgs/pkgs/desktops/mate/libmateweather/default.nix
new file mode 100644
index 000000000000..9805b8d91b5a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/libmateweather/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, libsoup, tzdata, mate }:
+
+stdenv.mkDerivation rec {
+  name = "libmateweather-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "1ksp1xn13m94sjnnrx2dyv7hlbgjbnbahwdyaq35r2419b366hxv";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ gtk3 libsoup tzdata ];
+
+  configureFlags = [
+    "--with-zoneinfo-dir=${tzdata}/share/zoneinfo"
+    "--enable-locations-compression"
+  ];
+
+  preFixup = "rm -f $out/share/icons/mate/icon-theme.cache";
+
+  meta = with stdenv.lib; {
+    description = "Library to access weather information from online services for MATE";
+    homepage = https://github.com/mate-desktop/libmateweather;
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/marco/default.nix b/nixpkgs/pkgs/desktops/mate/marco/default.nix
new file mode 100644
index 000000000000..975c80b1d0cf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/marco/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, libxml2, libcanberra-gtk3, libgtop, gnome2, gnome3, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "marco-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "192nlr4ylisxisk0ljabm8v0a5sapdncj4gbw39q2fpr938ifs32";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    libxml2
+    libcanberra-gtk3
+    libgtop
+    gnome2.startup_notification
+    gnome3.gtk
+    gnome3.zenity
+  ];
+  
+  meta = with stdenv.lib; {
+    description = "MATE default window manager";
+    homepage = https://github.com/mate-desktop/marco;
+    license = [ licenses.gpl2 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-applets/default.nix b/nixpkgs/pkgs/desktops/mate/mate-applets/default.nix
new file mode 100644
index 000000000000..f9f0689fa65f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-applets/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, gnome3, libwnck3, libgtop, libxml2, libnotify, polkit, upower, wirelesstools, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-applets-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0y5501wliipxf43p2q9917r3ird7azlrbcwnj2q2q2zy00hvvk5f";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gnome3.gtk
+    gnome3.gtksourceview
+    gnome3.gucharmap
+    libwnck3
+    libgtop
+    libxml2
+    libnotify
+    polkit
+    upower
+    wirelesstools
+    mate.libmateweather
+    mate.mate-panel
+    hicolor-icon-theme
+  ];
+
+  configureFlags = [ "--enable-suid=no" ];
+  
+  NIX_CFLAGS_COMPILE = "-I${gnome3.glib.dev}/include/gio-unix-2.0";
+
+  meta = with stdenv.lib; {
+    description = "Applets for use with the MATE panel";
+    homepage = http://mate-desktop.org;
+    license = with licenses; [ gpl2Plus lgpl2Plus ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-backgrounds/default.nix b/nixpkgs/pkgs/desktops/mate/mate-backgrounds/default.nix
new file mode 100644
index 000000000000..79a322ccb0a5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-backgrounds/default.nix
@@ -0,0 +1,21 @@
+{ stdenv, fetchurl, intltool, mate }:
+
+stdenv.mkDerivation rec {
+  name = "mate-backgrounds-${version}";
+  version = "1.20.0";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0pcnjcw00y8hf2bwfrb5sbk2511cbg4fr8vgvgqswcwjp9y15cjp";
+  };
+
+  nativeBuildInputs = [ intltool ];
+
+  meta = with stdenv.lib; {
+    description = "Background images and data for MATE";
+    homepage = http://mate-desktop.org;
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-calc/default.nix b/nixpkgs/pkgs/desktops/mate/mate-calc/default.nix
new file mode 100644
index 000000000000..d45563db8a1c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-calc/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, gtk3, libxml2, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-calc-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0nv0q2c93rv36dhid7vf0w0rb6zdwyqaibfsmc7flj00qgsn3r5a";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libxml2
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Calculator for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = [ licenses.gpl2Plus ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-common/default.nix b/nixpkgs/pkgs/desktops/mate/mate-common/default.nix
new file mode 100644
index 000000000000..63adb1849dac
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-common/default.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl, mate }:
+
+stdenv.mkDerivation rec {
+  name = "mate-common-${version}";
+  version = "1.20.0";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0h8s2qhc6f5flslx05cd3xxg243c67vv03spjiag14p8kqqrqvb1";
+  };
+
+  meta = {
+    description = "Common files for development of MATE packages";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.gpl3;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-control-center/default.nix b/nixpkgs/pkgs/desktops/mate/mate-control-center/default.nix
new file mode 100644
index 000000000000..8697a150881b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-control-center/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, libxml2, dbus-glib,
+  libxklavier, libcanberra-gtk3, librsvg, libappindicator-gtk3,
+  desktop-file-utils, gnome3, mate, hicolor-icon-theme, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  name = "mate-control-center-${version}";
+  version = "1.20.4";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "1rjxndikj0w516nlvyzcss31l9qjwkzvns7ygasnjbl02bgml9a4";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    desktop-file-utils
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    libxml2
+    dbus-glib
+    libxklavier
+    libcanberra-gtk3
+    librsvg
+    libappindicator-gtk3
+    gnome3.gtk
+    gnome3.dconf
+    hicolor-icon-theme
+    mate.mate-desktop
+    mate.libmatekbd
+    mate.mate-menus
+    mate.marco
+    mate.mate-settings-daemon
+  ];
+
+  configureFlags = [ "--disable-update-mimedb" ];
+
+  meta = with stdenv.lib; {
+    description = "Utilities to configure the MATE desktop";
+    homepage = https://github.com/mate-desktop/mate-control-center;
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-desktop/default.nix b/nixpkgs/pkgs/desktops/mate/mate-desktop/default.nix
new file mode 100644
index 000000000000..e6a43e6b457d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-desktop/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gnome3, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-desktop-${version}";
+  version = "1.20.4";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "073hn68f57ahif0znbx850x6ncsq50m7jg0sy1mllxjjqf3b1fxr";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gnome3.dconf
+    gnome3.gtk
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Library with common API for various MATE modules";
+    homepage = http://mate-desktop.org;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-icon-theme-faenza/default.nix b/nixpkgs/pkgs/desktops/mate/mate-icon-theme-faenza/default.nix
new file mode 100644
index 000000000000..03f8c62c448d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-icon-theme-faenza/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, autoreconfHook, gtk3, mate, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "mate-icon-theme-faenza-${version}";
+  version = "1.20.0";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "000vr9cnbl2qlysf2gyg1lsjirqdzmwrnh6d3hyrsfc0r2vh4wna";
+  };
+
+  nativeBuildInputs = [ autoreconfHook gtk3 ];
+
+  buildInputs = [ mate.mate-icon-theme hicolor-icon-theme ];
+
+  postInstall = ''
+    for theme in "$out"/share/icons/*; do
+      gtk-update-icon-cache "$theme"
+    done
+  '';
+
+  meta = {
+    description = "Faenza icon theme from MATE";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-icon-theme/default.nix b/nixpkgs/pkgs/desktops/mate/mate-icon-theme/default.nix
new file mode 100644
index 000000000000..9d813e715ffd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-icon-theme/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, intltool, iconnamingutils, librsvg, hicolor-icon-theme, gtk3, mate }:
+
+stdenv.mkDerivation rec {
+  name = "mate-icon-theme-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "10l58mjc2a69pm7srxvlav2b8b7nbzyvwjrlrk79a3gr6dd1mbk4";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool iconnamingutils ];
+
+  buildInputs = [ librsvg hicolor-icon-theme ];
+
+  postInstall = ''
+    for theme in "$out"/share/icons/*; do
+      "${gtk3.out}/bin/gtk-update-icon-cache" "$theme"
+    done
+  '';
+
+  meta = {
+    description = "Icon themes from MATE";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.lgpl3;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-indicator-applet/default.nix b/nixpkgs/pkgs/desktops/mate/mate-indicator-applet/default.nix
new file mode 100644
index 000000000000..c099d070221e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-indicator-applet/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, libindicator-gtk3, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-indicator-applet-${version}";
+  version = "1.20.1";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0gxis834w8h33xmrx335jjad2xaqpkamirl0x4j7wsk4zs25jkyd";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libindicator-gtk3
+    mate.mate-panel
+    hicolor-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/mate-desktop/mate-indicator-applet;
+    description = "MATE panel indicator applet";
+    longDescription = ''
+      A small applet to display information from various applications
+      consistently in the panel.
+       
+      The indicator applet exposes Ayatana Indicators in the MATE Panel.
+      Ayatana Indicators are an initiative by Canonical to provide crisp and
+      clean system and application status indication. They take the form of
+      an icon and associated menu, displayed (usually) in the desktop panel.
+      Existing indicators include the Message Menu, Battery Menu and Sound
+      menu.
+    '';
+    license = with licenses; [ gpl3Plus lgpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-media/default.nix b/nixpkgs/pkgs/desktops/mate/mate-media/default.nix
new file mode 100644
index 000000000000..643f67cd1e95
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-media/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libtool, libxml2, libcanberra-gtk3, gnome3, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-media-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "06fka82smrphzj4dz9dw1566kmdscxvxl0rchj9qxg7aidy0rmnv";
+  };
+
+  buildInputs = [
+    libxml2
+    libcanberra-gtk3
+    gnome3.gtk
+    mate.libmatemixer
+    mate.mate-desktop
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    libtool
+    wrapGAppsHook
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Media tools for MATE";
+    homepage = http://mate-desktop.org;
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo maintainers.chpatrick ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-menus/default.nix b/nixpkgs/pkgs/desktops/mate/mate-menus/default.nix
new file mode 100644
index 000000000000..9a0db6107e1a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-menus/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, gobject-introspection, python, mate }:
+
+stdenv.mkDerivation rec {
+  name = "mate-menus-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "18y4nka38dqqxycxpf7ig4vmrk4i05xqqjk4fxr1ghkj60xxyxz2";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool gobject-introspection ];
+
+  buildInputs = [ glib python ];
+
+  makeFlags = [
+    "INTROSPECTION_GIRDIR=$(out)/share/gir-1.0/"
+    "INTROSPECTION_TYPELIBDIR=$(out)/lib/girepository-1.0"
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Menu system for MATE";
+    homepage = https://github.com/mate-desktop/mate-menus;
+    license = with licenses; [ gpl2 lgpl2 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-netbook/default.nix b/nixpkgs/pkgs/desktops/mate/mate-netbook/default.nix
new file mode 100644
index 000000000000..35a7f1dae610
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-netbook/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, libwnck3, libfakekey, libXtst, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-netbook-${version}";
+  version = "1.20.1";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "1ils0lav6j779kgz2py6zdalcfifpnp01clspbnkhb3v1ha1ncsq";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libwnck3
+    libfakekey
+    libXtst
+    mate.mate-panel
+  ];
+
+  meta = with stdenv.lib; {
+    description = "MATE utilities for netbooks";
+    longDescription = ''
+      MATE utilities for netbooks are an applet and a daemon to maximize
+      windows and move their titles on the panel.
+
+      Installing these utilities is recommended for netbooks and similar
+      devices with low resolution displays.
+    '';
+    homepage = http://mate-desktop.org;
+    license = with licenses; [ gpl3 lgpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-notification-daemon/default.nix b/nixpkgs/pkgs/desktops/mate/mate-notification-daemon/default.nix
new file mode 100644
index 000000000000..e9f8b4b75b1f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-notification-daemon/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, dbus-glib, libcanberra-gtk3,
+  libnotify, libwnck3, gnome3, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-notification-daemon-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0a60f67yjvlffrnviqgc64jz5l280f30h8br7wz2x415if5dmjyn";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    dbus-glib
+    libcanberra-gtk3
+    libnotify
+    libwnck3
+    gnome3.gtk
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Notification daemon for MATE";
+    homepage = https://github.com/mate-desktop/mate-notification-daemon;
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-panel/default.nix b/nixpkgs/pkgs/desktops/mate/mate-panel/default.nix
new file mode 100644
index 000000000000..a7d34fc85a64
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-panel/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, glib, dbus-glib, libwnck3, librsvg, libxml2, gnome3, mate, hicolor-icon-theme, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-panel-${version}";
+  version = "1.20.4";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "02pdrwgl3plgv6l6nc45nsnmjppkxs4ybggwibd6mm777i9nb44d";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    intltool
+    itstool
+    pkgconfig
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    dbus-glib
+    libwnck3
+    librsvg
+    libxml2
+    gnome3.gtk
+    gnome3.dconf
+    mate.libmateweather
+    mate.mate-desktop
+    mate.mate-menus
+    hicolor-icon-theme
+  ];
+
+  NIX_CFLAGS_COMPILE = "-I${glib.dev}/include/gio-unix-2.0";
+
+  makeFlags = [
+    "INTROSPECTION_GIRDIR=$(out)/share/gir-1.0/"
+    "INTROSPECTION_TYPELIBDIR=$(out)/lib/girepository-1.0"
+  ];
+
+  meta = with stdenv.lib; {
+    description = "The MATE panel";
+    homepage = https://github.com/mate-desktop/mate-panel;
+    license = with licenses; [ gpl2 lgpl2 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-polkit/default.nix b/nixpkgs/pkgs/desktops/mate/mate-polkit/default.nix
new file mode 100644
index 000000000000..5f1dfaa5ba4e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-polkit/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, gobject-introspection, libappindicator-gtk3, libindicator-gtk3, polkit, mate }:
+
+stdenv.mkDerivation rec {
+  name = "mate-polkit-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0zajisavrxiynmp4qg7zamvkpnhy9nra01czwn21h6hm2yakbayr";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    intltool
+    pkgconfig
+  ];
+
+  buildInputs = [
+    gtk3
+    libappindicator-gtk3
+    libindicator-gtk3
+    polkit
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Integrates polkit authentication for MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = [ licenses.gpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-power-manager/default.nix b/nixpkgs/pkgs/desktops/mate/mate-power-manager/default.nix
new file mode 100644
index 000000000000..a9c162e59122
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-power-manager/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, itstool, libxml2, mate, libnotify, libcanberra-gtk3, dbus-glib, upower, gnome3, libtool, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-power-manager-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "17x47j5dkxxsq63bv2jwf3xgnddyy2dya4y14ryivq8q3jh5yhr5";
+  };
+
+  buildInputs = [
+     glib
+     itstool
+     libxml2
+     libcanberra-gtk3
+     gnome3.gtk
+     gnome3.libgnome-keyring
+     libnotify
+     dbus-glib
+     upower
+     mate.mate-panel
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    libtool
+    wrapGAppsHook
+  ];
+
+  configureFlags = [ "--enable-applets" ];
+
+  meta = with stdenv.lib; {
+    description = "The MATE Power Manager";
+    homepage = http://mate-desktop.org;
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo maintainers.chpatrick ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-screensaver/default.nix b/nixpkgs/pkgs/desktops/mate/mate-screensaver/default.nix
new file mode 100644
index 000000000000..089296a0b842
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-screensaver/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, dbus-glib, libXScrnSaver, libnotify, pam, systemd, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-screensaver-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0kmaj4psg7261h02dzarga6k5cb7n709d60xbfrhywnf5fb9787i";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    dbus-glib
+    libXScrnSaver
+    libnotify
+    pam
+    systemd
+    mate.mate-desktop
+    mate.mate-menus
+  ];
+
+  configureFlags = [ "--without-console-kit" ];
+
+  makeFlags = "DBUS_SESSION_SERVICE_DIR=$(out)/etc";
+
+  meta = with stdenv.lib; {
+    description = "Screen saver and locker for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = with licenses; [ gpl2Plus lgpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-sensors-applet/default.nix b/nixpkgs/pkgs/desktops/mate/mate-sensors-applet/default.nix
new file mode 100644
index 000000000000..86cbd3a86d25
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-sensors-applet/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, gtk3, libxml2, libxslt, libatasmart, libnotify, dbus-glib, lm_sensors, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-sensors-applet-${version}";
+  version = "1.20.3";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0s98qy3jkri9zh5xqffprqd00cqspaq9av0mcrcakjkl8wyfh2g6";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  # maybe add nvidia-settings later on
+  buildInputs = [
+    gtk3
+    libxml2
+    libxslt
+    libatasmart
+    libnotify
+    dbus-glib
+    lm_sensors
+    mate.mate-panel
+    hicolor-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/mate-desktop/mate-sensors-applet;
+    description = "MATE panel applet for hardware sensors";
+    license = with licenses; [ gpl2Plus ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-session-manager/default.nix b/nixpkgs/pkgs/desktops/mate/mate-session-manager/default.nix
new file mode 100644
index 000000000000..31f447861fc8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-session-manager/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchurl, pkgconfig, intltool, xtrans, dbus-glib, systemd,
+  libSM, libXtst, gtk3, hicolor-icon-theme, mate,
+  wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  name = "mate-session-manager-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "05qq07b568qf6zyy459wajhfpbx1wfrinw3hsbky7abdjfn529dy";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    xtrans
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    dbus-glib
+    systemd
+    libSM
+    libXtst
+    gtk3
+    mate.mate-desktop
+    hicolor-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    description = "MATE Desktop session manager";
+    homepage = https://github.com/mate-desktop/mate-session-manager;
+    license = with licenses; [ gpl2 lgpl2 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-settings-daemon/default.nix b/nixpkgs/pkgs/desktops/mate/mate-settings-daemon/default.nix
new file mode 100644
index 000000000000..2be518bcc5e1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-settings-daemon/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, pkgconfig, intltool, dbus-glib, libxklavier, libcanberra-gtk3, libnotify, nss, polkit, gnome3, mate, wrapGAppsHook
+, pulseaudioSupport ? stdenv.config.pulseaudio or true, libpulseaudio
+}:
+
+stdenv.mkDerivation rec {
+  name = "mate-settings-daemon-${version}";
+  version = "1.20.4";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "10xlg2gb7fypnn5cnr14kbpjy5jdfz98ji615scz61zf5lljksxh";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    dbus-glib
+    libxklavier
+    libcanberra-gtk3
+    libnotify
+    nss
+    polkit
+    gnome3.gtk
+    gnome3.dconf
+    mate.mate-desktop
+    mate.libmatekbd
+    mate.libmatemixer
+  ] ++ stdenv.lib.optional pulseaudioSupport libpulseaudio;
+
+  configureFlags = stdenv.lib.optional pulseaudioSupport "--enable-pulse";
+
+  meta = with stdenv.lib; {
+    description = "MATE settings daemon";
+    homepage = https://github.com/mate-desktop/mate-settings-daemon;
+    license = with licenses; [ gpl2 lgpl21 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-system-monitor/default.nix b/nixpkgs/pkgs/desktops/mate/mate-system-monitor/default.nix
new file mode 100644
index 000000000000..5757f5eb9b40
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-system-monitor/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, gtkmm3, libxml2, libgtop, libwnck3, librsvg, systemd, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-system-monitor-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0f6sh23axzmcmyv0d837gbc0dixf1afh8951zrzp1y53rdgpa9qn";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtkmm3
+    libxml2
+    libgtop
+    libwnck3
+    librsvg
+    systemd
+  ];
+
+  configureFlags = [ "--enable-systemd" ];
+
+  meta = with stdenv.lib; {
+    description = "System monitor for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = [ licenses.gpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-terminal/default.nix b/nixpkgs/pkgs/desktops/mate/mate-terminal/default.nix
new file mode 100644
index 000000000000..9b0018e8e2fc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-terminal/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, itstool, libxml2, mate, gnome3, gtk3, vte, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-terminal-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0fqyi0az4ax1gyk5gymd7ssq2crdcd7slmqljc1b1pa283ql7p3q";
+  };
+
+  buildInputs = [
+     glib
+     itstool
+     libxml2
+
+     mate.mate-desktop
+
+     vte
+     gtk3
+     gnome3.dconf
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    wrapGAppsHook
+  ];
+
+  meta = with stdenv.lib; {
+    description = "The MATE Terminal Emulator";
+    homepage = http://mate-desktop.org;
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-themes/default.nix b/nixpkgs/pkgs/desktops/mate/mate-themes/default.nix
new file mode 100644
index 000000000000..58feb32cfa8c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-themes/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, intltool, mate, gtk2, gtk3,
+  gtk_engines, gtk-engine-murrine, gdk_pixbuf, librsvg }:
+
+stdenv.mkDerivation rec {
+  name = "mate-themes-${version}";
+  version = "3.22.18";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/themes/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0538bw8qismp16ymxbjk0ww7yjw1ch5v3f3d4vib3770xvgmmcfm";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool gtk3 ];
+
+  buildInputs = [ mate.mate-icon-theme gtk2 gtk_engines gdk_pixbuf librsvg ];
+
+  propagatedUserEnvPkgs = [ gtk-engine-murrine ];
+
+  postInstall = ''
+    gtk-update-icon-cache "$out"/share/icons/ContrastHigh
+  '';
+
+  meta = {
+    description = "A set of themes from MATE";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.lgpl21;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-user-guide/default.nix b/nixpkgs/pkgs/desktops/mate/mate-user-guide/default.nix
new file mode 100644
index 000000000000..5264c772a537
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-user-guide/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, intltool, itstool, libxml2, yelp, mate }:
+
+stdenv.mkDerivation rec {
+  name = "mate-user-guide-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0cbi625xd7nsifvxbixsb29kj2zj14sn0sl61wkcvasz7whg7w6r";
+  };
+
+  nativeBuildInputs = [ itstool intltool libxml2 ];
+
+  buildInputs = [ yelp ];
+
+  meta = with stdenv.lib; {
+    description = "MATE User Guide";
+    homepage = http://mate-desktop.org;
+    license = with licenses; [ gpl2Plus fdl12 ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-user-share/default.nix b/nixpkgs/pkgs/desktops/mate/mate-user-share/default.nix
new file mode 100644
index 000000000000..9baa3f24e038
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-user-share/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, gtk3, dbus-glib, libnotify, libxml2, libcanberra-gtk3, mod_dnssd, apacheHttpd, hicolor-icon-theme, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-user-share-${version}";
+  version = "1.20.1";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0v5xilk978zl5443vlxf25z8z1g5sw9xl5sq76gvrmdlz2parfrn";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    dbus-glib
+    libnotify
+    libcanberra-gtk3
+    libxml2
+    mate.caja
+    hicolor-icon-theme
+    # Should mod_dnssd and apacheHttpd be runtime dependencies?
+    # In gnome-user-share they are not.
+    #mod_dnssd
+    #apacheHttpd
+  ];
+
+  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-cajadir=$(out)/lib/caja/extensions-2.0"
+  ];
+
+  meta = with stdenv.lib; {
+    description = "User level public file sharing for the MATE desktop";
+    homepage = https://github.com/mate-desktop/mate-user-share;
+    license = with licenses; [ gpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mate-utils/default.nix b/nixpkgs/pkgs/desktops/mate/mate-utils/default.nix
new file mode 100644
index 000000000000..17ec165f7559
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mate-utils/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, gtk3, libxml2, libgtop, libcanberra-gtk3, mate, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "mate-utils-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0w7hw192jzhad8jab8mjms4x6k2xijvb3rhlbxb6z5n5880xgfqf";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libgtop
+    libcanberra-gtk3
+    libxml2
+    mate.mate-panel
+    hicolor-icon-theme
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Utilities for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = with licenses; [ gpl2Plus lgpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/mozo/default.nix b/nixpkgs/pkgs/desktops/mate/mozo/default.nix
new file mode 100644
index 000000000000..f2419f7f5e80
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/mozo/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, python, fetchurl, pkgconfig, intltool, mate, gtk3, glib, wrapGAppsHook, gobject-introspection }:
+
+python.pkgs.buildPythonApplication rec {
+  pname = "mozo";
+  version = "1.20.2";
+
+  format = "other";
+  doCheck = false;
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${pname}-${version}.tar.xz";
+    sha256 = "1q4hqhigimxav2a8xxyd53lq8q80szsphcv37y2jhm6g6wvdmvhd";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool gobject-introspection wrapGAppsHook ];
+
+  propagatedBuildInputs =  [ mate.mate-menus python.pkgs.pygobject3 ];
+
+  buildInputs = [ gtk3 glib ];
+
+  meta = with stdenv.lib; {
+    description = "MATE Desktop menu editor";
+    homepage = https://github.com/mate-desktop/mozo;
+    license = with licenses; [ lgpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/pluma/default.nix b/nixpkgs/pkgs/desktops/mate/pluma/default.nix
new file mode 100644
index 000000000000..abb1b8c28a1b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/pluma/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, pkgconfig, intltool, itstool, isocodes, enchant, libxml2, python, gnome3, mate, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  name = "pluma-${version}";
+  version = "1.20.4";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "0qdbm5y6q8lbabd81mg3rnls5bdvbmfii82f6syqw1cw6381mzgz";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    itstool
+    isocodes
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    enchant
+    libxml2
+    python
+    gnome3.gtksourceview
+    gnome3.libpeas
+    gnome3.defaultIconTheme
+    mate.mate-desktop
+  ];
+
+  meta = {
+    description = "Powerful text editor for the MATE desktop";
+    homepage = http://mate-desktop.org;
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/python-caja/default.nix b/nixpkgs/pkgs/desktops/mate/python-caja/default.nix
new file mode 100644
index 000000000000..0470086f865f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/python-caja/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk3, mate, pythonPackages }:
+
+stdenv.mkDerivation rec {
+  name = "python-caja-${version}";
+  version = "1.20.2";
+
+  src = fetchurl {
+    url = "http://pub.mate-desktop.org/releases/${mate.getRelease version}/${name}.tar.xz";
+    sha256 = "16r8mz1b44qgs19d14zadwzshzrdc5sdwgjp9f9av3fa6g09yd7b";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+    pythonPackages.wrapPython
+  ];
+
+  buildInputs = [
+    gtk3
+    mate.caja
+    pythonPackages.python
+    pythonPackages.pygobject3
+  ];
+
+  configureFlags = [ "--with-cajadir=$$out/lib/caja/extensions-2.0" ];
+
+  meta = with stdenv.lib; {
+    description = "Python binding for Caja components";
+    homepage = https://github.com/mate-desktop/python-caja;
+    license = [ licenses.gpl2Plus ];
+    platforms = platforms.unix;
+    maintainers = [ maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/mate/update.sh b/nixpkgs/pkgs/desktops/mate/update.sh
new file mode 100755
index 000000000000..736bcbd34fc6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/mate/update.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p libarchive curl common-updater-scripts
+
+set -eu -o pipefail
+
+cd "$(dirname "${BASH_SOURCE[0]}")"
+root=../../..
+export NIXPKGS_ALLOW_UNFREE=1
+
+mate_version=1.20
+theme_version=3.22
+materepo=https://pub.mate-desktop.org/releases/${mate_version}
+themerepo=https://pub.mate-desktop.org/releases/themes/${theme_version}
+
+version() {
+    (cd "$root" && nix-instantiate --eval --strict -A "$1.version" | tr -d '"')
+}
+
+update_package() {
+    local p=$1
+    echo $p
+
+    local repo
+    if [ "$p" = "mate-themes" ]; then
+        repo=$themerepo
+    else
+        repo=$materepo
+    fi
+  
+    local p_version_old=$(version mate.$p)
+    local p_versions=$(curl -sS ${repo}/ | sed -rne "s/.*\"$p-([0-9]+\\.[0-9]+\\.[0-9]+)\\.tar\\.xz.*/\\1/p")
+    local p_version=$(echo $p_versions | sed -e 's/ /\n/g' | sort -t. -k 1,1n -k 2,2n -k 3,3n | tail -n1)
+  
+    if [[ "$p_version" = "$p_version_old" ]]; then
+        echo "nothing to do, $p $p_version is current"
+        echo
+        return
+    fi
+
+    # Download package and save hash and file path.
+    local url="$repo/$p-${p_version}.tar.xz"
+    mapfile -t prefetch < <(nix-prefetch-url --print-path "$url")
+    local hash=${prefetch[0]}
+    local path=${prefetch[1]}
+    echo "$p: $p_version_old -> $p_version"
+    (cd "$root" && update-source-version mate.$p "$p_version" "$hash")
+    echo
+}
+
+for d in $(ls -A --indicator-style=none); do
+    if [ -d $d ]; then
+        update_package $d
+    fi
+done
diff --git a/nixpkgs/pkgs/desktops/maxx/default.nix b/nixpkgs/pkgs/desktops/maxx/default.nix
new file mode 100644
index 000000000000..6f515068418e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/maxx/default.nix
@@ -0,0 +1,94 @@
+{ stdenv, fetchurl, makeWrapper, autoPatchelfHook
+, libredirect, gcc-unwrapped, bash, gtk-engine-murrine, gtk_engines, librsvg
+
+, libX11, libXext, libXi, libXau, libXrender, libXft, libXmu, libSM, libXcomposite, libXfixes, libXpm
+, libXinerama, libXdamage, libICE, libXtst, libXaw, fontconfig, pango, cairo, glib, libxml2, atk, gtk2
+, gdk_pixbuf, libGL, ncurses
+
+, xclock, xsettingsd }:
+
+let
+  version = "Indy-1.1.0";
+
+  runtime_deps = [
+    xclock xsettingsd
+  ];
+in stdenv.mkDerivation {
+  name = "MaXX-${version}";
+
+  srcs = [
+    (fetchurl {
+      url = "http://maxxdesktop.arcadedaydream.com/Indy-Releases/Installers/MaXX-${version}-NO-ARCH.tar.gz";
+      sha256 = "1d23j08wwrrn5cp7csv70pcz9jppcn0xb1894wkp0caaliy7g31y";
+    })
+    (fetchurl {
+      url = "http://maxxdesktop.arcadedaydream.com/Indy-Releases/Installers/MaXX-${version}-x86_64.tar.gz";
+      sha256 = "156p2lra184wyvibrihisd7cr1ivqaygsf0zfm26a12gx23b7708";
+    })
+  ];
+
+  nativeBuildInputs = [ makeWrapper autoPatchelfHook ];
+  buildInputs = [
+    stdenv.cc.cc libX11 libXext libXi libXau libXrender libXft libXmu libSM libXcomposite libXfixes libXpm
+    libXinerama libXdamage libICE libXtst libXaw fontconfig pango cairo glib libxml2 atk gtk2
+    gdk_pixbuf libGL ncurses
+  ];
+
+  buildPhase = ''
+    while IFS= read -r -d ''$'\0' i; do
+      substituteInPlace "$i" --replace /opt/MaXX $out/opt/MaXX
+    done < <(find "." -type f -exec grep -Iq /opt/MaXX {} \; -and -print0)
+
+    substituteInPlace bin/adminterm \
+      --replace /bin/bash ${bash}/bin/bash
+
+    substituteInPlace share/misc/HOME/initMaXX-Desktop-Home.sh \
+      --replace "cp " "cp --no-preserve=mode "
+  '';
+
+  installPhase = ''
+    maxx=$out/opt/MaXX
+    mkdir -p "$maxx" $out/share $maxx/sbin
+
+    mv -- ./* "$maxx"
+    ln -s $maxx/share/icons $out/share
+
+    wrapProgram $maxx/etc/skel/Xsession.dt \
+      --prefix GTK_PATH : "${gtk-engine-murrine}/lib/gtk-2.0:${gtk_engines}/lib/gtk-2.0" \
+      --prefix GDK_PIXBUF_MODULE_FILE : "$(echo ${librsvg.out}/lib/gdk-pixbuf-2.0/*/loaders.cache)" \
+      --prefix PATH : ${stdenv.lib.makeBinPath runtime_deps}
+
+    while IFS= read -r -d ''$'\0' i; do
+      if isExecutable "$i"; then
+        wrapProgram "$i" \
+          --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
+          --set NIX_REDIRECTS /opt/MaXX=$maxx \
+          --prefix PATH : $maxx/sbin
+      fi
+    done < <(find "$maxx" -type f -print0)
+
+    cp ${gcc-unwrapped}/bin/cpp ${gcc-unwrapped}/libexec/gcc/*/*/cc1 $maxx/sbin
+    for i in $maxx/sbin/cpp $maxx/sbin/cc1
+    do
+      wrapProgram "$i" \
+        --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
+        --set NIX_REDIRECTS /opt/MaXX=$maxx
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A replica of IRIX Interactive Desktop";
+    homepage = http://www.maxxinteractive.com;
+    license = {
+      fullName = "The MaXX Interactive Desktop for Linux License Agreement";
+      url = http://www.maxxinteractive.com/site/?page_id=97;
+      free = false; # redistribution is only allowed to *some* hardware, etc.
+    };
+    maintainers = [ maintainers.gnidorah ];
+    platforms = ["x86_64-linux"];
+    longDescription = ''
+      A clone of IRIX Interactive Desktop made in agreement with SGI. 
+      Provides simple and fast retro desktop environment.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix
new file mode 100644
index 000000000000..c8ade1c9c35e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix
@@ -0,0 +1,58 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig
+, meson, ninja, vala, desktop-file-utils, libxml2
+, gtk3, python3, granite, libgee, gobject-introspection
+, elementary-icon-theme, appstream, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "calculator";
+  version = "1.5.1";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0vc27kjmfkly2jkqjiyzlybxyjqhwal3xrxca5b4abfgb379yswa";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/elementary/calculator;
+    description = "Calculator app designed for elementary OS";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
new file mode 100644
index 000000000000..28983db7f916
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
@@ -0,0 +1,66 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson
+, ninja, vala, desktop-file-utils, gtk3, granite, libgee
+, geoclue2, libchamplain, clutter, folks, geocode-glib, python3
+, libnotify, libical, evolution-data-server, appstream-glib
+, elementary-icon-theme, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "calendar";
+  version = "4.2.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "100wy8lkp4nrxj57ywyx44ckm3k7n8h5l6av92hr5pyx8fxn9m48";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream-glib
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    clutter
+    elementary-icon-theme
+    evolution-data-server
+    folks
+    geoclue2
+    geocode-glib
+    granite
+    gtk3
+    libchamplain
+    libgee
+    libical
+    libnotify
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Desktop calendar app designed for elementary OS";
+    homepage = https://github.com/elementary/calendar;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix
new file mode 100644
index 000000000000..2e90a96411a3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix
@@ -0,0 +1,64 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala
+, desktop-file-utils, python3, gettext, libxml2, gtk3, granite, libgee, gst_all_1
+, libcanberra, clutter-gtk, clutter-gst, elementary-icon-theme, appstream, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "camera";
+  version = "1.0.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "05rjymflhwbkw8yc57rgi9n7lrhf4dpvfvlifdnazyqn9iiaxc46";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gettext
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    clutter-gst
+    clutter-gtk
+    elementary-icon-theme
+    granite
+    gst_all_1.gst-plugins-bad
+    gst_all_1.gst-plugins-base
+    gst_all_1.gst-plugins-good
+    gst_all_1.gstreamer
+    gtk3
+    libcanberra
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Camera app designed for elementary OS";
+    homepage = https://github.com/elementary/camera;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix
new file mode 100644
index 000000000000..0b16c56be3de
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix
@@ -0,0 +1,80 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala, substituteAll
+, python3, glibcLocales, desktop-file-utils, gtk3, granite, libgee, elementary-icon-theme
+, appstream, libpeas, editorconfig-core-c, gtksourceview3, gtkspell3, libsoup
+, vte, webkitgtk, zeitgeist, ctags, libgit2-glib, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "code";
+  version = "3.0.2";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0zmm4a7galrs9phiplf6cygwq3rplghv7r8g47mi4nlndgxqyssg";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    glibcLocales
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    ctags
+    elementary-icon-theme
+    editorconfig-core-c
+    granite
+    gtk3
+    gtksourceview3
+    gtkspell3
+    libgee
+    libgit2-glib
+    libpeas
+    libsoup
+    vte
+    webkitgtk
+    zeitgeist
+  ];
+
+  # See: https://github.com/elementary/code/pull/626
+  LIBRARY_PATH = stdenv.lib.makeLibraryPath [ editorconfig-core-c ];
+
+  # install script fails with UnicodeDecodeError because of printing a fancy elipsis character
+  LC_ALL = "en_US.UTF-8";
+
+  # ctags needed in path by outline plugin
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --prefix PATH : "${stdenv.lib.makeBinPath [ ctags ]}"
+    )
+  '';
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Code editor designed for elementary OS";
+    homepage = https://github.com/elementary/code;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix
new file mode 100644
index 000000000000..3494474c49c5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix
@@ -0,0 +1,76 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, gettext, vala
+, python3, desktop-file-utils, libcanberra, gtk3, libgee, granite, libnotify
+, libunity, pango, plank, bamf, sqlite, libdbusmenu-gtk3, zeitgeist, glib-networking
+, elementary-icon-theme, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "files";
+  version = "4.1.5";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0z0pisg7py2k6i31v18z5fgpj8x64m1s5clfq4vbbjrcjwx6dcx5";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    glib-networking
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    bamf
+    elementary-icon-theme
+    granite
+    gtk3
+    libcanberra
+    libdbusmenu-gtk3
+    libgee
+    libnotify
+    libunity
+    pango
+    plank
+    sqlite
+    zeitgeist
+  ];
+
+  patches = [ ./hardcode-gsettings.patch ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+
+    substituteInPlace filechooser-module/FileChooserDialog.vala --subst-var-by ELEMENTARY_FILES_GSETTINGS_PATH $out/share/gsettings-schemas/${name}/glib-2.0/schemas
+  '';
+
+  # xdg.mime will create this
+  postInstall = ''
+    rm $out/share/applications/mimeinfo.cache
+  '';
+
+  meta = with stdenv.lib; {
+    description = "File browser designed for elementary OS";
+    homepage = https://github.com/elementary/files;
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch
new file mode 100644
index 000000000000..3191f4e3cb2b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch
@@ -0,0 +1,22 @@
+diff --git a/filechooser-module/FileChooserDialog.vala b/filechooser-module/FileChooserDialog.vala
+index cb7c3c49..8b1899d1 100644
+--- a/filechooser-module/FileChooserDialog.vala
++++ b/filechooser-module/FileChooserDialog.vala
+@@ -57,10 +57,15 @@ public class CustomFileChooserDialog : Object {
+         chooser_dialog.deletable = false;
+         chooser_dialog.local_only = false;
+ 
+-        var settings = new Settings ("io.elementary.files.preferences");
++        SettingsSchemaSource sss = new SettingsSchemaSource.from_directory ("@ELEMENTARY_FILES_GSETTINGS_PATH@", SettingsSchemaSource.get_default (), true);
++        SettingsSchema preferences_schema = sss.lookup ("io.elementary.files.preferences", false);
++        SettingsSchema chooser_schema = sss.lookup ("io.elementary.files.file-chooser", false);
++
++        var settings = new Settings.full (preferences_schema, null, null);
++
+         is_single_click = settings.get_boolean ("single-click");
+ 
+-        var chooser_settings = new Settings ("io.elementary.files.file-chooser");
++        var chooser_settings = new Settings.full (chooser_schema, null, null);
+ 
+         assign_container_box ();
+         remove_gtk_widgets ();
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix
new file mode 100644
index 000000000000..8bca7b3b6b50
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix
@@ -0,0 +1,78 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson
+, ninja, vala, desktop-file-utils, libxml2, gtk3, granite
+, python3, libgee, clutter-gtk, json-glib, libgda, libgpod
+, libnotify, libpeas, libsoup, zeitgeist, gst_all_1, taglib
+, libdbusmenu, libsignon-glib, libaccounts-glib
+, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "music";
+  version = "5.0.2";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "06mpikzdm01r9j7g15b7fgi4lcnp8cc0wmj17dfli5nmncxghx89";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = with gst_all_1; [
+    clutter-gtk
+    elementary-icon-theme
+    granite
+    gst-plugins-bad
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gstreamer
+    gtk3
+    json-glib
+    libaccounts-glib
+    libdbusmenu
+    libgda
+    libgee
+    libgpod
+    libsignon-glib
+    libnotify
+    libpeas
+    libsoup
+    taglib
+    zeitgeist
+  ];
+
+  mesonFlags = [
+    "-Dplugins=lastfm,audioplayer,cdrom,ipod"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Music player and library designed for elementary OS";
+    homepage = https://github.com/elementary/music;
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
new file mode 100644
index 000000000000..21d5b9f1db4c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
@@ -0,0 +1,81 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig, vala, desktop-file-utils
+, gtk3, glib, libaccounts-glib, libexif, libgee, geocode-glib, gexiv2,libgphoto2
+, granite, gst_all_1, libgudev, json-glib, libraw, librest, libsoup, sqlite, python3
+, scour, webkitgtk, libwebp, appstream, libunity, wrapGAppsHook, gobject-introspection, elementary-icon-theme }:
+
+stdenv.mkDerivation rec {
+  pname = "photos";
+  version = "2.6.2";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "166a1jb85n67z6ffm5i0xzap407rv0r511lzh0gidkap1qy6pnmi";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = with gst_all_1; [
+    elementary-icon-theme
+    geocode-glib
+    gexiv2
+    granite
+    gst-plugins-bad
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gstreamer
+    gtk3
+    json-glib
+    libaccounts-glib
+    libexif
+    libgee
+    libgphoto2
+    libgudev
+    libraw
+    libsoup
+    libunity
+    libwebp
+    librest
+    scour
+    sqlite
+    webkitgtk
+  ];
+
+  mesonFlags = [
+    "-Dplugins=false"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta =  with stdenv.lib; {
+    description = "Photo viewer and organizer designed for elementary OS";
+    homepage = https://github.com/elementary/photos;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix
new file mode 100644
index 000000000000..192b6ff358ff
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix
@@ -0,0 +1,67 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, callPackage
+, ninja, vala, python3, desktop-file-utils, gtk3, granite, libgee
+, libcanberra, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+let
+
+  redacted-script = callPackage ./redacted-script.nix {};
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "screenshot-tool"; # This will be renamed to "screenshot" soon. See -> https://github.com/elementary/screenshot/pull/93
+  version = "1.6.1";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "screenshot";
+    rev = version;
+    sha256 = "1vvj550md7vw7n057h8cy887a0nmsbwry67dxrxyz6bsvpk8sb6g";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = "screenshot";
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libcanberra
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/fonts/truetype
+    cp -rva ${redacted-script}/share/fonts/truetype/redacted-elementary $out/share/fonts/truetype
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Screenshot tool designed for elementary OS";
+    homepage = https://github.com/elementary/screenshot;
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix
new file mode 100644
index 000000000000..db1d9d240c40
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchFromGitHub, pantheon }:
+
+stdenv.mkDerivation rec {
+  name = "elementary-redacted-script-${version}";
+  version = "5.1.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "fonts";
+    rev = version;
+    sha256 = "16x2w7w29k4jx2nwc5932h9rqvb216vxsziazisv2rpll74kn8b2";
+  };
+
+  dontConfigure = true;
+
+  installPhase = ''
+    mkdir -p $out/share/fonts/truetype/redacted-elementary
+    cp -a redacted/*.ttf $out/share/fonts/truetype/redacted-elementary
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Redacted Script Font for elementary";
+    homepage = https://github.com/elementary/fonts;
+    license = licenses.ofl;
+    maintainers = pantheon.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix
new file mode 100644
index 000000000000..01fe35e4a8ee
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix
@@ -0,0 +1,66 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, python3
+, vala, desktop-file-utils, gtk3, libxml2, granite, libnotify, vte, libgee
+, elementary-icon-theme, appstream, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "terminal";
+  version = "5.3.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1rhqfq5dn913g551ribycid4k8add2lanxkkqpv6zzdgvah26ni8";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    libnotify
+    vte
+  ];
+
+  # See https://github.com/elementary/terminal/commit/914d4b0e2d0a137f12276d748ae07072b95eff80
+  mesonFlags = [ "-Dubuntu-bionic-patched-vte=false" ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Terminal emulator designed for elementary OS";
+    longDescription = ''
+      A super lightweight, beautiful, and simple terminal. Comes with sane defaults, browser-class tabs, sudo paste protection,
+      smart copy/paste, and little to no configuration.
+    '';
+    homepage = https://github.com/elementary/terminal;
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
new file mode 100644
index 000000000000..b123d4cbf5bc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
@@ -0,0 +1,63 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala, python3
+, desktop-file-utils, gtk3, granite, libgee, clutter-gst, clutter-gtk, gst_all_1
+, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "videos";
+  version = "2.6.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1ncm8kh6dcy83p8pmpilnk03b4dx3b1jm8w13izq2dkglfgdwvqx";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = with gst_all_1; [
+    clutter-gst
+    clutter-gtk
+    elementary-icon-theme
+    granite
+    gst-libav
+    gst-plugins-bad
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gstreamer
+    gtk3
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Video player and library app designed for elementary OS";
+    homepage = https://github.com/elementary/videos;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix
new file mode 100644
index 000000000000..2ee925209838
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-a11y";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1wh46lrsliii5bbvfc4xnzgnii2v7sqxnbn43ylmyqppfv9mk1wd";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Universal Access Plug";
+    homepage = https://github.com/elementary/switchboard-plug-a11y;
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix
new file mode 100644
index 000000000000..bdba8328fe93
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchFromGitHub, pantheon, substituteAll, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, switchboard, pciutils, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-about";
+  version = "2.5.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "11diwz2aj45yqkxdija8ny0sgm0wl2905gl3799cdl12ss9ffndp";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./lspci-path.patch;
+      inherit pciutils;
+    })
+    ./remove-update-button.patch
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard About Plug";
+    homepage = https://github.com/elementary/witchboard-plug-about;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch
new file mode 100644
index 000000000000..352d84c42624
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Views/HardwareView.vala b/src/Views/HardwareView.vala
+index a3e449c..a95fe93 100644
+--- a/src/Views/HardwareView.vala
++++ b/src/Views/HardwareView.vala
+@@ -179,7 +179,7 @@ public class About.HardwareView : Gtk.Grid {
+ 
+         // Graphics
+         try {
+-            Process.spawn_command_line_sync ("lspci", out graphics);
++            Process.spawn_command_line_sync ("@pciutils@/bin/lspci", out graphics);
+ 
+             if ("VGA" in graphics) { //VGA-keyword indicates graphics-line
+                 string[] lines = graphics.split("\n");
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch
new file mode 100644
index 000000000000..41433f9a76b0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch
@@ -0,0 +1,55 @@
+diff --git a/src/Plug.vala b/src/Plug.vala
+index 76fca34..3e79c1f 100644
+--- a/src/Plug.vala
++++ b/src/Plug.vala
+@@ -65,7 +65,6 @@ public class About.Plug : Switchboard.Plug {
+         search_results.set ("%s → %s".printf (display_name, _("Restore Default Settings")), "");
+         search_results.set ("%s → %s".printf (display_name, _("Suggest Translation")), "");
+         search_results.set ("%s → %s".printf (display_name, _("Report Problems")), "");
+-        search_results.set ("%s → %s".printf (display_name, _("Updates")), "");
+         return search_results;
+     }
+ 
+@@ -161,7 +160,7 @@ public class About.Plug : Switchboard.Plug {
+         var kernel_version_label = new Gtk.Label (kernel_version);
+         kernel_version_label.set_selectable (true);
+ 
+-        var gtk_version_label = new Gtk.Label (_("GTK+ %s").printf (gtk_version));        
++        var gtk_version_label = new Gtk.Label (_("GTK+ %s").printf (gtk_version));
+         gtk_version_label.set_selectable (true);
+ 
+         var website_label = new Gtk.LinkButton.with_label (website_url, _("Website"));
+@@ -202,16 +201,6 @@ public class About.Plug : Switchboard.Plug {
+             issue_dialog.run ();
+         });
+ 
+-        // Update button
+-        var update_button = new Gtk.Button.with_label (_("Check for Updates"));
+-        update_button.clicked.connect (() => {
+-            try {
+-                Process.spawn_command_line_async ("io.elementary.appcenter --show-updates");
+-            } catch (Error e) {
+-                warning (e.message);
+-            }
+-        });
+-
+         // Restore settings button
+         var settings_restore_button = new Gtk.Button.with_label (_("Restore Default Settings"));
+         settings_restore_button.clicked.connect (settings_restore_clicked);
+@@ -224,7 +213,6 @@ public class About.Plug : Switchboard.Plug {
+         button_grid.add (settings_restore_button);
+         button_grid.add (translate_button);
+         button_grid.add (bug_button);
+-        button_grid.add (update_button);
+         button_grid.set_child_non_homogeneous (help_button, true);
+ 
+         var software_grid = new Gtk.Grid ();
+@@ -238,7 +226,7 @@ public class About.Plug : Switchboard.Plug {
+             software_grid.attach (based_off, 0, 2, 2, 1);
+         }
+ 
+-        software_grid.attach (kernel_version_label, 0, 3, 2, 1);        
++        software_grid.attach (kernel_version_label, 0, 3, 2, 1);
+         software_grid.attach (gtk_version_label, 0, 4, 2, 1);
+         software_grid.attach (website_label, 0, 5, 2, 1);
+ 
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix
new file mode 100644
index 000000000000..0cdb732ca731
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-applications";
+  version = "2.1.5";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1c4agff456625kycacpsww7c9jsnsg1rqps96r7cvn9zq371b5ir";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Applications Plug";
+    homepage = https://github.com/elementary/switchboard-plug-applications;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix
new file mode 100644
index 000000000000..697c3ac592bb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig, vala, libgee
+, granite, gtk3, bluez, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-bluetooth";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "13jm2idjsgqkvdz1dxgl2wwx7bsqahppf6cnpl0pmz167wahg5zp";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    bluez
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Bluetooth Plug";
+    homepage = https://github.com/elementary/switchboard-plug-bluetooth;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch
new file mode 100644
index 000000000000..0fe0ac8b10c8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch
@@ -0,0 +1,12 @@
+diff --git a/src/DateTime1.vala b/src/DateTime1.vala
+index 5a80fbd..2e1f948 100644
+--- a/src/DateTime1.vala
++++ b/src/DateTime1.vala
+@@ -38,6 +38,6 @@ public class DateTime.Settings : Granite.Services.Settings {
+     public string clock_format { get; set; }
+ 
+     public Settings () {
+-        base ("io.elementary.desktop.wingpanel.datetime");
++        base ("io.elementary.granite");
+     }
+ }
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix
new file mode 100644
index 000000000000..95a350372b95
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, substituteAll, pkgconfig
+, vala, libgee, granite, gtk3, libxml2, switchboard, tzdata, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-datetime";
+  version = "2.1.5";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1iz8skf5dw76a07ljc8v8lw2x2nrmq8j6sggm227cmxy60gadsdv";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./timezone.patch;
+      tzdata = "${tzdata}/share/zoneinfo/zone.tab";
+    })
+    # Use "clock-format" GSettings key that's been moved to granite
+    ./clock-format.patch
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Date & Time Plug";
+    homepage = https://github.com/elementary/switchboard-plug-datetime;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch
new file mode 100644
index 000000000000..35f73d365990
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Parser.vala b/src/Parser.vala
+index faccb64..432a362 100644
+--- a/src/Parser.vala
++++ b/src/Parser.vala
+@@ -28,7 +28,7 @@ public class DateTime.Parser : GLib.Object {
+         return parser;
+     }
+     private Parser () {
+-        var file = File.new_for_path ("/usr/share/zoneinfo/zone.tab");
++        var file = File.new_for_path ("@tzdata@");
+         if (!file.query_exists ()) {
+             critical ("/usr/share/zoneinfo/zone.tab doesn't exist !");
+             return;
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix
new file mode 100644
index 000000000000..192f8a69ae97
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-display";
+  version = "2.1.6";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0pw21bnc79shiynmg7h9bs1x1v011lh07ypn22j73yhmxp6wiypd";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Displays Plug";
+    homepage = https://github.com/elementary/switchboard-plug-display;
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix
new file mode 100644
index 000000000000..f38f15e3c6d2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchFromGitHub, pantheon, substituteAll, meson, ninja, pkgconfig, vala, libgee
+, granite, gtk3, libxml2, libgnomekbd, libxklavier, xorg, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-keyboard";
+  version = "2.3.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1997hnhlcp2jmf3z70na42vl1b7i5vxhp7k5ga5sl68dv0g4126y";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    libgnomekbd
+    libxklavier
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./xkb.patch;
+      config = "${xorg.xkeyboardconfig}/share/X11/xkb/rules/evdev.xml";
+    })
+  ];
+
+  LIBRARY_PATH = stdenv.lib.makeLibraryPath [ libgnomekbd ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Keyboard Plug";
+    homepage = https://github.com/elementary/switchboard-plug-keyboard;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch
new file mode 100644
index 000000000000..33237d9c9392
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch
@@ -0,0 +1,22 @@
+diff --git a/src/Layout/Handler.vala b/src/Layout/Handler.vala
+index 297314b..b36509a 100644
+--- a/src/Layout/Handler.vala
++++ b/src/Layout/Handler.vala
+@@ -29,7 +29,7 @@ public class Pantheon.Keyboard.LayoutPage.LayoutHandler : GLib.Object {
+     }
+
+     private void parse_layouts () {
+-        Xml.Doc* doc = Xml.Parser.parse_file ("/usr/share/X11/xkb/rules/evdev.xml");
++        Xml.Doc* doc = Xml.Parser.parse_file ("@config@");
+         if (doc == null) {
+             critical ("'evdev.xml' not found or permissions missing\n");
+             return;
+@@ -76,7 +76,7 @@ public class Pantheon.Keyboard.LayoutPage.LayoutHandler : GLib.Object {
+     public HashTable<string, string> get_variants_for_language (string language) {
+         var returned_table = new HashTable<string, string> (str_hash, str_equal);
+         returned_table.set ("", _("Default"));
+-        Xml.Doc* doc = Xml.Parser.parse_file ("/usr/share/X11/xkb/rules/evdev.xml");
++        Xml.Doc* doc = Xml.Parser.parse_file ("@config@");
+         if (doc == null) {
+             critical ("'evdev.xml' not found or permissions incorrect\n");
+             return returned_table;
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix
new file mode 100644
index 000000000000..6c4bdeb7fb71
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, fetchpatch, meson, ninja
+, pkgconfig, vala, libgee, granite, gtk3, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-mouse-touchpad";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1zh5472ab01bckrc1py5bqqsal9i9pbgx6i8ap2d4yzhc8sirjrf";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Mouse & Touchpad Plug";
+    homepage = https://github.com/elementary/switchboard-plug-mouse-touchpad;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix
new file mode 100644
index 000000000000..3943cad48fd3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig, substituteAll, vala
+, libgee, granite, gtk3, networkmanager, networkmanagerapplet, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-network";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "12lvcc15jngzsa40fjhxa6kccs58h5qq4lqrc7lcx5przmfaik8k";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    networkmanager
+    networkmanagerapplet
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./nma.patch;
+      networkmanagerapplet = "${networkmanagerapplet}";
+    })
+  ];
+
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Networking Plug";
+    homepage = https://github.com/elementary/switchboard-plug-network;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch
new file mode 100644
index 000000000000..a5fff9d6a32b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch
@@ -0,0 +1,43 @@
+diff --git a/src/Widgets/SettingsButton.vala b/src/Widgets/SettingsButton.vala
+index 19fd514..bc800d9 100644
+--- a/src/Widgets/SettingsButton.vala
++++ b/src/Widgets/SettingsButton.vala
+@@ -23,7 +23,7 @@
+             label = _("Edit Connections…");
+             clicked.connect (() => {
+                 try {
+-                    var appinfo = AppInfo.create_from_commandline ("nm-connection-editor", null, AppInfoCreateFlags.NONE);
++                    var appinfo = AppInfo.create_from_commandline ("@networkmanagerapplet@/bin/nm-connection-editor", null, AppInfoCreateFlags.NONE);
+                     appinfo.launch (null, null);
+                 } catch (Error e) {
+                     warning ("%s", e.message);
+@@ -61,13 +61,13 @@
+             label = title;
+             clicked.connect (() => {
+                 edit_connection_uuid (connection.get_uuid ());
+-            });  
++            });
+         }
+ 
+         private void edit_connection_uuid (string uuid) {
+             try {
+                 var appinfo = AppInfo.create_from_commandline (
+-                    "nm-connection-editor --edit=%s".printf (uuid), null, AppInfoCreateFlags.NONE
++                    "@networkmanagerapplet@/bin/nm-connection-editor --edit=%s".printf (uuid), null, AppInfoCreateFlags.NONE
+                 );
+ 
+                 appinfo.launch (null, null);
+diff --git a/src/Widgets/VPN/VPNPage.vala b/src/Widgets/VPN/VPNPage.vala
+index 23c3ae9..c71984c 100644
+--- a/src/Widgets/VPN/VPNPage.vala
++++ b/src/Widgets/VPN/VPNPage.vala
+@@ -86,8 +86,7 @@ namespace Network {
+             add_button.tooltip_text = _("Add VPN Connection…");
+             add_button.clicked.connect (() => {
+                 add_button.sensitive = false;
+-                var command = new Granite.Services.SimpleCommand ("/usr/bin",
+-                                                    "nm-connection-editor --create --type=vpn");
++                var command = new Granite.Services.SimpleCommand ("@networkmanagerapplet@", "bin/nm-connection-editor --create --type=vpn");
+                 command.done.connect ((exit) => {
+                     if (exit != 0) {
+                         var dialog = new Gtk.MessageDialog (null, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, "%s", _("Failed to run Connection Editor."));
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix
new file mode 100644
index 000000000000..6bb5d285a34f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-notifications";
+  version = "2.1.5";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0p0aj3bbjrh6x8wajqqb5yqm2iqfnj7kp16zf4hdr4siw0sx5p8n";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Notifications Plug";
+    homepage = https://github.com/elementary/switchboard-plug-notifications;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix
new file mode 100644
index 000000000000..0417d33df7d7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig, vala
+, libgee, granite, gtk3, libaccounts-glib, libsignon-glib, json-glib
+, librest, webkitgtk, libsoup, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-onlineaccounts";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "03h8ii8zz59fpp4fwlvyx3m3550096fn7a6w612b1rbj3dqhlmh9";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    json-glib
+    libaccounts-glib
+    libgee
+    libsignon-glib
+    libsoup
+    librest
+    switchboard
+    webkitgtk
+  ];
+
+  PKG_CONFIG_LIBACCOUNTS_GLIB_PROVIDERFILESDIR = "${placeholder "out"}/share/accounts/providers";
+  PKG_CONFIG_LIBACCOUNTS_GLIB_SERVICEFILESDIR = "${placeholder "out"}/share/accounts/services";
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "${placeholder "out"}/lib/switchboard";
+
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Online Accounts Plug";
+    homepage = https://github.com/elementary/switchboard-plug-onlineaccounts;
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch
new file mode 100644
index 000000000000..a1b019179d1b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch
@@ -0,0 +1,26 @@
+diff --git a/set-wallpaper-contract/set-wallpaper.vala b/set-wallpaper-contract/set-wallpaper.vala
+index 3e02089..7ce7041 100644
+--- a/set-wallpaper-contract/set-wallpaper.vala
++++ b/set-wallpaper-contract/set-wallpaper.vala
+@@ -38,7 +38,7 @@ namespace SetWallpaperContractor {
+         </transition>
+     """;
+ 
+-    const string SYSTEM_BACKGROUNDS_PATH = "/usr/share/backgrounds";
++    const string SYSTEM_BACKGROUNDS_PATH = "/run/current-system/sw/share/backgrounds";
+ 
+     private int delay_value = 60;
+ 
+diff --git a/src/Views/Wallpaper.vala b/src/Views/Wallpaper.vala
+index 4be14fa..aa8832f 100644
+--- a/src/Views/Wallpaper.vala
++++ b/src/Views/Wallpaper.vala
+@@ -38,7 +38,7 @@ public class Wallpaper : Gtk.Grid {
+         FileAttribute.THUMBNAIL_IS_VALID
+     };
+ 
+-    const string SYSTEM_BACKGROUNDS_PATH = "/usr/share/backgrounds";
++    const string SYSTEM_BACKGROUNDS_PATH = "/run/current-system/sw/share/backgrounds";
+ 
+     public Switchboard.Plug plug { get; construct set; }
+     private GLib.Settings settings;
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix
new file mode 100644
index 000000000000..e47dc4c4060c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix
@@ -0,0 +1,63 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig, vala
+, libgee, granite, gexiv2, elementary-settings-daemon, gtk3, gnome-desktop
+, gala, wingpanel, plank, switchboard, gettext, gobject-introspection, bamf }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-pantheon-shell";
+  version = "2.8.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0yy821hl26jfd9hyigqi7nmaf30iww0lhg9qzcwlfzsvvfwnxagi";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    bamf
+    gexiv2
+    gnome-desktop
+    elementary-settings-daemon
+    granite
+    gtk3
+    libgee
+    plank
+    switchboard
+  ];
+
+  patches = [
+    ./backgrounds.patch # Having https://github.com/elementary/switchboard-plug-pantheon-shell/issues/166 would make this patch uneeded
+    ./hardcode-gsettings.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace src/Views/Appearance.vala --subst-var-by GALA_GSETTINGS_PATH ${gala}/share/gsettings-schemas/${gala.name}/glib-2.0/schemas
+    substituteInPlace src/Views/Appearance.vala --subst-var-by WINGPANEL_GSETTINGS_PATH ${wingpanel}/share/gsettings-schemas/${wingpanel.name}/glib-2.0/schemas
+  '';
+
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Desktop Plug";
+    homepage = https://github.com/elementary/switchboard-plug-pantheon-shell;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch
new file mode 100644
index 000000000000..d023e1b55ce6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch
@@ -0,0 +1,23 @@
+diff --git a/src/Views/Appearance.vala b/src/Views/Appearance.vala
+index 721d458..17e1c58 100644
+--- a/src/Views/Appearance.vala
++++ b/src/Views/Appearance.vala
+@@ -66,10 +66,16 @@ public class Appearance : Gtk.Grid {
+         attach (text_size_label, 0, 2);
+         attach (text_size_modebutton, 1, 2);
+ 
+-        var animations_settings = new Settings (ANIMATIONS_SCHEMA);
++        SettingsSchemaSource gala_schema_source = new SettingsSchemaSource.from_directory ("@GALA_GSETTINGS_PATH@", SettingsSchemaSource.get_default (), true);
++        SettingsSchema animations_schema = gala_schema_source.lookup (ANIMATIONS_SCHEMA, false);
++
++        var animations_settings = new Settings.full (animations_schema, null, null);
+         animations_settings.bind (ANIMATIONS_KEY, animations_switch, "active", SettingsBindFlags.DEFAULT);
+ 
+-        var panel_settings = new Settings (PANEL_SCHEMA);
++        SettingsSchemaSource panel_schema_source = new SettingsSchemaSource.from_directory ("@WINGPANEL_GSETTINGS_PATH@", SettingsSchemaSource.get_default (), true);
++        SettingsSchema panel_schema = panel_schema_source.lookup (PANEL_SCHEMA, false);
++
++        var panel_settings = new Settings.full (panel_schema, null, null);
+         panel_settings.bind (TRANSLUCENCY_KEY, translucency_switch, "active", SettingsBindFlags.DEFAULT);
+ 
+         var interface_settings = new Settings (INTERFACE_SCHEMA);
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix
new file mode 100644
index 000000000000..ab1fd98795a1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix
@@ -0,0 +1,64 @@
+{ stdenv, fetchFromGitHub, pantheon, substituteAll, meson, ninja
+, pkgconfig, vala, libgee, elementary-dpms-helper, elementary-settings-daemon
+, makeWrapper, granite, gtk3, dbus, polkit, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-power";
+  version = "2.3.5";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1wcxz4jxyv8kms9gxpwvrb356h10qvcwmdjzjzl2bvj5yl1rfcs9";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    dbus
+    granite
+    gtk3
+    libgee
+    polkit
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./dpms-helper-exec.patch;
+      elementary_dpms_helper = "${elementary-dpms-helper}";
+    })
+    ./hardcode-gsettings.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace src/MainView.vala --subst-var-by DPMS_HELPER_GSETTINGS_PATH ${elementary-dpms-helper}/share/gsettings-schemas/${elementary-dpms-helper.name}/glib-2.0/schemas
+    substituteInPlace src/MainView.vala --subst-var-by GSD_GSETTINGS_PATH ${elementary-settings-daemon}/share/gsettings-schemas/${elementary-settings-daemon.name}/glib-2.0/schemas
+  '';
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+  PKG_CONFIG_DBUS_1_SYSTEM_BUS_SERVICES_DIR = "share/dbus-1/system-services";
+  PKG_CONFIG_DBUS_1_SYSCONFDIR = "etc";
+  PKG_CONFIG_POLKIT_GOBJECT_1_POLICYDIR = "share/polkit-1/actions";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Power Plug";
+    homepage = https://github.com/elementary/switchboard-plug-power;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch
new file mode 100644
index 000000000000..335d3f296262
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch
@@ -0,0 +1,13 @@
+diff --git a/src/MainView.vala b/src/MainView.vala
+index 1654e68..175f220 100644
+--- a/src/MainView.vala
++++ b/src/MainView.vala
+@@ -317,7 +317,7 @@ public class Power.MainView : Gtk.Grid {
+
+     private static void run_dpms_helper () {
+         try {
+-            string[] argv = { "io.elementary.dpms-helper" };
++            string[] argv = { "@elementary_dpms_helper@/bin/io.elementary.dpms-helper" };
+             Process.spawn_async (null, argv, Environ.get (),
+                 SpawnFlags.SEARCH_PATH | SpawnFlags.STDERR_TO_DEV_NULL | SpawnFlags.STDOUT_TO_DEV_NULL,
+                 null, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch
new file mode 100644
index 000000000000..caacdad6eda9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch
@@ -0,0 +1,20 @@
+diff --git a/src/MainView.vala b/src/MainView.vala
+index 1654e68..ad8fed9 100644
+--- a/src/MainView.vala
++++ b/src/MainView.vala
+@@ -46,8 +46,13 @@ public class Power.MainView : Gtk.Grid {
+
+         var label_size = new Gtk.SizeGroup (Gtk.SizeGroupMode.HORIZONTAL);
+
+-        settings = new GLib.Settings ("org.gnome.settings-daemon.plugins.power");
+-        elementary_dpms_settings = new GLib.Settings ("io.elementary.dpms");
++        SettingsSchemaSource gsd_sss = new SettingsSchemaSource.from_directory ("@GSD_GSETTINGS_PATH@", null, true);
++        SettingsSchema gsd_schema = gsd_sss.lookup ("org.gnome.settings-daemon.plugins.power", false);
++        settings = new GLib.Settings.full (gsd_schema, null, null);
++
++        SettingsSchemaSource dpms_sss = new SettingsSchemaSource.from_directory ("@DPMS_HELPER_GSETTINGS_PATH@", null, true);
++        SettingsSchema elementary_dpms_schema = dpms_sss.lookup ("io.elementary.dpms", false);
++        elementary_dpms_settings = new GLib.Settings.full (elementary_dpms_schema, null, null);
+
+         battery = new Battery ();
+         power_supply = new PowerSupply ();
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
new file mode 100644
index 000000000000..bb9e576a4c49
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, cups, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-printers";
+  version = "2.1.6";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "05pkf3whh51gd9d0h2h4clgf7r3mvzl4ybas7834vhy19dzcbzmc";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    cups
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Printers Plug";
+    homepage = https://github.com/elementary/switchboard-plug-printers;
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
new file mode 100644
index 000000000000..4060e0717891
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
@@ -0,0 +1,62 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, python3, ninja
+, pkgconfig, vala, libgee, granite, gtk3, polkit, zeitgeist
+, switchboard, lightlocker, pantheon-agent-geoclue2, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-security-privacy";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0f1idh36hlgmdva5jn0xnj2b6gbic0asnj3b7j283gyziibm3pxa";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    polkit
+    switchboard
+    zeitgeist
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  patches = [
+    ./hardcode-gsettings.patch
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+
+    substituteInPlace src/Views/LockPanel.vala --subst-var-by LIGHTLOCKER_GSETTINGS_PATH ${lightlocker}/share/gsettings-schemas/${lightlocker.name}/glib-2.0/schemas
+    substituteInPlace src/Views/FirewallPanel.vala --subst-var-by SWITCHBOARD_SEC_PRIV_GSETTINGS_PATH $out/share/gsettings-schemas/${pname}-${version}/glib-2.0/schemas
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Security & Privacy Plug";
+    homepage = https://github.com/elementary/switchboard-plug-security-privacy;
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch
new file mode 100644
index 000000000000..ffaf1ecf5db1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch
@@ -0,0 +1,36 @@
+diff --git a/src/Views/FirewallPanel.vala b/src/Views/FirewallPanel.vala
+index 994c4d1..5702de2 100644
+--- a/src/Views/FirewallPanel.vala
++++ b/src/Views/FirewallPanel.vala
+@@ -49,10 +49,13 @@ public class SecurityPrivacy.FirewallPanel : Granite.SimpleSettingsPage {
+     }
+ 
+     construct {
+-        settings = new Settings ("io.elementary.switchboard.security-privacy");
++        SettingsSchemaSource sss = new SettingsSchemaSource.from_directory ("@SWITCHBOARD_SEC_PRIV_GSETTINGS_PATH@", SettingsSchemaSource.get_default (), true);
++        SettingsSchema security_privacy_schema = sss.lookup ("io.elementary.switchboard.security-privacy", false);
++        settings = new Settings.full (security_privacy_schema, null, null);
++
+         disabled_rules = new Gee.HashMap<string, UFWHelpers.Rule> ();
+         load_disabled_rules ();
+-        
++
+         status_switch.notify["active"].connect (() => {
+             if (loading == false) {
+                 view.sensitive = status_switch.active;
+diff --git a/src/Views/LockPanel.vala b/src/Views/LockPanel.vala
+index 081cf10..42f6118 100644
+--- a/src/Views/LockPanel.vala
++++ b/src/Views/LockPanel.vala
+@@ -30,7 +30,10 @@ public class SecurityPrivacy.LockPanel : Granite.SimpleSettingsPage {
+     }
+ 
+     construct {
+-        locker = new Settings ("apps.light-locker");
++        SettingsSchemaSource sss = new SettingsSchemaSource.from_directory ("@LIGHTLOCKER_GSETTINGS_PATH@", SettingsSchemaSource.get_default (), true);
++        SettingsSchema locker_schema = sss.lookup ("apps.light-locker", false);
++
++        locker = new Settings.full (locker_schema, null, null);
+ 
+         var lock_suspend_label = new Gtk.Label (_("Lock on sleep:"));
+         var lock_suspend_switch = new Gtk.Switch ();
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix
new file mode 100644
index 000000000000..a2c047ffcb41
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-sharing";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1yi6aga9i18wwn22zwmfbhsk16f92fka837is5r8xghqb7a50hyh";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Sharing Plug";
+    homepage = https://github.com/elementary/switchboard-plug-sharing;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix
new file mode 100644
index 000000000000..e4d0db46923b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig
+, vala, libgee, granite, gtk3, pulseaudio, libcanberra, libcanberra-gtk3
+, switchboard, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-sound";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0dvxmjziifffa2rm7h43ca5grhlcpih3rgik50mz808mqfxr4l1q";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libcanberra
+    libcanberra-gtk3
+    libgee
+    pulseaudio
+    switchboard
+  ];
+
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  meta = with stdenv.lib; {
+    description = "Switchboard Sound Plug";
+    homepage = https://github.com/elementary/switchboard-plug-sound;
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix
new file mode 100644
index 000000000000..310230c7aacc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, python3, ninja
+, vala, gtk3, libgee, granite, gettext, clutter-gtk, libunity
+, elementary-icon-theme, wrapGAppsHook, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard";
+  version = "2.3.6";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0lsrn636b0f9a58jbid6mlhgrf8ajnh7phwmhgxz55sz7k7qa58g";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    clutter-gtk
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    libunity
+  ];
+
+  patches = [ ./plugs-path-env.patch ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Extensible System Settings app for Pantheon";
+    homepage = https://github.com/elementary/switchboard;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch
new file mode 100644
index 000000000000..f5d8567bffed
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch
@@ -0,0 +1,25 @@
+diff --git a/lib/PlugsManager.vala b/lib/PlugsManager.vala
+index 75d0eaf..c227908 100644
+--- a/lib/PlugsManager.vala
++++ b/lib/PlugsManager.vala
+@@ -34,10 +34,18 @@ public class Switchboard.PlugsManager : GLib.Object {
+     private Gee.LinkedList<Switchboard.Plug> plugs;
+     
+     public signal void plug_added (Switchboard.Plug plug);
+-    
++
+     private PlugsManager () {
+         plugs = new Gee.LinkedList<Switchboard.Plug> ();
+-        var base_folder = File.new_for_path (Build.PLUGS_DIR);
++
++        var plugs_path = Environment.get_variable("SWITCHBOARD_PLUGS_PATH");
++        if (plugs_path != null) {
++            debug ("SWITCHBOARD_PLUGS_PATH set to %s", plugs_path);
++        } else {
++            critical ("SWITCHBOARD_PLUGS_PATH not set");
++        }
++
++        var base_folder = File.new_for_path (plugs_path);
+         find_plugins (base_folder);
+     }
+ 
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix
new file mode 100644
index 000000000000..cae8e74f4ba7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix
@@ -0,0 +1,19 @@
+{ stdenv, makeWrapper, symlinkJoin, switchboard, switchboardPlugs, plugs }:
+
+let
+  selectedPlugs = if plugs == null then switchboardPlugs else plugs;
+in
+symlinkJoin {
+  name = "${switchboard.name}-with-plugs";
+
+  paths = [ switchboard ] ++ selectedPlugs;
+
+  buildInputs = [ makeWrapper ];
+
+  postBuild = ''
+    wrapProgram $out/bin/io.elementary.switchboard \
+      --set SWITCHBOARD_PLUGS_PATH "$out/lib/switchboard"
+  '';
+
+  inherit (switchboard) meta;
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix
new file mode 100644
index 000000000000..2f7e79f9f9b3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja }:
+
+stdenv.mkDerivation rec {
+  pname = "stylesheet";
+  version = "5.2.1";
+
+  name = "elementary-gtk-theme-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "03l8m87f7z25svxk0hhcqnn4qnnqvasr5qwzq3s87lx25gwjml29";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-gtk-theme";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+  ];
+
+  meta = with stdenv.lib; {
+    description = "GTK theme designed to be smooth, attractive, fast, and usable";
+    homepage = https://github.com/elementary/stylesheet;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
new file mode 100644
index 000000000000..23fb8445838a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, python3,ninja, hicolor-icon-theme, gtk3 }:
+
+stdenv.mkDerivation rec {
+  pname = "icons";
+  version = "5.0.3";
+
+  name = "elementary-icon-theme-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0wpv7yirf44bfqfmyshzfw9605j1idm7c9jqg68k3nmymmd6iqzf";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-icon-theme";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    python3
+  ];
+
+  buildInputs = [ gtk3 ];
+
+  propagatedBuildInputs = [ hicolor-icon-theme ];
+
+  mesonFlags = [
+    "-Dvolume_icons=false" # Tries to install some icons to /
+    "-Dpalettes=false" # Don't install gimp and inkscape palette files
+  ];
+
+  postPatch = ''
+    chmod +x meson/symlink.py
+    patchShebangs meson/symlink.py
+  '';
+
+  postFixup = "gtk-update-icon-cache $out/share/icons/elementary";
+
+  meta = with stdenv.lib; {
+    description = "Named, vector icons for elementary OS";
+    longDescription = ''
+      An original set of vector icons designed specifically for elementary OS and its desktop environment: Pantheon.
+    '';
+    homepage = https://github.com/elementary/icons;
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix
new file mode 100644
index 000000000000..430acfd9ac1a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig }:
+
+stdenv.mkDerivation rec {
+  pname = "sound-theme";
+  version = "1.0";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1dc583lq61c361arjl3s44d2k72c46bqvcqv1c3s69f2ndsnxjdz";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+  ];
+
+  meta = with stdenv.lib; {
+    description = "A set of system sounds for elementary";
+    homepage = https://github.com/elementary/sound-theme;
+    license = licenses.unlicense;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix
new file mode 100644
index 000000000000..898d5f7b454f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchFromGitHub, pantheon }:
+
+stdenv.mkDerivation rec {
+  pname = "wallpapers";
+  version = "5.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1i0zf9gzhwm8hgq5cp1xnxipqjvgzd9wfiicz612hgp6ivc0z0ag";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/backgrounds/elementary
+    cp -av *.jpg $out/share/backgrounds/elementary
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Collection of wallpapers for elementary";
+    homepage = https://github.com/elementary/wallpapers;
+    license = licenses.publicDomain;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/default.nix b/nixpkgs/pkgs/desktops/pantheon/default.nix
new file mode 100644
index 000000000000..a7b8a01eeb0b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/default.nix
@@ -0,0 +1,222 @@
+{ pkgs, lib, gnome3 }:
+
+
+lib.makeScope pkgs.newScope (self: with self; {
+
+  apps = [
+    elementary-calculator elementary-calendar
+    elementary-camera elementary-code elementary-files
+    elementary-music elementary-photos elementary-screenshot-tool
+    elementary-terminal elementary-videos switchboard-with-plugs
+  ];
+
+  artwork = [
+    elementary-gtk-theme
+    elementary-icon-theme
+    elementary-sound-theme
+    elementary-wallpapers
+  ];
+
+  desktop = [
+    elementary-session-settings
+    elementary-shortcut-overlay
+    gala
+    wingpanel-with-indicators
+  ];
+
+  services = [
+    cerbere
+    elementary-capnet-assist
+    elementary-settings-daemon
+    elementary-dpms-helper
+    pantheon-agent-geoclue2
+    pantheon-agent-polkit
+  ];
+
+  switchboardPlugs = [
+    switchboard-plug-a11y switchboard-plug-about
+    switchboard-plug-applications switchboard-plug-bluetooth
+    switchboard-plug-datetime switchboard-plug-display
+    switchboard-plug-keyboard switchboard-plug-mouse-touchpad
+    switchboard-plug-network switchboard-plug-notifications
+    switchboard-plug-onlineaccounts switchboard-plug-pantheon-shell
+    switchboard-plug-power switchboard-plug-printers
+    switchboard-plug-security-privacy switchboard-plug-sharing
+    switchboard-plug-sound
+  ];
+
+  wingpanelIndicators = [
+    wingpanel-applications-menu wingpanel-indicator-bluetooth
+    wingpanel-indicator-datetime wingpanel-indicator-keyboard
+    wingpanel-indicator-network wingpanel-indicator-nightlight
+    wingpanel-indicator-notifications wingpanel-indicator-power
+    wingpanel-indicator-session wingpanel-indicator-sound
+  ];
+
+  updateScript = callPackage ./update.nix { };
+
+  maintainers = with pkgs.stdenv.lib.maintainers; [ worldofpeace ];
+
+  mutter = pkgs.gnome3.mutter328;
+  vala = pkgs.vala_0_40;
+
+  elementary-gsettings-schemas = callPackage ./desktop/elementary-gsettings-schemas { };
+
+  #### APPS
+
+  elementary-calculator = callPackage ./apps/elementary-calculator { };
+
+  elementary-calendar = callPackage ./apps/elementary-calendar { };
+
+  elementary-camera = callPackage ./apps/elementary-camera { };
+
+  elementary-code = callPackage ./apps/elementary-code { };
+
+  elementary-files = callPackage ./apps/elementary-files { };
+
+  elementary-music = callPackage ./apps/elementary-music { };
+
+  elementary-photos = callPackage ./apps/elementary-photos { };
+
+  elementary-screenshot-tool = callPackage ./apps/elementary-screenshot-tool { };
+
+  elementary-terminal = callPackage ./apps/elementary-terminal { };
+
+  elementary-videos = callPackage ./apps/elementary-videos { };
+
+  #### DESKTOP
+
+  elementary-default-settings = callPackage ./desktop/elementary-default-settings { };
+
+  elementary-greeter = callPackage ./desktop/elementary-greeter {
+    inherit (gnome3) gnome-desktop;
+  };
+
+  elementary-print-shim = callPackage ./desktop/elementary-print-shim { };
+
+  elementary-session-settings = callPackage ./desktop/elementary-session-settings {
+    inherit (gnome3) gnome-session gnome-keyring;
+  };
+
+  elementary-shortcut-overlay = callPackage ./desktop/elementary-shortcut-overlay { };
+
+  extra-elementary-contracts = callPackage ./desktop/extra-elementary-contracts {
+    inherit (gnome3) file-roller gnome-bluetooth;
+  };
+
+  gala = callPackage ./desktop/gala {
+    inherit (gnome3) gnome-desktop;
+  };
+
+  wingpanel = callPackage ./desktop/wingpanel { };
+
+  wingpanel-with-indicators = callPackage ./desktop/wingpanel/wrapper.nix {
+    indicators = null;
+  };
+
+  #### LIBRARIES
+
+  granite = callPackage ./granite { };
+
+  #### SERVICES
+
+  cerbere = callPackage ./services/cerbere { };
+
+  contractor = callPackage ./services/contractor { };
+
+  elementary-capnet-assist = callPackage ./services/elementary-capnet-assist { };
+
+  elementary-dpms-helper = callPackage ./services/elementary-dpms-helper { };
+
+  # We're using ubuntu and elementary's patchset due to reasons
+  # explained here -> https://github.com/elementary/greeter/issues/92#issuecomment-376215614
+  # Take note of "I am holding off on "fixing" this bug for as long as possible."
+  elementary-settings-daemon = callPackage ./services/elementary-settings-daemon {
+    inherit (gnome3) libgweather;
+  };
+
+  pantheon-agent-geoclue2 = callPackage ./services/pantheon-agent-geoclue2 { };
+
+  pantheon-agent-polkit = callPackage ./services/pantheon-agent-polkit { };
+
+  #### WINGPANEL INDICATORS
+
+  wingpanel-applications-menu = callPackage ./desktop/wingpanel-indicators/applications-menu { };
+
+  wingpanel-indicator-bluetooth = callPackage ./desktop/wingpanel-indicators/bluetooth { };
+
+  wingpanel-indicator-datetime = callPackage ./desktop/wingpanel-indicators/datetime { };
+
+  wingpanel-indicator-keyboard = callPackage ./desktop/wingpanel-indicators/keyboard { };
+
+  wingpanel-indicator-network = callPackage ./desktop/wingpanel-indicators/network {
+    inherit (gnome3) networkmanagerapplet;
+  };
+
+  wingpanel-indicator-nightlight = callPackage ./desktop/wingpanel-indicators/nightlight { };
+
+  wingpanel-indicator-notifications = callPackage ./desktop/wingpanel-indicators/notifications { };
+
+  wingpanel-indicator-power = callPackage ./desktop/wingpanel-indicators/power { };
+
+  wingpanel-indicator-session = callPackage ./desktop/wingpanel-indicators/session { };
+
+  wingpanel-indicator-sound = callPackage ./desktop/wingpanel-indicators/sound { };
+
+  #### SWITCHBOARD
+
+  switchboard = callPackage ./apps/switchboard { };
+
+  switchboard-with-plugs = callPackage ./apps/switchboard/wrapper.nix {
+    plugs = null;
+  };
+
+  switchboard-plug-a11y = callPackage ./apps/switchboard-plugs/a11y { };
+
+  switchboard-plug-about = callPackage ./apps/switchboard-plugs/about { };
+
+  switchboard-plug-applications = callPackage ./apps/switchboard-plugs/applications { };
+
+  switchboard-plug-bluetooth = callPackage ./apps/switchboard-plugs/bluetooth { };
+
+  switchboard-plug-datetime = callPackage ./apps/switchboard-plugs/datetime { };
+
+  switchboard-plug-display = callPackage ./apps/switchboard-plugs/display { };
+
+  switchboard-plug-keyboard = callPackage ./apps/switchboard-plugs/keyboard { };
+
+  switchboard-plug-mouse-touchpad = callPackage ./apps/switchboard-plugs/mouse-touchpad { };
+
+  switchboard-plug-network = callPackage ./apps/switchboard-plugs/network {
+    inherit (gnome3) networkmanagerapplet;
+  };
+
+  switchboard-plug-notifications = callPackage ./apps/switchboard-plugs/notifications { };
+
+  switchboard-plug-onlineaccounts = callPackage ./apps/switchboard-plugs/onlineaccounts { };
+
+  switchboard-plug-pantheon-shell = callPackage ./apps/switchboard-plugs/pantheon-shell {
+    inherit (gnome3) gnome-desktop;
+  };
+
+  switchboard-plug-power = callPackage ./apps/switchboard-plugs/power { };
+
+  switchboard-plug-printers = callPackage ./apps/switchboard-plugs/printers { };
+
+  switchboard-plug-security-privacy = callPackage ./apps/switchboard-plugs/security-privacy { };
+
+  switchboard-plug-sharing = callPackage ./apps/switchboard-plugs/sharing { };
+
+  switchboard-plug-sound = callPackage ./apps/switchboard-plugs/sound { };
+
+  ### ARTWORK
+
+  elementary-gtk-theme = callPackage ./artwork/elementary-gtk-theme { };
+
+  elementary-icon-theme = callPackage ./artwork/elementary-icon-theme { };
+
+  elementary-sound-theme = callPackage ./artwork/elementary-sound-theme { };
+
+  elementary-wallpapers = callPackage ./artwork/elementary-wallpapers { };
+
+})
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch
new file mode 100644
index 000000000000..438ed79d1bb0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch
@@ -0,0 +1,25 @@
+diff --git a/debian/elementary-default-settings.gsettings-override b/debian/elementary-default-settings.gsettings-override
+index 6452c30..899972d 100644
+--- a/debian/elementary-default-settings.gsettings-override
++++ b/debian/elementary-default-settings.gsettings-override
+@@ -1,5 +1,5 @@
+ [net.launchpad.plank.dock.settings]
+-dock-items=['gala-multitaskingview.dockitem','org.gnome.Epiphany.dockitem','org.pantheon.mail.dockitem','io.elementary.calendar.dockitem','io.elementary.music.dockitem','io.elementary.videos.dockitem','io.elementary.photos.dockitem','io.elementary.switchboard.dockitem','io.elementary.appcenter.dockitem']
++dock-items=['gala-multitaskingview.dockitem','org.gnome.Epiphany.dockitem','org.gnome.Geary.dockitem','io.elementary.calendar.dockitem','io.elementary.music.dockitem','io.elementary.videos.dockitem','io.elementary.photos.dockitem','io.elementary.switchboard.dockitem']
+ hide-delay=250
+ hide-mode='window-dodge'
+ show-dock-item=false
+@@ -8,13 +8,6 @@ theme='Gtk+'
+ [org.freedesktop.ibus.general.hotkey]
+ triggers=['<Control>space']
+ 
+-[org.gnome.desktop.background]
+-draw-background=true
+-picture-options='zoom'
+-picture-uri='file:///usr/share/backgrounds/elementaryos-default'
+-primary-color='#000000'
+-show-desktop-icons=false
+-
+ [org.gnome.desktop.datetime]
+ automatic-timezone=true
+ 
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
new file mode 100644
index 000000000000..f133324a81ec
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
@@ -0,0 +1,60 @@
+{ stdenv, fetchFromGitHub, fetchpatch, pantheon }:
+
+stdenv.mkDerivation rec {
+  pname = "default-settings";
+  version = "5.0";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0gyv835qbr90001gda2pzngzzbbk5jf9grgfl25pqkm29s45rqq0";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  patches = [
+    # See: https://github.com/elementary/default-settings/pull/86 (didn't make 5.0 release)
+    (fetchpatch {
+      url = "https://github.com/elementary/default-settings/commit/05d0b2a4e98c28203521d599b40745b46be549fa.patch";
+      sha256 = "1wk1qva3yzc28gljnkx9hb3pwhqnfrsb08wd76lsl3xnylg0wn2l";
+    })
+    # See: https://github.com/elementary/default-settings/pull/94 (didn't make 5.0 release)
+    (fetchpatch {
+      url = "https://github.com/elementary/default-settings/commit/a2ca00130c16e805179fb5abd7b624a873dff2da.patch";
+      sha256 = "1jp1c5d8jfm0404zsylfk7h9vj81s409wgbzbsd2kxmz65icq16x";
+    })
+    ./correct-override.patch
+  ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/etc/gtk-3.0
+    cp -av settings.ini $out/etc/gtk-3.0
+
+    mkdir -p $out/share/glib-2.0/schemas
+    cp -av debian/elementary-default-settings.gsettings-override $out/share/glib-2.0/schemas/20-io.elementary.desktop.gschema.override
+
+    mkdir $out/etc/wingpanel.d
+    cp -avr ${./io.elementary.greeter.whitelist} $out/etc/wingpanel.d/io.elementary.greeter.whitelist
+
+    mkdir -p $out/share/elementary/config/plank/dock1
+    cp -avr ${./launchers} $out/share/elementary/config/plank/dock1/launchers
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Default settings and configuration files for elementary";
+    homepage = https://github.com/elementary/default-settings;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist
new file mode 100644
index 000000000000..0cff31f4f777
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist
@@ -0,0 +1,6 @@
+liba11y.so
+libbluetooth.so
+libkeyboard.so
+libnetwork.so
+libpower.so
+libsession.so
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
new file mode 100644
index 000000000000..b25bb8c85904
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/gala-multitaskingview.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
new file mode 100644
index 000000000000..3bd7d531840d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.calendar.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
new file mode 100644
index 000000000000..494edde183ca
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.music.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
new file mode 100644
index 000000000000..89536754964d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.photos.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
new file mode 100644
index 000000000000..312c35d9bf00
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.switchboard.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
new file mode 100644
index 000000000000..3b0f721a5644
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.videos.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
new file mode 100644
index 000000000000..b0218bac52d7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/org.gnome.Epiphany.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem
new file mode 100644
index 000000000000..8b04efe417ea
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/org.gnome.Geary.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch
new file mode 100644
index 000000000000..626e56ce5960
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch
@@ -0,0 +1,25 @@
+From 2384bee55a46eac44eb9d329be4c2a097e053ae1 Mon Sep 17 00:00:00 2001
+From: worldofpeace <worldofpeace@users.noreply.github.com>
+Date: Tue, 17 Jul 2018 07:04:18 -0400
+Subject: [PATCH 1/1] 'sysconfdir' will be etc not /etc for install
+
+---
+ data/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/meson.build b/data/meson.build
+index 7621b03..7c08eaf 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -20,7 +20,7 @@ i18n.merge_file (
+ 
+ install_data(
+     meson.project_name() + '.conf',
+-    install_dir: join_paths(get_option('sysconfdir'), 'lightdm')
++    install_dir: join_paths(get_option('prefix'), 'etc', 'lightdm')
+ )
+ 
+ install_data(
+-- 
+2.17.1
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
new file mode 100644
index 000000000000..303aae6882b8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
@@ -0,0 +1,103 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, substituteAll, makeWrapper, meson
+, ninja, vala, desktop-file-utils, gtk3, granite, libgee, elementary-settings-daemon
+, gnome-desktop, mutter, gobject-introspection, elementary-icon-theme, wingpanel-with-indicators
+, elementary-gtk-theme, nixos-artwork, elementary-default-settings, lightdm, numlockx
+, clutter-gtk, libGL, dbus, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "greeter";
+  version = "3.3.1";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1vkq4z0hrmvzv4sh2qkxjajdxcycd1zj97a3pc8n4yb858pqfyzc";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    clutter-gtk
+    elementary-icon-theme
+    elementary-gtk-theme
+    elementary-settings-daemon
+    gnome-desktop
+    granite
+    gtk3
+    libgee
+    libGL
+    lightdm
+    mutter
+    wingpanel-with-indicators
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./gsd.patch;
+      elementary-settings-daemon = "${elementary-settings-daemon}/libexec";
+    })
+    (substituteAll {
+      src = ./numlockx.patch;
+      inherit numlockx;
+    })
+    ./01-sysconfdir-install.patch
+  ];
+
+  mesonFlags = [
+    # A hook does this but after wrapGAppsHook so the files never get wrapped.
+    "--sbindir=${placeholder "out"}/bin"
+    # baked into the program for discovery of the greeter configuration
+    "--sysconfdir=/etc"
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # GTK+ reads default settings (such as icons and themes) from elementary's settings.ini here
+      --prefix XDG_CONFIG_DIRS : "${elementary-default-settings}/etc"
+
+      # dbus-launch needed in path
+      --prefix PATH : "${dbus}/bin"
+
+      # for `wingpanel -g`
+      --prefix PATH : "${wingpanel-with-indicators}/bin"
+
+      # TODO: they should be using meson for this
+      # See: https://github.com/elementary/greeter/blob/19c0730fded4e9ddec5a491f0e78f83c7c04eb59/src/PantheonGreeter.vala#L451
+      --prefix PATH : "$out/bin"
+    )
+  '';
+
+  postFixup = ''
+    substituteInPlace $out/share/xgreeters/io.elementary.greeter.desktop \
+      --replace  "Exec=io.elementary.greeter" "Exec=$out/bin/io.elementary.greeter"
+
+    substituteInPlace $out/etc/lightdm/io.elementary.greeter.conf \
+      --replace "#default-wallpaper=/usr/share/backgrounds/elementaryos-default" "default-wallpaper=${nixos-artwork.wallpapers.simple-dark-gray}/share/artwork/gnome/nix-wallpaper-simple-dark-gray.png"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "LightDM Greeter for Pantheon";
+    homepage = https://github.com/elementary/greeter;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch
new file mode 100644
index 000000000000..1770d54aee0d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch
@@ -0,0 +1,13 @@
+diff --git a/src/meson.build b/src/meson.build
+index 2450c1a..a908d11 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -1,7 +1,7 @@
+ conf_data = configuration_data()
+ conf_data.set('CONF_DIR', join_paths(get_option('sysconfdir'), 'lightdm'))
+ conf_data.set('GETTEXT_PACKAGE', meson.project_name())
+-conf_data.set('GSD_DIR', '/usr/lib/gnome-settings-daemon/')
++conf_data.set('GSD_DIR', '@elementary-settings-daemon@')
+ conf_data.set('VERSION', meson.project_version())
+ config_header = configure_file (
+     input: 'config.vala.in',
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch
new file mode 100644
index 000000000000..2c7766b4284c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch
@@ -0,0 +1,13 @@
+diff --git a/src/PantheonGreeter.vala b/src/PantheonGreeter.vala
+index 11aa4c0..ae7bf7e 100644
+--- a/src/PantheonGreeter.vala
++++ b/src/PantheonGreeter.vala
+@@ -163,7 +163,7 @@ public class PantheonGreeter : Gtk.Window {
+             warning (e.message);
+         }
+         if (activate_numlock) {
+-            Granite.Services.System.execute_command ("/usr/bin/numlockx on");
++            Granite.Services.System.execute_command ("@numlockx@/bin/numlockx on");
+         }
+ 
+         var screensaver_timeout = 60;
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
new file mode 100644
index 000000000000..bd5688f941b2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, runCommand, gnome3, elementary-default-settings, nixos-artwork, glib, gala, epiphany, elementary-settings-daemon, gtk3, plank
+, extraGSettingsOverrides ? ""
+, extraGSettingsOverridePackages ? []
+}:
+
+let
+
+  gsettingsOverridePackages = [
+    gala
+    epiphany
+    elementary-settings-daemon
+    gnome3.mutter
+    gtk3
+    plank
+  ] ++ extraGSettingsOverridePackages;
+
+in
+
+with stdenv.lib;
+
+# TODO: Having https://github.com/NixOS/nixpkgs/issues/54150 would supersede this
+runCommand "elementary-gsettings-desktop-schemas" {}
+  ''
+     mkdir -p $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas
+     cp -rf ${gnome3.gsettings-desktop-schemas}/share/gsettings-schemas/gsettings-desktop-schemas*/glib-2.0/schemas/*.xml $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas
+
+     ${concatMapStrings (pkg: "cp -rf ${pkg}/share/gsettings-schemas/*/glib-2.0/schemas/*.xml $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas\n") gsettingsOverridePackages}
+
+     chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides
+     cp ${elementary-default-settings}/share/glib-2.0/schemas/20-io.elementary.desktop.gschema.override \
+     $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas
+
+     cat - > $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/nixos-defaults.gschema.override <<- EOF
+     [org.gnome.desktop.background]
+     draw-background=true
+     picture-options='zoom'
+     picture-uri='${nixos-artwork.wallpapers.simple-dark-gray}/share/artwork/gnome/nix-wallpaper-simple-dark-gray.png'
+     primary-color='#000000'
+
+     ${extraGSettingsOverrides}
+     EOF
+
+     ${glib.dev}/bin/glib-compile-schemas $out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas/
+  ''
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
new file mode 100644
index 000000000000..d8634b48570d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, ninja, pkgconfig, vala, gtk3 }:
+
+stdenv.mkDerivation rec {
+  pname = "print";
+  version = "0.1.3";
+
+  name = "elementary-print-shim-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1w3cfap7j42x14mqpfqdm46hk5xc0v5kv8r6wxcnknr3sfxi8qlp";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}-shim";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkgconfig
+    vala
+  ];
+
+  buildInputs = [ gtk3 ];
+
+  meta = with stdenv.lib; {
+    description = "Simple shim for printing support via Contractor";
+    homepage = https://github.com/elementary/print;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop
new file mode 100644
index 000000000000..517a9457ae10
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Type=Application
+Name=Instantiate Default elementary dockitems
+Exec=@script@
+StartupNotify=false
+NoDisplay=true
+OnlyShowIn=Pantheon;
+X-GNOME-Autostart-Phase=EarlyInitialization
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
new file mode 100644
index 000000000000..fddd4143616e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
@@ -0,0 +1,107 @@
+{ stdenv, fetchFromGitHub, substituteAll, writeScript, pantheon, gnome-keyring, gnome-session, wingpanel, orca, at-spi2-core, elementary-default-settings, writeTextFile, writeShellScriptBin, elementary-settings-daemon }:
+
+let
+
+  #
+  # ─── ENSURES PLANK GETS ELEMENTARY'S DEFAULT DOCKITEMS ────────────────────────────
+  #
+
+  #
+  # Upstream relies on /etc/skel to initiate a new users home directory with planks dockitems.
+  #
+  # That is not possible within nixos, but we can achieve this easily with a simple script that copies
+  # them. We then use a xdg autostart and initalize it during the "EarlyInitialization" phase of a gnome session
+  # which is most appropriate for installing files into $HOME.
+  #
+
+  dockitems-script = writeScript "dockitems-script" ''
+    #!${stdenv.shell}
+
+    elementary_default_settings="${elementary-default-settings}"
+    dock_items="$elementary_default_settings/share/elementary/config/plank/dock1/launchers"/*
+
+    if [ ! -d "$HOME/.config/plank/dock1" ]; then
+        echo "Instantiating default Plank Dockitems..."
+
+        mkdir -p $HOME/.config/plank/dock1/launchers
+        cp -r --no-preserve=mode,ownership $dock_items $HOME/.config/plank/dock1/launchers/
+    else
+        echo "Plank Dockitems already instantiated"
+    fi
+  '';
+
+  dockitemAutostart = substituteAll {
+    src = ./default-elementary-dockitems.desktop;
+    script = "${dockitems-script}";
+  };
+
+  executable = writeShellScriptBin "pantheon" ''
+    export XDG_CONFIG_DIRS=${elementary-settings-daemon}/etc/xdg:$XDG_CONFIG_DIRS
+    export XDG_DATA_DIRS=${placeholder "out"}/share:$XDG_DATA_DIRS
+    exec ${gnome-session}/bin/gnome-session --session=pantheon "$@"
+  '';
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "session-settings";
+  version = "5.0.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1vrjm7bklkfv0dyafm312v4hxzy6lb7p1ny4ijkn48kr719gc71k";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share
+    cp -avr applications $out/share/
+
+    mkdir -p $out/etc/xdg/autostart
+    cp -av ${gnome-keyring}/etc/xdg/autostart/* $out/etc/xdg/autostart
+    cp -av ${orca}/etc/xdg/autostart/* $out/etc/xdg/autostart
+    cp -av ${at-spi2-core}/etc/xdg/autostart/* $out/etc/xdg/autostart
+
+    cp "${dockitemAutostart}" $out/etc/xdg/autostart/default-elementary-dockitems.desktop
+
+    mkdir -p $out/share/gnome-session/sessions
+    cp -av gnome-session/pantheon.session $out/share/gnome-session/sessions
+
+    mkdir -p $out/share/xsessions
+    cp -av xsessions/pantheon.desktop $out/share/xsessions
+  '';
+
+  postFixup = ''
+    substituteInPlace $out/share/xsessions/pantheon.desktop \
+      --replace "gnome-session --session=pantheon" "${executable}/bin/pantheon" \
+      --replace "wingpanel" "${wingpanel}/bin/wingpanel"
+
+    for f in $out/etc/xdg/autostart/*; do mv "$f" "''${f%.desktop}-pantheon.desktop"; done
+
+    for autostart in $(grep -rl "OnlyShowIn=GNOME;" $out/etc/xdg/autostart)
+    do
+      echo "Patching OnlyShowIn to Pantheon in: $autostart"
+      sed -i "s,OnlyShowIn=GNOME;,OnlyShowIn=Pantheon;," $autostart
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Session settings for elementary";
+    homepage = https://github.com/elementary/session-settings;
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
new file mode 100644
index 000000000000..6ceebf1980c6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala, libxml2, desktop-file-utils
+, gtk3, glib, granite, libgee, elementary-icon-theme, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "shortcut-overlay";
+  version = "1.0.1";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1ph4rx2l5fn0zh4fjfjlgbgskmzc0lvzqgcv7v4kr5m4rij1p4y4";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    glib
+    granite
+    gtk3
+    libgee
+  ];
+
+  meta = with stdenv.lib; {
+    description = "A native OS-wide shortcut overlay to be launched by Gala";
+    homepage = https://github.com/elementary/shortcut-overlay;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix
new file mode 100644
index 000000000000..4e19a65b58d4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, substituteAll, fetchFromGitHub, file-roller, gnome-bluetooth }:
+
+stdenv.mkDerivation rec {
+  pname = "extra-elementary-contracts";
+  version = "2018-08-21";
+
+  name = "${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "worldofpeace";
+    repo = pname;
+    rev = "a05dfb00695854163805b666185e3e9f31b6eb83";
+    sha256 = "0fkaf2w4xg0n9faj74rgzy7gvd3yz112l058b157a3pr39vpci7g";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./exec-path.patch;
+      file_roller = "${file-roller}";
+      gnome_bluetooth = "${gnome-bluetooth}";
+    })
+  ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/contractor
+
+    cp *.contract $out/share/contractor/
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Extra contractor files for elementary";
+    homepage = https://github.com/worldofpeace/extra-elementary-contracts;
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ worldofpeace ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch
new file mode 100644
index 000000000000..3b97e306119d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch
@@ -0,0 +1,34 @@
+diff --git a/file-roller-compress.contract b/file-roller-compress.contract
+index 8de5396..de7e939 100644
+--- a/file-roller-compress.contract
++++ b/file-roller-compress.contract
+@@ -3,6 +3,6 @@ Name=Compress
+ Icon=add-files-to-archive
+ Description=Create a compressed archive with the selected objects
+ MimeType=!archive;inode/blockdevice;inode/chardevice;inode/fifo;inode/socket;
+-Exec=file-roller --add %U
++Exec=@file_roller@/bin/file-roller --add %U
+ Gettext-Domain=file-roller
+ 
+diff --git a/file-roller-extract-here.contract b/file-roller-extract-here.contract
+index 184a6f2..345f4e7 100644
+--- a/file-roller-extract-here.contract
++++ b/file-roller-extract-here.contract
+@@ -3,5 +3,5 @@ Name=Extract Here
+ Icon=extract-archive
+ Description=Extract the contents of the archives in the archive folder and quit the program
+ MimeType=application/x-7z-compressed;application/x-7z-compressed-tar;application/x-ace;application/x-alz;application/x-ar;application/x-arj;application/x-bzip;application/x-bzip-compressed-tar;application/x-bzip1;application/x-bzip1-compressed-tar;application/x-cabinet;application/x-cbr;application/x-cbz;application/x-cd-image;application/x-compress;application/x-compressed-tar;application/x-cpio;application/x-deb;application/x-ear;application/x-ms-dos-executable;application/x-gtar;application/x-gzip;application/x-gzpostscript;application/x-java-archive;application/x-lha;application/x-lhz;application/x-lrzip;application/x-lrzip-compressed-tar;application/x-lzip;application/x-lzip-compressed-tar;application/x-lzma;application/x-lzma-compressed-tar;application/x-lzop;application/x-lzop-compressed-tar;application/x-ms-wim;application/x-rar;application/x-rar-compressed;application/x-rpm;application/x-rzip;application/x-tar;application/x-tarz;application/x-stuffit;application/x-war;application/x-xz;application/x-xz-compressed-tar;application/x-zip;application/x-zip-compressed;application/x-zoo;application/zip;
+-Exec=file-roller --extract-here %U
++Exec=@file_roller@/bin/file-roller --extract-here %U
+ Gettext-Domain=file-roller
+diff --git a/gnome-bluetooth.contract b/gnome-bluetooth.contract
+index 745dbbe..8cc0102 100644
+--- a/gnome-bluetooth.contract
++++ b/gnome-bluetooth.contract
+@@ -3,5 +3,5 @@ Name=Send files via Bluetooth
+ Icon=bluetooth
+ Description=Send files to device...
+ MimeType=!inode;
+-Exec=bluetooth-sendto %F
++Exec=@gnome_bluetooth@/bin/bluetooth-sendto %F
+ Gettext-Domain=gnome-bluetooth2
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix
new file mode 100644
index 000000000000..97acc2c791bf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix
@@ -0,0 +1,66 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, python3, ninja, vala
+, desktop-file-utils, gettext, libxml2, gtk3, granite, libgee, bamf, libcanberra
+, libcanberra-gtk3, gnome-desktop, mutter, clutter, plank, gobject-introspection
+, elementary-icon-theme, elementary-settings-daemon, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "gala";
+  version = "unstable-2018-12-16";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = "7f1e392e03000df0bd47e7832bb3adab81f39ae5";
+    sha256 = "1syqq0xfyg5nbnnmy0wp5d66k1bvq9qn27lvr37abxxqig9acpc8";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      versionPolicy = "master";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    bamf
+    clutter
+    elementary-icon-theme
+    gnome-desktop
+    elementary-settings-daemon
+    granite
+    gtk3
+    libcanberra
+    libcanberra-gtk3
+    libgee
+    mutter
+    plank
+  ];
+
+  patches = [ ./plugins-dir.patch ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/post_install.py
+    patchShebangs build-aux/meson/post_install.py
+  '';
+
+  meta =  with stdenv.lib; {
+    description = "A window & compositing manager based on mutter and designed by elementary for use with Pantheon";
+    homepage = https://github.com/elementary/gala;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
new file mode 100644
index 000000000000..e83308ea5526
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
@@ -0,0 +1,22 @@
+diff --git a/meson.build b/meson.build
+index 6b20a60..205699b 100644
+--- a/meson.build
++++ b/meson.build
+@@ -38,7 +38,7 @@ conf.set_quoted('PACKAGE_VERSION', gala_version)
+ conf.set_quoted('DATADIR', data_dir)
+ conf.set_quoted('PKGDATADIR', pkgdata_dir)
+ conf.set_quoted('PKGLIBDIR', pkglib_dir)
+-conf.set_quoted('PLUGINSDIR', plugins_dir)
++conf.set_quoted('PLUGINSDIR',  '/run/current-system/sw/lib/gala/plugins')
+ conf.set_quoted('RELEASE_NAME', 'Window Manager.')
+ conf.set_quoted('VERSION', gala_version)
+ conf.set_quoted('VERSION_INFO', (is_release ? 'Release' : 'Development'))
+@@ -83,7 +83,7 @@ add_project_arguments([
+ 		'-DDATADIR="@0@"'.format(data_dir),
+ 		'-DPKGDATADIR="@0@"'.format(pkgdata_dir),
+ 		'-DPKGLIBDIR="@0@"'.format(pkglib_dir),
+-		'-DPLUGINDIR="@0@"'.format(plugins_dir),
++		'-DPLUGINDIR="@0@"'.format('/run/current-system/sw/lib/gala/plugins'),
+ 		'-DSCHEMA="org.pantheon.desktop.gala"',
+ 		'-DRESOURCEPATH="/org/pantheon/desktop/gala"',
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch
new file mode 100644
index 000000000000..264a4a5b26da
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch
@@ -0,0 +1,24 @@
+diff --git a/lib/synapse-plugins/calculator-plugin.vala b/lib/synapse-plugins/calculator-plugin.vala
+index 1b5fa06..076c0c7 100644
+--- a/lib/synapse-plugins/calculator-plugin.vala
++++ b/lib/synapse-plugins/calculator-plugin.vala
+@@ -51,9 +51,7 @@ namespace Synapse {
+                                                                     _("Calculator"),
+                                                                     _("Calculate basic expressions."),
+                                                                     "accessories-calculator",
+-                                                                    register_plugin,
+-                                                                    Environment.find_program_in_path ("bc") != null,
+-                                                                    _("bc is not installed"));
++                                                                    register_plugin);
+         }
+ 
+         static construct {
+@@ -90,7 +88,7 @@ namespace Synapse {
+             if (matched) {
+                 Pid pid;
+                 int read_fd, write_fd;
+-                string[] argv = {"bc", "-l"};
++                string[] argv = {"@exec@", "-l"};
+                 string? solution = null;
+ 
+                 try {
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
new file mode 100644
index 000000000000..e4f7df107ba8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
@@ -0,0 +1,72 @@
+{ stdenv, fetchFromGitHub, pantheon, substituteAll, cmake, ninja
+, pkgconfig, vala, granite, libgee, gettext, gtk3, appstream, gnome-menus
+, json-glib, plank, bamf, switchboard, libunity, libsoup, wingpanel, libwnck3
+, zeitgeist, gobject-introspection, elementary-icon-theme, bc, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "applications-menu";
+  version = "2.4.2";
+
+  name = "wingpanel-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0y7kh50ixvm4m56v18c70s05hhpfp683c4qi3sxy50p2368d772x";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "wingpanel-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    cmake
+    ninja
+    gettext
+    gobject-introspection
+    pkgconfig
+    vala
+    wrapGAppsHook
+   ];
+
+  buildInputs = [
+    bamf
+    elementary-icon-theme
+    gnome-menus
+    granite
+    gtk3
+    json-glib
+    libgee
+    libsoup
+    libunity
+    libwnck3
+    plank
+    switchboard
+    wingpanel
+    zeitgeist
+   ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+  PKG_CONFIG_SWITCHBOARD_2_0_PLUGSDIR = "lib/switchboard";
+
+  patches = [
+    (substituteAll {
+      src = ./bc.patch;
+      exec = "${bc}/bin/bc";
+    })
+    ./xdg.patch
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Lightweight and stylish app launcher for Pantheon";
+    homepage = https://github.com/elementary/applications-menu;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch
new file mode 100644
index 000000000000..f17e2581e07e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch
@@ -0,0 +1,13 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 928976a..7f0ea58 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -90,7 +90,7 @@ link_directories (${DEPS_LIBRARY_DIRS})
+ 
+ # Installation
+ install (TARGETS ${APPNAME} RUNTIME DESTINATION bin)
+-install (FILES ${applications_menu} DESTINATION /etc/xdg/menus)
++install (FILES ${applications_menu} DESTINATION etc/xdg/menus)
+ file (GLOB resources "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
+ 
+ # Settings schema
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
new file mode 100644
index 000000000000..16f3ae2e28e0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
@@ -0,0 +1,56 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, python3
+, ninja, vala, gtk3, granite, libnotify, wingpanel, libgee, libxml2
+, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-bluetooth";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1gx0xglp6b3znxl4d2vpzhfkxz5z8q04hh7z2mrihj1in155bn44";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    libnotify
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Bluetooth Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-bluetooth;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch
new file mode 100644
index 000000000000..2370fbcd3cb2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Widgets/calendar/Calendar.vala b/src/Widgets/calendar/Calendar.vala
+index 76443ca..d86bd44 100644
+--- a/src/Widgets/calendar/Calendar.vala
++++ b/src/Widgets/calendar/Calendar.vala
+@@ -19,7 +19,7 @@
+
+ namespace DateTime.Widgets {
+     public class Calendar : Gtk.Box {
+-        private const string CALENDAR_EXEC = "/usr/bin/io.elementary.calendar";
++        private const string CALENDAR_EXEC = "@elementary-calendar@";
+
+         ControlHeader heading;
+         CalendarView cal;
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
new file mode 100644
index 000000000000..ee5cd5118186
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
@@ -0,0 +1,71 @@
+{ stdenv, fetchFromGitHub, fetchpatch, pantheon, pkgconfig, meson, python3
+, ninja, substituteAll, vala, gtk3, granite, wingpanel, evolution-data-server
+, libical, libgee, libxml2, libsoup, gobject-introspection
+, elementary-calendar, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-datetime";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1y7a4xjwl3bpls56ys6g3s6mh5b3qbjm2vw7b6n2i4x7a63c4cbh";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    evolution-data-server
+    granite
+    gtk3
+    libgee
+    libical
+    libsoup
+    wingpanel
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./calendar-exec.patch;
+      elementary-calendar = "${elementary-calendar}/bin/io.elementary.calendar";
+    })
+    # Use "clock-format" GSettings key that's been moved to granite
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/wingpanel-indicator-datetime/raw/c8d515b76aa812c141212d5515621a6febd781a3/f/00-move-clock-format-settings-to-granite.patch";
+      sha256 = "1sq3aw9ckkm057rnrclnw9lyrxbpl37fyzfnbixi2q3ypr70n880";
+    })
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Date & Time Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-datetime;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
new file mode 100644
index 000000000000..e2faccedbb70
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja
+, substituteAll, vala, gtk3, granite, libxml2, wingpanel, libgee
+, xorg, libgnomekbd, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-keyboard";
+  version = "2.1.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0x0bdd9svw4sffx8pa0pqlh6mrj3fqp4mgrb4n7ys26k2w20ngnb";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    libxml2
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      libgnomekbd_path = "${libgnomekbd}/bin/";
+      config = "${xorg.xkeyboardconfig}/share/X11/xkb/rules/evdev.xml";
+    })
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  meta = with stdenv.lib; {
+    description = "Keyboard Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-keyboard;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
new file mode 100644
index 000000000000..58e6853e606e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
@@ -0,0 +1,26 @@
+diff --git a/src/Indicator.vala b/src/Indicator.vala
+index cd7ca49..0bef9c7 100644
+--- a/src/Indicator.vala
++++ b/src/Indicator.vala
+@@ -94,7 +94,7 @@ public class Keyboard.Indicator : Wingpanel.Indicator {
+     private void show_keyboard_map () {
+         close ();
+ 
+-        string command = "gkbd-keyboard-display \"--layout=" + layouts.get_current_with_variant () + "\"";
++        string command = "@libgnomekbd_path@gkbd-keyboard-display \"--layout=" + layouts.get_current_with_variant () + "\"";
+ 
+         try {
+             AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE).launch (null, null);
+diff --git a/src/LayoutsManager.vala b/src/LayoutsManager.vala
+index 1bac80e..67df847 100644
+--- a/src/LayoutsManager.vala
++++ b/src/LayoutsManager.vala
+@@ -97,7 +97,7 @@ public class Keyboard.Widgets.LayoutManager : Gtk.ScrolledWindow {
+ 
+     public string? get_name_for_xkb_layout (string language, string? variant) {
+         debug ("get_name_for_xkb_layout (%s, %s)", language, variant);
+-        Xml.Doc* doc = Xml.Parser.parse_file ("/usr/share/X11/xkb/rules/evdev.xml");
++        Xml.Doc* doc = Xml.Parser.parse_file ("@config@");
+         if (doc == null) {
+             critical ("'evdev.xml' not found or permissions incorrect\n");
+             return null;
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
new file mode 100644
index 000000000000..245e12d45919
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala
+, gtk3, granite, networkmanager, networkmanagerapplet, wingpanel
+, libgee, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-network";
+  version = "2.2.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0fch27imk5x4nfx49cwcylkxd7m289rl9niy1vx5kjplhbhyhdq2";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    networkmanager
+    networkmanagerapplet
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  meta = with stdenv.lib; {
+    description = "Network Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-network;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
new file mode 100644
index 000000000000..53754c31d874
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala
+, gtk3, granite, wingpanel, libgee, libxml2, gobject-introspection
+, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-nightlight";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "17pa048asbkhzz5945hjp96dnghdl72nqp1zq0b999nawnfrb339";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  meta = with stdenv.lib; {
+    description = "Night Light Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-nightlight;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
new file mode 100644
index 000000000000..aff7d9891adf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, vala, gtk3, granite
+, wingpanel, libgee, libwnck3, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-notifications";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1960s3xcsx6yjlnk0csf1m66s1z1sj5rym9b2fy7pm2nan47z3ld";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    libwnck3
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  meta = with stdenv.lib; {
+    description = "Notifications Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-notifications;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
new file mode 100644
index 000000000000..d7627c511001
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, python3
+, ninja, vala, gtk3, granite, bamf, libgtop, udev, wingpanel
+, libgee, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-power";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "02gp9m9zkmhcl43nz02kjkcim4zm25zab3il8dhwkihh731g1c6j";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    bamf
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    libgtop
+    udev
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Power Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-power;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
new file mode 100644
index 000000000000..b910f6a71809
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson
+, ninja, vala, gtk3, granite, wingpanel, accountsservice
+, libgee, gobject-introspection, elementary-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-session";
+  version = "2.2.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "15ghhiabk74m7fm5pzr2qmdwpc330jczvvkwbf5pf7qczfyipjln";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    accountsservice
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  meta = with stdenv.lib; {
+    description = "Session Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-session;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
new file mode 100644
index 000000000000..003e431bcf7e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson
+, python3, ninja, vala, gtk3, granite, wingpanel, libnotify
+, pulseaudio, libcanberra-gtk3, libgee, libxml2, wrapGAppsHook
+, gobject-introspection, elementary-icon-theme }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-sound";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0hxbr5dp8d1czq8ffw339r41c7srqb72vr48hxph8g091d3mcgcl";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    libxml2
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libcanberra-gtk3
+    libgee
+    libnotify
+    pulseaudio
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "lib/wingpanel";
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Sound Indicator for Wingpanel";
+    homepage = https://github.com/elementary/wingpanel-indicator-sound;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
new file mode 100644
index 000000000000..a5ca227bbc20
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
@@ -0,0 +1,61 @@
+{ stdenv, fetchFromGitHub, pantheon, wrapGAppsHook, pkgconfig, meson, ninja
+, vala, gala, gtk3, libgee, granite, gettext, glib-networking, mutter, json-glib
+, python3, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel";
+  version = "2.2.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1knkqh9q6yp7qf27zi6ki20fq4w0ia2hklvv84ivfmfa0irz0j6r";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    glib-networking
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gala
+    granite
+    gtk3
+    json-glib
+    libgee
+    mutter
+  ];
+
+  patches = [ ./indicators.patch ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "The extensible top panel for Pantheon";
+    longDescription = ''
+      Wingpanel is an empty container that accepts indicators as extensions,
+      including the applications menu.
+    '';
+    homepage = https://github.com/elementary/wingpanel;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
new file mode 100644
index 000000000000..68a5fd532a8d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
@@ -0,0 +1,21 @@
+diff --git a/lib/IndicatorManager.vala b/lib/IndicatorManager.vala
+index a99a1ec..0ae7799 100644
+--- a/lib/IndicatorManager.vala
++++ b/lib/IndicatorManager.vala
+@@ -115,7 +115,15 @@ public class Wingpanel.IndicatorManager : GLib.Object {
+         }
+ 
+         /* load indicators */
+-        var base_folder = File.new_for_path (Build.INDICATORS_DIR);
++
++        var indicators_path = Environment.get_variable("WINGPANEL_INDICATORS_PATH");
++        if (indicators_path != null) {
++            debug ("WINGPANEL_INDICATORS_PATH set to %s", indicators_path);
++        } else {
++            critical ("WINGPANEL_INDICATORS_PATH not set");
++        }
++
++        var base_folder = File.new_for_path (indicators_path);
+ 
+         try {
+             monitor = base_folder.monitor_directory (FileMonitorFlags.NONE, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
new file mode 100644
index 000000000000..cfae604d3a53
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
@@ -0,0 +1,23 @@
+{ lib, makeWrapper, symlinkJoin, wingpanel, wingpanelIndicators, switchboard-with-plugs, indicators ? null }:
+
+let
+  selectedIndicators = if indicators == null then wingpanelIndicators else indicators;
+in
+symlinkJoin {
+  name = "${wingpanel.name}-with-indicators";
+
+  paths = [ wingpanel ] ++ selectedIndicators;
+
+  buildInputs = [ makeWrapper ];
+
+  # We have to set SWITCHBOARD_PLUGS_PATH because wingpanel-applications-menu
+  # has a plugin to search switchboard settings
+  postBuild = ''
+    wrapProgram $out/bin/wingpanel \
+      --set WINGPANEL_INDICATORS_PATH "$out/lib/wingpanel" \
+      --set SWITCHBOARD_PLUGS_PATH "${switchboard-with-plugs}/lib/switchboard" \
+      --suffix XDG_DATA_DIRS : ${lib.concatMapStringsSep ":" (indicator: ''${indicator}/share/gsettings-schemas/${indicator.name}'') selectedIndicators}
+  '';
+
+  inherit (wingpanel) meta;
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/granite/default.nix b/nixpkgs/pkgs/desktops/pantheon/granite/default.nix
new file mode 100644
index 000000000000..66ba331ddcdc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/granite/default.nix
@@ -0,0 +1,63 @@
+{ stdenv, fetchFromGitHub, fetchpatch, python3, meson, ninja, vala, pkgconfig, gobject-introspection, libgee, pantheon, gtk3, glib, gettext, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "granite";
+  version = "5.2.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "10ddq1s2w4jvpzq813cylmqhh8pggzaz890fy3kzg07275i98gah";
+  };
+
+  patches = [
+    # Resolve the circular dependency between granite and the datetime wingpanel indicator
+    # See: https://github.com/elementary/granite/pull/242
+    (fetchpatch {
+      url = "https://src.fedoraproject.org/rpms/granite/raw/0550b44ed6400c9b1ff7e70871913747df2ff323/f/00-datetime-clock-format-gsettings.patch";
+      sha256 = "0i9yvdmn77x5fjdwd1raw6ym8js8yxa7w6ydc7syx7hcyls00dmq";
+    })
+  ];
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    hicolor-icon-theme
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "An extension to GTK+ used by elementary OS";
+    longDescription = ''
+      Granite is a companion library for GTK+ and GLib. Among other things, it provides complex widgets and convenience functions
+      designed for use in apps built for elementary OS.
+    '';
+    homepage = https://github.com/elementary/granite;
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/cerbere/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/cerbere/default.nix
new file mode 100644
index 000000000000..59983469c114
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/cerbere/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, python3, ninja, glib, libgee, vala, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "cerbere";
+  version = "0.2.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0f9jr6q5z6nir5b77f96wm9rx6r6s9i0sr1yrymg3n7jyjgrvdwp";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A simple service to ensure uptime of essential processes";
+    homepage = https://github.com/elementary/cerbere;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix
new file mode 100644
index 000000000000..a979b1341954
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchFromGitHub, pantheon, meson, python3, ninja, pkgconfig, vala, glib, libgee, dbus, glib-networking, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  pname = "contractor";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1jzqv7pglhhyrkj1pfk1l624zn1822wyl5dp6gvwn4sk3iqxwwhl";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    dbus
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    glib
+    glib-networking
+    libgee
+  ];
+
+  PKG_CONFIG_DBUS_1_SESSION_BUS_SERVICES_DIR = "share/dbus-1/services";
+
+  meta = with stdenv.lib; {
+    description = "A desktop-wide extension service used by elementary OS";
+    homepage = https://github.com/elementarycontractor;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix
new file mode 100644
index 000000000000..e77948ccf295
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix
@@ -0,0 +1,58 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, python3, ninja, vala
+, desktop-file-utils, gtk3, granite, libgee, gcr, webkitgtk, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "capnet-assist";
+  version = "2.2.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "15cnwimkmmsb4rwvgm8bizcsn1krsj6k3qc88izn79is75y6wwji";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gcr
+    granite
+    gtk3
+    libgee
+    webkitgtk
+  ];
+
+  # Not useful here or in elementary - See: https://github.com/elementary/capnet-assist/issues/3
+  patches = [ ./remove-capnet-test.patch ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A small WebKit app that assists a user with login when a captive portal is detected";
+    homepage = https://github.com/elementary/capnet-assist;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch
new file mode 100644
index 000000000000..a59c74f22b3b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch
@@ -0,0 +1,13 @@
+diff --git a/meson.build b/meson.build
+index 46c594b..ba0ea10 100644
+--- a/meson.build
++++ b/meson.build
+@@ -33,8 +33,3 @@ meson.add_install_script('meson/post_install.py')
+ 
+ subdir('data')
+ subdir('po')
+-
+-install_data(
+-    '90captive_portal_test',
+-    install_dir: join_paths(get_option('sysconfdir'), 'NetworkManager', 'dispatcher.d')
+-)
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix
new file mode 100644
index 000000000000..4dab02d50834
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchFromGitHub, pantheon, makeWrapper, lib, meson, ninja, desktop-file-utils, glib, coreutils, elementary-settings-daemon, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "dpms-helper";
+  version = "1.0";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0svfp0qyb6nx4mjl3jx4aqmb4x24m25jpi75mdis3yfr3c1xz9nh";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    makeWrapper
+    meson
+    ninja
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-settings-daemon
+    glib
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix PATH : "${stdenv.lib.makeBinPath [ glib.dev coreutils ]}")
+  '';
+
+  postFixup = ''
+    substituteInPlace $out/etc/xdg/autostart/io.elementary.dpms-helper.desktop \
+      --replace "Exec=io.elementary.dpms-helper" "Exec=$out/bin/io.elementary.dpms-helper"
+  '';
+
+  # See: https://github.com/elementary/dpms-helper/pull/10
+  postInstall = ''
+    ${glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Sets DPMS settings found in org.pantheon.dpms";
+    homepage = https://github.com/elementary/dpms-helper;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
new file mode 100644
index 000000000000..99ca20afe988
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
@@ -0,0 +1,117 @@
+{ fetchurl, fetchgit, substituteAll, stdenv, meson, ninja, pkgconfig, gnome3, perl, gettext, glib, libnotify, lcms2, libXtst
+, libxkbfile, libpulseaudio, alsaLib, libcanberra-gtk3, upower, colord, libgweather, polkit
+, geoclue2, librsvg, xf86_input_wacom, udev, libgudev, libwacom, libxslt, libxml2, networkmanager
+, docbook_xsl, wrapGAppsHook, python3, ibus, xkeyboard_config, tzdata, nss, pantheon, accountsservice }:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-settings-daemon";
+  version = "3.30.2";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gnome-settings-daemon/${stdenv.lib.versions.majorMinor version}/gnome-settings-daemon-${version}.tar.xz";
+    sha256 = "0c663csa3gnsr6wm0xfll6aani45snkdj7zjwjfzcwfh8w4a3z12";
+  };
+
+  # Source for ubuntu's patchset
+  src2 = fetchgit {
+    url = "https://git.launchpad.net/~ubuntu-desktop/ubuntu/+source/gnome-settings-daemon";
+    rev = "refs/tags/ubuntu/${version}-1ubuntu1";
+    sha256 = "02awkhw6jqm7yh812mw0nsdmsljfi8ksz8mvd2qpns5pcv002g2c";
+  };
+
+  # We've omitted the 53_sync_input_sources_to_accountsservice patch because it breaks the build.
+  # See: https://gist.github.com/worldofpeace/2f152a20b7c47895bb93239fce1c9f52
+  #
+  # Also omit ubuntu_calculator_snap.patch as that's obviously not useful here.
+  patches = let patchPath = "${src2}/debian/patches"; in [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata;
+    })
+    "${patchPath}/45_suppress-printer-may-not-be-connected-notification.patch"
+    "${patchPath}/64_restore_terminal_keyboard_shortcut_schema.patch"
+    "${patchPath}/correct_logout_action.patch"
+    "${patchPath}/ubuntu-lid-close-suspend.patch"
+    "${patchPath}/revert-wacom-migration.patch"
+    "${patchPath}/revert-gsettings-removals.patch"
+    "${patchPath}/revert-mediakeys-dbus-interface-drop.patch"
+    "${patchPath}/ubuntu_ibus_configs.patch"
+    (fetchurl {
+      url = "https://github.com/elementary/os-patches/raw/6975d1c254cb6ab913b8e2396877203aea8eaa65/debian/patches/elementary-dpms.patch";
+      sha256 = "0kh508ppiv4nvkg30gmw85cljlfq1bvkzhvf1iaxw0snb0mwgsxi";
+    })
+  ];
+
+  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
+  '';
+
+  postFixup = ''
+    for f in $out/etc/xdg/autostart/*; do mv "$f" "''${f%.desktop}-pantheon.desktop"; done
+
+    for autostart in $(grep -rl "OnlyShowIn=GNOME;" $out/etc/xdg/autostart)
+    do
+      echo "Patching OnlyShowIn to Pantheon in: $autostart"
+      sed -i "s,OnlyShowIn=GNOME;,OnlyShowIn=Pantheon;," $autostart
+    done
+
+    # This breaks lightlocker https://github.com/elementary/session-settings/commit/b0e7a2867608c3a3916f9e4e21a68264a20e44f8
+    rm $out/etc/xdg/autostart/org.gnome.SettingsDaemon.ScreensaverProxy-pantheon.desktop
+  '';
+
+  nativeBuildInputs = [
+    docbook_xsl
+    gettext
+    libxml2
+    libxslt
+    meson
+    ninja
+    perl
+    pkgconfig
+    python3
+    wrapGAppsHook
+  ];
+
+  buildInputs = with gnome3; [
+    accountsservice
+    alsaLib
+    colord
+    geoclue2
+    geocode-glib
+    glib
+    gnome-desktop
+    gsettings-desktop-schemas
+    gtk
+    ibus
+    lcms2
+    libXtst
+    libcanberra-gtk3
+    libgudev
+    libgweather
+    libnotify
+    libpulseaudio
+    librsvg
+    libwacom
+    libxkbfile
+    networkmanager
+    nss
+    polkit
+    udev
+    upower
+    xf86_input_wacom
+    xkeyboard_config
+  ];
+
+  mesonFlags = [
+    "-Dudev_dir=${placeholder "out"}/lib/udev"
+  ];
+
+  meta = with stdenv.lib; {
+    license = licenses.gpl2Plus;
+    maintainers = pantheon.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch
new file mode 100644
index 000000000000..2229302cab7c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch
@@ -0,0 +1,15 @@
+--- 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;
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix
new file mode 100644
index 000000000000..2487c4ba3af4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchFromGitHub, fetchpatch, pantheon, pkgconfig, meson, ninja, vala, glib
+, gtk3, libgee, desktop-file-utils, geoclue2, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "pantheon-agent-geoclue2";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0fww65dnbg9zn0gy1q2db39kjra50ykzw05pmn9iwxkijyxi8hm5";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+   ];
+
+  buildInputs = [
+    geoclue2
+    gtk3
+    libgee
+   ];
+
+  # This should be provided by a post_install.py script - See -> https://github.com/elementary/pantheon-agent-geoclue2/pull/21
+  postInstall = ''
+    ${glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Pantheon Geoclue2 Agent";
+    homepage = https://github.com/elementary/pantheon-agent-geoclue2;
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix
new file mode 100644
index 000000000000..4fdaa4a8bf9f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja
+, vala, gtk3, libgee, polkit, gobject-introspection, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  pname = "pantheon-agent-polkit";
+  version = "0.1.6";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1g9l2jzpvv0dbvxh93w98a7ijsfqv3s3382li4s256179gihhd67";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    libgee
+    polkit
+  ];
+
+  meta = with stdenv.lib; {
+    description = "Polkit Agent for the Pantheon Desktop";
+    homepage = https://github.com/elementary/pantheon-agent-polkit;
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/update.nix b/nixpkgs/pkgs/desktops/pantheon/update.nix
new file mode 100644
index 000000000000..48fd2f2bf858
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/update.nix
@@ -0,0 +1,18 @@
+{ stdenv, writeScript, runCommand, nix, bash, git, jq, nix-prefetch-scripts, coreutils, common-updater-scripts, gnugrep, gnused, curl }:
+{ repoName, attrPath ? repoName, versionPolicy ? "release" }:
+let
+  script = ./update.sh;
+
+  updateScript = runCommand "update.sh" {
+    inherit bash git jq nix coreutils gnugrep gnused curl;
+    # These weren't being substituted
+    nix_prefetch_scripts = nix-prefetch-scripts;
+    common_updater_scripts = common-updater-scripts;
+  } ''
+    substituteAll ${script} $out
+    chmod +x $out
+  '';
+
+  versionFlag = { "release" = "-r"; "master" = "-m"; }.${versionPolicy};
+
+in [ updateScript versionFlag repoName attrPath ]
diff --git a/nixpkgs/pkgs/desktops/pantheon/update.sh b/nixpkgs/pkgs/desktops/pantheon/update.sh
new file mode 100755
index 000000000000..9bbbe2600344
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/update.sh
@@ -0,0 +1,223 @@
+#!@bash@/bin/bash
+PATH=@bash@/bin:@nix_prefetch_scripts@/bin:@common_updater_scripts@/bin:@git@/bin:@jq@/bin:@nix@/bin:@gnugrep@/bin:@gnused@/bin:@curl@/bin:$PATH
+#!/usr/bin/env bash
+
+set -eu -o pipefail
+
+#
+# ─── HOW TO USE ─────────────────────────────────────────────────────────────────
+#
+
+function usage ( ) {
+    cat <<EOF
+Usage: update.sh <repo_name> <attr>
+EOF
+}
+
+#
+# ─── POINTS YOU IN THE RIGHT DIRECTION ──────────────────────────────────────────
+#
+
+    function usage_tip ( ) {
+      echo 'run `update.sh -h` for usage instructions' >&2
+      exit 1
+    }
+
+#
+# ─── OPTIONS: RELEASE | MASTER ────────────────────────────────────────────────────
+#
+
+    while getopts ":hrm" opt; do
+        case $opt in
+            r)
+                release=1
+                master=0
+                ;;
+            m)
+                master=1
+                release=0
+                ;;
+            h)
+                usage
+                exit
+                ;;
+            ?)
+                echo "Invalid option: -$OPTARG" >&2
+                usage_tip
+                ;;
+      esac
+    done
+
+    shift $((OPTIND-1))
+
+#
+# ─── FAIL WITH MESSAGE AND NON-ZERO EXIT STATUS ─────────────────────────────────
+#
+
+    function fail ( ) {
+        echo "$1" >&2
+        exit 1
+    }
+
+#
+# ─── UPDATES PACKAGE TO LATEST TAGGED RELEASE ───────────────────────────────
+#
+
+    function update_to_latest_release ( ) {
+        repo_name="$1"
+        attr="$2"
+
+        version=$(get_latest_tag "$repo_name")
+        fetch=$(fetch "$repo_name" "refs/tags/${version}")
+        sha256=$(get_hash "${fetch}")
+
+        update-source-version "pantheon.$attr" "$version" "$sha256"
+
+        nix_file=$(get_file_path $attr)
+
+        if [ ! -f "$nix_file" ]; then
+            fail "Couldn't evaluate 'pantheon.$attr.meta.position' to locate the .nix file!"
+        fi
+
+        correct_rev "$attr" "$nix_file" "version"
+    }
+
+#
+# ─── UPDATES PACKAGE TO MASTER ──────────────────────────────────────────────────
+#
+
+    function update_to_master ( ) {
+        repo_name="$1"
+        attr="$2"
+
+        fetch=$(fetch "$repo_name" "refs/heads/master")
+
+        version=$(get_version "$fetch")
+        sha256=$(get_hash "$fetch")
+        proper_version=$(get_master_date "$fetch")
+
+        update-source-version "pantheon.$attr" "$proper_version" "$sha256"
+
+        nix_file=$(get_file_path $attr)
+
+        if [ ! -f "$nix_file" ]; then
+            fail "Couldn't evaluate 'pantheon.$attr.meta.position' to locate the .nix file!"
+        fi
+
+        correct_rev "$attr" "$nix_file" '"'$version'"'
+    }
+
+#
+# ─── GETS THE LATEST TAGGED RELEASE NAME FROM GITHUB ─────────────────────
+#
+
+    function get_latest_tag ( ) {
+        repo_name="$1"
+
+        # Using github release api because sorting this repo just doesn't work because of old git sillyness
+        # Also too lazy to care to adapt `git ls-remote` command to work with it
+        if [ $repo_name == "switchboard-plug-pantheon-shell" ]; then
+            curl --silent --show-error --fail -X GET "https://api.github.com/repos/elementary/$repo_name/releases/latest" | jq -r '.tag_name'
+        else
+            git ls-remote --tags --sort="v:refname" "https://github.com/elementary/$repo_name" | tail -n1 | sed 's/.*\///; s/\^{}//'
+        fi
+    }
+
+#
+# ─── FETCHES REPO AND RETURNS RELEVANT INFORMATION ──────────────────
+#
+
+    function fetch ( ) {
+        repo_name="$1"
+        version="$2"
+
+        base_url="https://github.com/elementary"
+        full_url="$base_url/$repo_name"
+
+        nix-prefetch-git --quiet --no-deepClone --url "$full_url" --rev "$version"
+    }
+
+#
+# ─── PARSES GIT REVISION FROM FETCH ─────────────────────────────────────────────
+#
+
+    function get_version ( ) {
+        fetch_info="$1"
+
+        echo "$fetch_info" | jq -r '.rev'
+    }
+
+#
+# ─── PARSES HASH FROM FETCH ─────────────────────────────────────────────────────
+#
+
+    function get_hash ( ) {
+        fetch_info="$1"
+
+        echo "$fetch_info" | jq -r '.sha256'
+    }
+
+#
+# ─── PARSES DATE FROM FETCH AND NORMALIZES IT TO NIXPKGS STANDARD ───────────────
+#
+
+    function get_master_date ( ) {
+        fetch_info="$1"
+
+        full_date=$(echo "$fetch_info" | jq -r '.date')
+        short_date=$(date -d "$full_date" +"%Y-%m-%d")
+
+        echo "unstable-$short_date"
+    }
+
+#
+# ─── RETURN NIX EXPRESSION PATH ─────────────────────────────────────────────────
+#
+
+    function get_file_path () {
+        attr="$1"
+
+        nix-instantiate --eval --strict -A "pantheon.$attr.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/'
+    }
+
+#
+# ─── CORRECTS REV VERSION ───────────────────────────────────────────────────────────
+#
+
+    function correct_rev ( ) {
+        attr="$1"
+        nix_file="$2"
+        rev="$3"
+
+        check_pattern1='^\s*rev\s*=\s*"[0-9a-f]{5,40}"'
+        check_pattern2='^\s*rev\s*=\s*version'
+
+        replace_pattern1='/\brev\b\s*=/ s|\"[0-9a-f]{5,40}\"|'$rev'|'
+        replace_pattern2='/\brev\b\s*=/ s|version|'$rev'|'
+
+        if [ $(grep -c -P "$check_pattern1" "$nix_file") = 1 ]; then
+            pattern="$replace_pattern1"
+        elif [ $(grep -c -P "$check_pattern2" "$nix_file") = 1 ]; then
+            pattern="$replace_pattern2"
+        else
+            fail "Couldn't figure out where out where to patch in the correct version in pantheon.$attr!"
+        fi
+
+        sed -i.bak "$nix_file" -re "$pattern"
+        rm -f "$nix_file.bak"
+    }
+
+
+#
+# ─── WHETHER TO UPDATE TO RELEASE OR MASTER ──────────────────────────────────
+#
+
+    if [ $release = 1 ]; then
+        update_to_latest_release $1 $2
+    elif [ $master = 1 ]; then
+        update_to_master $1 $2
+    else
+      exit 1
+    fi
+
+# ────────────────────────────────────────────────────────────────────────────────
diff --git a/nixpkgs/pkgs/desktops/plasma-5/bluedevil.nix b/nixpkgs/pkgs/desktops/plasma-5/bluedevil.nix
new file mode 100644
index 000000000000..b5ff3f5dd05d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/bluedevil.nix
@@ -0,0 +1,14 @@
+{
+  mkDerivation, extra-cmake-modules, shared-mime-info,
+  bluez-qt, kcoreaddons, kdbusaddons, kded, ki18n, kiconthemes, kio,
+  knotifications, kwidgetsaddons, kwindowsystem, plasma-framework, qtdeclarative
+}:
+
+mkDerivation {
+  name = "bluedevil";
+  nativeBuildInputs = [ extra-cmake-modules shared-mime-info ];
+  buildInputs = [
+    bluez-qt ki18n kio kwindowsystem plasma-framework qtdeclarative kcoreaddons
+    kdbusaddons kded kiconthemes knotifications kwidgetsaddons
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/breeze-grub.nix b/nixpkgs/pkgs/desktops/plasma-5/breeze-grub.nix
new file mode 100644
index 000000000000..eed396b54375
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/breeze-grub.nix
@@ -0,0 +1,15 @@
+{
+  mkDerivation
+}:
+
+mkDerivation {
+  name = "breeze-grub";
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/grub/themes"
+    mv breeze "$out/grub/themes"
+
+    runHook postInstall
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/breeze-gtk.nix b/nixpkgs/pkgs/desktops/plasma-5/breeze-gtk.nix
new file mode 100644
index 000000000000..cc51c4b0471c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/breeze-gtk.nix
@@ -0,0 +1,14 @@
+{ mkDerivation, lib, extra-cmake-modules, gtk2, qtbase, }:
+
+let inherit (lib) getLib; in
+
+mkDerivation {
+  name = "breeze-gtk";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtbase ];
+  postPatch = ''
+    sed -i cmake/FindGTKEngine.cmake \
+      -e "s|\''${KDE_INSTALL_FULL_LIBDIR}|${getLib gtk2}/lib|"
+  '';
+  cmakeFlags = [ "-DWITH_GTK3_VERSION=3.22" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/default.nix b/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/default.nix
new file mode 100644
index 000000000000..48b038325fec
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/default.nix
@@ -0,0 +1,44 @@
+{
+  mkDerivation,
+  lib,
+  copyPathsToStore,
+  extra-cmake-modules,
+  plymouth,
+  nixos-icons,
+  imagemagick,
+  netpbm,
+  perl,
+  # these will typically need to be set via an override
+  # in a NixOS context
+  nixosBranding ? false,
+  nixosName ? "NixOS",
+  nixosVersion ? "",
+  topColor ? "black",
+  bottomColor ? "black"
+}:
+
+let
+  logoName = "nixos";
+in
+mkDerivation {
+  name = "breeze-plymouth";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ plymouth ] ++ lib.optionals nixosBranding [ imagemagick netpbm perl ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  cmakeFlags = lib.optionals nixosBranding [
+    "-DDISTRO_NAME=${nixosName}"
+    "-DDISTRO_VERSION=${nixosVersion}"
+    "-DDISTRO_LOGO=${logoName}"
+    "-DBACKGROUND_TOP_COLOR=${topColor}"
+    "-DBACKGROUND_BOTTOM_COLOR=${bottomColor}"
+  ];
+  postPatch = ''
+      substituteInPlace cmake/FindPlymouth.cmake --subst-var out
+  '' + lib.optionalString nixosBranding ''
+      cp ${nixos-icons}/share/icons/hicolor/128x128/apps/nix-snowflake.png breeze/images/${logoName}.logo.png
+
+      # conversion for 16bit taken from the breeze-plymouth readme
+      convert ${nixos-icons}/share/icons/hicolor/128x128/apps/nix-snowflake.png -alpha Background -background "#000000" -fill "#000000" -flatten tmp.png
+      pngtopnm tmp.png | pnmquant 16 | pnmtopng > breeze/images/16bit/${logoName}.logo.png
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/install-paths.patch b/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/install-paths.patch
new file mode 100644
index 000000000000..5d5856d122dd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/install-paths.patch
@@ -0,0 +1,19 @@
+Index: breeze-plymouth-5.7.3/cmake/FindPlymouth.cmake
+===================================================================
+--- breeze-plymouth-5.7.3.orig/cmake/FindPlymouth.cmake
++++ breeze-plymouth-5.7.3/cmake/FindPlymouth.cmake
+@@ -24,12 +24,8 @@
+ include(FindPkgConfig)
+ 
+ pkg_check_modules(Plymouth ply-boot-client ply-splash-core)
+-exec_program(${PKG_CONFIG_EXECUTABLE}
+-    ARGS ply-splash-core --variable=pluginsdir
+-    OUTPUT_VARIABLE Plymouth_PLUGINSDIR)
+-exec_program(${PKG_CONFIG_EXECUTABLE}
+-    ARGS ply-splash-core --variable=themesdir
+-    OUTPUT_VARIABLE Plymouth_THEMESDIR)
++set(Plymouth_PLUGINSDIR "@out@/lib/plymouth")
++set(Plymouth_THEMESDIR "@out@/share/plymouth/themes")
+ 
+ find_package_handle_standard_args(Plymouth
+     FOUND_VAR
diff --git a/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/series b/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/series
new file mode 100644
index 000000000000..8920e7ca5189
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/breeze-plymouth/series
@@ -0,0 +1 @@
+install-paths.patch
diff --git a/nixpkgs/pkgs/desktops/plasma-5/breeze-qt5.nix b/nixpkgs/pkgs/desktops/plasma-5/breeze-qt5.nix
new file mode 100644
index 000000000000..3f3222e05cdb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/breeze-qt5.nix
@@ -0,0 +1,20 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  frameworkintegration, kcmutils, kconfigwidgets, kcoreaddons, kdecoration,
+  kguiaddons, ki18n, kwayland, kwindowsystem, plasma-framework, qtdeclarative,
+  qtx11extras, fftw
+}:
+
+mkDerivation {
+  name = "breeze-qt5";
+  sname = "breeze";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [
+    frameworkintegration kcmutils kconfigwidgets kcoreaddons kdecoration
+    kguiaddons ki18n kwayland kwindowsystem plasma-framework qtdeclarative
+    qtx11extras fftw
+  ];
+  outputs = [ "bin" "dev" "out" ];
+  cmakeFlags = [ "-DUSE_Qt4=OFF" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/default.nix b/nixpkgs/pkgs/desktops/plasma-5/default.nix
new file mode 100644
index 000000000000..2c99713bcd4a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/default.nix
@@ -0,0 +1,142 @@
+/*
+
+# New packages
+
+READ THIS FIRST
+
+This module is for official packages in KDE Plasma 5. All available packages are
+listed in `./srcs.nix`, although a few are not yet packaged in Nixpkgs (see
+below).
+
+IF YOUR PACKAGE IS NOT LISTED IN `./srcs.nix`, IT DOES NOT GO HERE.
+
+Many of the packages released upstream are not yet built in Nixpkgs due to lack
+of demand. To add a Nixpkgs build for an upstream package, copy one of the
+existing packages here and modify it as necessary.
+
+# Updates
+
+1. Update the URL in `./fetch.sh`.
+2. Run `./maintainers/scripts/fetch-kde-qt.sh pkgs/desktops/plasma-5`
+   from the top of the Nixpkgs tree.
+3. Use `nox-review wip` to check that everything builds.
+4. Commit the changes and open a pull request.
+
+*/
+
+{
+  libsForQt5, lib, fetchurl,
+  gconf, gsettings-desktop-schemas
+}:
+
+let
+  srcs = import ./srcs.nix {
+    inherit fetchurl;
+    mirror = "mirror://kde";
+  };
+
+  mkDerivation = libsForQt5.callPackage ({ mkDerivation }: mkDerivation) {};
+
+  packages = self: with self;
+    let
+
+      propagate = out:
+        let setupHook = { writeScript }:
+              writeScript "setup-hook" ''
+                if [ "$hookName" != postHook ]; then
+                    postHooks+=("source @dev@/nix-support/setup-hook")
+                else
+                    # Propagate $${out} output
+                    propagatedUserEnvPkgs="$propagatedUserEnvPkgs @${out}@"
+
+                    if [ -z "$outputDev" ]; then
+                        echo "error: \$outputDev is unset!" >&2
+                        exit 1
+                    fi
+
+                    # Propagate $dev so that this setup hook is propagated
+                    # But only if there is a separate $dev output
+                    if [ "$outputDev" != out ]; then
+                        propagatedBuildInputs="$propagatedBuildInputs @dev@"
+                    fi
+                fi
+              '';
+        in callPackage setupHook {};
+
+      propagateBin = propagate "bin";
+
+      callPackage = self.newScope {
+        inherit propagate propagateBin;
+
+        mkDerivation = args:
+          let
+            inherit (args) name;
+            sname = args.sname or name;
+            inherit (srcs."${sname}") src version;
+
+            outputs = args.outputs or [ "out" ];
+            hasBin = lib.elem "bin" outputs;
+            hasDev = lib.elem "dev" outputs;
+
+            defaultSetupHook = if hasBin && hasDev then propagateBin else null;
+            setupHook = args.setupHook or defaultSetupHook;
+
+            meta = {
+              license = with lib.licenses; [
+                lgpl21Plus lgpl3Plus bsd2 mit gpl2Plus gpl3Plus fdl12
+              ];
+              platforms = lib.platforms.linux;
+              maintainers = with lib.maintainers; [ ttuegel ];
+              homepage = http://www.kde.org;
+            } // (args.meta or {});
+          in
+          mkDerivation (args // {
+            name = "${name}-${version}";
+            inherit meta outputs setupHook src;
+          });
+      };
+
+    in {
+      bluedevil = callPackage ./bluedevil.nix {};
+      breeze-gtk = callPackage ./breeze-gtk.nix {};
+      breeze-qt5 = callPackage ./breeze-qt5.nix {};
+      breeze-grub = callPackage ./breeze-grub.nix {};
+      breeze-plymouth = callPackage ./breeze-plymouth {};
+      kactivitymanagerd = callPackage ./kactivitymanagerd.nix {};
+      kde-cli-tools = callPackage ./kde-cli-tools.nix {};
+      kde-gtk-config = callPackage ./kde-gtk-config { inherit gsettings-desktop-schemas; };
+      kdecoration = callPackage ./kdecoration.nix {};
+      kdeplasma-addons = callPackage ./kdeplasma-addons.nix {};
+      kgamma5 = callPackage ./kgamma5.nix {};
+      khotkeys = callPackage ./khotkeys.nix {};
+      kinfocenter = callPackage ./kinfocenter.nix {};
+      kmenuedit = callPackage ./kmenuedit.nix {};
+      kscreen = callPackage ./kscreen.nix {};
+      kscreenlocker = callPackage ./kscreenlocker.nix {};
+      ksshaskpass = callPackage ./ksshaskpass.nix {};
+      ksysguard = callPackage ./ksysguard.nix {};
+      kwallet-pam = callPackage ./kwallet-pam.nix {};
+      kwayland-integration = callPackage ./kwayland-integration.nix {};
+      kwin = callPackage ./kwin {};
+      kwrited = callPackage ./kwrited.nix {};
+      libkscreen = callPackage ./libkscreen {};
+      libksysguard = callPackage ./libksysguard {};
+      milou = callPackage ./milou.nix {};
+      oxygen = callPackage ./oxygen.nix {};
+      plasma-browser-integration = callPackage ./plasma-browser-integration.nix {};
+      plasma-desktop = callPackage ./plasma-desktop {};
+      plasma-integration = callPackage ./plasma-integration {};
+      plasma-nm = callPackage ./plasma-nm {};
+      plasma-pa = callPackage ./plasma-pa.nix { inherit gconf; };
+      plasma-vault = callPackage ./plasma-vault {};
+      plasma-workspace = callPackage ./plasma-workspace {};
+      plasma-workspace-wallpapers = callPackage ./plasma-workspace-wallpapers.nix {};
+      polkit-kde-agent = callPackage ./polkit-kde-agent.nix {};
+      powerdevil = callPackage ./powerdevil.nix {};
+      sddm-kcm = callPackage ./sddm-kcm.nix {};
+      systemsettings = callPackage ./systemsettings.nix {};
+      user-manager = callPackage ./user-manager.nix {};
+      xdg-desktop-portal-kde = callPackage ./xdg-desktop-portal-kde.nix {};
+    };
+in
+lib.makeScope libsForQt5.newScope packages
diff --git a/nixpkgs/pkgs/desktops/plasma-5/fetch.sh b/nixpkgs/pkgs/desktops/plasma-5/fetch.sh
new file mode 100644
index 000000000000..814795499a99
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/fetch.sh
@@ -0,0 +1 @@
+WGET_ARGS=( https://download.kde.org/stable/plasma/5.14.5/ -A '*.tar.xz' )
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kactivitymanagerd.nix b/nixpkgs/pkgs/desktops/plasma-5/kactivitymanagerd.nix
new file mode 100644
index 000000000000..d2870c27e659
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kactivitymanagerd.nix
@@ -0,0 +1,15 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  boost, kconfig, kcoreaddons, kdbusaddons, ki18n, kio, kglobalaccel,
+  kwindowsystem, kxmlgui, kcrash
+}:
+
+mkDerivation {
+  name = "kactivitymanagerd";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    boost kconfig kcoreaddons kdbusaddons kglobalaccel ki18n kio kwindowsystem
+    kxmlgui kcrash
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kde-cli-tools.nix b/nixpkgs/pkgs/desktops/plasma-5/kde-cli-tools.nix
new file mode 100644
index 000000000000..3364ee2c0632
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kde-cli-tools.nix
@@ -0,0 +1,14 @@
+{
+  mkDerivation, extra-cmake-modules, kdoctools,
+  kcmutils, kconfig, kdesu, ki18n, kiconthemes, kinit, kio, kwindowsystem,
+  qtsvg, qtx11extras, kactivities, plasma-workspace
+}:
+
+mkDerivation {
+  name = "kde-cli-tools";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcmutils kconfig kdesu ki18n kiconthemes kinit kio kwindowsystem qtsvg
+    qtx11extras kactivities plasma-workspace
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/default.nix b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/default.nix
new file mode 100644
index 000000000000..8cfc947d30bd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/default.nix
@@ -0,0 +1,25 @@
+{
+  mkDerivation,
+  extra-cmake-modules, wrapGAppsHook,
+  glib, gtk2, gtk3, karchive, kcmutils, kconfigwidgets, ki18n, kiconthemes, kio,
+  knewstuff, gsettings-desktop-schemas
+}:
+
+mkDerivation {
+  name = "kde-gtk-config";
+  nativeBuildInputs = [ extra-cmake-modules wrapGAppsHook ];
+  dontWrapGApps = true;  # There is nothing to wrap
+  buildInputs = [
+    ki18n kio glib gtk2 gtk3 karchive kcmutils kconfigwidgets kiconthemes
+    knewstuff gsettings-desktop-schemas
+  ];
+  patches = [ ./patches/follow-symlinks.patch ./patches/gsettings.patch ];
+  cmakeFlags = [
+    "-DGTK2_GLIBCONFIG_INCLUDE_DIR=${glib.out}/lib/glib-2.0/include"
+    "-DGTK2_GDKCONFIG_INCLUDE_DIR=${gtk2.out}/lib/gtk-2.0/include"
+    "-DGLIB_SCHEMAS_DIR=${gsettings-desktop-schemas.out}/"
+  ];
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE+=" -DGSETTINGS_SCHEMAS_PATH=\"$GSETTINGS_SCHEMAS_PATH\""
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/follow-symlinks.patch b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/follow-symlinks.patch
new file mode 100644
index 000000000000..f30a0a4588fa
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/follow-symlinks.patch
@@ -0,0 +1,49 @@
+From 33b25c2e3c7a002c7f726cd79fc4bab22b1299be Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Tue, 27 Oct 2015 18:07:54 -0500
+Subject: [PATCH] follow symlinks
+
+---
+ src/appearancegtk2.cpp  | 2 +-
+ src/iconthemesmodel.cpp | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+Index: kde-gtk-config-5.12.4/src/appearancegtk2.cpp
+===================================================================
+--- kde-gtk-config-5.12.4.orig/src/appearancegtk2.cpp
++++ kde-gtk-config-5.12.4/src/appearancegtk2.cpp
+@@ -69,7 +69,7 @@ QString AppearanceGTK2::themesGtkrcFile(
+     QStringList themes=installedThemes();
+     themes=themes.filter(QRegExp("/"+themeName+"/?$"));
+     if(themes.size()==1) {
+-        QDirIterator it(themes.first(), QDirIterator::Subdirectories);
++        QDirIterator it(themes.first(), QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         while(it.hasNext()) {
+             it.next();
+             if(it.fileName()=="gtkrc") {
+Index: kde-gtk-config-5.12.4/src/iconthemesmodel.cpp
+===================================================================
+--- kde-gtk-config-5.12.4.orig/src/iconthemesmodel.cpp
++++ kde-gtk-config-5.12.4/src/iconthemesmodel.cpp
+@@ -47,7 +47,7 @@ QList<QDir> IconThemesModel::installedTh
+ 
+     foreach(const QString& dir, dirs) {
+         QDir userIconsDir(dir);
+-        QDirIterator it(userIconsDir.path(), QDir::NoDotAndDotDot|QDir::AllDirs|QDir::NoSymLinks);
++        QDirIterator it(userIconsDir.path(), QDir::NoDotAndDotDot|QDir::AllDirs);
+         while(it.hasNext()) {
+             QString currentPath = it.next();
+             QDir dir(currentPath);
+Index: kde-gtk-config-5.12.4/src/cursorthemesmodel.cpp
+===================================================================
+--- kde-gtk-config-5.12.4.orig/src/cursorthemesmodel.cpp
++++ kde-gtk-config-5.12.4/src/cursorthemesmodel.cpp
+@@ -47,7 +47,7 @@ QList<QDir> CursorThemesModel::installed
+ 
+     foreach(const QString& dir, dirs) {
+         QDir userIconsDir(dir);
+-        QDirIterator it(userIconsDir.path(), QDir::NoDotAndDotDot|QDir::AllDirs|QDir::NoSymLinks);
++        QDirIterator it(userIconsDir.path(), QDir::NoDotAndDotDot|QDir::AllDirs);
+         while(it.hasNext()) {
+             QString currentPath = it.next();
+             QDir dir(currentPath);
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/gsettings.patch b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/gsettings.patch
new file mode 100644
index 000000000000..69f7bc4e56a0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/gsettings.patch
@@ -0,0 +1,21 @@
+diff --git a/src/gtkconfigkcmodule.cpp b/src/gtkconfigkcmodule.cpp
+index 7b82d50..96831d8 100644
+--- a/src/gtkconfigkcmodule.cpp
++++ b/src/gtkconfigkcmodule.cpp
+@@ -91,6 +91,16 @@ GTKConfigKCModule::GTKConfigKCModule(QWidget* parent, const QVariantList& args )
+     iconsProxyModel->sort(0);
+     ui->cb_icon->setModel(iconsProxyModel);
+     ui->cb_icon_fallback->setModel(iconsProxyModel);
++
++    // Add GSETTINGS_SCHEMAS_PATH to the front of XDG_DATA_DIRS.
++    // Normally this would be done by wrapGAppsHook, but this plugin
++    // (shared object) cannot be wrapped.
++    QByteArray xdgdata = qgetenv("XDG_DATA_DIRS");
++    if (!xdgdata.isEmpty()) {
++        xdgdata.push_front(":");
++    }
++    xdgdata.push_front(QByteArray(GSETTINGS_SCHEMAS_PATH));
++    qputenv("XDG_DATA_DIRS", xdgdata);
+     
+     m_tempGtk2Preview = QStandardPaths::writableLocation(QStandardPaths::TempLocation)+ "/gtkrc-2.0";
+     m_tempGtk3Preview = QStandardPaths::writableLocation(QStandardPaths::TempLocation)+ "/.config/gtk-3.0/settings.ini";
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/series b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/series
new file mode 100644
index 000000000000..7aad1acf6ac4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kde-gtk-config/patches/series
@@ -0,0 +1,2 @@
+follow-symlinks.patch
+gsettings.patch
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kdecoration.nix b/nixpkgs/pkgs/desktops/plasma-5/kdecoration.nix
new file mode 100644
index 000000000000..569da3c70349
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kdecoration.nix
@@ -0,0 +1,8 @@
+{ mkDerivation, extra-cmake-modules, qtbase, ki18n }:
+
+mkDerivation {
+  name = "kdecoration";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ qtbase ki18n ];
+  outputs = [ "out" "dev" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kdeplasma-addons.nix b/nixpkgs/pkgs/desktops/plasma-5/kdeplasma-addons.nix
new file mode 100644
index 000000000000..398fc356fc93
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kdeplasma-addons.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kconfig, kconfigwidgets, kcoreaddons, kcmutils, kdelibs4support, kio,
+  knewstuff, kross, krunner, kservice, ksysguard, kunitconversion, ibus,
+  plasma-framework, plasma-workspace, qtdeclarative, qtx11extras, kholidays
+}:
+
+mkDerivation {
+  name = "kdeplasma-addons";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kconfig kconfigwidgets kcoreaddons kcmutils kdelibs4support kio knewstuff
+    kross krunner kservice ksysguard kunitconversion ibus plasma-framework
+    plasma-workspace qtdeclarative qtx11extras kholidays
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kgamma5.nix b/nixpkgs/pkgs/desktops/plasma-5/kgamma5.nix
new file mode 100644
index 000000000000..ccbf3820b908
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kgamma5.nix
@@ -0,0 +1,11 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kconfig, kconfigwidgets, ki18n, qtx11extras, libXxf86vm
+}:
+
+mkDerivation {
+  name = "kgamma5";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [ kconfig kconfigwidgets ki18n qtx11extras libXxf86vm ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/khotkeys.nix b/nixpkgs/pkgs/desktops/plasma-5/khotkeys.nix
new file mode 100644
index 000000000000..77763c5e203e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/khotkeys.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kcmutils, kdbusaddons, kdelibs4support, kglobalaccel, ki18n, kio, kxmlgui,
+  plasma-framework, plasma-workspace, qtx11extras
+}:
+
+mkDerivation {
+  name = "khotkeys";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcmutils kdbusaddons kdelibs4support kglobalaccel ki18n kio kxmlgui
+    plasma-framework plasma-workspace qtx11extras
+  ];
+  outputs = [ "bin" "dev" "out" ];
+  enableParallelBuilding = false;
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kinfocenter.nix b/nixpkgs/pkgs/desktops/plasma-5/kinfocenter.nix
new file mode 100644
index 000000000000..b35493929ff3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kinfocenter.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kcmutils, kcompletion, kconfig, kconfigwidgets, kcoreaddons, kdbusaddons,
+  kdeclarative, kdelibs4support, ki18n, kiconthemes, kio, kpackage, kservice,
+  kwayland, kwidgetsaddons, kxmlgui, libraw1394, libGLU, pciutils, solid
+}:
+
+mkDerivation {
+  name = "kinfocenter";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcmutils kcompletion kconfig kconfigwidgets kcoreaddons kdbusaddons
+    kdeclarative kdelibs4support ki18n kiconthemes kio kpackage kservice
+    kwayland kwidgetsaddons kxmlgui libraw1394 libGLU pciutils solid
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kmenuedit.nix b/nixpkgs/pkgs/desktops/plasma-5/kmenuedit.nix
new file mode 100644
index 000000000000..016ea940d99b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kmenuedit.nix
@@ -0,0 +1,14 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kdbusaddons, kdelibs4support, khotkeys, ki18n, kiconthemes, kio, kxmlgui,
+  sonnet
+}:
+
+mkDerivation {
+  name = "kmenuedit";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kdbusaddons kdelibs4support khotkeys ki18n kiconthemes kio kxmlgui sonnet
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kscreen.nix b/nixpkgs/pkgs/desktops/plasma-5/kscreen.nix
new file mode 100644
index 000000000000..422bb95c6059
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kscreen.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  kconfig, kconfigwidgets, kdbusaddons, kglobalaccel, ki18n, kwidgetsaddons,
+  kxmlgui, libkscreen, qtdeclarative, qtgraphicaleffects, kwindowsystem, 
+  kdeclarative, plasma-framework
+}:
+
+mkDerivation {
+  name = "kscreen";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kconfig kconfigwidgets kdbusaddons kglobalaccel ki18n kwidgetsaddons kxmlgui
+    libkscreen qtdeclarative qtgraphicaleffects kwindowsystem kdeclarative
+    plasma-framework
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kscreenlocker.nix b/nixpkgs/pkgs/desktops/plasma-5/kscreenlocker.nix
new file mode 100644
index 000000000000..e748121132c1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kscreenlocker.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kcmutils, kcrash, kdeclarative, kdelibs4support, kglobalaccel, kidletime,
+  kwayland, libXcursor, pam, plasma-framework, qtdeclarative, qtx11extras,
+  wayland,
+}:
+
+mkDerivation {
+  name = "kscreenlocker";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcmutils kcrash kdeclarative kdelibs4support kglobalaccel kidletime kwayland
+    libXcursor pam plasma-framework qtdeclarative qtx11extras wayland
+  ];
+  outputs = [ "out" "dev" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/ksshaskpass.nix b/nixpkgs/pkgs/desktops/plasma-5/ksshaskpass.nix
new file mode 100644
index 000000000000..39e260f6c708
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/ksshaskpass.nix
@@ -0,0 +1,11 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  kcoreaddons, ki18n, kwallet, kwidgetsaddons, qtbase,
+}:
+
+mkDerivation {
+  name = "ksshaskpass";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [ kcoreaddons ki18n kwallet kwidgetsaddons qtbase ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/ksysguard.nix b/nixpkgs/pkgs/desktops/plasma-5/ksysguard.nix
new file mode 100644
index 000000000000..150b97be50d7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/ksysguard.nix
@@ -0,0 +1,16 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  lm_sensors,
+  kconfig, kcoreaddons, kdelibs4support, ki18n, kiconthemes, kitemviews,
+  knewstuff, libksysguard, qtwebkit
+}:
+
+mkDerivation {
+  name = "ksysguard";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kconfig kcoreaddons kitemviews knewstuff kiconthemes libksysguard
+    kdelibs4support ki18n lm_sensors qtwebkit
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwallet-pam.nix b/nixpkgs/pkgs/desktops/plasma-5/kwallet-pam.nix
new file mode 100644
index 000000000000..1cbfb87ea563
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwallet-pam.nix
@@ -0,0 +1,10 @@
+{ mkDerivation, lib, extra-cmake-modules, pam, socat, libgcrypt, qtbase, }:
+
+mkDerivation {
+  name = "kwallet-pam";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ pam socat libgcrypt qtbase ];
+  postPatch = ''
+    sed -i pam_kwallet_init -e "s|socat|${lib.getBin socat}/bin/socat|"
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwayland-integration.nix b/nixpkgs/pkgs/desktops/plasma-5/kwayland-integration.nix
new file mode 100644
index 000000000000..1344b477f736
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwayland-integration.nix
@@ -0,0 +1,11 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  kidletime, kwayland, kwindowsystem, qtbase,
+}:
+
+mkDerivation {
+  name = "kwayland-integration";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kidletime kwindowsystem kwayland qtbase ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwin/default.nix b/nixpkgs/pkgs/desktops/plasma-5/kwin/default.nix
new file mode 100644
index 000000000000..b8f381e97149
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwin/default.nix
@@ -0,0 +1,46 @@
+{
+  mkDerivation, lib, copyPathsToStore,
+  extra-cmake-modules, kdoctools,
+
+  epoxy,libICE, libSM, libinput, libxkbcommon, udev, wayland, xcb-util-cursor,
+  xwayland,
+
+  qtdeclarative, qtmultimedia, qtscript, qtx11extras,
+
+  breeze-qt5, kactivities, kcompletion, kcmutils, kconfig, kconfigwidgets,
+  kcoreaddons, kcrash, kdeclarative, kdecoration, kglobalaccel, ki18n,
+  kiconthemes, kidletime, kinit, kio, knewstuff, knotifications, kpackage,
+  kscreenlocker, kservice, kwayland, kwidgetsaddons, kwindowsystem, kxmlgui,
+  plasma-framework, qtsensors, libcap, libdrm
+}:
+
+mkDerivation {
+  name = "kwin";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    epoxy libICE libSM libinput libxkbcommon udev wayland xcb-util-cursor
+    xwayland
+
+    qtdeclarative qtmultimedia qtscript qtx11extras qtsensors
+
+    breeze-qt5 kactivities kcmutils kcompletion kconfig kconfigwidgets
+    kcoreaddons kcrash kdeclarative kdecoration kglobalaccel ki18n kiconthemes
+    kidletime kinit kio knewstuff knotifications kpackage kscreenlocker kservice
+    kwayland kwidgetsaddons kwindowsystem kxmlgui plasma-framework
+    libcap libdrm
+  ];
+  outputs = [ "bin" "dev" "out" ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  CXXFLAGS = [
+    ''-DNIXPKGS_XWAYLAND=\"${lib.getBin xwayland}/bin/Xwayland\"''
+  ];
+  cmakeFlags = [ "-DCMAKE_SKIP_BUILD_RPATH=OFF" ];
+  postInstall = ''
+    # Some package(s) refer to these service types by the wrong name.
+    # I would prefer to patch those packages, but I cannot find them!
+    ln -s ''${!outputBin}/share/kservicetypes5/kwineffect.desktop \
+          ''${!outputBin}/share/kservicetypes5/kwin-effect.desktop
+    ln -s ''${!outputBin}/share/kservicetypes5/kwinscript.desktop \
+          ''${!outputBin}/share/kservicetypes5/kwin-script.desktop
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwin/follow-symlinks.patch b/nixpkgs/pkgs/desktops/plasma-5/kwin/follow-symlinks.patch
new file mode 100644
index 000000000000..60b8f5ef541f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwin/follow-symlinks.patch
@@ -0,0 +1,13 @@
+Index: kwin-5.7.3/plugins/kdecorations/aurorae/src/aurorae.cpp
+===================================================================
+--- kwin-5.7.3.orig/plugins/kdecorations/aurorae/src/aurorae.cpp
++++ kwin-5.7.3/plugins/kdecorations/aurorae/src/aurorae.cpp
+@@ -211,7 +211,7 @@ void Helper::init()
+     // so let's try to locate our plugin:
+     QString pluginPath;
+     for (const QString &path : m_engine->importPathList()) {
+-        QDirIterator it(path, QDirIterator::Subdirectories);
++        QDirIterator it(path, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         while (it.hasNext()) {
+             it.next();
+             QFileInfo fileInfo = it.fileInfo();
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwin/no-setcap-install.patch b/nixpkgs/pkgs/desktops/plasma-5/kwin/no-setcap-install.patch
new file mode 100644
index 000000000000..80aacacc6ca0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwin/no-setcap-install.patch
@@ -0,0 +1,24 @@
+Dont set capabilities on kwin_wayland executable at build time
+
+This is handled by security.wrappers on NixOS
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 48cbcdbfe..93b410ed8 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -674,15 +674,6 @@ if (HAVE_LIBCAP)
+ endif()
+
+ install(TARGETS kwin_wayland         ${INSTALL_TARGETS_DEFAULT_ARGS} )
+-if (HAVE_LIBCAP)
+-    install(
+-    CODE "execute_process(
+-            COMMAND
+-                ${SETCAP_EXECUTABLE}
+-                CAP_SYS_NICE=+ep
+-                \$ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/kwin_wayland)"
+-    )
+-endif()
+
+ add_subdirectory(platformsupport)
+ add_subdirectory(plugins)
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwin/series b/nixpkgs/pkgs/desktops/plasma-5/kwin/series
new file mode 100644
index 000000000000..8efb74eabd67
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwin/series
@@ -0,0 +1,3 @@
+follow-symlinks.patch
+xwayland.patch
+no-setcap-install.patch
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwin/xwayland.patch b/nixpkgs/pkgs/desktops/plasma-5/kwin/xwayland.patch
new file mode 100644
index 000000000000..51f15c87d274
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwin/xwayland.patch
@@ -0,0 +1,13 @@
+Index: kwin-5.7.3/main_wayland.cpp
+===================================================================
+--- kwin-5.7.3.orig/main_wayland.cpp
++++ kwin-5.7.3/main_wayland.cpp
+@@ -315,7 +315,7 @@ void ApplicationWayland::startXwaylandSe
+ 
+     m_xwaylandProcess = new Process(kwinApp());
+     m_xwaylandProcess->setProcessChannelMode(QProcess::ForwardedErrorChannel);
+-    m_xwaylandProcess->setProgram(QStringLiteral("Xwayland"));
++    m_xwaylandProcess->setProgram(QLatin1String(NIXPKGS_XWAYLAND));
+     QProcessEnvironment env = m_environment;
+     env.insert("WAYLAND_SOCKET", QByteArray::number(wlfd));
+     m_xwaylandProcess->setProcessEnvironment(env);
diff --git a/nixpkgs/pkgs/desktops/plasma-5/kwrited.nix b/nixpkgs/pkgs/desktops/plasma-5/kwrited.nix
new file mode 100644
index 000000000000..f6f6187e9462
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/kwrited.nix
@@ -0,0 +1,11 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  kcoreaddons, kdbusaddons, ki18n, knotifications, kpty, qtbase,
+}:
+
+mkDerivation {
+  name = "kwrited";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kcoreaddons kdbusaddons ki18n knotifications kpty qtbase ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/libkscreen/default.nix b/nixpkgs/pkgs/desktops/plasma-5/libkscreen/default.nix
new file mode 100644
index 000000000000..5625aa656ceb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/libkscreen/default.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation, lib, copyPathsToStore, propagate,
+  extra-cmake-modules,
+  kwayland, libXrandr, qtx11extras
+}:
+
+mkDerivation {
+  name = "libkscreen";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [ kwayland libXrandr qtx11extras ];
+  outputs = [ "out" "dev" ];
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE+=" -DNIXPKGS_LIBKSCREEN_BACKENDS=\"''${!outputBin}/$qtPluginPrefix/kf5/kscreen\""
+  '';
+  setupHook = propagate "out";
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/libkscreen/libkscreen-backends-path.patch b/nixpkgs/pkgs/desktops/plasma-5/libkscreen/libkscreen-backends-path.patch
new file mode 100644
index 000000000000..48be0d037df5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/libkscreen/libkscreen-backends-path.patch
@@ -0,0 +1,27 @@
+Index: libkscreen-5.9.4/src/backendmanager.cpp
+===================================================================
+--- libkscreen-5.9.4.orig/src/backendmanager.cpp
++++ libkscreen-5.9.4/src/backendmanager.cpp
+@@ -178,17 +178,11 @@ QFileInfo BackendManager::preferredBacke
+ QFileInfoList BackendManager::listBackends()
+ {
+     // Compile a list of installed backends first
+-    const QString backendFilter = QStringLiteral("KSC_*");
+-    const QStringList paths = QCoreApplication::libraryPaths();
+-    QFileInfoList finfos;
+-    for (const QString &path : paths) {
+-        const QDir dir(path + QLatin1String("/kf5/kscreen/"),
+-                       backendFilter,
+-                       QDir::SortFlags(QDir::QDir::Name),
+-                       QDir::NoDotAndDotDot | QDir::Files);
+-        finfos.append(dir.entryInfoList());
+-    }
+-    return finfos;
++    const QDir dir(QLatin1String(NIXPKGS_LIBKSCREEN_BACKENDS),
++                   QStringLiteral("KSC_*"),
++                   QDir::SortFlags(QDir::QDir::Name),
++                   QDir::NoDotAndDotDot | QDir::Files);
++    return dir.entryInfoList();
+ }
+ 
+ KScreen::AbstractBackend *BackendManager::loadBackendPlugin(QPluginLoader *loader, const QString &name,
diff --git a/nixpkgs/pkgs/desktops/plasma-5/libkscreen/series b/nixpkgs/pkgs/desktops/plasma-5/libkscreen/series
new file mode 100644
index 000000000000..86bf4ab10602
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/libkscreen/series
@@ -0,0 +1 @@
+libkscreen-backends-path.patch
diff --git a/nixpkgs/pkgs/desktops/plasma-5/libksysguard/0001-qdiriterator-follow-symlinks.patch b/nixpkgs/pkgs/desktops/plasma-5/libksysguard/0001-qdiriterator-follow-symlinks.patch
new file mode 100644
index 000000000000..fbbb11ae7556
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/libksysguard/0001-qdiriterator-follow-symlinks.patch
@@ -0,0 +1,25 @@
+From 46164a50de4102d02ae9d1d480acdd4b12303db8 Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Wed, 14 Oct 2015 07:07:22 -0500
+Subject: [PATCH] qdiriterator follow symlinks
+
+---
+ processui/scripting.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/processui/scripting.cpp b/processui/scripting.cpp
+index efed8ff..841761a 100644
+--- a/processui/scripting.cpp
++++ b/processui/scripting.cpp
+@@ -167,7 +167,7 @@ void Scripting::loadContextMenu() {
+     QStringList scripts;
+     const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "ksysguard/scripts/", QStandardPaths::LocateDirectory);
+     Q_FOREACH (const QString& dir, dirs) {
+-        QDirIterator it(dir, QStringList() << QStringLiteral("*.desktop"), QDir::NoFilter, QDirIterator::Subdirectories);
++        QDirIterator it(dir, QStringList() << QStringLiteral("*.desktop"), QDir::NoFilter, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+         while (it.hasNext()) {
+             scripts.append(it.next());
+         }
+-- 
+2.5.2
+
diff --git a/nixpkgs/pkgs/desktops/plasma-5/libksysguard/default.nix b/nixpkgs/pkgs/desktops/plasma-5/libksysguard/default.nix
new file mode 100644
index 000000000000..0f9fe40d73c3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/libksysguard/default.nix
@@ -0,0 +1,21 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  kauth, kcompletion, kconfig, kconfigwidgets, kcoreaddons, ki18n, kiconthemes,
+  kservice, kwidgetsaddons, kwindowsystem, plasma-framework, qtscript, qtwebkit,
+  qtx11extras
+}:
+
+mkDerivation {
+  name = "libksysguard";
+  patches = [
+    ./0001-qdiriterator-follow-symlinks.patch
+  ];
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kauth kconfig ki18n kiconthemes kwindowsystem kcompletion kconfigwidgets
+    kcoreaddons kservice kwidgetsaddons plasma-framework qtscript qtx11extras
+    qtwebkit
+  ];
+  outputs = [ "bin" "dev" "out" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/milou.nix b/nixpkgs/pkgs/desktops/plasma-5/milou.nix
new file mode 100644
index 000000000000..db019db358bb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/milou.nix
@@ -0,0 +1,15 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  kcoreaddons, kdeclarative, ki18n, krunner, kservice, plasma-framework,
+  qtscript, qtdeclarative
+}:
+
+mkDerivation {
+  name = "milou";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    kcoreaddons kdeclarative ki18n krunner kservice plasma-framework
+    qtdeclarative qtscript
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/oxygen.nix b/nixpkgs/pkgs/desktops/plasma-5/oxygen.nix
new file mode 100644
index 000000000000..1b1f34f17b53
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/oxygen.nix
@@ -0,0 +1,18 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  frameworkintegration, kcmutils, kcompletion, kconfig, kdecoration, kguiaddons,
+  ki18n, kwidgetsaddons, kservice, kwayland, kwindowsystem, qtdeclarative,
+  qtx11extras
+}:
+
+mkDerivation {
+  name = "oxygen";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [
+    frameworkintegration kcmutils kcompletion kconfig kdecoration kguiaddons
+    ki18n kservice kwayland kwidgetsaddons kwindowsystem qtdeclarative
+    qtx11extras
+  ];
+  outputs = [ "bin" "dev" "out" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-browser-integration.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-browser-integration.nix
new file mode 100644
index 000000000000..e01efabe8a6a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-browser-integration.nix
@@ -0,0 +1,11 @@
+{ mkDerivation, extra-cmake-modules, qtbase, kio, ki18n, kconfig
+, kdbusaddons, knotifications, krunner, kwindowsystem, kactivities
+}:
+
+mkDerivation {
+  name = "plasma-browser-integration";
+  nativeBuildInputs = [
+    extra-cmake-modules qtbase kio ki18n kconfig kdbusaddons
+    knotifications krunner kwindowsystem kactivities
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/default.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/default.nix
new file mode 100644
index 000000000000..32bd5f3a9f28
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/default.nix
@@ -0,0 +1,51 @@
+{
+  mkDerivation, lib, copyPathsToStore,
+  extra-cmake-modules, kdoctools,
+
+  boost, fontconfig, ibus, libXcursor, libXft, libcanberra_kde, libpulseaudio,
+  libxkbfile, xf86inputevdev, xf86inputsynaptics, xinput, xkeyboard_config,
+  xorgserver, utillinux,
+
+  qtdeclarative, qtquickcontrols, qtquickcontrols2, qtsvg, qtx11extras,
+
+  attica, baloo, kactivities, kactivities-stats, kauth, kcmutils, kdbusaddons,
+  kdeclarative, kded, kdelibs4support, kemoticons, kglobalaccel, ki18n,
+  kitemmodels, knewstuff, knotifications, knotifyconfig, kpeople, krunner,
+  kscreenlocker, ksysguard, kwallet, kwin, phonon, plasma-framework,
+  plasma-workspace, xf86inputlibinput
+}:
+
+mkDerivation rec {
+  name = "plasma-desktop";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    boost fontconfig ibus libcanberra_kde libpulseaudio libXcursor libXft
+    libxkbfile phonon xf86inputevdev xf86inputsynaptics xinput xkeyboard_config
+
+    qtdeclarative qtquickcontrols qtquickcontrols2 qtsvg qtx11extras
+
+    attica baloo kactivities kactivities-stats kauth kcmutils kdbusaddons
+    kdeclarative kded kdelibs4support kemoticons kglobalaccel ki18n kitemmodels
+    knewstuff knotifications knotifyconfig kpeople krunner kscreenlocker
+    ksysguard kwallet kwin plasma-framework plasma-workspace
+  ];
+
+  patches = copyPathsToStore (lib.readPathsFromFile ./. ./series);
+  postPatch = ''
+    sed '1i#include <cmath>' -i kcms/touchpad/src/backends/x11/synapticstouchpad.cpp
+  '';
+  CXXFLAGS = [
+    "-I${lib.getDev xorgserver}/include/xorg"
+    ''-DNIXPKGS_HWCLOCK=\"${lib.getBin utillinux}/sbin/hwclock\"''
+  ];
+  cmakeFlags = [
+    "-DEvdev_INCLUDE_DIRS=${lib.getDev xf86inputevdev}/include/xorg"
+    "-DSynaptics_INCLUDE_DIRS=${lib.getDev xf86inputsynaptics}/include/xorg"
+    "-DXORGLIBINPUT_INCLUDE_DIRS=${lib.getDev xf86inputlibinput}/include/xorg"
+  ];
+  postInstall = ''
+    # Display ~/Desktop contents on the desktop by default.
+    sed -i "''${!outputBin}/share/plasma/shells/org.kde.plasma.desktop/contents/defaults" \
+        -e 's/Containment=org.kde.desktopcontainment/Containment=org.kde.plasma.folder/'
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/hwclock-path.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/hwclock-path.patch
new file mode 100644
index 000000000000..a46212af10fb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/hwclock-path.patch
@@ -0,0 +1,24 @@
+Index: plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+===================================================================
+--- plasma-desktop-5.8.5.orig/kcms/dateandtime/helper.cpp
++++ plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+@@ -48,10 +48,6 @@
+ #include <sys/stat.h>
+ #endif
+ 
+-// We cannot rely on the $PATH environment variable, because D-Bus activation
+-// clears it. So we have to use a reasonable default.
+-static const QString exePath = QStringLiteral("/usr/sbin:/usr/bin:/sbin:/bin");
+-
+ int ClockHelper::ntp( const QStringList& ntpServers, bool ntpEnabled )
+ {
+     int ret = 0;
+@@ -227,7 +223,7 @@ int ClockHelper::tzreset()
+ 
+ void ClockHelper::toHwclock()
+ {
+-    QString hwclock = KStandardDirs::findExe(QStringLiteral("hwclock"), exePath);
++    QString hwclock = QLatin1String(NIXPKGS_HWCLOCK);
+     if (!hwclock.isEmpty()) {
+         KProcess::execute(hwclock, QStringList() << QStringLiteral("--systohc"));
+     }
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/series b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/series
new file mode 100644
index 000000000000..26517ba93565
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/series
@@ -0,0 +1,2 @@
+hwclock-path.patch
+tzdir.patch
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/tzdir.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/tzdir.patch
new file mode 100644
index 000000000000..97504b330fed
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-desktop/tzdir.patch
@@ -0,0 +1,18 @@
+Index: plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+===================================================================
+--- plasma-desktop-5.8.5.orig/kcms/dateandtime/helper.cpp
++++ plasma-desktop-5.8.5/kcms/dateandtime/helper.cpp
+@@ -181,7 +181,12 @@ int ClockHelper::tz( const QString& sele
+ 
+     val = selectedzone;
+ #else
+-    QString tz = "/usr/share/zoneinfo/" + selectedzone;
++    QString tzdir = QString::fromLocal8Bit(qgetenv("TZDIR"));
++    QString tz = tzdir + "/" + selectedzone;
++    if (tzdir.isEmpty()) {
++      // Standard Linux path
++      tz = "/usr/share/zoneinfo/" + selectedzone;
++    }
+ 
+     if (QFile::exists(tz)) { // make sure the new TZ really exists
+         QFile::remove(QStringLiteral("/etc/localtime"));
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-integration/default.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-integration/default.nix
new file mode 100644
index 000000000000..f69644287624
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-integration/default.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules,
+  breeze-qt5, kconfig, kconfigwidgets, kiconthemes, kio, knotifications,
+  kwayland, libXcursor, qtquickcontrols2
+}:
+
+# TODO: install Noto Sans and Oxygen Mono fonts with plasma-integration
+
+mkDerivation {
+  name = "plasma-integration";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  buildInputs = [
+    breeze-qt5 kconfig kconfigwidgets kiconthemes kio knotifications kwayland
+    libXcursor qtquickcontrols2
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0001-mobile-broadband-provider-info-path.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0001-mobile-broadband-provider-info-path.patch
new file mode 100644
index 000000000000..79b5cfb437e2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0001-mobile-broadband-provider-info-path.patch
@@ -0,0 +1,25 @@
+From faf13c97ff1192a201843b9d52f4002dbd9022af Mon Sep 17 00:00:00 2001
+From: Thomas Tuegel <ttuegel@gmail.com>
+Date: Sun, 25 Oct 2015 09:09:27 -0500
+Subject: [PATCH] mobile-broadband-provider-info path
+
+---
+ libs/editor/mobileproviders.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libs/editor/mobileproviders.cpp b/libs/editor/mobileproviders.cpp
+index 568cb34..98a5992 100644
+--- a/libs/editor/mobileproviders.cpp
++++ b/libs/editor/mobileproviders.cpp
+@@ -26,7 +26,7 @@
+ 
+ #include <KLocale>
+ 
+-const QString MobileProviders::ProvidersFile = "/usr/share/mobile-broadband-provider-info/serviceproviders.xml";
++const QString MobileProviders::ProvidersFile = "@mobile_broadband_provider_info@/share/mobile-broadband-provider-info/serviceproviders.xml";
+ 
+ bool localeAwareCompare(const QString & one, const QString & two) {
+     return one.localeAwareCompare(two) < 0;
+-- 
+2.6.2
+
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0002-openvpn-binary-path.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0002-openvpn-binary-path.patch
new file mode 100644
index 000000000000..3bc871f09063
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/0002-openvpn-binary-path.patch
@@ -0,0 +1,13 @@
+diff --git a/vpn/openvpn/openvpnadvancedwidget.cpp b/vpn/openvpn/openvpnadvancedwidget.cpp
+index 2f11ba1d..310f11b4 100644
+--- a/vpn/openvpn/openvpnadvancedwidget.cpp
++++ b/vpn/openvpn/openvpnadvancedwidget.cpp
+@@ -75,7 +75,7 @@ OpenVpnAdvancedWidget::OpenVpnAdvancedWidget(const NetworkManager::VpnSetting::P
+     connect(m_ui->cmbProxyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &OpenVpnAdvancedWidget::proxyTypeChanged);
+ 
+     // start openVPN process and get its cipher list
+-    const QString openVpnBinary = QStandardPaths::findExecutable("openvpn", QStringList() << "/sbin" << "/usr/sbin");
++    const QString openVpnBinary = "@openvpn@/bin/openvpn";
+     const QStringList ciphersArgs(QLatin1String("--show-ciphers"));
+     const QStringList versionArgs(QLatin1String("--version"));
+ 
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/default.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/default.nix
new file mode 100644
index 000000000000..8296d549782f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-nm/default.nix
@@ -0,0 +1,31 @@
+{
+  mkDerivation, substituteAll,
+  extra-cmake-modules, kdoctools,
+  kcompletion, kconfigwidgets, kcoreaddons, kdbusaddons, kdeclarative,
+  kdelibs4support, ki18n, kiconthemes, kinit, kio, kitemviews, knotifications,
+  kservice, kwallet, kwidgetsaddons, kwindowsystem, kxmlgui,
+  mobile-broadband-provider-info, modemmanager-qt, networkmanager-qt,
+  openconnect, openvpn, plasma-framework, qca-qt5, qtdeclarative, qttools, solid
+}:
+
+mkDerivation {
+  name = "plasma-nm";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools qttools ];
+  buildInputs = [
+    kdeclarative kdelibs4support ki18n kio kwindowsystem plasma-framework
+    qtdeclarative kcompletion kconfigwidgets kcoreaddons kdbusaddons kiconthemes
+    kinit kitemviews knotifications kservice kwallet kwidgetsaddons kxmlgui
+    mobile-broadband-provider-info modemmanager-qt networkmanager-qt openconnect
+    qca-qt5 solid
+  ];
+  patches = [
+    (substituteAll {
+      src = ./0001-mobile-broadband-provider-info-path.patch;
+      mobile_broadband_provider_info = mobile-broadband-provider-info;
+    })
+    (substituteAll {
+      src = ./0002-openvpn-binary-path.patch;
+      inherit openvpn;
+    })
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-pa.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-pa.nix
new file mode 100644
index 000000000000..b60b5298d6db
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-pa.nix
@@ -0,0 +1,15 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  gconf, glib, kconfigwidgets, kcoreaddons, kdeclarative, kglobalaccel, ki18n,
+  libcanberra-gtk3, libpulseaudio, plasma-framework, qtdeclarative, kwindowsystem
+}:
+
+mkDerivation {
+  name = "plasma-pa";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    gconf glib kconfigwidgets kcoreaddons kdeclarative kglobalaccel ki18n
+    libcanberra-gtk3 libpulseaudio plasma-framework qtdeclarative kwindowsystem
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/cryfs-path.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/cryfs-path.patch
new file mode 100644
index 000000000000..6bab35fe4a97
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/cryfs-path.patch
@@ -0,0 +1,13 @@
+diff --git a/kded/engine/backends/cryfs/cryfsbackend.cpp b/kded/engine/backends/cryfs/cryfsbackend.cpp
+index 58a6929..7212980 100644
+--- a/kded/engine/backends/cryfs/cryfsbackend.cpp
++++ b/kded/engine/backends/cryfs/cryfsbackend.cpp
+@@ -241,7 +241,7 @@ QProcess *CryFsBackend::cryfs(const QStringList &arguments) const
+     auto config = KSharedConfig::openConfig(PLASMAVAULT_CONFIG_FILE);
+     KConfigGroup backendConfig(config, "CryfsBackend");
+ 
+-    return process("cryfs",
++    return process(NIXPKGS_CRYFS,
+                    arguments + backendConfig.readEntry("extraMountOptions", QStringList{}),
+                    { { "CRYFS_FRONTEND", "noninteractive" } });
+ }
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/default.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/default.nix
new file mode 100644
index 000000000000..e016944be456
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/default.nix
@@ -0,0 +1,40 @@
+{
+  mkDerivation, lib,
+  extra-cmake-modules,
+
+  kactivities,
+  plasma-framework,
+  kwindowsystem,
+  networkmanager-qt,
+  libksysguard,
+
+  encfs,
+  cryfs,
+  fuse
+}:
+
+mkDerivation {
+  name = "plasma-vault";
+  nativeBuildInputs = [ extra-cmake-modules ];
+
+  patches = [
+    ./encfs-path.patch
+    ./cryfs-path.patch
+    ./fusermount-path.patch
+  ];
+
+  buildInputs = [
+    kactivities plasma-framework kwindowsystem libksysguard
+    networkmanager-qt
+  ];
+
+  CXXFLAGS = [
+    ''-DNIXPKGS_ENCFS=\"${lib.getBin encfs}/bin/encfs\"''
+    ''-DNIXPKGS_ENCFSCTL=\"${lib.getBin encfs}/bin/encfsctl\"''
+
+    ''-DNIXPKGS_CRYFS=\"${lib.getBin cryfs}/bin/cryfs\"''
+
+    ''-DNIXPKGS_FUSERMOUNT=\"${lib.getBin fuse}/bin/fusermount\"''
+  ];
+
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/encfs-path.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/encfs-path.patch
new file mode 100644
index 000000000000..e1c325e16934
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/encfs-path.patch
@@ -0,0 +1,22 @@
+diff --git a/kded/engine/backends/encfs/encfsbackend.cpp b/kded/engine/backends/encfs/encfsbackend.cpp
+index 628af7b..6edd38e 100644
+--- a/kded/engine/backends/encfs/encfsbackend.cpp
++++ b/kded/engine/backends/encfs/encfsbackend.cpp
+@@ -137,7 +137,7 @@ QProcess *EncFsBackend::encfs(const QStringList &arguments) const
+     auto config = KSharedConfig::openConfig(PLASMAVAULT_CONFIG_FILE);
+     KConfigGroup backendConfig(config, "EncfsBackend");
+ 
+-    return process("encfs",
++    return process(NIXPKGS_ENCFS,
+                    arguments + backendConfig.readEntry("extraMountOptions", QStringList{}),
+                    {});
+ }
+@@ -146,7 +146,7 @@ QProcess *EncFsBackend::encfs(const QStringList &arguments) const
+ 
+ QProcess *EncFsBackend::encfsctl(const QStringList &arguments) const
+ {
+-    return process("encfsctl", arguments, {});
++    return process(NIXPKGS_ENCFSCTL, arguments, {});
+ }
+ 
+ 
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/fusermount-path.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/fusermount-path.patch
new file mode 100644
index 000000000000..b2a7866531bf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-vault/fusermount-path.patch
@@ -0,0 +1,18 @@
+diff --git a/kded/engine/fusebackend_p.cpp b/kded/engine/fusebackend_p.cpp
+index d07e313..ea7d81c 100644
+--- a/kded/engine/fusebackend_p.cpp
++++ b/kded/engine/fusebackend_p.cpp
+@@ -106,7 +106,7 @@ QProcess *FuseBackend::process(const QString &executable,
+ 
+ QProcess *FuseBackend::fusermount(const QStringList &arguments) const
+ {
+-    return process("fusermount", arguments, {});
++    return process(NIXPKGS_FUSERMOUNT, arguments, {});
+ }
+ 
+ 
+@@ -279,4 +279,3 @@ bool FuseBackend::isOpened(const MountPoint &mountPoint) const
+ }
+ 
+ } // namespace PlasmaVault
+-
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace-wallpapers.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace-wallpapers.nix
new file mode 100644
index 000000000000..cb068166c1d9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace-wallpapers.nix
@@ -0,0 +1,6 @@
+{ mkDerivation , extra-cmake-modules }:
+
+mkDerivation {
+  name = "plasma-workspace-wallpapers";
+  nativeBuildInputs = [ extra-cmake-modules ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/default.nix b/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/default.nix
new file mode 100644
index 000000000000..2866cddbea18
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/default.nix
@@ -0,0 +1,81 @@
+{
+  mkDerivation, lib, fetchpatch,
+
+  extra-cmake-modules, kdoctools,
+
+  coreutils, dbus, gnugrep, gnused, isocodes, libdbusmenu, libSM, libXcursor,
+  libXtst, pam, wayland, xmessage, xprop, xrdb, xsetroot,
+
+  baloo, kactivities, kcmutils, kconfig, kcrash, kdbusaddons, kdeclarative,
+  kdelibs4support, kdesu, kglobalaccel, kidletime, kinit, kjsembed, knewstuff,
+  knotifyconfig, kpackage, krunner, kscreenlocker, ktexteditor, ktextwidgets,
+  kwallet, kwayland, kwin, kxmlrpcclient, libkscreen, libksysguard, libqalculate,
+  networkmanager-qt, phonon, plasma-framework, prison, solid, kholidays,
+  breeze-qt5,
+
+  qtgraphicaleffects, qtquickcontrols, qtquickcontrols2, qtscript, qttools,
+  qtwayland, qtx11extras,
+}:
+
+let inherit (lib) getBin getLib; in
+
+mkDerivation {
+  name = "plasma-workspace";
+
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    isocodes libdbusmenu libSM libXcursor libXtst pam wayland
+
+    baloo kactivities kcmutils kconfig kcrash kdbusaddons kdeclarative
+    kdelibs4support kdesu kglobalaccel kidletime kjsembed knewstuff
+    knotifyconfig kpackage krunner kscreenlocker ktexteditor ktextwidgets
+    kwallet kwayland kwin kxmlrpcclient libkscreen libksysguard libqalculate
+    networkmanager-qt phonon plasma-framework prison solid kholidays
+
+    qtgraphicaleffects qtquickcontrols qtquickcontrols2 qtscript qtwayland qtx11extras
+  ];
+  outputs = [ "bin" "dev" "out" ];
+
+  cmakeFlags = [
+    "-DNIXPKGS_XMESSAGE=${getBin xmessage}/bin/xmessage"
+    "-DNIXPKGS_MKDIR=${getBin coreutils}/bin/mkdir"
+    "-DNIXPKGS_XRDB=${getBin xrdb}/bin/xrdb"
+    "-DNIXPKGS_QTPATHS=${getBin qttools}/bin/qtpaths"
+    "-DNIXPKGS_XSETROOT=${getBin xsetroot}/bin/xsetroot"
+    "-DNIXPKGS_XPROP=${getBin xprop}/bin/xprop"
+    "-DNIXPKGS_ID=${getBin coreutils}/bin/id"
+    "-DNIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT=${getBin dbus}/bin/dbus-update-activation-environment"
+    "-DNIXPKGS_START_KDEINIT_WRAPPER=${getLib kinit}/lib/libexec/kf5/start_kdeinit_wrapper"
+    "-DNIXPKGS_QDBUS=${getBin qttools}/bin/qdbus"
+    "-DNIXPKGS_KWRAPPER5=${getBin kinit}/bin/kwrapper5"
+    "-DNIXPKGS_KREADCONFIG5=${getBin kconfig}/bin/kreadconfig5"
+    "-DNIXPKGS_GREP=${getBin gnugrep}/bin/grep"
+    "-DNIXPKGS_KDEINIT5_SHUTDOWN=${getBin kinit}/bin/kdeinit5_shutdown"
+    "-DNIXPKGS_SED=${getBin gnused}/bin/sed"
+    "-DNIXPKGS_WALLPAPER_INSTALL_DIR=${getBin breeze-qt5}/share/wallpapers/"
+  ];
+
+  # To regenerate ./plasma-workspace.patch,
+  #
+  # > git clone https://github.com/ttuegel/plasma-workspace
+  # > cd plasma-workspace
+  # > git checkout nixpkgs/$x.$y  # where $x.$y.$z == $version
+  # ... make some commits ...
+  # > git diff v$x.$y.$z
+  #
+  # Add upstream patches to the list below. For new patchs, particularly if not
+  # submitted upstream, please make a pull request and add it to
+  # ./plasma-workspace.patch.
+  patches = [
+    ./plasma-workspace.patch
+  ];
+
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE+=" -DNIXPKGS_KDOSTARTUPCONFIG5=\"''${!outputBin}/bin/kdostartupconfig5\""
+    cmakeFlags+=" -DNIXPKGS_STARTPLASMA=''${!outputBin}/lib/libexec/startplasma"
+  '';
+
+  postInstall = ''
+    moveToOutput lib/libexec/startplasma ''${!outputBin}
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch b/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch
new file mode 100644
index 000000000000..dd5f7321f0e2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/plasma-workspace/plasma-workspace.patch
@@ -0,0 +1,1079 @@
+diff --git a/sddm-theme/theme.conf.cmake b/sddm-theme/theme.conf.cmake
+index 69d30705..52e91028 100644
+--- a/sddm-theme/theme.conf.cmake
++++ b/sddm-theme/theme.conf.cmake
+@@ -1,4 +1,4 @@
+ [General]
+ type=image
+ color=#1d99f3
+-background=${CMAKE_INSTALL_PREFIX}/${WALLPAPER_INSTALL_DIR}/Next/contents/images/3200x2000.png
++background=${NIXPKGS_WALLPAPER_INSTALL_DIR}/Next/contents/images/3200x2000.png
+diff --git a/startkde/CMakeLists.txt b/startkde/CMakeLists.txt
+index cb75aeca..247db953 100644
+--- a/startkde/CMakeLists.txt
++++ b/startkde/CMakeLists.txt
+@@ -3,11 +3,6 @@ add_subdirectory(kstartupconfig)
+ add_subdirectory(ksyncdbusenv)
+ add_subdirectory(waitforname)
+ 
+-#FIXME: reconsider, looks fishy
+-if(NOT CMAKE_INSTALL_PREFIX STREQUAL "/usr")
+-    set(EXPORT_XCURSOR_PATH "XCURSOR_PATH=${KDE_INSTALL_FULL_DATAROOTDIR}/icons:$XCURSOR_PATH\":~/.icons:/usr/share/icons:/usr/share/pixmaps:/usr/X11R6/lib/X11/icons\"; export XCURSOR_PATH")
+-endif()
+-
+ configure_file(startkde.cmake ${CMAKE_CURRENT_BINARY_DIR}/startkde  @ONLY)
+ configure_file(startplasmacompositor.cmake ${CMAKE_CURRENT_BINARY_DIR}/startplasmacompositor  @ONLY)
+ configure_file(startplasma.cmake ${CMAKE_CURRENT_BINARY_DIR}/startplasma  @ONLY)
+diff --git a/startkde/kstartupconfig/kstartupconfig.cpp b/startkde/kstartupconfig/kstartupconfig.cpp
+index 493218ea..d507aa55 100644
+--- a/startkde/kstartupconfig/kstartupconfig.cpp
++++ b/startkde/kstartupconfig/kstartupconfig.cpp
+@@ -147,5 +147,5 @@ int main()
+     fclose( keys );
+     fclose( config );
+   doit:
+-    return system( "kdostartupconfig5" );
++    return system( NIXPKGS_KDOSTARTUPCONFIG5 );
+     }
+diff --git a/startkde/startkde.cmake b/startkde/startkde.cmake
+index 714a9bf1..9733c612 100644
+--- a/startkde/startkde.cmake
++++ b/startkde/startkde.cmake
+@@ -1,22 +1,31 @@
+ #!/bin/sh
+ #
+-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
++#  NIXPKGS KDE STARTUP SCRIPT ( @PROJECT_VERSION@ )
+ #
+ 
++if test "x$1" = x--failsafe; then
++    KDE_FAILSAFE=1 # General failsafe flag
++    KWIN_COMPOSE=N # Disable KWin's compositing
++    QT_XCB_FORCE_SOFTWARE_OPENGL=1
++    export KWIN_COMPOSE KDE_FAILSAFE QT_XCB_FORCE_SOFTWARE_OPENGL
++fi
++
+ # When the X server dies we get a HUP signal from xinit. We must ignore it
+ # because we still need to do some cleanup.
+ trap 'echo GOT SIGHUP' HUP
+ 
+-# Check if a Plasma session already is running and whether it's possible to connect to X
+-kcheckrunning
++# we have to unset this for Darwin since it will screw up KDE's dynamic-loading
++unset DYLD_FORCE_FLAT_NAMESPACE
++
++# Check if a KDE session already is running and whether it's possible to connect to X
++@CMAKE_INSTALL_FULL_BINDIR@/kcheckrunning
+ kcheckrunning_result=$?
+-if test $kcheckrunning_result -eq 0 ; then
+-	echo "Plasma seems to be already running on this display."
+-	xmessage -geometry 500x100 "Plasma seems to be already running on this display." > /dev/null 2>/dev/null
+-	exit 1
+-elif test $kcheckrunning_result -eq 2 ; then
+-	echo "\$DISPLAY is not set or cannot connect to the X server."
+-        exit 1
++if [ $kcheckrunning_result -eq 0 ]; then
++    echo "KDE seems to be already running on this display."
++    exit 1
++elif [ $kcheckrunning_result -eq 2 ]; then
++    echo "\$DISPLAY is not set or cannot connect to the X server."
++    exit 1
+ fi
+ 
+ # Boot sequence:
+@@ -33,61 +42,133 @@ fi
+ #
+ # * Then ksmserver is started which takes control of the rest of the startup sequence
+ 
+-if [  ${XDG_CONFIG_HOME} ]; then
+-  configDir=$XDG_CONFIG_HOME;
+-else
+-  configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
++export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
++@NIXPKGS_MKDIR@ -p "$XDG_CONFIG_HOME"
++
++# The KDE icon cache is supposed to update itself
++# automatically, but it uses the timestamp on the icon
++# theme directory as a trigger.  Since in Nix the
++# timestamp is always the same, this doesn't work.  So as
++# a workaround, nuke the icon cache on login.  This isn't
++# perfect, since it may require logging out after
++# installing new applications to update the cache.
++# See http://lists-archives.org/kde-devel/26175-what-when-will-icon-cache-refresh.html
++rm -fv $HOME/.cache/icon-cache.kcache
++
++# Qt writes a weird ‘libraryPath’ line to
++# ~/.config/Trolltech.conf that causes the KDE plugin
++# paths of previous KDE invocations to be searched.
++# Obviously using mismatching KDE libraries is potentially
++# disastrous, so here we nuke references to the Nix store
++# in Trolltech.conf.  A better solution would be to stop
++# Qt from doing this wackiness in the first place.
++if [ -e $XDG_CONFIG_HOME/Trolltech.conf ]; then
++    @NIXPKGS_SED@ -e '/nix\\store\|nix\/store/ d' -i $XDG_CONFIG_HOME/Trolltech.conf
+ fi
+ sysConfigDirs=${XDG_CONFIG_DIRS:-/etc/xdg}
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-mkdir -p $configDir
++@NIXPKGS_KBUILDSYCOCA5@
++
++# Set the default GTK 2 theme
++gtkrc2="$HOME/.gtkrc-2.0"
++breeze_gtkrc2="/run/current-system/sw/share/themes/Breeze/gtk-2.0/gtkrc"
++if ! [ -e "$gtkrc2" ] && [ -e "$breeze_gtkrc2" ]; then
++    cat >"$gtkrc2" <<EOF
++# Default GTK+ 2 config for NixOS KDE 5
++include "$breeze_gtkrc2"
++style "user-font"
++{
++  font_name="Sans Serif Regular"
++}
++widget_class "*" style "user-font"
++gtk-font-name="Sans Serif Regular 10"
++gtk-theme-name="Breeze"
++gtk-icon-theme-name="breeze"
++gtk-fallback-icon-theme="hicolor"
++gtk-cursor-theme-name="breeze_cursors"
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
++fi
++
++# Set the default GTK 3 theme
++gtk3_settings="$XDG_CONFIG_HOME/gtk-3.0/settings.ini"
++breeze_gtk3="/run/current-system/sw/share/themes/Breeze/gtk-3.0"
++if ! [ -e "$gtk3_settings" ] && [ -e "$breeze_gtk" ]; then
++    mkdir -p $(dirname "$gtk3_settings")
++    cat >"$gtk3_settings" <<EOF
++[Settings]
++gtk-font-name=Sans Serif Regular 10
++gtk-theme-name=Breeze
++gtk-icon-theme-name=breeze
++gtk-fallback-icon-theme=hicolor
++gtk-cursor-theme-name=breeze_cursors
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
++fi
++
++kcminputrc="$XDG_CONFIG_HOME/kcminputrc"
++if ! [ -e "$kcminputrc" ]; then
++    cat >"$kcminputrc" <<EOF
++[Mouse]
++cursorTheme=breeze_cursors
++cursorSize=0
++EOF
++fi
+ 
+ #This is basically setting defaults so we can use them with kstartupconfig5
+-cat >$configDir/startupconfigkeys <<EOF
++cat >"$XDG_CONFIG_HOME/startupconfigkeys" <<EOF
+ kcminputrc Mouse cursorTheme 'breeze_cursors'
+ kcminputrc Mouse cursorSize ''
+-ksplashrc KSplash Theme Breeze
++ksplashrc KSplash Theme org.kde.breeze.desktop
+ ksplashrc KSplash Engine KSplashQML
+ kdeglobals KScreen ScreenScaleFactors ''
+ kcmfonts General forceFontDPI 0
++kcmfonts General dontChangeAASettings true
+ EOF
+ 
+ # preload the user's locale on first start
+-plasmalocalerc=$configDir/plasma-localerc
+-test -f $plasmalocalerc || {
+-cat >$plasmalocalerc <<EOF
++plasmalocalerc="$XDG_CONFIG_HOME/plasma-localerc"
++if ! [ -f "$plasmalocalerc" ]; then
++    cat >"$plasmalocalerc" <<EOF
+ [Formats]
+ LANG=$LANG
+ EOF
+-}
++fi
+ 
+ # export LC_* variables set by kcmshell5 formats into environment
+ # so it can be picked up by QLocale and friends.
+-exportformatssettings=$configDir/plasma-locale-settings.sh
+-test -f $exportformatssettings && {
+-    . $exportformatssettings
+-}
++exportformatssettings="$XDG_CONFIG_HOME/plasma-locale-settings.sh"
++if [ -r "$exportformatssettings" ]; then
++    . "$exportformatssettings"
++fi
+ 
+ # Write a default kdeglobals file to set up the font
+-kdeglobalsfile=$configDir/kdeglobals
+-test -f $kdeglobalsfile || {
+-cat >$kdeglobalsfile <<EOF
++kdeglobalsfile="$XDG_CONFIG_HOME/kdeglobals"
++if ! [ -f "$kdeglobalsfile" ]; then
++    cat >"$kdeglobalsfile" <<EOF
+ [General]
+-XftAntialias=true
+-XftHintStyle=hintmedium
+-XftSubPixel=none
++fixed=Monospace,10,-1,5,50,0,0,0,0,0,Regular
++font=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++menuFont=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++smallestReadableFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++toolBarFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++
++[WM]
++activeFont=Noto Sans,12,-1,5,50,0,0,0,0,0,Bold
+ EOF
+-}
++fi
+ 
+-kstartupconfig5
+-returncode=$?
+-if test $returncode -ne 0; then
+-    xmessage -geometry 500x100 "kstartupconfig5 does not exist or fails. The error code is $returncode. Check your installation."
++if ! @CMAKE_INSTALL_FULL_BINDIR@/kstartupconfig5; then
++    echo "kstartupconfig5 does not exist or fails. The error code is $returncode. Check your installation." 1>&2
+     exit 1
+ fi
+-[ -r $configDir/startupconfig ] && . $configDir/startupconfig
+-
++if [ -r "$XDG_CONFIG_HOME/startupconfig" ]; then
++    . "$XDG_CONFIG_HOME/startupconfig"
++fi
+ 
+ #Do not sync any of this section with the wayland versions as there scale factors are
+ #sent properly over wl_output
+@@ -99,26 +180,33 @@ fi
+ #otherwise apps that manually opt in for high DPI get auto scaled by the developer AND manually scaled by us
+ export QT_AUTO_SCREEN_SCALE_FACTOR=0
+ 
++#Set the QtQuickControls style to our own: for QtQuickControls1
++#it will fall back to Desktop, while it will use our own org.kde.desktop
++#for QtQuickControlsStyle and Kirigami
++export QT_QUICK_CONTROLS_STYLE=org.kde.desktop
++
++XCURSOR_PATH=~/.icons
++IFS=":" read -r -a xdgDirs <<< "$XDG_DATA_DIRS"
++for xdgDir in "${xdgDirs[@]}"; do
++    XCURSOR_PATH="$XCURSOR_PATH:$xdgDir/icons"
++done
++export XCURSOR_PATH
++
+ # XCursor mouse theme needs to be applied here to work even for kded or ksmserver
+ if test -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ; then
+-    @EXPORT_XCURSOR_PATH@
+-
+     kapplymousetheme "$kcminputrc_mouse_cursortheme" "$kcminputrc_mouse_cursorsize"
+-    if test $? -eq 10; then
+-        XCURSOR_THEME=breeze_cursors
+-        export XCURSOR_THEME
+-    elif test -n "$kcminputrc_mouse_cursortheme"; then
+-        XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+-        export XCURSOR_THEME
++    if [ $? -eq 10 ]; then
++        export XCURSOR_THEME=breeze_cursors
++    elif [ -n "$kcminputrc_mouse_cursortheme" ]; then
++        export XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+     fi
+-    if test -n "$kcminputrc_mouse_cursorsize"; then
+-        XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+-        export XCURSOR_SIZE
++    if [ -n "$kcminputrc_mouse_cursorsize" ]; then
++        export XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+     fi
+ fi
+ 
+-if test "$kcmfonts_general_forcefontdpi" -ne 0; then
+-    xrdb -quiet -merge -nocpp <<EOF
++if [ "${kcmfonts_general_forcefontdpi:-0}" -ne 0 ]; then
++    @NIXPKGS_XRDB@ -quiet -merge -nocpp <<EOF
+ Xft.dpi: $kcmfonts_general_forcefontdpi
+ EOF
+ fi
+@@ -127,11 +215,11 @@ dl=$DESKTOP_LOCKED
+ unset DESKTOP_LOCKED # Don't want it in the environment
+ 
+ ksplash_pid=
+-if test -z "$dl"; then
++if [ -z "$dl" ]; then
+   # the splashscreen and progress indicator
+   case "$ksplashrc_ksplash_engine" in
+     KSplashQML)
+-      ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid`
++      ksplash_pid=$(@CMAKE_INSTALL_FULL_BINDIR@/ksplashqml "${ksplashrc_ksplash_theme}" --pid)
+       ;;
+     None)
+       ;;
+@@ -140,69 +228,6 @@ if test -z "$dl"; then
+   esac
+ fi
+ 
+-# Source scripts found in <config locations>/plasma-workspace/env/*.sh
+-# (where <config locations> correspond to the system and user's configuration
+-# directory.
+-#
+-# This is where you can define environment variables that will be available to
+-# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
+-# or eval `gpg-agent --daemon`.
+-# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
+-#
+-# (see end of this file).
+-# For anything else (that doesn't set env vars, or that needs a window manager),
+-# better use the Autostart folder.
+-
+-scriptpath=`echo "$configDir:$sysConfigDirs" | tr ':' '\n'`
+-
+-for prefix in `echo $scriptpath`; do
+-  for file in "$prefix"/plasma-workspace/env/*.sh; do
+-    test -r "$file" && . "$file" || true
+-  done
+-done
+-
+-# Activate the kde font directories.
+-#
+-# There are 4 directories that may be used for supplying fonts for KDE.
+-#
+-# There are two system directories. These belong to the administrator.
+-# There are two user directories, where the user may add her own fonts.
+-#
+-# The 'override' versions are for fonts that should come first in the list,
+-# i.e. if you have a font in your 'override' directory, it will be used in
+-# preference to any other.
+-#
+-# The preference order looks like this:
+-# user override, system override, X, user, system
+-#
+-# Where X is the original font database that was set up before this script
+-# runs.
+-
+-usr_odir=$HOME/.fonts/kde-override
+-usr_fdir=$HOME/.fonts
+-
+-if test -n "$KDEDIRS"; then
+-  kdedirs_first=`echo "$KDEDIRS"|sed -e 's/:.*//'`
+-  sys_odir=$kdedirs_first/share/fonts/override
+-  sys_fdir=$kdedirs_first/share/fonts
+-else
+-  sys_odir=$KDEDIR/share/fonts/override
+-  sys_fdir=$KDEDIR/share/fonts
+-fi
+-
+-# We run mkfontdir on the user's font dirs (if we have permission) to pick
+-# up any new fonts they may have installed. If mkfontdir fails, we still
+-# add the user's dirs to the font path, as they might simply have been made
+-# read-only by the administrator, for whatever reason.
+-
+-test -d "$sys_odir" && xset +fp "$sys_odir"
+-test -d "$usr_odir" && (mkfontdir "$usr_odir" ; xset +fp "$usr_odir")
+-test -d "$usr_fdir" && (mkfontdir "$usr_fdir" ; xset fp+ "$usr_fdir")
+-test -d "$sys_fdir" && xset fp+ "$sys_fdir"
+-
+-# Ask X11 to rebuild its font list.
+-xset fp rehash
+-
+ # Set a left cursor instead of the standard X11 "X" cursor, since I've heard
+ # from some users that they're confused and don't know what to do. This is
+ # especially necessary on slow machines, where starting KDE takes one or two
+@@ -257,44 +282,65 @@ export XDG_DATA_DIRS
+ #
+ KDE_FULL_SESSION=true
+ export KDE_FULL_SESSION
+-xprop -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
++@NIXPKGS_XPROP@ -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
+ 
+ KDE_SESSION_VERSION=5
+ export KDE_SESSION_VERSION
+-xprop -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
++@NIXPKGS_XPROP@ -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
+ 
+-KDE_SESSION_UID=`id -ru`
++KDE_SESSION_UID=$(@NIXPKGS_ID@ -ru)
+ export KDE_SESSION_UID
+ 
+ XDG_CURRENT_DESKTOP=KDE
+ export XDG_CURRENT_DESKTOP
+ 
++# Enforce xcb QPA. Helps switching between Wayland and X sessions.
++export QT_QPA_PLATFORM=xcb
++
++# Source scripts found in <config locations>/plasma-workspace/env/*.sh
++# (where <config locations> correspond to the system and user's configuration
++# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
++# and /etc/xdg/ on Linux)
++#
++# This is where you can define environment variables that will be available to
++# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
++# or eval `gpg-agent --daemon`.
++# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
++#
++# (see end of this file).
++# For anything else (that doesn't set env vars, or that needs a window manager),
++# better use the Autostart folder.
++
++IFS=":" read -r -a scriptpath <<< $(@NIXPKGS_QTPATHS@ --paths GenericConfigLocation)
++# Add /env/ to the directory to locate the scripts to be sourced
++for prefix in "${scriptpath[@]}"; do
++    for file in "$prefix"/plasma-workspace/env/*.sh; do
++        if [ -r "$file" ]; then
++            . "$file"
++        fi
++    done
++done
++
+ # At this point all environment variables are set, let's send it to the DBus session server to update the activation environment
+-if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then
+-    dbus-update-activation-environment --systemd --all
+-else
+-    @CMAKE_INSTALL_FULL_LIBEXECDIR@/ksyncdbusenv
+-fi
+-if test $? -ne 0; then
++
++if ! @NIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT@ --systemd --all; then
+   # Startup error
+   echo 'startkde: Could not sync environment to dbus.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not sync environment to dbus."
+   exit 1
+ fi
+ 
+ # We set LD_BIND_NOW to increase the efficiency of kdeinit.
+ # kdeinit unsets this variable before loading applications.
+-LD_BIND_NOW=true @CMAKE_INSTALL_FULL_LIBEXECDIR_KF5@/start_kdeinit_wrapper --kded +kcminit_startup
++LD_BIND_NOW=true @NIXPKGS_START_KDEINIT_WRAPPER@ --kded +kcminit_startup
+ if test $? -ne 0; then
+   # Startup error
+   echo 'startkde: Could not start kdeinit5. Check your installation.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not start kdeinit5. Check your installation."
+   exit 1
+ fi
+ 
+-qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
++@NIXPKGS_QDBUS@ org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
+ 
+ # finally, give the session control to the session manager
+ # see kdebase/ksmserver for the description of the rest of the startup sequence
+@@ -306,12 +352,16 @@ qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
+ # We only check for 255 which means that the ksmserver process could not be
+ # started, any problems thereafter, e.g. ksmserver failing to initialize,
+ # will remain undetected.
+-test -n "$KDEWM" && KDEWM="--windowmanager $KDEWM"
++if [ -n "$KDEWM" ]; then
++    KDEWM="--windowmanager $KDEWM"
++fi
+ # If the session should be locked from the start (locked autologin),
+ # lock now and do the rest of the KDE startup underneath the locker.
+ KSMSERVEROPTIONS=""
+-test -n "$dl" && KSMSERVEROPTIONS=" --lockscreen"
+-kwrapper5 @CMAKE_INSTALL_FULL_BINDIR@/ksmserver $KDEWM $KSMSERVEROPTIONS
++if [ -n "$dl" ]; then
++    KSMSERVEROPTIONS=" --lockscreen"
++fi
++@NIXPKGS_KWRAPPER5@ @CMAKE_INSTALL_FULL_BINDIR@/ksmserver $KDEWM $KSMSERVEROPTIONS
+ if test $? -eq 255; then
+   # Startup error
+   echo 'startkde: Could not start ksmserver. Check your installation.'  1>&2
+@@ -322,36 +372,36 @@ fi
+ #Anything after here is logout
+ #It is not called after shutdown/restart
+ 
+-wait_drkonqi=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Enabled --default true`
++wait_drkonqi=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Enabled --default true)
+ 
+-if test x"$wait_drkonqi"x = x"true"x ; then
++if [ x"$wait_drkonqi"x = x"true"x ]; then
+     # wait for remaining drkonqi instances with timeout (in seconds)
+-    wait_drkonqi_timeout=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Timeout --default 900`
++    wait_drkonqi_timeout=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Timeout --default 900)
+     wait_drkonqi_counter=0
+-    while qdbus | grep "^[^w]*org.kde.drkonqi" > /dev/null ; do
++    while @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ -q "^[^w]*org.kde.drkonqi" ; do
+         sleep 5
+         wait_drkonqi_counter=$((wait_drkonqi_counter+5))
+-        if test "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ; then
++        if [ "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ]; then
+             # ask remaining drkonqis to die in a graceful way
+-            qdbus | grep 'org.kde.drkonqi-' | while read address ; do
+-                qdbus "$address" "/MainApplication" "quit"
+-            done
+-            break
++            @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ 'org.kde.drkonqi-' | while read address ; do
++                @NIXPKGS_QDBUS@ "$address" "/MainApplication" "quit"
+         fi
+     done
+ fi
+ 
+ echo 'startkde: Shutting down...'  1>&2
+ # just in case
+-test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
++if [ -n "$ksplash_pid" ]; then
++    kill "$ksplash_pid" 2>/dev/null
++fi
+ 
+ # Clean up
+-kdeinit5_shutdown
++@NIXPKGS_KDEINIT5_SHUTDOWN@
+ 
+ unset KDE_FULL_SESSION
+-xprop -root -remove KDE_FULL_SESSION
++@NIXPKGS_XPROP@ -root -remove KDE_FULL_SESSION
+ unset KDE_SESSION_VERSION
+-xprop -root -remove KDE_SESSION_VERSION
++@NIXPKGS_XPROP@ -root -remove KDE_SESSION_VERSION
+ unset KDE_SESSION_UID
+ 
+ echo 'startkde: Done.'  1>&2
+diff --git a/startkde/startplasma.cmake b/startkde/startplasma.cmake
+index de98541c..39c0b521 100644
+--- a/startkde/startplasma.cmake
++++ b/startkde/startplasma.cmake
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ #
+-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
++#  NIXPKGS Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
+ #
+ 
+ # Boot sequence:
+@@ -17,28 +17,26 @@
+ #
+ # * Then ksmserver is started which takes control of the rest of the startup sequence
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-if [  ${XDG_CONFIG_HOME} ]; then
+-  configDir=$XDG_CONFIG_HOME;
+-else
+-  configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
++export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
++if [ -r "$XDG_CONFIG_HOME/startupconfig" ]; then
++    . "$XDG_CONFIG_HOME/startupconfig"
+ fi
+ 
+-[ -r $configDir/startupconfig ] && . $configDir/startupconfig
+-
+-xrdb -quiet -merge -nocpp <<EOF
++if [ "$kcmfonts_general_forcefontdpi" -ne 0 ]; then
++    @NIXPKGS_XRDB@ -quiet -merge -nocpp <<EOF
+ Xft.dpi: $QT_WAYLAND_FORCE_DPI
+ EOF
++fi
+ 
+ dl=$DESKTOP_LOCKED
+ unset DESKTOP_LOCKED # Don't want it in the environment
+ 
+ ksplash_pid=
+-if test -z "$dl"; then
++if [ -z "$dl" ]; then
+   # the splashscreen and progress indicator
+   case "$ksplashrc_ksplash_engine" in
+     KSplashQML)
+-      ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid`
++      ksplash_pid=$(@CMAKE_INSTALL_FULL_BINDIR@/ksplashqml "${ksplashrc_ksplash_theme}" --pid)
+       ;;
+     None)
+       ;;
+@@ -50,48 +48,6 @@ fi
+ #In wayland we want Plasma to use Qt's scaling
+ export PLASMA_USE_QT_SCALING=1
+ 
+-# Activate the kde font directories.
+-#
+-# There are 4 directories that may be used for supplying fonts for KDE.
+-#
+-# There are two system directories. These belong to the administrator.
+-# There are two user directories, where the user may add her own fonts.
+-#
+-# The 'override' versions are for fonts that should come first in the list,
+-# i.e. if you have a font in your 'override' directory, it will be used in
+-# preference to any other.
+-#
+-# The preference order looks like this:
+-# user override, system override, X, user, system
+-#
+-# Where X is the original font database that was set up before this script
+-# runs.
+-
+-usr_odir=$HOME/.fonts/kde-override
+-usr_fdir=$HOME/.fonts
+-
+-if test -n "$KDEDIRS"; then
+-  kdedirs_first=`echo "$KDEDIRS"|sed -e 's/:.*//'`
+-  sys_odir=$kdedirs_first/share/fonts/override
+-  sys_fdir=$kdedirs_first/share/fonts
+-else
+-  sys_odir=$KDEDIR/share/fonts/override
+-  sys_fdir=$KDEDIR/share/fonts
+-fi
+-
+-# We run mkfontdir on the user's font dirs (if we have permission) to pick
+-# up any new fonts they may have installed. If mkfontdir fails, we still
+-# add the user's dirs to the font path, as they might simply have been made
+-# read-only by the administrator, for whatever reason.
+-
+-test -d "$sys_odir" && xset +fp "$sys_odir"
+-test -d "$usr_odir" && (mkfontdir "$usr_odir" ; xset +fp "$usr_odir")
+-test -d "$usr_fdir" && (mkfontdir "$usr_fdir" ; xset fp+ "$usr_fdir")
+-test -d "$sys_fdir" && xset fp+ "$sys_fdir"
+-
+-# Ask X11 to rebuild its font list.
+-xset fp rehash
+-
+ # Set a left cursor instead of the standard X11 "X" cursor, since I've heard
+ # from some users that they're confused and don't know what to do. This is
+ # especially necessary on slow machines, where starting KDE takes one or two
+@@ -100,22 +56,13 @@ xset fp rehash
+ # If the user has overwritten fonts, the cursor font may be different now
+ # so don't move this up.
+ #
+-xsetroot -cursor_name left_ptr
+-
+-# Get Ghostscript to look into user's KDE fonts dir for additional Fontmap
+-if test -n "$GS_LIB" ; then
+-    GS_LIB=$usr_fdir:$GS_LIB
+-    export GS_LIB
+-else
+-    GS_LIB=$usr_fdir
+-    export GS_LIB
+-fi
++@NIXPKGS_XSETROOT@ -cursor_name left_ptr
+ 
+ echo 'startplasma: Starting up...'  1>&2
+ 
+ # export our session variables to the Xwayland server
+-xprop -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
+-xprop -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
++@NIXPKGS_XPROP@ -root -f KDE_FULL_SESSION 8t -set KDE_FULL_SESSION true
++@NIXPKGS_XPROP@ -root -f KDE_SESSION_VERSION 32c -set KDE_SESSION_VERSION 5
+ 
+ # At this point all environment variables are set, let's send it to the DBus session server to update the activation environment
+ if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then
+@@ -131,16 +78,15 @@ fi
+ 
+ # We set LD_BIND_NOW to increase the efficiency of kdeinit.
+ # kdeinit unsets this variable before loading applications.
+-LD_BIND_NOW=true @CMAKE_INSTALL_FULL_LIBEXECDIR_KF5@/start_kdeinit_wrapper --kded +kcminit_startup
++LD_BIND_NOW=true @NIXPKGS_START_KDEINIT_WRAPPER@ --kded +kcminit_startup
+ if test $? -ne 0; then
+   # Startup error
+   echo 'startplasma: Could not start kdeinit5. Check your installation.'  1>&2
+   test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
+-  xmessage -geometry 500x100 "Could not start kdeinit5. Check your installation."
+   exit 1
+ fi
+ 
+-qdbus org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
++@NIXPKGS_QDBUS@ org.kde.KSplash /KSplash org.kde.KSplash.setStage kinit &
+ 
+ # finally, give the session control to the session manager
+ # see kdebase/ksmserver for the description of the rest of the startup sequence
+@@ -166,19 +112,19 @@ fi
+ #Anything after here is logout
+ #It is not called after shutdown/restart
+ 
+-wait_drkonqi=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Enabled --default true`
+-
+-if test x"$wait_drkonqi"x = x"true"x ; then
++wait_drkonqi=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Enabled --default true)
++ 
++if [ x"$wait_drkonqi"x = x"true"x ]; then
+     # wait for remaining drkonqi instances with timeout (in seconds)
+-    wait_drkonqi_timeout=`kreadconfig5 --file startkderc --group WaitForDrKonqi --key Timeout --default 900`
++    wait_drkonqi_timeout=$(@NIXPKGS_KREADCONFIG5@ --file startkderc --group WaitForDrKonqi --key Timeout --default 900)
+     wait_drkonqi_counter=0
+-    while qdbus | grep "^[^w]*org.kde.drkonqi" > /dev/null ; do
++    while @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ -q "^[^w]*org.kde.drkonqi" ; do
+         sleep 5
+         wait_drkonqi_counter=$((wait_drkonqi_counter+5))
+-        if test "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ; then
++        if [ "$wait_drkonqi_counter" -ge "$wait_drkonqi_timeout" ]; then
+             # ask remaining drkonqis to die in a graceful way
+-            qdbus | grep 'org.kde.drkonqi-' | while read address ; do
+-                qdbus "$address" "/MainApplication" "quit"
++            @NIXPKGS_QDBUS@ | @NIXPKGS_GREP@ 'org.kde.drkonqi-' | while read address ; do
++                @NIXPKGS_QDBUS@ "$address" "/MainApplication" "quit"
+             done
+             break
+         fi
+@@ -187,15 +133,17 @@ fi
+ 
+ echo 'startplasma: Shutting down...'  1>&2
+ # just in case
+-test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
++if [ -n "$ksplash_pid" ]; then
++ "$ksplash_pid" 2>/dev/null
++fi
+ 
+ # Clean up
+-kdeinit5_shutdown
++@NIXPKGS_KDEINIT5_SHUTDOWN@
+ 
+ unset KDE_FULL_SESSION
+-xprop -root -remove KDE_FULL_SESSION
++@NIXPKGS_XPROP@ -root -remove KDE_FULL_SESSION
+ unset KDE_SESSION_VERSION
+-xprop -root -remove KDE_SESSION_VERSION
++@NIXPKGS_XPROP@ -root -remove KDE_SESSION_VERSION
+ unset KDE_SESSION_UID
+ 
+ echo 'startplasma: Done.'  1>&2
+diff --git a/startkde/startplasmacompositor.cmake b/startkde/startplasmacompositor.cmake
+index dd9e304d..12132f9e 100644
+--- a/startkde/startplasmacompositor.cmake
++++ b/startkde/startplasmacompositor.cmake
+@@ -1,118 +1,165 @@
+ #!/bin/sh
+ #
+-#  DEFAULT Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
++#  NIXPKGS Plasma STARTUP SCRIPT ( @PROJECT_VERSION@ )
+ #
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-if [  ${XDG_CONFIG_HOME} ]; then
+-  configDir=$XDG_CONFIG_HOME;
+-else
+-  configDir=${HOME}/.config; #this is the default, http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
++# we have to unset this for Darwin since it will screw up KDE's dynamic-loading
++unset DYLD_FORCE_FLAT_NAMESPACE
++
++export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
++@NIXPKGS_MKDIR@ -p "$XDG_CONFIG_HOME"
++
++# The KDE icon cache is supposed to update itself
++# automatically, but it uses the timestamp on the icon
++# theme directory as a trigger.  Since in Nix the
++# timestamp is always the same, this doesn't work.  So as
++# a workaround, nuke the icon cache on login.  This isn't
++# perfect, since it may require logging out after
++# installing new applications to update the cache.
++# See http://lists-archives.org/kde-devel/26175-what-when-will-icon-cache-refresh.html
++rm -fv $HOME/.cache/icon-cache.kcache
++
++# Qt writes a weird ‘libraryPath’ line to
++# ~/.config/Trolltech.conf that causes the KDE plugin
++# paths of previous KDE invocations to be searched.
++# Obviously using mismatching KDE libraries is potentially
++# disastrous, so here we nuke references to the Nix store
++# in Trolltech.conf.  A better solution would be to stop
++# Qt from doing this wackiness in the first place.
++if [ -e $XDG_CONFIG_HOME/Trolltech.conf ]; then
++    @NIXPKGS_SED@ -e '/nix\\store\|nix\/store/ d' -i $XDG_CONFIG_HOME/Trolltech.conf
++fi
++
++@NIXPKGS_KBUILDSYCOCA5@
++
++# Set the default GTK 2 theme
++gtkrc2="$HOME/.gtkrc-2.0"
++breeze_gtkrc2="/run/current-system/sw/share/themes/Breeze/gtk-2.0/gtkrc"
++if ! [ -e "$gtkrc2" ] && [ -e "$breeze_gtkrc2" ]; then
++    cat >"$gtkrc2" <<EOF
++# Default GTK+ 2 config for NixOS KDE 5
++include "$breeze_gtkrc2"
++style "user-font"
++{
++  font_name="Sans Serif Regular"
++}
++widget_class "*" style "user-font"
++gtk-font-name="Sans Serif Regular 10"
++gtk-theme-name="Breeze"
++gtk-icon-theme-name="breeze"
++gtk-fallback-icon-theme="hicolor"
++gtk-cursor-theme-name="breeze_cursors"
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
+ fi
+ sysConfigDirs=${XDG_CONFIG_DIRS:-/etc/xdg}
+ 
+-# We need to create config folder so we can write startupconfigkeys
+-mkdir -p $configDir
++# Set the default GTK 3 theme
++gtk3_settings="$XDG_CONFIG_HOME/gtk-3.0/settings.ini"
++breeze_gtk3="/run/current-system/sw/share/themes/Breeze/gtk-3.0"
++if ! [ -e "$gtk3_settings" ] && [ -e "$breeze_gtk" ]; then
++    mkdir -p $(dirname "$gtk3_settings")
++    cat >"$gtk3_settings" <<EOF
++[Settings]
++gtk-font-name=Sans Serif Regular 10
++gtk-theme-name=Breeze
++gtk-icon-theme-name=breeze
++gtk-fallback-icon-theme=hicolor
++gtk-cursor-theme-name=breeze_cursors
++gtk-toolbar-style=GTK_TOOLBAR_ICONS
++gtk-menu-images=1
++gtk-button-images=1
++EOF
++fi
++
++kcminputrc="$XDG_CONFIG_HOME/kcminputrc"
++if ! [ -e "$kcminputrc" ]; then
++    cat >"$kcminputrc" <<EOF
++[Mouse]
++cursorTheme=breeze_cursors
++cursorSize=0
++EOF
++fi
+ 
+ #This is basically setting defaults so we can use them with kstartupconfig5
+-cat >$configDir/startupconfigkeys <<EOF
++cat >"$XDG_CONFIG_HOME/startupconfigkeys" <<EOF
+ kcminputrc Mouse cursorTheme 'breeze_cursors'
+ kcminputrc Mouse cursorSize ''
+-ksplashrc KSplash Theme Breeze
++ksplashrc KSplash Theme org.kde.breeze.desktop
+ ksplashrc KSplash Engine KSplashQML
+-kcmfonts General forceFontDPIWayland 0
++kdeglobals KScreen ScreenScaleFactors ''
++kcmfonts General forceFontDPI 0
++kcmfonts General dontChangeAASettings true
+ EOF
+ 
+ # preload the user's locale on first start
+-plasmalocalerc=$configDir/plasma-localerc
+-test -f $plasmalocalerc || {
+-cat >$plasmalocalerc <<EOF
++plasmalocalerc="$XDG_CONFIG_HOME/plasma-localerc"
++if ! [ -f "$plasmalocalerc" ]; then
++    cat >"$plasmalocalerc" <<EOF
+ [Formats]
+ LANG=$LANG
+ EOF
+-}
++fi
+ 
+ # export LC_* variables set by kcmshell5 formats into environment
+ # so it can be picked up by QLocale and friends.
+-exportformatssettings=$configDir/plasma-locale-settings.sh
+-test -f $exportformatssettings && {
+-    . $exportformatssettings
+-}
++exportformatssettings="$XDG_CONFIG_HOME/plasma-locale-settings.sh"
++if [ -r "$exportformatssettings" ]; then
++    . "$exportformatssettings"
++fi
+ 
+ # Write a default kdeglobals file to set up the font
+-kdeglobalsfile=$configDir/kdeglobals
+-test -f $kdeglobalsfile || {
+-cat >$kdeglobalsfile <<EOF
++kdeglobalsfile="$XDG_CONFIG_HOME/kdeglobals"
++if ! [ -f "$kdeglobalsfile" ]; then
++    cat >"$kdeglobalsfile" <<EOF
+ [General]
+-XftAntialias=true
+-XftHintStyle=hintmedium
+-XftSubPixel=none
++fixed=Monospace,10,-1,5,50,0,0,0,0,0,Regular
++font=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++menuFont=Sans Serif,10,-1,5,50,0,0,0,0,0,Regular
++smallestReadableFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++toolBarFont=Sans Serif,8,-1,5,50,0,0,0,0,0,Regular
++
++[WM]
++activeFont=Noto Sans,12,-1,5,50,0,0,0,0,0,Bold
+ EOF
+-}
+-
+-# Make sure the Oxygen font is installed
+-# This is necessary for setups where CMAKE_INSTALL_PREFIX
+-# is not in /usr. fontconfig looks in /usr, ~/.fonts and
+-# $XDG_DATA_HOME for fonts. In this case, we symlink the
+-# Oxygen font under ${XDG_DATA_HOME} and make it known to
+-# fontconfig
+-
+-usr_share="/usr/share"
+-install_share="@KDE_INSTALL_FULL_DATADIR@"
+-
+-if [ ! $install_share = $usr_share ]; then
+-
+-    if [ ${XDG_DATA_HOME} ]; then
+-        fontsDir="${XDG_DATA_HOME}/fonts"
+-    else
+-        fontsDir="${HOME}/.fonts"
+-    fi
+-
+-    test -d $fontsDir || {
+-        mkdir -p $fontsDir
+-    }
+-
+-    oxygenDir=$fontsDir/truetype/oxygen
+-    prefixDir="@KDE_INSTALL_FULL_DATADIR@/fonts/truetype/oxygen"
+-
+-    # if the oxygen dir doesn't exist, create a symlink to be sure that the
+-    # Oxygen font is available to the user
+-    test -d $oxygenDir || test -d $prefixDir && {
+-        test -h $oxygenDir || ln -s $prefixDir $oxygenDir && fc-cache $oxygenDir
+-    }
+ fi
+ 
+-kstartupconfig5
++@CMAKE_INSTALL_FULL_BINDIR@/kstartupconfig5
+ returncode=$?
+ if test $returncode -ne 0; then
+     exit 1
+ fi
+-[ -r $configDir/startupconfig ] && . $configDir/startupconfig
++if [ -r "$XDG_CONFIG_HOME/startupconfig" ]; then
++    . "$XDG_CONFIG_HOME/startupconfig"
++fi
+ 
+ #Manually disable auto scaling because we are scaling above
+ #otherwise apps that manually opt in for high DPI get auto scaled by the developer AND scaled by the wl_output
+ export QT_AUTO_SCREEN_SCALE_FACTOR=0
+ 
+-# XCursor mouse theme needs to be applied here to work even for kded or ksmserver
+-if test -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ; then
+-    @EXPORT_XCURSOR_PATH@
++XCURSOR_PATH=~/.icons
++IFS=":" read -r -a xdgDirs <<< "$XDG_DATA_DIRS"
++for xdgDir in "${xdgDirs[@]}"; do
++    XCURSOR_PATH="$XCURSOR_PATH:$xdgDir/icons"
++done
++export XCURSOR_PATH
+ 
+-    # TODO: is kapplymousetheme a core app?
++# XCursor mouse theme needs to be applied here to work even for kded or ksmserver
++if [ -n "$kcminputrc_mouse_cursortheme" -o -n "$kcminputrc_mouse_cursorsize" ]; then
+     #kapplymousetheme "$kcminputrc_mouse_cursortheme" "$kcminputrc_mouse_cursorsize"
+-    if test $? -eq 10; then
+-        XCURSOR_THEME=breeze_cursors
+-        export XCURSOR_THEME
+-    elif test -n "$kcminputrc_mouse_cursortheme"; then
+-        XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+-        export XCURSOR_THEME
++    if [ $? -eq 10 ]; then
++        export XCURSOR_THEME=breeze_cursors
++    elif [ -n "$kcminputrc_mouse_cursortheme" ]; then
++        export XCURSOR_THEME="$kcminputrc_mouse_cursortheme"
+     fi
+-    if test -n "$kcminputrc_mouse_cursorsize"; then
+-        XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+-        export XCURSOR_SIZE
++    if [ -n "$kcminputrc_mouse_cursorsize" ]; then
++        export XCURSOR_SIZE="$kcminputrc_mouse_cursorsize"
+     fi
+ fi
+ 
+-if test "$kcmfonts_general_forcefontdpiwayland" -ne 0; then
++if [ "${kcmfonts_general_forcefontdpiwayland:-0}" -ne 0 ]; then
+     export QT_WAYLAND_FORCE_DPI=$kcmfonts_general_forcefontdpiwayland
+ else
+     export QT_WAYLAND_FORCE_DPI=96
+@@ -120,12 +167,12 @@ fi
+ 
+ # Get a property value from org.freedesktop.locale1
+ queryLocale1() {
+-    qdbus --system org.freedesktop.locale1 /org/freedesktop/locale1 "$1"
++    @NIXPKGS_QDBUS@ --system org.freedesktop.locale1 /org/freedesktop/locale1 "$1"
+ }
+ 
+ # Query whether org.freedesktop.locale1 is available. If it is, try to
+ # set XKB_DEFAULT_{MODEL,LAYOUT,VARIANT,OPTIONS} accordingly.
+-if qdbus --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then
++if @NIXPKGS_QDBUS@ --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then
+     # Do not overwrite existing values. There is no point in setting only some
+     # of them as then they would not match anymore.
+     if [ -z "${XKB_DEFAULT_MODEL}" -a -z "${XKB_DEFAULT_LAYOUT}" -a \
+@@ -141,41 +188,10 @@ if qdbus --system org.freedesktop.locale1 >/dev/null 2>/dev/null; then
+     fi
+ fi
+ 
+-# Source scripts found in <config locations>/plasma-workspace/env/*.sh
+-# (where <config locations> correspond to the system and user's configuration
+-# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
+-# and /etc/xdg/ on Linux)
+-#
+-# This is where you can define environment variables that will be available to
+-# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
+-# or eval `gpg-agent --daemon`.
+-# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
+-#
+-# (see end of this file).
+-# For anything else (that doesn't set env vars, or that needs a window manager),
+-# better use the Autostart folder.
+-
+-scriptpath=`echo "$configDir:$sysConfigDirs" | tr ':' '\n'`
+-
+-for prefix in `echo $scriptpath`; do
+-  for file in "$prefix"/plasma-workspace/env/*.sh; do
+-    test -r "$file" && . "$file" || true
+-  done
+-done
+-
+ echo 'startplasmacompositor: Starting up...'  1>&2
+ 
+-# Make sure that the KDE prefix is first in XDG_DATA_DIRS and that it's set at all.
+-# The spec allows XDG_DATA_DIRS to be not set, but X session startup scripts tend
+-# to set it to a list of paths *not* including the KDE prefix if it's not /usr or
+-# /usr/local.
+-if test -z "$XDG_DATA_DIRS"; then
+-XDG_DATA_DIRS="@KDE_INSTALL_FULL_DATADIR@:/usr/share:/usr/local/share"
+-fi
+-export XDG_DATA_DIRS
+-
+ # Make sure that D-Bus is running
+-if qdbus >/dev/null 2>/dev/null; then
++if @NIXPKGS_QDBUS@ >/dev/null 2>/dev/null; then
+     : # ok
+ else
+     echo 'startplasmacompositor: Could not start D-Bus. Can you call qdbus?'  1>&2
+@@ -212,26 +228,47 @@ export KDE_FULL_SESSION
+ KDE_SESSION_VERSION=5
+ export KDE_SESSION_VERSION
+ 
+-KDE_SESSION_UID=`id -ru`
++KDE_SESSION_UID=$(@NIXPKGS_ID@ -ru)
+ export KDE_SESSION_UID
+ 
+ XDG_CURRENT_DESKTOP=KDE
+ export XDG_CURRENT_DESKTOP
+ 
++# Source scripts found in <config locations>/plasma-workspace/env/*.sh
++# (where <config locations> correspond to the system and user's configuration
++# directories, as identified by Qt's qtpaths,  e.g.  $HOME/.config
++# and /etc/xdg/ on Linux)
++#
++# This is where you can define environment variables that will be available to
++# all KDE programs, so this is where you can run agents using e.g. eval `ssh-agent`
++# or eval `gpg-agent --daemon`.
++# Note: if you do that, you should also put "ssh-agent -k" as a shutdown script
++#
++# (see end of this file).
++# For anything else (that doesn't set env vars, or that needs a window manager),
++# better use the Autostart folder.
++
++IFS=":" read -r -a scriptpath <<< $(@NIXPKGS_QTPATHS@ --paths GenericConfigLocation)
++# Add /env/ to the directory to locate the scripts to be sourced
++for prefix in "${scriptpath[@]}"; do
++    for file in "$prefix"/plasma-workspace/env/*.sh; do
++        if [ -r "$file" ]; then
++            . "$file"
++        fi
++    done
++done
++
+ # kwin_wayland can possibly also start dbus-activated services which need env variables.
+ # In that case, the update in startplasma might be too late.
+-if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then
+-    dbus-update-activation-environment --systemd --all
+-else
+-    @CMAKE_INSTALL_FULL_LIBEXECDIR@/ksyncdbusenv
+-fi
+-if test $? -ne 0; then
+-  # Startup error
+-  echo 'startplasmacompositor: Could not sync environment to dbus.'  1>&2
+-  exit 1
++if ! @NIXPKGS_DBUS_UPDATE_ACTIVATION_ENVIRONMENT@ --systemd --all; then
++    # Startup error
++    echo 'startkde: Could not sync environment to dbus.'  1>&2
++    test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null
++    echo 'startplasmacompositor: Could not sync environment to dbus.'  1>&2
++    exit 1
+ fi
+ 
+-@KWIN_WAYLAND_BIN_PATH@ --xwayland --libinput --exit-with-session=@CMAKE_INSTALL_FULL_LIBEXECDIR@/startplasma
++@KWIN_WAYLAND_BIN_PATH@ --xwayland --libinput --exit-with-session=@NIXPKGS_STARTPLASMA@
+ 
+ echo 'startplasmacompositor: Shutting down...'  1>&2
+ 
diff --git a/nixpkgs/pkgs/desktops/plasma-5/polkit-kde-agent.nix b/nixpkgs/pkgs/desktops/plasma-5/polkit-kde-agent.nix
new file mode 100644
index 000000000000..c25b3d2744b7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/polkit-kde-agent.nix
@@ -0,0 +1,15 @@
+{
+  mkDerivation, extra-cmake-modules,
+  kcoreaddons, kconfig, kcrash, kdbusaddons, ki18n, kiconthemes, knotifications,
+  kwidgetsaddons, kwindowsystem, polkit-qt
+}:
+
+mkDerivation {
+  name = "polkit-kde-agent";
+  nativeBuildInputs = [ extra-cmake-modules ];
+  propagatedBuildInputs = [
+    kdbusaddons kwidgetsaddons kcoreaddons kcrash kconfig ki18n kiconthemes
+    knotifications kwindowsystem polkit-qt
+  ];
+  outputs = [ "out" "dev" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/powerdevil.nix b/nixpkgs/pkgs/desktops/plasma-5/powerdevil.nix
new file mode 100644
index 000000000000..65fc5446c16e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/powerdevil.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation,
+  extra-cmake-modules, kdoctools,
+  bluez-qt, kactivities, kauth, kconfig, kdbusaddons, kdelibs4support,
+  kglobalaccel, ki18n, kidletime, kio, knotifyconfig, kwayland, libkscreen,
+  networkmanager-qt, plasma-workspace, qtx11extras, solid, udev
+}:
+
+mkDerivation {
+  name = "powerdevil";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kconfig kdbusaddons knotifyconfig solid udev bluez-qt kactivities kauth
+    kdelibs4support kglobalaccel ki18n kio kidletime kwayland libkscreen
+    networkmanager-qt plasma-workspace qtx11extras
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/sddm-kcm.nix b/nixpkgs/pkgs/desktops/plasma-5/sddm-kcm.nix
new file mode 100644
index 000000000000..6becf3bf420b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/sddm-kcm.nix
@@ -0,0 +1,16 @@
+{
+  mkDerivation, extra-cmake-modules, shared-mime-info,
+  libpthreadstubs, libXcursor, libXdmcp,
+  qtquickcontrols2, qtx11extras,
+  karchive, ki18n, kio, knewstuff
+}:
+
+mkDerivation {
+  name = "sddm-kcm";
+  nativeBuildInputs = [ extra-cmake-modules shared-mime-info ];
+  buildInputs = [
+    libpthreadstubs libXcursor libXdmcp
+    qtquickcontrols2 qtx11extras
+    karchive ki18n kio knewstuff
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/srcs.nix b/nixpkgs/pkgs/desktops/plasma-5/srcs.nix
new file mode 100644
index 000000000000..0842034f0d89
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/srcs.nix
@@ -0,0 +1,365 @@
+# DO NOT EDIT! This file is generated automatically by fetch-kde-qt.sh
+{ fetchurl, mirror }:
+
+{
+  bluedevil = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/bluedevil-5.14.5.tar.xz";
+      sha256 = "1khqw11apvcf5g5m9z111rvk4scxh3z3yhcpwqws1h0s5c5lr7z7";
+      name = "bluedevil-5.14.5.tar.xz";
+    };
+  };
+  breeze = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/breeze-5.14.5.tar.xz";
+      sha256 = "15hphz2mm2m3j0a0hwj7m65rggyaxdxy08yqs73bg3yg67n6x3p7";
+      name = "breeze-5.14.5.tar.xz";
+    };
+  };
+  breeze-grub = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/breeze-grub-5.14.5.tar.xz";
+      sha256 = "0bkaaxfl1ds58qcdrxswaacir7wcc65a960lwdkmpdl16g9f4gix";
+      name = "breeze-grub-5.14.5.tar.xz";
+    };
+  };
+  breeze-gtk = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/breeze-gtk-5.14.5.tar.xz";
+      sha256 = "0bysq83xbqmhb4wld51zd6lllr66b8w7pinizc99k8z1yz5jdb0m";
+      name = "breeze-gtk-5.14.5.tar.xz";
+    };
+  };
+  breeze-plymouth = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/breeze-plymouth-5.14.5.tar.xz";
+      sha256 = "1rbdpz9vlami7217v3dk8ljz0fgjz9zi1l0gwkhslayz5sybld96";
+      name = "breeze-plymouth-5.14.5.tar.xz";
+    };
+  };
+  discover = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/discover-5.14.5.tar.xz";
+      sha256 = "0gxhl2cv5yz3jw8fp8g8idi1k5hlhnvwbnvvg0dgnlzz6jb1s8dd";
+      name = "discover-5.14.5.tar.xz";
+    };
+  };
+  drkonqi = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/drkonqi-5.14.5.tar.xz";
+      sha256 = "0xgym368f9r21wjh9fpv16m90dcj87g9p5df850fnn2k5n8x38z8";
+      name = "drkonqi-5.14.5.tar.xz";
+    };
+  };
+  kactivitymanagerd = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kactivitymanagerd-5.14.5.tar.xz";
+      sha256 = "0zms9npis0rklnbz93c69h4yg7dkrmfkzvzsfvkg90w37ap3vyl7";
+      name = "kactivitymanagerd-5.14.5.tar.xz";
+    };
+  };
+  kde-cli-tools = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kde-cli-tools-5.14.5.tar.xz";
+      sha256 = "01mrnjqla4q07cnb1p51nq2pvj9vaamic3dsyj3b7hqky9fna9ln";
+      name = "kde-cli-tools-5.14.5.tar.xz";
+    };
+  };
+  kdecoration = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kdecoration-5.14.5.tar.xz";
+      sha256 = "115pli0qpa8lx0jasg1886fcg7gb2kk8v6k8r8l8c820l97sq7in";
+      name = "kdecoration-5.14.5.tar.xz";
+    };
+  };
+  kde-gtk-config = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kde-gtk-config-5.14.5.tar.xz";
+      sha256 = "12467wkjh2nmcf6r7n8qin1rryd39g0dg7gn43sdg6vdwpyl2kdm";
+      name = "kde-gtk-config-5.14.5.tar.xz";
+    };
+  };
+  kdeplasma-addons = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kdeplasma-addons-5.14.5.tar.xz";
+      sha256 = "18sph3719d9pq2j5k7swiv9xbrpj659a3q66zvhz3dmh11y73f0m";
+      name = "kdeplasma-addons-5.14.5.tar.xz";
+    };
+  };
+  kgamma5 = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kgamma5-5.14.5.tar.xz";
+      sha256 = "17smrdwyalknb3f6ckqs7kglfpqwajbiyd212wlsmqbva4by0fy0";
+      name = "kgamma5-5.14.5.tar.xz";
+    };
+  };
+  khotkeys = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/khotkeys-5.14.5.tar.xz";
+      sha256 = "0572jpgbhacx4gy40m594rbnxy3zaq5w3lcrfd8i2750ljswcq24";
+      name = "khotkeys-5.14.5.tar.xz";
+    };
+  };
+  kinfocenter = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kinfocenter-5.14.5.tar.xz";
+      sha256 = "1z1i9g923cbdni5gfa6dpv46z1p2v40rfcvhy7i9h5nf49aw2rnc";
+      name = "kinfocenter-5.14.5.tar.xz";
+    };
+  };
+  kmenuedit = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kmenuedit-5.14.5.tar.xz";
+      sha256 = "1aa4a35s5h44fc88hmmfdpzy26zc47h9n448cd4vbm4bm411551d";
+      name = "kmenuedit-5.14.5.tar.xz";
+    };
+  };
+  kscreen = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kscreen-5.14.5.tar.xz";
+      sha256 = "1nb1ysgcx49galbf16mxbawybfik92bpr9vbwgg5ycsdx1f9q8yi";
+      name = "kscreen-5.14.5.tar.xz";
+    };
+  };
+  kscreenlocker = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kscreenlocker-5.14.5.tar.xz";
+      sha256 = "16amr7pz0k6w5vkk1dwn2qi3s1mln0jypwmjazqq2lbwimn8k56m";
+      name = "kscreenlocker-5.14.5.tar.xz";
+    };
+  };
+  ksshaskpass = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/ksshaskpass-5.14.5.tar.xz";
+      sha256 = "0skr247k4ky7lpbdwlmkrnr3mj1pa6pxl96pyxwsw7za784qg6dj";
+      name = "ksshaskpass-5.14.5.tar.xz";
+    };
+  };
+  ksysguard = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/ksysguard-5.14.5.tar.xz";
+      sha256 = "0ybxh6ll080rkrrr4b5ydl06x8zi97702661cajvbv00lhq4vp8b";
+      name = "ksysguard-5.14.5.tar.xz";
+    };
+  };
+  kwallet-pam = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kwallet-pam-5.14.5.tar.xz";
+      sha256 = "1mkjjc88kqf5x313nifla9pzrgzqm4v92150dbs1f89bsn673pk8";
+      name = "kwallet-pam-5.14.5.tar.xz";
+    };
+  };
+  kwayland-integration = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kwayland-integration-5.14.5.tar.xz";
+      sha256 = "0rd0xhb53iixv9i8x0gh3rr1082lj7zdymsqdmi7sfgb66g8c03l";
+      name = "kwayland-integration-5.14.5.tar.xz";
+    };
+  };
+  kwin = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kwin-5.14.5.tar.xz";
+      sha256 = "0ifdlnzw3ydrbidzk256vks66d1rxyilhqi09csygx17jqk7szj4";
+      name = "kwin-5.14.5.tar.xz";
+    };
+  };
+  kwrited = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/kwrited-5.14.5.tar.xz";
+      sha256 = "0115qscr8a54h7h8w4xw4fjzp7qipyw3d3jswhii7axnzp6q6qnh";
+      name = "kwrited-5.14.5.tar.xz";
+    };
+  };
+  libkscreen = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/libkscreen-5.14.5.tar.xz";
+      sha256 = "1vyaml5ap9siw9idiny92li2bykd0nwjsmwmg0c7ad912j4g1s7y";
+      name = "libkscreen-5.14.5.tar.xz";
+    };
+  };
+  libksysguard = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/libksysguard-5.14.5.tar.xz";
+      sha256 = "11nz0g7dqvpvgsv0a7sai445vgfsfi25plj7jb1i46n7zf8i8mya";
+      name = "libksysguard-5.14.5.tar.xz";
+    };
+  };
+  milou = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/milou-5.14.5.tar.xz";
+      sha256 = "1776441mhmwcvrzmdqg531md79azbkbhng51kyq6i9cvkhxyf583";
+      name = "milou-5.14.5.tar.xz";
+    };
+  };
+  oxygen = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/oxygen-5.14.5.tar.xz";
+      sha256 = "0h70k7af69zdky0g6napd1kdnvbxhnw3nrwr9jqv1fq5762xnkk8";
+      name = "oxygen-5.14.5.tar.xz";
+    };
+  };
+  plasma-browser-integration = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-browser-integration-5.14.5.tar.xz";
+      sha256 = "1260h5sh0gkbkhcj17ss0n0y48i1pxh3f4p5dcbgbz775g1dhi2s";
+      name = "plasma-browser-integration-5.14.5.tar.xz";
+    };
+  };
+  plasma-desktop = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-desktop-5.14.5.tar.xz";
+      sha256 = "0pr07p36jrpvkk4fp14fb4minnwj5gnmvdg9jf7bi8sjjz6jpnnl";
+      name = "plasma-desktop-5.14.5.tar.xz";
+    };
+  };
+  plasma-integration = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-integration-5.14.5.tar.xz";
+      sha256 = "15nhrliri4cjx712f1rxbq2f87lj4wxsqgbhw9p02z12h3n9z3ds";
+      name = "plasma-integration-5.14.5.tar.xz";
+    };
+  };
+  plasma-nm = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-nm-5.14.5.tar.xz";
+      sha256 = "1hf98c9llcff0h2w4l45nw0vysxvnanf7hczhj93z4562qrafxm2";
+      name = "plasma-nm-5.14.5.tar.xz";
+    };
+  };
+  plasma-pa = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-pa-5.14.5.tar.xz";
+      sha256 = "0z74qg7m4y1ifzni1877hiil3rn6ad3x4fvgv4bib4jhg7ckaiqg";
+      name = "plasma-pa-5.14.5.tar.xz";
+    };
+  };
+  plasma-sdk = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-sdk-5.14.5.tar.xz";
+      sha256 = "0v90nk6yhrapdszh8sd3m0wffkjgnrhdy1sz1vl9s0ab5sdpmxr1";
+      name = "plasma-sdk-5.14.5.tar.xz";
+    };
+  };
+  plasma-tests = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-tests-5.14.5.tar.xz";
+      sha256 = "03h889xn6i067d1sdymn6fgj8xik3pa75lljl8kj3vl6bks24jyh";
+      name = "plasma-tests-5.14.5.tar.xz";
+    };
+  };
+  plasma-vault = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-vault-5.14.5.tar.xz";
+      sha256 = "17r44n0mkcwc2fkjf397ks8xv82m59gvnawbj9713c5l31ln5mi3";
+      name = "plasma-vault-5.14.5.tar.xz";
+    };
+  };
+  plasma-workspace = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-workspace-5.14.5.tar.xz";
+      sha256 = "14d3wnsm4bi1izx5qlpk0mnqmxwx18bqypa3wwmhn1535kfz8glh";
+      name = "plasma-workspace-5.14.5.tar.xz";
+    };
+  };
+  plasma-workspace-wallpapers = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plasma-workspace-wallpapers-5.14.5.tar.xz";
+      sha256 = "17q0685i4267ihlrii3b8764ak458kzs0inqfcj9x25m338xz19q";
+      name = "plasma-workspace-wallpapers-5.14.5.tar.xz";
+    };
+  };
+  plymouth-kcm = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/plymouth-kcm-5.14.5.tar.xz";
+      sha256 = "1cwmkprhc4496x4a38l2x7hnifnp4daw8g1gic0ik2sm0a6xn77k";
+      name = "plymouth-kcm-5.14.5.tar.xz";
+    };
+  };
+  polkit-kde-agent = {
+    version = "1-5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/polkit-kde-agent-1-5.14.5.tar.xz";
+      sha256 = "1lzw4zq2ysnva5g1v85k9k6yck30wfgcy0sn1ncxy183vm36b2ag";
+      name = "polkit-kde-agent-1-5.14.5.tar.xz";
+    };
+  };
+  powerdevil = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/powerdevil-5.14.5.tar.xz";
+      sha256 = "0rdrj6k7bb1cisz1g8akxxn68c8rj0zddim1afvcq1iqr727wqj5";
+      name = "powerdevil-5.14.5.tar.xz";
+    };
+  };
+  sddm-kcm = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/sddm-kcm-5.14.5.tar.xz";
+      sha256 = "0aix2grc2h2w8qxcbdwxhvq09ispblnisl017bvb19apkvs0w8m1";
+      name = "sddm-kcm-5.14.5.tar.xz";
+    };
+  };
+  systemsettings = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/systemsettings-5.14.5.tar.xz";
+      sha256 = "1q1ih74vkdhss64ayc3qmbrw4hhvfl3axlkhh63rky09qn83x9zw";
+      name = "systemsettings-5.14.5.tar.xz";
+    };
+  };
+  user-manager = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/user-manager-5.14.5.tar.xz";
+      sha256 = "0aw2s029547rzx3xg9nib5w30d25978fpv7xyshxmp3z8rmzgcjv";
+      name = "user-manager-5.14.5.tar.xz";
+    };
+  };
+  xdg-desktop-portal-kde = {
+    version = "5.14.5";
+    src = fetchurl {
+      url = "${mirror}/stable/plasma/5.14.5/xdg-desktop-portal-kde-5.14.5.tar.xz";
+      sha256 = "0h6hdk9fkf98jfjaza773k37369ayvwmwrgxn6al2pma6n07vddq";
+      name = "xdg-desktop-portal-kde-5.14.5.tar.xz";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/systemsettings.nix b/nixpkgs/pkgs/desktops/plasma-5/systemsettings.nix
new file mode 100644
index 000000000000..9ff906f79745
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/systemsettings.nix
@@ -0,0 +1,17 @@
+{
+  mkDerivation, extra-cmake-modules, kdoctools,
+  kcmutils, kconfig, kdbusaddons, khtml, ki18n, kiconthemes, kio, kitemviews,
+  kservice, kwindowsystem, kxmlgui, qtquickcontrols, qtquickcontrols2,
+  kactivities, kactivities-stats, kirigami2, kcrash, plasma-workspace
+}:
+
+mkDerivation {
+  name = "systemsettings";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcmutils kconfig kdbusaddons khtml ki18n kiconthemes kio kitemviews kservice
+    kwindowsystem kxmlgui qtquickcontrols qtquickcontrols2
+    kactivities kactivities-stats kirigami2 kcrash plasma-workspace
+  ];
+  outputs = [ "bin" "dev" "out" ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/user-manager.nix b/nixpkgs/pkgs/desktops/plasma-5/user-manager.nix
new file mode 100644
index 000000000000..f46792fc48f7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/user-manager.nix
@@ -0,0 +1,13 @@
+{
+  mkDerivation, extra-cmake-modules, kdoctools, kcmutils, kconfig, khtml,
+  ki18n, kiconthemes, kio, kwindowsystem, libpwquality
+}:
+
+mkDerivation {
+  name = "user-manager";
+  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
+  buildInputs = [
+    kcmutils kconfig khtml ki18n kiconthemes kio kwindowsystem
+    libpwquality
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/plasma-5/xdg-desktop-portal-kde.nix b/nixpkgs/pkgs/desktops/plasma-5/xdg-desktop-portal-kde.nix
new file mode 100644
index 000000000000..fc77e163e8f9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/plasma-5/xdg-desktop-portal-kde.nix
@@ -0,0 +1,15 @@
+{
+  mkDerivation,
+  extra-cmake-modules, gettext, kdoctools, python,
+  kcoreaddons, knotifications, kwayland, kwidgetsaddons,
+  cups, pcre, pipewire
+}:
+
+mkDerivation {
+  name = "xdg-desktop-portal-kde";
+  nativeBuildInputs = [ extra-cmake-modules gettext kdoctools python ];
+  buildInputs = [
+    cups pcre pipewire
+    kcoreaddons knotifications kwayland kwidgetsaddons
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/rox/rox-filer/default.nix b/nixpkgs/pkgs/desktops/rox/rox-filer/default.nix
new file mode 100644
index 000000000000..543e3ca897f1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/rox/rox-filer/default.nix
@@ -0,0 +1,79 @@
+{ stdenv, fetchurl, pkgconfig, libxml2, gtk, libSM, shared-mime-info, hicolor-icon-theme }:
+
+let
+  version = "2.11";
+  name = "rox-filer-${version}";
+in stdenv.mkDerivation {
+  inherit name;
+
+  src = fetchurl {
+    url = "mirror://sourceforge/rox/rox-filer-${version}.tar.bz2";
+    sha256 = "a929bd32ee18ef7a2ed48b971574574592c42e34ae09f36604bf663d7c101ba8";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ libxml2 gtk shared-mime-info hicolor-icon-theme libSM ];
+  NIX_LDFLAGS = [ "-ldl" "-lm" ];
+
+  patches = [
+    ./rox-filer-2.11-in-source-build.patch
+  ];
+
+  # go to the source directory after unpacking the sources
+  setSourceRoot = "export sourceRoot=rox-filer-${version}/ROX-Filer/";
+
+  # patch source with defined patches
+  patchFlags = "-p0";
+
+  # patch the main.c to disable the lookup of the APP_DIR environment variable,
+  # which is used to lookup the location for certain images when rox-filer
+  # starts; rather override the location with an absolute path to the directory
+  # where images are stored to prevent having to use a wrapper, which sets the
+  # APP_DIR environment variable prior to starting rox-filer
+  preConfigure = ''
+    sed -i -e "s:g_strdup(getenv(\"APP_DIR\")):\"$out\":" src/main.c
+    mkdir build
+    cd build
+  '';
+
+  configureScript = "../src/configure";
+
+  installPhase = ''
+    mkdir -p "$out"
+    cd ..
+    cp -av Help Messages Options.xml ROX images style.css .DirIcon "$out"
+
+    # create the man/ directory, which will be moved from $out to share/ in the fixup phase
+    mkdir "$out/man/"
+    cp -av ../rox.1 "$out/man/"
+
+    # the main executable
+    mkdir "$out/bin/"
+    cp -v ROX-Filer "$out/bin/rox"
+
+    # mime types
+    mkdir -p "$out/ROX/MIME"
+    cd "$out/ROX/MIME"
+    ln -sv text-x-{diff,patch}.png
+    ln -sv application-x-font-{afm,type1}.png
+    ln -sv application-xml{,-dtd}.png
+    ln -sv application-xml{,-external-parsed-entity}.png
+    ln -sv application-{,rdf+}xml.png
+    ln -sv application-x{ml,-xbel}.png
+    ln -sv application-{x-shell,java}script.png
+    ln -sv application-x-{bzip,xz}-compressed-tar.png
+    ln -sv application-x-{bzip,lzma}-compressed-tar.png
+    ln -sv application-x-{bzip-compressed-tar,lzo}.png
+    ln -sv application-x-{bzip,xz}.png
+    ln -sv application-x-{gzip,lzma}.png
+    ln -sv application-{msword,rtf}.png
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Fast, lightweight, gtk2 file manager";
+    homepage = http://rox.sourceforge.net/desktop;
+    license = with licenses; [ gpl2 lgpl2 ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eleanor ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/rox/rox-filer/rox-filer-2.11-in-source-build.patch b/nixpkgs/pkgs/desktops/rox/rox-filer/rox-filer-2.11-in-source-build.patch
new file mode 100644
index 000000000000..11bd80044595
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/rox/rox-filer/rox-filer-2.11-in-source-build.patch
@@ -0,0 +1,16 @@
+--- src/configure	2011-10-09 16:32:14.000000000 +0200
++++ src/configure2	2016-03-20 09:26:31.640891863 +0100
+@@ -2132,13 +2132,6 @@
+ 
+ 
+ ac_config_headers="$ac_config_headers config.h"
+-
+-
+- if [ -f configure ]; then
+-	as_fn_error $? "Please run configure from the build directory (try ../AppRun --compile)" "$LINENO" 5
+-	exit 1
+-fi
+-
+ ac_ext=c
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/gigolo.nix b/nixpkgs/pkgs/desktops/xfce/applications/gigolo.nix
new file mode 100644
index 000000000000..b29a50af3654
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/gigolo.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchurl, python, gettext, intltool, pkgconfig, gtk, gvfs }:
+
+stdenv.mkDerivation rec {
+  p_name  = "gigolo";
+  ver_maj = "0.4";
+  ver_min = "2";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0r4ij0mlnp0bqq44pyrdcpz18r1zwsksw6w5yc0jzgg7wj7wfgsm";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ python gettext intltool gtk gvfs];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/applications/${p_name}";
+    description = "A frontend to easily manage connections to remote filesystems";
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/mousepad-12134.patch b/nixpkgs/pkgs/desktops/xfce/applications/mousepad-12134.patch
new file mode 100644
index 000000000000..74a28ecf61af
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/mousepad-12134.patch
@@ -0,0 +1,90 @@
+diff -urNZ a/mousepad/mousepad-action-group.c b/mousepad/mousepad-action-group.c
+--- a/mousepad/mousepad-action-group.c	2014-09-01 20:50:07.000000000 +0000
++++ b/mousepad/mousepad-action-group.c	2017-12-18 16:57:46.836538403 +0000
+@@ -302,11 +302,6 @@
+   gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+   self->locked = FALSE;
+ 
+-  /* update the setting when the active action is changed */
+-  self->locked = TRUE;
+-  MOUSEPAD_SETTING_SET_STRING (COLOR_SCHEME, gtk_source_style_scheme_get_id (scheme));
+-  self->locked = FALSE;
+-
+   g_object_notify (G_OBJECT (self), "active-style-scheme");
+ }
+ 
+@@ -473,6 +468,8 @@
+ mousepad_action_group_style_scheme_action_activate (MousepadActionGroup       *self,
+                                                     MousepadStyleSchemeAction *action)
+ {
++  const gchar *scheme_name = NULL;
++
+   /* only update the active action if we're not already in the process of
+    * setting it and the sender action is actually active */
+   if (! self->locked &&
+@@ -481,7 +478,14 @@
+       GtkSourceStyleScheme *scheme;
+ 
+       scheme = mousepad_style_scheme_action_get_style_scheme (action);
+-      mousepad_action_group_set_active_style_scheme (self, scheme);
++
++      /* update the setting when the active action is changed */
++      if (scheme != NULL)
++        scheme_name = gtk_source_style_scheme_get_id(scheme);
++
++      self->locked = TRUE;
++      MOUSEPAD_SETTING_SET_STRING (COLOR_SCHEME, scheme_name);
++      self->locked = FALSE;
+     }
+ }
+ 
+diff -urNZ a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c
+--- a/mousepad/mousepad-window.c	2014-09-01 20:58:02.000000000 +0000
++++ b/mousepad/mousepad-window.c	2017-12-18 17:07:51.099321408 +0000
+@@ -712,32 +712,6 @@
+ 
+ 
+ static void
+-mousepad_window_action_group_style_scheme_changed (MousepadWindow      *window,
+-                                                   GParamSpec          *pspec,
+-                                                   MousepadActionGroup *group)
+-{
+-  GtkSourceStyleScheme *scheme;
+-  const gchar          *scheme_id;
+-  gint                  npages, i;
+-
+-  /* get the new active language */
+-  scheme = mousepad_action_group_get_active_style_scheme (group);
+-  scheme_id = gtk_source_style_scheme_get_id (scheme);
+-
+-  /* update the color scheme on all the documents */
+-  npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
+-  for (i = 0; i < npages; i++)
+-    {
+-      MousepadDocument *document;
+-
+-      document = MOUSEPAD_DOCUMENT (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), i));
+-      mousepad_view_set_color_scheme (document->textview, scheme_id);
+-    }
+-}
+-
+-
+-
+-static void
+ mousepad_window_create_style_schemes_menu (MousepadWindow *window)
+ {
+   GtkWidget           *menu, *item;
+@@ -751,13 +725,6 @@
+   gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
+   gtk_widget_show_all (menu);
+   gtk_widget_show (item);
+-  
+-  /* watch for activations of the style schemes actions */
+-  g_signal_connect_object (window->action_group,
+-                           "notify::active-style-scheme",
+-                           G_CALLBACK (mousepad_window_action_group_style_scheme_changed),
+-                           window,
+-                           G_CONNECT_SWAPPED);
+ }
+ 
+ 
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/mousepad.nix b/nixpkgs/pkgs/desktops/xfce/applications/mousepad.nix
new file mode 100644
index 000000000000..d66fa2049e65
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/mousepad.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util
+, gtk, gtksourceview, dbus, dbus-glib, makeWrapper
+, dconf }:
+
+stdenv.mkDerivation rec {
+  p_name  = "mousepad";
+  ver_maj = "0.4";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "60114431eac8db6bb6ce18bd38f1630cccb684375b97a445a1b6fd619848d132";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  patches = [ ./mousepad-12134.patch ];
+
+  buildInputs =
+    [ pkgconfig intltool libxfce4util
+      gtk gtksourceview dbus dbus-glib makeWrapper
+      dconf
+    ];
+
+  configureFlags = [ "--enable-keyfile-settings" ];
+
+  preFixup = ''
+    wrapProgram "$out/bin/mousepad" \
+      --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH:${gtksourceview}/share" \
+      --prefix GIO_EXTRA_MODULES : "${stdenv.lib.getLib dconf}/lib/gio/modules"
+  '';
+
+  meta = {
+    homepage = http://www.xfce.org/;
+    description = "A simple text editor for Xfce";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/orage.nix b/nixpkgs/pkgs/desktops/xfce/applications/orage.nix
new file mode 100644
index 000000000000..72d8e682c862
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/orage.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, bison, flex, intltool, gtk, libical, dbus-glib, tzdata
+, libnotify, popt, xfce, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+  p_name  = "orage";
+  ver_maj = "4.12";
+  ver_min = "1";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0qlhvnl2m33vfxqlbkic2nmfpwyd4mq230jzhs48cg78392amy9w";
+  };
+
+  patches = [
+    # Fix build with libical 3.0
+    (fetchpatch {
+      name = "fix-libical3.patch";
+      url = https://git.archlinux.org/svntogit/packages.git/plain/trunk/libical3.patch?h=packages/orage&id=7b1b06c42dda034d538977b9f3550b28e370057f;
+      sha256 = "1l8s106mcidmbx2p8c2pi8v9ngbv2x3fsgv36j8qk8wyd4qd1jbf";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace src/parameters.c        --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
+    substituteInPlace src/tz_zoneinfo_read.c  --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
+    substituteInPlace tz_convert/tz_convert.c --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
+  '';
+
+  postConfigure = "rm -rf libical"; # ensure pkgs.libical is used instead of one included in the orage sources
+
+  nativeBuildInputs = [ pkgconfig intltool bison flex ];
+
+  buildInputs = [ gtk libical dbus-glib libnotify popt xfce.libxfce4util
+    xfce.xfce4-panel ];
+
+  meta = {
+    homepage = http://www.xfce.org/projects/;
+    description = "A simple calendar application with reminders";
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/parole.nix b/nixpkgs/pkgs/desktops/xfce/applications/parole.nix
new file mode 100644
index 000000000000..3951c9deedc6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/parole.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchurl, makeWrapper, pkgconfig, intltool, gst_all_1
+, gtk, dbus-glib, libxfce4ui, libxfce4util, xfconf
+, taglib, libnotify, hicolor-icon-theme
+, withGstPlugins ? true
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "parole";
+  ver_maj = "0.5";
+  ver_min = "4";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1hxzqg9dfghrhvmnnccwwa4278fh2awkcqy89sla05m08mxvvx60";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [
+    makeWrapper hicolor-icon-theme
+    gtk dbus-glib libxfce4ui libxfce4util xfconf
+    taglib libnotify
+  ] ++ (with gst_all_1; [ gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav]);
+
+  configureFlags = [ "--with-gstreamer=1.0" ];
+
+  postInstall = stdenv.lib.optionalString withGstPlugins ''
+    wrapProgram "$out/bin/parole" --prefix \
+      GST_PLUGIN_SYSTEM_PATH_1_0 ":" "$GST_PLUGIN_SYSTEM_PATH_1_0"
+  '';
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/applications/${p_name}";
+    description = "Modern simple media player";
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/ristretto.nix b/nixpkgs/pkgs/desktops/xfce/applications/ristretto.nix
new file mode 100644
index 000000000000..f849fbd20a73
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/ristretto.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libexif, gtk
+, exo, dbus-glib, libxfce4util, libxfce4ui, xfconf
+, hicolor-icon-theme, makeWrapper
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "ristretto";
+  ver_maj = "0.6";
+  ver_min = "3";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0y9d8w1plwp4vmxs44y8k8x15i0k0xln89k6jndhv6lf57g1cs1b";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  buildInputs =
+    [ pkgconfig intltool libexif gtk dbus-glib exo libxfce4util
+      libxfce4ui xfconf hicolor-icon-theme makeWrapper
+    ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/ristretto" \
+      --prefix XDG_DATA_DIRS : "${hicolor-icon-theme}/share"
+  '';
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/applications/${p_name}";
+    description = "A fast and lightweight picture-viewer for the Xfce desktop environment";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/terminal.nix b/nixpkgs/pkgs/desktops/xfce/applications/terminal.nix
new file mode 100644
index 000000000000..773a8274f341
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/terminal.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, pkgconfig, intltool, ncurses, gtk, vte, dbus-glib
+, exo, libxfce4util, libxfce4ui
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-terminal";
+  ver_maj = "0.6";
+  ver_min = "3";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "023y0lkfijifh05yz8grimxadqpi98mrivr00sl18nirq8b4fbwi";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool exo gtk vte libxfce4util ncurses dbus-glib libxfce4ui ];
+
+  meta = {
+    homepage = http://www.xfce.org/projects/terminal;
+    description = "A modern terminal emulator primarily for the Xfce desktop environment";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/xfce4-mixer.nix b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-mixer.nix
new file mode 100644
index 000000000000..93a7fad4918a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-mixer.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, pkgconfig, intltool, makeWrapper
+, glib, gstreamer, gst-plugins-base, gtk
+, libxfce4util, libxfce4ui, xfce4-panel, xfconf, libunique ? null
+, pulseaudioSupport ? false, gst-plugins-good
+}:
+
+let
+  # The usual Gstreamer plugins package has a zillion dependencies
+  # that we don't need for a simple mixer, so build a minimal package.
+  gst_plugins_minimal = gst-plugins-base.override {
+    minimalDeps = true;
+  };
+  gst_plugins_pulse = gst-plugins-good.override {
+    minimalDeps = true;
+  };
+  gst_plugins = [ gst_plugins_minimal ] ++ stdenv.lib.optional pulseaudioSupport gst_plugins_pulse;
+
+in
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-mixer";
+  ver_maj = "4.10";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1pnsd00583l7p5d80rxbh58brzy3jnccwikbbbm730a33c08kid8";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  buildInputs =
+    [ pkgconfig intltool glib gstreamer gtk
+      libxfce4util libxfce4ui xfce4-panel xfconf libunique makeWrapper
+    ] ++ gst_plugins;
+
+  postInstall =
+    ''
+      wrapProgram "$out/bin/xfce4-mixer" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH"
+    '';
+
+  passthru = { inherit gst_plugins; };
+
+  meta = {
+    homepage = http://www.xfce.org/projects/xfce4-mixer; # referenced but inactive
+    description = "A volume control application for the Xfce desktop environment";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/xfce4-notifyd.nix b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-notifyd.nix
new file mode 100644
index 000000000000..19ecff290933
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-notifyd.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libnotify
+, gtk , libxfce4util, libxfce4ui, xfconf, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-notifyd";
+  ver_maj = "0.2";
+  ver_min = "4";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1l6fpfk0fkizdx7vwbyjdyzzj5i2ng8pf7r8j49nv0cnjhpxczlc";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libnotify gtk libxfce4util libxfce4ui xfconf hicolor-icon-theme ];
+
+  preFixup = ''
+    # to be able to run the daemon we need it in PATH
+    ln -rs $out/lib/xfce4/notifyd/xfce4-notifyd $out/bin
+  '';
+
+  doCheck = true;
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/applications/${p_name}";
+    description = "Notification daemon for Xfce";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/xfce4-screenshooter.nix b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-screenshooter.nix
new file mode 100644
index 000000000000..8e5bffd9dd6f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-screenshooter.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, intltool, xfce4-panel, libxfce4util, gtk, libsoup
+, glib-networking, exo, hicolor-icon-theme, wrapGAppsHook }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-screenshooter";
+  ver_maj = "1.8";
+  ver_min = "2";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "9dce2ddfaa87f703e870e29bae13f3fc82a1b3f06b44f8386640e45a135f5f69";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [
+    pkgconfig intltool wrapGAppsHook
+  ];
+
+  buildInputs = [
+    xfce4-panel libxfce4util gtk libsoup exo hicolor-icon-theme glib-networking
+  ];
+
+  meta = {
+    homepage = http://goodies.xfce.org/projects/applications/xfce4-screenshooter;
+    description = "Xfce screenshooter";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/xfce4-taskmanager.nix b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-taskmanager.nix
new file mode 100644
index 000000000000..2de4f34fcf6f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-taskmanager.nix
@@ -0,0 +1,22 @@
+{ stdenv, fetchurl, intltool, pkgconfig, gtk, libwnck }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-taskmanager";
+  ver_maj = "1.1";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1jwywmkkkmz7406m1jq40w6apiav25cznafhigbgpjv6z5hv27if";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool gtk libwnck ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/applications/${p_name}";
+    description = "Easy to use task manager for Xfce";
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed-pulse.nix b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed-pulse.nix
new file mode 100644
index 000000000000..4344d34f13f6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed-pulse.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl, pkgconfig, libpulseaudio
+, gtk2, libnotify
+, keybinder, xfconf
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-volumed-pulse";
+  ver_maj = "0.2";
+  ver_min = "2";
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0xjcs1b6ix6rwj9xgr9n89h315r3yhdm8wh5bkincd4lhz6ibhqf";
+  };
+
+  buildInputs =
+    [ libpulseaudio gtk2
+      keybinder xfconf libnotify
+    ];
+
+  nativeBuildInputs = [ pkgconfig ];
+
+  meta = with stdenv.lib; {
+    homepage = https://launchpad.net/xfce4-volumed-pulse;
+    description = "A volume keys control daemon for the Xfce desktop environment (Xubuntu fork)";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed.nix b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed.nix
new file mode 100644
index 000000000000..8e4f952438fe
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/applications/xfce4-volumed.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, pkgconfig, makeWrapper
+, gstreamer, gtk2, gst-plugins-base, libnotify
+, keybinder, xfconf
+}:
+
+let
+  # The usual Gstreamer plugins package has a zillion dependencies
+  # that we don't need for a simple mixer, so build a minimal package.
+  gst_plugins_minimal = gst-plugins-base.override {
+    minimalDeps = true;
+  };
+
+in
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-volumed";
+  ver_maj = "0.1";
+  ver_min = "13";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1aa0a1sbf9yzi7bc78kw044m0xzg1li3y4w9kf20wqv5kfjs7v2c";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  buildInputs =
+    [ gstreamer gst_plugins_minimal gtk2
+      keybinder xfconf libnotify
+    ];
+
+  nativeBuildInputs = [ pkgconfig makeWrapper ];
+
+  postInstall =
+    ''
+      wrapProgram "$out/bin/xfce4-volumed" \
+        --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH"
+    '';
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/projects/xfce4-volumed; # referenced but inactive
+    description = "A volume keys control daemon for the Xfce desktop environment";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/art/xfce4-icon-theme.nix b/nixpkgs/pkgs/desktops/xfce/art/xfce4-icon-theme.nix
new file mode 100644
index 000000000000..a0f2ed00d0e8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/art/xfce4-icon-theme.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk2 }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-icon-theme";
+  ver_maj = "4.4";
+  ver_min = "3";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/art/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1yk6rx3zr9grm4jwpjvqdkl13pisy7qn1wm5cqzmd2kbsn96cy6l";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool gtk2 ];
+
+  meta = {
+    homepage = http://www.xfce.org/;
+    description = "Icons for Xfce";
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/art/xfwm4-themes.nix b/nixpkgs/pkgs/desktops/xfce/art/xfwm4-themes.nix
new file mode 100644
index 000000000000..80cf7dd28c5d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/art/xfwm4-themes.nix
@@ -0,0 +1,21 @@
+{ stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfwm4-themes";
+  ver_maj = "4.10";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/art/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0xfmdykav4rf6gdxbd6fhmrfrvbdc1yjihz7r7lba0wp1vqda51j";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/;
+    description = "Themes for Xfce";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.volth ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/exo.nix b/nixpkgs/pkgs/desktops/xfce/core/exo.nix
new file mode 100644
index 000000000000..6b5ee4b31328
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/exo.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, intltool, URI, glib, gtk, libxfce4ui, libxfce4util
+, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  p_name  = "exo";
+  ver_maj = "0.10";
+  ver_min = "7";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "521581481128af93e815f9690020998181f947ac9e9c2b232b1f144d76b1b35c";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  outputs = [ "out" "dev" "devdoc" ];
+    # lib/xfce4/exo-1/exo-compose-mail-1 is a perl script :-/
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs = [ URI glib gtk libxfce4ui libxfce4util hicolor-icon-theme ];
+
+  meta = with stdenv.lib; {
+    homepage = "http://www.xfce.org/projects/${p_name}";
+    description = "Application library for the Xfce desktop environment";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/garcon-10967.patch b/nixpkgs/pkgs/desktops/xfce/core/garcon-10967.patch
new file mode 100644
index 000000000000..aea123255478
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/garcon-10967.patch
@@ -0,0 +1,14 @@
+diff -urNZ a/garcon-gtk/garcon-gtk-menu.c b/garcon-gtk/garcon-gtk-menu.c
+--- a/garcon-gtk/garcon-gtk-menu.c	2017-11-16 19:22:33.551926068 +0000
++++ b/garcon-gtk/garcon-gtk-menu.c	2017-11-16 19:23:33.055497211 +0000
+@@ -676,6 +676,9 @@
+                   G_CALLBACK (garcon_gtk_menu_deactivate), menu);
+               gtk_widget_show (mi);
+ 
++	      /* submenu are child items, too. */
++	      has_children = TRUE;
++	      
+               if (menu->priv->show_menu_icons)
+                 {
+                   icon_name = garcon_menu_element_get_icon_name (li->data);
+Binary files a/.git/index and b/.git/index differ
diff --git a/nixpkgs/pkgs/desktops/xfce/core/garcon-12700.patch b/nixpkgs/pkgs/desktops/xfce/core/garcon-12700.patch
new file mode 100644
index 000000000000..b95a65cc2194
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/garcon-12700.patch
@@ -0,0 +1,44 @@
+From 222080e6d5fce85eb2a8a5c33df671bd9f21add8 Mon Sep 17 00:00:00 2001
+From: Yegor Timoshenko <yegortimoshenko@gmail.com>
+Date: Thu, 14 Dec 2017 22:04:04 +0000
+Subject: [PATCH] Decrement allocation counter on item unref (#12700)
+
+---
+ garcon/garcon-menu-item-pool.c | 7 ++++++-
+ garcon/garcon-menu-item.c      | 2 ++
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/garcon/garcon-menu-item-pool.c b/garcon/garcon-menu-item-pool.c
+index 2017180..355e520 100644
+--- a/garcon/garcon-menu-item-pool.c
++++ b/garcon/garcon-menu-item-pool.c
+@@ -191,7 +191,12 @@ garcon_menu_item_pool_filter_exclude (const gchar    *desktop_id,
+   g_return_val_if_fail (GARCON_IS_MENU_ITEM (item), FALSE);
+   g_return_val_if_fail (node != NULL, FALSE);
+ 
+-  return garcon_menu_node_tree_rule_matches (node, item);
++  gboolean matches = garcon_menu_node_tree_rule_matches (node, item);
++
++  if (matches)
++    garcon_menu_item_increment_allocated (item);
++
++  return matches;
+ }
+ 
+ 
+diff --git a/garcon/garcon-menu-item.c b/garcon/garcon-menu-item.c
+index 66a86bf..d61c88f 100644
+--- a/garcon/garcon-menu-item.c
++++ b/garcon/garcon-menu-item.c
+@@ -1516,6 +1516,8 @@ garcon_menu_item_unref (GarconMenuItem *item)
+ {
+   g_return_if_fail (GARCON_IS_MENU_ITEM (item));
+ 
++  garcon_menu_item_decrement_allocated (item);
++
+   /* Decrement the reference counter */
+   g_object_unref (G_OBJECT (item));
+ }
+-- 
+2.15.1
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/garcon.nix b/nixpkgs/pkgs/desktops/xfce/core/garcon.nix
new file mode 100644
index 000000000000..d9c918c0fdc1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/garcon.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, libxfce4util, libxfce4ui, gtk }:
+let
+  p_name  = "garcon";
+  ver_maj = "0.4";
+  ver_min = "0";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0wm9pjbwq53s3n3nwvsyf0q8lbmhiy2ln3bn5ncihr9vf5cwhzbq";
+  };
+
+  outputs = [ "out" "dev" ];
+  patches = [ ./garcon-10967.patch ./garcon-12700.patch ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool glib libxfce4util gtk libxfce4ui ];
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/;
+    description = "Xfce menu support library";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/gtk-xfce-engine.nix b/nixpkgs/pkgs/desktops/xfce/core/gtk-xfce-engine.nix
new file mode 100644
index 000000000000..0d69d4d2f32b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/gtk-xfce-engine.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk2, withGtk3 ? false, gtk3 ? null }:
+
+assert withGtk3 -> (gtk3 != null);
+
+stdenv.mkDerivation rec {
+  p_name  = "gtk-xfce-engine";
+  ver_maj = "3.2";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1va71f3gpl8gikfkmqsd5ikgp7qj8b64jii2l98g1ylnv8xrqp47";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool gtk2 ] ++ stdenv.lib.optional withGtk3 gtk3;
+
+  # `glib-mkenums' is unhappy that some source files are not valid UTF-8
+  postPatch = ''find . -type f -name '*.[ch]' -exec sed -r -i 's/\xD6/O/g' {} +'';
+
+  configureFlags = stdenv.lib.optional withGtk3 "--enable-gtk3";
+
+  meta = {
+    homepage = http://www.xfce.org/;
+    description = "GTK+ theme engine for Xfce";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/libxfce4ui.nix b/nixpkgs/pkgs/desktops/xfce/core/libxfce4ui.nix
new file mode 100644
index 000000000000..e8d5b4acd769
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/libxfce4ui.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, pkgconfig, intltool, xorg, gtk, libxfce4util, xfconf
+, libglade, libstartup_notification, hicolor-icon-theme
+, withGtk3 ? false, gtk3
+}:
+let
+  p_name  = "libxfce4ui";
+  ver_maj = "4.12";
+  ver_min = "1";
+  inherit (stdenv.lib) optional;
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "3d619811bfbe7478bb984c16543d980cadd08586365a7bc25e59e3ca6384ff43";
+  };
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs =
+    [ gtk libxfce4util xfconf libglade
+      libstartup_notification hicolor-icon-theme
+    ] ++ optional withGtk3 gtk3;
+
+  propagatedBuildInputs = [ xorg.libICE xorg.libSM ];
+
+  #TODO: glade?
+  configureFlags = optional withGtk3 "--enable-gtk3";
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/;
+    description = "Basic GUI library for Xfce";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/libxfce4util.nix b/nixpkgs/pkgs/desktops/xfce/core/libxfce4util.nix
new file mode 100644
index 000000000000..5a411bfbb5be
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/libxfce4util.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, glib, intltool }:
+let
+  p_name  = "libxfce4util";
+  ver_maj = "4.12";
+  ver_min = "1";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "07c8r3xwx5is298zk77m3r784gmr5y4mh8bbca5zdjqk5vxdwsw7";
+  };
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ glib intltool ];
+
+  meta = {
+    homepage = http://www.xfce.org/;
+    description = "Basic utility non-GUI functions for Xfce";
+    license = "bsd";
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/libxfcegui4.nix b/nixpkgs/pkgs/desktops/xfce/core/libxfcegui4.nix
new file mode 100644
index 000000000000..7fe76057c930
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/libxfcegui4.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk
+, libxfce4util, xfconf, libglade, libstartup_notification, hicolor-icon-theme }:
+let
+  p_name  = "libxfcegui4";
+  ver_maj = "4.10";
+  ver_min = "0";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0cs5im0ib0cmr1lhr5765yliqjfyxvk4kwy8h1l8bn3mj6bzk0ib";
+  };
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  #TODO: gladeui
+  # By default, libxfcegui4 tries to install into libglade's prefix.
+  # Install into our own prefix instead.
+  configureFlags = [
+    "--with-libglade-module-path=$(out)/lib/libglade/2.0"
+  ];
+  #NOTE: missing keyboard library support is OK according to the mailing-list
+
+  buildInputs =
+    [ pkgconfig intltool gtk libxfce4util xfconf libglade
+      libstartup_notification hicolor-icon-theme
+    ];
+
+  meta = {
+    homepage = http://www.xfce.org/;
+    description = "Basic GUI library for Xfce";
+    license = stdenv.lib.licenses.lgpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/thunar-build.nix b/nixpkgs/pkgs/desktops/xfce/core/thunar-build.nix
new file mode 100644
index 000000000000..0b606ee5fdd7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/thunar-build.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, pkgconfig, intltool
+, gtk, dbus-glib, libstartup_notification, libnotify, libexif, pcre, udev
+, exo, libxfce4util, xfconf, xfce4-panel, hicolor-icon-theme, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "thunar";
+  ver_maj = "1.6";
+  ver_min = "10";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/Thunar-${ver_maj}.${ver_min}.tar.bz2";
+    sha256 = "7e9d24067268900e5e44d3325e60a1a2b2f8f556ec238ec12574fbea15fdee8a";
+  };
+
+  name = "${p_name}-build-${ver_maj}.${ver_min}";
+
+  patches = [ ./thunarx_plugins_directory.patch ];
+
+  postPatch = ''
+    sed -i -e 's|thunar_dialogs_show_insecure_program (parent, _(".*"), file, exec)|1|' thunar/thunar-file.c
+  '';
+
+  nativeBuildInputs = [ pkgconfig wrapGAppsHook ];
+  buildInputs = [
+    intltool
+    gtk dbus-glib libstartup_notification libnotify libexif pcre udev
+    exo libxfce4util xfconf xfce4-panel
+    hicolor-icon-theme
+  ];
+  # TODO: optionality?
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = http://thunar.xfce.org/;
+    description = "Xfce file manager";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/thunar-volman.nix b/nixpkgs/pkgs/desktops/xfce/core/thunar-volman.nix
new file mode 100644
index 000000000000..39214ca57b1f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/thunar-volman.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, intltool, exo, gtk, libxfce4util, libxfce4ui
+, xfconf, udev, libgudev, libnotify, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  p_name  = "thunar-volman";
+  ver_maj = "0.8";
+  ver_min = "1";
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1gf259n1v3y23n1zlkhyr6r0i8j59rnl1cmxvxj6la9cwdfbn22s";
+  };
+
+
+  buildInputs =
+    [ pkgconfig intltool exo gtk udev libgudev libxfce4ui libxfce4util
+      xfconf libnotify hicolor-icon-theme
+    ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = http://goodies.xfce.org/projects/thunar-plugins/thunar-volman;
+    description = "Thunar extension for automatic management of removable drives and media";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+    maintainers = [ stdenv.lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/thunar.nix b/nixpkgs/pkgs/desktops/xfce/core/thunar.nix
new file mode 100644
index 000000000000..83e3a2879d79
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/thunar.nix
@@ -0,0 +1,68 @@
+{ stdenv, buildEnv, runCommand, makeWrapper, lndir, thunar-bare
+, thunarPlugins ? []
+}:
+
+with stdenv.lib; 
+
+let
+
+  build = thunar-bare;
+
+  replaceLnExeListWithWrapped = exeDir: exeNameList: mkWrapArgs: ''
+    exeDir="${exeDir}"
+    oriDir=`realpath -e "$exeDir"`
+    unlink "$exeDir"
+    mkdir -p "$exeDir"
+    lndir "$oriDir" "$exeDir"
+
+    exeList="${concatStrings (intersperse " " (map (x: "${exeDir}/${x}") exeNameList))}"
+
+    for exe in $exeList; do
+      oriExe=`realpath -e "$exe"`
+      rm -f "$exe"
+      makeWrapper "$oriExe" "$exe" ${concatStrings (intersperse " " mkWrapArgs)}
+    done
+  '';
+
+  name = "${build.p_name}-${build.ver_maj}.${build.ver_min}";
+
+  meta = {
+    inherit (build.meta) homepage license platforms;
+
+    description = build.meta.description + optionalString
+      (0 != length thunarPlugins)
+      " (with plugins: ${concatStrings (intersperse ", " (map (x: x.name) thunarPlugins))})";
+    maintainers = build.meta.maintainers /*++ [ jraygauthier ]*/;
+  };
+
+in
+
+# TODO: To be replaced with `buildEnv` awaiting missing features.
+runCommand name {
+  inherit build;
+  inherit meta;
+
+  nativeBuildInputs = [ makeWrapper lndir ];
+
+  dontPatchELF = true;
+  dontStrip = true;
+
+} 
+(let
+  buildWithPlugins = buildEnv {
+    name = "thunar-bare-with-plugins";
+    paths = [ build ] ++ thunarPlugins;
+  };
+
+in ''
+  mkdir -p $out
+  pushd ${buildWithPlugins} > /dev/null
+  for d in `find . -maxdepth 1 -name "*" -printf "%f\n" | tail -n+2`; do
+    ln -s "${buildWithPlugins}/$d" "$out/$d"
+  done
+  popd > /dev/null
+
+  ${replaceLnExeListWithWrapped "$out/bin" [ "thunar" "thunar-settings" ] [
+    "--set THUNARX_MODULE_DIR \"${buildWithPlugins}/lib/thunarx-2\""
+  ]}
+'')
diff --git a/nixpkgs/pkgs/desktops/xfce/core/thunarx_plugins_directory.patch b/nixpkgs/pkgs/desktops/xfce/core/thunarx_plugins_directory.patch
new file mode 100644
index 000000000000..e1431d86b147
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/thunarx_plugins_directory.patch
@@ -0,0 +1,48 @@
+diff --git a/thunarx/thunarx-provider-factory.c b/thunarx/thunarx-provider-factory.c
+index 31b8835..a3e7f4e 100644
+--- a/thunarx/thunarx-provider-factory.c
++++ b/thunarx/thunarx-provider-factory.c
+@@ -141,12 +141,19 @@ static GList*
+ thunarx_provider_factory_load_modules (ThunarxProviderFactory *factory)
+ {
+   ThunarxProviderModule *module;
++  const gchar           *thunar_dir;
+   const gchar           *name;
+   GList                 *modules = NULL;
+   GList                 *lp;
+   GDir                  *dp;
+ 
+-  dp = g_dir_open (THUNARX_DIRECTORY, 0, NULL);
++  thunar_dir = g_getenv("THUNARX_MODULE_DIR");
++  if (NULL == thunar_dir)
++    {
++      thunar_dir = THUNARX_DIRECTORY;
++    }
++
++  dp = g_dir_open (thunar_dir, 0, NULL);
+   if (G_LIKELY (dp != NULL))
+     {
+       /* determine the types for all existing plugins */
+diff --git a/thunarx/thunarx-provider-module.c b/thunarx/thunarx-provider-module.c
+index 023ad2a..6c21997 100644
+--- a/thunarx/thunarx-provider-module.c
++++ b/thunarx/thunarx-provider-module.c
+@@ -174,10 +174,17 @@ static gboolean
+ thunarx_provider_module_load (GTypeModule *type_module)
+ {
+   ThunarxProviderModule *module = THUNARX_PROVIDER_MODULE (type_module);
++  const gchar           *thunar_dir;
+   gchar                 *path;
++    
++  thunar_dir = g_getenv("THUNARX_MODULE_DIR");
++  if (NULL == thunar_dir)
++    {
++      thunar_dir = THUNARX_DIRECTORY;
++    }
+ 
+   /* load the module using the runtime link editor */
+-  path = g_build_filename (THUNARX_DIRECTORY, type_module->name, NULL);
++  path = g_build_filename (thunar_dir, type_module->name, NULL);
+   module->library = g_module_open (path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+   g_free (path);
+ 
diff --git a/nixpkgs/pkgs/desktops/xfce/core/tumbler.nix b/nixpkgs/pkgs/desktops/xfce/core/tumbler.nix
new file mode 100644
index 000000000000..3e1d2be2b531
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/tumbler.nix
@@ -0,0 +1,42 @@
+{ stdenv, fetchurl, pkgconfig, intltool, dbus-glib, gdk_pixbuf, curl, freetype
+, libgsf, poppler, bzip2 }:
+let
+  p_name  = "tumbler";
+  ver_maj = "0.1";
+  ver_min = "31";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0wvip28gm2w061hn84zp2q4dv947ihylrppahn4cjspzff935zfh";
+  };
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    intltool dbus-glib gdk_pixbuf curl freetype
+    poppler libgsf bzip2
+  ];
+
+  configureFlags = [
+    # Needs gst-tag
+    # "--enable-gstreamer-thumbnailer"
+
+    # Needs libffmpegthumbnailer
+    # "--enable-ffmpeg-thumbnailer"
+
+    "--enable-odf-thumbnailer"
+    "--enable-poppler-thumbnailer"
+  ];
+
+  meta = with stdenv.lib; {
+    homepage = http://git.xfce.org/xfce/tumbler/;
+    description = "A D-Bus thumbnailer service";
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-appfinder.nix b/nixpkgs/pkgs/desktops/xfce/core/xfce4-appfinder.nix
new file mode 100644
index 000000000000..d39708dd523f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-appfinder.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, gtk, libxfce4util
+, libxfce4ui, garcon, xfconf }:
+let
+  p_name  = "xfce4-appfinder";
+  ver_maj = "4.12";
+  ver_min = "0";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0ry5hin8xhgnkmm9vs7jq8blk1cnbyr0s18nm1j6nsm7360abm1a";
+  };
+
+  buildInputs =
+    [ pkgconfig intltool glib gtk libxfce4util libxfce4ui garcon xfconf ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://docs.xfce.org/xfce/xfce4-appfinder/;
+    description = "Xfce application finder, a tool to locate and launch programs on your system";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-dev-tools.nix b/nixpkgs/pkgs/desktops/xfce/core/xfce4-dev-tools.nix
new file mode 100644
index 000000000000..109c22f1e58c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-dev-tools.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchurl, pkgconfig, glib, autoconf, automake, libtool, intltool }:
+let
+  p_name  = "xfce4-dev-tools";
+  ver_maj = "4.12";
+  ver_min = "0";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1jxmyp80pwbfgmqmwpjxs7z5dmm6pyf3qj62z20xy44izraadqz2";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ glib ];
+
+  # not needed to build it but to use it
+  propagatedBuildInputs = [ autoconf automake libtool intltool ];
+
+  meta = {
+    homepage = http://foo-projects.org/~benny/projects/xfce4-dev-tools/;
+    description = "Tools and M4 macros for Xfce4 developers";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.linux;
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-light-locker.patch b/nixpkgs/pkgs/desktops/xfce/core/xfce4-light-locker.patch
new file mode 100644
index 000000000000..0fabdffd7ed6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-light-locker.patch
@@ -0,0 +1,25 @@
+--- ./scripts/xflock4.orig	2017-08-06 23:05:53.807688995 +0100
++++ ./scripts/xflock4	2017-08-06 23:09:06.171789989 +0100
+@@ -24,12 +24,19 @
+ PATH=/bin:/usr/bin
+ export PATH
+ 
+-# Lock by xscreensaver or gnome-screensaver, if a respective daemon is running
++# First test for the command set in the session's xfconf channel
++LOCK_CMD=$(xfconf-query -c xfce4-session -p /general/LockCommand)
++
++# Lock by xscreensaver, gnome-screensaver, or light-locker, if a respective daemon is running
+ for lock_cmd in \
++    "$LOCK_CMD" \
+     "xscreensaver-command -lock" \
+-    "gnome-screensaver-command --lock"
++    "gnome-screensaver-command --lock" \
++    "light-locker-command -l"
+ do
+-    $lock_cmd >/dev/null 2>&1 && exit
++    if [ ! -z "$lock_cmd" ]; then
++        $lock_cmd >/dev/null 2>&1 && exit
++    fi
+ done
+ 
+ # else run another access locking utility, if installed
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-panel-datadir.patch b/nixpkgs/pkgs/desktops/xfce/core/xfce4-panel-datadir.patch
new file mode 100644
index 000000000000..ed9df9ef36f3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-panel-datadir.patch
@@ -0,0 +1,24 @@
+diff --git a/panel/panel-module-factory.c b/panel/panel-module-factory.c
+index 529fe85..8c792b7 100644
+--- a/panel/panel-module-factory.c
++++ b/panel/panel-module-factory.c
+@@ -39,6 +39,7 @@
+ #include <panel/panel-module.h>
+ #include <panel/panel-module-factory.h>
+ 
++#define DATADIR "/run/current-system/sw/share/xfce4"
+ #define PANEL_PLUGINS_DATA_DIR     (DATADIR G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "plugins")
+ #define PANEL_PLUGINS_DATA_DIR_OLD (DATADIR G_DIR_SEPARATOR_S "panel-plugins")
+ 
+diff --git a/panel/panel-module.c b/panel/panel-module.c
+index ba39320..519440b 100644
+--- a/panel/panel-module.c
++++ b/panel/panel-module.c
+@@ -35,6 +35,7 @@
+ #include <panel/panel-plugin-external-wrapper.h>
+ #include <panel/panel-plugin-external-46.h>
+ 
++#define LIBDIR "/run/current-system/sw/lib/xfce4"
+ #define PANEL_PLUGINS_LIB_DIR (LIBDIR G_DIR_SEPARATOR_S "panel" G_DIR_SEPARATOR_S "plugins")
+ #define PANEL_PLUGINS_LIB_DIR_OLD (LIBDIR G_DIR_SEPARATOR_S "panel-plugins")
+ 
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-panel.nix b/nixpkgs/pkgs/desktops/xfce/core/xfce4-panel.nix
new file mode 100644
index 000000000000..d2d992d54a88
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-panel.nix
@@ -0,0 +1,59 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk, libxfce4util, libxfce4ui
+, libxfce4ui_gtk3, libwnck, exo, garcon, xfconf, libstartup_notification
+, makeWrapper, xfce4-mixer, hicolor-icon-theme, tzdata
+, withGtk3 ? false, gtk3, gettext, glib-networking
+}:
+let
+  inherit (stdenv.lib) optional;
+  p_name  = "xfce4-panel";
+  ver_maj = "4.12";
+  ver_min = "2";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1s8cvsrgmkmmm84g6mghpj2k4777gm22g5lrsf8pdy5qh6xql1a2";
+  };
+
+  patches = [ ./xfce4-panel-datadir.patch ];
+  patchFlags = "-p1";
+
+  postPatch = ''
+    for f in $(find . -name \*.sh); do
+      substituteInPlace $f --replace gettext ${gettext}/bin/gettext
+    done
+    substituteInPlace plugins/clock/clock.c \
+       --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo" \
+       --replace "if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK))" ""
+  '';
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  buildInputs =
+    [ pkgconfig intltool gtk libxfce4util exo libwnck
+      garcon xfconf libstartup_notification makeWrapper hicolor-icon-theme
+    ] ++ xfce4-mixer.gst_plugins
+      ++ optional withGtk3 gtk3;
+
+  propagatedBuildInputs = [ (if withGtk3 then libxfce4ui_gtk3 else libxfce4ui) ];
+
+  configureFlags = optional withGtk3 "--enable-gtk3";
+
+  postInstall = ''
+    wrapProgram "$out/bin/xfce4-panel" \
+      --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH" \
+      --prefix GIO_EXTRA_MODULES : "${glib-networking}/lib/gio/modules"
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/projects/xfce4-panel;
+    description = "Xfce panel";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-power-manager.nix b/nixpkgs/pkgs/desktops/xfce/core/xfce4-power-manager.nix
new file mode 100644
index 000000000000..ffcc67bf0e9b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-power-manager.nix
@@ -0,0 +1,45 @@
+{ stdenv, lib, fetchurl, pkgconfig, intltool, glib, gtk, dbus-glib, upower, xfconf
+, libxfce4ui, libxfce4util, libnotify, xfce4-panel, hicolor-icon-theme
+, withGtk3 ? false, gtk3, libxfce4ui_gtk3, xfce4panel_gtk3 }:
+let
+  p_name  = "xfce4-power-manager";
+  ver_maj = if withGtk3 then "1.6" else "1.4";
+  ver_min = if withGtk3 then "0"   else "4";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 =
+      if withGtk3
+      then "0avzhllpimcn7a6z9aa4jn0zg5ahxr9ks5ldchizycdb0rz1bqxx"
+      else "01rvqy1cif4s8lkidb7hhmsz7d9f2fwcwvc51xycaj3qgsmch3n5";
+  };
+
+  buildInputs =
+    [ pkgconfig intltool glib dbus-glib upower xfconf libxfce4util
+      libnotify hicolor-icon-theme
+    ] ++
+    (if withGtk3
+    then [ gtk3 libxfce4ui_gtk3 xfce4panel_gtk3 ]
+    else [ gtk  libxfce4ui      xfce4-panel      ]);
+
+  postPatch = lib.optionalString withGtk3 ''
+    substituteInPlace configure --replace gio-2.0 gio-unix-2.0
+  '';
+
+  postConfigure = lib.optionalString withGtk3 ''
+    substituteInPlace src/Makefile      --replace "xfce4_power_manager_CFLAGS = "          "xfce4_power_manager_CFLAGS = \$(GIO_CFLAGS) "
+    substituteInPlace settings/Makefile --replace "xfce4_power_manager_settings_CFLAGS = " "xfce4_power_manager_settings_CFLAGS = \$(GIO_CFLAGS) "
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = http://goodies.xfce.org/projects/applications/xfce4-power-manager;
+    description = "A power manager for the Xfce Desktop Environment";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-session.nix b/nixpkgs/pkgs/desktops/xfce/core/xfce4-session.nix
new file mode 100644
index 000000000000..3f6237d6de17
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-session.nix
@@ -0,0 +1,45 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk, polkit
+, libxfce4util, libxfce4ui, xfce4-panel, libwnck, dbus-glib, xfconf, libglade, xorg
+, hicolor-icon-theme
+}:
+
+let
+  p_name  = "xfce4-session";
+  ver_maj = "4.12";
+  ver_min = "1";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "97d7f2a2d0af7f3623b68d1f04091e02913b28f9555dab8b0d26c8a1299d08fd";
+  };
+
+  patches = [
+    # Fix "lock screen" not working for light-locker
+    ./xfce4-light-locker.patch
+  ];
+
+  buildInputs =
+    [ pkgconfig intltool gtk libxfce4util libxfce4ui libwnck dbus-glib
+      xfconf xfce4-panel libglade xorg.iceauth xorg.libSM
+      polkit hicolor-icon-theme
+    ]; #TODO: upower-glib, gconf (assistive?), gnome keyring
+
+  preBuild = ''
+    sed '/^PATH=/d'        -i scripts/xflock4
+    sed '/^export PATH$/d' -i scripts/xflock4
+  '';
+
+  configureFlags = [ "--with-xsession-prefix=$(out)" ];
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/projects/xfce4-session;
+    description = "Session manager for Xfce";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-settings-default-icon-theme.patch b/nixpkgs/pkgs/desktops/xfce/core/xfce4-settings-default-icon-theme.patch
new file mode 100644
index 000000000000..2683b3c3dfdd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-settings-default-icon-theme.patch
@@ -0,0 +1,11 @@
+--- a/xfsettingsd/xsettings.xml       2015-02-28 22:32:02.681796319 +0100
++++ b/xfsettingsd/xsettings.xml       2015-02-28 22:32:27.881214735 +0100
+@@ -7,7 +7,7 @@
+ <channel name="xsettings" version="1.0">
+   <property name="Net" type="empty">
+     <property name="ThemeName" type="empty"/>
+-    <property name="IconThemeName" type="empty"/>
++    <property name="IconThemeName" type="string" value="Rodent"/>
+     <property name="DoubleClickTime" type="int" value="400"/>
+     <property name="DoubleClickDistance" type="int" value="5"/>
+     <property name="DndDragThreshold" type="int" value="8"/>
\ No newline at end of file
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfce4-settings.nix b/nixpkgs/pkgs/desktops/xfce/core/xfce4-settings.nix
new file mode 100644
index 000000000000..592b03e8954a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfce4-settings.nix
@@ -0,0 +1,54 @@
+{ stdenv, fetchurl, pkgconfig, intltool, exo, gtk, garcon, libxfce4util
+, libxfce4ui, xfconf, libXi, upower ? null, libnotify ? null
+, libXcursor ? null, xf86inputlibinput ? null, libxklavier ? null }:
+
+let
+  p_name  = "xfce4-settings";
+  ver_maj = "4.12";
+  ver_min = "1";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0x35i1cvkqp0hib1knwa58mckdwrfbhaisz4bsx6bbbx385llj7n";
+  };
+
+  patches = [ ./xfce4-settings-default-icon-theme.patch ];
+
+  postPatch = ''
+    for f in $(find . -name \*.c); do
+      substituteInPlace $f --replace \"libinput-properties.h\" '<xorg/libinput-properties.h>'
+    done
+  '';
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [
+    exo
+    gtk
+    garcon
+    libxfce4util
+    libxfce4ui
+    xfconf
+    libXi
+    upower
+    libnotify
+    libXcursor
+    xf86inputlibinput
+    libxklavier
+  ];
+
+  configureFlags = [ "--enable-pluggable-dialogs" "--enable-sound-settings" ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/projects/xfce4-settings;
+    description = "Settings manager for Xfce";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfconf.nix b/nixpkgs/pkgs/desktops/xfce/core/xfconf.nix
new file mode 100644
index 000000000000..9af365c6f14d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfconf.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, libxfce4util, dbus-glib }:
+let
+  p_name  = "xfconf";
+  ver_maj = "4.12";
+  ver_min = "1";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0dns190bwb615wy9ma2654sw4vz1d0rcv061zmaalkv9wmj8bx1m";
+  };
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  #TODO: no perl bingings yet (ExtUtils::Depends, ExtUtils::PkgConfig, Glib)
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool glib libxfce4util ];
+  propagatedBuildInputs = [ dbus-glib ];
+
+  doCheck = false; # requires dbus daemon
+
+  meta = with stdenv.lib; {
+    homepage = http://docs.xfce.org/xfce/xfconf/start;
+    description = "Simple client-server configuration storage and query system for Xfce";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfdesktop.nix b/nixpkgs/pkgs/desktops/xfce/core/xfdesktop.nix
new file mode 100644
index 000000000000..48585b4004bb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfdesktop.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchurl, fetchpatch, pkgconfig, intltool, gtk, libxfce4util, libxfce4ui
+, libwnck, xfconf, libglade, xfce4-panel, thunar, exo, garcon, libnotify
+, hicolor-icon-theme }:
+let
+  p_name  = "xfdesktop";
+  ver_maj = "4.12";
+  ver_min = "3";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "a8a8d93744d842ca6ac1f9bd2c8789ee178937bca7e170e5239cbdbef30520ac";
+  };
+
+  buildInputs = [
+    pkgconfig intltool gtk libxfce4util libxfce4ui libwnck xfconf
+    libglade xfce4-panel thunar exo garcon libnotify hicolor-icon-theme
+  ];
+
+  patches = [(fetchpatch {
+    url = https://git.xfce.org/xfce/xfdesktop/patch?id=157f5b55cfc3629d595ef38984278de5915aac27;
+    sha256 = "0ki7hnyfpz7bdmsxqnm9qvyk040iyv1fawnhzfbyyzrh4nc5jd3x";
+  })];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/projects/xfdesktop;
+    description = "Xfce desktop manager";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/core/xfwm4.nix b/nixpkgs/pkgs/desktops/xfce/core/xfwm4.nix
new file mode 100644
index 000000000000..313a2662f039
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/core/xfwm4.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig, gtk, intltool, libglade, libxfce4util
+, libxfce4ui, xfconf, libwnck, libstartup_notification, xorg }:
+let
+  p_name  = "xfwm4";
+  ver_maj = "4.12";
+  ver_min = "4";
+in
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0dpvdrd5lclkcrzmdpva38gfsgvdf3xkqfknvy96x6k4fn508x7s";
+  };
+
+  buildInputs =
+    [ pkgconfig intltool gtk libglade libxfce4util libxfce4ui xfconf
+      libwnck libstartup_notification
+      xorg.libXcomposite xorg.libXfixes xorg.libXdamage
+    ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://www.xfce.org/projects/xfwm4;
+    description = "Window manager for Xfce";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.eelco ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/xfce/default.nix b/nixpkgs/pkgs/desktops/xfce/default.nix
new file mode 100644
index 000000000000..abf03d4277be
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/default.nix
@@ -0,0 +1,211 @@
+{ config, lib, pkgs }:
+
+lib.makeScope pkgs.newScope (self: with self; {
+  #### NixOS support
+
+  inherit (pkgs.gnome2) libglade libwnck vte gtksourceview;
+  inherit (pkgs.gnome3) dconf;
+  inherit (pkgs.perlPackages) URI;
+
+  gtk = pkgs.gtk2;
+
+  # Samba is a rather heavy dependency
+  gvfs = pkgs.gvfs.override { samba = null; };
+
+  xinitrc = "${xfce4-session}/etc/xdg/xfce4/xinitrc";
+
+  #### CORE
+
+  exo = callPackage ./core/exo.nix { };
+
+  garcon = callPackage ./core/garcon.nix { };
+
+  # When built with GTK+3, it was breaking GTK+3 app layout
+  gtk-xfce-engine = callPackage ./core/gtk-xfce-engine.nix { withGtk3 = false; };
+
+  libxfce4ui = callPackage ./core/libxfce4ui.nix { };
+
+  libxfce4util = callPackage ./core/libxfce4util.nix { };
+
+  libxfcegui4 = callPackage ./core/libxfcegui4.nix { };
+
+  thunar-bare = callPackage ./core/thunar-build.nix { };
+
+  thunar = callPackage ./core/thunar.nix { };
+
+  # NB: thunar already has it
+  thunar-volman = callPackage ./core/thunar-volman.nix { };
+
+  thunar-archive-plugin = callPackage ./thunar-plugins/archive { };
+
+  thunar-dropbox-plugin = callPackage ./thunar-plugins/dropbox { };
+
+  tumbler = callPackage ./core/tumbler.nix { };
+
+  # TODO: impure plugins from /run/current-system/sw/lib/xfce4
+  xfce4-panel = callPackage ./core/xfce4-panel.nix { };
+
+  xfce4-session = callPackage ./core/xfce4-session.nix { };
+
+  xfce4-settings = callPackage ./core/xfce4-settings.nix { };
+
+  xfce4-power-manager = callPackage ./core/xfce4-power-manager.nix { };
+
+  xfconf = callPackage ./core/xfconf.nix { };
+
+  xfdesktop = callPackage ./core/xfdesktop.nix { };
+
+  xfwm4 = callPackage ./core/xfwm4.nix { };
+
+  xfce4-appfinder = callPackage ./core/xfce4-appfinder.nix { };
+
+  xfce4-dev-tools = callPackage ./core/xfce4-dev-tools.nix { };
+
+  #### APPLICATIONS
+
+  gigolo = callPackage ./applications/gigolo.nix { };
+
+  mousepad = callPackage ./applications/mousepad.nix { };
+
+  orage = callPackage ./applications/orage.nix { };
+
+  parole = callPackage ./applications/parole.nix { };
+
+  ristretto = callPackage ./applications/ristretto.nix { };
+
+  xfce4-mixer = callPackage ./applications/xfce4-mixer.nix { };
+
+  xfce4-mixer-pulse = callPackage ./applications/xfce4-mixer.nix { pulseaudioSupport = true; };
+
+  xfce4-notifyd = callPackage ./applications/xfce4-notifyd.nix { };
+
+  xfce4-taskmanager = callPackage ./applications/xfce4-taskmanager.nix { };
+
+  xfce4-terminal = callPackage ./applications/terminal.nix { };
+
+  xfce4-screenshooter = callPackage ./applications/xfce4-screenshooter.nix { };
+
+  xfce4-volumed = callPackage ./applications/xfce4-volumed.nix { };
+
+  xfce4-volumed-pulse = callPackage ./applications/xfce4-volumed-pulse.nix { };
+
+  #### ART
+
+  xfce4-icon-theme = callPackage ./art/xfce4-icon-theme.nix { };
+
+  xfwm4-themes = callPackage ./art/xfwm4-themes.nix { };
+
+  #### PANEL PLUGINS
+
+  xfce4-vala-panel-appmenu-plugin = callPackage ./panel-plugins/xfce4-vala-panel-appmenu-plugin { };
+
+  xfce4-battery-plugin = callPackage ./panel-plugins/xfce4-battery-plugin.nix { };
+
+  xfce4-clipman-plugin = callPackage ./panel-plugins/xfce4-clipman-plugin.nix { };
+
+  xfce4-cpufreq-plugin = callPackage ./panel-plugins/xfce4-cpufreq-plugin.nix { };
+
+  xfce4-cpugraph-plugin = callPackage ./panel-plugins/xfce4-cpugraph-plugin.nix { };
+
+  xfce4-datetime-plugin = callPackage ./panel-plugins/xfce4-datetime-plugin.nix { };
+
+  xfce4-dict-plugin = callPackage ./panel-plugins/xfce4-dict-plugin.nix { };
+
+  xfce4-dockbarx-plugin = callPackage ./panel-plugins/xfce4-dockbarx-plugin.nix { };
+
+  xfce4-embed-plugin = callPackage ./panel-plugins/xfce4-embed-plugin.nix { };
+
+  xfce4-eyes-plugin = callPackage ./panel-plugins/xfce4-eyes-plugin.nix { };
+
+  xfce4-fsguard-plugin = callPackage ./panel-plugins/xfce4-fsguard-plugin.nix { };
+
+  xfce4-genmon-plugin = callPackage ./panel-plugins/xfce4-genmon-plugin.nix { };
+
+  xfce4-hardware-monitor-plugin = callPackage ./panel-plugins/xfce4-hardware-monitor-plugin.nix { };
+
+  xfce4-namebar-plugin = callPackage ./panel-plugins/xfce4-namebar-plugin.nix { };
+
+  xfce4-netload-plugin = callPackage ./panel-plugins/xfce4-netload-plugin.nix { };
+
+  xfce4-notes-plugin = callPackage ./panel-plugins/xfce4-notes-plugin.nix { };
+
+  xfce4-mailwatch-plugin = callPackage ./panel-plugins/xfce4-mailwatch-plugin.nix { };
+
+  xfce4-mpc-plugin = callPackage ./panel-plugins/xfce4-mpc-plugin.nix { };
+
+  xfce4-sensors-plugin = callPackage ./panel-plugins/xfce4-sensors-plugin.nix { };
+
+  xfce4-systemload-plugin = callPackage ./panel-plugins/xfce4-systemload-plugin.nix { };
+
+  xfce4-timer-plugin = callPackage ./panel-plugins/xfce4-timer-plugin.nix { };
+
+  xfce4-verve-plugin = callPackage ./panel-plugins/xfce4-verve-plugin.nix { };
+
+  xfce4-xkb-plugin = callPackage ./panel-plugins/xfce4-xkb-plugin.nix { };
+
+  xfce4-weather-plugin = callPackage ./panel-plugins/xfce4-weather-plugin.nix { };
+
+  xfce4-whiskermenu-plugin = callPackage ./panel-plugins/xfce4-whiskermenu-plugin.nix { };
+
+  xfce4-windowck-plugin = callPackage ./panel-plugins/xfce4-windowck-plugin.nix { };
+
+  xfce4-pulseaudio-plugin = callPackage ./panel-plugins/xfce4-pulseaudio-plugin.nix { };
+
+  #### GTK+3 (deprecated, see NixOS/nixpkgs#32763)
+
+  libxfce4ui_gtk3 = libxfce4ui.override { withGtk3 = true; };
+
+  xfce4panel_gtk3 = xfce4-panel.override { withGtk3 = true; };
+
+  xfce4_power_manager_gtk3 = xfce4-power-manager.override { withGtk3 = true; };
+
+} // lib.optionalAttrs (config.allowAliases or true) {
+  #### ALIASES - added 2018-01
+
+  terminal = xfce4-terminal;
+  thunar-build = thunar-bare;
+  thunarx-2-dev = thunar-build;
+  thunar_volman = thunar-volman;
+  xfce4panel = xfce4-panel;
+  xfce4session = xfce4-session;
+  xfce4settings = xfce4-settings;
+  xfce4_power_manager = xfce4-power-manager;
+  xfce4_appfinder = xfce4-appfinder;
+  xfce4_dev_tools = xfce4-dev-tools;
+  xfce4mixer = xfce4-mixer;
+  xfce4mixer_pulse = xfce4-mixer-pulse;
+  xfce4notifyd = xfce4-notifyd;
+  xfce4taskmanager = xfce4-taskmanager;
+  xfce4terminal = xfce4-terminal;
+  xfce4volumed = xfce4-volumed;
+  xfce4volumed_pulse = xfce4-volumed-pulse;
+  xfce4icontheme = xfce4-icon-theme;
+  xfwm4themes = xfwm4-themes;
+
+  xfce4_battery_plugin = xfce4-battery-plugin;
+  xfce4_clipman_plugin = xfce4-clipman-plugin;
+  xfce4_cpufreq_plugin = xfce4-cpufreq-plugin;
+  xfce4_cpugraph_plugin = xfce4-cpugraph-plugin;
+  xfce4_datetime_plugin = xfce4-datetime-plugin;
+  xfce4_dict_plugin = xfce4-dict-plugin;
+  xfce4_dockbarx_plugin = xfce4-dockbarx-plugin;
+  xfce4_embed_plugin = xfce4-embed-plugin;
+  xfce4_eyes_plugin = xfce4-eyes-plugin;
+  xfce4_fsguard_plugin = xfce4-fsguard-plugin;
+  xfce4_genmon_plugin = xfce4-genmon-plugin;
+  xfce4_hardware_monitor_plugin = xfce4-hardware-monitor-plugin;
+  xfce4_namebar_plugin = xfce4-namebar-plugin;
+  xfce4_netload_plugin = xfce4-netload-plugin;
+  xfce4_notes_plugin = xfce4-notes-plugin;
+  xfce4_mailwatch_plugin = xfce4-mailwatch-plugin;
+  xfce4_mpc_plugin = xfce4-mpc-plugin;
+  xfce4_sensors_plugin = xfce4-sensors-plugin;
+  xfce4_systemload_plugin = xfce4-systemload-plugin;
+  xfce4_timer_plugin = xfce4-timer-plugin;
+  xfce4_verve_plugin = xfce4-verve-plugin;
+  xfce4_xkb_plugin = xfce4-xkb-plugin;
+  xfce4_weather_plugin = xfce4-weather-plugin;
+  xfce4_whiskermenu_plugin = xfce4-whiskermenu-plugin;
+  xfce4_windowck_plugin = xfce4-windowck-plugin;
+  xfce4_pulseaudio_plugin = xfce4-pulseaudio-plugin;
+})
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-battery-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-battery-plugin.nix
new file mode 100644
index 000000000000..6399aa3cc20d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-battery-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk, hicolor-icon-theme }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-battery-plugin";
+  ver_maj = "1.0";
+  ver_min = "5";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "04gbplcj8z4vg5xbks8cc2jjf62mmf9sdymg90scjwmb82pv2ngn";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk hicolor-icon-theme ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Battery plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin.nix
new file mode 100644
index 000000000000..280f39f8d997
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-clipman-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, exo, libXtst, xorgproto, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk, hicolor-icon-theme }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-clipman-plugin";
+  ver_maj = "1.2";
+  ver_min = "6";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "19a8gwcqc0r5qqi8w28dc8arqip34m8yxdb87lgps9g5qfcky113";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool glib exo libXtst xorgproto libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk hicolor-icon-theme ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Clipboard manager for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpufreq-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpufreq-plugin.nix
new file mode 100644
index 000000000000..07838f8fe7c9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpufreq-plugin.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk, hicolor-icon-theme }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-cpufreq-plugin";
+  ver_maj = "1.1";
+  ver_min = "3";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0crd21l5cw0xgm6w7s049xa36k203yx7l56ssnah9nq1w73n58bl";
+  };
+
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk hicolor-icon-theme ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "CPU Freq load plugin for Xfce panel";
+    license = [ licenses.gpl2Plus ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpugraph-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpugraph-plugin.nix
new file mode 100644
index 000000000000..e088e74cfb1c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-cpugraph-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, exo, libXtst, xorgproto, libxfce4util, xfce4-panel, libxfce4ui, xfconf, gtk, hicolor-icon-theme }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-cpugraph-plugin";
+  ver_maj = "1.0";
+  ver_min = "5";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1izl53q95m5xm2fiq7385vb1i9nwgjizxkmgpgh33zdckb40xnl5";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool glib exo libXtst xorgproto libxfce4util libxfce4ui xfce4-panel xfconf gtk hicolor-icon-theme ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "CPU graph show for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-datetime-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-datetime-plugin.nix
new file mode 100644
index 000000000000..c63170100312
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-datetime-plugin.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, libxfcegui4, xfce4-panel
+, gtk }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-datetime-plugin";
+  ver_maj = "0.6";
+  ver_min = "2";
+
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0b4yril07qgkmywjym1qp12r4g35bnh96879zbjps7cd3rkxld4p";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfcegui4 xfce4-panel gtk ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Shows the date and time in the panel, and a calendar appears when you left-click on it";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dict-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dict-plugin.nix
new file mode 100644
index 000000000000..8210fc62ccb4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dict-plugin.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk}:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-dict-plugin";
+  ver_maj = "0.3";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.gz";
+    sha256 = "1x0imfnsdfq7fbhka8bc0yjjspkcljc1jafhrwzb08qi9bk2wbar";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Dictionary plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+    broken = true; # see http://goodies.xfce.org/projects/panel-plugins/xfce4-dict-plugin
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dockbarx-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dockbarx-plugin.nix
new file mode 100644
index 000000000000..b33ba7770be3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-dockbarx-plugin.nix
@@ -0,0 +1,40 @@
+{ stdenv, pkgconfig, fetchFromGitHub, python2, bash, vala
+, dockbarx, gtk2, xfce, pythonPackages, wafHook }:
+
+stdenv.mkDerivation rec {
+  ver = "0.5";
+  rev = "a2dcb66";
+  name = "xfce4-dockbarx-plugin-${ver}-${rev}";
+
+  src = fetchFromGitHub {
+    owner = "TiZ-EX1";
+    repo = "xfce4-dockbarx-plugin";
+    rev = rev;
+    sha256 = "1f75iwlshnif60x0qqdqw5ffng2m4f4zp0ijkrbjz83wm73nsxfx";
+  };
+
+  pythonPath = [ dockbarx ];
+
+  nativeBuildInputs = [ pkgconfig wafHook ];
+  buildInputs = [ python2 vala gtk2 pythonPackages.wrapPython ]
+    ++ (with xfce; [ libxfce4util xfce4-panel xfconf xfce4-dev-tools ])
+    ++ pythonPath;
+
+  postPatch = ''
+    substituteInPlace wscript           --replace /usr/share/            "\''${PREFIX}/share/"
+    substituteInPlace src/dockbarx.vala --replace /usr/share/            $out/share/
+    substituteInPlace src/dockbarx.vala --replace '/usr/bin/env python2' ${bash}/bin/bash
+  '';
+
+  postFixup = ''
+    wrapPythonProgramsIn "$out/share/xfce4/panel/plugins" "$out $pythonPath"
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/TiZ-EX1/xfce4-dockbarx-plugin;
+    description = "A plugins to embed DockbarX into xfce4-panel";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.volth ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-embed-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-embed-plugin.nix
new file mode 100644
index 000000000000..e6d1f6da26b5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-embed-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, xfconf, gtk2 }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-embed-plugin";
+  ver_maj = "1.6";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0a72kqsjjh45swimqlpyrahdnplp0383v0i4phr4n6g8c1ixyry7";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel xfconf gtk2 ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Embed arbitrary app windows on Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-eyes-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-eyes-plugin.nix
new file mode 100644
index 000000000000..3a79f67068c8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-eyes-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk}:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-eyes-plugin";
+  ver_maj = "4.4";
+  ver_min = "4";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1jh02hylvsvfpxrx0bq6fzgy6vnxf9qakgpbfvr63lfkd1dyh314";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Eyes following you!";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-fsguard-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-fsguard-plugin.nix
new file mode 100644
index 000000000000..6d0f8ee73a4c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-fsguard-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk}:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-fsguard-plugin";
+  ver_maj = "1.0";
+  ver_min = "2";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1bj021h4q68bc03f32pkyqy4gfd1sz6s21nxdg7j6gdfhs9xbj52";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Filesystem monitor";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-genmon-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-genmon-plugin.nix
new file mode 100644
index 000000000000..039ac1440947
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-genmon-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk}:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-genmon-plugin";
+  ver_maj = "3.4";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "11q3g6lmgz3d5lyh6614mxkd9cblfdyf9jgki7f26mn895xk79dh";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Cyclically spawns a command and captures its output";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-hardware-monitor-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-hardware-monitor-plugin.nix
new file mode 100644
index 000000000000..d18c3b8ee256
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-hardware-monitor-plugin.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, pkgconfig, intltool, autoreconfHook, gnome2,
+  libgtop, libxfce4ui, libxfce4util, xfce4-panel, lm_sensors
+}:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${version}";
+  pname  = "xfce4-hardware-monitor-plugin";
+  version = "1.6.0";
+
+  src = fetchurl {
+    url = "https://git.xfce.org/panel-plugins/${pname}/snapshot/${name}.tar.bz2";
+    sha256 = "0xg5har11fk1wmdymydxlbk1z8aa39j8k0p4gzw2iqslv3n0zf7b";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkgconfig
+    intltool
+  ];
+
+  buildInputs = [
+    gnome2.gtkmm2
+    gnome2.libgnomecanvas
+    gnome2.libgnomecanvasmm
+    libgtop
+    libxfce4ui
+    libxfce4util
+    xfce4-panel
+    lm_sensors
+   ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${pname}";
+    description = "Hardware monitor plugin for the XFCE4 panel";
+    license = stdenv.lib.licenses.gpl3;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mailwatch-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mailwatch-plugin.nix
new file mode 100644
index 000000000000..80153332934a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mailwatch-plugin.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui,
+libxfcegui4, xfconf, gtk, exo, gnutls, libgcrypt }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-mailwatch-plugin";
+  ver_maj = "1.2";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1bfw3smwivr9mzdyq768biqrl4aq94zqi3xjzq6kqnd8561cqjk2";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel
+    libxfcegui4 xfconf gtk exo gnutls libgcrypt ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Mailwatch plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mpc-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mpc-plugin.nix
new file mode 100644
index 000000000000..8a602b8b4a1e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-mpc-plugin.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui,
+libxfcegui4, xfconf, gtk, exo }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-mpc-plugin";
+  ver_maj = "0.4";
+  ver_min = "5";
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1kvgq1pq7cykqdc3227dq0izad093ppfw3nfsrcp9i8mi6i5f7z7";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel
+    libxfcegui4 xfconf gtk exo ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "MPD plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-namebar-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-namebar-plugin.nix
new file mode 100644
index 000000000000..8c6c91e25194
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-namebar-plugin.nix
@@ -0,0 +1,31 @@
+{ stdenv, pkgconfig, fetchFromGitHub, python2, vala_0_40
+, gtk2, libwnck, libxfce4util, xfce4-panel, wafHook }:
+
+stdenv.mkDerivation rec {
+  ver = "0.3.1";
+  rev = "07a23b3";
+  name = "xfce4-namebar-plugin-${ver}";
+
+  src = fetchFromGitHub {
+    owner = "TiZ-EX1";
+    repo = "xfce4-namebar-plugin";
+    rev = rev;
+    sha256 = "1sl4qmjywfvv53ch7hyfysjfd91zl38y7gdw2y3k69vkzd3h18ad";
+  };
+
+  nativeBuildInputs = [ pkgconfig wafHook ];
+  buildInputs = [ python2 vala_0_40 gtk2 libwnck libxfce4util xfce4-panel ];
+
+  postPatch = ''
+    substituteInPlace src/preferences.vala --replace 'Environment.get_system_data_dirs()' "{ \"$out/share\" }"
+    substituteInPlace src/namebar.vala     --replace 'Environment.get_system_data_dirs()' "{ \"$out/share\" }"
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = https://github.com/TiZ-EX1/xfce4-namebar-plugin;
+    description = "A plugins which integrates titlebar and window controls into the xfce4-panel";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.volth ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-netload-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-netload-plugin.nix
new file mode 100644
index 000000000000..e82669cc1a35
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-netload-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk, hicolor-icon-theme }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-netload-plugin";
+  ver_maj = "1.2";
+  ver_min = "4";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1lrhhzxmybcfl52hnadr2dvasis9wmk6a48pcy02s09ch8cfkb7z";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk hicolor-icon-theme ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Battery plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-notes-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-notes-plugin.nix
new file mode 100644
index 000000000000..d61dae6bdd56
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-notes-plugin.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, libxfcegui4, xfconf, gtk, libunique }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-notes-plugin";
+  ver_maj = "1.7";
+  ver_min = "7";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "05sjbwgch1j93m3r23ksbjnpfk11sf7xjmbb9pm5vl3snc2s3fm7";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf gtk libunique ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Sticky notes plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-pulseaudio-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-pulseaudio-plugin.nix
new file mode 100644
index 000000000000..6f6f5699b6e9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-pulseaudio-plugin.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4panel_gtk3, xfconf
+, gtk3, libpulseaudio, hicolor-icon-theme
+, withKeybinder ? true, keybinder3
+, withLibnotify ? true, libnotify
+}:
+
+assert withKeybinder -> keybinder3 != null;
+assert withLibnotify -> libnotify != null;
+
+with stdenv.lib;
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-pulseaudio-plugin";
+  ver_maj = "0.2";
+  ver_min = "3";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "e82836bc8cf7d905b4e60d43dc630ba8e32dea785989700c71d4aeee9f583b33";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+  buildInputs = [ libxfce4util xfce4panel_gtk3 xfconf gtk3 libpulseaudio hicolor-icon-theme ]
+    ++ optional withKeybinder keybinder3
+    ++ optional withLibnotify libnotify;
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Adjust the audio volume of the PulseAudio sound system";
+    platforms = platforms.linux;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-sensors-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-sensors-plugin.nix
new file mode 100644
index 000000000000..5a4dfee76fc4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-sensors-plugin.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gnome2, libxfce4ui,
+  libxfce4util, xfce4-panel, libnotify, lm_sensors, hddtemp, netcat-gnu
+}:
+
+stdenv.mkDerivation rec {
+  name = "${pname}-${ver_maj}.${ver_min}";
+  pname  = "xfce4-sensors-plugin";
+  ver_maj = "1.2";
+  ver_min = "6";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${pname}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1h0vpqxcziml3gwrbvd8xvy1mwh9mf2a68dvxsy03rs5pm1ghpi3";
+  };
+
+  nativeBuildInputs = [
+    pkgconfig
+    intltool
+  ];
+
+  buildInputs = [
+    gnome2.gtk
+    libxfce4ui
+    libxfce4util
+    xfce4-panel
+    libnotify
+    lm_sensors
+    hddtemp
+    netcat-gnu
+   ];
+
+  enableParallelBuilding = true;
+
+  configureFlags = [
+    "--with-pathhddtemp=${hddtemp}/bin/hddtemp"
+    "--with-pathnetcat=${netcat-gnu}/bin/netcat"
+  ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${pname}";
+    description = "A panel plug-in for different sensors using acpi, lm_sensors and hddtemp";
+    license = stdenv.lib.licenses.gpl2;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-systemload-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-systemload-plugin.nix
new file mode 100644
index 000000000000..698d4aae5328
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-systemload-plugin.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel, libxfce4ui, gtk}:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-systemload-plugin";
+  ver_maj = "1.1";
+  ver_min = "2";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0z4as6sxdz93d4jpgv0665dg4sykfvc5068mc689phlfl2rvcsdl";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel gtk ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "System load plugin for Xfce panel";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-timer-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-timer-plugin.nix
new file mode 100644
index 000000000000..73ab7782ebd4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-timer-plugin.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, xfce4-panel
+, libxfce4ui, libxfcegui4, xfconf, gtk, hicolor-icon-theme }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-timer-plugin";
+  ver_maj = "1.6";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "0z46gyw3ihcd1jf0m5z1dsc790xv1cpi8mk1dagj3i4v14gx5mrr";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel libxfcegui4 xfconf
+    gtk hicolor-icon-theme ];
+
+  nativeBuildInputs = [ pkgconfig ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "A simple XFCE panel plugin that lets the user run an alarm at a specified time or at the end of a specified countdown period";
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+    maintainers = [ maintainers.matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/appmenu-gtk-module.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/appmenu-gtk-module.nix
new file mode 100644
index 000000000000..7134d29c9ffb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/appmenu-gtk-module.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchFromGitHub, cmake, vala, glib, gtk2, gtk3 }:
+stdenv.mkDerivation rec {
+  name = "vala-panel-appmenu-xfce-${version}";
+  version = "0.6.94";
+
+  src = "${fetchFromGitHub {
+    owner = "rilian-la-te";
+    repo = "vala-panel-appmenu";
+    rev = version;
+    fetchSubmodules = true;
+
+    sha256 = "0xxn3zs60a9nfix8wrdp056wviq281cm1031hznzf1l38lp3wr5p";
+  }}/subprojects/appmenu-gtk-module";
+
+  nativeBuildInputs = [ cmake vala ];
+  buildInputs = [ glib gtk2 gtk3 ];
+
+  configurePhase = ''
+    cmake . -DGTK3_INCLUDE_GDK=
+  '';
+  installPhase = ''
+    make DESTDIR=output install
+    cp -r output/var/empty/* "$out"
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Port of the Unity GTK+ Module";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ jD91mZM2 ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/default.nix
new file mode 100644
index 000000000000..694f6772282b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, fetchFromGitHub, substituteAll, callPackage, pkgconfig, cmake, vala, libxml2,
+  glib, pcre, gtk2, gtk3, xorg, libxkbcommon, epoxy, at-spi2-core, dbus-glib, bamf,
+  xfce, libwnck3, libdbusmenu, gobject-introspection }:
+
+stdenv.mkDerivation rec {
+  name = "xfce4-vala-panel-appmenu-plugin-${version}";
+  version = "0.6.94";
+
+  src = fetchFromGitHub {
+    owner = "rilian-la-te";
+    repo = "vala-panel-appmenu";
+    rev = version;
+    fetchSubmodules = true;
+
+    sha256 = "0xxn3zs60a9nfix8wrdp056wviq281cm1031hznzf1l38lp3wr5p";
+  };
+
+  nativeBuildInputs = [ pkgconfig cmake vala libxml2.bin ];
+  buildInputs = [ (callPackage ./appmenu-gtk-module.nix {})
+                  glib pcre gtk2 gtk3 xorg.libpthreadstubs xorg.libXdmcp libxkbcommon epoxy
+                  at-spi2-core dbus-glib bamf xfce.xfce4panel_gtk3 xfce.libxfce4util xfce.xfconf
+                  libwnck3 libdbusmenu gobject-introspection ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-bamf-dependency.patch;
+      bamf = bamf;
+    })
+  ];
+
+  cmakeFlags = [
+      "-DENABLE_XFCE=ON"
+      "-DENABLE_BUDGIE=OFF"
+      "-DENABLE_VALAPANEL=OFF"
+      "-DENABLE_MATE=OFF"
+      "-DENABLE_JAYATANA=OFF"
+      "-DENABLE_APPMENU_GTK_MODULE=OFF"
+  ];
+
+  preConfigure = ''
+    mv cmake/FallbackVersion.cmake.in cmake/FallbackVersion.cmake
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Global Menu applet for XFCE4";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ jD91mZM2 ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/fix-bamf-dependency.patch b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/fix-bamf-dependency.patch
new file mode 100644
index 000000000000..1ed86a67f727
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-vala-panel-appmenu-plugin/fix-bamf-dependency.patch
@@ -0,0 +1,12 @@
++++ source/cmake/FindBAMF.cmake	2018-05-11 17:03:44.385917811 +0200
+@@ -80,9 +80,7 @@
+ 
+ find_program(BAMF_DAEMON_EXECUTABLE
+ 	bamfdaemon
+-	HINTS ${CMAKE_INSTALL_FULL_LIBDIR}
+-		  ${CMAKE_INSTALL_FULL_LIBEXECDIR}
+-		  ${BAMF_LIBDIR}
++	HINTS "@bamf@/libexec/bamf/"
+ 	PATH_SUFFIXES bamf
+ )
+ 
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-verve-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-verve-plugin.nix
new file mode 100644
index 000000000000..96ef08cbeb70
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-verve-plugin.nix
@@ -0,0 +1,27 @@
+{ stdenv, fetchurl, pkgconfig, intltool, glib, exo, pcre
+, libxfce4util, xfce4-panel, libxfce4ui, xfconf, gtk }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-verve-plugin";
+  ver_maj = "1.1";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "114wkmgjxkim1jkswih20zg9d7rbzmlf30b5rlcpvmbsij0ny6d3";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool glib exo pcre libxfce4util libxfce4ui xfce4-panel xfconf gtk ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "A command-line plugin";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-weather-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-weather-plugin.nix
new file mode 100644
index 000000000000..15cd526d6def
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-weather-plugin.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, intltool, gtk, libxml2, libsoup, upower,
+libxfce4ui, libxfce4util, xfce4-panel, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  name = "${p_name}-${ver_maj}.${ver_min}";
+  p_name  = "xfce4-weather-plugin";
+  ver_maj = "0.8";
+  ver_min = "10";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1f7ac2zr5s5w6krdpgsq252wxhhmcblia3j783132ilh8k246vgf";
+  };
+
+  nativeBuildInputs = [ pkgconfig intltool ];
+
+  buildInputs = [ gtk libxml2 libsoup upower libxfce4ui libxfce4util
+   xfce4-panel hicolor-icon-theme ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Weather plugin for the Xfce desktop environment";
+    license = stdenv.lib.licenses.gpl2Plus;
+    platforms = stdenv.lib.platforms.unix;
+    maintainers = [ stdenv.lib.maintainers.romildo ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-whiskermenu-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-whiskermenu-plugin.nix
new file mode 100644
index 000000000000..c29758452ae6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-whiskermenu-plugin.nix
@@ -0,0 +1,36 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, intltool, libxfce4util, libxfcegui4
+, xfce4-panel, gtk, exo, garcon }:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-whiskermenu-plugin";
+  version = "1.7.2";
+
+  name = "${p_name}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "gottcode";
+    repo = "xfce4-whiskermenu-plugin";
+    rev = "v${version}";
+    sha256 = "1rpazgnjp443abc31bgi6gp9q3sgbg13v7v74nn7vf6kl4v725ah";
+  };
+
+  nativeBuildInputs = [ cmake pkgconfig intltool ];
+
+  buildInputs = [ libxfce4util libxfcegui4 xfce4-panel gtk exo garcon ];
+
+  enableParallelBuilding = true;
+
+  preFixup = ''
+    substituteInPlace $out/bin/xfce4-popup-whiskermenu \
+      --replace $out/bin/xfce4-panel ${xfce4-panel.out}/bin/xfce4-panel
+  '';
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Alternate application launcher for Xfce";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.pjbarnoy ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-windowck-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-windowck-plugin.nix
new file mode 100644
index 000000000000..8798851579d8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-windowck-plugin.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchFromGitHub, pkgconfig, intltool, python3, imagemagick, libwnck, gtk2
+, exo, libxfce4ui, libxfce4util, xfce4-panel, xfconf, xfce4-dev-tools }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-windowck-plugin";
+  version = "0.4.4";
+
+  src = fetchFromGitHub {
+    owner = "cedl38";
+    repo = "xfce4-windowck-plugin";
+    rev = "v${version}";
+    sha256 = "0c6a1ibh39dpq9x0dha5lsg0vzmgaf051fgwz0nlky0s94nwzvgv";
+  };
+  name = "${p_name}-${version}";
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool python3 imagemagick libwnck gtk2
+    exo libxfce4ui libxfce4util xfce4-panel xfconf xfce4-dev-tools ];
+
+  preConfigure = ''
+    ./autogen.sh
+    patchShebangs .
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Set of two plugins which allows you to put the maximized window title and windows buttons on the panel";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.volth ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-xkb-plugin.nix b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-xkb-plugin.nix
new file mode 100644
index 000000000000..307d2e81bf24
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/panel-plugins/xfce4-xkb-plugin.nix
@@ -0,0 +1,28 @@
+{ stdenv, fetchurl, pkgconfig, intltool, libxfce4util, libxfce4ui, xfce4-panel
+, garcon, gtk, libxklavier, librsvg, libwnck
+}:
+
+with stdenv.lib;
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-xkb-plugin";
+  ver_maj = "0.7";
+  ver_min = "1";
+
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/panel-plugins/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "10g65j5ia389ahhn3b9hr52ghpp0817fk0m60rfrv4wrzqrjxzk1";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ intltool libxfce4util libxfce4ui xfce4-panel garcon
+    gtk libxklavier librsvg libwnck  ];
+
+  meta = {
+    homepage = "http://goodies.xfce.org/projects/panel-plugins/${p_name}";
+    description = "Allows you to setup and use multiple keyboard layouts";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/thunar-plugins/archive/default.nix b/nixpkgs/pkgs/desktops/xfce/thunar-plugins/archive/default.nix
new file mode 100644
index 000000000000..ea3a0f084439
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/thunar-plugins/archive/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchFromGitHub, pkgconfig, xfce4-dev-tools
+, gtk
+, thunar-bare
+, exo, libxfce4util, libxfce4ui
+, xfconf, udev, libnotify, hicolor-icon-theme
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "thunar-archive-plugin";
+  ver_maj = "0.3";
+  ver_min = "1";
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchFromGitHub {
+    owner = "xfce-mirror";
+    repo = p_name;
+    rev = "72b23eefc348bee31e06a04f968e430bc7dfa51e";
+    sha256 = "0l8715x23qmk0jkywiza3qx0xxmafxi4grp7p82kkc5df5ccs8kx";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [
+    xfce4-dev-tools
+    thunar-bare
+    exo gtk libxfce4util libxfce4ui
+    xfconf udev libnotify hicolor-icon-theme
+  ];
+
+  preConfigure = ''
+    ./autogen.sh
+  '';
+
+  /*
+    File roller `*.desktop` situation
+    ---------------------------------
+
+    For some odd reason, in nix os, gnome file-roller's desktop file has the non-standard name
+    `org.gnome.FileRoller.desktop`. In order to be compatible with this odd context, create
+    a `*.tap` file of the same name.
+
+    IMPORTANT: Adapt or remove the symbolic link if the situation changes.
+  */
+  preFixup = ''
+    pushd $out/libexec/thunar-archive-plugin > /dev/null
+    ln -s ./file-roller.tap org.gnome.FileRoller.tap
+    popd > /dev/null
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://foo-projects.org/~benny/projects/thunar-archive-plugin/;
+    description = "Thunar plugin providing file context menus for archives";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce/thunar-plugins/dropbox/default.nix b/nixpkgs/pkgs/desktops/xfce/thunar-plugins/dropbox/default.nix
new file mode 100644
index 000000000000..217cecf85a8c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce/thunar-plugins/dropbox/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchurl, pkgconfig
+, gtk
+, thunar-bare, python2, hicolor-icon-theme
+, wafHook
+}:
+
+stdenv.mkDerivation rec {
+  p_name  = "thunar-dropbox-plugin";
+  ver_maj = "0.2";
+  ver_min = "1";
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  src = fetchurl {
+    url = "http://softwarebakery.com/maato/files/thunar-dropbox/thunar-dropbox-${ver_maj}.${ver_min}.tar.bz2";
+    sha256 = "08vhzzzwshyz371yl7fzfylmhvchhv3s5kml3dva4v39jhvrpnkf";
+  };
+
+  nativeBuildInputs = [ pkgconfig wafHook ];
+  buildInputs = [
+    gtk
+    thunar-bare python2 hicolor-icon-theme
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    homepage = http://softwarebakery.com/maato/thunar-dropbox.html;
+    description = "A plugin for thunar that adds context-menu items from dropbox";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/automakeAddFlags.sh b/nixpkgs/pkgs/desktops/xfce4-13/automakeAddFlags.sh
new file mode 100644
index 000000000000..92d5659d05ca
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/automakeAddFlags.sh
@@ -0,0 +1,7 @@
+automakeAddFlags() {
+    local file="$1"
+    local target="$2"
+    local source="$3"
+
+    sed "/$target/a\$($source) \\\\" -i $file
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/default.nix
new file mode 100644
index 000000000000..d3e46cf23654
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/default.nix
@@ -0,0 +1,113 @@
+{ lib, makeSetupHook, newScope, gnome3, gst_all_1 }:
+
+let
+  inherit (lib) makeScope;
+in
+
+makeScope newScope (self: with self; {
+  mkXfceDerivation = callPackage ./mkXfceDerivation.nix { };
+
+  automakeAddFlags = makeSetupHook { } ./automakeAddFlags.sh;
+
+  exo = callPackage ./exo { };
+
+  garcon = callPackage ./garcon { };
+
+  gigolo = callPackage ./gigolo { };
+
+  libxfce4util = callPackage ./libxfce4util { };
+
+  libxfce4ui = callPackage ./libxfce4ui { };
+
+  mousepad = callPackage ./mousepad { };
+
+  orage = callPackage ./orage { };
+
+  parole = callPackage ./parole {
+    inherit (gst_all_1) gst-plugins-bad gst-plugins-base gst-plugins-good;
+    gst-plugins-ugly = null;
+  };
+
+  ristretto = callPackage ./ristretto { };
+
+  thunar = callPackage ./thunar { };
+
+  thunar-volman = callPackage ./thunar-volman { };
+
+  tumbler = callPackage ./tumbler { };
+
+  xfburn = callPackage ./xfburn { };
+
+  xfconf = callPackage ./xfconf { };
+
+  xfdesktop = callPackage ./xfdesktop { };
+
+  xfce4-appfinder = callPackage ./xfce4-appfinder { };
+
+  xfce4-battery-plugin = callPackage ./xfce4-battery-plugin { };
+
+  xfce4-cpufreq-plugin = callPackage ./xfce4-cpufreq-plugin { };
+
+  xfce4-clipman-plugin = callPackage ./xfce4-clipman-plugin { };
+
+  xfce4-dev-tools = callPackage ./xfce4-dev-tools {
+    mkXfceDerivation = mkXfceDerivation.override {
+      xfce4-dev-tools = null;
+    };
+  };
+
+  xfce4-dict = callPackage ./xfce4-dict { };
+
+  xfce4-mixer = callPackage ./xfce4-mixer { };
+
+  xfce4-netload-plugin = callPackage ./xfce4-netload-plugin { };
+
+  xfce4-notifyd = callPackage ./xfce4-notifyd { };
+
+  xfce4-panel = callPackage ./xfce4-panel { };
+
+  xfce4-power-manager = callPackage ./xfce4-power-manager { };
+
+  xfce4-pulseaudio-plugin = callPackage ./xfce4-pulseaudio-plugin { };
+
+  xfce4-screenshooter = callPackage ./xfce4-screenshooter {
+    inherit (gnome3) libsoup;
+  };
+
+  xfce4-session = callPackage ./xfce4-session { };
+  xinitrc = "${xfce4-session}/etc/xdg/xfce4/xinitrc";
+
+  xfce4-settings = callPackage ./xfce4-settings { };
+
+  xfce4-taskmanager = callPackage ./xfce4-taskmanager { };
+
+  xfce4-terminal = callPackage ./xfce4-terminal { };
+
+  xfce4-volumed-pulse = callPackage ./xfce4-volumed-pulse { };
+
+  xfce4-whiskermenu-plugin = callPackage ./xfce4-whiskermenu-plugin { };
+
+  xfce4-xkb-plugin = callPackage ./xfce4-xkb-plugin { };
+
+  xfwm4 = callPackage ./xfwm4 { };
+
+  ## COMMON PARTS WITH XFCE 4.12
+
+  gtk-xfce-engine = callPackage ../xfce/core/gtk-xfce-engine.nix { withGtk3 = false; };
+
+  xfce4-icon-theme = callPackage ../xfce/art/xfce4-icon-theme.nix { };
+
+  xfwm4-themes = callPackage ../xfce/art/xfwm4-themes.nix { };
+
+  xfce4-embed-plugin = callPackage ../xfce/panel-plugins/xfce4-embed-plugin.nix { };
+
+  xfce4-hardware-monitor-plugin = callPackage ../xfce/panel-plugins/xfce4-hardware-monitor-plugin.nix { };
+
+  ## THIRD PARTY PLIGINS
+
+  xfce4-dockbarx-plugin = callPackage ../xfce/panel-plugins/xfce4-dockbarx-plugin.nix { };
+
+  xfce4-namebar-plugin = callPackage ../xfce/panel-plugins/xfce4-namebar-plugin.nix { };
+
+  xfce4-windowck-plugin = callPackage ../xfce/panel-plugins/xfce4-windowck-plugin.nix { };
+})
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/exo/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/exo/default.nix
new file mode 100644
index 000000000000..1096996ee6d5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/exo/default.nix
@@ -0,0 +1,23 @@
+{ mkXfceDerivation, docbook_xsl, libxslt, perlPackages, gtk2, gtk3
+, libxfce4ui, libxfce4util }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "exo";
+  version = "0.12.2";
+
+  sha256 = "1b4hl9yxvf8b8akqf2zngq3m93yqnqcmxqqds1dwzm9vm5sqydgh";
+
+  nativeBuildInputs = [ libxslt perlPackages.URI ];
+  buildInputs = [ gtk2 gtk3 libxfce4ui libxfce4util ];
+
+  postPatch = ''
+    substituteInPlace docs/reference/Makefile.am \
+      --replace http://docbook.sourceforge.net/release/xsl/current \
+                ${docbook_xsl}/share/xml/docbook-xsl
+  '';
+
+  meta = {
+    description = "Application library for Xfce";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/exo/gtk3-only.patch b/nixpkgs/pkgs/desktops/xfce4-13/exo/gtk3-only.patch
new file mode 100644
index 000000000000..74e6f812e3c7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/exo/gtk3-only.patch
@@ -0,0 +1,28 @@
+diff -urNZ a/configure.ac.in b/configure.ac.in
+--- a/configure.ac.in	2017-11-20 02:57:40.476664918 +0000
++++ b/configure.ac.in	2017-11-20 03:07:18.999128370 +0000
+@@ -165,11 +165,9 @@
+ dnl ***********************************
+ XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.42.0])
+ XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.42.0])
+-XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.24.0])
+ XDT_CHECK_PACKAGE([GTK3], [gtk+-3.0], [3.20.0])
+ XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.42.0])
+ XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.10.0])
+-XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.12.0])
+ XDT_CHECK_PACKAGE([LIBXFCE4UI2], [libxfce4ui-2], [4.12.0])
+ XDT_CHECK_OPTIONAL_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.42.0], [gio-unix], [GIO-Unix features])
+ 
+diff -urNZ a/exo/Makefile.am b/exo/Makefile.am
+--- a/exo/Makefile.am	2017-11-20 02:57:34.444785202 +0000
++++ b/exo/Makefile.am	2017-11-20 03:00:49.402897465 +0000
+@@ -117,7 +117,7 @@
+ 
+ libexo_2_includedir = $(includedir)/exo-2/exo
+ 
+-lib_LTLIBRARIES += libexo-2.la
++lib_LTLIBRARIES = libexo-2.la
+ 
+ libexo_2_include_HEADERS =						\
+ 	exo.h								\
+Binary files a/.git/index and b/.git/index differ
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/garcon/12700.patch b/nixpkgs/pkgs/desktops/xfce4-13/garcon/12700.patch
new file mode 100644
index 000000000000..fda36d696510
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/garcon/12700.patch
@@ -0,0 +1,37 @@
+From: Yegor Timoshenko <yegortimoshenko@gmail.com>
+Date: Thu, 14 Dec 2017 21:13:02 +0000
+Subject: [PATCH] Decrement allocation counter on item unref (#12700)
+
+diff --git a/garcon/garcon-menu-item-pool.c b/garcon/garcon-menu-item-pool.c
+index 2017180..355e520 100644
+--- a/garcon/garcon-menu-item-pool.c
++++ b/garcon/garcon-menu-item-pool.c
+@@ -191,7 +191,12 @@ garcon_menu_item_pool_filter_exclude (const gchar    *desktop_id,
+   g_return_val_if_fail (GARCON_IS_MENU_ITEM (item), FALSE);
+   g_return_val_if_fail (node != NULL, FALSE);
+
+-  return garcon_menu_node_tree_rule_matches (node, item);
++  gboolean matches = garcon_menu_node_tree_rule_matches (node, item);
++
++  if (matches)
++    garcon_menu_item_increment_allocated (item);
++
++  return matches;
+ }
+
+
+diff --git a/garcon/garcon-menu-item.c b/garcon/garcon-menu-item.c
+index ca8cb63..b44acfe 100644
+--- a/garcon/garcon-menu-item.c
++++ b/garcon/garcon-menu-item.c
+@@ -1908,6 +1908,8 @@ garcon_menu_item_unref (GarconMenuItem *item)
+ {
+   g_return_if_fail (GARCON_IS_MENU_ITEM (item));
+
++  garcon_menu_item_decrement_allocated (item);
++
+   /* Decrement the reference counter */
+   g_object_unref (G_OBJECT (item));
+ }
+--
+2.15.1
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/garcon/13785.patch b/nixpkgs/pkgs/desktops/xfce4-13/garcon/13785.patch
new file mode 100644
index 000000000000..1b723d21d60a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/garcon/13785.patch
@@ -0,0 +1,75 @@
+From 4387496fe332a50945e7db76bc2196b419656fe3 Mon Sep 17 00:00:00 2001
+From: Stefan Berzl <stefanberzl@gmail.com>
+Date: Mon, 21 Aug 2017 18:39:07 +0300
+Subject: [PATCH] fix: some menu icons are too big (Bug #13785)
+
+Some packages only provide icons in sizes much bigger than the standard
+GTK menu size of 16px.
+
+The clipboard manager qlipper for example provides the following icon:
+/usr/share/icons/hicolor/128x128/apps/qlipper.png
+
+In GTK 3.22.18 the function gtk_image_new_from_icon_name when given
+GTK_ICON_SIZE_MENU as second argument still returns an image with 128x128.
+
+The patch I have supplied uses existing code to scale such an image.
+
+Signed-off-by: Eric Koegel <eric.koegel@gmail.com>
+---
+ garcon-gtk/garcon-gtk-menu.c | 33 +++++++++++++++++++--------------
+ 1 file changed, 19 insertions(+), 14 deletions(-)
+
+diff --git a/garcon-gtk/garcon-gtk-menu.c b/garcon-gtk/garcon-gtk-menu.c
+index 41990f2..f31a1ed 100644
+--- a/garcon-gtk/garcon-gtk-menu.c
++++ b/garcon-gtk/garcon-gtk-menu.c
+@@ -650,7 +650,11 @@ garcon_gtk_menu_load_icon (const gchar *icon_name)
+   gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
+   size = MIN (w, h);
+ 
+-  if (! gtk_icon_theme_has_icon (icon_theme, icon_name))
++  if (gtk_icon_theme_has_icon (icon_theme, icon_name))
++    {
++	  pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name, size, 0, NULL);;
++    }
++  else
+     {
+       if (g_path_is_absolute (icon_name))
+         {
+@@ -684,22 +688,23 @@ garcon_gtk_menu_load_icon (const gchar *icon_name)
+               g_free (name);
+             }
+         }
++    }
+ 
+-      /* Turn the pixbuf into a gtk_image */
+-      if (G_LIKELY (pixbuf))
+-        {
+-          /* scale the pixbuf down if it needs it */
+-          GdkPixbuf *tmp = gdk_pixbuf_scale_simple (pixbuf, w, h, GDK_INTERP_BILINEAR);
+-          g_object_unref (pixbuf);
+-          pixbuf = tmp;
++  /* Turn the pixbuf into a gtk_image */
++  if (G_LIKELY (pixbuf))
++    {
++      /* scale the pixbuf down if it needs it */
++      GdkPixbuf *pixbuf_scaled = gdk_pixbuf_scale_simple (pixbuf, w, h, GDK_INTERP_BILINEAR);
++      g_object_unref (G_OBJECT (pixbuf));
+ 
+-          image = gtk_image_new_from_pixbuf (pixbuf);
+-          g_object_unref (G_OBJECT (pixbuf));
+-        }
++      image = gtk_image_new_from_pixbuf (pixbuf_scaled);
++      g_object_unref (G_OBJECT (pixbuf_scaled));
++    }
++  else
++    {
++	  /* display the placeholder at least */
++	  image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+     }
+-
+-  if (image == NULL)
+-    image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+ 
+   return image;
+ }
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/garcon/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/garcon/default.nix
new file mode 100644
index 000000000000..a88d64702a1a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/garcon/default.nix
@@ -0,0 +1,12 @@
+{ mkXfceDerivation, gtk2 ? null, gtk3, libxfce4ui, libxfce4util }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "garcon";
+  version = "0.6.1";
+
+  sha256 = "19k8bwn29x7hkg882pxv5xxmrbfagdqgkxg166pwz2k0prab6hl8";
+
+  patches = [ ./12700.patch ./13785.patch ];
+  buildInputs = [ gtk2 gtk3 libxfce4ui libxfce4util ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/gigolo/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/gigolo/default.nix
new file mode 100644
index 000000000000..0d7b2210b12c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/gigolo/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, gtk2, libX11 }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "gigolo";
+  version = "0.4.2";
+
+  sha256 = "0qd2jkf3zsvfyd9jn8bfnljja1xfj3ph4wjh3fx10dcwcd791al1";
+
+  buildInputs = [ gtk2 libX11 ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/libxfce4ui/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/libxfce4ui/default.nix
new file mode 100644
index 000000000000..f6997551262e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/libxfce4ui/default.nix
@@ -0,0 +1,18 @@
+{ lib, mkXfceDerivation, gobject-introspection, gtk2, gtk3, libICE, libSM
+, libstartup_notification ? null, libxfce4util, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "libxfce4ui";
+  version = "4.13.4";
+
+  sha256 = "0m9h3kvkk2nx8pxxmsg9sjnyp6ajwjrz9djjxxvranjsdw3ilydy";
+
+  buildInputs =  [ gobject-introspection gtk2 gtk3 libstartup_notification xfconf ];
+  propagatedBuildInputs = [ libxfce4util libICE libSM ];
+
+  meta = with lib; {
+    description = "Widgets library for Xfce";
+    license = licenses.lgpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/libxfce4util/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/libxfce4util/default.nix
new file mode 100644
index 000000000000..6a3b633cd09d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/libxfce4util/default.nix
@@ -0,0 +1,16 @@
+{ lib, mkXfceDerivation, gobject-introspection }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "libxfce4util";
+  version = "4.13.2";
+
+  sha256 = "0sb6pzhmh0qzfdhixj1ard56zi68318k86z3a1h3f2fhqy7gyf98";
+
+  buildInputs = [ gobject-introspection ];
+
+  meta = with lib; {
+    description = "Extension library for Xfce";
+    license = licenses.lgpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/mkXfceDerivation.nix b/nixpkgs/pkgs/desktops/xfce4-13/mkXfceDerivation.nix
new file mode 100644
index 000000000000..da7179c46462
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/mkXfceDerivation.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchgit, pkgconfig, xfce4-dev-tools, hicolor-icon-theme }:
+
+{ category, pname, version, rev ? "${pname}-${version}", sha256, ... } @ args:
+
+let
+  inherit (builtins) filter getAttr head isList;
+  inherit (stdenv.lib) attrNames concatLists recursiveUpdate zipAttrsWithNames;
+
+  filterAttrNames = f: attrs:
+    filter (n: f (getAttr n attrs)) (attrNames attrs);
+
+  concatAttrLists = attrsets:
+    zipAttrsWithNames (filterAttrNames isList (head attrsets)) (_: concatLists) attrsets;
+
+  template = rec {
+    name = "${pname}-${version}";
+
+    nativeBuildInputs = [ pkgconfig xfce4-dev-tools ];
+    buildInputs = [ hicolor-icon-theme ];
+    configureFlags = [ "--enable-maintainer-mode" ];
+
+    src = fetchgit {
+      url = "git://git.xfce.org/${category}/${pname}";
+      inherit rev sha256;
+    };
+
+    enableParallelBuilding = true;
+    outputs = [ "out" "dev" ];
+
+    meta = with stdenv.lib; {
+      homepage = "https://git.xfce.org/${category}/${pname}/about";
+      license = licenses.gpl2; # some libraries are under LGPLv2+
+      platforms = platforms.linux;
+    };
+  };
+
+  publicArgs = removeAttrs args [ "category" "pname" "sha256" ];
+in
+
+stdenv.mkDerivation (recursiveUpdate template publicArgs // concatAttrLists [ template args ])
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/mousepad/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/mousepad/default.nix
new file mode 100644
index 000000000000..b5fd3a19d060
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/mousepad/default.nix
@@ -0,0 +1,12 @@
+{ mkXfceDerivation, exo, wrapGAppsHook, dbus-glib, gtk3, gtksourceview3 }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "mousepad";
+  version = "0.4.1";
+
+  sha256 = "0pr1w9n0qq2raxhy78982i9g17x0ya02q7vdrn0wb2bpk74hlki5";
+
+  nativeBuildInputs = [ exo wrapGAppsHook ];
+  buildInputs = [ dbus-glib gtk3 gtksourceview3 ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/orage/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/orage/default.nix
new file mode 100644
index 000000000000..3c8395a49088
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/orage/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchpatch, mkXfceDerivation, dbus-glib, gtk2, libical, libnotify, tzdata
+, popt, libxfce4ui ? null, xfce4-panel ? null, withPanelPlugin ? true }:
+
+assert withPanelPlugin -> libxfce4ui != null && xfce4-panel != null;
+
+let
+  inherit (lib) optionals;
+in
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "orage";
+  version = "4.12.1";
+
+  sha256 = "04z6y1vfaz1im1zq1zr7cf8pjibjhj9zkyanbp7vn30q520yxa0m";
+  buildInputs = [ dbus-glib gtk2 libical libnotify popt ]
+    ++ optionals withPanelPlugin [ libxfce4ui xfce4-panel ];
+
+  postPatch = ''
+    substituteInPlace src/parameters.c        --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
+    substituteInPlace src/tz_zoneinfo_read.c  --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
+    substituteInPlace tz_convert/tz_convert.c --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo"
+  '';
+
+  postConfigure = "rm -rf libical"; # ensure pkgs.libical is used instead of one included in the orage sources
+
+  patches = [
+    # Fix build with libical 3.0
+    (fetchpatch {
+      name = "fix-libical3.patch";
+      url = https://git.archlinux.org/svntogit/packages.git/plain/trunk/libical3.patch?h=packages/orage&id=7b1b06c42dda034d538977b9f3550b28e370057f;
+      sha256 = "1l8s106mcidmbx2p8c2pi8v9ngbv2x3fsgv36j8qk8wyd4qd1jbf";
+    })
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/parole/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/parole/default.nix
new file mode 100644
index 000000000000..e720791f1c47
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/parole/default.nix
@@ -0,0 +1,36 @@
+{ mkXfceDerivation, makeWrapper, wrapGAppsHook, dbus, dbus-glib
+, gst-plugins-bad ? null, gst-plugins-base, gst-plugins-good
+, gst-plugins-ugly ? null, gtk3, libnotify, libxfce4ui, libxfce4util
+, taglib ? null, xfconf }:
+
+# Doesn't seem to find H.264 codec even though built with gst-plugins-bad.
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "parole";
+  version = "1.0.1";
+
+  sha256 = "0zq1imbjqmwfk3yrsha2s7lclzbh8xgggz0rbksa51siqk73swbb";
+
+  postPatch = ''
+    substituteInPlace src/plugins/mpris2/Makefile.am \
+      --replace GST_BASE_CFLAGS GST_VIDEO_CFLAGS
+  '';
+
+  nativeBuildInputs = [ makeWrapper wrapGAppsHook ];
+
+  buildInputs = [
+    dbus
+    dbus-glib
+    gst-plugins-bad
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gtk3
+    libnotify
+    libxfce4ui
+    libxfce4util
+    taglib
+    xfconf
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/ristretto/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/ristretto/default.nix
new file mode 100644
index 000000000000..b4b0778e9824
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/ristretto/default.nix
@@ -0,0 +1,18 @@
+{ mkXfceDerivation, automakeAddFlags, exo, dbus-glib, gtk2, libexif
+, libxfce4ui, libxfce4util, xfconf }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "ristretto";
+  version = "0.8.3";
+
+  postPatch = ''
+    automakeAddFlags src/Makefile.am ristretto_CFLAGS DBUS_GLIB_CFLAGS
+    automakeAddFlags src/Makefile.am ristretto_LDADD DBUS_GLIB_LIBS
+  '';
+
+  nativeBuildInputs = [ automakeAddFlags exo ];
+  buildInputs = [ dbus-glib gtk2 libexif libxfce4ui libxfce4util xfconf ];
+
+  sha256 = "02i61ddzpv0qjwahkksnzla57zdmkywyg1qrqs57z4bzj6l4nmkx";
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/thunar-volman/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/thunar-volman/default.nix
new file mode 100644
index 000000000000..0055d0d82179
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/thunar-volman/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, exo, gtk3, libgudev, libxfce4ui, libxfce4util, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "thunar-volman";
+  version = "0.9.0";
+
+  buildInputs = [ exo gtk3 libgudev libxfce4ui libxfce4util xfconf ];
+
+  sha256 = "08aqbp3i0z6frj7z3laz9nj641iakrcr7vh2dxb057ky24gj61i7";
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/thunar/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/thunar/default.nix
new file mode 100644
index 000000000000..dbeb80ac9bd2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/thunar/default.nix
@@ -0,0 +1,30 @@
+{ mkXfceDerivation, docbook_xsl, exo, gdk_pixbuf, gtk3, libgudev ? null
+, libnotify ? null, libX11, libxfce4ui, libxfce4util, libxslt, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "thunar";
+  version = "1.8.1";
+
+  sha256 = "00n5iinhg3xgzj2rcy7zl6g9449i59x2l09cnlkhyrjzghb4k5ha";
+
+  postPatch = ''
+    substituteInPlace docs/Makefile.am \
+      --replace http://docbook.sourceforge.net/release/xsl/current \
+                ${docbook_xsl}/share/xml/docbook-xsl
+  '';
+
+  nativeBuildInputs = [ libxslt ];
+
+  buildInputs = [
+    exo
+    gdk_pixbuf
+    gtk3
+    libgudev
+    libnotify
+    libX11
+    libxfce4ui
+    libxfce4util
+    xfconf
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/tumbler/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/tumbler/default.nix
new file mode 100644
index 000000000000..05a4f4ecde3c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/tumbler/default.nix
@@ -0,0 +1,14 @@
+{ mkXfceDerivation, gdk_pixbuf ? null, ffmpegthumbnailer ? null, libgsf ? null
+, poppler ? null }:
+
+# TODO: add libopenraw
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "tumbler";
+  version = "0.2.3";
+
+  sha256 = "1gb4dav6q9bn64c2ayi4896cr79lb8k63ja2sm3lwsjxgg1r4hw9";
+
+  buildInputs = [ gdk_pixbuf ffmpegthumbnailer libgsf poppler ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfburn/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfburn/default.nix
new file mode 100644
index 000000000000..b8a61f6cf90c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfburn/default.nix
@@ -0,0 +1,18 @@
+{ mkXfceDerivation, docbook_xsl, exo, gtk2, libburn, libisofs, libxfce4ui, libxslt }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfburn";
+  version = "0.5.5";
+
+  postPatch = ''
+    substituteInPlace docs/Makefile.am \
+      --replace http://docbook.sourceforge.net/release/xsl/current \
+                ${docbook_xsl}/share/xml/docbook-xsl
+  '';
+
+  sha256 = "1lmv48vqrlap1a2ha72g16vqly18zvcwj8y3f3f00l10pmn52bkp";
+
+  nativeBuildInputs = [ libxslt ];
+  buildInputs = [ exo gtk2 libburn libisofs libxfce4ui ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-appfinder/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-appfinder/default.nix
new file mode 100644
index 000000000000..65941fee4c4a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-appfinder/default.nix
@@ -0,0 +1,12 @@
+{ mkXfceDerivation, exo, garcon, gtk3, libxfce4util, libxfce4ui, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfce4-appfinder";
+  version = "4.13.0";
+
+  sha256 = "13xsshzw04gx5rhalx4r0khjb0dbq26fv6n20biyiai1ykznyryy";
+
+  nativeBuildInputs = [ exo ];
+  buildInputs = [ garcon gtk3 libxfce4ui libxfce4util xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-battery-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-battery-plugin/default.nix
new file mode 100644
index 000000000000..b4b5ff7b7148
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-battery-plugin/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, gtk3, libxfce4ui, libxfce4util, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-battery-plugin";
+  version = "1.1.0";
+  rev = version;
+  sha256 = "0mz0lj3wjrsj9n4wcqrvv08430g38nkjbdimxdy8316n6bqgngfn";
+
+  buildInputs = [ gtk3 libxfce4ui libxfce4util xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-clipman-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-clipman-plugin/default.nix
new file mode 100644
index 000000000000..28f63a6769d7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-clipman-plugin/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, gtk3, libXtst, libxfce4ui, libxfce4util, xfce4-panel, xfconf, exo }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-clipman-plugin";
+  version = "1.4.2";
+  rev = version;
+  sha256 = "1c2h1cs7pycf1rhpirmvb0l0dfvlacb7xgm31q9rxmhihnycd2na";
+
+  buildInputs = [ exo gtk3 libXtst libxfce4ui libxfce4util xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-cpufreq-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-cpufreq-plugin/default.nix
new file mode 100644
index 000000000000..e17204c0cd55
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-cpufreq-plugin/default.nix
@@ -0,0 +1,10 @@
+{ mkXfceDerivation, gtk3, libxfce4ui, libxfce4util, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-cpufreq-plugin";
+  version = "1.2.0";
+  sha256 = "0zhs7b7py1njczmpnib4532fwpnd3vnpqfhss2r136cfgy72kp6g";
+
+  buildInputs = [ gtk3 libxfce4ui libxfce4util xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/default.nix
new file mode 100644
index 000000000000..9dedb8674dc2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/default.nix
@@ -0,0 +1,32 @@
+{ mkXfceDerivation, autoreconfHook, autoconf, automake
+, glib, gtk-doc, intltool, libtool }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfce4-dev-tools";
+  version = "4.12.0";
+
+  sha256 = "0bbmlmw2dpm10q2wv3vy592i0vx7b5h1qnd35j0fdzxqb8x2hbw2";
+
+  nativeBuildInputs = [ autoreconfHook ];
+
+  propagatedBuildInputs = [
+    autoconf
+    automake
+    glib
+    gtk-doc
+    intltool
+    libtool
+  ];
+
+  preAutoreconf = ''
+    substitute configure.ac.in configure.ac \
+      --subst-var-by REVISION UNKNOWN
+  '';
+
+  setupHook = ./setup-hook.sh;
+
+  meta = {
+    description = "Autoconf macros and scripts to augment app build systems";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/setup-hook.sh b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/setup-hook.sh
new file mode 100644
index 000000000000..600bf47fd872
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dev-tools/setup-hook.sh
@@ -0,0 +1,12 @@
+xdtEnvHook() {
+    addToSearchPath ACLOCAL_PATH $1/share/xfce4/dev-tools/m4macros
+}
+
+envHooks+=(xdtEnvHook)
+
+xdtAutogenPhase() {
+    mkdir -p m4
+    NOCONFIGURE=1 xdt-autogen
+}
+
+preConfigurePhases+=(xdtAutogenPhase)
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/configure-gio.patch b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/configure-gio.patch
new file mode 100644
index 000000000000..787b63511a23
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/configure-gio.patch
@@ -0,0 +1,11 @@
+diff -urNZ a/configure.ac.in b/configure.ac.in
+--- a/configure.ac.in	2017-12-16 19:46:13.784914017 +0000
++++ b/configure.ac.in	2017-12-16 19:46:38.612477052 +0000
+@@ -53,6 +53,7 @@
+ dnl ***********************************
+ dnl *** Check for required packages ***
+ dnl ***********************************
++XDT_CHECK_PACKAGE([GIO], [gio-unix-2.0], [2.32.0])
+ XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.24.0])
+ XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.20.0])
+ XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2], [4.12.0])
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/default.nix
new file mode 100644
index 000000000000..1236b60175d0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-dict/default.nix
@@ -0,0 +1,19 @@
+{ mkXfceDerivation, automakeAddFlags, gtk3, libxfce4ui, libxfce4util, xfce4-panel }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-dict";
+  version = "0.8.1";
+
+  sha256 = "0kxirzqmpp7qlr8220i8kipz4bgzkam7h1lpx7yzld5xf7wdzvaf";
+
+  patches = [ ./configure-gio.patch ];
+
+  nativeBuildInputs = [ automakeAddFlags ];
+
+  postPatch = ''
+    automakeAddFlags lib/Makefile.am libdict_la_CFLAGS GIO_CFLAGS
+  '';
+
+  buildInputs = [ gtk3 libxfce4ui libxfce4util xfce4-panel ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-mixer/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-mixer/default.nix
new file mode 100644
index 000000000000..a4bc0a3eaddb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-mixer/default.nix
@@ -0,0 +1,32 @@
+{ mkXfceDerivation, automakeAddFlags, dbus-glib, gtk2, libxfce4ui, libxfce4util, xfce4-panel, xfconf, gst-plugins-base, libunique }:
+
+let
+  gst_plugins_minimal = gst-plugins-base.override {
+    minimalDeps = true;
+  };
+in
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-mixer";
+  version = "4.11.0";
+
+  sha256 = "1kiz5ysn4rqkjfzz4dvbsfj64kqqayg7bqakcys3rw28g2q5qyys";
+
+  nativeBuildInputs = [ automakeAddFlags ];
+
+  postPatch = ''
+    automakeAddFlags panel-plugin/Makefile.am libmixer_la_CFLAGS DBUS_GLIB_CFLAGS
+    automakeAddFlags xfce4-mixer/Makefile.am xfce4_mixer_CFLAGS DBUS_GLIB_CFLAGS
+  '';
+
+  buildInputs = [
+    dbus-glib
+    gst_plugins_minimal
+    gtk2
+    libunique
+    libxfce4ui
+    libxfce4util
+    xfce4-panel
+    xfconf
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-netload-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-netload-plugin/default.nix
new file mode 100644
index 000000000000..d9f517981d3e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-netload-plugin/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, gtk3, libxfce4ui, libxfce4util, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-netload-plugin";
+  version = "1.3.1";
+  rev = "version-${version}";
+  sha256 = "0nm8advafw4jpc9p1qszyfqa56194sz51z216rdh4c6ilcrrpy1h";
+
+  buildInputs = [ gtk3 libxfce4ui libxfce4util xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-notifyd/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-notifyd/default.nix
new file mode 100644
index 000000000000..bac258785079
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-notifyd/default.nix
@@ -0,0 +1,12 @@
+{ mkXfceDerivation, dbus-glib, exo, gtk3, libnotify, libxfce4ui, libxfce4util
+, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-notifyd";
+  version = "0.4.2";
+
+  sha256 = "1zxwzigrhms74crasbqpnzidmq2mnyxpmc9pqr4p4qj14yw4sam9";
+
+  buildInputs = [ dbus-glib exo gtk3 libnotify libxfce4ui libxfce4util xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-panel/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-panel/default.nix
new file mode 100644
index 000000000000..27c8e1e58c71
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-panel/default.nix
@@ -0,0 +1,36 @@
+{ mkXfceDerivation, makeWrapper, tzdata, exo, garcon, gtk2, gtk3, gettext, glib-networking, libxfce4ui, libxfce4util, libwnck3, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfce4-panel";
+  version = "4.13.4";
+
+  sha256 = "13hnzh31d2b1331lnsbfaxg4fqhqa7hmdwkiqsl9hyr8pqimjb2g";
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ exo garcon gtk2 gtk3 libxfce4ui libxfce4util libwnck3 xfconf ];
+
+  patches = [ ../../xfce/core/xfce4-panel-datadir.patch ];
+  patchFlags = "-p1";
+
+  postPatch = ''
+    for f in $(find . -name \*.sh); do
+      substituteInPlace $f --replace gettext ${gettext}/bin/gettext
+    done
+    substituteInPlace plugins/clock/clock.c \
+       --replace "/usr/share/zoneinfo" "${tzdata}/share/zoneinfo" \
+       --replace "if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK))" ""
+  '';
+
+  configureFlags = [ "--enable-gtk3" ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/xfce4-panel" \
+      --prefix GST_PLUGIN_SYSTEM_PATH : "$GST_PLUGIN_SYSTEM_PATH" \
+      --prefix GIO_EXTRA_MODULES : "${glib-networking}/lib/gio/modules"
+  '';
+
+  meta =  {
+    description = "Xfce's panel";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-power-manager/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-power-manager/default.nix
new file mode 100644
index 000000000000..5389af668820
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-power-manager/default.nix
@@ -0,0 +1,19 @@
+{ mkXfceDerivation, automakeAddFlags, exo, gtk3, libnotify
+, libxfce4ui, libxfce4util, upower, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfce4-power-manager";
+  version = "1.6.1";
+
+  sha256 = "0b32m46v3dv1ln3xwlpqbnpflknm4gyfk2w6gn7xjx1k7igcjym3";
+
+  nativeBuildInputs = [ automakeAddFlags exo ];
+  buildInputs = [ gtk3 libnotify libxfce4ui libxfce4util upower xfconf ];
+
+  postPatch = ''
+    substituteInPlace configure.ac.in --replace gio-2.0 gio-unix-2.0
+    automakeAddFlags src/Makefile.am xfce4_power_manager_CFLAGS GIO_CFLAGS
+    automakeAddFlags settings/Makefile.am xfce4_power_manager_settings_CFLAGS GIO_CFLAGS
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-pulseaudio-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-pulseaudio-plugin/default.nix
new file mode 100644
index 000000000000..185494c25439
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-pulseaudio-plugin/default.nix
@@ -0,0 +1,19 @@
+{ mkXfceDerivation, automakeAddFlags, dbus-glib, dbus, gtk3, libpulseaudio
+, libnotify, libxfce4ui, libxfce4util, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-pulseaudio-plugin";
+  version = "0.4.1";
+  sha256 = "1c8krpg3l6ki00ldd9hifc4bddysdm0w3x5w43fkr31j0zrscvfp";
+
+  nativeBuildInputs = [ automakeAddFlags ];
+
+  NIX_CFLAGS_COMPILE = [ "-I${dbus-glib.dev}/include/dbus-1.0" "-I${dbus.dev}/include/dbus-1.0" ];
+
+  postPatch = ''
+    substituteInPlace configure.ac.in --replace gio-2.0 gio-unix-2.0
+  '';
+
+  buildInputs = [ gtk3 libnotify libpulseaudio libxfce4ui libxfce4util xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-screenshooter/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-screenshooter/default.nix
new file mode 100644
index 000000000000..0dfad21d07ba
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-screenshooter/default.nix
@@ -0,0 +1,12 @@
+{ mkXfceDerivation, exo, gtk3, libsoup, libxfce4ui, libxfce4util, xfce4-panel, wrapGAppsHook, glib-networking }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-screenshooter";
+  version = "1.9.2";
+
+  sha256 = "1zl16xcmgrb1s6rsrn37mpl5w522i1i9s7x167xf2d092x333yx2";
+
+  nativeBuildInputs = [ wrapGAppsHook ]; # fix "No GSettings schemas are installed on the system"
+  buildInputs = [ exo gtk3 libsoup libxfce4ui libxfce4util xfce4-panel glib-networking ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-session/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-session/default.nix
new file mode 100644
index 000000000000..ecf1f6ac505e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-session/default.nix
@@ -0,0 +1,27 @@
+{ mkXfceDerivation, polkit, exo, libxfce4util, libxfce4ui, xfconf, dbus-glib, dbus, iceauth, gtk3, libwnck3, xorg }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfce4-session";
+  version = "4.13.0";
+
+  sha256 = "0d6h1kgqq6g084jrxx4jxw98h5g0vwsxqrvk0bmapyxh2sbrg07y";
+
+  buildInputs = [ exo dbus-glib dbus gtk3 libxfce4ui libxfce4util libwnck3 xfconf polkit iceauth ];
+
+  configureFlags = [ "--with-xsession-prefix=$(out)" ];
+
+  NIX_CFLAGS_COMPILE = [ "-I${dbus-glib.dev}/include/dbus-1.0"
+                         "-I${dbus.dev}/include/dbus-1.0"
+                         "-I${dbus.lib}/lib/dbus-1.0/include"
+                       ];
+
+  postPatch = ''
+    substituteInPlace configure.ac.in --replace gio-2.0 gio-unix-2.0
+    substituteInPlace scripts/xflock4 --replace PATH=/bin:/usr/bin "PATH=\$PATH:$out/bin:${xorg.xset}/bin"
+  '';
+
+  meta =  {
+    description = "Session manager for Xfce";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-settings/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-settings/default.nix
new file mode 100644
index 000000000000..6eb917fd76fd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-settings/default.nix
@@ -0,0 +1,38 @@
+{ mkXfceDerivation, automakeAddFlags, exo, garcon, gtk3
+, libnotify ? null, libxfce4ui, libxfce4util, libxklavier ? null
+, upower ? null, xfconf, xf86inputlibinput ? null }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfce4-settings";
+  version = "4.13.4";
+
+  sha256 = "0qnnpvcs2hpfq3n4byjwq343p95i9xw96rq7ym4md4mahnk176dy";
+
+  postPatch = ''
+    automakeAddFlags xfce4-settings-editor/Makefile.am xfce4_settings_editor_CFLAGS DBUS_GLIB_CFLAGS
+    for f in $(find . -name \*.c); do
+      substituteInPlace $f --replace \"libinput-properties.h\" '<xorg/libinput-properties.h>'
+    done
+  '';
+
+  nativeBuildInputs = [ automakeAddFlags ];
+
+  buildInputs = [
+    exo
+    garcon
+    gtk3
+    libnotify
+    libxfce4ui
+    libxfce4util
+    libxklavier
+    upower
+    xfconf
+    xf86inputlibinput
+  ];
+
+  configureFlags = [
+    "--enable-pluggable-dialogs"
+    "--enable-sound-settings"
+  ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-taskmanager/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-taskmanager/default.nix
new file mode 100644
index 000000000000..d9a5991598bc
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-taskmanager/default.nix
@@ -0,0 +1,18 @@
+{ lib, mkXfceDerivation, exo, gtk2, gtk3 ? null, libwnck3 ? null, libXmu }:
+
+let
+  inherit (lib) enableFeature;
+in
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-taskmanager";
+  version = "1.2.1";
+
+  sha256 = "1p0496r1fb5zqvn6c41kb6rjqwlqghqahgg6hkzw0gjy911im99w";
+
+  nativeBuildInputs = [ exo ];
+  buildInputs = [ gtk2 gtk3 libwnck3 libXmu ];
+
+  configureFlags = [ (enableFeature (gtk3 != null) "gtk3") ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-terminal/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-terminal/default.nix
new file mode 100644
index 000000000000..6bc88ee76611
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-terminal/default.nix
@@ -0,0 +1,16 @@
+{ mkXfceDerivation, gtk3, libxfce4ui, wrapGAppsHook, vte }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-terminal";
+  version = "0.8.7.4";
+
+  sha256 = "1s1dq560icg602jjb2ja58x7hxg4ikp3jrrf74v3qgi0ir950k2y";
+
+  buildInputs = [ gtk3 libxfce4ui vte ];
+  nativeBuildInputs = [ wrapGAppsHook ];
+
+  meta = {
+    description = "A modern terminal emulator";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-volumed-pulse/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-volumed-pulse/default.nix
new file mode 100644
index 000000000000..626451c70d63
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-volumed-pulse/default.nix
@@ -0,0 +1,15 @@
+{ lib, mkXfceDerivation, gtk3, libnotify ? null, libpulseaudio, keybinder3, xfconf }:
+
+mkXfceDerivation rec {
+  category = "apps";
+  pname = "xfce4-volumed-pulse";
+  version = "0.2.3";
+
+  sha256 = "1rsjng9qmq7vzrx5bfxq76h63y501cfl1mksrxkf1x39by9r628j";
+
+  buildInputs = [ gtk3 libnotify libpulseaudio keybinder3 xfconf ];
+
+  meta = with lib; {
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-whiskermenu-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-whiskermenu-plugin/default.nix
new file mode 100644
index 000000000000..41a1ef82932b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-whiskermenu-plugin/default.nix
@@ -0,0 +1,18 @@
+{ mkXfceDerivation, dbus-glib, gtk3, cmake, exo, garcon, libxfce4ui, libxfce4util, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-whiskermenu-plugin";
+  version = "2.2.0";
+  rev = "v${version}";
+  sha256 = "1d35xxkdzw8pl3d5ps226mmrrjk0hqczsbvl5smh7l7jbwfambjm";
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ dbus-glib exo garcon gtk3 libxfce4ui libxfce4util xfce4-panel xfconf ];
+
+  postInstall = ''
+    substituteInPlace $out/bin/xfce4-popup-whiskermenu \
+      --replace $out/bin/xfce4-panel ${xfce4-panel.out}/bin/xfce4-panel
+  '';
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfce4-xkb-plugin/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-xkb-plugin/default.nix
new file mode 100644
index 000000000000..a024d3a88ba0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfce4-xkb-plugin/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, gtk3, librsvg, libwnck3, libxklavier, garcon, libxfce4ui, libxfce4util, xfce4-panel, xfconf }:
+
+mkXfceDerivation rec {
+  category = "panel-plugins";
+  pname = "xfce4-xkb-plugin";
+  version = "0.8.1";
+  rev = version;
+  sha256 = "1gyky4raynp2ggdnq0g96c6646fjm679fzipcsmf1q0aymr8d5ky";
+
+  buildInputs = [ garcon gtk3 librsvg libxfce4ui libxfce4util libxklavier libwnck3 xfce4-panel xfconf ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfconf/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfconf/default.nix
new file mode 100644
index 000000000000..def60bcfe21c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfconf/default.nix
@@ -0,0 +1,11 @@
+{ mkXfceDerivation, libxfce4util }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfconf";
+  version = "4.13.5";
+
+  sha256 = "0xpnwb04yw5qdn0bj8b740a7rmiy316vhja5pp8p6sdiqm32yi8a";
+
+  buildInputs = [ libxfce4util ];
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfdesktop/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfdesktop/default.nix
new file mode 100644
index 000000000000..0209b7913602
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfdesktop/default.nix
@@ -0,0 +1,22 @@
+{ mkXfceDerivation, exo, gtk3, libxfce4ui, libxfce4util, libwnck3, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfdesktop";
+  version = "4.13.2";
+
+  sha256 = "0v6dlhraqh9v20qciyj03cbjmg3jb6gvmf0hqzavxqi2di3mv5fl";
+
+  buildInputs = [
+    exo
+    gtk3
+    libxfce4ui
+    libxfce4util
+    libwnck3
+    xfconf
+  ];
+
+  meta = {
+    description = "Xfce's desktop manager";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/xfce4-13/xfwm4/default.nix b/nixpkgs/pkgs/desktops/xfce4-13/xfwm4/default.nix
new file mode 100644
index 000000000000..97d414d66932
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/xfce4-13/xfwm4/default.nix
@@ -0,0 +1,26 @@
+{ mkXfceDerivation, exo, dbus-glib, epoxy, gtk2, libXdamage
+, libstartup_notification, libxfce4ui, libxfce4util, libwnck
+, libXpresent, xfconf }:
+
+mkXfceDerivation rec {
+  category = "xfce";
+  pname = "xfwm4";
+  version = "4.13.0";
+
+  sha256 = "19ikyls4xawsbz07qdz60g5yl2jbvpb90sfy5zql7ghypd69cgn9";
+
+  nativeBuildInputs = [ exo ];
+
+  buildInputs = [
+    dbus-glib
+    epoxy
+    gtk2
+    libXdamage
+    libstartup_notification
+    libxfce4ui
+    libxfce4util
+    libwnck
+    libXpresent
+    xfconf
+  ];
+}