diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,9 @@
 env:
- - GHCVER=7.4.2 CABALVER=1.16
  - GHCVER=7.6.3 CABALVER=1.18
- - GHCVER=7.8.2 CABALVER=1.20
+ - GHCVER=7.8.3 CABALVER=1.18
+ - GHCVER=7.8.4 CABALVER=1.18
+ - GHCVER=7.10.1 CABALVER=1.22
+ - GHCVER=head CABALVER=1.22
 
 before_install:
  - sudo add-apt-repository -y ppa:hvr/ghc
@@ -19,4 +21,6 @@
  - hlint src
 
 matrix:
+  allow_failures:
+   - env: GHCVER=head CABALVER=1.22
   fast_finish: true
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2013 Benno Fünfstück
+Copyright 2013-2015 Benno Fünfstück
 
 All rights reserved.
 
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,43 +1,73 @@
-#!/usr/bin/runhaskell
 {-# OPTIONS_GHC -Wall #-}
 module Main (main) where
 
+import Data.IORef
 import Data.List ( nub )
 import Data.Version ( showVersion )
 import Distribution.Package ( PackageName(PackageName), PackageId, InstalledPackageId, packageVersion, packageName )
-import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) )
+import Distribution.PackageDescription ( PackageDescription(), TestSuite(..), hsSourceDirs, exeModules, libBuildInfo, buildInfo, libModules, modulePath, exeName)
 import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks )
-import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose )
 import Distribution.Simple.BuildPaths ( autogenModulesDir )
-import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag )
-import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) )
+import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, withExeLBI, ComponentLocalBuildInfo(), LocalBuildInfo(), componentPackageDeps )
+import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag, buildDistPref, defaultDistPref, fromFlagOrDefault )
+import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose )
+import Distribution.Text (disp)
 import Distribution.Verbosity ( Verbosity )
-import System.FilePath ( (</>) )
+import System.Directory ( canonicalizePath )
+import System.FilePath ( (</>), dropExtension )
+import Text.PrettyPrint (render)
 
 main :: IO ()
 main = defaultMainWithHooks simpleUserHooks
   { buildHook = \pkg lbi hooks flags -> do
-     generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi
+     generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi flags
      buildHook simpleUserHooks pkg lbi hooks flags
   }
 
-generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
-generateBuildModule verbosity pkg lbi = do
+--  Very ad-hoc implementation of difference lists
+singletonDL :: a -> [a] -> [a]
+singletonDL = (:)
+
+emptyDL :: [a] -> [a]
+emptyDL = id
+
+appendDL :: ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
+appendDL x y = x . y
+
+generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> BuildFlags -> IO ()
+generateBuildModule verbosity pkg lbi flags = do
   let dir = autogenModulesDir lbi
   createDirectoryIfMissingVerbose verbosity True dir
-  withLibLBI pkg lbi $ \_ libcfg -> do
-    withTestLBI pkg lbi $ \suite suitecfg -> do
-      rewriteFile (map fixchar $ dir </> "Build_" ++ testName suite ++ ".hs") $ unlines
-        [ "module Build_" ++ testName suite ++ " where"
-        , "deps :: [String]"
-        , "deps = " ++ (show $ formatdeps (testDeps libcfg suitecfg))
-        ]
+  withTestLBI pkg lbi $ \suite suitelbi -> do
+    srcDirs <- mapM canonicalizePath $ hsSourceDirs $ testBuildInfo suite
+    distDir <- canonicalizePath $ fromFlagOrDefault defaultDistPref $ buildDistPref flags
+
+    doctestVar <- newIORef emptyDL
+    withLibLBI pkg lbi $ \lib liblbi ->
+      let mods = map (render . disp) $ libModules lib in
+      modifyIORef doctestVar $ appendDL . singletonDL $ doctestTarget "libary" mods (libBuildInfo lib) liblbi suitelbi
+    withExeLBI pkg lbi $ \exe exelbi ->
+      let mods = dropExtension (modulePath exe) : map (render . disp) (exeModules exe) in
+      modifyIORef doctestVar $ appendDL . singletonDL $ doctestTarget ("executable " ++ exeName exe) mods (buildInfo exe) exelbi suitelbi
+    doctestTargets <- fmap ($ []) $ readIORef doctestVar
+
+    rewriteFile (dir </> "Build_" ++ map fixchar (testName suite) ++ ".hs") $ unlines
+      [ "module Build_" ++ map fixchar (testName suite) ++ " where"
+      , "getDistDir :: FilePath"
+      , "getDistDir = " ++ show distDir
+      , "getSrcDirs :: [FilePath]"
+      , "getSrcDirs = " ++ show srcDirs
+      , "doctestTargets :: [(String, [String], [FilePath], [String])]"
+      , "doctestTargets = " ++ show doctestTargets
+      ]
+
   where
     formatdeps = map (formatone . snd)
     formatone p = case packageName p of
       PackageName n -> n ++ "-" ++ showVersion (packageVersion p)
+    doctestTarget name mods targetbi targetlbi suitelbi = (name, mods, hsSourceDirs targetbi, formatdeps $ testDeps targetlbi suitelbi)
     fixchar '-' = '_'
-    fixchar a = a
+    fixchar c = c
 
 testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)]
 testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys
diff --git a/hcltest.cabal b/hcltest.cabal
--- a/hcltest.cabal
+++ b/hcltest.cabal
@@ -1,10 +1,10 @@
 name: hcltest
-version: 0.3.6
+version: 0.3.7
 cabal-version: >=1.10
 build-type: Custom
 license: BSD3
 license-file: LICENSE
-copyright: Copyright (C) 2013 Benno Fünfstück
+copyright: Copyright (C) 2013-2015 Benno Fünfstück
 maintainer: Benno Fünfstück <benno.fuenfstueck@gmail.com>
 stability: experimental
 homepage: http://github.com/bennofs/hcltest/
@@ -26,58 +26,50 @@
     location: git://github.com/bennofs/hcltest.git
 
 library
+    exposed-modules:
+        Test.HClTest
+        Test.HClTest.Program
+        Test.HClTest.Monad
+        Test.HClTest.Setup
+        Test.HClTest.Trace
+        Test.Tasty.HClTest
     build-depends:
-        base >=4.5.1.0 && <4.8,
+        base >=4.5.1.0 && <4.9,
         bytestring >=0.9.2.1 && <0.11,
         text >=0.11.2.3 && <1.3,
-        free >=4.5 && <4.10,
+        free >=4.5 && <4.13,
         process >=1.1.0.1 && <1.3,
-        filepath >=1.3.0.0 && <1.4,
+        filepath >=1.3.0.0 && <1.5,
         transformers >=0.3.0.0 && <0.5,
-        either >=4.1.1 && <4.4,
+        either >=4.1.1 && <4.5,
         directory >=1.1.0.2 && <1.3,
         dlist >=0.6.0.1 && <0.8,
         temporary >=1.2.0.1 && <1.3,
         mtl >=2.1.2 && <2.3,
-        lens >=4.0.7 && <4.5,
+        lens >=4.0.7 && <4.12,
         tasty >=0.8.0.2 && <0.11,
-        tagged >=0.7.1 && <0.8,
+        tagged >=0.7.1 && <0.9,
         mmorph >=1.0.2 && <1.1,
         random-shuffle >=0.0.4 && <0.1,
         split >=0.2.1.1 && <0.3,
         stm ==2.4.*,
-        optparse-applicative >=0.7.0.2,
-        monad-control >=0.3.2.3 && <0.4,
+        optparse-applicative >=0.7.0.2 && <0.12,
+        monad-control >=1 && <1.1,
         transformers-base >=0.4.1 && <0.5
-    exposed-modules:
-        Test.HClTest
-        Test.HClTest.Program
-        Test.HClTest.Monad
-        Test.HClTest.Setup
-        Test.HClTest.Trace
-        Test.Tasty.HClTest
-    exposed: True
-    buildable: True
     default-language: Haskell2010
+    other-extensions: TemplateHaskell
     hs-source-dirs: src
     ghc-options: -Wall
-    other-extensions: TemplateHaskell
- 
+
 test-suite doctests
-    build-depends:
-        base >=4.5.1.0 && <4.8,
-        directory >=1.1.0.2 && <1.3,
-        doctest >=0.9.10.2 && <0.10,
-        filepath >=1.3.0.0 && <1.4
-     
-    if impl(ghc <7.6.1)
-        buildable: True
-        ghc-options: -Werror
     type: exitcode-stdio-1.0
     main-is: doctests.hs
-    buildable: True
+    build-depends:
+        base >=4.5.1.0 && <4.9,
+        directory >=1.1.0.2 && <1.3,
+        doctest >=0.9.10.2 && <0.11,
+        filepath >=1.3.0.0 && <1.5
     default-language: Haskell2010
+    other-extensions: TemplateHaskell
     hs-source-dirs: tests
     ghc-options: -Wall -threaded
-    other-extensions: TemplateHaskell
- 
diff --git a/src/Test/HClTest/Monad.hs b/src/Test/HClTest/Monad.hs
--- a/src/Test/HClTest/Monad.hs
+++ b/src/Test/HClTest/Monad.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE UndecidableInstances #-}
 -- | This module defines the basic test type, HClTest, which is a monad. It also provides functions
 -- for creating and running tests.
 module Test.HClTest.Monad
@@ -51,9 +52,9 @@
   liftBase = liftIO
 
 instance MonadBaseControl IO (HClTest w) where
-  data StM (HClTest w) a = HClTestSt { unHClTestSt :: StM (ReaderT Config (MaybeT (WriterT (DL.DList w) IO))) a }
-  liftBaseWith f = HClTest $ liftBaseWith (\k -> f (fmap HClTestSt . k . unHClTest ))
-  restoreM = HClTest . restoreM . unHClTestSt
+  type StM (HClTest w) a = StM (ReaderT Config (MaybeT (WriterT (DL.DList w) IO))) a
+  liftBaseWith f = HClTest $ liftBaseWith (\k -> f (k . unHClTest ))
+  restoreM = HClTest . restoreM
 
 -- | Run a HClTest. The first argument is the timeout for waiting for output
 -- of the process, in milliseconds. The second argument is the test case.
diff --git a/src/Test/HClTest/Program.hs b/src/Test/HClTest/Program.hs
--- a/src/Test/HClTest/Program.hs
+++ b/src/Test/HClTest/Program.hs
@@ -30,6 +30,7 @@
 import           System.Timeout
 import           Test.HClTest.Monad
 import           Test.HClTest.Trace
+import           Prelude
 
 -- | A output stream.
 data Stream = Stdout | Stderr deriving Show
diff --git a/tests/doctests.hsc b/tests/doctests.hsc
--- a/tests/doctests.hsc
+++ b/tests/doctests.hsc
@@ -13,12 +13,8 @@
 -----------------------------------------------------------------------------
 module Main where
 
-import Build_doctests (deps)
-import Control.Applicative
+import Build_doctests (doctestTargets)
 import Control.Monad
-import Data.List
-import System.Directory
-import System.FilePath
 import Test.DocTest
 
 ##ifdef mingw32_HOST_ARCH
@@ -50,22 +46,16 @@
 ##endif
 
 main :: IO ()
-main = withUnicode $ getSources >>= \sources -> doctest $
-    "-isrc"
-  : "-idist/build/autogen"
-  : "-optP-include"
-  : "-optPdist/build/autogen/cabal_macros.h"
-  : "-hide-all-packages"
-  : map ("-package="++) deps ++ sources
-
-getSources :: IO [FilePath]
-getSources = filter (isSuffixOf ".hs") <$> go "src"
-  where
-    go dir = do
-      (dirs, files) <- getFilesAndDirectories dir
-      (files ++) . concat <$> mapM go dirs
-
-getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath])
-getFilesAndDirectories dir = do
-  c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir
-  (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c
+main = withUnicode $ do
+  forM_ doctestTargets $ \(name, mods, dirs, dep) -> do
+    putStrLn $ ":: Running doctests for " ++ name
+    doctest $
+        "-idist/build/autogen"
+      : "-idist/build"
+      : "-optP-include"
+      : "-optPdist/build/autogen/cabal_macros.h"
+      : "-package-dbdist/package.conf.inplace"
+      : "-hide-all-packages"
+      : map ("-package="++) dep
+        ++ map ("-i"++) dirs
+        ++ mods
