diff --git a/FilePather.cabal b/FilePather.cabal
--- a/FilePather.cabal
+++ b/FilePather.cabal
@@ -1,5 +1,5 @@
 Name:               FilePather
-Version:            0.1.5
+Version:            0.1.6
 Author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
 Maintainer:         Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
 Copyright:          Tony Morris
diff --git a/src/System/FilePath/FilePather/FilePathPredicate.hs b/src/System/FilePath/FilePather/FilePathPredicate.hs
--- a/src/System/FilePath/FilePather/FilePathPredicate.hs
+++ b/src/System/FilePath/FilePather/FilePathPredicate.hs
@@ -55,7 +55,7 @@
     Monad g =>
     (FilePath -> Bool)
     -> f g
-  -- | A predicate that computes its result based equivalence to a file name extension.
+  -- | A predicate that computes its result based equivalence to a file name extension. This function matches with and without the preceding extension separator (.).
   extensionEq ::
     Monad g =>
     FilePath
@@ -194,7 +194,7 @@
   (.!.) f =
     recursePredicateT $ liftM not . runRecursePredicateT f
   extension f = 
-    recursePredicateT $ return . f . P.takeExtension
+    recursePredicateT $ return . liftM2 (||) f (f . drop 1) . P.takeExtension
   directory f = 
     recursePredicateT $ return . f . P.takeDirectory
   hasExtension =
@@ -242,7 +242,7 @@
   (.!.) f =
     filterPredicateT $ \p -> liftM not . runFilterPredicateT f p
   extension f = 
-    filterPredicateT $ const . return . f . P.takeExtension
+    filterPredicateT $ const . return . liftM2 (||) f (f . drop 1) . P.takeExtension
   directory f = 
     filterPredicateT $ const . return . f . P.takeDirectory
   hasExtension =
diff --git a/src/System/FilePath/FilePather/FileType.hs b/src/System/FilePath/FilePather/FileType.hs
--- a/src/System/FilePath/FilePather/FileType.hs
+++ b/src/System/FilePath/FilePather/FileType.hs
@@ -1,9 +1,9 @@
 module System.FilePath.FilePather.FileType
 (
   FileType(..)
-, isFileType
-, isDirectoryType
-, isUnknownType
+, isFile
+, isDirectory
+, isUnknown
 ) where
 -- | The possible types of a file.
 data FileType =
@@ -12,21 +12,21 @@
   | Unknown -- ^ The type is unknown.
   deriving (Eq, Show, Enum)
 
-isFileType ::
+isFile ::
   FileType
   -> Bool
-isFileType =
+isFile =
   (==) File
 
-isDirectoryType ::
+isDirectory ::
   FileType
   -> Bool
-isDirectoryType =
+isDirectory =
   (==) Directory
 
-isUnknownType ::
+isUnknown ::
   FileType
   -> Bool
-isUnknownType =
+isUnknown =
   (==) Unknown
 
diff --git a/src/System/FilePath/FilePather/FilterPredicate.hs b/src/System/FilePath/FilePather/FilterPredicate.hs
--- a/src/System/FilePath/FilePather/FilterPredicate.hs
+++ b/src/System/FilePath/FilePather/FilterPredicate.hs
@@ -8,6 +8,9 @@
 , filterPredicate'
 , runFilterPredicateT
 , runFilterPredicate
+, isDirectoryType
+, isFileType
+, isUnknownType
 ) where
 
 import Control.Monad.Identity
@@ -66,3 +69,20 @@
 runFilterPredicate p k =
   runIdentity . runFilterPredicateT p k
 
+isDirectoryType ::
+  Monad f =>
+  FilterPredicateT f
+isDirectoryType =
+  filterPredicateT . const $ return . isDirectory
+
+isFileType ::
+  Monad f =>
+  FilterPredicateT f
+isFileType =
+  filterPredicateT . const $ return . isFile
+
+isUnknownType ::
+  Monad f =>
+  FilterPredicateT f
+isUnknownType =
+  filterPredicateT . const $ return . isUnknown
diff --git a/src/System/FilePath/FilePather/Find.hs b/src/System/FilePath/FilePather/Find.hs
--- a/src/System/FilePath/FilePather/Find.hs
+++ b/src/System/FilePath/FilePather/Find.hs
@@ -1,11 +1,13 @@
 module System.FilePath.FilePather.Find
 (
   Find(..)
+, findi
 ) where
 
 import Control.Monad.Identity
 import Control.Monad.Trans.Identity
 import Control.Comonad
+import System.FilePath
 import System.FilePath.FilePather.RecursePredicate
 import System.FilePath.FilePather.FilterPredicate
 import System.FilePath.FilePather.FileType
@@ -27,92 +29,112 @@
     getCurrentDirectory >>= find f r
 
 instance Find Identity where
-  find f' r' p = 
-    let f =
-          runFilterPredicateT f'
-        r =
-          runRecursePredicateT r'
-        keep ::
-          Bool
-          -> [FilePath]
-          -> [FilePath]
-        keep u =
-          if u then (p:) else id
-        rkeep ::          
-          Bool
-          -> [FilePath]
-          -> IO [FilePath]
-        rkeep u d =
-          return (keep u d)
-        trkeep ::
-          FileType
-          -> IO [FilePath]
-        trkeep =
-          flip rkeep [] . runIdentity . f p
-   in do fe <- doesFileExist p
-         if fe
-           then
-             trkeep File
-           else
-             do de <- doesDirectoryExist p
-                if de
-                  then  
-                    let (Identity k) = f p Directory
-                        (Identity l) = r p
-                    in if l
+  find f' r' =
+    let find' base p =
+          let f =
+                runFilterPredicateT f'
+              r =
+                runRecursePredicateT r'
+              z ::
+                FilePath
+              z =
+                if null base then p else base </> p
+              keep ::
+                Bool
+                -> [FilePath]
+                -> [FilePath]
+              keep u =
+                if u then (z:) else id
+              rkeep ::
+                Bool
+                -> [FilePath]
+                -> IO [FilePath]
+              rkeep u d =
+                return (keep u d)
+              trkeep ::
+                FileType
+                -> IO [FilePath]
+              trkeep =
+                flip rkeep [] . runIdentity . f z
+          in do fe <- doesFileExist z
+                if fe
+                  then
+                    trkeep File
+                  else
+                    do de <- doesDirectoryExist z
+                       if de
                          then
-                           do t <- getDirectoryContents p
-                              u <- forM (filter (`notElem` [".", ".."]) t) (find f' r')
-                              rkeep k (concat u)
+                           let (Identity k) = f z Directory
+                               (Identity l) = r z
+                           in if l
+                                then
+                                  do t <- getDirectoryContents z
+                                     u <- forM (filter (`notElem` [".", ".."]) t) (find f' r' . (z </>))
+                                     rkeep k (concat u)
+                                else
+                                  rkeep k []
                          else
-                           rkeep k []
-                  else
-                    trkeep Unknown
+                           trkeep Unknown
+    in find' []
 
+-- | A specialisation of `find` to the `Identity` monad. Useful in assisting type-inference.
+findi ::
+  FilterPredicate
+  -> RecursePredicate
+  -> FilePath
+  -> IO [FilePath]
+findi =
+  find
+
 instance Find IO where
-  find f' r' p =
-    let f =
-          runFilterPredicateT f'
-        r =
-          runRecursePredicateT r'
-        keep ::
-          Bool
-          -> [FilePath]
-          -> [FilePath]
-        keep u =
-          if u then (p:) else id
-        rkeep :: 
-          Bool
-          -> [FilePath]
-          -> IO [FilePath]
-        rkeep u d =
-          return (keep u d)
-        trkeep ::
-          FileType
-          -> IO [FilePath]
-        trkeep t =
-          f p t >>= flip rkeep []
-    in do fe <- doesFileExist p
-          if fe
-            then
-              trkeep File
-            else
-              do de <- doesDirectoryExist p
-                 if de
-                   then
-                     do k <- f p Directory
-                        l <- r p
-                        if l
-                          then
-                            do t <- getDirectoryContents p
-                               u <- forM (filter (`notElem` [".", ".."]) t) (find f' r')
-                               rkeep k (concat u)
-                          else
-                            rkeep k []
-                   else
-                     trkeep Unknown
+  find f' r' =
+    let find' base p =
+          let f =
+                runFilterPredicateT f'
+              r =
+                runRecursePredicateT r'
+              z ::
+                FilePath
+              z =
+                if null base then p else base </> p
+              keep ::
+                Bool
+                -> [FilePath]
+                -> [FilePath]
+              keep u =
+                if u then (z:) else id
+              rkeep ::
+                Bool
+                -> [FilePath]
+                -> IO [FilePath]
+              rkeep u d =
+                return (keep u d)
+              trkeep ::
+                FileType
+                -> IO [FilePath]
+              trkeep t =
+                f z t >>= flip rkeep []
+          in do fe <- doesFileExist z
+                if fe
+                  then
+                    trkeep File
+                  else
+                    do de <- doesDirectoryExist z
+                       if de
+                         then
+                           do k <- f z Directory
+                              l <- r z
+                              if l
+                                then
+                                  do t <- getDirectoryContents z
+                                     u <- forM (filter (`notElem` [".", ".."]) t) (find f' r' . (z </>))
+                                     rkeep k (concat u)
+                                else
+                                  rkeep k []
+                         else
+                           trkeep Unknown
+    in find' []
 
 instance Comonad f => Find (IdentityT f) where
   find f r =
     find (filterPredicateT $ \p -> Identity . extract . runFilterPredicateT f p) (recursePredicateT $ Identity . extract . runRecursePredicateT r)
-
