diff --git a/filediff.cabal b/filediff.cabal
--- a/filediff.cabal
+++ b/filediff.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                filediff
-version:             1.0.0.0
+version:             1.0.0.1
 synopsis:            Diffing and patching module
 description:         `filediff` is a Haskell library for creating diffs, and applying diffs to files and directories.
 homepage:            https://github.com/bgwines/filediff
@@ -23,7 +23,7 @@
   exposed-modules: Filediff, Filediff.Types, Filediff.Stats, Filediff.Printing
   other-modules:   Filediff.Utils
   -- other-extensions:
-  build-depends:       base >=4.7 && <4.8, mtl, time, directory, either, transformers, data-memocombinators, Zora >=1.1.22, text, data-default,  tasty, tasty-hunit, rainbow, bytestring
+  build-depends:       base >=4.7 && <4.8, mtl, time, directory, either, transformers, data-memocombinators, Zora >=1.1.22, text, data-default,  tasty, tasty-hunit, rainbow, bytestring, threads
   hs-source-dirs:      src
   default-language:    Haskell2010
 
diff --git a/src/Filediff.hs b/src/Filediff.hs
--- a/src/Filediff.hs
+++ b/src/Filediff.hs
@@ -17,6 +17,10 @@
 , applyToDirectory
 ) where
 
+import Control.Concurrent (forkIO)
+import Control.Concurrent.Thread as Thread (Result(..))
+import Control.Concurrent.Thread.Group as ThreadGroup (new, forkIO, wait)
+
 import qualified System.IO as IO
 import qualified System.Directory as D
 
@@ -194,11 +198,19 @@
 -- | Applies a `Diff` to a directory. Throws an exception if the
 --   application fails.
 applyToDirectory :: Diff -> FilePath -> IO ()
-applyToDirectory (Diff filediffs) filepath = mapM_ apply filediffs
+applyToDirectory (Diff filediffs) filepath
+    = void $ mapMParallelWaitForAll (void . apply) filediffs
     where
         apply :: Filediff -> IO [Line]
         apply diff@(Filediff base compare _)
             = applyToFile diff (filepath </> base)
+
+mapMParallelWaitForAll :: (a -> IO b) -> [a] -> IO [Thread.Result b]
+mapMParallelWaitForAll f list = do
+    group <- ThreadGroup.new
+    ioResults <- mapM (fmap snd . ThreadGroup.forkIO group . f) list
+    ThreadGroup.wait group
+    sequence ioResults
 
 -- | Computes the minimal number of additions and deletions needed to
 --   transform the first parameter into the second.
