diff --git a/configuration.nix b/configuration.nix
index e03c8a2fb983ec5edf81108eb7e52f024f1009db..d0857a79de0e9f3219172ba46cc7e81ebe35d5a8 100644
--- a/configuration.nix
+++ b/configuration.nix
@@ -16,5 +16,7 @@ final: prev: {
 
   text-icu = prev.callPackage ./pkgs/text-icu.nix { icu-i18n = pkgs.icu; };
 
+  X11-xft = addPkgconfigDepends prev.X11-xft [ pkgs.expat pkgs.xorg.libXau pkgs.xorg.libXdmcp ];
+
   zlib = prev.callPackage ./pkgs/zlib.nix { inherit (pkgs) zlib; };
 }
diff --git a/horizon.dhall b/horizon.dhall
index b1e5065561a85359a58844ed9b869ee5872e7325..a145fe76e90ffe02fe8fd94e4346e729cb7c599d 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -58,6 +58,8 @@ in  H.HorizonExport.MakePackageSet
           , H.callHackage "QuickCheck" "2.14.2"
           , H.callHackage "SHA" "1.6.4.4"
           , H.callHackage "StateVar" "1.2.2"
+          , H.callHackage "X11-xft" "0.3.4"
+          , H.callHackage "X11" "1.10.3"
           , H.callHackage "abstract-deque" "0.3"
           , H.callHackage "abstract-par" "0.3.3"
           , H.callHackage "adjunctions" "4.4.2"
@@ -66,6 +68,8 @@ in  H.HorizonExport.MakePackageSet
           , H.callHackage "aeson-yaml" "1.1.0.1"
           , H.callHackage "alex" "3.2.7.1"
           , H.callHackage "algebraic-graphs" "0.7"
+          , H.callHackage "alsa-core" "0.5.0.1"
+          , H.callHackage "alsa-mixer" "0.3.0"
           , H.callHackage "ansi-terminal" "0.11.3"
           , H.callHackage "ansi-wl-pprint" "0.6.9"
           , H.callHackage "appar" "0.1.8"
@@ -723,6 +727,7 @@ in  H.HorizonExport.MakePackageSet
           , H.callHackage "servant-swagger-ui-core" "0.3.5"
           , H.callHackage "servant-static-th" "1.0.0.0"
           , H.callHackage "setenv" "0.1.1.3"
+          , H.callHackage "setlocale" "1.0.0.10"
           , H.callHackage "shakespeare" "2.0.30"
           , H.callHackage "shake" "0.19.6"
           , H.callHackage "shelly" "1.10.0"
@@ -937,6 +942,8 @@ in  H.HorizonExport.MakePackageSet
           , H.callHackage "xml-conduit" "1.9.1.1"
           , H.callHackage "xml-types" "0.3.8"
           , H.callHackage "xml" "1.3.14"
+          , H.callHackage "xmonad-contrib" "0.17.1"
+          , H.callHackage "xmonad" "0.17.1"
           , H.callHackage "yaml" "0.11.8.0"
           , H.callHackage "zip-archive" "0.4.2.2"
           , H.callHackage "zlib" "0.6.3.0"
diff --git a/initial-packages.nix b/initial-packages.nix
index 7f39a81d489c44c53fa7b716513ca8d627d2e2e2..9238edd0c30d16b2cb0ac6cb14a2cdf2133ccd7e 100644
--- a/initial-packages.nix
+++ b/initial-packages.nix
@@ -49,6 +49,10 @@ self: with pkgs.haskell.lib; {
 
   StateVar = self.callPackage (./pkgs/StateVar.nix) { };
 
+  X11 = self.callPackage (./pkgs/X11.nix) { };
+
+  X11-xft = self.callPackage (./pkgs/X11-xft.nix) { };
+
   abstract-deque = self.callPackage (./pkgs/abstract-deque.nix) { };
 
   abstract-par = self.callPackage (./pkgs/abstract-par.nix) { };
@@ -65,6 +69,10 @@ self: with pkgs.haskell.lib; {
 
   algebraic-graphs = self.callPackage (./pkgs/algebraic-graphs.nix) { };
 
+  alsa-core = self.callPackage (./pkgs/alsa-core.nix) { };
+
+  alsa-mixer = self.callPackage (./pkgs/alsa-mixer.nix) { };
+
   ansi-terminal = self.callPackage (./pkgs/ansi-terminal.nix) { };
 
   ansi-wl-pprint = self.callPackage (./pkgs/ansi-wl-pprint.nix) { };
@@ -1147,6 +1155,8 @@ self: with pkgs.haskell.lib; {
 
   setenv = self.callPackage (./pkgs/setenv.nix) { };
 
+  setlocale = self.callPackage (./pkgs/setlocale.nix) { };
+
   shake = self.callPackage (./pkgs/shake.nix) { };
 
   shakespeare = self.callPackage (./pkgs/shakespeare.nix) { };
@@ -1519,6 +1529,10 @@ self: with pkgs.haskell.lib; {
 
   xml-types = self.callPackage (./pkgs/xml-types.nix) { };
 
+  xmonad = self.callPackage (./pkgs/xmonad.nix) { };
+
+  xmonad-contrib = self.callPackage (./pkgs/xmonad-contrib.nix) { };
+
   yaml = self.callPackage (./pkgs/yaml.nix) { };
 
   zip-archive = self.callPackage (./pkgs/zip-archive.nix) { };
diff --git a/pkgs/X11-xft.nix b/pkgs/X11-xft.nix
new file mode 100644
index 0000000000000000000000000000000000000000..584196b3314853f40526545485ab0da3bcdd7cde
--- /dev/null
+++ b/pkgs/X11-xft.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, X11, base, lib, libXft, utf8-string }:
+mkDerivation {
+  pname = "X11-xft";
+  version = "0.3.4";
+  sha256 = "6200d2deabe9638bad4d1fed4399e3147254c2776a0fae71bf38ca423242a916";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base utf8-string X11 ];
+  libraryPkgconfigDepends = [ libXft ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Bindings to the Xft and some Xrender parts";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/X11.nix b/pkgs/X11.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a188124bef2130a8a299f34c53d2c0da8bd63da4
--- /dev/null
+++ b/pkgs/X11.nix
@@ -0,0 +1,39 @@
+{ mkDerivation
+, base
+, data-default-class
+, lib
+, libX11
+, libXScrnSaver
+, libXext
+, libXinerama
+, libXrandr
+, libXrender
+}:
+mkDerivation {
+  pname = "X11";
+  version = "1.10.3";
+  sha256 = "d84ad1b8f5cdb65a0de17f84d765ebbb7aeeab9608c3740804da28100616d242";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base data-default-class ];
+  librarySystemDepends = [
+    libX11
+    libXext
+    libXinerama
+    libXrandr
+    libXrender
+    libXScrnSaver
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/xmonad/X11";
+  description = "A binding to the X11 graphics library";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/alsa-core.nix b/pkgs/alsa-core.nix
new file mode 100644
index 0000000000000000000000000000000000000000..97a61666f52107b03ee0d85777fe8e23ce62b315
--- /dev/null
+++ b/pkgs/alsa-core.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, alsa-lib, base, extensible-exceptions, lib }:
+mkDerivation {
+  pname = "alsa-core";
+  version = "0.5.0.1";
+  sha256 = "eb50495ef05ecc7c06a0147da7f0d3efde832a44d23caaf5172dc114882270ab";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base extensible-exceptions ];
+  libraryPkgconfigDepends = [ alsa-lib ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://www.haskell.org/haskellwiki/ALSA";
+  description = "Binding to the ALSA Library API (Exceptions)";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/alsa-mixer.nix b/pkgs/alsa-mixer.nix
new file mode 100644
index 0000000000000000000000000000000000000000..955d3fce5e497d973d1046cf07450e4fc1928efb
--- /dev/null
+++ b/pkgs/alsa-mixer.nix
@@ -0,0 +1,23 @@
+{ mkDerivation, alsa-core, alsa-lib, base, c2hs, lib, unix }:
+mkDerivation {
+  pname = "alsa-mixer";
+  version = "0.3.0";
+  sha256 = "cb6a197de99c6b4339a7f552e1c6b71eaefa11bb96102d5ba4519a23c615de02";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ alsa-core base unix ];
+  librarySystemDepends = [ alsa-lib ];
+  libraryToolDepends = [ c2hs ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/ttuegel/alsa-mixer";
+  description = "Bindings to the ALSA simple mixer API";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/setlocale.nix b/pkgs/setlocale.nix
new file mode 100644
index 0000000000000000000000000000000000000000..2b5851a50881fbaa5ccf24415cac42a2906128a3
--- /dev/null
+++ b/pkgs/setlocale.nix
@@ -0,0 +1,23 @@
+{ mkDerivation, base, lib }:
+mkDerivation {
+  pname = "setlocale";
+  version = "1.0.0.10";
+  sha256 = "3972ff10c22318f5451215dc886c1535fea5ab7dfefe5ce461b1603865423ba7";
+  revision = "2";
+  editedCabalFile = "1k4idj2xl9dg5nfz128xazrrydz9mgm3bbjrc0cyby8n3c0ij9x1";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://gitlab.com/Kritzefitz/haskell-setlocale/";
+  description = "Haskell bindings to setlocale";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/xmonad-contrib.nix b/pkgs/xmonad-contrib.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c3acbe193a912379929e24c51248524367e67e45
--- /dev/null
+++ b/pkgs/xmonad-contrib.nix
@@ -0,0 +1,75 @@
+{ mkDerivation
+, QuickCheck
+, X11
+, X11-xft
+, base
+, bytestring
+, containers
+, deepseq
+, directory
+, filepath
+, hspec
+, lib
+, mtl
+, process
+, random
+, time
+, unix
+, utf8-string
+, xmonad
+}:
+mkDerivation {
+  pname = "xmonad-contrib";
+  version = "0.17.1";
+  sha256 = "ab378337f48f8f359f6ff6425b1d7cfefccf336e527c3a7606d070e567479253";
+  revision = "1";
+  editedCabalFile = "0dc9nbn0kaw98rgpi1rq8np601zjhdr1y0ydg6yb82wwaqawql6z";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base
+    bytestring
+    containers
+    deepseq
+    directory
+    filepath
+    mtl
+    process
+    random
+    time
+    unix
+    utf8-string
+    X11
+    X11-xft
+    xmonad
+  ];
+  testHaskellDepends = [
+    base
+    bytestring
+    containers
+    deepseq
+    directory
+    hspec
+    mtl
+    process
+    QuickCheck
+    random
+    time
+    unix
+    utf8-string
+    X11
+    xmonad
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://xmonad.org/";
+  description = "Community-maintained extensions for xmonad";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/xmonad.nix b/pkgs/xmonad.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9edee4b02bb4a39682e0f1bc926f216fc5a53a4c
--- /dev/null
+++ b/pkgs/xmonad.nix
@@ -0,0 +1,64 @@
+{ mkDerivation
+, QuickCheck
+, X11
+, base
+, containers
+, data-default-class
+, directory
+, filepath
+, lib
+, mtl
+, process
+, quickcheck-classes
+, setlocale
+, time
+, transformers
+, unix
+}:
+mkDerivation {
+  pname = "xmonad";
+  version = "0.17.1";
+  sha256 = "884a32837e41410bab622b26a4b5dc38bd88f1b78a6efd5c552f1456b1e7f8aa";
+  revision = "2";
+  editedCabalFile = "1rgwrnyb7kijzl2mqm8ks2nydh37q5vkbg4400rg9n6x13w2r9b3";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base
+    containers
+    data-default-class
+    directory
+    filepath
+    mtl
+    process
+    setlocale
+    time
+    transformers
+    unix
+    X11
+  ];
+  executableHaskellDepends = [ base ];
+  testHaskellDepends = [
+    base
+    containers
+    QuickCheck
+    quickcheck-classes
+    X11
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  postInstall = ''
+    install -D man/xmonad.1 ''${!outputDoc}/share/man/man1/xmonad.1
+    install -D man/xmonad.hs ''${!outputDoc}/share/doc/$name/sample-xmonad.hs
+  '';
+  homepage = "http://xmonad.org";
+  description = "A tiling window manager";
+  license = lib.licenses.bsd3;
+  broken = false;
+}