diff --git a/Lastik.cabal b/Lastik.cabal
--- a/Lastik.cabal
+++ b/Lastik.cabal
@@ -1,5 +1,5 @@
 Name:               Lastik
-Version:            0.3
+Version:            0.4
 License:            BSD3
 License-File:       LICENSE
 Author:             Tony Morris <code@tmorris.net>
@@ -18,7 +18,7 @@
   if flag(small_base)
     Build-Depends: base < 4 && >= 3, bytestring, directory, filepath, process, zip-archive, pureMD5, SHA
   else
-    Build-Depends: base < 3, filepath, process, FileManip, zip-archive, pureMD5, SHA
+    Build-Depends: base < 3, filepath, process, zip-archive, pureMD5, SHA
 
   GHC-Options:    -Wall
   Exposed-Modules:
diff --git a/Lastik/Directory.hs b/Lastik/Directory.hs
--- a/Lastik/Directory.hs
+++ b/Lastik/Directory.hs
@@ -8,7 +8,8 @@
                         dropRoot,
                         dropRoot',
                         mkdir,
-                        rmdir
+                        rmdir,
+                        copyFiles
                         ) where
 
 import System.Directory
@@ -102,3 +103,25 @@
 rmdir :: FilePath -- ^ The directory to remove.
          -> IO ()
 rmdir d = doesDirectoryExist d >>= flip when (removeDirectoryRecursive d)
+
+-- | Copies files from one directory to another directory.
+copyFiles :: RecursePredicate -- ^ The recursion predicate to search for files to copy.
+             -> FilterPredicate -- ^ The filter predicate to search for files to copy.
+             -> FilePath -- ^ The directory to copy from.
+             -> FilePath -- ^ The directory to copy to.
+             -> IO ()
+copyFiles r f from to = do isf <- doesFileExist from
+                           if isf
+                             then error ("Cannot copy from file " ++ from)
+                             else do isd <- doesDirectoryExist from
+                                     if isd
+                                       then do dis <- doesFileExist to
+                                               if dis
+                                                 then error ("Cannot copy to" ++ to ++ " (a file)")
+                                                 else do j <- find r f from
+                                                         k <- filterM doesFileExist j
+                                                         mkdir to
+                                                         mapM_ (\z -> let t = to </> dropWhile (pathSeparator ==) (drop (length from) z)
+                                                                      in do mkdir (dropFileName t)
+                                                                            copyFile z t) k
+                                       else error (from ++ " is not a directory")
