diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c78f1e1244ac6a2decf5b49934ac3c7b84e5c341..c05634c2a2fe7030a3ecbdb0d4e4d26eb789edbe 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -13,9 +13,11 @@ build:
          - aarch64-darwin
          - x86_64-linux
         PACKAGE:
+         - cardano-api
          - cardano-cli
          - cardano-node
          - hydra-node
+         - hydra-tui
 
 devour:
   stage: devour
diff --git a/README.md b/README.md
index cbc20b5bf14d2faab2ac689f9acf47d49f199b0f..aa95af87c61bab0b8e8700d665d52cbd98bed49f 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@ The following things are always expected to be here:
 * cardano-cli
 * cardano-node
 * hydra-node
+* hydra-tui
 
 ## Updating the Package Set
 
diff --git a/horizon.dhall b/horizon.dhall
index 7096fd3cd6c7c4e41a415d0d7594f6c854a678e9..a5ee2e68ed5ce5a148391412821e8247b692a0ca 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -29,12 +29,14 @@ let packages =
             H.callHackage "hspec-junit-formatter" "1.1.0.2"
         , hydra-cardano-api = callHydra "hydra-cardano-api"
         , hydra-chain-observer = callHydra "hydra-chain-observer"
+        , hydra-cluster = callHydra "hydra-cluster"
         , hydra-explorer = callHydra "hydra-explorer"
         , hydra-prelude = callHydra "hydra-prelude"
         , hydra-plutus = callHydra "hydra-plutus"
         , hydra-plutus-extras = callHydra "hydra-plutus-extras"
         , hydra-node = callHydra "hydra-node"
         , hydra-test-utils = callHydra "hydra-test-utils"
+        , hydra-tui = callHydra "hydra-tui"
         , prometheus = H.callHackage "prometheus" "2.2.4"
         , iso8601-time = H.callHackage "iso8601-time" "0.1.5"
         , modern-uri = H.callHackage "modern-uri" "0.3.6.1"
diff --git a/horizon.lock b/horizon.lock
index dd47171e5be5923e841aada7628e577cafea6b81..f3106967fae5dbe3d8e68ad44d25f715c4aa6553 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -34,6 +34,10 @@
   , mapValue =
       "bbdefe4c7b508f5ba34d1a337fabe8b012d700a8c55ff1634483c88f3d1118a5"
   }
+, { mapKey = "hydra-cluster"
+  , mapValue =
+      "75ba619576da9ec6644ca305e2056c1c895248203257c15359bb31d220b56b99"
+  }
 , { mapKey = "hydra-explorer"
   , mapValue =
       "73391a510ae251a75ac6e93563449a44456e3ef88f94d61906592e1ad190329f"
@@ -58,6 +62,10 @@
   , mapValue =
       "715ee83e164aaa12d3d5273e405a82b8f18e2a24fdef0f542a6a6fa39982abab"
   }
+, { mapKey = "hydra-tui"
+  , mapValue =
+      "a1120dd5aeeefb46237ac34f89ee387705c5dae2b656b9ab7f0adb62f0ecf6c9"
+  }
 , { mapKey = "iso8601-time"
   , mapValue =
       "973d6098c03af5f6f0de5dd2443273ecc3ab11fe0b45809f0e3ddee8ab6df0c3"
diff --git a/overlay.nix b/overlay.nix
index c8972bbe473289680bc08380226aa94146c2acf8..06d0641b9e03dbb8d1ca59c4803133328d34f2eb 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -20,6 +20,8 @@ final: prev: with pkgs.haskell.lib; {
 
   hydra-chain-observer = f final prev "hydra-chain-observer" (final.callPackage (./pkgs/hydra-chain-observer.nix) { });
 
+  hydra-cluster = f final prev "hydra-cluster" (final.callPackage (./pkgs/hydra-cluster.nix) { });
+
   hydra-explorer = f final prev "hydra-explorer" (final.callPackage (./pkgs/hydra-explorer.nix) { });
 
   hydra-node = f final prev "hydra-node" (final.callPackage (./pkgs/hydra-node.nix) { });
@@ -32,6 +34,8 @@ final: prev: with pkgs.haskell.lib; {
 
   hydra-test-utils = f final prev "hydra-test-utils" (final.callPackage (./pkgs/hydra-test-utils.nix) { });
 
+  hydra-tui = f final prev "hydra-tui" (final.callPackage (./pkgs/hydra-tui.nix) { });
+
   iso8601-time = f final prev "iso8601-time" (final.callPackage (./pkgs/iso8601-time.nix) { });
 
   modern-uri = f final prev "modern-uri" (final.callPackage (./pkgs/modern-uri.nix) { });
diff --git a/pkgs/hydra-cluster.nix b/pkgs/hydra-cluster.nix
new file mode 100644
index 0000000000000000000000000000000000000000..0144ed9bea4b54de939db90d0ba5c21959351416
--- /dev/null
+++ b/pkgs/hydra-cluster.nix
@@ -0,0 +1,64 @@
+{ mkDerivation, HUnit, QuickCheck, aeson, async, base, bytestring
+, cardano-ledger-api, cardano-slotting, containers, contra-tracer
+, data-default, directory, fetchgit, filepath, hspec
+, hspec-discover, hspec-golden-aeson, http-client, http-conduit
+, hydra-cardano-api, hydra-chain-observer, hydra-explorer
+, hydra-node, hydra-prelude, hydra-test-utils, io-classes
+, iohk-monitoring, lens, lens-aeson, lib, optparse-applicative
+, process, regex-tdfa, req, scientific, statistics, stm, temporary
+, text, time, typed-process, unix, vector, websockets
+}:
+mkDerivation {
+  pname = "hydra-cluster";
+  version = "0.17.0";
+  src = fetchgit {
+    url = "https://github.com/input-output-hk/hydra";
+    sha256 = "0fk4bjx7hh8hff9hjzdhdkm3px5a8z730xx2f0ly93cl9n93qfbs";
+    rev = "aeb17ef49017937615dd67a4bc0da23bebdfd4bd";
+    fetchSubmodules = true;
+  };
+  postUnpack = "sourceRoot+=/hydra-cluster/; echo source root reset to $sourceRoot";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = true;
+  libraryHaskellDepends = [
+    aeson async base bytestring cardano-slotting containers
+    contra-tracer data-default directory filepath http-conduit
+    hydra-cardano-api hydra-node hydra-prelude hydra-test-utils
+    io-classes iohk-monitoring lens lens-aeson optparse-applicative
+    process QuickCheck req temporary text time typed-process unix
+    websockets
+  ];
+  executableHaskellDepends = [
+    directory filepath hydra-node hydra-prelude hydra-test-utils
+    optparse-applicative
+  ];
+  executableToolDepends = [ hydra-node ];
+  testHaskellDepends = [
+    aeson async base bytestring cardano-ledger-api containers directory
+    filepath hspec hspec-golden-aeson http-client http-conduit
+    hydra-cardano-api hydra-explorer hydra-node hydra-prelude
+    hydra-test-utils io-classes lens lens-aeson process QuickCheck stm
+    text time
+  ];
+  testToolDepends = [
+    hspec-discover hydra-chain-observer hydra-explorer hydra-node
+  ];
+  benchmarkHaskellDepends = [
+    aeson base containers directory filepath HUnit hydra-cardano-api
+    hydra-node hydra-prelude hydra-test-utils io-classes lens
+    lens-aeson optparse-applicative process QuickCheck regex-tdfa
+    scientific statistics time vector
+  ];
+  benchmarkToolDepends = [ hydra-node ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = true;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Integration test suite using a local cluster of cardano and hydra nodes";
+  license = lib.licenses.asl20;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/hydra-tui.nix b/pkgs/hydra-tui.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c1d0a9f9274340145fb917be348529828c6d818f
--- /dev/null
+++ b/pkgs/hydra-tui.nix
@@ -0,0 +1,43 @@
+{ mkDerivation, aeson, async, base, blaze-builder, brick
+, bytestring, containers, fetchgit, filepath, hspec, hspec-discover
+, hydra-cardano-api, hydra-cluster, hydra-node, hydra-prelude
+, hydra-test-utils, io-classes, lib, microlens, microlens-mtl
+, microlens-th, optparse-applicative, regex-tdfa, req, text, time
+, unix, vty, vty-unix, websockets
+}:
+mkDerivation {
+  pname = "hydra-tui";
+  version = "0.17.0";
+  src = fetchgit {
+    url = "https://github.com/input-output-hk/hydra";
+    sha256 = "0fk4bjx7hh8hff9hjzdhdkm3px5a8z730xx2f0ly93cl9n93qfbs";
+    rev = "aeb17ef49017937615dd67a4bc0da23bebdfd4bd";
+    fetchSubmodules = true;
+  };
+  postUnpack = "sourceRoot+=/hydra-tui/; echo source root reset to $sourceRoot";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson async base brick containers hydra-cardano-api hydra-node
+    hydra-prelude io-classes microlens microlens-mtl microlens-th
+    optparse-applicative req text time vty vty-unix websockets
+  ];
+  executableHaskellDepends = [ hydra-prelude optparse-applicative ];
+  testHaskellDepends = [
+    blaze-builder bytestring filepath hspec hydra-cardano-api
+    hydra-cluster hydra-node hydra-prelude hydra-test-utils io-classes
+    optparse-applicative regex-tdfa unix vty vty-unix
+  ];
+  testToolDepends = [ hspec-discover hydra-node ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = true;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "TUI for managing a Hydra node";
+  license = lib.licenses.asl20;
+  broken = false;
+}
\ No newline at end of file