about summary refs log tree commit diff
path: root/nixpkgs/pkgs/desktops/pantheon
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/desktops/pantheon')
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/appcenter/default.nix106
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix86
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix83
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix107
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-dock/default.nix87
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/0001-filechooser-module-hardcode-gsettings-for-nixos.patch35
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix102
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-mail/default.nix82
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix109
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix117
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix68
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix84
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix77
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/sideload/default.nix74
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix62
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/fix-paths.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix80
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/fix-paths.patch26
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix53
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix53
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/0001-Remove-Install-Unlisted-Engines-function.patch700
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix68
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix67
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/fix-paths.patch26
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix86
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix71
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix65
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix78
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix54
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix59
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch21
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix62
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-redacted-script/default.nix31
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix42
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/default.nix207
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/0001-Build-with-Meson.patch309
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix108
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.allowed6
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix130
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch22
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch25
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix52
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix84
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix47
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix161
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list168
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix63
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix43
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch34
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix97
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch20
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/use-new-notifications-default.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix110
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch24
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix67
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix71
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix65
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix68
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix89
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch21
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix60
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/granite/default.nix75
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix59
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix73
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix66
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-notifications/default.nix60
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix166
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/elementary-dpms.patch84
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch15
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/global-backlight-helper.patch26
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix61
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix55
100 files changed, 6840 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/appcenter/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/appcenter/default.nix
new file mode 100644
index 000000000000..a3e75d231f19
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/appcenter/default.nix
@@ -0,0 +1,106 @@
+{ lib, stdenv
+, nix-update-script
+, appstream
+, appstream-glib
+, dbus
+, desktop-file-utils
+, elementary-gtk-theme
+, elementary-icon-theme
+, fetchFromGitHub
+, fetchpatch
+, flatpak
+, gettext
+, glib
+, granite
+, gtk3
+, json-glib
+, libgee
+, libsoup
+, libxml2
+, meson
+, ninja
+, packagekit
+, pantheon
+, pkg-config
+, python3
+, vala
+, polkit
+, libhandy_0
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "appcenter";
+  version = "3.5.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "MsaXdmL+M+NYAJrrwluleeNxqQg0soFbO/G/FqibBFI=";
+  };
+
+  patches = [
+    # Allow build with appstream 0.14.x
+    # https://github.com/elementary/appcenter/pull/1493
+    (fetchpatch {
+      url = "https://github.com/elementary/appcenter/commit/5807dd13fe3c715f26225aed8d7a0abdea0c2a64.patch";
+      sha256 = "BvEahG9lU9ZdgooFDFhm5evRvnKVcmcHLdmZPb85gbo=";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream-glib
+    dbus # for pkg-config
+    desktop-file-utils
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    appstream
+    elementary-gtk-theme
+    elementary-icon-theme
+    flatpak
+    glib
+    granite
+    gtk3
+    json-glib
+    libgee
+    libhandy_0 # doesn't support libhandy-1 yet
+    libsoup
+    libxml2
+    packagekit
+    polkit
+  ];
+
+  mesonFlags = [
+    "-Dhomepage=false"
+    "-Dpayments=false"
+    "-Dcurated=false"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/elementary/appcenter";
+    description = "An open, pay-what-you-want app store for indie developers, designed for elementary OS";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix
new file mode 100644
index 000000000000..791c2508e120
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calculator/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, desktop-file-utils
+, libxml2
+, gtk3
+, python3
+, granite
+, libgee
+, elementary-icon-theme
+, appstream
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-calculator";
+  version = "1.6.1";
+
+  repoName = "calculator";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-LGY111wPldxuSfqhZ2E2TeJjexcGbfS25RjLw+Wi99c=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/elementary/calculator";
+    description = "Calculator app designed for elementary OS";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
new file mode 100644
index 000000000000..cf0d0d812fe1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-calendar/default.nix
@@ -0,0 +1,86 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, desktop-file-utils
+, gtk3
+, granite
+, libgee
+, geoclue2
+, libchamplain
+, clutter
+, folks
+, geocode-glib
+, python3
+, libnotify
+, libical
+, libgdata
+, evolution-data-server
+, appstream-glib
+, elementary-icon-theme
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-calendar";
+  version = "5.1.1";
+
+  repoName = "calendar";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "18npf4zzf2dywr1zkr6fqzcbb70297yvdp5wxw7zyam1xwa86v07";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream-glib
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    clutter
+    elementary-icon-theme
+    evolution-data-server
+    folks
+    geoclue2
+    geocode-glib
+    granite
+    gtk3
+    libchamplain
+    libgee
+    libical
+    libnotify
+    libgdata # required by some dependency transitively
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Desktop calendar app designed for elementary OS";
+    homepage = "https://github.com/elementary/calendar";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix
new file mode 100644
index 000000000000..9a48d38ad8cb
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-camera/default.nix
@@ -0,0 +1,83 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, 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 = "elementary-camera";
+  version = "1.0.6";
+
+  repoName = "camera";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-asl5NdSuLItXebxvqGlSEjwWhdButmka12YQAYkQT44=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    gettext
+    libxml2
+    meson
+    ninja
+    pkg-config
+    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 lib; {
+    description = "Camera app designed for elementary OS";
+    homepage = "https://github.com/elementary/camera";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix
new file mode 100644
index 000000000000..e8b10227eaa4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-code/default.nix
@@ -0,0 +1,107 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, python3
+, 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 = "elementary-code";
+  version = "3.4.1";
+
+  repoName = "code";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-4AEayj+K/lOW6jEYmvmdan1kTqqqLL1YzwcU7/3PH5U=";
+  };
+
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/code/commit/c50580d3336296823da9a2c50b824f21fde50286.patch";
+      sha256 = "F+ZYlnZWYCU68G4oayLfbTnvSnTb4YA0zHVGD/Uf3KA=";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    ctags
+    editorconfig-core-c
+    elementary-icon-theme
+    granite
+    gtk3
+    gtksourceview3
+    gtkspell3
+    libgee
+    libgit2-glib
+    libpeas
+    libsoup
+    vte
+    webkitgtk
+    zeitgeist
+  ];
+
+  # install script fails with UnicodeDecodeError because of printing a fancy elipsis character
+  LC_ALL = "C.UTF-8";
+
+  # ctags needed in path by outline plugin
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --prefix PATH : "${lib.makeBinPath [ ctags ]}"
+    )
+  '';
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Code editor designed for elementary OS";
+    homepage = "https://github.com/elementary/code";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-dock/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-dock/default.nix
new file mode 100644
index 000000000000..797f62cf8e2f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-dock/default.nix
@@ -0,0 +1,87 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, vala
+, atk
+, cairo
+, dconf
+, glib
+, gtk3
+, libwnck
+, libX11
+, libXfixes
+, libXi
+, pango
+, gettext
+, pkg-config
+, libxml2
+, bamf
+, gdk-pixbuf
+, libdbusmenu-gtk3
+, gnome-menus
+, libgee
+, wrapGAppsHook
+, pantheon
+, meson
+, ninja
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-dock";
+  version = "unstable-2020-06-11";
+
+  outputs = [ "out" "dev" ];
+
+  repoName = "dock";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = "0a389ee58939d8c91c340df4e5340fc4b23d0b80";
+    sha256 = "01vinik73s0vmk56samgf49zr2bl4wjv44x15sz2cmh744llckja";
+  };
+
+  patches = [
+    # Fix double includedir path in plank.pc
+    (fetchpatch {
+      url = "https://github.com/elementary/dock/commit/3bc368e2c4fafcd5b8baca2711c773b0e2441c7c.patch";
+      sha256 = "0gg35phi1cg7ixljc388i0h70w323r1gqzjhanccnsbjpqsgvs3k";
+    })
+  ];
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    libxml2 # xmllint
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    atk
+    bamf
+    cairo
+    gdk-pixbuf
+    glib
+    gnome-menus
+    dconf
+    gtk3
+    libX11
+    libXfixes
+    libXi
+    libdbusmenu-gtk3
+    libgee
+    libwnck
+    pango
+  ];
+
+  meta = with lib; {
+    description = "Elegant, simple, clean dock";
+    homepage = "https://github.com/elementary/dock";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ davidak ] ++ pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix
new file mode 100644
index 000000000000..21aeb38530fd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-feedback/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, python3
+, gtk3
+, glib
+, granite
+, libgee
+, elementary-icon-theme
+, elementary-gtk-theme
+, gettext
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-feedback";
+  version = "1.0";
+
+  repoName = "feedback";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-GkVnowqGXwnEgplT34Po/BKzC2F/IQE2kIw0SLSLhGU=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    elementary-gtk-theme
+    libgee
+    glib
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "GitHub Issue Reporter designed for elementary OS";
+    homepage = "https://github.com/elementary/feedback";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/0001-filechooser-module-hardcode-gsettings-for-nixos.patch b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/0001-filechooser-module-hardcode-gsettings-for-nixos.patch
new file mode 100644
index 000000000000..9bcedac3f035
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/0001-filechooser-module-hardcode-gsettings-for-nixos.patch
@@ -0,0 +1,35 @@
+From f51974c9736c3e28755245d15729578214652343 Mon Sep 17 00:00:00 2001
+Message-Id: <f51974c9736c3e28755245d15729578214652343.1599178185.git-series.worldofpeace@protonmail.ch>
+From: worldofpeace <worldofpeace@protonmail.ch>
+Date: Thu,  3 Sep 2020 20:08:15 -0400
+Subject: [PATCH] filechooser-module: hardcode gsettings for nixos
+
+---
+ filechooser-module/FileChooserDialog.vala | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/filechooser-module/FileChooserDialog.vala b/filechooser-module/FileChooserDialog.vala
+index a70fe10..08fde2c 100644
+--- a/filechooser-module/FileChooserDialog.vala
++++ b/filechooser-module/FileChooserDialog.vala
+@@ -60,10 +60,14 @@ public class CustomFileChooserDialog : Object {
+         /* If not local only during creation, strange bug occurs on fresh installs */
+         chooser_dialog.local_only = true;
+ 
+-        var files_preferences = 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 files_preferences = new Settings.full (preferences_schema, null, null);
+         is_single_click = files_preferences.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 ();
+
+base-commit: 57cb89b64fd2d5c08f4aaf23e8c74bfaa5d0384f
+-- 
+git-series 0.9.1
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix
new file mode 100644
index 000000000000..99fd2a6555f5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-files/default.nix
@@ -0,0 +1,102 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, gettext
+, vala
+, python3
+, desktop-file-utils
+, libcanberra
+, gtk3
+, glib
+, libgee
+, granite
+, libnotify
+, libunity
+, pango
+, elementary-dock
+, bamf
+, sqlite
+, libdbusmenu-gtk3
+, zeitgeist
+, glib-networking
+, elementary-icon-theme
+, libcloudproviders
+, libgit2-glib
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-files";
+  version = "4.5.0";
+
+  repoName = "files";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-wtQW1poX791DAlSFdVV9psnCfBDeVXI2fDZ2GcvvNn8=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    glib-networking
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    bamf
+    elementary-dock
+    elementary-icon-theme
+    granite
+    gtk3
+    libcanberra
+    libcloudproviders
+    libdbusmenu-gtk3
+    libgee
+    libgit2-glib
+    libnotify
+    libunity
+    pango
+    sqlite
+    zeitgeist
+  ];
+
+  patches = [
+    ./0001-filechooser-module-hardcode-gsettings-for-nixos.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 ${glib.makeSchemaPath "$out" "${pname}-${version}"}
+  '';
+
+  meta = with lib; {
+    description = "File browser designed for elementary OS";
+    homepage = "https://github.com/elementary/files";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-mail/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-mail/default.nix
new file mode 100644
index 000000000000..b909f2472ad0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-mail/default.nix
@@ -0,0 +1,82 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, python3
+, vala
+, desktop-file-utils
+, gtk3
+, libxml2
+, libhandy
+, webkitgtk
+, folks
+, libgdata
+, sqlite
+, granite
+, elementary-icon-theme
+, evolution-data-server
+, appstream
+, wrapGAppsHook
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-mail";
+  version = "unstable-2021-06-21";
+
+  repoName = "mail";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = "c64c87fabb31dea8dc388152d5a835401993acf4";
+    sha256 = "yEUg1IbYbzOJiklnqR23X+aGVE9j4F9iH8FkmlB15x4=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    evolution-data-server
+    folks
+    granite
+    gtk3
+    libgdata
+    libgee
+    libhandy
+    sqlite
+    webkitgtk
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Mail app designed for elementary OS";
+    homepage = "https://github.com/elementary/mail";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers ++ [ maintainers.ethancedwards8 ];
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix
new file mode 100644
index 000000000000..5a5c314b3e9b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-music/default.nix
@@ -0,0 +1,109 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, desktop-file-utils
+, 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 = "elementary-music";
+  version = "5.0.5";
+
+  repoName = "music";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-3GZoBCu9rF+BnNk9APBzKWO1JYg1XYWwrEvwcjWvYDE=";
+  };
+
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/music/commit/9ed3bbb3a0d68e289a772b4603f58e52a4973316.patch";
+      sha256 = "fFO97SQzTc2fYFJFGfFPSUCdkCgZxfX1fjDQ7GH4BUs=";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    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
+    libnotify
+    libpeas
+    libsignon-glib
+    libsoup
+    taglib
+    zeitgeist
+  ];
+
+  mesonFlags = [
+    "-Dplugins=lastfm,audioplayer,cdrom,ipod"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Music player and library designed for elementary OS";
+    homepage = "https://github.com/elementary/music";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
new file mode 100644
index 000000000000..7280051361a9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-photos/default.nix
@@ -0,0 +1,117 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, desktop-file-utils
+, gtk3
+, libaccounts-glib
+, libexif
+, libgee
+, geocode-glib
+, gexiv2
+, libgphoto2
+, granite
+, gst_all_1
+, libgudev
+, json-glib
+, libraw
+, librest
+, libsoup
+, sqlite
+, python3
+, scour
+, webkitgtk
+, libwebp
+, appstream
+, libunity
+, wrapGAppsHook
+, elementary-icon-theme
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-photos";
+  version = "2.7.0";
+
+  repoName = "photos";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-bTk4shryAWWMrKX3mza6xQ05qpBPf80Ey7fmYgKLUiY=";
+  };
+
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/photos/commit/27e529fc96da828982563e2e19a6f0cef883a29e.patch";
+      sha256 = "w39wh45VHggCs62TN6wpUEyz/hJ1y7qL1Ox+sp0Pt2s=";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = with gst_all_1; [
+    elementary-icon-theme
+    geocode-glib
+    gexiv2
+    granite
+    gst-plugins-bad
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gstreamer
+    gtk3
+    json-glib
+    libaccounts-glib
+    libexif
+    libgee
+    libgphoto2
+    libgudev
+    libraw
+    librest
+    libsoup
+    libunity
+    libwebp
+    scour
+    sqlite
+    webkitgtk
+  ];
+
+  mesonFlags = [
+    "-Dplugins=false"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta =  with lib; {
+    description = "Photo viewer and organizer designed for elementary OS";
+    homepage = "https://github.com/elementary/photos";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix
new file mode 100644
index 000000000000..048aa4ab129e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-screenshot-tool/default.nix
@@ -0,0 +1,68 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, python3
+, desktop-file-utils
+, gtk3
+, granite
+, libgee
+, libcanberra
+, elementary-icon-theme
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-screenshot-tool"; # This will be renamed to "screenshot" soon. See -> https://github.com/elementary/screenshot/pull/93
+  version = "1.7.1";
+
+  repoName = "screenshot";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-qo55fzp0ieYF5I5uxnCQY066mege06InHL3B3ahYMZ0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libcanberra
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Screenshot tool designed for elementary OS";
+    homepage = "https://github.com/elementary/screenshot";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix
new file mode 100644
index 000000000000..46f279dd7957
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-terminal/default.nix
@@ -0,0 +1,84 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, pkg-config
+, meson
+, ninja
+, python3
+, vala
+, desktop-file-utils
+, gtk3
+, libxml2
+, granite
+, libnotify
+, vte
+, libgee
+, elementary-icon-theme
+, appstream
+, pcre2
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-terminal";
+  version = "5.5.2";
+
+  repoName = "terminal";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-giVmL0zYEVYJ40ZBQ9dDb4hOx4HaYRt7tUTOu37lMYU=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    desktop-file-utils
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+    libnotify
+    pcre2
+    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 lib; {
+    description = "Terminal emulator designed for elementary OS";
+    longDescription = ''
+      A super lightweight, beautiful, and simple terminal. Comes with sane defaults, browser-class tabs, sudo paste protection,
+      smart copy/paste, and little to no configuration.
+    '';
+    homepage = "https://github.com/elementary/terminal";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
new file mode 100644
index 000000000000..e5506093719d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/elementary-videos/default.nix
@@ -0,0 +1,77 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, python3
+, desktop-file-utils
+, gtk3
+, granite
+, libgee
+, clutter-gst
+, clutter-gtk
+, gst_all_1
+, elementary-icon-theme
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-videos";
+  version = "2.7.2";
+
+  repoName = "videos";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-MSyhCXsziQ0MD4lGp9X/9odidjT/L+2Aihwd1qCGvB0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = with gst_all_1; [
+    clutter-gst
+    clutter-gtk
+    elementary-icon-theme
+    granite
+    gst-libav
+    gst-plugins-bad
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-ugly
+    gstreamer
+    gtk3
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Video player and library app designed for elementary OS";
+    homepage = "https://github.com/elementary/videos";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/sideload/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/sideload/default.nix
new file mode 100644
index 000000000000..c3ba1717801d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/sideload/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv
+, desktop-file-utils
+, nix-update-script
+, elementary-gtk-theme
+, elementary-icon-theme
+, fetchFromGitHub
+, flatpak
+, gettext
+, glib
+, granite
+, gtk3
+, libgee
+, meson
+, ninja
+, pantheon
+, pkg-config
+, python3
+, vala
+, libxml2
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "sideload";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-eI/j6+lok9axRHV5DCsFY1fDCV+X5zBR7X8rK6odjFY=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-gtk-theme
+    elementary-icon-theme
+    flatpak
+    glib
+    granite
+    gtk3
+    libgee
+    libxml2
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/elementary/sideload";
+    description = "Flatpak installer, designed for elementary OS";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix
new file mode 100644
index 000000000000..06f097e81af5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv
+, substituteAll
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+, onboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-a11y";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-3PaOIadlEdYvfNZJaoAQVDKdSTfUdn+snCa8tHmDFD0=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit onboard;
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Universal Access Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-a11y";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/fix-paths.patch
new file mode 100644
index 000000000000..4d69390f39d9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/a11y/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Panes/Typing.vala b/src/Panes/Typing.vala
+index b4ae8b0..5b8fd7e 100644
+--- a/src/Panes/Typing.vala
++++ b/src/Panes/Typing.vala
+@@ -83,7 +83,7 @@ public class Accessibility.Panes.Typing : Categories.Pane {
+ 
+         onboard_settings_label.clicked.connect (() => {
+             try {
+-                var appinfo = AppInfo.create_from_commandline ("onboard-settings", null, AppInfoCreateFlags.NONE);
++                var appinfo = AppInfo.create_from_commandline ("@onboard@/bin/onboard-settings", null, AppInfoCreateFlags.NONE);
+                 appinfo.launch (null, null);
+             } catch (Error e) {
+                 warning ("%s\n", e.message);
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix
new file mode 100644
index 000000000000..adba2ec08017
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/default.nix
@@ -0,0 +1,80 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pantheon
+, substituteAll
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+, pciutils
+, elementary-feedback
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-about";
+  version = "2.6.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-wis6wNEOOjPLUCT9vRRhMxbKHR2Y2nZArKogSF/FQv8=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  patches = [
+    # Get OS Info from GLib.Environment
+    # https://github.com/elementary/switchboard-plug-about/pull/128
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-about/commit/5ed29988e3a895b2df66e5529df0f12a94d5517c.patch";
+      sha256 = "1ipDxnpDZjpSEzZdtOeNe5U+QOXiB5M+hC3yDAsl/rQ=";
+    })
+
+    # Use Pretty Name
+    # https://github.com/elementary/switchboard-plug-about/pull/134
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-about/commit/653d131dc8fac10ae7523f2bf6b179ffffa9c0fd.patch";
+      sha256 = "AsM49Dc9/yn2tG6fqjfedeOlDXUu+iEoyNUmNYLH+zE=";
+    })
+
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit pciutils;
+      elementary_feedback = elementary-feedback;
+    })
+  ];
+
+  meta = with lib; {
+    description = "Switchboard About Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-about";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/fix-paths.patch
new file mode 100644
index 000000000000..d458689a3253
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/about/fix-paths.patch
@@ -0,0 +1,26 @@
+diff --git a/src/Plug.vala b/src/Plug.vala
+index c32efcbe..0cdaeaca 100644
+--- a/src/Plug.vala
++++ b/src/Plug.vala
+@@ -178,7 +178,7 @@ public class About.Plug : Switchboard.Plug {
+ 
+         var bug_button = new Gtk.Button.with_label (_("Report a Problem"));
+         bug_button.clicked.connect (() => {
+-            var appinfo = new GLib.DesktopAppInfo ("io.elementary.feedback.desktop");
++            var appinfo = new GLib.DesktopAppInfo ("@elementary_feedback@/bin/io.elementary.feedback.desktop");
+             if (appinfo != null) {
+                 try {
+                     appinfo.launch (null, null);
+diff --git a/src/Views/HardwareView.vala b/src/Views/HardwareView.vala
+index f8113634..3794bad8 100644
+--- a/src/Views/HardwareView.vala
++++ b/src/Views/HardwareView.vala
+@@ -179,7 +179,7 @@ public class About.HardwareView : Gtk.Grid {
+ 
+         // Graphics
+         try {
+-            Process.spawn_command_line_sync ("lspci", out graphics);
++            Process.spawn_command_line_sync ("@pciutils@/bin/lspci", out graphics);
+ 
+             if ("VGA" in graphics) { //VGA-keyword indicates graphics-line
+                 string[] lines = graphics.split("\n");
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix
new file mode 100644
index 000000000000..66596fa2ff1b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/applications/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-applications";
+  version = "2.1.7";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-uiu19XyogNR0LX/2IIZM6B1JKAfqDMOHniQ29EAa9XM=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Applications Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-applications";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix
new file mode 100644
index 000000000000..dea3c0306a32
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/bluetooth/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, bluez
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-bluetooth";
+  version = "2.3.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-avu9Hya3C9g8kGl3D9bLwuZBkNPdwyvLspuBWgvpXU8=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    bluez
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Bluetooth Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-bluetooth";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix
new file mode 100644
index 000000000000..2337ef241198
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/datetime/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, substituteAll
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, libxml2
+, switchboard
+, tzdata
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-datetime";
+  version = "2.1.9";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-qgsU3NXqH7ryUah7rEnUrsbecV4AsOo4QfgTcWc5bc4=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Date & Time Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-datetime";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix
new file mode 100644
index 000000000000..055a40989631
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/display/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-display";
+  version = "2.2.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-mjmvuSipCRGg/HSa1n1eLyVU1gERNT2ciqgz/0KqX0Y=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Displays Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-display";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/0001-Remove-Install-Unlisted-Engines-function.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/0001-Remove-Install-Unlisted-Engines-function.patch
new file mode 100644
index 000000000000..42900c380627
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/0001-Remove-Install-Unlisted-Engines-function.patch
@@ -0,0 +1,700 @@
+From 4fd6da39ab33a6eef46ee2c64eb4f5595c7fe633 Mon Sep 17 00:00:00 2001
+Message-Id: <4fd6da39ab33a6eef46ee2c64eb4f5595c7fe633.1599180249.git-series.worldofpeace@protonmail.ch>
+From: worldofpeace <worldofpeace@protonmail.ch>
+Date: Thu,  3 Sep 2020 20:43:25 -0400
+Subject: [PATCH] Remove Install Unlisted Engines function
+
+https://github.com/elementary/switchboard-plug-keyboard/issues/324
+---
+ src/Dialogs/InstallEngineDialog.vala           | 140 +------------------
+ src/Dialogs/ProgressDialog.vala                |  82 +----------
+ src/InputMethod/Installer/InstallList.vala     |  73 +---------
+ src/InputMethod/Installer/UbuntuInstaller.vala | 142 +------------------
+ src/InputMethod/Installer/aptd-client.vala     |  93 +------------
+ src/Widgets/InputMethod/AddEnginesPopover.vala |  12 +--
+ src/Widgets/InputMethod/LanguagesRow.vala      |  43 +-----
+ src/meson.build                                |   6 +-
+ 8 files changed, 591 deletions(-)
+ delete mode 100644 src/Dialogs/InstallEngineDialog.vala
+ delete mode 100644 src/Dialogs/ProgressDialog.vala
+ delete mode 100644 src/InputMethod/Installer/InstallList.vala
+ delete mode 100644 src/InputMethod/Installer/UbuntuInstaller.vala
+ delete mode 100644 src/InputMethod/Installer/aptd-client.vala
+ delete mode 100644 src/Widgets/InputMethod/LanguagesRow.vala
+
+diff --git a/src/Dialogs/InstallEngineDialog.vala b/src/Dialogs/InstallEngineDialog.vala
+deleted file mode 100644
+index ffba3a8..0000000
+--- a/src/Dialogs/InstallEngineDialog.vala
++++ /dev/null
+@@ -1,140 +0,0 @@
+-/*
+-* Copyright 2019-2020 elementary, Inc. (https://elementary.io)
+-*
+-* This program is free software: you can redistribute it and/or modify
+-* it under the terms of the GNU General Public License as published by
+-* the Free Software Foundation, either version 3 of the License, or
+-* (at your option) any later version.
+-*
+-* This program is distributed in the hope that it will be useful,
+-* but WITHOUT ANY WARRANTY; without even the implied warranty of
+-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-* GNU General Public License for more details.
+-*
+-* You should have received a copy of the GNU General Public License
+-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
+-*/
+-
+-public class Pantheon.Keyboard.InputMethodPage.InstallEngineDialog : Granite.MessageDialog {
+-    private InstallList? engines_filter;
+-
+-    public InstallEngineDialog (Gtk.Window parent) {
+-        Object (
+-            primary_text: _("Choose an engine to install"),
+-            secondary_text: _("Select an engine from the list to install and use."),
+-            image_icon: new ThemedIcon ("extension"),
+-            transient_for: parent,
+-            buttons: Gtk.ButtonsType.CANCEL
+-        );
+-    }
+-
+-    construct {
+-        var languages_list = new Gtk.ListBox () {
+-            activate_on_single_click = true,
+-            expand = true,
+-            selection_mode = Gtk.SelectionMode.NONE
+-        };
+-
+-        foreach (var language in InstallList.get_all ()) {
+-            var lang = new LanguagesRow (language);
+-            languages_list.add (lang);
+-        }
+-
+-        var back_button = new Gtk.Button.with_label (_("Languages")) {
+-            halign = Gtk.Align.START,
+-            margin = 6
+-        };
+-        back_button.get_style_context ().add_class (Granite.STYLE_CLASS_BACK_BUTTON);
+-
+-        var language_title = new Gtk.Label ("");
+-
+-        var language_header = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 6);
+-        language_header.pack_start (back_button);
+-        language_header.set_center_widget (language_title);
+-
+-        var listbox = new Gtk.ListBox () {
+-            expand = true
+-        };
+-        listbox.set_filter_func (filter_function);
+-        listbox.set_sort_func (sort_function);
+-
+-        foreach (var language in InstallList.get_all ()) {
+-            foreach (var engine in language.get_components ()) {
+-                listbox.add (new EnginesRow (engine));
+-            }
+-        }
+-
+-        var scrolled = new Gtk.ScrolledWindow (null, null);
+-        scrolled.add (listbox);
+-
+-        var engine_list_grid = new Gtk.Grid () {
+-            orientation = Gtk.Orientation.VERTICAL
+-        };
+-        engine_list_grid.get_style_context ().add_class (Gtk.STYLE_CLASS_VIEW);
+-        engine_list_grid.add (language_header);
+-        engine_list_grid.add (new Gtk.Separator (Gtk.Orientation.HORIZONTAL));
+-        engine_list_grid.add (scrolled);
+-
+-        var stack = new Gtk.Stack () {
+-            height_request = 200,
+-            width_request = 300,
+-            transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT
+-        };
+-        stack.add (languages_list);
+-        stack.add (engine_list_grid);
+-
+-        var frame = new Gtk.Frame (null);
+-        frame.add (stack);
+-
+-        custom_bin.add (frame);
+-        custom_bin.show_all ();
+-
+-        var install_button = add_button (_("Install"), Gtk.ResponseType.OK);
+-        install_button.sensitive = false;
+-        install_button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+-
+-        languages_list.row_activated.connect ((row) => {
+-            stack.visible_child = engine_list_grid;
+-            language_title.label = ((LanguagesRow) row).language.get_name ();
+-            engines_filter = ((LanguagesRow) row).language;
+-            listbox.invalidate_filter ();
+-            var adjustment = scrolled.get_vadjustment ();
+-            adjustment.set_value (adjustment.lower);
+-        });
+-
+-        back_button.clicked.connect (() => {
+-            stack.visible_child = languages_list;
+-            install_button.sensitive = false;
+-        });
+-
+-        listbox.selected_rows_changed.connect (() => {
+-            foreach (var engines_row in listbox.get_children ()) {
+-                ((EnginesRow) engines_row).selected = false;
+-            }
+-
+-            ((EnginesRow) listbox.get_selected_row ()).selected = true;
+-            install_button.sensitive = true;
+-        });
+-
+-        response.connect ((response_id) => {
+-            if (response_id == Gtk.ResponseType.OK) {
+-                string engine_to_install = ((EnginesRow) listbox.get_selected_row ()).engine_name;
+-                UbuntuInstaller.get_default ().install (engine_to_install);
+-            }
+-        });
+-    }
+-
+-    [CCode (instance_pos = -1)]
+-    private bool filter_function (Gtk.ListBoxRow row) {
+-        if (InstallList.get_language_from_engine_name (((EnginesRow) row).engine_name) == engines_filter) {
+-            return true;
+-        }
+-
+-        return false;
+-    }
+-
+-    [CCode (instance_pos = -1)]
+-    private int sort_function (Gtk.ListBoxRow row1, Gtk.ListBoxRow row2) {
+-        return ((EnginesRow) row1).engine_name.collate (((EnginesRow) row1).engine_name);
+-    }
+-}
+diff --git a/src/Dialogs/ProgressDialog.vala b/src/Dialogs/ProgressDialog.vala
+deleted file mode 100644
+index f110aca..0000000
+--- a/src/Dialogs/ProgressDialog.vala
++++ /dev/null
+@@ -1,82 +0,0 @@
+-/*
+-* Copyright 2011-2020 elementary, Inc. (https://elementary.io)
+-*
+-* This program is free software: you can redistribute it
+-* and/or modify it under the terms of the GNU Lesser General Public License as
+-* published by the Free Software Foundation, either version 3 of the
+-* License, or (at your option) any later version.
+-*
+-* This program is distributed in the hope that it will be
+-* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+-* Public License for more details.
+-*
+-* You should have received a copy of the GNU General Public License along
+-* with this program. If not, see http://www.gnu.org/licenses/.
+-*/
+-
+-public class Pantheon.Keyboard.InputMethodPage.ProgressDialog : Gtk.Dialog {
+-    public int progress {
+-        set {
+-            if (value >= 100) {
+-                destroy ();
+-            }
+-
+-            progress_bar.fraction = value / 100.0;
+-        }
+-    }
+-
+-    private Gtk.ProgressBar progress_bar;
+-
+-    construct {
+-        var image = new Gtk.Image.from_icon_name ("preferences-desktop-locale", Gtk.IconSize.DIALOG) {
+-            valign = Gtk.Align.START
+-        };
+-
+-        var primary_label = new Gtk.Label (null) {
+-            max_width_chars = 50,
+-            wrap = true,
+-            xalign = 0
+-        };
+-        primary_label.get_style_context ().add_class (Granite.STYLE_CLASS_PRIMARY_LABEL);
+-
+-        unowned UbuntuInstaller installer = UbuntuInstaller.get_default ();
+-        switch (installer.transaction_mode) {
+-            case UbuntuInstaller.TransactionMode.INSTALL:
+-                primary_label.label = _("Installing %s").printf (installer.engine_to_address);
+-                break;
+-            case UbuntuInstaller.TransactionMode.REMOVE:
+-                primary_label.label = _("Removing %s").printf (installer.engine_to_address);
+-                break;
+-        }
+-
+-        progress_bar = new Gtk.ProgressBar () {
+-            hexpand = true,
+-            valign = Gtk.Align.START,
+-            width_request = 300
+-        };
+-
+-        var cancel_button = (Gtk.Button) add_button (_("Cancel"), 0);
+-
+-        installer.bind_property ("install-cancellable", cancel_button, "sensitive");
+-
+-        var grid = new Gtk.Grid () {
+-            column_spacing = 12,
+-            margin = 6,
+-            row_spacing = 6
+-        };
+-        grid.attach (image, 0, 0, 1, 2);
+-        grid.attach (primary_label, 1, 0);
+-        grid.attach (progress_bar, 1, 1);
+-        grid.show_all ();
+-
+-        border_width = 6;
+-        deletable = false;
+-        get_content_area ().add (grid);
+-
+-        cancel_button.clicked.connect (() => {
+-            installer.cancel_install ();
+-            destroy ();
+-        });
+-    }
+-}
+diff --git a/src/InputMethod/Installer/InstallList.vala b/src/InputMethod/Installer/InstallList.vala
+deleted file mode 100644
+index 275c302..0000000
+--- a/src/InputMethod/Installer/InstallList.vala
++++ /dev/null
+@@ -1,73 +0,0 @@
+-/*
+-* 2019-2020 elementary, Inc. (https://elementary.io)
+-*
+-* This program is free software: you can redistribute it and/or modify
+-* it under the terms of the GNU General Public License as published by
+-* the Free Software Foundation, either version 3 of the License, or
+-* (at your option) any later version.
+-*
+-* This program is distributed in the hope that it will be useful,
+-* but WITHOUT ANY WARRANTY; without even the implied warranty of
+-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-* GNU General Public License for more details.
+-*
+-* You should have received a copy of the GNU General Public License
+-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
+-*/
+-
+-public enum Pantheon.Keyboard.InputMethodPage.InstallList {
+-    JA,
+-    KO,
+-    ZH;
+-
+-    public string get_name () {
+-        switch (this) {
+-            case JA:
+-                return _("Japanese");
+-            case KO:
+-                return _("Korean");
+-            case ZH:
+-                return _("Chinese");
+-            default:
+-                assert_not_reached ();
+-        }
+-    }
+-
+-    public string[] get_components () {
+-        switch (this) {
+-            case JA:
+-                return { "ibus-anthy", "ibus-mozc", "ibus-skk" };
+-            case KO:
+-                return { "ibus-hangul" };
+-            case ZH:
+-                return { "ibus-cangjie", "ibus-chewing", "ibus-pinyin" };
+-            default:
+-                assert_not_reached ();
+-        }
+-    }
+-
+-    public static InstallList get_language_from_engine_name (string engine_name) {
+-        switch (engine_name) {
+-            case "ibus-anthy":
+-                return JA;
+-            case "ibus-mozc":
+-                return JA;
+-            case "ibus-skk":
+-                return JA;
+-            case "ibus-hangul":
+-                return KO;
+-            case "ibus-cangjie":
+-                return ZH;
+-            case "ibus-chewing":
+-                return ZH;
+-            case "ibus-pinyin":
+-                return ZH;
+-            default:
+-                assert_not_reached ();
+-        }
+-    }
+-
+-    public static InstallList[] get_all () {
+-        return { JA, KO, ZH };
+-    }
+-}
+diff --git a/src/InputMethod/Installer/UbuntuInstaller.vala b/src/InputMethod/Installer/UbuntuInstaller.vala
+deleted file mode 100644
+index b65aa1f..0000000
+--- a/src/InputMethod/Installer/UbuntuInstaller.vala
++++ /dev/null
+@@ -1,142 +0,0 @@
+-/*
+-* Copyright 2011-2020 elementary, Inc. (https://elementary.io)
+-*
+-* This program is free software: you can redistribute it
+-* and/or modify it under the terms of the GNU Lesser General Public License as
+-* published by the Free Software Foundation, either version 3 of the
+-* License, or (at your option) any later version.
+-*
+-* This program is distributed in the hope that it will be
+-* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+-* Public License for more details.
+-*
+-* You should have received a copy of the GNU General Public License along
+-* with this program. If not, see http://www.gnu.org/licenses/.
+-*/
+-
+-public class Pantheon.Keyboard.InputMethodPage.UbuntuInstaller : Object {
+-    private AptdProxy aptd;
+-    private AptdTransactionProxy proxy;
+-
+-    public bool install_cancellable { get; private set; }
+-    public TransactionMode transaction_mode { get; private set; }
+-    public string engine_to_address { get; private set; }
+-
+-    public signal void install_finished (string langcode);
+-    public signal void install_failed ();
+-    public signal void remove_finished (string langcode);
+-    public signal void progress_changed (int progress);
+-
+-    public enum TransactionMode {
+-        INSTALL,
+-        REMOVE,
+-        INSTALL_MISSING,
+-    }
+-
+-    Gee.HashMap<string, string> transactions;
+-
+-    private static GLib.Once<UbuntuInstaller> instance;
+-    public static unowned UbuntuInstaller get_default () {
+-        return instance.once (() => {
+-            return new UbuntuInstaller ();
+-        });
+-    }
+-
+-    private UbuntuInstaller () {}
+-
+-    construct {
+-        transactions = new Gee.HashMap<string, string> ();
+-        aptd = new AptdProxy ();
+-
+-        try {
+-            aptd.connect_to_aptd ();
+-        } catch (Error e) {
+-            warning ("Could not connect to APT daemon");
+-        }
+-    }
+-
+-    public void install (string engine_name) {
+-        transaction_mode = TransactionMode.INSTALL;
+-        engine_to_address = engine_name;
+-        string[] packages = {};
+-        packages += engine_to_address;
+-
+-        foreach (var packet in packages) {
+-            message ("Packet: %s", packet);
+-        }
+-
+-        aptd.install_packages.begin (packages, (obj, res) => {
+-            try {
+-                var transaction_id = aptd.install_packages.end (res);
+-                transactions.@set (transaction_id, "i-" + engine_name);
+-                run_transaction (transaction_id);
+-            } catch (Error e) {
+-                warning ("Could not queue downloads: %s", e.message);
+-            }
+-        });
+-    }
+-
+-    public void cancel_install () {
+-        if (install_cancellable) {
+-            warning ("cancel_install");
+-            try {
+-                proxy.cancel ();
+-            } catch (Error e) {
+-                warning ("cannot cancel installation:%s", e.message);
+-            }
+-        }
+-    }
+-
+-    private void run_transaction (string transaction_id) {
+-        proxy = new AptdTransactionProxy ();
+-        proxy.finished.connect (() => {
+-            on_apt_finshed (transaction_id, true);
+-        });
+-
+-        proxy.property_changed.connect ((prop, val) => {
+-            if (prop == "Progress") {
+-                progress_changed ((int) val.get_int32 ());
+-            }
+-
+-            if (prop == "Cancellable") {
+-                install_cancellable = val.get_boolean ();
+-            }
+-        });
+-
+-        try {
+-            proxy.connect_to_aptd (transaction_id);
+-            proxy.simulate ();
+-
+-            proxy.run ();
+-        } catch (Error e) {
+-            on_apt_finshed (transaction_id, false);
+-            warning ("Could no run transaction: %s", e.message);
+-        }
+-    }
+-
+-    private void on_apt_finshed (string id, bool success) {
+-        if (!success) {
+-            install_failed ();
+-            transactions.unset (id);
+-            return;
+-        }
+-
+-        if (!transactions.has_key (id)) { //transaction already removed
+-            return;
+-        }
+-
+-        var action = transactions.get (id);
+-        var lang = action[2:action.length];
+-
+-        message ("ID %s -> %s", id, success ? "success" : "failed");
+-
+-        if (action[0:1] == "i") { // install
+-            install_finished (lang);
+-        } else {
+-            remove_finished (lang);
+-        }
+-
+-        transactions.unset (id);
+-    }
+-}
+diff --git a/src/InputMethod/Installer/aptd-client.vala b/src/InputMethod/Installer/aptd-client.vala
+deleted file mode 100644
+index ee5c3f5..0000000
+--- a/src/InputMethod/Installer/aptd-client.vala
++++ /dev/null
+@@ -1,93 +0,0 @@
+-/*
+- * Copyright (C) 2012 Canonical Ltd
+- *
+- * This program is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 3 as
+- * published by the Free Software Foundation.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+- *
+- * Authored by Pawel Stolowski <pawel.stolowski@canonical.com>
+- */
+-
+-namespace Pantheon.Keyboard.InputMethodPage {
+-    private const string APTD_DBUS_NAME = "org.debian.apt";
+-    private const string APTD_DBUS_PATH = "/org/debian/apt";
+-
+-    /**
+-    * Expose a subset of org.debian.apt interfaces -- only what's needed by applications lens.
+-    */
+-    [DBus (name = "org.debian.apt")]
+-    public interface AptdService : GLib.Object {
+-        public abstract async string install_packages (string[] packages) throws GLib.Error;
+-        public abstract async string remove_packages (string[] packages) throws GLib.Error;
+-        public abstract async void quit () throws GLib.Error;
+-    }
+-
+-    [DBus (name = "org.debian.apt.transaction")]
+-    public interface AptdTransactionService : GLib.Object {
+-        public abstract void run () throws GLib.Error;
+-        public abstract void simulate () throws GLib.Error;
+-        public abstract void cancel () throws GLib.Error;
+-        public signal void finished (string exit_state);
+-        public signal void property_changed (string property, Variant val);
+-    }
+-
+-    public class AptdProxy : GLib.Object {
+-        private AptdService _aptd_service;
+-
+-        public void connect_to_aptd () throws GLib.Error {
+-            _aptd_service = Bus.get_proxy_sync (BusType.SYSTEM, APTD_DBUS_NAME, APTD_DBUS_PATH);
+-        }
+-
+-        public async string install_packages (string[] packages) throws GLib.Error {
+-            string res = yield _aptd_service.install_packages (packages);
+-            return res;
+-        }
+-
+-        public async string remove_packages (string[] packages) throws GLib.Error {
+-            string res = yield _aptd_service.remove_packages (packages);
+-            return res;
+-        }
+-
+-        public async void quit () throws GLib.Error {
+-            yield _aptd_service.quit ();
+-        }
+-    }
+-
+-    public class AptdTransactionProxy : GLib.Object {
+-        public signal void finished (string transaction_id);
+-        public signal void property_changed (string property, Variant variant);
+-
+-        private AptdTransactionService _aptd_service;
+-
+-        public void connect_to_aptd (string transaction_id) throws GLib.Error {
+-            _aptd_service = Bus.get_proxy_sync (BusType.SYSTEM, APTD_DBUS_NAME, transaction_id);
+-            _aptd_service.finished.connect ((exit_state) => {
+-                debug ("aptd transaction finished: %s\n", exit_state);
+-                finished (transaction_id);
+-            });
+-            _aptd_service.property_changed.connect ((prop, variant) => {
+-                property_changed (prop, variant);
+-            });
+-        }
+-
+-        public void simulate () throws GLib.Error {
+-            _aptd_service.simulate ();
+-        }
+-
+-        public void run () throws GLib.Error {
+-            _aptd_service.run ();
+-        }
+-
+-        public void cancel () throws GLib.Error {
+-            _aptd_service.cancel ();
+-        }
+-    }
+-}
+diff --git a/src/Widgets/InputMethod/AddEnginesPopover.vala b/src/Widgets/InputMethod/AddEnginesPopover.vala
+index 46e005d..6b56c6b 100644
+--- a/src/Widgets/InputMethod/AddEnginesPopover.vala
++++ b/src/Widgets/InputMethod/AddEnginesPopover.vala
+@@ -49,8 +49,6 @@ public class Pantheon.Keyboard.InputMethodPage.AddEnginesPopover : Gtk.Popover {
+         };
+         scrolled.add (listbox);
+ 
+-        var install_button = new Gtk.Button.with_label (_("Install Unlisted Engines…"));
+-
+         var cancel_button = new Gtk.Button.with_label (_("Cancel"));
+ 
+         var add_button = new Gtk.Button.with_label (_("Add Engine"));
+@@ -61,10 +59,8 @@ public class Pantheon.Keyboard.InputMethodPage.AddEnginesPopover : Gtk.Popover {
+             margin = 12,
+             spacing = 6
+         };
+-        button_box.add (install_button);
+         button_box.add (cancel_button);
+         button_box.add (add_button);
+-        button_box.set_child_secondary (install_button, true);
+ 
+         var grid = new Gtk.Grid ();
+         grid.attach (search_entry, 0, 0);
+@@ -92,14 +88,6 @@ public class Pantheon.Keyboard.InputMethodPage.AddEnginesPopover : Gtk.Popover {
+             listbox.invalidate_filter ();
+         });
+ 
+-        install_button.clicked.connect (() => {
+-            popdown ();
+-
+-            var install_dialog = new InstallEngineDialog ((Gtk.Window) get_toplevel ());
+-            install_dialog.run ();
+-            install_dialog.destroy ();
+-        });
+-
+         cancel_button.clicked.connect (() => {
+             popdown ();
+         });
+diff --git a/src/Widgets/InputMethod/LanguagesRow.vala b/src/Widgets/InputMethod/LanguagesRow.vala
+deleted file mode 100644
+index dc064ae..0000000
+--- a/src/Widgets/InputMethod/LanguagesRow.vala
++++ /dev/null
+@@ -1,43 +0,0 @@
+-/*
+-* 2019-2020 elementary, Inc. (https://elementary.io)
+-*
+-* This program is free software: you can redistribute it and/or modify
+-* it under the terms of the GNU General Public License as published by
+-* the Free Software Foundation, either version 3 of the License, or
+-* (at your option) any later version.
+-*
+-* This program is distributed in the hope that it will be useful,
+-* but WITHOUT ANY WARRANTY; without even the implied warranty of
+-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-* GNU General Public License for more details.
+-*
+-* You should have received a copy of the GNU General Public License
+-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
+-*/
+-
+-public class Pantheon.Keyboard.InputMethodPage.LanguagesRow : Gtk.ListBoxRow {
+-    public InstallList language { get; construct; }
+-
+-    public LanguagesRow (InstallList language) {
+-        Object (language: language);
+-    }
+-
+-    construct {
+-        var label = new Gtk.Label (language.get_name ()) {
+-            halign = Gtk.Align.START,
+-            hexpand = true
+-        };
+-
+-        var caret = new Gtk.Image.from_icon_name ("pan-end-symbolic", Gtk.IconSize.MENU);
+-
+-        var grid = new Gtk.Grid () {
+-            margin = 3,
+-            margin_start = 6,
+-            margin_end = 6
+-        };
+-        grid.add (label);
+-        grid.add (caret);
+-
+-        add (grid);
+-    }
+-}
+diff --git a/src/meson.build b/src/meson.build
+index 28f07c1..a515419 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -16,7 +16,6 @@ plug_files = files(
+     'Widgets/Shortcuts/CustomTree.vala',
+     'Widgets/Layout/Display.vala',
+     'Widgets/Layout/AddLayoutPopover.vala',
+-    'Widgets/InputMethod/LanguagesRow.vala',
+     'Widgets/InputMethod/EnginesRow.vala',
+     'Widgets/InputMethod/AddEnginesPopover.vala',
+     'Views/Shortcuts.vala',
+@@ -36,11 +35,6 @@ plug_files = files(
+     'Layout/AdvancedSettingsGrid.vala',
+     'InputMethod/Utils.vala',
+     'InputMethod/AddEnginesList.vala',
+-    'InputMethod/Installer/UbuntuInstaller.vala',
+-    'InputMethod/Installer/InstallList.vala',
+-    'InputMethod/Installer/aptd-client.vala',
+-    'Dialogs/ProgressDialog.vala',
+-    'Dialogs/InstallEngineDialog.vala',
+     'Dialogs/ConflictDialog.vala',
+ )
+ 
+
+base-commit: 9d9eddeb7da8450a309496c25066f4f78a9d4070
+-- 
+git-series 0.9.1
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix
new file mode 100644
index 000000000000..06bdce19f45c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/keyboard/default.nix
@@ -0,0 +1,68 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, fetchpatch
+, substituteAll
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, libxml2
+, libgnomekbd
+, libxklavier
+, xorg
+, ibus
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-keyboard";
+  version = "2.4.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-iuv5NZ7v+rXyFsKB/PvGa/7hm9MIV8E6JnTzEGROlhM=";
+  };
+
+  patches = [
+    ./0001-Remove-Install-Unlisted-Engines-function.patch
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    ibus
+    libgee
+    libgnomekbd
+    libxklavier
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Keyboard Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-keyboard";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix
new file mode 100644
index 000000000000..67eeee584a69
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/mouse-touchpad/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+, elementary-settings-daemon
+, glib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-mouse-touchpad";
+  version = "2.4.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-WJ/GRhZsSwC31HEIjHHWBy9/Skqbwor0tNVTedue3kk=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    glib
+    granite
+    gtk3
+    libgee
+    elementary-settings-daemon
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Mouse & Touchpad Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-mouse-touchpad";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix
new file mode 100644
index 000000000000..fce9402e131f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, substituteAll
+, vala
+, libgee
+, granite
+, gtk3
+, networkmanager
+, networkmanagerapplet
+, libnma
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-network";
+  version = "2.3.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-PYgewxBblhOfOJQSeRaq8xD7qZ3083EvgUjpi92FqyI=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    networkmanager
+    libnma
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit networkmanagerapplet;
+    })
+  ];
+
+
+  meta = with lib; {
+    description = "Switchboard Networking Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-network";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/fix-paths.patch
new file mode 100644
index 000000000000..b99f59fb2684
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/network/fix-paths.patch
@@ -0,0 +1,26 @@
+diff --git a/src/Views/VPNPage.vala b/src/Views/VPNPage.vala
+index ba9dc22..a12871a 100644
+--- a/src/Views/VPNPage.vala
++++ b/src/Views/VPNPage.vala
+@@ -264,7 +264,7 @@ public class Network.VPNPage : Network.Widgets.Page {
+     private void try_connection_editor (string args) {
+         try {
+             var appinfo = AppInfo.create_from_commandline (
+-                "nm-connection-editor %s".printf (args),
++                "@networkmanagerapplet@/bin/nm-connection-editor %s".printf (args),
+                 null,
+                 GLib.AppInfoCreateFlags.NONE
+             );
+diff --git a/src/Widgets/SettingsButton.vala b/src/Widgets/SettingsButton.vala
+index 5849b69..7bbd172 100644
+--- a/src/Widgets/SettingsButton.vala
++++ b/src/Widgets/SettingsButton.vala
+@@ -55,7 +55,7 @@ public class Network.Widgets.SettingsButton : Gtk.Button {
+         clicked.connect (() => {
+             try {
+                 var appinfo = AppInfo.create_from_commandline (
+-                    "nm-connection-editor %s".printf (args), null, AppInfoCreateFlags.NONE
++                    "@networkmanagerapplet@/bin/nm-connection-editor %s".printf (args), null, AppInfoCreateFlags.NONE
+                 );
+ 
+                 appinfo.launch (null, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix
new file mode 100644
index 000000000000..8c750710aed9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/notifications/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+, elementary-notifications
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-notifications";
+  version = "2.1.7";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-MBCSQ+4l0mpS2OTDRJ7+91qo0SWm5nJNYO7SZaSoVQk=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    elementary-notifications
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Notifications Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-notifications";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix
new file mode 100644
index 000000000000..ef12cb38e1b9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/onlineaccounts/default.nix
@@ -0,0 +1,86 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala_0_46
+, libgee
+, granite
+, gtk3
+, libaccounts-glib
+, libsignon-glib
+, json-glib
+, librest
+, webkitgtk
+, libsoup
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-onlineaccounts";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-CVYKcRty5bBEMNyoY51JAJQy6uh+U+7IvS6V/1GMCA4=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala_0_46
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    json-glib
+    libaccounts-glib
+    libgee
+    libsignon-glib
+    libsoup
+    librest
+    switchboard
+    webkitgtk
+  ];
+
+  patches = [
+    # Fix build with latest vala
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-onlineaccounts/commit/5fa2882f765076d20c6ef4886198a34a05159f8a.patch";
+      sha256 = "1szryyy7shdmbvx9yhpi0bhzaayg7hl6pq2c456j1qf9kfv0m4hf";
+    })
+
+    # fix build with vala 0.48.9
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-onlineaccounts/commit/b1853b7427102b8dd94774e1e2cc455f50902263.patch";
+      sha256 = "J3C71GyEHEZWSghGXlwXPHFJRhrvx6i0yvi8NIDb4WE=";
+    })
+  ];
+
+  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 lib; {
+    description = "Switchboard Online Accounts Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-onlineaccounts";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix
new file mode 100644
index 000000000000..97668d35471a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/pantheon-shell/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, fetchFromGitHub, nix-update-script, pantheon, meson, ninja, pkg-config, vala, glib
+, libgee, granite, gexiv2, elementary-settings-daemon, gtk3, gnome-desktop
+, gala, wingpanel, elementary-dock, switchboard, gettext, bamf, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-pantheon-shell";
+  version = "2.8.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-CHl+4mVjrDg2gusrWOCfI++DZMWKLdvHxG3ZWMjZ2to=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    bamf
+    elementary-dock
+    elementary-settings-daemon
+    gala
+    gexiv2
+    glib
+    gnome-desktop
+    granite
+    gtk3
+    libgee
+    switchboard
+    wingpanel
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Desktop Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-pantheon-shell";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix
new file mode 100644
index 000000000000..f0cf47cfdfea
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/default.nix
@@ -0,0 +1,71 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, substituteAll
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, elementary-dpms-helper
+, elementary-settings-daemon
+, granite
+, gtk3
+, glib
+, dbus
+, polkit
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-power";
+  version = "2.4.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-swcbkaHHe9BZxMWvjdRutvYfXXrSCUJWuld1btfYeH0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    dbus
+    elementary-dpms-helper
+    elementary-settings-daemon
+    glib
+    granite
+    gtk3
+    libgee
+    polkit
+    switchboard
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./dpms-helper-exec.patch;
+      elementary_dpms_helper = elementary-dpms-helper;
+    })
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Power Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-power";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch
new file mode 100644
index 000000000000..335d3f296262
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/power/dpms-helper-exec.patch
@@ -0,0 +1,13 @@
+diff --git a/src/MainView.vala b/src/MainView.vala
+index 1654e68..175f220 100644
+--- a/src/MainView.vala
++++ b/src/MainView.vala
+@@ -317,7 +317,7 @@ public class Power.MainView : Gtk.Grid {
+
+     private static void run_dpms_helper () {
+         try {
+-            string[] argv = { "io.elementary.dpms-helper" };
++            string[] argv = { "@elementary_dpms_helper@/bin/io.elementary.dpms-helper" };
+             Process.spawn_async (null, argv, Environ.get (),
+                 SpawnFlags.SEARCH_PATH | SpawnFlags.STDERR_TO_DEV_NULL | SpawnFlags.STDOUT_TO_DEV_NULL,
+                 null, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
new file mode 100644
index 000000000000..7387ea34e4de
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/printers/default.nix
@@ -0,0 +1,65 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, cups
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-printers";
+  version = "2.1.9";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-tnAJyyPN/Xy1pmlgBpgO2Eb5CeHrRltjQTHmuTPBt8s=";
+  };
+
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-printers/commit/5eced5ddda6f229d7265ea0a713f6c1cd181a526.patch";
+      sha256 = "lPTNqka6jjvv1JnAqVzVIQBIdDXlCOQ5ASvgZNuEUC8=";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    cups
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Printers Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-printers";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
new file mode 100644
index 000000000000..26e26de33b12
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/security-privacy/default.nix
@@ -0,0 +1,78 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pantheon
+, meson
+, python3
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, glib
+, polkit
+, zeitgeist
+, switchboard
+, lightlocker
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-security-privacy";
+  version = "2.2.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-Sws6FqUL7QAROInDrcqYAp6j1TCC4aGV0/hi5Kmm5wQ=";
+  };
+
+  patches = [
+    # Fix build with latest Vala.
+    (fetchpatch {
+      url = "https://github.com/elementary/switchboard-plug-security-privacy/commit/c8e422e630bbee0badcf4df26364c9e83e06bad0.patch";
+      sha256 = "5Gm+muZiCraJC5JaGVVo0HDJ7KxjOpclHRW1RKsk3bc=";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    glib
+    granite
+    gtk3
+    libgee
+    polkit
+    switchboard
+    lightlocker
+    zeitgeist
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Switchboard Security & Privacy Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-security-privacy";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix
new file mode 100644
index 000000000000..6baaed293c9f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sharing/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-sharing";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-/M60w14zfAUXspabvTUWlOPRrHvKtCYUio82b034k6s=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Sharing Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-sharing";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix
new file mode 100644
index 000000000000..10117dd8f957
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard-plugs/sound/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, libgee
+, granite
+, gtk3
+, pulseaudio
+, libcanberra
+, libcanberra-gtk3
+, switchboard
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard-plug-sound";
+  version = "2.2.5";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-ITgxLZSB4zhSaFKX7Vbf89DGI8ibIcGEQTtLjcGN2tA=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libcanberra
+    libcanberra-gtk3
+    libgee
+    pulseaudio
+    switchboard
+  ];
+
+  meta = with lib; {
+    description = "Switchboard Sound Plug";
+    homepage = "https://github.com/elementary/switchboard-plug-sound";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix
new file mode 100644
index 000000000000..d0b56d7456af
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, libgee
+, granite
+, gettext
+, clutter-gtk
+, elementary-icon-theme
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "switchboard";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-N3WZysLIah40kcyIyhryZpm2FxCmlvp0EB1krZ/IsYs=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    clutter-gtk
+    elementary-icon-theme
+    granite
+    gtk3
+    libgee
+  ];
+
+  patches = [
+    ./plugs-path-env.patch
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Extensible System Settings app for Pantheon";
+    homepage = "https://github.com/elementary/switchboard";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch
new file mode 100644
index 000000000000..d5931d59ec9a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/plugs-path-env.patch
@@ -0,0 +1,21 @@
+diff --git a/lib/PlugsManager.vala b/lib/PlugsManager.vala
+index 8b21e7b..bc36321 100644
+--- a/lib/PlugsManager.vala
++++ b/lib/PlugsManager.vala
+@@ -36,7 +36,15 @@ public class Switchboard.PlugsManager : GLib.Object {
+ 
+     private PlugsManager () {
+         plugs = new Gee.LinkedList<Switchboard.Plug> ();
+-        var base_folder = File.new_for_path (Build.PLUGS_DIR);
++
++        var plugs_path = Environment.get_variable("SWITCHBOARD_PLUGS_PATH");
++        if (plugs_path != null) {
++            debug ("SWITCHBOARD_PLUGS_PATH set to %s", plugs_path);
++        } else {
++            critical ("SWITCHBOARD_PLUGS_PATH not set");
++        }
++
++        var base_folder = File.new_for_path (plugs_path);
+         find_plugins (base_folder);
+     }
+ 
diff --git a/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix
new file mode 100644
index 000000000000..7953105951c6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/apps/switchboard/wrapper.nix
@@ -0,0 +1,62 @@
+{ wrapGAppsHook
+, glib
+, lib
+, stdenv
+, xorg
+, switchboard
+, switchboardPlugs
+, plugs
+  # Only useful to disable for development testing.
+, useDefaultPlugs ? true
+, testName ? null
+}:
+
+let
+  selectedPlugs =
+    if plugs == null then switchboardPlugs
+    else plugs ++ (lib.optionals useDefaultPlugs switchboardPlugs);
+
+  testingName = lib.optionalString (testName != null) "${testName}-";
+in
+stdenv.mkDerivation rec {
+  name = "${testingName}${switchboard.name}-with-plugs";
+
+  src = null;
+
+  paths = [
+    switchboard
+  ] ++ selectedPlugs;
+
+  passAsFile = [ "paths" ];
+
+  nativeBuildInputs = [
+    glib
+    wrapGAppsHook
+  ];
+
+  buildInputs = lib.forEach selectedPlugs (x: x.buildInputs)
+    ++ selectedPlugs;
+
+  dontUnpack = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  preferLocalBuild = true;
+  allowSubstitutes = false;
+
+  installPhase = ''
+    mkdir -p $out
+    for i in $(cat $pathsPath); do
+      ${xorg.lndir}/bin/lndir -silent $i $out
+    done
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --set SWITCHBOARD_PLUGS_PATH "$out/lib/switchboard"
+    )
+  '';
+
+  inherit (switchboard) meta;
+}
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix
new file mode 100644
index 000000000000..437f37941220
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-gtk-theme/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, gettext
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-gtk-theme";
+  version = "5.4.2";
+
+  repoName = "stylesheet";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-eE0/LLdnpxOpBvdpioGKV/DOQ5lIuQt9dPnhGkQDGCs=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+  ];
+
+  meta = with lib; {
+    description = "GTK theme designed to be smooth, attractive, fast, and usable";
+    homepage = "https://github.com/elementary/stylesheet";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
new file mode 100644
index 000000000000..55935b2ee0e0
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-icon-theme/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, python3
+, ninja
+, hicolor-icon-theme
+, gtk3
+, xorg
+, librsvg
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-icon-theme";
+  version = "5.3.1";
+
+  repoName = "icons";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-6XFzjpuHpGIZ+azkPuFcSF7p66sDonwLwjvlNBZDRmc=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gtk3
+    librsvg
+    meson
+    ninja
+    python3
+    xorg.xcursorgen
+  ];
+
+  propagatedBuildInputs = [
+    hicolor-icon-theme
+  ];
+
+  dontDropIconThemeCache = true;
+
+  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 lib; {
+    description = "Named, vector icons for elementary OS";
+    longDescription = ''
+      An original set of vector icons designed specifically for elementary OS and its desktop environment: Pantheon.
+    '';
+    homepage = "https://github.com/elementary/icons";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-redacted-script/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-redacted-script/default.nix
new file mode 100644
index 000000000000..6a9d1b0aca36
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-redacted-script/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, fetchFromGitHub
+, pantheon
+}:
+
+stdenv.mkDerivation {
+  pname = "elementary-redacted-script";
+  version = "unstable-2016-06-03";
+
+  src = fetchFromGitHub {
+    owner = "png2378";
+    repo = "redacted-elementary";
+    rev = "346440ff9ce19465e6d5c3d6d67a8573f992c746";
+    sha256 = "1jpd13sxkarclr0mlm66wzgpjh52ghzjzn4mywhyshyyskwn7jg1";
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/fonts/truetype/redacted-elementary
+    cp -a truetype/*.ttf $out/share/fonts/truetype/redacted-elementary
+  '';
+
+  meta = with lib; {
+    description = "Font for concealing text";
+    homepage = "https://github.com/png2378/redacted-elementary";
+    license = licenses.ofl;
+    maintainers = pantheon.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix
new file mode 100644
index 000000000000..a89ea19079ed
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-sound-theme/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-sound-theme";
+  version = "1.0";
+
+  repoName = "sound-theme";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-v8ludbPCJaMHCxuzjZchTJwpGiF6UJlVMIMFg+lAhbU=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "A set of system sounds for elementary";
+    homepage = "https://github.com/elementary/sound-theme";
+    license = licenses.unlicense;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix
new file mode 100644
index 000000000000..3e4e64d73012
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/artwork/elementary-wallpapers/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, gettext
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-wallpapers";
+  version = "5.5.0";
+
+  repoName = "wallpapers";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-Q5sYDXqFhiTu8nABmyND3L8bIXd1BJ3GZQ9TL3SzwzA=";
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Collection of wallpapers for elementary";
+    homepage = "https://github.com/elementary/wallpapers";
+    license = licenses.publicDomain;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/default.nix b/nixpkgs/pkgs/desktops/pantheon/default.nix
new file mode 100644
index 000000000000..5ff368a642ed
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/default.nix
@@ -0,0 +1,207 @@
+{ config, pkgs, lib, gnome }:
+
+
+lib.makeScope pkgs.newScope (self: with self; {
+
+  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
+  ];
+
+  maintainers = with pkgs.lib.maintainers; [ ];
+
+  mutter = pkgs.gnome.mutter334;
+
+  elementary-gsettings-schemas = callPackage ./desktop/elementary-gsettings-schemas { };
+
+  notes-up = pkgs.notes-up.override { withPantheon = true; };
+
+  #### APPS
+
+  appcenter = callPackage ./apps/appcenter { };
+
+  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-dock = callPackage ./apps/elementary-dock { };
+
+  elementary-files = callPackage ./apps/elementary-files { };
+
+  elementary-feedback = callPackage ./apps/elementary-feedback { };
+
+  elementary-mail = callPackage ./apps/elementary-mail { };
+
+  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 { };
+
+  sideload = callPackage ./apps/sideload { };
+
+  #### DESKTOP
+
+  elementary-default-settings = callPackage ./desktop/elementary-default-settings { };
+
+  elementary-greeter = callPackage ./desktop/elementary-greeter { };
+
+  elementary-onboarding = callPackage ./desktop/elementary-onboarding { };
+
+  elementary-print-shim = callPackage ./desktop/elementary-print-shim { };
+
+  elementary-session-settings = callPackage ./desktop/elementary-session-settings {
+    inherit (gnome) gnome-session gnome-keyring;
+  };
+
+  elementary-shortcut-overlay = callPackage ./desktop/elementary-shortcut-overlay { };
+
+  extra-elementary-contracts = callPackage ./desktop/extra-elementary-contracts {
+    inherit (gnome) file-roller gnome-bluetooth;
+  };
+
+  gala = callPackage ./desktop/gala {
+    inherit (gnome) gnome-desktop;
+  };
+
+  wingpanel = callPackage ./desktop/wingpanel { };
+
+  wingpanel-with-indicators = callPackage ./desktop/wingpanel/wrapper.nix {
+    indicators = null;
+  };
+
+  #### LIBRARIES
+
+  granite = callPackage ./granite { };
+
+  #### SERVICES
+
+  contractor = callPackage ./services/contractor { };
+
+  elementary-capnet-assist = callPackage ./services/elementary-capnet-assist { };
+
+  elementary-dpms-helper = callPackage ./services/elementary-dpms-helper { };
+
+  elementary-notifications = callPackage ./services/elementary-notifications { };
+
+  # 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 (gnome) gnome-desktop;
+  };
+
+  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 { };
+
+  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 { };
+
+  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 (gnome) 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-redacted-script = callPackage ./artwork/elementary-redacted-script { };
+
+  elementary-sound-theme = callPackage ./artwork/elementary-sound-theme { };
+
+  elementary-wallpapers = callPackage ./artwork/elementary-wallpapers { };
+
+} // lib.optionalAttrs (config.allowAliases or true) {
+
+  ### ALIASES
+
+  inherit (pkgs) vala; # added 2019-10-10
+
+  cerbere = throw "Cerbere is now obsolete https://github.com/elementary/cerbere/releases/tag/2.5.1.";
+
+})
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/0001-Build-with-Meson.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/0001-Build-with-Meson.patch
new file mode 100644
index 000000000000..3a0b3812450c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/0001-Build-with-Meson.patch
@@ -0,0 +1,309 @@
+From f728ac670d8f6bb7600a007d92034b711471fab6 Mon Sep 17 00:00:00 2001
+From: worldofpeace <worldofpeace@protonmail.ch>
+Date: Sat, 13 Jul 2019 19:06:20 -0400
+Subject: [PATCH 1/2] Build with Meson
+
+Has the following meson build options:
+* default-wallpaper
+* plank-dockitems
+* default-gsettings-overrides
+
+All default to true.
+
+We also split the default-settings gsettings override into another that
+only sets plank's default dockitems. This is installed when plank-dockitems
+is true. We need to have this because those settings are dependent on
+those dockitems actually being installed and we have it optional.
+---
+ accountsservice/create-symlink.py             |  24 ++++++
+ accountsservice/meson.build                   |  25 ++++++
+ .../appcenter.blacklist                       |   0
+ .../default-testpage.pdf                      | Bin
+ settings.ini => gtk/settings.ini              |   0
+ .inputrc => inputrc/.inputrc                  |   0
+ meson.build                                   |  79 ++++++++++++++++++
+ meson/post_install.py                         |  12 +++
+ meson_options.txt                             |  14 ++++
+ ...e => default-settings.gschema.override.in} |   3 +-
+ overrides/meson.build                         |  21 +++++
+ overrides/plank-dockitems.gschema.override    |   2 +
+ .../sessioninstaller.desktop                  |   0
+ 13 files changed, 178 insertions(+), 2 deletions(-)
+ create mode 100644 accountsservice/create-symlink.py
+ create mode 100644 accountsservice/meson.build
+ rename appcenter.blacklist => appcenter/appcenter.blacklist (100%)
+ rename default-testpage.pdf => cups/default-testpage.pdf (100%)
+ rename settings.ini => gtk/settings.ini (100%)
+ rename .inputrc => inputrc/.inputrc (100%)
+ create mode 100644 meson.build
+ create mode 100755 meson/post_install.py
+ create mode 100644 meson_options.txt
+ rename overrides/{default-settings.gschema.override => default-settings.gschema.override.in} (92%)
+ create mode 100644 overrides/meson.build
+ create mode 100644 overrides/plank-dockitems.gschema.override
+ rename sessioninstaller.desktop => sessioninstaller/sessioninstaller.desktop (100%)
+
+diff --git a/accountsservice/create-symlink.py b/accountsservice/create-symlink.py
+new file mode 100644
+index 0000000..e502134
+--- /dev/null
++++ b/accountsservice/create-symlink.py
+@@ -0,0 +1,24 @@
++#!/usr/bin/env python3
++
++import os
++import sys
++
++if len(sys.argv) < 3:
++    print('Usage: create-symlink.py SOURCE DESTINATION')
++    sys.exit(1)
++
++src = sys.argv[1]
++dest = sys.argv[2]
++
++if 'MESON_INSTALL_DESTDIR_PREFIX' in os.environ:
++    src = os.path.join(os.environ['MESON_INSTALL_DESTDIR_PREFIX'], src)
++    dest = os.path.join(os.environ['MESON_INSTALL_DESTDIR_PREFIX'], dest)
++
++if os.path.isabs(src):
++    src = os.path.relpath(src, os.path.dirname(os.path.realpath(dest)))
++
++if not os.path.exists(dest):
++    print('Creating symbolic link: ' + dest + ' -> ' + src)
++    if not os.path.exists(os.path.dirname(dest)):
++        os.makedirs(os.path.dirname(dest))
++    os.symlink(src, dest)
+diff --git a/accountsservice/meson.build b/accountsservice/meson.build
+new file mode 100644
+index 0000000..6d18459
+--- /dev/null
++++ b/accountsservice/meson.build
+@@ -0,0 +1,25 @@
++dbus_dep = dependency('dbus-1')
++dbus_interfaces_dir = dbus_dep.get_pkgconfig_variable('interfaces_dir', define_variable: ['datadir', datadir])
++
++install_data(
++    'io.elementary.pantheon.AccountsService.xml',
++    install_dir: dbus_interfaces_dir
++)
++
++
++polkit_dep = dependency('polkit-gobject-1')
++polkit_actiondir = polkit_dep.get_pkgconfig_variable('actiondir', define_variable: ['prefix', prefix])
++
++install_data(
++    'io.elementary.pantheon.AccountsService.policy',
++    install_dir: polkit_actiondir
++)
++
++act_dep = dependency('accountsservice')
++act_interfacesdir = act_dep.get_pkgconfig_variable('interfacesdir', define_variable: ['datadir', datadir])
++
++meson.add_install_script(
++    'create-symlink.py',
++    join_paths(dbus_interfaces_dir, 'io.elementary.pantheon.AccountsService.xml'),
++    join_paths(act_interfacesdir, 'io.elementary.pantheon.AccountsService.xml'),
++)
+diff --git a/appcenter.blacklist b/appcenter/appcenter.blacklist
+similarity index 100%
+rename from appcenter.blacklist
+rename to appcenter/appcenter.blacklist
+diff --git a/default-testpage.pdf b/cups/default-testpage.pdf
+similarity index 100%
+rename from default-testpage.pdf
+rename to cups/default-testpage.pdf
+diff --git a/settings.ini b/gtk/settings.ini
+similarity index 100%
+rename from settings.ini
+rename to gtk/settings.ini
+diff --git a/.inputrc b/inputrc/.inputrc
+similarity index 100%
+rename from .inputrc
+rename to inputrc/.inputrc
+diff --git a/meson.build b/meson.build
+new file mode 100644
+index 0000000..7740a34
+--- /dev/null
++++ b/meson.build
+@@ -0,0 +1,79 @@
++project(
++    'elementary-default-settings',
++    version: '5.1.0',
++    default_options: 'sysconfdir=/etc',
++)
++
++prefix = get_option('prefix')
++datadir = join_paths(prefix, get_option('datadir'))
++sysconfdir = get_option('sysconfdir')
++
++meson.add_install_script('meson/post_install.py', datadir)
++
++# Planks Default DockItems
++if get_option('plank-dockitems')
++    install_subdir(
++        'plank',
++        install_dir: join_paths(sysconfdir, 'skel', '.config')
++    )
++endif
++
++# Setup system wide global environment for applications
++install_subdir(
++    'profile.d',
++    install_dir: join_paths(sysconfdir, 'profile.d'),
++    strip_directory : true
++)
++
++# elementary Plymouth Theme
++install_subdir(
++    'plymouth/elementary',
++    install_dir: join_paths(datadir, 'plymouth', 'themes')
++)
++
++install_data(
++    'plymouth/ubuntu-text.plymouth',
++    install_dir: join_paths(datadir, 'plymouth', 'themes')
++)
++
++# Sudo password feedback in terminals
++install_data(
++    'sudoers.d/pwfeedback',
++    install_dir: join_paths(sysconfdir, 'sudoers.d')
++)
++
++# CUPS Printing testpage
++install_data(
++    'cups/default-testpage.pdf',
++    install_dir: join_paths(datadir, 'cups', 'data')
++)
++
++# GTK3 Settings
++install_data(
++    'gtk/settings.ini',
++    install_dir: join_paths(sysconfdir, 'gtk-3.0')
++)
++
++# So SessionInstaller can have an Icon
++install_data(
++    'sessioninstaller/sessioninstaller.desktop',
++    install_dir: join_paths(datadir, 'applications')
++)
++
++# Default Appcenter Blacklist
++install_data(
++    'appcenter/appcenter.blacklist',
++    install_dir: join_paths(sysconfdir, 'appcenter')
++)
++
++# Configuration file of GNU readline
++install_data(
++    'inputrc/.inputrc',
++    install_dir: join_paths(sysconfdir, 'skel')
++)
++
++# Default gsettings overrides
++subdir('overrides')
++
++# AccountsService extension for Greeter.
++subdir('accountsservice')
+diff --git a/meson/post_install.py b/meson/post_install.py
+new file mode 100755
+index 0000000..c6b5617
+--- /dev/null
++++ b/meson/post_install.py
+@@ -0,0 +1,12 @@
++#!/usr/bin/env python3
++
++import os
++import sys
++import subprocess
++
++if 'DESTDIR' not in os.environ:
++    default_settings_datadir = sys.argv[1]
++
++    print('Compiling GSettings schemas...')
++    subprocess.call(['glib-compile-schemas',
++                    os.path.join(default_settings_datadir, 'glib-2.0', 'schemas')])
+diff --git a/meson_options.txt b/meson_options.txt
+new file mode 100644
+index 0000000..8fd19ba
+--- /dev/null
++++ b/meson_options.txt
+@@ -0,0 +1,14 @@
++option('default-wallpaper',
++       type: 'string',
++       value: '/usr/share/backgrounds/elementaryos-default',
++       description: 'Path to default wallpaper to use in Pantheon.')
++
++option('plank-dockitems',
++       type: 'boolean',
++       value: true,
++       description: 'Install default Pantheon Plank dockitems')
++
++option('default-gsettings-overrides',
++       type: 'boolean',
++       value: true,
++       description: 'Install default Pantheon GSettings Overrides')
+diff --git a/overrides/default-settings.gschema.override b/overrides/default-settings.gschema.override.in
+similarity index 92%
+rename from overrides/default-settings.gschema.override
+rename to overrides/default-settings.gschema.override.in
+index 1aef29c..69d272b 100644
+--- a/overrides/default-settings.gschema.override
++++ b/overrides/default-settings.gschema.override.in
+@@ -1,5 +1,4 @@
+ [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']
+ hide-delay=250
+ hide-mode='window-dodge'
+ show-dock-item=false
+@@ -11,7 +10,7 @@ triggers=['<Control>space']
+ [org.gnome.desktop.background]
+ draw-background=true
+ picture-options='zoom'
+-picture-uri='file:///usr/share/backgrounds/elementaryos-default'
++picture-uri='file://@DEFAULT_WALLPAPER@'
+ primary-color='#000000'
+ show-desktop-icons=false
+ 
+diff --git a/overrides/meson.build b/overrides/meson.build
+new file mode 100644
+index 0000000..ad80644
+--- /dev/null
++++ b/overrides/meson.build
+@@ -0,0 +1,21 @@
++if get_option('default-gsettings-overrides')
++    default_wallpaper = get_option('default-wallpaper')
++
++    wallpaper_configuration = configuration_data()
++    wallpaper_configuration.set('DEFAULT_WALLPAPER', default_wallpaper)
++
++    settings_override = configure_file(
++        input: 'default-settings.gschema.override.in',
++        output: '@BASENAME@',
++        configuration: wallpaper_configuration,
++        install_dir: join_paths(datadir, 'glib-2.0', 'schemas')
++    )
++endif
++
++# Install conditionally because it's dependent on our dockitems being installed
++if get_option('plank-dockitems')
++    install_data(
++        'plank-dockitems.gschema.override',
++        install_dir: join_paths(datadir, 'glib-2.0', 'schemas')
++    )
++endif
+diff --git a/overrides/plank-dockitems.gschema.override b/overrides/plank-dockitems.gschema.override
+new file mode 100644
+index 0000000..72b38d4
+--- /dev/null
++++ b/overrides/plank-dockitems.gschema.override
+@@ -0,0 +1,2 @@
++[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']
+diff --git a/sessioninstaller.desktop b/sessioninstaller/sessioninstaller.desktop
+similarity index 100%
+rename from sessioninstaller.desktop
+rename to sessioninstaller/sessioninstaller.desktop
+-- 
+2.23.0
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
new file mode 100644
index 000000000000..982502f51612
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
@@ -0,0 +1,108 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, nixos-artwork
+, glib
+, pkg-config
+, dbus
+, polkit
+, accountsservice
+, python3
+, fetchpatch
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-default-settings";
+  version = "5.1.2";
+
+  repoName = "default-settings";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-HKrDs2frEWVPpwyGNP+NikrjyplSXJj1hFMLy6kK4wM=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  patches = [
+    # Use new notifications
+    (fetchpatch {
+      url = "https://github.com/elementary/default-settings/commit/0658bb75b9f49f58b35746d05fb6c4b811f125e9.patch";
+      sha256 = "0wa7iq0vfp2av5v23w94a5844ddj4g48d4wk3yrp745dyrimg739";
+    })
+
+    # Fix media key syntax
+    (fetchpatch {
+      url = "https://github.com/elementary/default-settings/commit/332aefe1883be5dfe90920e165c39e331a53b2ea.patch";
+      sha256 = "0ypcaga55pw58l30srq3ga1mhz2w6hkwanv41jjr6g3ia9jvq69n";
+    })
+
+    # https://github.com/elementary/default-settings/pull/119
+    ./0001-Build-with-Meson.patch
+  ];
+
+  nativeBuildInputs = [
+    accountsservice
+    dbus
+    glib # polkit requires
+    meson
+    ninja
+    pkg-config
+    polkit
+    python3
+  ];
+
+  mesonFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+    "-Ddefault-wallpaper=${nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}"
+    "-Dplank-dockitems=false"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  preInstall = ''
+    # Install our override for plank dockitems.
+    # This is because we don't have Pantheon's mail or Appcenter.
+    # See: https://github.com/NixOS/nixpkgs/issues/58161
+    schema_dir=$out/share/glib-2.0/schemas
+    install -D ${./overrides/plank-dockitems.gschema.override} $schema_dir/plank-dockitems.gschema.override
+
+    # Our launchers that use paths at /run/current-system/sw/bin
+    mkdir -p $out/etc/skel/.config/plank/dock1
+    cp -avr ${./launchers} $out/etc/skel/.config/plank/dock1/launchers
+
+    # Whitelist wingpanel indicators to be used in the greeter
+    # hhttps://github.com/elementary/greeter/blob/fc19752f147c62767cd2097c0c0c0fcce41e5873/debian/io.elementary.greeter.whitelist
+    # wingpanel 2.3.2 renamed this to .allowed to .forbidden
+    # https://github.com/elementary/wingpanel/pull/326
+    install -D ${./io.elementary.greeter.allowed} $out/etc/wingpanel.d/io.elementary.greeter.allowed
+  '';
+
+  postFixup = ''
+    # https://github.com/elementary/default-settings/issues/55
+    rm -rf $out/share/plymouth
+    rm -rf $out/share/cups
+
+    rm -rf $out/share/applications
+  '';
+
+  meta = with lib; {
+    description = "Default settings and configuration files for elementary";
+    homepage = "https://github.com/elementary/default-settings";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.allowed b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.allowed
new file mode 100644
index 000000000000..0cff31f4f777
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/io.elementary.greeter.allowed
@@ -0,0 +1,6 @@
+liba11y.so
+libbluetooth.so
+libkeyboard.so
+libnetwork.so
+libpower.so
+libsession.so
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
new file mode 100644
index 000000000000..b25bb8c85904
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/gala-multitaskingview.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
new file mode 100644
index 000000000000..3bd7d531840d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.calendar.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
new file mode 100644
index 000000000000..494edde183ca
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.music.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
new file mode 100644
index 000000000000..89536754964d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.photos.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
new file mode 100644
index 000000000000..312c35d9bf00
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.switchboard.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
new file mode 100644
index 000000000000..3b0f721a5644
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.videos.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
new file mode 100644
index 000000000000..b0218bac52d7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/org.gnome.Epiphany.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem
new file mode 100644
index 000000000000..8b04efe417ea
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Geary.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/org.gnome.Geary.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override
new file mode 100644
index 000000000000..671448745c50
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override
@@ -0,0 +1,2 @@
+[net.launchpad.plank.dock.settings]
+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']
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
new file mode 100644
index 000000000000..e80e7d951cd4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
@@ -0,0 +1,130 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, linkFarm
+, substituteAll
+, elementary-greeter
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, desktop-file-utils
+, gtk3
+, granite
+, libgee
+, elementary-settings-daemon
+, mutter
+, elementary-icon-theme
+, wingpanel-with-indicators
+, elementary-gtk-theme
+, nixos-artwork
+, lightdm
+, gdk-pixbuf
+, clutter-gtk
+, dbus
+, accountsservice
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-greeter";
+  version = "5.0.4";
+
+  repoName = "greeter";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-Enn+ekALWbk7FVJJuea/rNiwEZDIyb3kyMcZNNraOv8=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+
+    xgreeters = linkFarm "pantheon-greeter-xgreeters" [{
+      path = "${elementary-greeter}/share/xgreeters/io.elementary.greeter.desktop";
+      name = "io.elementary.greeter.desktop";
+    }];
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    accountsservice
+    clutter-gtk # else we get could not generate cargs for mutter-clutter-2
+    elementary-gtk-theme
+    elementary-icon-theme
+    elementary-settings-daemon
+    gdk-pixbuf
+    granite
+    gtk3
+    libgee
+    lightdm
+    mutter
+    wingpanel-with-indicators
+  ];
+
+  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"
+    # We use the patched gnome-settings-daemon
+    "-Dubuntu-patched-gsd=true"
+    "-Dgsd-dir=${elementary-settings-daemon}/libexec/" # trailing slash is needed
+  ];
+
+  patches = [
+    ./sysconfdir-install.patch
+    # Needed until https://github.com/elementary/greeter/issues/360 is fixed
+    (substituteAll {
+      src = ./hardcode-fallback-background.patch;
+      default_wallpaper = "${nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}";
+    })
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # dbus-launch needed in path
+      --prefix PATH : "${dbus}/bin"
+
+      # for `wingpanel -g`
+      --prefix PATH : "${wingpanel-with-indicators}/bin"
+
+      # for the compositor
+      --prefix PATH : "$out/bin"
+
+      # the theme is hardcoded
+      --prefix XDG_DATA_DIRS : "${elementary-gtk-theme}/share"
+    )
+  '';
+
+  postFixup = ''
+    # Use NixOS default wallpaper
+    substituteInPlace $out/etc/lightdm/io.elementary.greeter.conf \
+      --replace "#default-wallpaper=/usr/share/backgrounds/elementaryos-default" \
+      "default-wallpaper=${nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}"
+
+    substituteInPlace $out/share/xgreeters/io.elementary.greeter.desktop \
+      --replace "Exec=io.elementary.greeter" "Exec=$out/bin/io.elementary.greeter"
+  '';
+
+  meta = with lib; {
+    description = "LightDM Greeter for Pantheon";
+    homepage = "https://github.com/elementary/greeter";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch
new file mode 100644
index 000000000000..7d2afe7b16c3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch
@@ -0,0 +1,22 @@
+diff --git a/src/Widgets/BackgroundImage.vala b/src/Widgets/BackgroundImage.vala
+index ae9431c..f0f2a49 100644
+--- a/src/Widgets/BackgroundImage.vala
++++ b/src/Widgets/BackgroundImage.vala
+@@ -9,7 +9,7 @@ public class Greeter.BackgroundImage : Gtk.EventBox {
+ 
+     public BackgroundImage (string? path) {
+         if (path == null) {
+-            path = "/usr/share/backgrounds/elementaryos-default";
++            path = "@default_wallpaper@";
+         }
+ 
+         try {
+@@ -19,7 +19,7 @@ public class Greeter.BackgroundImage : Gtk.EventBox {
+             critical ("Fallback to default wallpaper");
+ 
+             try {
+-                full_pixbuf = new Gdk.Pixbuf.from_file ("/usr/share/backgrounds/elementaryos-default");
++                full_pixbuf = new Gdk.Pixbuf.from_file ("@default_wallpaper@");
+             } catch (GLib.Error e) {
+                 critical (e.message);
+             }
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch
new file mode 100644
index 000000000000..9bacbcf4f98b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch
@@ -0,0 +1,25 @@
+From 7bb0d507cbb0122f167127b9f6460bd53d8234de Mon Sep 17 00:00:00 2001
+From: worldofpeace <worldofpeace@users.noreply.github.com>
+Date: Sat, 16 Mar 2019 16:07:24 -0400
+Subject: [PATCH] '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 fd54b75..b1120ae 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')
+ )
+ 
+ test (
+-- 
+2.19.2
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
new file mode 100644
index 000000000000..bfe95e0be46d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, runCommand
+, mutter
+, elementary-default-settings
+, nixos-artwork
+, glib
+, gala
+, epiphany
+, elementary-settings-daemon
+, gtk3
+, elementary-dock
+, gsettings-desktop-schemas
+, extraGSettingsOverrides ? ""
+, extraGSettingsOverridePackages ? []
+}:
+
+let
+
+  gsettingsOverridePackages = [
+    elementary-dock
+    elementary-settings-daemon
+    epiphany
+    gala
+    gsettings-desktop-schemas
+    gtk3
+    mutter
+  ] ++ extraGSettingsOverridePackages;
+
+in
+
+with lib;
+
+# TODO: Having https://github.com/NixOS/nixpkgs/issues/54150 would supersede this
+runCommand "elementary-gsettings-desktop-schemas" {}
+  ''
+     schema_dir=$out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas
+
+     mkdir -p $schema_dir
+
+     cp -rf ${glib.getSchemaPath gala}/*.gschema.override $schema_dir
+
+     ${concatMapStrings (pkg: "cp -rf ${glib.getSchemaPath pkg}/*.xml $schema_dir\n") gsettingsOverridePackages}
+
+     chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides
+     cp ${glib.getSchemaPath elementary-default-settings}/* $schema_dir
+
+     cat - > $schema_dir/nixos-defaults.gschema.override <<- EOF
+     ${extraGSettingsOverrides}
+     EOF
+
+     ${glib.dev}/bin/glib-compile-schemas $schema_dir
+  ''
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix
new file mode 100644
index 000000000000..70da883392a8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix
@@ -0,0 +1,84 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, fetchpatch
+, pkg-config
+, meson
+, ninja
+, vala
+, python3
+, gtk3
+, glib
+, granite
+, libgee
+, elementary-icon-theme
+, elementary-gtk-theme
+, gettext
+, libhandy
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-onboarding";
+  version = "1.2.1";
+
+  repoName = "onboarding";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-tLTwXA2miHqYqCUbIiBjb2nQB+uN/WzuE4F9m3fVCbM=";
+  };
+
+  patches = [
+    # Port to Libhandy-1
+    (fetchpatch {
+      url = "https://github.com/elementary/onboarding/commit/8af6b7d9216f8cbf725f708b36ef4d4f6c400c78.patch";
+      sha256 = "cnSCSSFEQlNd9Ncw5VCJ32stZ8D4vhl3f+derAk/Cas=";
+      excludes = [
+        ".github/workflows/main.yml"
+      ];
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-gtk-theme
+    elementary-icon-theme
+    glib
+    granite
+    gtk3
+    libgee
+    libhandy
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Onboarding app for new users designed for elementary OS";
+    homepage = "https://github.com/elementary/onboarding";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
new file mode 100644
index 000000000000..7b821f883ce9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, pkg-config
+, vala
+, gtk3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-print-shim";
+  version = "0.1.3";
+
+  repoName = "print";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-l2IUu9Mj22lZ5yajPcsGrJcJDakNu4srCV0Qea5ybPA=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [ gtk3 ];
+
+  meta = with lib; {
+    description = "Simple shim for printing support via Contractor";
+    homepage = "https://github.com/elementary/print";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
new file mode 100644
index 000000000000..38fcb8d40b41
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
@@ -0,0 +1,161 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, desktop-file-utils
+, pkg-config
+, writeScript
+, pantheon
+, gnome-keyring
+, gnome-session
+, wingpanel
+, orca
+, onboard
+, elementary-default-settings
+, elementary-settings-daemon
+, runtimeShell
+, writeText
+, meson
+, ninja
+}:
+
+let
+
+  #
+  # ─── ENSURES PLANK GETS ELEMENTARY'S DEFAULT DOCKITEMS ────────────────────────────
+  #
+
+  #
+  # Upstream relies on /etc/skel to initiate a new users home directory with plank's 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" ''
+    #!${runtimeShell}
+
+    elementary_default_settings="${elementary-default-settings}"
+    dock_items="$elementary_default_settings/etc/skel/.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 = writeText "default-elementary-dockitems.desktop" ''
+    [Desktop Entry]
+    Type=Application
+    Name=Instantiate Default elementary dockitems
+    Exec=${dockitems-script}
+    StartupNotify=false
+    NoDisplay=true
+    OnlyShowIn=Pantheon;
+    X-GNOME-Autostart-Phase=EarlyInitialization
+  '';
+
+  executable = writeScript "pantheon" ''
+    # gnome-session can find RequiredComponents for `pantheon` session (notably pantheon's patched g-s-d autostarts)
+    export XDG_CONFIG_DIRS=@out@/etc/xdg:$XDG_CONFIG_DIRS
+
+    # Make sure we use our gtk-3.0/settings.ini
+    export XDG_CONFIG_DIRS=${elementary-default-settings}/etc:$XDG_CONFIG_DIRS
+
+    # * gnome-session can find the `pantheon' session
+    # * use pantheon-mimeapps.list
+    export XDG_DATA_DIRS=@out@/share:$XDG_DATA_DIRS
+
+    # Start pantheon session. Keep in sync with upstream
+    exec ${gnome-session}/bin/gnome-session --builtin --session=pantheon "$@"
+  '';
+
+  # Absolute path patched version of the upstream xsession
+  xsession = writeText "pantheon.desktop" ''
+    [Desktop Entry]
+    Name=Pantheon
+    Comment=This session provides elementary experience
+    Exec=@out@/libexec/pantheon
+    TryExec=${wingpanel}/bin/wingpanel
+    Icon=
+    DesktopNames=Pantheon
+    Type=Application
+  '';
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "elementary-session-settings-unstable";
+  version = "2020-07-06";
+
+  repoName = "session-settings";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = "fa15cbd83fba0ba30e9a302db880350bff5ace52";
+    hash = "sha256-26H791c7OAjFYtjVChIatICSocMt0uTej1TKBOvw+6w=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    pantheon.elementary-settings-daemon
+    gnome-keyring
+    onboard
+    orca
+  ];
+
+  mesonFlags = [
+    "-Dmimeapps-list=false"
+    "-Dfallback-session=GNOME"
+    "-Ddetect-program-prefixes=true"
+    "--sysconfdir=${placeholder "out"}/etc"
+  ];
+
+  postInstall = ''
+    # our mimeapps patched from upstream to exclude:
+    # * pantheon-mail -> geary
+    # * evince.desktop -> org.gnome.Evince.desktop
+    mkdir -p $out/share/applications
+    cp -av ${./pantheon-mimeapps.list} $out/share/applications/pantheon-mimeapps.list
+
+    # instantiates pantheon's dockitems
+    cp "${dockitemAutostart}" $out/etc/xdg/autostart/default-elementary-dockitems.desktop
+
+    # script `Exec` to start pantheon
+    mkdir -p $out/libexec
+    substitute ${executable} $out/libexec/pantheon --subst-var out
+    chmod +x $out/libexec/pantheon
+
+    # absolute path patched xsession
+    substitute ${xsession} $out/share/xsessions/pantheon.desktop --subst-var out
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+
+    providedSessions = [
+      "pantheon"
+    ];
+  };
+
+  meta = with lib; {
+    description = "Session settings for elementary";
+    homepage = "https://github.com/elementary/session-settings";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list
new file mode 100644
index 000000000000..3b5e3b0e77a5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list
@@ -0,0 +1,168 @@
+[Default Applications]
+application/ogg=io.elementary.music.desktop
+application/oxps=org.gnome.Evince.desktop
+application/pdf=org.gnome.Evince.desktop
+application/postscript=org.gnome.Evince.desktop
+application/vnd.ms-xpsdocument=org.gnome.Evince.desktop
+application/vnd.rn-realmedia=io.elementary.videos.desktop
+application/x-ar=org.gnome.FileRoller.desktop
+application/x-arj=org.gnome.FileRoller.desktop
+application/x-bzdvi=org.gnome.Evince.desktop
+application/x-bzip-compressed-tar=org.gnome.FileRoller.desktop
+application/x-bzip=org.gnome.FileRoller.desktop
+application/x-bzpdf=org.gnome.Evince.desktop
+application/x-bzpostscript=org.gnome.Evince.desktop
+application/x-cbr=org.gnome.Evince.desktop
+application/x-cbt=org.gnome.Evince.desktop
+application/x-cbz=org.gnome.Evince.desktop
+application/x-compress=org.gnome.FileRoller.desktop
+application/x-compressed-tar=org.gnome.FileRoller.desktop
+application/x-dvi=org.gnome.Evince.desktop
+application/x-ear=org.gnome.FileRoller.desktop
+application/x-extension-m4a=io.elementary.videos.desktop
+application/x-extension-mp4=io.elementary.videos.desktop
+application/x-flac=io.elementary.music.desktop
+application/x-gtar=org.gnome.FileRoller.desktop
+application/x-gzdvi=org.gnome.Evince.desktop
+application/x-gzip=org.gnome.FileRoller.desktop
+application/x-gzpdf=org.gnome.Evince.desktop
+application/x-gzpostscript=org.gnome.Evince.desktop
+application/x-lha=org.gnome.FileRoller.desktop
+application/x-lhz=org.gnome.FileRoller.desktop
+application/x-lzop=org.gnome.FileRoller.desktop
+application/x-matroska=io.elementary.videos.desktop
+application/x-ogg=io.elementary.music.desktop
+application/x-perl=io.elementary.code.desktop
+application/x-rar-compressed=org.gnome.FileRoller.desktop
+application/x-rar=org.gnome.FileRoller.desktop
+application/x-rpm=org.gnome.FileRoller.desktop
+application/x-tar=org.gnome.FileRoller.desktop
+application/x-war=org.gnome.FileRoller.desktop
+application/x-xz-compressed-tar=org.gnome.FileRoller.desktop
+application/x-xz=org.gnome.FileRoller.desktop
+application/x-xzpdf=org.gnome.Evince.desktop
+application/x-zip-compressed=org.gnome.FileRoller.desktop
+application/x-zip=org.gnome.FileRoller.desktop
+application/x-zoo=org.gnome.FileRoller.desktop
+application/xhtml+xml=org.gnome.Epiphany.desktop
+application/zip=org.gnome.FileRoller.desktop
+audio/3gpp=io.elementary.music.desktop
+audio/ac3=io.elementary.music.desktop
+audio/AMR-WB=io.elementary.music.desktop
+audio/AMR=io.elementary.music.desktop
+audio/basic=io.elementary.music.desktop
+audio/flac=io.elementary.music.desktop
+audio/midi=io.elementary.music.desktop
+audio/mp4=io.elementary.music.desktop
+audio/mpeg=io.elementary.music.desktop
+audio/mpegurl=io.elementary.music.desktop
+audio/ogg=io.elementary.music.desktop
+audio/prs.sid=io.elementary.music.desktop
+audio/vnd.rn-realaudio=io.elementary.music.desktop
+audio/x-ape=io.elementary.music.desktop
+audio/x-flac=io.elementary.music.desktop
+audio/x-gsm=io.elementary.music.desktop
+audio/x-it=io.elementary.music.desktop
+audio/x-m4a=io.elementary.music.desktop
+audio/x-matroska=io.elementary.music.desktop
+audio/x-mod=io.elementary.music.desktop
+audio/x-mp3=io.elementary.music.desktop
+audio/x-mpeg=io.elementary.music.desktop
+audio/x-mpegurl=io.elementary.music.desktop
+audio/x-ms-asf=io.elementary.music.desktop
+audio/x-ms-asx=io.elementary.music.desktop
+audio/x-ms-wax=io.elementary.music.desktop
+audio/x-ms-wma=io.elementary.music.desktop
+audio/x-musepack=io.elementary.music.desktop
+audio/x-pn-aiff=io.elementary.music.desktop
+audio/x-pn-au=io.elementary.music.desktop
+audio/x-pn-realaudio-plugin=io.elementary.music.desktop
+audio/x-pn-realaudio=io.elementary.music.desktop
+audio/x-pn-wav=io.elementary.music.desktop
+audio/x-pn-windows-acm=io.elementary.music.desktop
+audio/x-real-audio=io.elementary.music.desktop
+audio/x-realaudio=io.elementary.music.desktop
+audio/x-sbc=io.elementary.music.desktop
+audio/x-scpls=io.elementary.music.desktop
+audio/x-speex=io.elementary.music.desktop
+audio/x-tta=io.elementary.music.desktop
+audio/x-vorbis+ogg=io.elementary.music.desktop
+audio/x-vorbis=io.elementary.music.desktop
+audio/x-wav=io.elementary.music.desktop
+audio/x-wavpack=io.elementary.music.desktop
+audio/x-xm=io.elementary.music.desktop
+image/bmp=io.elementary.photos-viewer.desktop
+image/gif=io.elementary.photos-viewer.desktop
+image/jpeg=io.elementary.photos-viewer.desktop
+image/jpg=io.elementary.photos-viewer.desktop
+image/pjpeg=io.elementary.photos-viewer.desktop
+image/png=io.elementary.photos-viewer.desktop
+image/tiff=io.elementary.photos-viewer.desktop
+image/vnd.djvu=org.gnome.Evince.desktop
+image/vnd.rn-realpix=io.elementary.videos.desktop
+image/webp=io.elementary.photos-viewer.desktop
+image/x-bmp=io.elementary.photos-viewer.desktop
+image/x-bzeps=org.gnome.Evince.desktop
+image/x-eps=org.gnome.Evince.desktop
+image/x-gzeps=org.gnome.Evince.desktop
+image/x-png=io.elementary.photos-viewer.desktop
+inode/directory=io.elementary.files.desktop
+misc/ultravox=io.elementary.videos.desktop
+multipart/x-zip=org.gnome.FileRoller.desktop
+text/calendar=io.elementary.calendar.desktop
+text/html=org.gnome.Epiphany.desktop
+text/mathml=io.elementary.code.desktop
+text/plain=io.elementary.code.desktop
+text/x-chdr=io.elementary.code.desktop
+text/x-csrc=io.elementary.code.desktop
+text/x-dtd=io.elementary.code.desktop
+text/x-java=io.elementary.code.desktop
+text/x-python=io.elementary.code.desktop
+text/x-sql=io.elementary.code.desktop
+text/xml=io.elementary.code.desktop
+video/3gpp=io.elementary.videos.desktop
+video/dv=io.elementary.videos.desktop
+video/fli=io.elementary.videos.desktop
+video/flv=io.elementary.videos.desktop
+video/mp2t=io.elementary.videos.desktop
+video/mp4=io.elementary.videos.desktop
+video/mp4v-es=io.elementary.videos.desktop
+video/mpeg=io.elementary.videos.desktop
+video/msvideo=io.elementary.videos.desktop
+video/ogg=io.elementary.videos.desktop
+video/quicktime=io.elementary.videos.desktop
+video/vivo=io.elementary.videos.desktop
+video/vnd.divx=io.elementary.videos.desktop
+video/vnd.rn-realvideo=io.elementary.videos.desktop
+video/vnd.vivo=io.elementary.videos.desktop
+video/webm=io.elementary.videos.desktop
+video/x-anim=io.elementary.videos.desktop
+video/x-avi=io.elementary.videos.desktop
+video/x-flc=io.elementary.videos.desktop
+video/x-fli=io.elementary.videos.desktop
+video/x-flic=io.elementary.videos.desktop
+video/x-flv=io.elementary.videos.desktop
+video/x-m4v=io.elementary.videos.desktop
+video/x-matroska=io.elementary.videos.desktop
+video/x-mpeg=io.elementary.videos.desktop
+video/x-ms-asf=io.elementary.videos.desktop
+video/x-ms-asx=io.elementary.videos.desktop
+video/x-ms-wm=io.elementary.videos.desktop
+video/x-ms-wmv=io.elementary.videos.desktop
+video/x-ms-wmx=io.elementary.videos.desktop
+video/x-ms-wvx=io.elementary.videos.desktop
+video/x-msvideo=io.elementary.videos.desktop
+video/x-nsv=io.elementary.videos.desktop
+video/x-ogm+ogg=io.elementary.videos.desktop
+video/x-theora+ogg=io.elementary.videos.desktop
+video/x-totem-stream=io.elementary.videos.desktop
+x-content/image-dcf=io.elementary.photos.desktop
+x-content/image-picturecd=io.elementary.photos.desktop
+x-content/video-dvd=io.elementary.videos.desktop
+x-content/video-svcd=io.elementary.videos.desktop
+x-content/video-vcd=io.elementary.videos.desktop
+x-scheme-handler/http=org.gnome.Epiphany.desktop
+x-scheme-handler/https=org.gnome.Epiphany.desktop
+x-scheme-handler/mailto=org.gnome.Evolution.desktop
+x-scheme-handler/trash=io.elementary.files.desktop
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
new file mode 100644
index 000000000000..314267d86122
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, libxml2
+, desktop-file-utils
+, gtk3
+, glib
+, granite
+, libgee
+, elementary-icon-theme
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-shortcut-overlay";
+  version = "1.1.2";
+
+  repoName = "shortcut-overlay";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-TFS29vwDkTtoFcIVAbKskyLemqW9fxE7fQkM61DpDm0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    glib
+    granite
+    gtk3
+    libgee
+  ];
+
+  meta = with lib; {
+    description = "A native OS-wide shortcut overlay to be launched by Gala";
+    homepage = "https://github.com/elementary/shortcut-overlay";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix
new file mode 100644
index 000000000000..2db483cb5c7e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, substituteAll
+, fetchFromGitHub
+, file-roller
+, gnome-bluetooth
+}:
+
+stdenv.mkDerivation rec {
+  pname = "extra-elementary-contracts";
+  version = "2018-08-21";
+
+  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;
+  dontConfigure = true;
+
+  installPhase = ''
+    mkdir -p $out/share/contractor
+
+    cp *.contract $out/share/contractor/
+  '';
+
+  meta = with lib; {
+    description = "Extra contractor files for elementary";
+    homepage = "https://github.com/worldofpeace/extra-elementary-contracts";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ worldofpeace ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch
new file mode 100644
index 000000000000..3b97e306119d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/extra-elementary-contracts/exec-path.patch
@@ -0,0 +1,34 @@
+diff --git a/file-roller-compress.contract b/file-roller-compress.contract
+index 8de5396..de7e939 100644
+--- a/file-roller-compress.contract
++++ b/file-roller-compress.contract
+@@ -3,6 +3,6 @@ Name=Compress
+ Icon=add-files-to-archive
+ Description=Create a compressed archive with the selected objects
+ MimeType=!archive;inode/blockdevice;inode/chardevice;inode/fifo;inode/socket;
+-Exec=file-roller --add %U
++Exec=@file_roller@/bin/file-roller --add %U
+ Gettext-Domain=file-roller
+ 
+diff --git a/file-roller-extract-here.contract b/file-roller-extract-here.contract
+index 184a6f2..345f4e7 100644
+--- a/file-roller-extract-here.contract
++++ b/file-roller-extract-here.contract
+@@ -3,5 +3,5 @@ Name=Extract Here
+ Icon=extract-archive
+ Description=Extract the contents of the archives in the archive folder and quit the program
+ MimeType=application/x-7z-compressed;application/x-7z-compressed-tar;application/x-ace;application/x-alz;application/x-ar;application/x-arj;application/x-bzip;application/x-bzip-compressed-tar;application/x-bzip1;application/x-bzip1-compressed-tar;application/x-cabinet;application/x-cbr;application/x-cbz;application/x-cd-image;application/x-compress;application/x-compressed-tar;application/x-cpio;application/x-deb;application/x-ear;application/x-ms-dos-executable;application/x-gtar;application/x-gzip;application/x-gzpostscript;application/x-java-archive;application/x-lha;application/x-lhz;application/x-lrzip;application/x-lrzip-compressed-tar;application/x-lzip;application/x-lzip-compressed-tar;application/x-lzma;application/x-lzma-compressed-tar;application/x-lzop;application/x-lzop-compressed-tar;application/x-ms-wim;application/x-rar;application/x-rar-compressed;application/x-rpm;application/x-rzip;application/x-tar;application/x-tarz;application/x-stuffit;application/x-war;application/x-xz;application/x-xz-compressed-tar;application/x-zip;application/x-zip-compressed;application/x-zoo;application/zip;
+-Exec=file-roller --extract-here %U
++Exec=@file_roller@/bin/file-roller --extract-here %U
+ Gettext-Domain=file-roller
+diff --git a/gnome-bluetooth.contract b/gnome-bluetooth.contract
+index 745dbbe..8cc0102 100644
+--- a/gnome-bluetooth.contract
++++ b/gnome-bluetooth.contract
+@@ -3,5 +3,5 @@ Name=Send files via Bluetooth
+ Icon=bluetooth
+ Description=Send files to device...
+ MimeType=!inode;
+-Exec=bluetooth-sendto %F
++Exec=@gnome_bluetooth@/bin/bluetooth-sendto %F
+ Gettext-Domain=gnome-bluetooth2
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix
new file mode 100644
index 000000000000..c4467c53a2bf
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix
@@ -0,0 +1,97 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, desktop-file-utils
+, gettext
+, libxml2
+, gtk3
+, granite
+, libgee
+, bamf
+, libcanberra
+, libcanberra-gtk3
+, gnome-desktop
+, mutter
+, clutter
+, elementary-dock
+, elementary-icon-theme
+, elementary-settings-daemon
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gala";
+  version = "3.3.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-BOarHUEgWqQM6jmVMauJi0JnsM+jE45MnPNnAqz1qOE=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    bamf
+    clutter
+    elementary-dock
+    elementary-icon-theme
+    elementary-settings-daemon
+    gnome-desktop
+    granite
+    gtk3
+    libcanberra
+    libcanberra-gtk3
+    libgee
+    mutter
+  ];
+
+  patches = [
+    # https://github.com/elementary/gala/pull/869
+    # build failure in vala 0.48.7
+    # https://github.com/elementary/gala/pull/869#issuecomment-657147695
+    (fetchpatch {
+      url = "https://github.com/elementary/gala/commit/85d290c75eaa147b704ad34e6c67498071707ee8.patch";
+      sha256 = "19jkvmxidf453qfrxkvi35igxzfz2cm8srwkabvyn9wyd1yhiw0l";
+    })
+    ./plugins-dir.patch
+    ./use-new-notifications-default.patch
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/post_install.py
+    patchShebangs build-aux/meson/post_install.py
+  '';
+
+  meta =  with lib; {
+    description = "A window & compositing manager based on mutter and designed by elementary for use with Pantheon";
+    homepage = "https://github.com/elementary/gala";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
new file mode 100644
index 000000000000..f08652e9f630
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
@@ -0,0 +1,20 @@
+diff --git a/meson.build b/meson.build
+index 78113d6..926596c 100644
+--- a/meson.build
++++ b/meson.build
+@@ -24,13 +24,14 @@ vapi_dir = meson.current_source_dir() / 'vapi'
+
+ data_dir = join_paths(get_option('prefix'), get_option('datadir'))
+ plugins_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name(), 'plugins')
++plugins_dir_for_build = join_paths('/run/current-system/sw/lib/', meson.project_name(), 'plugins')
+ pkgdata_dir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name())
+ pkglib_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name())
+
+ conf = configuration_data()
+ conf.set_quoted('DATADIR', data_dir)
+ conf.set_quoted('PKGDATADIR', pkgdata_dir)
+-conf.set_quoted('PLUGINDIR', plugins_dir)
++conf.set_quoted('PLUGINDIR', plugins_dir_for_build)
+ conf.set_quoted('RESOURCEPATH', '/org/pantheon/desktop/gala')
+ conf.set_quoted('VERSION', gala_version)
+ conf.set_quoted('SCHEMA', 'org.pantheon.desktop.gala')
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/use-new-notifications-default.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/use-new-notifications-default.patch
new file mode 100644
index 000000000000..dc256bcff3aa
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/use-new-notifications-default.patch
@@ -0,0 +1,13 @@
+diff --git a/data/gala.gschema.xml b/data/gala.gschema.xml
+index 8032583..7f4f03c 100644
+--- a/data/gala.gschema.xml
++++ b/data/gala.gschema.xml
+@@ -58,7 +58,7 @@
+ 			<description>If enabled, dropping windows on vertical screen edges maximizes them vertically and resizes them horizontally to cover half of the available area. Dropping windows on the top screen edge maximizes them completely.</description>
+ 		</key>
+ 		<key type="b" name="use-new-notifications">
+-			<default>false</default>
++			<default>true</default>
+ 			<summary>If new notifications should be used</summary>
+ 			<description>If new notifications UI should be used, requires io.elemenetary.notifications to be present and running</description>
+ 		</key>
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
new file mode 100644
index 000000000000..230ae29ffa05
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
@@ -0,0 +1,110 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pantheon
+, substituteAll
+, meson
+, ninja
+, python3
+, pkg-config
+, vala
+, granite
+, libgee
+, gettext
+, gtk3
+, appstream
+, gnome-menus
+, json-glib
+, elementary-dock
+, bamf
+, switchboard-with-plugs
+, libunity
+, libsoup
+, wingpanel
+, zeitgeist
+, bc
+, libhandy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-applications-menu";
+  version = "2.7.1";
+
+  repoName = "applications-menu";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-NeazBzkbdQTC6OzPxxyED4OstMkNkUGtCIaZD67fTnM=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    appstream
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    bamf
+    elementary-dock
+    gnome-menus
+    granite
+    gtk3
+    json-glib
+    libgee
+    libhandy
+    libsoup
+    libunity
+    switchboard-with-plugs
+    wingpanel
+    zeitgeist
+  ] ++
+  # applications-menu has a plugin to search switchboard plugins
+  # see https://github.com/NixOS/nixpkgs/issues/100209
+  # wingpanel's wrapper will need to pick up the fact that
+  # applications-menu needs a version of switchboard with all
+  # its plugins for search.
+  switchboard-with-plugs.buildInputs;
+
+  mesonFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+  ];
+
+  patches = [
+    # Port to Libhandy-1
+    (fetchpatch {
+      url = "https://github.com/elementary/applications-menu/commit/8eb2430e8513e9d37f875c5c9b8b15a968c27127.patch";
+      sha256 = "8Uw9mUw7U5nrAwUDGVpAwoRqb9ah503wQCr9kPbBJIo=";
+    })
+
+    (substituteAll {
+      src = ./fix-paths.patch;
+      bc = "${bc}/bin/bc";
+    })
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Lightweight and stylish app launcher for Pantheon";
+    homepage = "https://github.com/elementary/applications-menu";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch
new file mode 100644
index 000000000000..25e3891a205a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch
@@ -0,0 +1,24 @@
+diff --git a/src/synapse-plugins/calculator-plugin.vala b/src/synapse-plugins/calculator-plugin.vala
+index 18ca3af..f5d1076 100644
+--- a/src/synapse-plugins/calculator-plugin.vala
++++ b/src/synapse-plugins/calculator-plugin.vala
+@@ -44,9 +44,7 @@ namespace Synapse {
+                 _("Calculator"),
+                 _("Calculate basic expressions."),
+                 "accessories-calculator",
+-                register_plugin,
+-                Environment.find_program_in_path ("bc") != null,
+-                _("bc is not installed")
++                register_plugin
+             );
+         }
+ 
+@@ -87,7 +85,7 @@ namespace Synapse {
+             if (matched) {
+                 Pid pid;
+                 int read_fd, write_fd;
+-                string[] argv = {"bc", "-l"};
++                string[] argv = {"@bc@", "-l"};
+                 string? solution = null;
+ 
+                 try {
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
new file mode 100644
index 000000000000..03500abd6237
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, glib
+, granite
+, libnotify
+, wingpanel
+, libgee
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-bluetooth";
+  version = "unstable-2020-10-01";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = "2b59d646ea0d66ae45dafc851374f24dcd98c064";
+    sha256 = "sha256-selp70P+7RhbdHF6iiNmcNbMf/c+B9zZ6nlxwRSZGn4=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    glib # for glib-compile-schemas
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    glib
+    granite
+    gtk3
+    libgee
+    libnotify
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Bluetooth Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-bluetooth";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
new file mode 100644
index 000000000000..03954fac6448
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
@@ -0,0 +1,71 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, evolution-data-server
+, libical
+, libgee
+, libxml2
+, libsoup
+, libgdata
+, elementary-calendar
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-datetime";
+  version = "2.2.5";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-rZzZIh4bwZfwQFDbfPDKQtfLMJQ2IdykH1yiV6ckqnw=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    evolution-data-server
+    granite
+    gtk3
+    libgee
+    libical
+    libsoup
+    wingpanel
+    libgdata # required by some dependency transitively
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Date & Time Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-datetime";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
new file mode 100644
index 000000000000..4e2f9455073c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, substituteAll
+, vala
+, gtk3
+, granite
+, libxml2
+, wingpanel
+, libgee
+, xorg
+, libgnomekbd
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-keyboard";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-/sTx0qT7gNj1waQg9OKqHY6MtL+p0NljiIAXKA3DYmA=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    libxml2
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    wingpanel
+    xorg.xkeyboardconfig
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      gkbd_keyboard_display = "${libgnomekbd}/bin/gkbd-keyboard-display";
+    })
+  ];
+
+  meta = with lib; {
+    description = "Keyboard Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-keyboard";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
new file mode 100644
index 000000000000..4fb6dfac86d9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Indicator.vala b/src/Indicator.vala
+index cd7ca49..7813789 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 = "@gkbd_keyboard_display@ \"--layout=" + layouts.get_current_with_variant () + "\"";
+ 
+         try {
+             AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE).launch (null, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
new file mode 100644
index 000000000000..ab898084c087
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, networkmanager
+, libnma
+, wingpanel
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-network";
+  version = "2.2.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-wVHvHduUT55rIWRfRWg3Z3jL3FdzUJfiqFONRmpCR8k=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    networkmanager
+    libnma
+    wingpanel
+  ];
+
+  meta = with lib; {
+    description = "Network Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-network";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
new file mode 100644
index 000000000000..4481c181f53d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, libgee
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-nightlight";
+  version = "2.0.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-0f03XO74ezzS/Uy0mXT4raoazETL/SOVh58sAo9bEIA=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  PKG_CONFIG_WINGPANEL_2_0_INDICATORSDIR = "${placeholder "out"}/lib/wingpanel";
+
+  meta = with lib; {
+    description = "Night Light Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-nightlight";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
new file mode 100644
index 000000000000..97ab0cb80ed3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
@@ -0,0 +1,65 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, fetchpatch
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, libgee
+, elementary-notifications
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-notifications";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-tVPSJO/9IXlibLkb6Cv+8azdvuXbcNOI1qYk4VQc4WI=";
+  };
+
+  patches = [
+    # Fix do not disturb on NixOS
+    # https://github.com/elementary/wingpanel-indicator-notifications/pull/110
+    (fetchpatch {
+      url = "https://github.com/elementary/wingpanel-indicator-notifications/commit/02b1e226c0262c1535fdf2b4f1daba6be9084f67.patch";
+      sha256 = "1a5phygygndr28yx8yp0lyk0wxypc5656dpidw1z8x1yd6xysqhy";
+    })
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    elementary-notifications
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  meta = with lib; {
+    description = "Notifications Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-notifications";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
new file mode 100644
index 000000000000..69a17b9dd30a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, granite
+, bamf
+, libgtop
+, udev
+, wingpanel
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-power";
+  version = "2.2.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-wjYZXFnzvPSukzh1BNvyaFxKpYm+kNNFm5AsthLXGVE=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    bamf
+    granite
+    gtk3
+    libgee
+    libgtop
+    udev
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Power Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-power";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
new file mode 100644
index 000000000000..a6c08b613bbd
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, accountsservice
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-session";
+  version = "unstable-2020-09-13";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = "e65c95f46adbfd598ad61933394d7bc3c5998278";
+    sha256 = "sha256-QKOfgAc6pDQYpETrFunZB6+rF1P8XIf0pjft/t9aWW0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    accountsservice
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  meta = with lib; {
+    description = "Session Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-session";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
new file mode 100644
index 000000000000..25707f39e46b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
@@ -0,0 +1,68 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, libnotify
+, pulseaudio
+, libcanberra-gtk3
+, libgee
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-sound";
+  version = "2.1.6";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-WGkxLsbdJ7Z7kolymYpggsVy4cN4CicNKdfCbunklSI=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libcanberra-gtk3
+    libgee
+    libnotify
+    pulseaudio
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "Sound Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-sound";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
new file mode 100644
index 000000000000..97c2d0c8845a
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
@@ -0,0 +1,89 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, wrapGAppsHook
+, pkg-config
+, meson
+, ninja
+, vala
+, gala
+, gtk3
+, libgee
+, granite
+, gettext
+, mutter
+, mesa
+, json-glib
+, python3
+, elementary-gtk-theme
+, elementary-icon-theme
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel";
+  version = "2.3.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-mXi600gufUK81Uks9p4+al0tCI7H9KpizZGyoomp42s=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-gtk-theme
+    elementary-icon-theme
+    gala
+    granite
+    gtk3
+    json-glib
+    libgee
+    mutter
+    mesa # for libEGL
+  ];
+
+  patches = [
+    ./indicators.patch
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # this theme is required
+      --prefix XDG_DATA_DIRS : "${elementary-gtk-theme}/share"
+    )
+  '';
+
+  meta = with lib; {
+    description = "The extensible top panel for Pantheon";
+    longDescription = ''
+      Wingpanel is an empty container that accepts indicators as extensions,
+      including the applications menu.
+    '';
+    homepage = "https://github.com/elementary/wingpanel";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
new file mode 100644
index 000000000000..68a5fd532a8d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
@@ -0,0 +1,21 @@
+diff --git a/lib/IndicatorManager.vala b/lib/IndicatorManager.vala
+index a99a1ec..0ae7799 100644
+--- a/lib/IndicatorManager.vala
++++ b/lib/IndicatorManager.vala
+@@ -115,7 +115,15 @@ public class Wingpanel.IndicatorManager : GLib.Object {
+         }
+ 
+         /* load indicators */
+-        var base_folder = File.new_for_path (Build.INDICATORS_DIR);
++
++        var indicators_path = Environment.get_variable("WINGPANEL_INDICATORS_PATH");
++        if (indicators_path != null) {
++            debug ("WINGPANEL_INDICATORS_PATH set to %s", indicators_path);
++        } else {
++            critical ("WINGPANEL_INDICATORS_PATH not set");
++        }
++
++        var base_folder = File.new_for_path (indicators_path);
+ 
+         try {
+             monitor = base_folder.monitor_directory (FileMonitorFlags.NONE, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
new file mode 100644
index 000000000000..ca887d45dc39
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
@@ -0,0 +1,60 @@
+{ lib
+, wrapGAppsHook
+, glib
+, stdenv
+, xorg
+, wingpanel
+, wingpanelIndicators
+, switchboard-with-plugs
+, indicators ? null
+  # Only useful to disable for development testing.
+, useDefaultIndicators ? true
+}:
+
+let
+  selectedIndicators =
+    if indicators == null then wingpanelIndicators
+    else indicators ++ (lib.optionals useDefaultIndicators wingpanelIndicators);
+in
+stdenv.mkDerivation rec {
+  name = "${wingpanel.name}-with-indicators";
+
+  src = null;
+
+  paths = [
+    wingpanel
+  ] ++ selectedIndicators;
+
+  passAsFile = [ "paths" ];
+
+  nativeBuildInputs = [
+    glib
+    wrapGAppsHook
+  ];
+
+  buildInputs = lib.forEach selectedIndicators (x: x.buildInputs)
+    ++ selectedIndicators;
+
+  dontUnpack = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  preferLocalBuild = true;
+  allowSubstitutes = false;
+
+  installPhase = ''
+    mkdir -p $out
+    for i in $(cat $pathsPath); do
+      ${xorg.lndir}/bin/lndir -silent $i $out
+    done
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --set WINGPANEL_INDICATORS_PATH "$out/lib/wingpanel"
+      --set SWITCHBOARD_PLUGS_PATH "${switchboard-with-plugs}/lib/switchboard"
+    )
+  '';
+
+  inherit (wingpanel) meta;
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/granite/default.nix b/nixpkgs/pkgs/desktops/pantheon/granite/default.nix
new file mode 100644
index 000000000000..3d4dc6bd84ab
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/granite/default.nix
@@ -0,0 +1,75 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, python3
+, meson
+, ninja
+, vala
+, pkg-config
+, libgee
+, pantheon
+, gtk3
+, glib
+, gettext
+, gsettings-desktop-schemas
+, gobject-introspection
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "granite";
+  version = "6.0.0";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-RGukXeFmtnyCfK8pKdvTHL0t8yhEYwAiiPelTy1Xcf0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    gettext
+    gobject-introspection
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    gtk3
+    libgee
+  ];
+
+  propagatedBuildInputs = [
+    gsettings-desktop-schemas # is_clock_format_12h uses "org.gnome.desktop.interface clock-format"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "An extension to GTK used by elementary OS";
+    longDescription = ''
+      Granite is a companion library for GTK and GLib. Among other things, it provides complex widgets and convenience functions
+      designed for use in apps built for elementary OS.
+    '';
+    homepage = "https://github.com/elementary/granite";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix
new file mode 100644
index 000000000000..e15480c8cc88
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/contractor/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, python3
+, ninja
+, pkg-config
+, vala
+, glib
+, libgee
+, dbus
+, glib-networking
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "contractor";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-FHLecRxTE8v3M7cV6rkQKNhPhKFhuhvkzB5C+u7Z+Ms=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    dbus
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    glib-networking
+    libgee
+  ];
+
+  PKG_CONFIG_DBUS_1_SESSION_BUS_SERVICES_DIR = "${placeholder "out"}/share/dbus-1/services";
+
+  meta = with lib; {
+    description = "A desktop-wide extension service used by elementary OS";
+    homepage = "https://github.com/elementary/contractor";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix
new file mode 100644
index 000000000000..d9f224ce45d8
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/default.nix
@@ -0,0 +1,73 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, desktop-file-utils
+, gtk3
+, granite
+, libgee
+, gcr
+, webkitgtk
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-capnet-assist";
+  version = "2.2.5";
+
+  repoName = "capnet-assist";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-o6J3vNWvV0zRde8VWWfpb56PQhSck2sJQVLimq0P9CY=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    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 lib; {
+    description = "A small WebKit app that assists a user with login when a captive portal is detected";
+    homepage = "https://github.com/elementary/capnet-assist";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch
new file mode 100644
index 000000000000..a59c74f22b3b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-capnet-assist/remove-capnet-test.patch
@@ -0,0 +1,13 @@
+diff --git a/meson.build b/meson.build
+index 46c594b..ba0ea10 100644
+--- a/meson.build
++++ b/meson.build
+@@ -33,8 +33,3 @@ meson.add_install_script('meson/post_install.py')
+ 
+ subdir('data')
+ subdir('po')
+-
+-install_data(
+-    '90captive_portal_test',
+-    install_dir: join_paths(get_option('sysconfdir'), 'NetworkManager', 'dispatcher.d')
+-)
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix
new file mode 100644
index 000000000000..65995c456599
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-dpms-helper/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, meson
+, ninja
+, desktop-file-utils
+, glib
+, coreutils
+, elementary-settings-daemon
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-dpms-helper";
+  version = "1.0";
+
+  repoName = "dpms-helper";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = version;
+    sha256 = "sha256-0KbfAxvZ+aFjq+XEK4uoRHSyKlaky0FlJd2a5TG4bms=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-settings-daemon
+    glib
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix PATH : "${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 lib; {
+    description = "Sets DPMS settings found in org.pantheon.dpms";
+    homepage = "https://github.com/elementary/dpms-helper";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-notifications/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-notifications/default.nix
new file mode 100644
index 000000000000..73cace23cca9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-notifications/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, fetchFromGitHub
+, meson
+, ninja
+, pkg-config
+, vala
+, gtk3
+, glib
+, granite
+, libgee
+, libcanberra-gtk3
+, pantheon
+, python3
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-notifications";
+  version = "unstable-2020-03-31";
+
+  repoName = "notifications";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = repoName;
+    rev = "db552b0c3466ba1099c7737c353b7225ab1896cc";
+    sha256 = "1fhf4zx73qka935x5afv6zqsm2l37d1mjbhrbzzzz44dqwa2vp16";
+  };
+
+  nativeBuildInputs = [
+    glib # for glib-compile-schemas
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    granite
+    gtk3
+    libcanberra-gtk3
+    libgee
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  meta = with lib; {
+    description = "GTK notification server for Pantheon";
+    homepage = "https://github.com/elementary/notifications";
+    license = licenses.gpl3Plus;
+    maintainers = pantheon.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
new file mode 100644
index 000000000000..568414aab35c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/default.nix
@@ -0,0 +1,166 @@
+{ lib, stdenv
+, substituteAll
+, fetchurl
+, fetchgit
+, fetchpatch
+, meson
+, ninja
+, pkg-config
+, gnome
+, perl
+, gettext
+, gtk3
+, glib
+, libnotify
+, libgnomekbd
+, lcms2
+, libpulseaudio
+, alsa-lib
+, libcanberra-gtk3
+, upower
+, colord
+, libgweather
+, polkit
+, gsettings-desktop-schemas
+, geoclue2
+, systemd
+, libgudev
+, libwacom
+, libxslt
+, libxml2
+, modemmanager
+, networkmanager
+, gnome-desktop
+, geocode-glib
+, docbook_xsl
+, accountsservice
+, wrapGAppsHook
+, python3
+, tzdata
+, nss
+, gcr
+, pantheon
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-settings-daemon";
+  version = "3.34.1";
+
+  repoName = "gnome-settings-daemon";
+
+  src = fetchgit {
+    url = "https://git.launchpad.net/~ubuntu-desktop/ubuntu/+source/${repoName}";
+    rev = "refs/tags/ubuntu/${version}-1ubuntu2";
+    sha256 = "0w0dsbzif7v0gk61rs9g20ldlimbdwb5yvlfdc568yyx5z643jbv";
+  };
+
+  # 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 = "${src}/debian/patches"; in [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit tzdata;
+    })
+    ./global-backlight-helper.patch
+    "${patchPath}/45_suppress-printer-may-not-be-connected-notification.patch"
+    #"${patchPath}/53_sync_input_sources_to_accountsservice.patch"
+    "${patchPath}/64_restore_terminal_keyboard_shortcut_schema.patch"
+    "${patchPath}/correct_logout_action.patch"
+    "${patchPath}/ubuntu-lid-close-suspend.patch"
+    "${patchPath}/revert-gsettings-removals.patch"
+    "${patchPath}/revert-mediakeys-dbus-interface-drop.patch"
+    #"${patchPath}/ubuntu_ibus_configs.patch"
+    # https://github.com/elementary/os-patches/blob/6975d1c254cb6ab913b8e2396877203aea8eaa65/debian/patches/elementary-dpms.patch
+    ./elementary-dpms.patch
+
+    # Query GWeather DB on the fly instead of caching.
+    # Needed for the next patch to apply.
+    # https://gitlab.gnome.org/GNOME/gnome-settings-daemon/merge_requests/175
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-settings-daemon/commit/df6c69f028d27b53ac86829e11df103b25ed5a74.patch";
+      sha256 = "bKZkPzN64DXMgitjn0vUzUvKl7ldhN/mNVtPKVmHd0Q=";
+    })
+    # Adjust to libgweather changes.
+    # https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/merge_requests/217
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/GNOME/gnome-settings-daemon/commit/82d88014dfca2df7e081712870e1fb017c16b808.patch";
+      sha256 = "H5k/v+M2bRaswt5nrDJFNn4gS4BdB0UfzdjUCT4yLKg=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    perl
+    gettext
+    libxml2
+    libxslt
+    docbook_xsl
+    wrapGAppsHook
+    python3
+  ];
+
+  buildInputs = [
+    accountsservice
+    alsa-lib
+    colord
+    gcr
+    geoclue2
+    geocode-glib
+    glib
+    gnome-desktop
+    gsettings-desktop-schemas
+    gtk3
+    lcms2
+    libcanberra-gtk3
+    libgnomekbd # for org.gnome.libgnomekbd.keyboard schema
+    libgudev
+    libgweather
+    libnotify
+    libpulseaudio
+    libwacom
+    modemmanager
+    networkmanager
+    nss
+    polkit
+    systemd
+    upower
+  ];
+
+  mesonFlags = [
+    "-Dudev_dir=${placeholder "out"}/lib/udev"
+  ];
+
+    # Default for release buildtype but passed manually because
+    # we're using plain
+  NIX_CFLAGS_COMPILE = "-DG_DISABLE_CAST_CHECKS";
+
+  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 = ''
+    # So the polkit policy can reference /run/current-system/sw/bin/elementary-settings-daemon/gsd-backlight-helper
+    mkdir -p $out/bin/elementary-settings-daemon
+    ln -s $out/libexec/gsd-backlight-helper $out/bin/elementary-settings-daemon/gsd-backlight-helper
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = repoName;
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    license = licenses.gpl2Plus;
+    maintainers = pantheon.maintainers;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/elementary-dpms.patch b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/elementary-dpms.patch
new file mode 100644
index 000000000000..14d056ceca27
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/elementary-dpms.patch
@@ -0,0 +1,84 @@
+diff --git a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in
+index ec805d8a..cf0d6793 100644
+--- a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in
++++ b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in
+@@ -11,6 +11,11 @@
+       <summary>Activation of this plugin</summary>
+       <description>Whether this plugin would be activated by unity-settings-daemon or not</description>
+     </key>
++    <key name="manage-dpms-defaults" type="b">
++      <default>false</default>
++      <summary>Reset X DPMS values</summary>
++      <description>Whether DPMS values will be adjusted by gnome-settings-daemon</description>
++    </key>
+     <key name="idle-brightness" type="i">
+       <default>30</default>
+       <summary>The brightness of the screen when idle</summary>
+diff --git a/plugins/power/gpm-common.c b/plugins/power/gpm-common.c
+index a7ca87fb..a56a7cdc 100644
+--- a/plugins/power/gpm-common.c
++++ b/plugins/power/gpm-common.c
+@@ -280,6 +280,18 @@ disable_builtin_screensaver (gpointer unused)
+         return TRUE;
+ }
+ 
++gboolean
++manage_dpms (void)
++{
++        GSettings *settings;
++        gboolean manage_dpms_defaults;
++
++        settings = g_settings_new ("org.gnome.settings-daemon.plugins.power");
++        manage_dpms_defaults = g_settings_get_boolean (settings, "manage-dpms-defaults");
++        g_object_unref (settings);
++        return manage_dpms_defaults;
++}
++
+ guint
+ gsd_power_enable_screensaver_watchdog (void)
+ {
+@@ -290,7 +302,7 @@ gsd_power_enable_screensaver_watchdog (void)
+          * way. The defaults are now applied in Fedora 20 from
+          * being "0" by default to being "600" by default */
+         gdk_x11_display_error_trap_push (gdk_display_get_default ());
+-        if (DPMSQueryExtension(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &dummy, &dummy))
++        if (manage_dpms () && DPMSQueryExtension(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &dummy, &dummy))
+                 DPMSSetTimeouts (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), 0, 0, 0);
+         gdk_x11_display_error_trap_pop_ignored (gdk_display_get_default ());
+         id = g_timeout_add_seconds (XSCREENSAVER_WATCHDOG_TIMEOUT,
+diff --git a/plugins/power/gpm-common.h b/plugins/power/gpm-common.h
+index 88a8e00e..af106479 100644
+--- a/plugins/power/gpm-common.h
++++ b/plugins/power/gpm-common.h
+@@ -34,6 +34,7 @@ gchar           *gpm_get_timestring                     (guint           time);
+ gboolean         gsd_power_is_hardware_a_vm             (void);
+ guint            gsd_power_enable_screensaver_watchdog  (void);
+ void             reset_idletime                         (void);
++gboolean         manage_dpms                            (void);
+ 
+ /* Backlight helpers */
+ 
+diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
+index c500fa38..445496ee 100644
+--- a/plugins/power/gsd-power-manager.c
++++ b/plugins/power/gsd-power-manager.c
+@@ -1033,6 +1033,9 @@ backlight_enable (GsdPowerManager *manager)
+         gboolean ret;
+         GError *error = NULL;
+ 
++        if (!(manage_dpms ()))
++                return;
++
+         iio_proxy_claim_light (manager, TRUE);
+         ret = gnome_rr_screen_set_dpms_mode (manager->rr_screen,
+                                              GNOME_RR_DPMS_ON,
+@@ -1052,6 +1055,9 @@ backlight_disable (GsdPowerManager *manager)
+         gboolean ret;
+         GError *error = NULL;
+ 
++        if (!(manage_dpms ()))
++                return;
++
+         iio_proxy_claim_light (manager, FALSE);
+         ret = gnome_rr_screen_set_dpms_mode (manager->rr_screen,
+                                              GNOME_RR_DPMS_OFF,
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch
new file mode 100644
index 000000000000..2229302cab7c
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/fix-paths.patch
@@ -0,0 +1,15 @@
+--- a/plugins/datetime/tz.h
++++ b/plugins/datetime/tz.h
+@@ -27,11 +27,7 @@
+ 
+ #include <glib.h>
+ 
+-#ifndef __sun
+-#  define TZ_DATA_FILE "/usr/share/zoneinfo/zone.tab"
+-#else
+-#  define TZ_DATA_FILE "/usr/share/lib/zoneinfo/tab/zone_sun.tab"
+-#endif
++#define TZ_DATA_FILE "@tzdata@/share/zoneinfo/zone.tab"
+ 
+ typedef struct _TzDB TzDB;
+ typedef struct _TzLocation TzLocation;
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/global-backlight-helper.patch b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/global-backlight-helper.patch
new file mode 100644
index 000000000000..dcdc83934ba6
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/elementary-settings-daemon/global-backlight-helper.patch
@@ -0,0 +1,26 @@
+diff --git a/plugins/power/gsd-backlight.c b/plugins/power/gsd-backlight.c
+index d7d10fd2..5619d6ad 100644
+--- a/plugins/power/gsd-backlight.c
++++ b/plugins/power/gsd-backlight.c
+@@ -358,7 +358,7 @@ gsd_backlight_run_set_helper (GsdBacklight *backlight, GTask *task)
+                 proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE,
+                                          &error,
+                                          "pkexec",
+-                                         LIBEXECDIR "/gsd-backlight-helper",
++                                         "/run/current-system/sw/bin/elementary-settings-daemon/gsd-backlight-helper",
+                                          g_udev_device_get_sysfs_path (backlight->udev_device),
+                                          data->value_str, NULL);
+         } else {
+diff --git a/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in b/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in
+index f16300f8..79d6bd17 100644
+--- a/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in
++++ b/plugins/power/org.gnome.settings-daemon.plugins.power.policy.in.in
+@@ -25,7 +25,7 @@
+       <allow_inactive>no</allow_inactive>
+       <allow_active>yes</allow_active>
+     </defaults>
+-    <annotate key="org.freedesktop.policykit.exec.path">@libexecdir@/gsd-backlight-helper</annotate>
++    <annotate key="org.freedesktop.policykit.exec.path">/run/current-system/sw/bin/elementary-settings-daemon/gsd-backlight-helper</annotate>
+   </action>
+
+ </policyconfig>
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix
new file mode 100644
index 000000000000..70b62e2b9a07
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-geoclue2/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, glib
+, gtk3
+, libgee
+, desktop-file-utils
+, geoclue2
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pantheon-agent-geoclue2";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-LrDu9NczSKN9YLo922MqYbcHG1QAwzXUb7W0Q/g9ftI=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    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 lib; {
+    description = "Pantheon Geoclue2 Agent";
+    homepage = "https://github.com/elementary/pantheon-agent-geoclue2";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = pantheon.maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix
new file mode 100644
index 000000000000..61bbb6ef9a4b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/services/pantheon-agent-polkit/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pantheon
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, libgee
+, granite
+, polkit
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pantheon-agent-polkit";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-YL1LHnPH7pP0EW9IkjdSEX+VuaAF9uNyFbl47vjVps0=";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    polkit
+  ];
+
+  meta = with 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;
+  };
+}