summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorworldofpeace <worldofpeace@users.noreply.github.com>2018-08-20 16:31:18 -0400
committerworldofpeace <worldofpeace@users.noreply.github.com>2019-01-24 20:54:14 +0000
commit78da8d668b51b10d12285483a661307e1d3052eb (patch)
treef24edb95d698d3c240dd1359a0957ec776b94912 /pkgs
parent2530372351fb7c65df1e209356c5eabf5a66fa9e (diff)
downloadnixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.tar
nixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.tar.gz
nixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.tar.bz2
nixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.tar.lz
nixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.tar.xz
nixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.tar.zst
nixpkgs-78da8d668b51b10d12285483a661307e1d3052eb.zip
pantheon: init a 5.0
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/applications/audio/vocal/default.nix8
-rw-r--r--pkgs/applications/editors/quilter/default.nix12
-rw-r--r--pkgs/applications/misc/notejot/default.nix10
-rw-r--r--pkgs/applications/misc/regextester/default.nix18
-rw-r--r--pkgs/applications/misc/sequeler/default.nix8
-rw-r--r--pkgs/applications/misc/tootle/default.nix9
-rw-r--r--pkgs/applications/networking/ftp/taxi/default.nix6
-rw-r--r--pkgs/applications/networking/transporter/default.nix20
-rw-r--r--pkgs/applications/networking/weather/meteo/default.nix2
-rw-r--r--pkgs/applications/office/aesop/default.nix8
-rw-r--r--pkgs/applications/office/bookworm/default.nix12
-rw-r--r--pkgs/applications/office/spice-up/default.nix17
-rw-r--r--pkgs/applications/science/math/nasc/default.nix14
-rw-r--r--pkgs/data/icons/faba-icon-theme/default.nix4
-rw-r--r--pkgs/desktops/deepin/deepin-wm/default.nix4
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-calculator/default.nix58
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-calendar/default.nix66
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-camera/default.nix64
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-code/default.nix80
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-files/default.nix77
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch22
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-music/default.nix78
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-photos/default.nix80
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix67
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix28
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-terminal/default.nix66
-rw-r--r--pkgs/desktops/pantheon/apps/elementary-videos/default.nix64
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix45
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix54
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch13
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch55
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix45
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix47
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch12
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix55
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch13
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix45
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix57
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch22
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix45
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix55
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch43
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix45
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix56
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch26
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix63
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch23
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix64
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch13
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch20
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix47
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix62
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch36
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix45
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix49
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard/default.nix56
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch25
-rw-r--r--pkgs/desktops/pantheon/apps/switchboard/wrapper.nix19
-rw-r--r--pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix35
-rw-r--r--pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix55
-rw-r--r--pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix36
-rw-r--r--pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix38
-rw-r--r--pkgs/desktops/pantheon/default.nix222
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch25
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix60
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist6
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem2
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch25
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix103
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch13
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch13
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix44
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix39
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop8
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix107
-rw-r--r--pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix50
-rw-r--r--pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix39
-rw-r--r--pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch34
-rw-r--r--pkgs/desktops/pantheon/desktop/gala/default.nix66
-rw-r--r--pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch22
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch24
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix72
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch13
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix56
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch13
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix71
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix57
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch26
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix50
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix49
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix48
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix57
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix49
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix59
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel/default.nix61
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch21
-rw-r--r--pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix23
-rw-r--r--pkgs/desktops/pantheon/granite/02-datetime-clock-format-gsettings.patch (renamed from pkgs/development/libraries/granite/02-datetime-clock-format-gsettings.patch)0
-rw-r--r--pkgs/desktops/pantheon/granite/default.nix (renamed from pkgs/development/libraries/granite/default.nix)14
-rw-r--r--pkgs/desktops/pantheon/services/cerbere/default.nix48
-rw-r--r--pkgs/desktops/pantheon/services/contractor/default.nix45
-rw-r--r--pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix58
-rw-r--r--pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch13
-rw-r--r--pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix57
-rw-r--r--pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix117
-rw-r--r--pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch15
-rw-r--r--pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix49
-rw-r--r--pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix43
-rw-r--r--pkgs/desktops/pantheon/update.nix18
-rwxr-xr-xpkgs/desktops/pantheon/update.sh223
-rw-r--r--pkgs/tools/misc/hashit/default.nix10
-rw-r--r--pkgs/top-level/all-packages.nix3
119 files changed, 4585 insertions, 90 deletions
diff --git a/pkgs/applications/audio/vocal/default.nix b/pkgs/applications/audio/vocal/default.nix
index 75f67adf464..49e11aee0a1 100644
--- a/pkgs/applications/audio/vocal/default.nix
+++ b/pkgs/applications/audio/vocal/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, ninja, pkgconfig, vala_0_40, gtk3, libxml2, granite, webkitgtk, clutter-gtk
+{ stdenv, fetchFromGitHub, cmake, ninja, pkgconfig, pantheon, gtk3, libxml2, webkitgtk, clutter-gtk
 , clutter-gst, libunity, libnotify, sqlite, gst_all_1, libsoup, json-glib, gnome3, gobject-introspection, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
@@ -20,16 +20,16 @@ stdenv.mkDerivation rec {
     libxml2
     ninja
     pkgconfig
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
 
   buildInputs = with gst_all_1; [
     clutter-gst
     clutter-gtk
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
     gnome3.libgee
-    granite
+    pantheon.granite
     gst-plugins-base
     gst-plugins-good
     gstreamer
diff --git a/pkgs/applications/editors/quilter/default.nix b/pkgs/applications/editors/quilter/default.nix
index b9fe90be9fb..9edac16507c 100644
--- a/pkgs/applications/editors/quilter/default.nix
+++ b/pkgs/applications/editors/quilter/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchFromGitHub, fetchpatch, vala_0_40, pkgconfig, meson, ninja, python3
-, granite, gtk3, desktop-file-utils, gnome3, gtksourceview, webkitgtk, gtkspell3
-, discount, gobject-introspection, wrapGAppsHook }:
+{ stdenv, fetchFromGitHub, fetchpatch, pkgconfig, meson, ninja, python3
+, gtk3, desktop-file-utils, gtksourceview, webkitgtk, gtkspell3, pantheon
+, gnome3, discount, gobject-introspection, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
   pname = "quilter";
@@ -22,15 +22,15 @@ stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
 
   buildInputs = [
     discount
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
+    pantheon.granite
     gnome3.libgee
-    granite
     gtk3
     gtksourceview
     gtkspell3
diff --git a/pkgs/applications/misc/notejot/default.nix b/pkgs/applications/misc/notejot/default.nix
index 9e2f4bf7f2e..74e1c679ec3 100644
--- a/pkgs/applications/misc/notejot/default.nix
+++ b/pkgs/applications/misc/notejot/default.nix
@@ -1,5 +1,5 @@
-{ stdenv, fetchFromGitHub, vala_0_40, pkgconfig, meson, ninja, python3, granite
-, gtk3, gnome3, gtksourceview, json-glib, gobject-introspection, wrapGAppsHook }:
+{ stdenv, fetchFromGitHub, pkgconfig, meson, ninja, python3, pantheon
+, gtk3, gtksourceview, json-glib, gnome3, gobject-introspection, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
   pname = "notejot";
@@ -20,14 +20,14 @@ stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
 
   buildInputs = [
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
+    pantheon.granite
     gnome3.libgee
-    granite
     gtk3
     gtksourceview
     json-glib
diff --git a/pkgs/applications/misc/regextester/default.nix b/pkgs/applications/misc/regextester/default.nix
index 2b902d27a35..703d7862124 100644
--- a/pkgs/applications/misc/regextester/default.nix
+++ b/pkgs/applications/misc/regextester/default.nix
@@ -4,14 +4,13 @@
 , libxml2
 , pkgconfig
 , glib
-, granite
 , gtk3
 , gnome3
 , meson
 , ninja
 , gobject-introspection
 , gsettings-desktop-schemas
-, vala_0_40
+, pantheon
 , wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
@@ -26,22 +25,23 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [
-    pkgconfig
-    meson
-    ninja
+    pantheon.vala
     gettext
     gobject-introspection
     libxml2
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    meson
+    ninja
+    pkgconfig
     wrapGAppsHook
   ];
+
   buildInputs = [
+    pantheon.elementary-icon-theme
+    pantheon.granite
     glib
-    granite
-    gtk3
-    gnome3.defaultIconTheme
     gnome3.libgee
     gsettings-desktop-schemas
+    gtk3
   ];
 
   postInstall = ''
diff --git a/pkgs/applications/misc/sequeler/default.nix b/pkgs/applications/misc/sequeler/default.nix
index 72a1465a2c8..96049b395ea 100644
--- a/pkgs/applications/misc/sequeler/default.nix
+++ b/pkgs/applications/misc/sequeler/default.nix
@@ -1,6 +1,6 @@
 { stdenv, fetchFromGitHub
-, meson, ninja, pkgconfig, vala, gobject-introspection, gettext, wrapGAppsHook, python3, desktop-file-utils
-, gtk3, glib, granite, libgee, libgda, gtksourceview, libxml2, libsecret, libfixposix, libssh2 }:
+, meson, ninja, pkgconfig, pantheon, gobject-introspection, gettext, wrapGAppsHook, python3, desktop-file-utils
+, gtk3, glib, libgee, libgda, gtksourceview, libxml2, libsecret, libfixposix, libssh2 }:
 
 
 let
@@ -20,9 +20,9 @@ in stdenv.mkDerivation rec {
     sha256 = "0sxmky27pl0aqnh857xb54rnfg1kbr2smdzyrzw67cbv00f6d30p";
   };
 
-  nativeBuildInputs = [ meson ninja pkgconfig vala gobject-introspection gettext wrapGAppsHook python3 desktop-file-utils ];
+  nativeBuildInputs = [ meson ninja pkgconfig pantheon.vala gobject-introspection gettext wrapGAppsHook python3 desktop-file-utils ];
 
-  buildInputs = [ gtk3 glib granite libgee sqlGda gtksourceview libxml2 libsecret libfixposix libssh2 ];
+  buildInputs = [ gtk3 glib pantheon.granite libgee sqlGda gtksourceview libxml2 libsecret libfixposix libssh2 ];
 
   postPatch = ''
     chmod +x build-aux/meson_post_install.py
diff --git a/pkgs/applications/misc/tootle/default.nix b/pkgs/applications/misc/tootle/default.nix
index c295a8fdb68..5a856a5f2b2 100644
--- a/pkgs/applications/misc/tootle/default.nix
+++ b/pkgs/applications/misc/tootle/default.nix
@@ -1,8 +1,7 @@
 { stdenv, fetchFromGitHub
 , meson, ninja, pkgconfig, python3
-, gnome3, vala_0_40, gobject-introspection, wrapGAppsHook
-, gtk3, granite
-, json-glib, glib, glib-networking, hicolor-icon-theme
+, gnome3, pantheon, gobject-introspection, wrapGAppsHook
+, gtk3, json-glib, glib, glib-networking, hicolor-icon-theme
 }:
 
 let
@@ -24,11 +23,11 @@ in stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
   buildInputs = [
-    gtk3 granite json-glib glib glib-networking hicolor-icon-theme
+    gtk3 pantheon.granite json-glib glib glib-networking hicolor-icon-theme
     gnome3.libgee gnome3.libsoup gnome3.gsettings-desktop-schemas
   ];
 
diff --git a/pkgs/applications/networking/ftp/taxi/default.nix b/pkgs/applications/networking/ftp/taxi/default.nix
index bd17e86d898..9252b95a00c 100644
--- a/pkgs/applications/networking/ftp/taxi/default.nix
+++ b/pkgs/applications/networking/ftp/taxi/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, vala, pkgconfig, meson, ninja, python3, granite
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, python3
 , gtk3, gnome3, libsoup, libsecret, gobject-introspection, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
@@ -15,18 +15,18 @@ stdenv.mkDerivation rec {
   };
 
   nativeBuildInputs = [
+    pantheon.vala
     gobject-introspection
     meson
     ninja
     pkgconfig
     python3
-    vala
     wrapGAppsHook
   ];
 
   buildInputs = [
+    pantheon.granite
     gnome3.libgee
-    granite
     gtk3
     libsecret
     libsoup
diff --git a/pkgs/applications/networking/transporter/default.nix b/pkgs/applications/networking/transporter/default.nix
index c5b329b5f0a..46649c06911 100644
--- a/pkgs/applications/networking/transporter/default.nix
+++ b/pkgs/applications/networking/transporter/default.nix
@@ -3,9 +3,9 @@
 , meson
 , ninja
 , pkgconfig
-, granite
-, vala_0_40
+, gtk3
 , python3
+, pantheon
 , gnome3
 , libxml2
 , gettext
@@ -31,24 +31,22 @@ in stdenv.mkDerivation rec {
   nativeBuildInputs = [
     appstream-glib
     desktop-file-utils
+    pantheon.vala
     gettext
     gobject-introspection # For setup hook
     libxml2
     meson
     ninja
     pkgconfig
-    vala_0_40
     python3
     wrapGAppsHook
   ];
 
-  buildInputs = with gnome3; [
-    defaultIconTheme # If I omit this there's no icons in KDE
-    glib
-    granite
-    gsettings-desktop-schemas
+  buildInputs = [
+    pantheon.elementary-icon-theme
+    gnome3.libgee
+    pantheon.granite
     gtk3
-    libgee
     magic-wormhole
   ];
 
@@ -59,8 +57,8 @@ in stdenv.mkDerivation rec {
   '';
 
   postPatch = ''
-    chmod +x ./meson/post_install.py
-    patchShebangs ./meson/post_install.py
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
   '';
 
   meta = with stdenv.lib; {
diff --git a/pkgs/applications/networking/weather/meteo/default.nix b/pkgs/applications/networking/weather/meteo/default.nix
index 3dba90f964f..149e126d6e8 100644
--- a/pkgs/applications/networking/weather/meteo/default.nix
+++ b/pkgs/applications/networking/weather/meteo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitLab, vala, python3, pkgconfig, meson, ninja, granite, gtk3
+{ stdenv, fetchFromGitLab, vala, python3, pkgconfig, meson, ninja, gtk3
 , gnome3, json-glib, libsoup, clutter, clutter-gtk, libchamplain, webkitgtk
 , libappindicator, desktop-file-utils, appstream, gobject-introspection, wrapGAppsHook }:
 
diff --git a/pkgs/applications/office/aesop/default.nix b/pkgs/applications/office/aesop/default.nix
index 74a56b1f6ca..51e2c55ea7d 100644
--- a/pkgs/applications/office/aesop/default.nix
+++ b/pkgs/applications/office/aesop/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchpatch, vala_0_40, pkgconfig, meson, ninja, python3, granite, gtk3
+{ stdenv, fetchFromGitHub, fetchpatch, pantheon, pkgconfig, meson, ninja, python3, gtk3
 , gnome3, desktop-file-utils, json-glib, libsoup, poppler, gobject-introspection, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
@@ -21,14 +21,14 @@ stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
 
   buildInputs = [
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
     gnome3.libgee
-    granite
+    pantheon.granite
     gtk3
     json-glib
     libsoup
diff --git a/pkgs/applications/office/bookworm/default.nix b/pkgs/applications/office/bookworm/default.nix
index 04b2072967a..63199945f2b 100644
--- a/pkgs/applications/office/bookworm/default.nix
+++ b/pkgs/applications/office/bookworm/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchpatch, vala_0_40, python3, python2, pkgconfig, libxml2, meson, ninja, gtk3, granite, gnome3
+{ stdenv, fetchFromGitHub, fetchpatch, pantheon, python3, python2, pkgconfig, libxml2, meson, ninja, gtk3, gnome3, glib, webkitgtk
 , gobject-introspection, sqlite, poppler, poppler_utils, html2text, curl, gnugrep, coreutils, bash, unzip, unar, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
@@ -20,17 +20,17 @@ stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
 
-  buildInputs = with gnome3; [
+  buildInputs = [
+    pantheon.elementary-icon-theme
+    pantheon.granite
     glib
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
-    granite
+    gnome3.libgee
     gtk3
     html2text
-    libgee
     poppler
     python2
     sqlite
diff --git a/pkgs/applications/office/spice-up/default.nix b/pkgs/applications/office/spice-up/default.nix
index a32ad677c25..c7e39180ae2 100644
--- a/pkgs/applications/office/spice-up/default.nix
+++ b/pkgs/applications/office/spice-up/default.nix
@@ -4,7 +4,6 @@
 , libxml2
 , pkgconfig
 , gtk3
-, granite
 , gnome3
 , gobject-introspection
 , json-glib
@@ -13,7 +12,7 @@
 , libgudev
 , libevdev
 , libsoup
-, vala_0_40
+, pantheon
 , wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
@@ -30,19 +29,19 @@ stdenv.mkDerivation rec {
   USER = "nix-build-user";
 
   nativeBuildInputs = [
-    pkgconfig
-    wrapGAppsHook
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
     cmake
-    ninja
     gettext
-    libxml2
     gobject-introspection # For setup hook
+    libxml2
+    ninja
+    pkgconfig
+    pantheon.vala
+    wrapGAppsHook
   ];
   buildInputs = [
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
+    pantheon.granite
     gnome3.libgee
-    granite
     gtk3
     json-glib
     libevdev
diff --git a/pkgs/applications/science/math/nasc/default.nix b/pkgs/applications/science/math/nasc/default.nix
index 4afaa5194db..fb0ea206735 100644
--- a/pkgs/applications/science/math/nasc/default.nix
+++ b/pkgs/applications/science/math/nasc/default.nix
@@ -1,12 +1,10 @@
 { stdenv
 , fetchFromGitHub
-, fetchpatch
 , pkgconfig
 , gtk3
-, granite
+, pantheon
 , gnome3
 , cmake
-, vala_0_40
 , libqalculate
 , gobject-introspection
 , wrapGAppsHook }:
@@ -28,19 +26,19 @@ stdenv.mkDerivation rec {
   '';
 
   nativeBuildInputs = [
-    pkgconfig
-    wrapGAppsHook
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
     cmake
+    pantheon.vala
     gobject-introspection # for setup-hook
+    pkgconfig
+    wrapGAppsHook
   ];
 
   buildInputs = [
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
     gnome3.gtksourceview
     gnome3.libgee
     gnome3.libsoup
-    granite
+    pantheon.granite
     gtk3
     libqalculate
   ];
diff --git a/pkgs/data/icons/faba-icon-theme/default.nix b/pkgs/data/icons/faba-icon-theme/default.nix
index 07d2b5ecf02..c15e0f4e551 100644
--- a/pkgs/data/icons/faba-icon-theme/default.nix
+++ b/pkgs/data/icons/faba-icon-theme/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, meson, ninja, python3, gtk3, elementary-icon-theme }:
+{ stdenv, fetchFromGitHub, meson, ninja, python3, gtk3, pantheon }:
 
 stdenv.mkDerivation rec {
   name = "${package-name}-${version}";
@@ -12,7 +12,7 @@ stdenv.mkDerivation rec {
     sha256 = "0xh6ppr73p76z60ym49b4d0liwdc96w41cc5p07d48hxjsa6qd6n";
   };
 
-  nativeBuildInputs = [ meson ninja python3 gtk3 elementary-icon-theme ];
+  nativeBuildInputs = [ meson ninja python3 gtk3 pantheon.elementary-icon-theme ];
 
   postPatch = ''
     patchShebangs meson/post_install.py
diff --git a/pkgs/desktops/deepin/deepin-wm/default.nix b/pkgs/desktops/deepin/deepin-wm/default.nix
index 4eac01b666a..ea2f06aae60 100644
--- a/pkgs/desktops/deepin/deepin-wm/default.nix
+++ b/pkgs/desktops/deepin/deepin-wm/default.nix
@@ -1,5 +1,5 @@
 { stdenv, fetchFromGitHub, pkgconfig, intltool, libtool, vala, gnome3,
-  bamf, clutter-gtk, granite, libcanberra-gtk3, libwnck3,
+  bamf, clutter-gtk, pantheon, libcanberra-gtk3, libwnck3,
   deepin-mutter, deepin-wallpapers, deepin-desktop-schemas,
   hicolor-icon-theme, deepin }:
 
@@ -28,7 +28,7 @@ stdenv.mkDerivation rec {
     gnome3.libgee
     bamf
     clutter-gtk
-    granite
+    pantheon.granite
     libcanberra-gtk3
     libwnck3
     deepin-mutter
diff --git a/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix b/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix
new file mode 100644
index 00000000000..c8ade1c9c35
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix b/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
new file mode 100644
index 00000000000..28983db7f91
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-camera/default.nix b/pkgs/desktops/pantheon/apps/elementary-camera/default.nix
new file mode 100644
index 00000000000..2e90a96411a
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-code/default.nix b/pkgs/desktops/pantheon/apps/elementary-code/default.nix
new file mode 100644
index 00000000000..0b16c56be3d
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-files/default.nix b/pkgs/desktops/pantheon/apps/elementary-files/default.nix
new file mode 100644
index 00000000000..947ba6c32f6
--- /dev/null
+++ b/pkgs/desktops/pantheon/apps/elementary-files/default.nix
@@ -0,0 +1,77 @@
+{ stdenv, fetchFromGitHub, pantheon, pkgconfig, meson, ninja, gettext, vala
+, python3, desktop-file-utils, intltool, 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.3";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0vz6m6kqm9r1scj1jdljbzh019skj8fhf916011wkdfzdpc1zlac";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    glib-networking
+    gobject-introspection
+    intltool
+    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/pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch b/pkgs/desktops/pantheon/apps/elementary-files/hardcode-gsettings.patch
new file mode 100644
index 00000000000..3191f4e3cb2
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-music/default.nix b/pkgs/desktops/pantheon/apps/elementary-music/default.nix
new file mode 100644
index 00000000000..8bca7b3b6b5
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-photos/default.nix b/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
new file mode 100644
index 00000000000..055889fd6d1
--- /dev/null
+++ b/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
@@ -0,0 +1,80 @@
+{ 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
+, scour, webkitgtk, libwebp, appstream, libunity, wrapGAppsHook, gobject-introspection, elementary-icon-theme }:
+
+stdenv.mkDerivation rec {
+  pname = "photos";
+  version = "2.6.1";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "063h6jr0p8v46w8bppsss1zlphx21xqwylh57qbyd5xi71z4gl1v";
+  };
+
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+      attrPath = "elementary-${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gobject-introspection
+    meson
+    ninja
+    pkgconfig
+    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"
+  ];
+
+  # This should be provided by a post_install.py script - See -> https://github.com/elementary/photos/pull/433
+  postInstall = ''
+    ${glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas
+  '';
+
+  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/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix b/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix
new file mode 100644
index 00000000000..b00d0e3997a
--- /dev/null
+++ b/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.0";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "screenshot";
+    rev = version;
+    sha256 = "0hxgh7br12kw8bs2cdm2q9ivhnj2zb0i7fs43pkgf3z0fidjf1yv";
+  };
+
+  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/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix b/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/redacted-script.nix
new file mode 100644
index 00000000000..db1d9d240c4
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix b/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix
new file mode 100644
index 00000000000..01fe35e4a8e
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/elementary-videos/default.nix b/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
new file mode 100644
index 00000000000..a07667cd625
--- /dev/null
+++ b/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
@@ -0,0 +1,64 @@
+{ 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,  gst-ffmpeg }:
+
+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-ffmpeg
+    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/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix
new file mode 100644
index 00000000000..2ee92520983
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix
new file mode 100644
index 00000000000..bdba8328fe9
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/about/lspci-path.patch
new file mode 100644
index 00000000000..352d84c4262
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/about/remove-update-button.patch
new file mode 100644
index 00000000000..41433f9a76b
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix
new file mode 100644
index 00000000000..382700cc583
--- /dev/null
+++ b/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.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1gi8jwjh9ga7h92ffl43r0rnlnl5649pqzpk7q1ffhhyqzwh8l63";
+  };
+
+  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/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix
new file mode 100644
index 00000000000..fc6f566b353
--- /dev/null
+++ b/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.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1aynzns0xw629drv9qvci37ba0fzyd5x9y8kwjqr527rnk0qiyca";
+  };
+
+  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/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/clock-format.patch
new file mode 100644
index 00000000000..0fe0ac8b10c
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix
new file mode 100644
index 00000000000..95a350372b9
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/timezone.patch
new file mode 100644
index 00000000000..35f73d36599
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix
new file mode 100644
index 00000000000..192f8a69ae9
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix
new file mode 100644
index 00000000000..f38f15e3c6d
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/xkb.patch
new file mode 100644
index 00000000000..33237d9c939
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix
new file mode 100644
index 00000000000..6c4bdeb7fb7
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix
new file mode 100644
index 00000000000..3943cad48fd
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/network/nma.patch
new file mode 100644
index 00000000000..a5fff9d6a32
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix
new file mode 100644
index 00000000000..6bb5d285a34
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix
new file mode 100644
index 00000000000..0417d33df7d
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/backgrounds.patch
new file mode 100644
index 00000000000..a1b019179d1
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix
new file mode 100644
index 00000000000..e47dc4c4060
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/hardcode-gsettings.patch
new file mode 100644
index 00000000000..d023e1b55ce
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix
new file mode 100644
index 00000000000..dd8e2974a49
--- /dev/null
+++ b/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.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0kfnnghyzvy368sh39j4jdl7cnz2yc239hp00054lc4rjs8m61nv";
+  };
+
+  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/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch
new file mode 100644
index 00000000000..335d3f29626
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/power/hardcode-gsettings.patch
new file mode 100644
index 00000000000..caacdad6eda
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
new file mode 100644
index 00000000000..bb9e576a4c4
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
new file mode 100644
index 00000000000..4060e071789
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch b/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/hardcode-gsettings.patch
new file mode 100644
index 00000000000..ffaf1ecf5db
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix
new file mode 100644
index 00000000000..a2c047ffcb4
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix b/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix
new file mode 100644
index 00000000000..e4d0db46923
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard/default.nix b/pkgs/desktops/pantheon/apps/switchboard/default.nix
new file mode 100644
index 00000000000..310230c7aac
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch b/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch
new file mode 100644
index 00000000000..f5d8567bffe
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix b/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix
new file mode 100644
index 00000000000..cae8e74f4ba
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix b/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix
new file mode 100644
index 00000000000..2f7e79f9f9b
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix b/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
new file mode 100644
index 00000000000..f70186585ec
--- /dev/null
+++ b/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.2";
+
+  name = "elementary-icon-theme-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "12j582f0kggv2lp935r75xg7q26zpl0f05s11xcs4qxazhj1ly2r";
+  };
+
+  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/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix b/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix
new file mode 100644
index 00000000000..430acfd9ac1
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix b/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix
new file mode 100644
index 00000000000..898d5f7b454
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/default.nix b/pkgs/desktops/pantheon/default.nix
new file mode 100644
index 00000000000..a7b8a01eeb0
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch b/pkgs/desktops/pantheon/desktop/elementary-default-settings/correct-override.patch
new file mode 100644
index 00000000000..438ed79d1bb
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix b/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
new file mode 100644
index 00000000000..f133324a81e
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist b/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.whitelist
new file mode 100644
index 00000000000..0cff31f4f77
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
new file mode 100644
index 00000000000..b25bb8c8590
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
new file mode 100644
index 00000000000..3bd7d531840
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
new file mode 100644
index 00000000000..494edde183c
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
new file mode 100644
index 00000000000..89536754964
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
new file mode 100644
index 00000000000..312c35d9bf0
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
new file mode 100644
index 00000000000..3b0f721a564
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
new file mode 100644
index 00000000000..b0218bac52d
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem b/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem
new file mode 100644
index 00000000000..8b04efe417e
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch b/pkgs/desktops/pantheon/desktop/elementary-greeter/01-sysconfdir-install.patch
new file mode 100644
index 00000000000..626e56ce596
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix b/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
new file mode 100644
index 00000000000..303aae6882b
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch b/pkgs/desktops/pantheon/desktop/elementary-greeter/gsd.patch
new file mode 100644
index 00000000000..1770d54aee0
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch b/pkgs/desktops/pantheon/desktop/elementary-greeter/numlockx.patch
new file mode 100644
index 00000000000..2c7766b4284
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix b/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
new file mode 100644
index 00000000000..bd5688f941b
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix b/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
new file mode 100644
index 00000000000..d8634b48570
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop b/pkgs/desktops/pantheon/desktop/elementary-session-settings/default-elementary-dockitems.desktop
new file mode 100644
index 00000000000..517a9457ae1
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix b/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
new file mode 100644
index 00000000000..fddd4143616
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix b/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
new file mode 100644
index 00000000000..6ceebf1980c
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix b/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix
new file mode 100644
index 00000000000..4e19a65b58d
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch b/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch
new file mode 100644
index 00000000000..3b97e306119
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/gala/default.nix b/pkgs/desktops/pantheon/desktop/gala/default.nix
new file mode 100644
index 00000000000..97acc2c791b
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch b/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
new file mode 100644
index 00000000000..e83308ea552
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/bc.patch
new file mode 100644
index 00000000000..264a4a5b26d
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
new file mode 100644
index 00000000000..e4f7df107ba
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/xdg.patch
new file mode 100644
index 00000000000..f17e2581e07
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
new file mode 100644
index 00000000000..16f3ae2e28e
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/calendar-exec.patch
new file mode 100644
index 00000000000..2370fbcd3cb
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
new file mode 100644
index 00000000000..ee5cd511818
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
new file mode 100644
index 00000000000..e2faccedbb7
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
new file mode 100644
index 00000000000..58e6853e606
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
new file mode 100644
index 00000000000..8cb71dd43d6
--- /dev/null
+++ b/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.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0k039qqlpwhl34mdhwjqhp7bz8vi432p0zfxzcdhsjhglpk8srlw";
+  };
+
+  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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
new file mode 100644
index 00000000000..53754c31d87
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
new file mode 100644
index 00000000000..aff7d9891ad
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
new file mode 100644
index 00000000000..e6c5edd7ca6
--- /dev/null
+++ b/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.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1rkqa27bsfai4psp19sy61in6730da0s7nds7dkcf06a0hvjvjc2";
+  };
+
+  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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
new file mode 100644
index 00000000000..b910f6a7180
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
new file mode 100644
index 00000000000..003e431bcf7
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel/default.nix b/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
new file mode 100644
index 00000000000..a5ca227bbc2
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch b/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
new file mode 100644
index 00000000000..68a5fd532a8
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix b/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
new file mode 100644
index 00000000000..cfae604d3a5
--- /dev/null
+++ b/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/pkgs/development/libraries/granite/02-datetime-clock-format-gsettings.patch b/pkgs/desktops/pantheon/granite/02-datetime-clock-format-gsettings.patch
index 7b7c9871133..7b7c9871133 100644
--- a/pkgs/development/libraries/granite/02-datetime-clock-format-gsettings.patch
+++ b/pkgs/desktops/pantheon/granite/02-datetime-clock-format-gsettings.patch
diff --git a/pkgs/development/libraries/granite/default.nix b/pkgs/desktops/pantheon/granite/default.nix
index eacb84e3361..fe0e880ccb2 100644
--- a/pkgs/development/libraries/granite/default.nix
+++ b/pkgs/desktops/pantheon/granite/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, fetchpatch, python3, meson, ninja, vala_0_40, pkgconfig, gobject-introspection, gnome3, gtk3, glib, gettext, hicolor-icon-theme, wrapGAppsHook }:
+{ stdenv, fetchFromGitHub, fetchpatch, python3, meson, ninja, vala, pkgconfig, gobject-introspection, libgee, pantheon, gtk3, glib, gettext, hicolor-icon-theme, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
   pname = "granite";
@@ -26,6 +26,12 @@ stdenv.mkDerivation rec {
     ./02-datetime-clock-format-gsettings.patch
   ];
 
+  passthru = {
+    updateScript = pantheon.updateScript {
+      repoName = pname;
+    };
+  };
+
   nativeBuildInputs = [
     gettext
     gobject-introspection
@@ -33,7 +39,7 @@ stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    vala
     wrapGAppsHook
   ];
 
@@ -41,7 +47,7 @@ stdenv.mkDerivation rec {
     glib
     gtk3
     hicolor-icon-theme
-    gnome3.libgee
+    libgee
   ];
 
   postPatch = ''
@@ -58,6 +64,6 @@ stdenv.mkDerivation rec {
     homepage = https://github.com/elementary/granite;
     license = licenses.lgpl3Plus;
     platforms = platforms.linux;
-    maintainers = with maintainers; [ vozz worldofpeace ];
+    maintainers = pantheon.maintainers;
   };
 }
diff --git a/pkgs/desktops/pantheon/services/cerbere/default.nix b/pkgs/desktops/pantheon/services/cerbere/default.nix
new file mode 100644
index 00000000000..59983469c11
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/contractor/default.nix b/pkgs/desktops/pantheon/services/contractor/default.nix
new file mode 100644
index 00000000000..a979b134195
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix b/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix
new file mode 100644
index 00000000000..85476b04805
--- /dev/null
+++ b/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.2";
+
+  name = "elementary-${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "138fxijnnp0gqzj7h0p9r4crpafas1kmvb3r9bb76mmygbdixkgh";
+  };
+
+  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/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch b/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch
new file mode 100644
index 00000000000..a59c74f22b3
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix b/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix
new file mode 100644
index 00000000000..4dab02d5083
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix b/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
new file mode 100644
index 00000000000..99ca20afe98
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch b/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch
new file mode 100644
index 00000000000..2229302cab7
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix b/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix
new file mode 100644
index 00000000000..2487c4ba3af
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix b/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix
new file mode 100644
index 00000000000..4fdaa4a8bf9
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/update.nix b/pkgs/desktops/pantheon/update.nix
new file mode 100644
index 00000000000..48fd2f2bf85
--- /dev/null
+++ b/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/pkgs/desktops/pantheon/update.sh b/pkgs/desktops/pantheon/update.sh
new file mode 100755
index 00000000000..9bbbe260034
--- /dev/null
+++ b/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/pkgs/tools/misc/hashit/default.nix b/pkgs/tools/misc/hashit/default.nix
index 0cb839c26ff..f1f2fd9aa44 100644
--- a/pkgs/tools/misc/hashit/default.nix
+++ b/pkgs/tools/misc/hashit/default.nix
@@ -1,11 +1,9 @@
-{ stdenv, fetchFromGitHub, meson, ninja, pkgconfig, cmake, vala_0_40, python3, gnome3, gtk3, granite, gobject-introspection, desktop-file-utils, wrapGAppsHook }:
+{ stdenv, fetchFromGitHub, meson, ninja, pkgconfig, cmake, pantheon, python3, gnome3, gtk3, gobject-introspection, desktop-file-utils, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
   pname = "hashit";
   version = "1.0.0";
 
-  name = "${pname}-${version}";
-
   src = fetchFromGitHub {
     owner = "artemanufrij";
     repo = pname;
@@ -20,14 +18,14 @@ stdenv.mkDerivation rec {
     ninja
     pkgconfig
     python3
-    vala_0_40 # should be `elementary.vala` when elementary attribute set is merged
+    pantheon.vala
     wrapGAppsHook
   ];
 
   buildInputs = [
-    gnome3.defaultIconTheme # should be `elementary.defaultIconTheme`when elementary attribute set is merged
+    pantheon.elementary-icon-theme
     gnome3.libgee
-    granite
+    pantheon.granite
     gtk3
   ];
 
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 817974d9a25..860db43fce6 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -10224,7 +10224,6 @@ in
 
   gnome-menus = callPackage ../development/libraries/gnome-menus { };
 
-  granite = callPackage ../development/libraries/granite { };
   elementary-cmake-modules = callPackage ../development/libraries/elementary-cmake-modules { };
 
   gtk2 = callPackage ../development/libraries/gtk+/2.x.nix {
@@ -21318,6 +21317,8 @@ in
 
   mate = recurseIntoAttrs (callPackage ../desktops/mate { });
 
+  pantheon = recurseIntoAttrs (callPackage ../desktops/pantheon { });
+
   maxx = callPackage ../desktops/maxx { };
 
   plasma-applet-volumewin7mixer = libsForQt5.callPackage ../applications/misc/plasma-applet-volumewin7mixer { };