diff --git a/etcd.cabal b/etcd.cabal
--- a/etcd.cabal
+++ b/etcd.cabal
@@ -1,5 +1,5 @@
 name:                etcd
-version:             1.0.4
+version:             1.0.5
 license:             OtherLicense
 license-file:        UNLICENSE
 synopsis:            Client for etcd, a highly-available key value store
diff --git a/src/Network/Etcd.hs b/src/Network/Etcd.hs
--- a/src/Network/Etcd.hs
+++ b/src/Network/Etcd.hs
@@ -30,6 +30,7 @@
       -- * Directory operations
     , createDirectory
     , listDirectoryContents
+    , listDirectoryContentsRecursive
     , removeDirectory
     , removeDirectoryRecursive
     ) where
@@ -391,6 +392,22 @@
             case _nodeNodes node of
                 Nothing -> return []
                 Just children -> return children
+
+
+-- | Same as 'listDirectoryContents' but includes all descendant nodes. Note
+-- that directory 'Node's will not contain their children.
+listDirectoryContentsRecursive :: Client -> Key -> IO [Node]
+listDirectoryContentsRecursive client key = do
+    hr <- runRequest $ httpGET (keyUrl client key) recursiveParam
+    case hr of
+        Left _ -> return []
+        Right res -> do
+            let node = _resNode res
+                flatten n = n { _nodeNodes = Nothing }
+                          : maybe [] (concatMap flatten) (_nodeNodes n)
+            case _nodeNodes node of
+                Nothing -> return []
+                Just children -> return $ concatMap flatten children
 
 
 -- | Remove the directory at the given key. The directory MUST be empty,
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -138,6 +138,17 @@
             length nodes `shouldBe` 1
             _nodeValue (head nodes) `shouldBe` (Just "value")
 
+        it "Listing a directory recursively" $ do
+            (client, key) <- setup
+            createDirectory client key Nothing
+            createDirectory client (key <> "/one") Nothing
+            set client (key <> "/one/two") "value" Nothing
+            set client (key <> "/one/three") "value" Nothing
+            nodes <- listDirectoryContentsRecursive client key
+            length nodes `shouldBe` 3
+            _nodeValue (head nodes) `shouldBe` Nothing
+            _nodeValue (last nodes) `shouldBe` (Just "value")
+
         it "Deleting a directory recursively" $ do
             (client, key) <- setup
             createDirectory client key Nothing
