diff --git a/hscaffold.cabal b/hscaffold.cabal
--- a/hscaffold.cabal
+++ b/hscaffold.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hscaffold
-version:        0.4.2.0
+version:        0.4.3.0
 synopsis:       Very simple file/directory structure scaffolding writer monad EDSL
 description:     See our README on GitHub at <https://github.com/yamadapc/hscaffold> 
 homepage:       https://github.com/yamadapc/hscaffold#readme
diff --git a/src/Hscaffold.hs b/src/Hscaffold.hs
--- a/src/Hscaffold.hs
+++ b/src/Hscaffold.hs
@@ -18,6 +18,7 @@
     , readHsfiles
       -- * Convert a directory to Hscaffold
     , hscaffoldFromDirectory
+    , hscaffoldFromDirectoryWith
       -- * Compile Hscaffold to Haskell code
     , hscaffoldToHaskell
       -- ** Finer grained runners
diff --git a/src/Hscaffold/Generator/Directory.hs b/src/Hscaffold/Generator/Directory.hs
--- a/src/Hscaffold/Generator/Directory.hs
+++ b/src/Hscaffold/Generator/Directory.hs
@@ -17,26 +17,20 @@
 hscaffoldFromDirectoryWith :: ([FilePath] -> [FilePath])
                            -> FilePath
                            -> IO (ScaffoldAction e)
-hscaffoldFromDirectoryWith =
-    hscaffoldFromDirectoryWith' False
-
-hscaffoldFromDirectoryWith' :: Traversable t
-                            => Bool
-                            -> ([FilePath] -> t FilePath)
-                            -> FilePath
-                            -> IO [ScaffoldActionType e]
-hscaffoldFromDirectoryWith' isRecur p root = do
+hscaffoldFromDirectoryWith p root = do
     ls <- p <$> getDirectoryContents root
     concat <$> mapM classify ls
   where
-    fromFile fp' fp = do
+    fromFile fp fp' = do
         txt <- Text.readFile fp'
-        return [ File (normalise fp) txt ]
-    fromDir = hscaffoldFromDirectoryWith' True p
+        return [ File fp txt ]
+    fromDir fp fp' = do
+        children <- hscaffoldFromDirectoryWith p fp'
+        return [ Directory fp children ]
     classify fp = do
         let fp' = root </> fp
         isfl <- doesFileExist fp'
         isdir <- doesDirectoryExist fp'
         if isfl
-            then fromFile fp' (if isRecur then fp' else fp)
-            else if isdir then fromDir fp' else return []
+            then fromFile fp fp'
+            else if isdir then fromDir fp fp' else return []
diff --git a/test/HscaffoldSpec.hs b/test/HscaffoldSpec.hs
--- a/test/HscaffoldSpec.hs
+++ b/test/HscaffoldSpec.hs
@@ -4,6 +4,7 @@
 
 import           Control.Exception
 import           Control.Monad
+import           Data.List
 import           Data.Maybe
 import qualified Data.Text         as Text
 import           Hscaffold
@@ -135,12 +136,26 @@
         it "ignores git" $ do
             h <- hscaffoldFromDirectory "." :: IO (ScaffoldActionV)
             let ms = mapMaybe (\x -> case x of
-                                   File fp _ -> Just fp
+                                   File fp _ -> Just ("file", fp)
+                                   Directory fp _ -> Just ("directory", fp)
                                    _ -> Nothing)
                               h
-            ms `shouldNotContain` [ ".git/index" ]
-            ms `shouldContain` [ "README.md" ]
-            ms `shouldContain` [ "test/Spec.hs" ]
+            ms `shouldNotContain` [ ("directory", ".git") ]
+            ms `shouldContain` [ ("file", "README.md") ]
+            ms `shouldContain` [ ("directory", "test") ]
+
+            let (Just (Directory _ fs)) = find (\d -> case d of
+                                           Directory "src" _ -> True
+                                           _ -> False
+                                           ) h
+            map (\x -> case x of Directory f _ -> f ; File f _ -> f) fs
+                `shouldBe` ["Hscaffold", "Hscaffold.hs"]
+            let (Just (Directory _ fs')) = find (\d -> case d of
+                                           Directory "Hscaffold" _ -> True
+                                           _ -> False
+                                           ) fs
+            map (\x -> case x of Directory f _ -> f ; File f _ -> f) fs'
+                `shouldBe` ["EDSL.hs", "Generator", "Interpreter", "Types.hs"]
 
     describe "the runner" $
         describe "runAction" $ do
