diff --git a/Lastik.cabal b/Lastik.cabal
--- a/Lastik.cabal
+++ b/Lastik.cabal
@@ -1,5 +1,5 @@
 Name:               Lastik
-Version:            0.6.4
+Version:            0.7.0
 License:            BSD3
 License-File:       LICENSE
 Author:             Tony Morris <code@tmorris.net>
@@ -12,31 +12,38 @@
 Build-Type:         Simple
 
 Flag small_base
-  Description:     Choose the new, split-up base package.
+  Description:      Choose the new, split-up base package.
 
 Library
-  if flag(small_base)
-    Build-Depends: base < 4 && >= 3, bytestring, directory, filepath, process, zip-archive, pureMD5, SHA, containers
-  else
-    Build-Depends: base < 3, filepath, process, zip-archive, pureMD5, SHA, containers
+  Build-Depends:
+                    base < 5 && >= 3,
+                    bytestring,
+                    directory,
+                    filepath,
+                    process,
+                    zip-archive,
+                    pureMD5,
+                    SHA,
+                    containers,
+                    filemanip
 
-  GHC-Options:    -Wall
+  GHC-Options:
+                    -Wall
   Exposed-Modules:
-          System.Build,
-          System.Build.Directory,
-          System.Build.FilePather,
-          System.Build.Args,
-          System.Build.Runner,
-          System.Build.Scala.Access,
-          System.Build.Scala.Debug,
-          System.Build.Scala.Scalac,
-          System.Build.Scala.Scaladoc,
-          System.Build.Scala.Target,
-          System.Build.Command,
-          System.Build.CompilePaths,
-          System.Build.Extensions,
-          System.Build.OutputDirectory,
-          System.Build.OutputReferenceGet,
-          System.Build.OutputReferenceSet,
-          System.Build.Java.Javac,
-          System.Build.Java.Javadoc
+                    System.Build,
+                    System.Build.Directory,
+                    System.Build.Args,
+                    System.Build.Runner,
+                    System.Build.Scala.Access,
+                    System.Build.Scala.Debug,
+                    System.Build.Scala.Scalac,
+                    System.Build.Scala.Scaladoc,
+                    System.Build.Scala.Target,
+                    System.Build.Command,
+                    System.Build.CompilePaths,
+                    System.Build.Extensions,
+                    System.Build.OutputDirectory,
+                    System.Build.OutputReferenceGet,
+                    System.Build.OutputReferenceSet,
+                    System.Build.Java.Javac,
+                    System.Build.Java.Javadoc
diff --git a/System/Build.hs b/System/Build.hs
--- a/System/Build.hs
+++ b/System/Build.hs
@@ -3,7 +3,6 @@
   module System.Build.CompilePaths,
   module System.Build.Directory,
   module System.Build.Extensions,
-  module System.Build.FilePather,
   module System.Build.OutputDirectory,
   module System.Build.OutputReferenceGet,
   module System.Build.OutputReferenceSet,
@@ -22,7 +21,6 @@
 import System.Build.CompilePaths
 import System.Build.Directory
 import System.Build.Extensions
-import System.Build.FilePather
 import System.Build.OutputDirectory
 import System.Build.OutputReferenceGet
 import System.Build.OutputReferenceSet
diff --git a/System/Build/Args.hs b/System/Build/Args.hs
--- a/System/Build/Args.hs
+++ b/System/Build/Args.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE TypeSynonymInstances #-}
 
 -- | Functions for working with command line arguments and options.
 module System.Build.Args(
@@ -20,7 +20,6 @@
                         ) where
 
 import Control.Monad
-import Data.Maybe
 import Data.List
 import qualified Data.Map as M
 import System.Environment
@@ -29,7 +28,7 @@
 class ArgShow a where
   arg :: a -> String
 
-instance ArgShow [Char] where
+instance ArgShow String where
   arg = id
 
 instance ArgShow Int where
diff --git a/System/Build/Directory.hs b/System/Build/Directory.hs
--- a/System/Build/Directory.hs
+++ b/System/Build/Directory.hs
@@ -17,7 +17,7 @@
 
 import System.Directory
 import System.FilePath
-import System.Build.FilePather
+import System.FilePath.Find
 import Codec.Archive.Zip
 import qualified Data.ByteString.Lazy as B
 import Control.Monad
@@ -42,7 +42,7 @@
 rmdir d = doesDirectoryExist d >>= flip when (removeDirectoryRecursive d)
 
 -- | Copy the contents of a directory to another, perhaps trimming parent directories.
-copy :: RecursePredicate -- ^ The recursion predicate to search for files in the source directory.
+copy :: RecursionPredicate -- ^ The recursion predicate to search for files in the source directory.
         -> FilterPredicate -- ^ The filter predicate to search for files in the source directory.
         -> FilePath        -- ^ The source directory.
         -> FilePath        -- ^ The target directory.
@@ -64,7 +64,7 @@
                                   else error (from ++ " is not a directory")
 
 -- | Copy the contents of a directory to another, perhaps trimming parent directories.
-copyl :: RecursePredicate -- ^ The recursion predicate to search for files in the source directory.
+copyl :: RecursionPredicate -- ^ The recursion predicate to search for files in the source directory.
          -> FilterPredicate -- ^ The filter predicate to search for files in the source directory.
          -> Int             -- ^ The number of parent directories to drop before copying to the target directory.
          -> FilePath        -- ^ The source directory.
@@ -77,7 +77,7 @@
 
 -- | Create a zip archive by changing into directories and archiving the contents.
 archiveDirectories :: [(FilePath, FilePath)] -- ^ A list of base directories to change to and contents of that directory to archive.
-                      -> RecursePredicate  -- ^ The recursion predicate to search for files to archive.
+                      -> RecursionPredicate  -- ^ The recursion predicate to search for files to archive.
                       -> FilterPredicate     -- ^ The filter predicate to search for files to archive.
                       -> [ZipOption]         -- ^ The options during the creation of the archive.
                       -> IO Archive          -- ^ The constructed archive.
@@ -86,7 +86,7 @@
 
 -- | Writes a zip archive to a file.
 writeArchive :: [(FilePath, FilePath)] -- ^ A list of base directories to change to and contents of that directory to archive.
-                -> RecursePredicate  -- ^ The recursion predicate to search for files to archive.
+                -> RecursionPredicate  -- ^ The recursion predicate to search for files to archive.
                 -> FilterPredicate     -- ^ The filter predicate to search for files to archive.
                 -> [ZipOption]         -- ^ The options during the creation of the archive.
                 -> FilePath            -- ^ The file to write the archive to.
@@ -96,7 +96,7 @@
 
 -- | Writes a zip archive to a file then computes a MD5 and SHA1 hash and writes them to files with @".md5"@ and @".sha1"@ extensions.
 writeHashArchive :: [(FilePath, FilePath)] -- ^ A list of base directories to change to and contents of that directory to archive.
-                    -> RecursePredicate  -- ^ The recursion predicate to search for files to archive.
+                    -> RecursionPredicate  -- ^ The recursion predicate to search for files to archive.
                     -> FilterPredicate     -- ^ The filter predicate to search for files to archive.
                     -> [ZipOption]         -- ^ The options during the creation of the archive.
                     -> FilePath            -- ^ The file to write the archive to and the prefix name of the files containing the hashes.
diff --git a/System/Build/FilePather.hs b/System/Build/FilePather.hs
deleted file mode 100644
--- a/System/Build/FilePather.hs
+++ /dev/null
@@ -1,386 +0,0 @@
--- | Combinators for finding files recursively. The combinators all surround the 'find' function.
-module System.Build.FilePather(
-                                FilePather,
-                                -- * Constructor and unwrapper
-                                (<?>),
-                                filePather,
-                                -- * Values using 'System.FilePath'
-                                filePath,
-                                always,
-                                always',
-                                never,
-                                never',
-                                extension,
-                                extension',
-                                directory,
-                                directory',
-                                hasExtension,
-                                hasExtension',
-                                splitExtension,
-                                splitExtension',
-                                splitDirectories,
-                                splitDirectories',
-                                hasTrailingPathSeparator,
-                                hasTrailingPathSeparator',
-                                fileName,
-                                fileName',
-                                baseName,
-                                baseName',
-                                normalise,
-                                normalise',
-                                makeValid,
-                                makeValid',
-                                isRelative,
-                                isRelative',
-                                isAbsolute,
-                                isAbsolute',
-                                isValid,
-                                isValid',
-                                -- * Utility
-                                not',
-                                constant,
-                                (==?),
-                                (/=?),
-                                (==||),
-                                (/=||),
-                                (==&&),
-                                (/=&&),
-                                (==>),
-                                (===>),
-                                (/=>),
-                                (/==>),
-                                (&&?),
-                                (?&&?),
-                                (||?),
-                                (?||?),
-                                -- * Find predicates
-                                FileType(..),
-                                RecursePredicate,
-                                FilterPredicate,
-                                isFile,
-                                isDirectory,
-                                isUnknown,
-                                -- * Core function
-                                find,
-                              ) where
-
-import Prelude hiding (any, all)
-import Control.Applicative
-import Control.Monad
-import Control.Monad.Instances
-import Data.Monoid
-import Data.Foldable(any, all, Foldable)
-import System.FilePath((</>), takeExtension, takeDirectory, takeFileName, takeBaseName)
-import System.Directory
-import qualified System.FilePath as P
-
--- | A function that takes a 'FilePath' and produces a value.
-newtype FilePather a = FilePather {
-  (<?>) :: FilePath -> a
-}
-
-instance Functor FilePather where
-  fmap f (FilePather k) = FilePather (f . k)
-
-instance Applicative FilePather where
-  FilePather f <*> FilePather a = FilePather (f <*> a)
-  pure = FilePather . const
-
-instance Monad FilePather where
-  FilePather f >>= k = FilePather (f >>= (<?>) . k)
-  return = pure
-
-instance (Monoid a) => Monoid (FilePather a) where
-  mempty = return mempty
-  FilePather x `mappend` FilePather y = FilePather (x `mappend` y)
-
--- | Construct a 'FilePather' from the given function
-filePather :: (FilePath -> a) ->
-              FilePather a
-filePather = FilePather
-
--- | A value that runs the identity function.
-filePath :: FilePather FilePath
-filePath = filePather id
-
--- | A value that always produces the value 'True'.
-always :: FilePather Bool
-always = filePather (const True)
-
--- | A value using a constant function that produces the value 'True'.
-always' :: FilePather (a -> Bool)
-always' = constant always
-
--- | A value that always produces the value 'False'.
-never :: FilePather Bool
-never = filePather (const False)
-
--- | A value that always produces a constant function that produces the value 'False'.
-never' :: FilePather (a -> Bool)
-never' = constant never
-
--- | A value that produces the extension of the given 'FilePath'.
-extension :: FilePather FilePath
-extension = filePather takeExtension
-
--- | A value using a constant function that produces the extension of the given 'FilePath'.
-extension' :: FilePather (a -> FilePath)
-extension' = constant extension
-
--- | A value that produces the directory of the given 'FilePath'.
-directory :: FilePather FilePath
-directory = filePather takeDirectory
-
--- | A value using a constant function that produces the directory of the given 'FilePath'.
-directory' :: FilePather (a -> FilePath)
-directory' = constant directory
-
--- | A value that produces a value denoting whether or not the given 'FilePath' has an extension.
-hasExtension :: FilePather Bool
-hasExtension = filePather P.hasExtension
-
--- | A value using a constant function that produces a value denoting whether or not the given 'FilePath' has an extension.
-hasExtension' :: FilePather (a -> Bool)
-hasExtension' = constant hasExtension
-
--- | A value that produces a value splitting the given 'FilePath' by its extension.
-splitExtension :: FilePather (String, String)
-splitExtension = filePather P.splitExtension
-
--- | A value using a constant function that produces a value splitting the given 'FilePath' by its extension.
-splitExtension' :: FilePather (a -> (String, String))
-splitExtension' = constant splitExtension
-
--- | A value that produces a value splitting the given 'FilePath' into its directories.
-splitDirectories :: FilePather [FilePath]
-splitDirectories = filePather P.splitDirectories
-
--- | A value using a constant function that produces a value splitting the given 'FilePath' into its directories.
-splitDirectories' :: FilePather (a -> [FilePath])
-splitDirectories' = constant splitDirectories
-
--- | A value that produces a value denoting whether or not the given 'FilePath' has a trailing path separator.
-hasTrailingPathSeparator :: FilePather Bool
-hasTrailingPathSeparator = filePather P.hasTrailingPathSeparator
-
--- | A value using a constant function that produces a value denoting whether or not the given 'FilePath' has a trailing path separator.
-hasTrailingPathSeparator' :: FilePather (a -> Bool)
-hasTrailingPathSeparator' = constant hasTrailingPathSeparator
-
--- | A value that produces the file name of the given 'FilePath'.
-fileName :: FilePather FilePath
-fileName = filePather takeFileName
-
--- | A value using a constant function that produces the file name of the given 'FilePath'.
-fileName' :: FilePather (a -> FilePath)
-fileName' = constant fileName
-
--- | A value that produces the base name of the given 'FilePath'.
-baseName :: FilePather FilePath
-baseName = filePather takeBaseName
-
--- | A value using a constant function that produces the base name of the given 'FilePath'.
-baseName' :: FilePather (a -> FilePath)
-baseName' = constant baseName
-
--- | A value that normalises the given 'FilePath'.
-normalise :: FilePather FilePath
-normalise = filePather P.normalise
-
--- | A value using a constant function that normalises the given 'FilePath'.
-normalise' :: FilePather (a -> FilePath)
-normalise' = constant normalise
-
--- | A value that makes valid the given 'FilePath'.
-makeValid :: FilePather FilePath
-makeValid = filePather P.makeValid
-
--- | A value using a constant function that makes valid the given 'FilePath'.
-makeValid' :: FilePather (a -> FilePath)
-makeValid' = constant makeValid
-
--- | A value that produces a value denoting whether or not the given 'FilePath' has is relative.
-isRelative :: FilePather Bool
-isRelative = filePather P.isRelative
-
--- | A value using a constant function that produces a value denoting whether or not the given 'FilePath' has is relative.
-isRelative' :: FilePather (a -> Bool)
-isRelative' = constant isRelative
-
--- | A value that produces a value denoting whether or not the given 'FilePath' has is absolute.
-isAbsolute :: FilePather Bool
-isAbsolute = filePather P.isAbsolute
-
--- | A value using a constant function that produces a value denoting whether or not the given 'FilePath' has is absolute.
-isAbsolute' :: FilePather (a -> Bool)
-isAbsolute' = constant isAbsolute
-
--- | A value that produces a value denoting whether or not the given 'FilePath' has is valid.
-isValid :: FilePather Bool
-isValid = filePather P.isValid
-
--- | A value using a constant function that produces a value denoting whether or not the given 'FilePath' has is valid.
-isValid' :: FilePather (a -> Bool)
-isValid' = constant isValid
-
--- | Inverts the given 'Bool' in a functor.
-not' :: (Functor f) =>
-        f Bool
-        -> f Bool
-not' = fmap not
-
--- | Produces a constant function in a functor.
-constant :: (Functor f) =>
-            f a ->
-            f (t -> a)
-constant = fmap const
-
--- | Tests for equality in a functor.
-(==?) :: (Eq a, Functor f) =>
-         f a
-         -> a
-         -> f Bool
-p ==? a = fmap (a ==) p
-
--- | Tests for inequality in a functor.
-(/=?) :: (Eq a, Functor f) =>
-         f a
-         -> a
-         -> f Bool
-p /=? a = fmap (a /=) p
-
--- | Tests for equality of @any@ values in the given container.
-(==||) :: (Eq a, Functor f, Foldable t) =>
-          f a ->
-          t a ->
-          f Bool
-p ==|| a = fmap (\x -> any (== x) a) p
-
--- | Tests for inequality of @any@ values in the given container.
-(/=||) :: (Eq a, Functor f, Foldable t) =>
-          f a ->
-          t a ->
-          f Bool
-p /=|| a = fmap (\x -> any (/= x) a) p
-
--- | Tests for equality of @all@ values in the given container.
-(==&&) :: (Eq a, Functor f, Foldable t) =>
-          f a ->
-          t a ->
-          f Bool
-p ==&& a = fmap (\x -> all (== x) a) p
-
--- | Tests for inequality of @all@ values in the given container.
-(/=&&) :: (Eq a, Functor f, Foldable t) =>
-          f a ->
-          t a ->
-          f Bool
-p /=&& a = fmap (\x -> all (/= x) a) p
-
--- | Tests for implication in an applicative functor.
-(==>) :: (Applicative f) =>
-         f Bool
-         -> f Bool
-         -> f Bool
-(==>) = liftA2 (\p q -> not p || q)
-
--- | Tests for implication in an applicative functor in an applicative functor.
-(===>) :: (Applicative f1, Applicative f2) =>
-          f1 (f2 Bool)
-          -> f1 (f2 Bool)
-          -> f1 (f2 Bool)
-(===>) = liftA2 (==>)
-
--- | Tests for inverse implication in an applicative functor.
-(/=>) :: (Applicative f) =>
-         f Bool 
-         -> f Bool
-         -> f Bool
-(/=>) = liftA2 (\p q -> not q && p)
-
--- | Tests for inverse implication in an applicative functor in an applicative functor.
-(/==>) :: (Applicative f1, Applicative f2) =>
-          f1 (f2 Bool)
-          -> f1 (f2 Bool)
-          -> f1 (f2 Bool)
-(/==>) = liftA2 (/=>)
-
--- | Performs conjunction (@AND@) in an applicative functor.
-(&&?) :: (Applicative f) =>
-         f Bool 
-         -> f Bool
-         -> f Bool
-(&&?) = liftA2 (&&)
-
--- | Performs conjunction (@AND@) in an applicative functor in an applicative functor.
-(?&&?) :: (Applicative f1, Applicative f2) =>
-          f1 (f2 Bool)
-          -> f1 (f2 Bool)
-          -> f1 (f2 Bool)
-(?&&?) = liftA2 (&&?)
-
--- | Performs disjunction (@OR@) in an applicative functor.
-(||?) :: (Applicative f) =>
-         f Bool
-         -> f Bool
-         -> f Bool
-(||?) = liftA2 (||)
-
--- | Performs disjunction (@OR@) in an applicative functor in an applicative functor.
-(?||?) :: (Applicative f1, Applicative f2) =>
-          f1 (f2 Bool)
-          -> f1 (f2 Bool)
-          -> f1 (f2 Bool)
-(?||?) = liftA2 (||?)
-
--- | The possible types of a file.
-data FileType = File -- ^ The type is a normal file.
-                | Directory -- ^ The type is a directory.
-                | Unknown -- ^ The type is unknown.
-  deriving (Eq, Show)
-
--- | A recurse predicate takes a 'FilePath' and returns whether or not to continue recursing on that file.
-type RecursePredicate = FilePather Bool
-
--- | A filter predicate takes a 'FilePath' and a file type and returns whether or not to filter the value.
-type FilterPredicate = FilePather (FileType -> Bool)
-
--- | Compares for equivalence to a 'File' in an applicative functor.
-isFile :: (Applicative f) => 
-          f (FileType -> Bool)
-isFile = pure (== File)
-
--- | Compares for equivalence to a 'Directory' in an applicative functor.
-isDirectory :: (Applicative f) =>
-               f (FileType -> Bool)
-isDirectory = pure (== Directory)
-
--- | Compares for equivalence to 'Unknown' in an applicative functor.
-isUnknown :: (Applicative f) => 
-             f (FileType -> Bool)
-isUnknown = pure (== Unknown)
-
--- | Finds all files using the given recurse predicate and filter predicate in the given file path.
-find :: RecursePredicate -- ^ The recurse predicate determines whether to continue recursing on the given file path.
-        -> FilterPredicate -- ^ The filter predicate determines whether to keep the current file path.
-        -> FilePath -- ^ The file path to begin finding files.
-        -> IO [FilePath] -- ^ All files found.
-find = find' []
-  where
-  find' :: FilePath -> RecursePredicate -> FilterPredicate -> FilePath -> IO [FilePath]
-  find' k r x p = let z = if null k then p else k </> p
-                      z' t = [z | x <?> z $ t]
-                      ifM c t f = do c' <- c
-                                     t' <- t
-                                     f' <- f
-                                     return (if c' then t' else f')
-                  in ifM (doesFileExist z)
-                       (return (z' File)) $
-                       do e <- doesDirectoryExist z
-                          if e
-                            then if r <?> z
-                                   then do c <- getDirectoryContents z
-                                           t <- fmap join $ forM (filter (`notElem` [".", ".."]) c) (find' k r x . (z </>))
-                                           return (z' Directory ++ t)
-                                   else return (z' Directory)
-                            else return (z' Unknown)
diff --git a/System/Build/Java/Javac.hs b/System/Build/Java/Javac.hs
--- a/System/Build/Java/Javac.hs
+++ b/System/Build/Java/Javac.hs
@@ -43,7 +43,6 @@
 import Data.List
 import Data.Maybe
 import Control.Arrow
-import Control.Monad
 import System.FilePath
 import System.Build.CompilePaths
 import System.Build.Extensions
diff --git a/System/Build/Java/Javadoc.hs b/System/Build/Java/Javadoc.hs
--- a/System/Build/Java/Javadoc.hs
+++ b/System/Build/Java/Javadoc.hs
@@ -69,7 +69,6 @@
 
 import Data.List hiding (group)
 import Data.Maybe
-import Control.Monad
 import System.FilePath
 import System.Build.Args
 import System.Build.CompilePaths
diff --git a/System/Build/Runner.hs b/System/Build/Runner.hs
--- a/System/Build/Runner.hs
+++ b/System/Build/Runner.hs
@@ -25,7 +25,7 @@
 import System.Cmd
 import System.Directory
 import System.Exit
-import System.Build.FilePather
+import System.FilePath.Find
 import System.Build.Extensions
 import System.Build.Command
 import System.Build.CompilePaths
@@ -72,7 +72,8 @@
                   Runner x r
 pathTransform' = pathTransform . recurse
   where
-  recurse c p = fmap concat $ find always (constant $ extension ==|| exts' c) `mapM` p
+  p ==|| a = fmap (\x -> any (== x) a) p
+  recurse c p = fmap concat $ find always (extension ==|| exts' c) `mapM` p
 
 (!!!) :: (Command c, CompilePaths c) =>
          RunnerExit c
diff --git a/System/Build/Scala/Scalac.hs b/System/Build/Scala/Scalac.hs
--- a/System/Build/Scala/Scalac.hs
+++ b/System/Build/Scala/Scalac.hs
@@ -47,7 +47,6 @@
 import System.Build.OutputReferenceSet
 import System.Build.OutputReferenceGet
 import System.Build.Command
-import Control.Monad
 import Data.List
 import Data.Maybe
 import System.FilePath
