diff --git a/horizon.dhall b/horizon.dhall
index b204838a87f5fff64eb751c1e8551043678e369f..e6fa170c5d9ce507462ae0b2583db997b0e69571 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -3,6 +3,7 @@ let H =
 
 let packages =
       { Only = H.callHackage "Only" "0.1"
+      , attoparsec-iso8601 = H.callHackage "attoparsec-iso8601" "1.1.0.0"
       , brick = H.callHackage "brick" "1.9"
       , cassava = H.callHackage "cassava" "0.5.3.0"
       , constraints-extras = H.callHackage "constraints-extras" "0.4.0.0"
@@ -14,6 +15,8 @@ let packages =
       , deriving-compat = H.callHackage "deriving-compat" "0.6.3"
       , formatting = H.callHackage "formatting" "7.2.0"
       , haskell-src = H.callHackage "haskell-src" "1.0.4"
+      , http-api-data = H.callHackage "http-api-data" "0.5.1"
+      , http-media = H.callHackage "http-media" "0.8.0.0"
       , hxt = H.callHackage "hxt" "9.3.1.22"
       , hxt-charproperties = H.callHackage "hxt-charproperties" "9.5.0.0"
       , hxt-regex-xmlschema = H.callHackage "hxt-regex-xmlschema" "9.2.0.7"
@@ -23,6 +26,13 @@ let packages =
       , quiet = H.callHackage "quiet" "0.2"
       , recursion-schemes = H.callHackage "recursion-schemes" "5.2.2.4"
       , regex-compat = H.callHackage "regex-compat" "0.95.2.1"
+      , servant =
+          H.callGit
+            "https://github.com/haskell-servant/servant"
+            "7ae787371333556a7b84778631ed91d1d73e8370"
+            (Some "servant")
+      , sop-core = H.callHackage "sop-core" "0.5.0.2"
+      , string-conversions = H.callHackage "string-conversions" "0.4.0.1"
       , th-extras = H.callHackage "th-extras" "0.0.0.6"
       , type-errors = H.callHackage "type-errors" "0.2.0.2"
       , unagi-chan = H.callHackage "unagi-chan" "0.4.1.4"
diff --git a/horizon.lock b/horizon.lock
index d6c8f3a475f444e71aee181d3c327f2af47c9349..22f2899c0ca93d758f205d5d71bd53ab9c4dfe8c 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -2,6 +2,10 @@
   , mapValue =
       "760c33f4cbaa2de1d94170d733d56a2dfcc8766f12e2861fb36bbc7e272a6eb0"
   }
+, { mapKey = "attoparsec-iso8601"
+  , mapValue =
+      "e9381924b80af1d359ebf5c4d5eeabd059219603adf132913d598c1839e7eb5a"
+  }
 , { mapKey = "brick"
   , mapValue =
       "220f9d15bf93eaa2a28c4bc6c2a056031afc9120fd28160948bafeef89e219f2"
@@ -42,6 +46,14 @@
   , mapValue =
       "2d896b58cf0f770cb302c87d2dfa69bee4a0695a99002a3c9562605abecca8c3"
   }
+, { mapKey = "http-api-data"
+  , mapValue =
+      "78e041cece1042fdbe1ab46bf296f636faf0daa58a837438e888e1f72b3143c9"
+  }
+, { mapKey = "http-media"
+  , mapValue =
+      "d50ec8691d4951419260746c7dee43695c7dc897a4db9b6f33777d7e3184b150"
+  }
 , { mapKey = "hxt"
   , mapValue =
       "dae321e9369f296a7a32f0745485e70d3d59991da972ee110b8ff4e24ceed98b"
@@ -78,6 +90,18 @@
   , mapValue =
       "0b384fc5c7d44f762a315e6a5db0b79ad2d94170ce78099ef2e3166233c5a124"
   }
+, { mapKey = "servant"
+  , mapValue =
+      "16507876e4f9cddcca51bdf96704910d2cac52a088d901743712b78e52bff38c"
+  }
+, { mapKey = "sop-core"
+  , mapValue =
+      "d56af2b88721046b8b776bafe938a96257471ddfa7e93472e7c0a0befbc8cbf9"
+  }
+, { mapKey = "string-conversions"
+  , mapValue =
+      "09ec9168fbe0f6d127634b092da0357ec271b727cb9125a40ca7b75d2c1a3774"
+  }
 , { mapKey = "th-extras"
   , mapValue =
       "c92ed4131b334a9a9bd2fe738996e086bcfbdaa40d156843daebaa36a2f18f74"
diff --git a/overlay.nix b/overlay.nix
index 1eb6ee16565c455e432dfd13a7e0dd4263a35b15..03d05a9b3d681062bbfea38eb604ef1e028bb06e 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -3,6 +3,8 @@
 final: prev: with pkgs.haskell.lib; {
   Only = final.callPackage (./pkgs/Only.nix) { };
 
+  attoparsec-iso8601 = final.callPackage (./pkgs/attoparsec-iso8601.nix) { };
+
   brick = final.callPackage (./pkgs/brick.nix) { };
 
   cassava = final.callPackage (./pkgs/cassava.nix) { };
@@ -23,6 +25,10 @@ final: prev: with pkgs.haskell.lib; {
 
   haskell-src = final.callPackage (./pkgs/haskell-src.nix) { };
 
+  http-api-data = final.callPackage (./pkgs/http-api-data.nix) { };
+
+  http-media = final.callPackage (./pkgs/http-media.nix) { };
+
   hxt = final.callPackage (./pkgs/hxt.nix) { };
 
   hxt-charproperties = final.callPackage (./pkgs/hxt-charproperties.nix) { };
@@ -41,6 +47,12 @@ final: prev: with pkgs.haskell.lib; {
 
   regex-compat = final.callPackage (./pkgs/regex-compat.nix) { };
 
+  servant = final.callPackage (./pkgs/servant.nix) { };
+
+  sop-core = final.callPackage (./pkgs/sop-core.nix) { };
+
+  string-conversions = final.callPackage (./pkgs/string-conversions.nix) { };
+
   th-extras = final.callPackage (./pkgs/th-extras.nix) { };
 
   type-errors = final.callPackage (./pkgs/type-errors.nix) { };
diff --git a/pkgs/attoparsec-iso8601.nix b/pkgs/attoparsec-iso8601.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4afd2fbb1eed4c865a7a702b1092fe2ce426aec2
--- /dev/null
+++ b/pkgs/attoparsec-iso8601.nix
@@ -0,0 +1,27 @@
+{ mkDerivation, attoparsec, base, base-compat-batteries, lib, text
+, time, time-compat
+}:
+mkDerivation {
+  pname = "attoparsec-iso8601";
+  version = "1.1.0.0";
+  sha256 = "1109a817c448a154ec58047a8f01282530cb40d20fbd5690bc58b1443ecb264a";
+  revision = "1";
+  editedCabalFile = "1h84bvjji5kwk54fr8q2gs8qhb39xwsm585s3472vvjh54dllf31";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    attoparsec base base-compat-batteries text time time-compat
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskell/aeson";
+  description = "Parsing of ISO 8601 dates, originally from aeson";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/http-api-data.nix b/pkgs/http-api-data.nix
new file mode 100644
index 0000000000000000000000000000000000000000..315360f510c1b0a2643404451a8e8ef091dea76e
--- /dev/null
+++ b/pkgs/http-api-data.nix
@@ -0,0 +1,36 @@
+{ mkDerivation, HUnit, QuickCheck, attoparsec, attoparsec-iso8601
+, base, base-compat, bytestring, containers, cookie, hashable
+, hspec, hspec-discover, http-types, lib, quickcheck-instances
+, tagged, text, time-compat, transformers, unordered-containers
+, uuid-types
+}:
+mkDerivation {
+  pname = "http-api-data";
+  version = "0.5.1";
+  sha256 = "6166c64824e139a2727cc31af44d0077f66eb3921a20973bc6e98ff9fb77122b";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    attoparsec attoparsec-iso8601 base base-compat bytestring
+    containers cookie hashable http-types tagged text time-compat
+    transformers unordered-containers uuid-types
+  ];
+  testHaskellDepends = [
+    base base-compat bytestring cookie hspec HUnit QuickCheck
+    quickcheck-instances text time-compat unordered-containers
+    uuid-types
+  ];
+  testToolDepends = [ hspec-discover ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/fizruk/http-api-data";
+  description = "Converting to/from HTTP API data like URL pieces, headers and query parameters";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/http-media.nix b/pkgs/http-media.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a718e05c798f9764997e53e740cd97a02072d43e
--- /dev/null
+++ b/pkgs/http-media.nix
@@ -0,0 +1,32 @@
+{ mkDerivation, QuickCheck, base, bytestring, case-insensitive
+, containers, lib, test-framework, test-framework-quickcheck2
+, utf8-string
+}:
+mkDerivation {
+  pname = "http-media";
+  version = "0.8.0.0";
+  sha256 = "398279d1dff5b60cd8b8c650caceca248ea1184d694bedf5df5426963b2b9c53";
+  revision = "8";
+  editedCabalFile = "08r5iq0hi1y4y1b6vdi4kp52blvxzmd9gxa38xwzz86xnz84xvzl";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base bytestring case-insensitive containers utf8-string
+  ];
+  testHaskellDepends = [
+    base bytestring case-insensitive containers QuickCheck
+    test-framework test-framework-quickcheck2 utf8-string
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/zmthy/http-media";
+  description = "Processing HTTP Content-Type and Accept headers";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/servant.nix b/pkgs/servant.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b3d8fbe1be58305d870ba8c544ed916c1d2627be
--- /dev/null
+++ b/pkgs/servant.nix
@@ -0,0 +1,43 @@
+{ mkDerivation, QuickCheck, aeson, attoparsec, base, base-compat
+, bifunctors, bytestring, case-insensitive, constraints, deepseq
+, fetchgit, hspec, hspec-discover, http-api-data, http-media
+, http-types, lib, mmorph, mtl, network-uri, quickcheck-instances
+, singleton-bool, sop-core, string-conversions, tagged, text
+, transformers, vault
+}:
+mkDerivation {
+  pname = "servant";
+  version = "0.19.1";
+  src = fetchgit {
+    url = "https://github.com/haskell-servant/servant";
+    sha256 = "0ck3l8nj42nan8abdzvkl4ynb2l9nhnsq2zjl24d7sgca860fi57";
+    rev = "7ae787371333556a7b84778631ed91d1d73e8370";
+    fetchSubmodules = true;
+  };
+  postUnpack = "sourceRoot+=/servant/; echo source root reset to $sourceRoot";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson attoparsec base base-compat bifunctors bytestring
+    case-insensitive constraints deepseq http-api-data http-media
+    http-types mmorph mtl network-uri QuickCheck singleton-bool
+    sop-core string-conversions tagged text transformers vault
+  ];
+  testHaskellDepends = [
+    aeson base base-compat bytestring hspec http-media mtl QuickCheck
+    quickcheck-instances string-conversions text transformers
+  ];
+  testToolDepends = [ hspec-discover ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://docs.servant.dev/";
+  description = "A family of combinators for defining webservices APIs";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/sop-core.nix b/pkgs/sop-core.nix
new file mode 100644
index 0000000000000000000000000000000000000000..137498296ce35a99bcc6a9b6918d69185a3e4897
--- /dev/null
+++ b/pkgs/sop-core.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, deepseq, lib }:
+mkDerivation {
+  pname = "sop-core";
+  version = "0.5.0.2";
+  sha256 = "87bffd2254b98ded822d449fcd1c33dbd74d2ce96bf35e7a6714abc5a2297265";
+  revision = "2";
+  editedCabalFile = "0db36xhswrsc30cw5c5s7h6g1ykcb3bkjjnixaqqshxln6cwfsig";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base deepseq ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "True Sums of Products";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/string-conversions.nix b/pkgs/string-conversions.nix
new file mode 100644
index 0000000000000000000000000000000000000000..67dfd03599b32699d010cffefe7a1d7b46ed7164
--- /dev/null
+++ b/pkgs/string-conversions.nix
@@ -0,0 +1,29 @@
+{ mkDerivation, QuickCheck, base, bytestring, deepseq, hspec, lib
+, quickcheck-instances, text, utf8-string
+}:
+mkDerivation {
+  pname = "string-conversions";
+  version = "0.4.0.1";
+  sha256 = "46bcce6d9ce62c558b7658a75d9c6a62f7259d6b0473d011d8078234ad6a1994";
+  revision = "1";
+  editedCabalFile = "1g3wxx579mhs2icxngi78pvjfybbk606a6vgns88pg6ws5hrvx4s";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base bytestring text utf8-string ];
+  testHaskellDepends = [
+    base bytestring deepseq hspec QuickCheck quickcheck-instances text
+    utf8-string
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/soenkehahn/string-conversions#readme";
+  description = "Simplifies dealing with different types for strings";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file