diff --git a/Cabal/.gitignore b/Cabal/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2ff2d589f026b32fa875dc790a1c2ef3c23434f6
--- /dev/null
+++ b/Cabal/.gitignore
@@ -0,0 +1,2 @@
+/dist/
+/tests/PackageTests/TestSuiteExeV10/dist-*
diff --git a/Cabal/tests/PackageTests.hs b/Cabal/tests/PackageTests.hs
index fe6d890f3193f8c5fd9be7e61b23ce1bb7b7d437..a3b244438e752250c910ad40fdd23ed376526e40 100644
--- a/Cabal/tests/PackageTests.hs
+++ b/Cabal/tests/PackageTests.hs
@@ -140,6 +140,7 @@ main = do
             , configOpts = [ "--package-db=" ++ dbFile
                            , "--constraint=Cabal == " ++ display cabalVersion
                            ]
+            , distPref = Nothing
             }
     putStrLn $ "Cabal test suite - testing cabal version " ++
         display cabalVersion
diff --git a/Cabal/tests/PackageTests/BenchmarkExeV10/Check.hs b/Cabal/tests/PackageTests/BenchmarkExeV10/Check.hs
index afbb94953763b3414cbec553eca2de28edd27347..6904048ee82fda19738f021c07c2225cd7ed509e 100644
--- a/Cabal/tests/PackageTests/BenchmarkExeV10/Check.hs
+++ b/Cabal/tests/PackageTests/BenchmarkExeV10/Check.hs
@@ -11,6 +11,6 @@ dir = "PackageTests" </> "BenchmarkExeV10"
 
 checkBenchmark :: FilePath -> Test
 checkBenchmark ghcPath = TestCase $ do
-    let spec = PackageSpec dir ["--enable-benchmarks"]
+    let spec = PackageSpec dir Nothing ["--enable-benchmarks"]
     buildResult <- cabal_build spec ghcPath
     assertBuildSucceeded buildResult
diff --git a/Cabal/tests/PackageTests/BenchmarkOptions/Check.hs b/Cabal/tests/PackageTests/BenchmarkOptions/Check.hs
index ee76f808893cd8e5a910a1228377e70a02a612ac..d217b04d213f5017af231008a0412adef25ef925 100644
--- a/Cabal/tests/PackageTests/BenchmarkOptions/Check.hs
+++ b/Cabal/tests/PackageTests/BenchmarkOptions/Check.hs
@@ -6,8 +6,11 @@ import Test.HUnit
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BenchmarkOptions")
-               ["--enable-benchmarks"]
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BenchmarkOptions"
+            , configOpts = ["--enable-benchmarks"]
+            , distPref = Nothing
+            }
     _ <- cabal_build spec ghcPath
     result <- cabal_bench spec ["--benchmark-options=1 2 3"] ghcPath
     let message = "\"cabal bench\" did not pass the correct options to the "
diff --git a/Cabal/tests/PackageTests/BenchmarkStanza/Check.hs b/Cabal/tests/PackageTests/BenchmarkStanza/Check.hs
index 0110dc56127e5530bc1f33e55573521c613eaae4..fb4098524511e27e8b853bcd6ac1586fb1045e71 100644
--- a/Cabal/tests/PackageTests/BenchmarkStanza/Check.hs
+++ b/Cabal/tests/PackageTests/BenchmarkStanza/Check.hs
@@ -26,7 +26,7 @@ suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
     let dir = "PackageTests" </> "BenchmarkStanza"
         pdFile = dir </> "my" <.> "cabal"
-        spec = PackageSpec dir []
+        spec = PackageSpec { directory = dir, configOpts = [], distPref = Nothing }
     result <- cabal_configure spec ghcPath
     assertOutputDoesNotContain "unknown section type" result
     genPD <- readPackageDescription silent pdFile
diff --git a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary0/Check.hs b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary0/Check.hs
index 27fc0a6eedc2ec5077d25de2e786532f5274d48d..14d979d07a75a84923792c5134dbda1f3f92bc1d 100644
--- a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary0/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary0/Check.hs
@@ -9,7 +9,11 @@ import Test.HUnit
 
 suite :: Version -> FilePath -> Test
 suite cabalVersion ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "InternalLibrary0") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "InternalLibrary0"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     assertBuildFailed result
     when (cabalVersion >= Version [1, 7] []) $ do
diff --git a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary1/Check.hs b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary1/Check.hs
index db041c7a566244bed0a70a2a129e193948e6f45b..27e813301f5648bb53ca1d1e191c33d16bd1d117 100644
--- a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary1/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary1/Check.hs
@@ -7,6 +7,10 @@ import Test.HUnit
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "InternalLibrary1") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "InternalLibrary1"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary2/Check.hs b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary2/Check.hs
index 065c71c83ab4caca8c5e344dd9f4059bc37c1a06..babf55e035fc1fbea6b23aa26f523ade0c5a18f7 100644
--- a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary2/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary2/Check.hs
@@ -8,8 +8,16 @@ import Test.HUnit
 
 suite :: FilePath -> FilePath -> Test
 suite ghcPath ghcPkgPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "InternalLibrary2") []
-    let specTI = PackageSpec (directory spec </> "to-install") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "InternalLibrary2"
+            , configOpts = []
+            , distPref = Nothing
+            }
+    let specTI = PackageSpec
+            { directory = directory spec </> "to-install"
+            , configOpts = []
+            , distPref = Nothing
+            }
 
     unregister "InternalLibrary2" ghcPkgPath
     iResult <- cabal_install specTI ghcPath
diff --git a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary3/Check.hs b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary3/Check.hs
index 8dcf90f1cca2a2f53ea8f83cb21e4abd05d58ee0..255bbd38f9d7238d05ae85aed9aef705d7e4eca3 100644
--- a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary3/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary3/Check.hs
@@ -8,8 +8,16 @@ import Test.HUnit
 
 suite :: FilePath -> FilePath -> Test
 suite ghcPath ghcPkgPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "InternalLibrary3") []
-    let specTI = PackageSpec (directory spec </> "to-install") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "InternalLibrary3"
+            , configOpts = []
+            , distPref = Nothing
+            }
+    let specTI = PackageSpec
+            { directory = directory spec </> "to-install"
+            , configOpts = []
+            , distPref = Nothing
+            }
 
     unregister "InternalLibrary3" ghcPkgPath
     iResult <- cabal_install specTI ghcPath
diff --git a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary4/Check.hs b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary4/Check.hs
index 70b3eb65d0566cdbedf35b95d35b3de958f42fc7..23cbc179314583940a4213d70d47893411417523 100644
--- a/Cabal/tests/PackageTests/BuildDeps/InternalLibrary4/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/InternalLibrary4/Check.hs
@@ -8,8 +8,16 @@ import Test.HUnit
 
 suite :: FilePath -> FilePath -> Test
 suite ghcPath ghcPkgPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "InternalLibrary4") []
-    let specTI = PackageSpec (directory spec </> "to-install") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "InternalLibrary4"
+            , configOpts = []
+            , distPref = Nothing
+            }
+    let specTI = PackageSpec
+            { directory = directory spec </> "to-install"
+            , configOpts = []
+            , distPref = Nothing
+            }
 
     unregister "InternalLibrary4" ghcPkgPath
     iResult <- cabal_install specTI ghcPath
diff --git a/Cabal/tests/PackageTests/BuildDeps/SameDepsAllRound/Check.hs b/Cabal/tests/PackageTests/BuildDeps/SameDepsAllRound/Check.hs
index 64e224505c299a59b1c46e8694265d6734c3bb48..8ee7e46bd56a94dfb32e2de4e8ce4ed698975ceb 100644
--- a/Cabal/tests/PackageTests/BuildDeps/SameDepsAllRound/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/SameDepsAllRound/Check.hs
@@ -8,7 +8,11 @@ import qualified Control.Exception as E
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "SameDepsAllRound") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "SameDepsAllRound"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     do
         assertEqual "cabal build should succeed - see test-log.txt" True (successful result)
diff --git a/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps1/Check.hs b/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps1/Check.hs
index a9e3a6d1547ee994e3ab36b1626b9c3235e83818..22ade2e7f01806833b9c34d6a9e7f2f610071c5a 100644
--- a/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps1/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps1/Check.hs
@@ -10,7 +10,11 @@ import Text.Regex.Posix
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "TargetSpecificDeps1") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "TargetSpecificDeps1"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     do
         assertEqual "cabal build should fail - see test-log.txt" False (successful result)
diff --git a/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps2/Check.hs b/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps2/Check.hs
index 2bd072337407b0576cf0c53dbccff6b6cbb160ac..f8dbe8ba2e1ab512b608c59756d27b7f6d0ce304 100644
--- a/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps2/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps2/Check.hs
@@ -8,7 +8,11 @@ import qualified Control.Exception as E
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "TargetSpecificDeps2") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "TargetSpecificDeps2"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     do
         assertEqual "cabal build should succeed - see test-log.txt" True (successful result)
diff --git a/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps3/Check.hs b/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps3/Check.hs
index a359e64bcab59c88acea27cb56b705a0f80ad5e2..c8881433bfb3619ff56e3941b2d8c05e05dc594c 100644
--- a/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps3/Check.hs
+++ b/Cabal/tests/PackageTests/BuildDeps/TargetSpecificDeps3/Check.hs
@@ -10,7 +10,11 @@ import Text.Regex.Posix
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "BuildDeps" </> "TargetSpecificDeps3") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "BuildDeps" </> "TargetSpecificDeps3"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     do
         assertEqual "cabal build should fail - see test-log.txt" False (successful result)
diff --git a/Cabal/tests/PackageTests/CMain/Check.hs b/Cabal/tests/PackageTests/CMain/Check.hs
index ed173a0fecd0b32e085e97932de176e5fbeb9f19..44fe4ae2f1abe234b06eac4125eb41dd06d3f0df 100644
--- a/Cabal/tests/PackageTests/CMain/Check.hs
+++ b/Cabal/tests/PackageTests/CMain/Check.hs
@@ -11,6 +11,10 @@ dir = "PackageTests" </> "CMain"
 
 checkBuild :: FilePath -> Test
 checkBuild ghcPath = TestCase $ do
-    let spec = PackageSpec dir []
+    let spec = PackageSpec
+            { directory = dir
+            , distPref = Nothing
+            , configOpts = []
+            }
     buildResult <- cabal_build spec ghcPath
     assertBuildSucceeded buildResult
diff --git a/Cabal/tests/PackageTests/DeterministicAr/Check.hs b/Cabal/tests/PackageTests/DeterministicAr/Check.hs
index 9930b3607566195c5c82489265bed56ae8514f74..28d94ef60ac4400ce9c7a052928a9f6222d6f13b 100644
--- a/Cabal/tests/PackageTests/DeterministicAr/Check.hs
+++ b/Cabal/tests/PackageTests/DeterministicAr/Check.hs
@@ -51,7 +51,11 @@ this = "DeterministicAr"
 suite :: FilePath -> FilePath -> Test
 suite ghcPath ghcPkgPath = TestCase $ do
     let dir = "PackageTests" </> this
-    let spec = PackageSpec dir []
+    let spec = PackageSpec
+            { directory = dir
+            , configOpts = []
+            , distPref = Nothing
+            }
 
     unregister this ghcPkgPath
     iResult <- cabal_install spec ghcPath
diff --git a/Cabal/tests/PackageTests/EmptyLib/Check.hs b/Cabal/tests/PackageTests/EmptyLib/Check.hs
index efeb2cb45b5475c67e7fb3496c327fc634947335..e4f182cc658708ded9b627acc930c0ec0050c019 100644
--- a/Cabal/tests/PackageTests/EmptyLib/Check.hs
+++ b/Cabal/tests/PackageTests/EmptyLib/Check.hs
@@ -7,7 +7,10 @@ import Test.HUnit
 -- See https://github.com/haskell/cabal/issues/1241
 emptyLib :: FilePath -> Test
 emptyLib ghcPath = TestCase $ do
-   let spec = PackageSpec ("PackageTests" </> "EmptyLib"
-                           </> "empty") []
+   let spec = PackageSpec
+          { directory = "PackageTests" </> "EmptyLib" </> "empty"
+          , configOpts = []
+          , distPref = Nothing
+          }
    result <- cabal_build spec ghcPath
    assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/Haddock/Check.hs b/Cabal/tests/PackageTests/Haddock/Check.hs
index 0d41dd45156220bab38f43d696aff657b56ca2c1..7fc2f3afbc8cf6fd2134dffe3ed4a47d9ea79668 100644
--- a/Cabal/tests/PackageTests/Haddock/Check.hs
+++ b/Cabal/tests/PackageTests/Haddock/Check.hs
@@ -18,7 +18,11 @@ suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
     let dir = "PackageTests" </> this
         haddocksDir = dir </> "dist" </> "doc" </> "html" </> "Haddock"
-        spec = PackageSpec dir []
+        spec = PackageSpec
+            { directory = dir
+            , configOpts = []
+            , distPref = Nothing
+            }
 
     haddocksDirExists <- doesDirectoryExist haddocksDir
     when haddocksDirExists (removeDirectoryRecursive haddocksDir)
diff --git a/Cabal/tests/PackageTests/OrderFlags/Check.hs b/Cabal/tests/PackageTests/OrderFlags/Check.hs
index 44c818db9b9b120cc31f008371448dae1697da45..ebda768242d33d5580d700e3efcd134f6279fcbd 100644
--- a/Cabal/tests/PackageTests/OrderFlags/Check.hs
+++ b/Cabal/tests/PackageTests/OrderFlags/Check.hs
@@ -11,7 +11,11 @@ import Prelude hiding (catch)
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "OrderFlags") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "OrderFlags"
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     do
         assertEqual "cabal build should succeed - see test-log.txt" True (successful result)
diff --git a/Cabal/tests/PackageTests/PackageTester.hs b/Cabal/tests/PackageTests/PackageTester.hs
index c2dddfdb0e7ed3eecd87199d5739491eb99b9e78..71c349e35aa4488942a0a06160687547a25a90ae 100644
--- a/Cabal/tests/PackageTests/PackageTester.hs
+++ b/Cabal/tests/PackageTests/PackageTester.hs
@@ -51,6 +51,7 @@ import Distribution.Verbosity (Verbosity, flagToVerbosity, normal)
 
 data PackageSpec = PackageSpec
     { directory  :: FilePath
+    , distPref :: Maybe FilePath
     , configOpts :: [String]
     }
 
@@ -180,7 +181,10 @@ compileSetup packageDir ghcPath = do
 
 -- | Returns the command that was issued, the return code, and the output text.
 cabal :: PackageSpec -> [(String, Maybe String)] -> [String] -> FilePath -> IO (String, ExitCode, String)
-cabal spec envOverrides cabalArgs ghcPath = do
+cabal spec envOverrides cabalArgs_ ghcPath = do
+    let cabalArgs = case distPref spec of
+                       Nothing -> cabalArgs_
+                       Just dist -> ("--builddir=" ++ dist) : cabalArgs_
     customSetup <- doesFileExist (directory spec </> "Setup.hs")
     if customSetup
         then do
diff --git a/Cabal/tests/PackageTests/PathsModule/Executable/Check.hs b/Cabal/tests/PackageTests/PathsModule/Executable/Check.hs
index 2bca087a266611b070c89a220f252ae0fcce04f1..f2a567a161a721ded4584b0f5e45bf901948b773 100644
--- a/Cabal/tests/PackageTests/PathsModule/Executable/Check.hs
+++ b/Cabal/tests/PackageTests/PathsModule/Executable/Check.hs
@@ -7,7 +7,10 @@ import Test.HUnit
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "PathsModule" </> "Executable")
-               []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "PathsModule" </> "Executable"
+            , distPref = Nothing
+            , configOpts = []
+            }
     result <- cabal_build spec ghcPath
     assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/PathsModule/Library/Check.hs b/Cabal/tests/PackageTests/PathsModule/Library/Check.hs
index 48aa3951fd1c29b38de90defc8f5d117eda04ec6..b3a4ebbf034ddfd2f88d27205e649e64501bcca2 100644
--- a/Cabal/tests/PackageTests/PathsModule/Library/Check.hs
+++ b/Cabal/tests/PackageTests/PathsModule/Library/Check.hs
@@ -7,6 +7,10 @@ import Test.HUnit
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "PathsModule" </> "Library") []
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "PathsModule" </> "Library"
+            , distPref = Nothing
+            , configOpts = []
+            }
     result <- cabal_build spec ghcPath
     assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/PreProcess/Check.hs b/Cabal/tests/PackageTests/PreProcess/Check.hs
index 96cbe8a3eaed72c15a932b42b7d4aa1dc085639e..7ee52d7d6b934735f6c284a9a0b8b014f9bb2081 100644
--- a/Cabal/tests/PackageTests/PreProcess/Check.hs
+++ b/Cabal/tests/PackageTests/PreProcess/Check.hs
@@ -7,7 +7,10 @@ import Test.HUnit
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "PreProcess")
-               ["--enable-tests", "--enable-benchmarks"]
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "PreProcess"
+            , distPref = Nothing
+            , configOpts = ["--enable-tests", "--enable-benchmarks"]
+            }
     result <- cabal_build spec ghcPath
     assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/ReexportedModules/Check.hs b/Cabal/tests/PackageTests/ReexportedModules/Check.hs
index c4778cb3564dc6e7682a030afbf3fe91af5ca87c..416bcbdb38b7dafbae27e050bad5779e8f48874d 100644
--- a/Cabal/tests/PackageTests/ReexportedModules/Check.hs
+++ b/Cabal/tests/PackageTests/ReexportedModules/Check.hs
@@ -29,6 +29,10 @@ suite ghcPath = TestCase $ do
                . reads
                $ xs
     when compat $ do
-        let spec = PackageSpec ("PackageTests" </> "ReexportedModules") []
+        let spec = PackageSpec
+                { directory = "PackageTests" </> "ReexportedModules"
+                , configOpts = []
+                , distPref = Nothing
+                }
         result <- cabal_build spec ghcPath
         assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/TemplateHaskell/Check.hs b/Cabal/tests/PackageTests/TemplateHaskell/Check.hs
index be05418209b300bd0874a2f056221d5c19fe7883..11d2c0e0aaa7a293c76b6ed25b8f9c06dbbe9c25 100644
--- a/Cabal/tests/PackageTests/TemplateHaskell/Check.hs
+++ b/Cabal/tests/PackageTests/TemplateHaskell/Check.hs
@@ -6,8 +6,11 @@ import Test.HUnit
 
 vanilla :: FilePath -> Test
 vanilla ghcPath = TestCase $ do
-  let spec = PackageSpec ("PackageTests" </>
-                          "TemplateHaskell" </> "vanilla") []
+  let spec = PackageSpec
+          { directory = "PackageTests" </> "TemplateHaskell" </> "vanilla"
+          , configOpts = []
+          , distPref = Nothing
+          }
   result <- cabal_build spec ghcPath
   assertBuildSucceeded result
 
@@ -16,8 +19,11 @@ profiling ghcPath = TestCase $ do
    let flags = ["--enable-library-profiling"
 --                ,"--disable-library-vanilla"
                ,"--enable-profiling"]
-       spec = PackageSpec ("PackageTests" </>
-                           "TemplateHaskell" </> "profiling") flags
+       spec = PackageSpec
+          { directory = "PackageTests" </> "TemplateHaskell" </> "profiling"
+          , configOpts = flags
+          , distPref = Nothing
+          }
    result <- cabal_build spec ghcPath
    assertBuildSucceeded result
 
@@ -26,7 +32,10 @@ dynamic ghcPath = TestCase $ do
     let flags = ["--enable-shared"
 --                ,"--disable-library-vanilla"
                 ,"--enable-executable-dynamic"]
-        spec = PackageSpec ("PackageTests" </>
-                            "TemplateHaskell" </> "dynamic") flags
+        spec = PackageSpec
+            { directory = "PackageTests" </> "TemplateHaskell" </> "dynamic"
+            , configOpts = flags
+            , distPref = Nothing
+            }
     result <- cabal_build spec ghcPath
     assertBuildSucceeded result
diff --git a/Cabal/tests/PackageTests/TestOptions/Check.hs b/Cabal/tests/PackageTests/TestOptions/Check.hs
index 252393f167cdc60f04755a49fe02f69554f49e31..4731d36de66b7d0b7f1475f867961ca9d1df182e 100644
--- a/Cabal/tests/PackageTests/TestOptions/Check.hs
+++ b/Cabal/tests/PackageTests/TestOptions/Check.hs
@@ -6,8 +6,11 @@ import Test.HUnit
 
 suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
-    let spec = PackageSpec ("PackageTests" </> "TestOptions")
-               ["--enable-tests"]
+    let spec = PackageSpec
+            { directory = "PackageTests" </> "TestOptions"
+            , configOpts = ["--enable-tests"]
+            , distPref = Nothing
+            }
     _ <- cabal_build spec ghcPath
     result <- cabal_test spec [] ["--test-options=1 2 3"] ghcPath
     let message = "\"cabal test\" did not pass the correct options to the "
diff --git a/Cabal/tests/PackageTests/TestStanza/Check.hs b/Cabal/tests/PackageTests/TestStanza/Check.hs
index 6489afa5f2cc128319da56a32139d2b895a7b72a..940cbcebad41d23fd78bd34ce6b4ca71f449e24a 100644
--- a/Cabal/tests/PackageTests/TestStanza/Check.hs
+++ b/Cabal/tests/PackageTests/TestStanza/Check.hs
@@ -23,7 +23,11 @@ suite :: FilePath -> Test
 suite ghcPath = TestCase $ do
     let dir = "PackageTests" </> "TestStanza"
         pdFile = dir </> "my" <.> "cabal"
-        spec = PackageSpec dir []
+        spec = PackageSpec
+            { directory = dir
+            , configOpts = []
+            , distPref = Nothing
+            }
     result <- cabal_configure spec ghcPath
     assertOutputDoesNotContain "unknown section type" result
     genPD <- readPackageDescription silent pdFile
diff --git a/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs b/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs
index 162d86084863b786ca230c2295956d11da16c206..bbe5b4a5935f42751daac430feb257c59a3e9b44 100644
--- a/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs
+++ b/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs
@@ -8,6 +8,7 @@ import Test.Framework (testGroup)
 import Test.Framework.Providers.HUnit (hUnitTestToTests)
 import Test.HUnit hiding ( path )
 
+import Distribution.Simple.Configure (getPersistBuildConfig)
 import Distribution.Simple.Hpc
 
 import PackageTests.PackageTester
@@ -16,8 +17,8 @@ checks :: FilePath -> [TF.Test]
 checks ghcPath =
     [ hunit "Test" $ checkTest ghcPath ]
     ++ hpcTestMatrix ghcPath ++
-    [ hunit "TestWithoutHpc/NoTix" $ checkTestWithoutHpcNoTix ghcPath
-    , hunit "TestWithoutHpc/NoMarkup" $ checkTestWithoutHpcNoMarkup ghcPath
+    [ hunit "TestNoHpc/NoTix" $ checkTestNoHpcNoTix ghcPath
+    , hunit "TestNoHpc/NoMarkup" $ checkTestNoHpcNoMarkup ghcPath
     ]
 
 hpcTestMatrix :: FilePath -> [TF.Test]
@@ -27,7 +28,7 @@ hpcTestMatrix ghcPath = do
     exeDyn <- [True, False]
     shared <- [True, False]
     let name = concat
-            [ "WithHpc/"
+            [ "WithHpc-"
             , if libProf then "LibProf" else ""
             , if exeProf then "ExeProf" else ""
             , if exeDyn then "ExeDyn" else ""
@@ -42,13 +43,13 @@ hpcTestMatrix ghcPath = do
             , enable exeDyn "executable-dynamic"
             , enable shared "shared"
             ]
-    return $ hunit name $ checkTestWithHpc ghcPath opts
+    return $ hunit name $ checkTestWithHpc ghcPath name opts
 
 dir :: FilePath
 dir = "PackageTests" </> "TestSuiteExeV10"
 
 checkTest :: FilePath -> Test
-checkTest ghcPath = TestCase $ buildAndTest ghcPath [] []
+checkTest ghcPath = TestCase $ buildAndTest ghcPath "Default" [] []
 
 shouldExist :: FilePath -> Assertion
 shouldExist path = doesFileExist path >>= assertBool (path ++ " should exist")
@@ -58,39 +59,49 @@ shouldNotExist path =
     doesFileExist path >>= assertBool (path ++ " should exist") . not
 
 -- | Ensure that both .tix file and markup are generated if coverage is enabled.
-checkTestWithHpc :: FilePath -> [String] -> Test
-checkTestWithHpc ghcPath extraOpts = TestCase $ do
-    buildAndTest ghcPath [] ("--enable-coverage" : extraOpts)
-    shouldExist $ mixDir (dir </> "dist") "my-0.1" </> "my-0.1" </> "Foo.mix"
-    shouldExist $ mixDir (dir </> "dist") "test-Foo" </> "Main.mix"
-    shouldExist $ tixFilePath (dir </> "dist") "test-Foo"
-    shouldExist $ htmlDir (dir </> "dist") "test-Foo" </> "hpc_index.html"
+checkTestWithHpc :: FilePath -> String -> [String] -> Test
+checkTestWithHpc ghcPath name extraOpts = TestCase $ do
+    buildAndTest ghcPath name [] ("--enable-coverage" : extraOpts)
+    lbi <- getPersistBuildConfig (dir </> "dist-" ++ name)
+    let way = guessWay lbi
+    shouldExist $ mixDir (dir </> "dist-" ++ name) way "my-0.1" </> "my-0.1" </> "Foo.mix"
+    shouldExist $ mixDir (dir </> "dist-" ++ name) way "test-Foo" </> "Main.mix"
+    shouldExist $ tixFilePath (dir </> "dist-" ++ name) way "test-Foo"
+    shouldExist $ htmlDir (dir </> "dist-" ++ name) way "test-Foo" </> "hpc_index.html"
 
 -- | Ensures that even if -fhpc is manually provided no .tix file is output.
-checkTestWithoutHpcNoTix :: FilePath -> Test
-checkTestWithoutHpcNoTix ghcPath = TestCase $ do
-    buildAndTest ghcPath [] [ "--ghc-option=-fhpc"
-                            , "--ghc-option=-hpcdir"
-                            , "--ghc-option=dist/hpc" ]
-    shouldNotExist $ tixFilePath (dir </> "dist") "test-Foo"
+checkTestNoHpcNoTix :: FilePath -> Test
+checkTestNoHpcNoTix ghcPath = TestCase $ do
+    buildAndTest ghcPath "NoHpcNoTix" []
+      [ "--ghc-option=-fhpc"
+      , "--ghc-option=-hpcdir"
+      , "--ghc-option=dist-NoHpcNoTix/hpc/vanilla" ]
+    lbi <- getPersistBuildConfig (dir </> "dist-NoHpcNoTix")
+    let way = guessWay lbi
+    shouldNotExist $ tixFilePath (dir </> "dist-NoHpcNoTix") way "test-Foo"
 
 -- | Ensures that even if a .tix file happens to be left around
 -- markup isn't generated.
-checkTestWithoutHpcNoMarkup :: FilePath -> Test
-checkTestWithoutHpcNoMarkup ghcPath = TestCase $ do
-    let tixFile = tixFilePath "dist" "test-Foo"
-    buildAndTest ghcPath [("HPCTIXFILE", Just tixFile)]
-                         [ "--ghc-option=-fhpc"
-                         , "--ghc-option=-hpcdir"
-                         , "--ghc-option=dist/hpc" ]
-    shouldNotExist $ htmlDir (dir </> "dist") "test-Foo" </> "hpc_index.html"
+checkTestNoHpcNoMarkup :: FilePath -> Test
+checkTestNoHpcNoMarkup ghcPath = TestCase $ do
+    let tixFile = tixFilePath "dist-NoHpcNoMarkup" Vanilla "test-Foo"
+    buildAndTest ghcPath "NoHpcNoMarkup"
+      [("HPCTIXFILE", Just tixFile)]
+      [ "--ghc-option=-fhpc"
+      , "--ghc-option=-hpcdir"
+      , "--ghc-option=dist-NoHpcNoMarkup/hpc/vanilla" ]
+    shouldNotExist $ htmlDir (dir </> "dist-NoHpcNoMarkup") Vanilla "test-Foo" </> "hpc_index.html"
 
 -- | Build and test a package and ensure that both were successful.
 --
 -- The flag "--enable-tests" is provided in addition to the given flags.
-buildAndTest :: FilePath -> [(String, Maybe String)] -> [String] -> IO ()
-buildAndTest ghcPath envOverrides flags = do
-    let spec = PackageSpec dir $ "--enable-tests" : flags
+buildAndTest :: FilePath -> String -> [(String, Maybe String)] -> [String] -> IO ()
+buildAndTest ghcPath name envOverrides flags = do
+    let spec = PackageSpec
+            { directory = dir
+            , distPref = Just $ "dist-" ++ name
+            , configOpts = "--enable-tests" : flags
+            }
     buildResult <- cabal_build spec ghcPath
     assertBuildSucceeded buildResult
     testResult <- cabal_test spec envOverrides [] ghcPath