diff --git a/horizon.dhall b/horizon.dhall
index 6dd688b6f0a68ffe9729c2a174bee70550714092..2b0528f0f89cc30cd2ed078b8c2ca7f1901ffc5a 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -303,6 +303,7 @@ let packages =
             "https://github.com/haskell/double-conversion"
             "5d092e0664442eaac8ae1d101dba57ce9b1c9b03"
             (None Text)
+      , dual-tree = H.callHackage "dual-tree" "0.2.3.1"
       , easy-file = H.callHackage "easy-file" "0.2.2"
       , echo = H.callHackage "echo" "0.1.4"
       , ed25519 =
diff --git a/initial-packages.nix b/initial-packages.nix
index 7358862a93d0bd6e2981bb1b97b436b57634bd47..1af53a2ae2ca6525d70882709ac5c7b5818b982d 100644
--- a/initial-packages.nix
+++ b/initial-packages.nix
@@ -453,6 +453,8 @@ self: with pkgs.haskell.lib; {
 
   double-conversion = self.callPackage (./pkgs/double-conversion.nix) { };
 
+  dual-tree = self.callPackage (./pkgs/dual-tree.nix) { };
+
   easy-file = self.callPackage (./pkgs/easy-file.nix) { };
 
   echo = self.callPackage (./pkgs/echo.nix) { };
diff --git a/pkgs/dual-tree.nix b/pkgs/dual-tree.nix
new file mode 100644
index 0000000000000000000000000000000000000000..81f124db2364c85ffc8148fe023be69cedea3d3b
--- /dev/null
+++ b/pkgs/dual-tree.nix
@@ -0,0 +1,34 @@
+{ mkDerivation
+, QuickCheck
+, base
+, lib
+, monoid-extras
+, semigroups
+, testing-feat
+}:
+mkDerivation {
+  pname = "dual-tree";
+  version = "0.2.3.1";
+  sha256 = "d0394b94c312a5ae032ee72d811400e3f435138ea05f7be6a4d019131a19d5a6";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base monoid-extras semigroups ];
+  testHaskellDepends = [
+    base
+    monoid-extras
+    QuickCheck
+    semigroups
+    testing-feat
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Rose trees with cached and accumulating monoidal annotations";
+  license = lib.licenses.bsd3;
+  broken = false;
+}