diff --git a/Codec/Archive/Zip/Conduit/Zip.hs b/Codec/Archive/Zip/Conduit/Zip.hs
--- a/Codec/Archive/Zip/Conduit/Zip.hs
+++ b/Codec/Archive/Zip/Conduit/Zip.hs
@@ -32,7 +32,6 @@
 import           Data.Digest.CRC32 (crc32)
 import           Data.Either (isLeft)
 import           Data.Maybe (fromMaybe, fromJust)
-import           Data.Monoid ((<>))
 import           Data.Time (LocalTime(..), TimeOfDay(..), toGregorian)
 import           Data.Word (Word16, Word64)
 
@@ -95,7 +94,7 @@
 -- Any errors are thrown in the underlying monad (as 'ZipError's).
 zipStream :: (MonadBase b m, PrimMonad b, MonadThrow m) => ZipOptions -> C.ConduitM (ZipEntry, ZipData m) BS.ByteString m Word64
 zipStream ZipOptions{..} = execStateC 0 $ do
-  (cnt, cdir) <- next 0 (mempty :: P.Put)
+  (cnt, cdir) <- next 0 (return ())
   cdoff <- get
   output cdir
   eoff <- get
@@ -105,7 +104,7 @@
     (return (cnt, dir))
     (\e -> do
       d <- entry e
-      next (succ cnt) $ dir <> d)
+      next (succ cnt) $ dir >> d)
   entry (ZipEntry{..}, zipData -> dat) = do
     let usiz = dataSize dat
         sdat = left ((C..| sizeCRC) . C.toProducer) dat
diff --git a/cmd/unzip.hs b/cmd/unzip.hs
--- a/cmd/unzip.hs
+++ b/cmd/unzip.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE RecordWildCards #-}
 import           Control.Monad (when, unless)
 import           Control.Monad.IO.Class (liftIO)
@@ -6,7 +7,11 @@
 import qualified Data.Conduit as C
 import qualified Data.Conduit.Binary as CB
 import           Data.Time.LocalTime (localTimeToUTC, utc)
-import           System.Directory (createDirectoryIfMissing, setModificationTime)
+import           System.Directory (createDirectoryIfMissing
+#if MIN_VERSION_directory(1,2,3)
+  , setModificationTime
+#endif
+  )
 import           System.Environment (getProgName, getArgs)
 import           System.Exit (exitFailure)
 import           System.FilePath.Posix (takeDirectory) -- zip files only use forward slashes
@@ -26,7 +31,9 @@
         mapM_ (liftIO . hSetFileSize h . toInteger) zipEntrySize
         write C..| CB.sinkHandle h
         liftIO $ hClose h
+#if MIN_VERSION_directory(1,2,3)
     liftIO $ setModificationTime name $ localTimeToUTC utc zipEntryTime -- FIXME: timezone
+#endif
     where name = BSC.unpack $ BSC.dropWhile ('/' ==) zipEntryName -- should we utf8 decode?
   start (Right _) = fail "Unexpected leading or directory data contents"
   write = C.await >>= maybe
diff --git a/cmd/zip.hs b/cmd/zip.hs
--- a/cmd/zip.hs
+++ b/cmd/zip.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 import           Control.Monad (filterM, void)
 import           Control.Monad.IO.Class (MonadIO, liftIO)
 import           Control.Monad.Trans.Resource (MonadResource, runResourceT)
@@ -7,7 +8,13 @@
 import           Data.List (foldl')
 import           Data.Time.LocalTime (utcToLocalTime, utc)
 import qualified System.Console.GetOpt as Opt
-import           System.Directory (doesDirectoryExist, getModificationTime, isSymbolicLink, listDirectory)
+import           System.Directory (doesDirectoryExist, getModificationTime
+#if MIN_VERSION_directory(1,2,6)
+  , isSymbolicLink, listDirectory
+#else
+  , getDirectoryContents
+#endif
+  )
 import           System.Environment (getProgName, getArgs)
 import           System.Exit (exitFailure)
 import           System.FilePath.Posix ((</>)) -- zip files only want forward slashes
@@ -38,7 +45,11 @@
   isd <- liftIO $ doesDirectoryExist p
   if isd
     then do
+#if MIN_VERSION_directory(1,2,6)
       dl <- liftIO $ filterM (fmap not . isSymbolicLink) . map (p </>) =<< listDirectory p
+#else
+      dl <- liftIO $ filter (`notElem` [".",".."]) . map (p </>) <$> getDirectoryContents p
+#endif
       C.yield (e{ zipEntryName = zipEntryName e `BSC.snoc` '/', zipEntrySize = Just 0 }, mempty)
       generate $ dl ++ paths
     else do
diff --git a/zip-stream.cabal b/zip-stream.cabal
--- a/zip-stream.cabal
+++ b/zip-stream.cabal
@@ -1,5 +1,5 @@
 name:                zip-stream
-version:             0.1
+version:             0.1.0.1
 synopsis:            ZIP archive streaming using conduits
 description:         Process (extract and create) zip files as streams (e.g., over the network), accessing contained files without having to write the zip file to disk (unlike zip-conduit).
 license:             BSD3
@@ -7,7 +7,7 @@
 author:              Dylan Simon
 maintainer:          dylan@dylex.net
 copyright:           2017
-category:            Codec
+category:            Codec, Conduit
 build-type:          Simple
 cabal-version:       >=1.10
 
@@ -46,13 +46,14 @@
   default-language:    Haskell2010
   ghc-options: -Wall
   build-depends:
-    base >=4.7 && <5,
+    base >=4.8 && <5,
     bytestring,
     conduit,
     conduit-extra,
     directory,
     filepath,
     time,
+    transformers,
     zip-stream
 
 executable zip-stream
@@ -61,7 +62,7 @@
   default-language:    Haskell2010
   ghc-options: -Wall
   build-depends:
-    base >=4.7 && <5,
+    base >=4.8 && <5,
     bytestring,
     conduit,
     conduit-extra,
@@ -69,4 +70,5 @@
     filepath,
     resourcet,
     time,
+    transformers,
     zip-stream
