diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # dir-traverse
 
+## 0.2.1.0
+
+  * Add `getSubdirsRecursive`
+
 ## 0.2.0.1
 
   * Fix performance silliness
diff --git a/bench/Bench.hs b/bench/Bench.hs
--- a/bench/Bench.hs
+++ b/bench/Bench.hs
@@ -2,14 +2,18 @@
 
 module Main (main) where
 
+import           Control.Monad              (filterM, (<=<))
 import           Control.Monad.IO.Class     (liftIO)
 import           Criterion.Main
 import           Data.DirStream
 import qualified Filesystem.Path            as F
 import           Pipes                      (every, for, runEffect)
 import           Pipes.Safe                 (runSafeT)
+import           System.Directory           (doesDirectoryExist)
 import           System.Directory.Recursive
 
+
+-- todo use http://hackage.haskell.org/package/pipes-4.3.9/docs/Pipes-Prelude.html#v:toListM
 dirstreamGet :: F.FilePath -> IO ()
 dirstreamGet fp =
     runSafeT $ runEffect $
@@ -18,10 +22,17 @@
 discard :: Functor f => f a -> f ()
 discard = fmap (\x -> x `seq` ())
 
+filtered :: FilePath -> IO [FilePath]
+filtered = filterM doesDirectoryExist <=< getDirRecursive
+
 main :: IO ()
 main =
     defaultMain [ bgroup "."
                       [ bench "getDirRecursive" $ nfIO (discard <$> getDirRecursive ".")
                       , bench "DirStream" $ nfIO (dirstreamGet ".")
+                      ]
+                , bgroup "dirs"
+                      [ bench "getSubdirsRecursive" $ nfIO (discard <$> getSubdirsRecursive ".")
+                      , bench "filterM doesDirectoryExist <=< getDirRecursive" $ nfIO (discard <$> filtered ".")
                       ]
                 ]
diff --git a/dir-traverse.cabal b/dir-traverse.cabal
--- a/dir-traverse.cabal
+++ b/dir-traverse.cabal
@@ -1,10 +1,10 @@
 cabal-version: 1.18
 name: dir-traverse
-version: 0.2.0.1
+version: 0.2.1.0
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2019 Vanessa McHale
-maintainer: vanessa.mchale@iohk.io
+maintainer: vamchale@gmail.com
 author: Vanessa McHale
 synopsis: Simple directory traversal library
 description:
@@ -42,13 +42,14 @@
     default-language: Haskell2010
     ghc-options: -Wall
     build-depends:
-        base >=4.8,
+        base >=4.9,
         dir-traverse -any,
         criterion -any,
         dirstream -any,
         pipes -any,
         pipes-safe -any,
-        system-filepath -any
+        system-filepath -any,
+        directory -any
 
     if impl(ghc >=8.0)
         ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
diff --git a/src/System/Directory/Recursive.hs b/src/System/Directory/Recursive.hs
--- a/src/System/Directory/Recursive.hs
+++ b/src/System/Directory/Recursive.hs
@@ -1,4 +1,6 @@
-module System.Directory.Recursive ( getDirRecursive ) where
+module System.Directory.Recursive ( getDirRecursive
+                                  , getSubdirsRecursive
+                                  ) where
 
 import           Control.Applicative (pure, (<$>))
 import           Control.Monad       (filterM)
@@ -7,6 +9,23 @@
 import           System.Directory    (doesDirectoryExist, getDirectoryContents)
 import           System.Info         (os)
 
+
+{-# INLINE getSubdirsRecursive #-}
+-- | @since 0.2.1.0
+getSubdirsRecursive :: FilePath -> IO [FilePath]
+getSubdirsRecursive fp = do
+    all' <- listDirectory fp
+    let all'' = mkRel <$> all'
+    dirs <- filterM doesDirectoryExist all''
+    case dirs of
+        [] -> pure dirs
+        ds -> do
+            next <- foldMapA getSubdirsRecursive ds
+            pure $ dirs ++ next
+
+    where mkRel = (fp </>)
+          foldMapA = (fmap fold .) . traverse
+
 {-# INLINE getDirRecursive #-}
 getDirRecursive :: FilePath -> IO [FilePath]
 getDirRecursive fp = do
@@ -19,10 +38,14 @@
             next <- foldMapA getDirRecursive ds
             pure $ all'' ++ next
 
-    where foldMapA = (fmap fold .) . traverse
-          mkRel = (fp </>)
-          (</>) x y =
-            case os of
-                "mingw32" -> x ++ "\\" ++ y
-                _         -> x ++ "/" ++ y
-          listDirectory = fmap (filter (\p -> p /= "." && p /= "..")) . getDirectoryContents
+    where mkRel = (fp </>)
+          foldMapA = (fmap fold .) . traverse
+
+(</>) :: FilePath -> FilePath -> FilePath
+(</>) x y =
+    case os of
+        "mingw32" -> x ++ "\\" ++ y
+        _         -> x ++ "/" ++ y
+
+listDirectory :: FilePath -> IO [FilePath]
+listDirectory = fmap (filter (\p -> p /= "." && p /= "..")) . getDirectoryContents
