diff --git a/Distribution/Simple/Build.hs b/Distribution/Simple/Build.hs
index c26fe0d81175e7c9d137cea24b7edbebd24f9dfe..60a357b2b5b0c67aedc26fd5b0c602dadaa5b0a2 100644
--- a/Distribution/Simple/Build.hs
+++ b/Distribution/Simple/Build.hs
@@ -43,7 +43,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -}
 
 module Distribution.Simple.Build (
-	build, makefile
+	build, makefile, initialBuildSteps
 #ifdef DEBUG        
         ,hunitTests
 #endif
diff --git a/Distribution/Simple/Haddock.hs b/Distribution/Simple/Haddock.hs
index 9426d4e1de306257e9510cc8d5deb4bc864c4611..c9972804d4c88882b4aed1d8069291e3e099f835 100644
--- a/Distribution/Simple/Haddock.hs
+++ b/Distribution/Simple/Haddock.hs
@@ -58,6 +58,7 @@ import Distribution.Simple.Program(ConfiguredProgram(..), requireProgram,
 import Distribution.Simple.PreProcess (ppCpp', ppUnlit, preprocessSources,
                                 PPSuffixHandler, runSimplePreProcessor)
 import Distribution.Simple.Setup
+import Distribution.Simple.Build (initialBuildSteps)
 import Distribution.Simple.InstallDirs (InstallDirTemplates(..),
                                         PathTemplateVariable(..),
                                         toPathTemplate, fromPathTemplate,
@@ -74,10 +75,10 @@ import Language.Haskell.Extension
 -- Base
 import System.Directory(removeFile, doesFileExist)
 
-import Control.Monad (liftM, when, join)
+import Control.Monad (liftM, when, unless, join)
 import Data.Maybe    ( isJust, catMaybes, fromJust )
-import Data.List     (nub)
 import Data.Char     (isSpace)
+import Data.List     (nub)
 
 import Distribution.Compat.Directory(removeDirectoryRecursive, copyFile)
 import System.FilePath((</>), (<.>), splitFileName, splitExtension,
@@ -116,7 +117,6 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
     setupMessage verbosity "Running Haddock for" pkg_descr
 
     let replaceLitExts = map ( (tmpDir </>) . (`replaceExtension` "hs") )
-    let mockAll bi = mapM_ (mockPP ["-D__HADDOCK__"] bi tmpDir)
     let showPkg    = showPackageId (package pkg_descr)
     let outputFlag = if haddockHoogle haddockFlags
                      then "--hoogle"
@@ -124,6 +124,13 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
     let Just version = programVersion confHaddock
     let have_src_hyperlink_flags = version >= Version [0,8] [] && version < Version [2,0] []
         isVersion2               = version >= Version [2,0] []
+
+    let mockFlags
+          | isVersion2 = []
+          | otherwise  = ["-D__HADDOCK__"]
+
+    let mockAll bi = mapM_ (mockPP mockFlags bi tmpDir)
+
     let comp = compiler lbi
         Just pkgTool = lookupProgram ghcPkgProgram (withPrograms lbi)
     let cssFileFlag = case haddockCss haddockFlags of
@@ -186,21 +193,26 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
           then ["--optghc=-package-name", "--optghc=" ++ showPkg]
           else ["--package=" ++ showPkg]
 
-    let haddock2options bi = if isVersion2
-          then ("-B" ++ ghcLibDir) : map ("--optghc=" ++) (ghcSimpleOptions lbi bi)
+    let haddock2options bi preprocessDir = if isVersion2
+          then ("-B" ++ ghcLibDir) : map ("--optghc=" ++) (ghcSimpleOptions lbi bi preprocessDir)
           else []
 
+    when isVersion2 $ initialBuildSteps pkg_descr lbi verbosity suffixes
+
     withLib pkg_descr () $ \lib -> do
         let bi = libBuildInfo lib
-        inFiles <- getModulePaths lbi bi (exposedModules lib ++ otherModules bi)
-        mockAll bi inFiles
+            modules = exposedModules lib ++ otherModules bi
+        inFiles <- getModulePaths lbi bi modules
+        unless isVersion2 $ mockAll bi inFiles
         let prologName = distPref </> showPkg ++ "-haddock-prolog.txt"
             prolog | null (description pkg_descr) = synopsis pkg_descr
                    | otherwise                    = description pkg_descr
             subtitle | null (synopsis pkg_descr) = ""
                      | otherwise                 = ": " ++ synopsis pkg_descr
         writeFile prologName (prolog ++ "\n")
-        let outFiles = replaceLitExts inFiles
+        let targets
+              | isVersion2 = modules
+              | otherwise  = replaceLitExts inFiles
         let haddockFile = haddockPref pkg_descr </> haddockName pkg_descr
         -- FIX: replace w/ rawSystemProgramConf?
         rawSystemProgram verbosity confHaddock
@@ -216,8 +228,8 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
                  ++ programArgs confHaddock
                  ++ verboseFlags
                  ++ map ("--hide=" ++) (otherModules bi)
-                 ++ haddock2options bi
-                 ++ outFiles
+                 ++ haddock2options bi (buildDir lbi)
+                 ++ targets
                 )
         removeFile prologName
         notice verbosity $ "Documentation created: "
@@ -235,7 +247,10 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
             prolog | null (description pkg_descr) = synopsis pkg_descr
                    | otherwise                    = description pkg_descr
         writeFile prologName (prolog ++ "\n")
-        let outFiles = replaceLitExts inFiles
+        let targets
+              | isVersion2 = srcMainPath : otherModules bi
+              | otherwise = replaceLitExts inFiles
+        let preprocessDir = buildDir lbi </> exeName exe </> exeName exe ++ "-tmp"
         rawSystemProgram verbosity confHaddock
                 ([outputFlag,
                   "--odir=" ++ exeTargetDir,
@@ -245,8 +260,8 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
                  ++ packageFlags
                  ++ programArgs confHaddock
                  ++ verboseFlags
-                 ++ haddock2options bi
-                 ++ outFiles
+                 ++ haddock2options bi preprocessDir
+                 ++ targets
                 )
         removeFile prologName
         notice verbosity $ "Documentation created: "
@@ -272,13 +287,18 @@ haddock pkg_descr lbi suffixes haddockFlags@HaddockFlags {
         needsCpp bi = CPP `elem` extensions bi
 
 
-ghcSimpleOptions :: LocalBuildInfo -> BuildInfo -> [String]
-ghcSimpleOptions lbi bi
+ghcSimpleOptions :: LocalBuildInfo -> BuildInfo -> FilePath -> [String]
+ghcSimpleOptions lbi bi mockDir
   =  ["-hide-all-packages"]
-  ++ ["-i" ++ autogenModulesDir lbi]
-  ++ ["-i" ++ l | l <- nub (hsSourceDirs bi)]
   ++ (concat [ ["-package", showPackageId pkg] | pkg <- packageDeps lbi ])
+  ++ ["-i"]
   ++ hcOptions GHC (options bi)
+  ++ ["-i" ++ autogenModulesDir lbi]
+  ++ ["-i" ++ l | l <- nub (hsSourceDirs bi)]
+  ++ ["-i" ++ mockDir]
+  ++ ["-I" ++ dir | dir <- includeDirs bi]
+  ++ ["-odir", mockDir]
+  ++ ["-hidir", mockDir]
   ++ extensionsToFlags c (extensions bi)
   where c = compiler lbi