diff --git a/Pipes/Files.hs b/Pipes/Files.hs
--- a/Pipes/Files.hs
+++ b/Pipes/Files.hs
@@ -3,8 +3,10 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE TupleSections #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE ViewPatterns #-}
 
 module Pipes.Files
     (
@@ -92,6 +94,7 @@
 import           Control.Exception as E
 import           Control.Monad
 import           Control.Monad.IO.Class
+import           Control.Monad.Logic
 import           Control.Monad.Morph
 import           Control.Monad.Trans.Control
 import           Data.Attoparsec.Text as A
@@ -105,12 +108,12 @@
 import           Data.Time.Clock.POSIX
 import           Data.Word (Word8)
 import           Foreign.C
+import           Hierarchy
 import           Pipes
 import           Pipes.Files.Directory
 import           Pipes.Files.Types
 import qualified Pipes.Prelude as P
 import           Pipes.Safe
-import           Pipes.Tree
 import           Prelude
 import           System.Directory hiding (executable, findFiles)
 import           System.Posix.ByteString.FilePath
@@ -538,23 +541,17 @@
 {-# INLINE handleEntryIO #-}
 
 -- | Return all files within a directory tree, hierarchically.
-directoryFiles :: MonadIO m => FilePath -> TreeT m FilePath
-directoryFiles path = CofreeT $ Select $ do
-    eres <- liftIO $ E.try $ getDirectoryContents path
-    case eres of
-        Left (_ :: IOException) -> return ()
-            -- liftIO $ putStrLn $
-            --     "Error reading directory " ++ path ++ ": " ++ show e
-        Right entries ->
-            forM_ (filter (`notElem` [".", ".."]) entries) $ \entry -> do
-                let fullPath = path ++ "/" ++ entry
-                estat <- liftIO $ E.try $ getFileStatus fullPath
-                case estat of
-                    Left (_ :: IOException) -> return ()
-                    Right st ->
-                        yield (fullPath :< if isDirectory st
-                                           then Just $ directoryFiles fullPath
-                                           else Nothing)
+directoryFiles :: (MonadPlus m, MonadIO m) => FilePath -> TreeT m FilePath
+directoryFiles path = CofreeT $ do
+    Right entries <-
+        liftIO $ E.try @E.SomeException $ getDirectoryContents path
+    entry <- select (filter (`notElem` [".", ".."]) entries)
+    let fullPath = path ++ "/" ++ entry
+    Right st <- liftIO $ E.try @E.SomeException $ getFileStatus fullPath
+    pure $ fullPath :<
+        if isDirectory st
+        then Just (directoryFiles fullPath)
+        else Nothing
 
 genericFindFiles
     :: (MonadIO m, MonadBaseControl IO m,
diff --git a/Pipes/Files/Directory.hs b/Pipes/Files/Directory.hs
--- a/Pipes/Files/Directory.hs
+++ b/Pipes/Files/Directory.hs
@@ -32,7 +32,7 @@
     throwErrnoPathIfNullRetry "openDirStream" name $ c_opendir s
 {-# INLINE openDirStream #-}
 
-foreign import ccall unsafe "__hsunix_opendir"
+foreign import ccall unsafe "opendir"
    c_opendir :: CString  -> IO (Ptr CDir)
 
 getDirectoryContentsAndAttrs :: RawFilePath -> IO [(RawFilePath, CUInt)]
diff --git a/pipes-files.cabal b/pipes-files.cabal
--- a/pipes-files.cabal
+++ b/pipes-files.cabal
@@ -1,5 +1,5 @@
 name:          pipes-files
-version:       0.1.2
+version:       0.1.3
 synopsis:      Fast traversal of directory trees using pipes
 description:   Fast traversal of directory trees using pipes
 homepage:      https://github.com/jwiegley/pipes-files
@@ -35,20 +35,20 @@
     , Pipes.Files.Directory
     , Pipes.Files.Types
   build-depends:       
-      base                >=4.7  && <4.10
+      base                >=4.7  && <5
     , transformers        >=0.3  && <0.6
     , transformers-base   >=0.3  && <0.6
-    , transformers-compat >=0.3  && <0.6
-    , exceptions          >=0.8  && <0.9
-    , mmorph              >=1.0  && <1.1
+    , transformers-compat >=0.3  && <1.0
+    , exceptions          >=0.10 && <1.0
+    , mmorph              >=1.0  && <2
     , mtl                 >=2.1  && <2.3
     , monad-control       >=1.0  && <1.1
     , semigroups          >=0.16 && <0.19
-    , free                >=4.12 && <4.13
+    , free                >=4.12 && <6
     , pipes               >=4.1  && <4.4
     , directory           >=1.2  && <1.4
     , unix                >=2.7  && <2.8
-    , hierarchy           >=0.2.1
+    , hierarchy           >=1.0.0
     , regex-posix
     , unix-compat
     , attoparsec
@@ -58,6 +58,7 @@
     , filepath
     , posix-paths
     , pipes-safe
+    , logict
   -- hs-source-dirs:      
   default-language:    Haskell2010
 
@@ -72,6 +73,7 @@
     , doctest      >=0.8
     , filepath     >=1.3
     , semigroups   >=0.16 && <0.19
+    , text
 
 test-suite test
   default-language: Haskell2010
@@ -81,7 +83,7 @@
   main-is:          Main.hs
   build-depends: 
       base >=3
-    , hierarchy
+    , hierarchy          >=1.0.0
     , pipes-files
     , pipes              >=4.1  && <4.4
     , directory          >=1.2  && <1.4
@@ -90,6 +92,7 @@
     , mtl                >=2.1  && <2.3
     , hspec              >=1.4.4
     , hspec-expectations >=0.3
+    , logict
 
 test-suite find-hs
   default-language: Haskell2010
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,11 +2,10 @@
 
 import Control.Cond
 import Control.Monad
+import Control.Monad.Logic
 import Data.List
-import Pipes
+import Hierarchy
 import Pipes.Files
-import Pipes.Prelude (toListM)
-import Pipes.Tree
 import Test.Hspec
 
 main :: IO ()
@@ -44,5 +43,5 @@
                    , "./test/doctest.hs"
                    , "./test/find-hs.hs"
                    ]
-    found <- toListM $ enumerate (walk files)
+    found <- observeAllT $ walk files
     sort found `shouldBe` expected
