diff --git a/Cabal/src/Distribution/Simple/BuildPaths.hs b/Cabal/src/Distribution/Simple/BuildPaths.hs
index 05a9c6c190fee18f28b12786e19a95bea619c2b2..c0305b7e9f0cde884d419886f030b481d58cb6ec 100644
--- a/Cabal/src/Distribution/Simple/BuildPaths.hs
+++ b/Cabal/src/Distribution/Simple/BuildPaths.hs
@@ -19,6 +19,7 @@ module Distribution.Simple.BuildPaths
   , srcPref
   , buildInfoPref
   , haddockDirName
+  , haddockLibraryDirPath
   , hscolourPref
   , haddockPref
   , autogenPackageModulesDir
@@ -26,7 +27,11 @@ module Distribution.Simple.BuildPaths
   , autogenPathsModuleName
   , autogenPackageInfoModuleName
   , cppHeaderName
-  , haddockName
+  , haddockPath
+  , haddockPackageLibraryName
+  , haddockPackageLibraryName'
+  , haddockLibraryName
+  , haddockLibraryPath
   , mkGenericStaticLibName
   , mkLibName
   , mkProfLibName
@@ -92,10 +97,28 @@ buildInfoPref distPref = distPref </> makeRelativePathEx "build-info.json"
 
 -- | This is the name of the directory in which the generated haddocks
 -- should be stored. It does not include the @<dist>/doc/html@ prefix.
+--
+-- It is also used by `haddock-project` when constructing its output directory.
 haddockDirName :: HaddockTarget -> PackageDescription -> FilePath
 haddockDirName ForDevelopment = prettyShow . packageName
 haddockDirName ForHackage = (++ "-docs") . prettyShow . packageId
 
+-- | This is the name of the directory in which the generated haddocks for
+-- a (sub)library should be stored. It does not include the @<dist>/doc/html@
+-- prefix.
+--
+-- It is also used by `haddock-project` when constructing its output directory.
+haddockLibraryDirPath
+  :: HaddockTarget
+  -> PackageDescription
+  -> Library
+  -> FilePath
+haddockLibraryDirPath haddockTarget pkg_descr lib =
+  case libName lib of
+    LSubLibName sublib_name ->
+      haddockDirName haddockTarget pkg_descr </> prettyShow sublib_name
+    _ -> haddockDirName haddockTarget pkg_descr
+
 -- | The directory to which generated haddock documentation should be written.
 haddockPref
   :: HaddockTarget
@@ -139,8 +162,35 @@ autogenPackageInfoModuleName pkg_descr =
     fixchar '-' = '_'
     fixchar c = c
 
-haddockName :: PackageDescription -> FilePath
-haddockName pkg_descr = prettyShow (packageName pkg_descr) <.> "haddock"
+haddockPath :: PackageDescription -> FilePath
+haddockPath pkg_descr = prettyShow (packageName pkg_descr) <.> "haddock"
+
+-- | A name of a (sub)library used by haddock, in the form
+-- `<package>:<library>` if it is a sublibrary, or `<package>` if it is the
+-- main library.
+--
+-- Used by `haddock-project` and `Distribution.Simple.Haddock`.
+haddockPackageLibraryName :: PackageDescription -> Library -> String
+haddockPackageLibraryName pkg_descr lib =
+  haddockPackageLibraryName' (packageName pkg_descr) (libName lib)
+
+haddockPackageLibraryName' :: PackageName -> LibraryName -> String
+haddockPackageLibraryName' pkg_name lib_name =
+  case lib_name of
+    LSubLibName sublib_name ->
+      prettyShow pkg_name ++ ":" ++ prettyShow sublib_name
+    LMainLibName -> prettyShow pkg_name
+
+-- | A name of a (sub)library used by haddock.
+haddockLibraryName :: PackageDescription -> Library -> String
+haddockLibraryName pkg_descr lib =
+  case libName lib of
+    LSubLibName sublib_name -> prettyShow sublib_name
+    LMainLibName -> prettyShow (packageName pkg_descr)
+
+-- | File path of the ".haddock" file.
+haddockLibraryPath :: PackageDescription -> Library -> FilePath
+haddockLibraryPath pkg_descr lib = haddockLibraryName pkg_descr lib <.> "haddock"
 
 -- -----------------------------------------------------------------------------
 -- Source File helper
diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs
index 657991e16b1cf86270faa552c71bceffab2c10d3..ab3c3fd1d8df129f38bb24372678b8bfe9f4770e 100644
--- a/Cabal/src/Distribution/Simple/Haddock.hs
+++ b/Cabal/src/Distribution/Simple/Haddock.hs
@@ -369,8 +369,10 @@ haddock_setupHooks
                   lbi'
                   clbi
                   htmlTemplate
+                  haddockTarget
+                  pkg_descr
                   exe
-              let exeArgs' = commonArgs `mappend` exeArgs
+                  commonArgs
               runHaddock
                 verbosity
                 mbWorkDir
@@ -379,7 +381,7 @@ haddock_setupHooks
                 platform
                 haddockProg
                 True
-                exeArgs'
+                exeArgs
             Nothing -> do
               warn
                 verbosity
@@ -406,9 +408,19 @@ haddock_setupHooks
                 lbi'
                 clbi
                 htmlTemplate
+                haddockTarget
+                pkg_descr
                 lib
-            let libArgs' = commonArgs `mappend` libArgs
-            runHaddock verbosity mbWorkDir tmpFileOpts comp platform haddockProg True libArgs'
+                commonArgs
+            runHaddock
+              verbosity
+              mbWorkDir
+              tmpFileOpts
+              comp
+              platform
+              haddockProg
+              True
+              libArgs
             inplaceDir <- absoluteWorkingDirLBI lbi
 
             let
@@ -450,9 +462,19 @@ haddock_setupHooks
                       lbi'
                       clbi
                       htmlTemplate
+                      haddockTarget
+                      pkg_descr
                       flib
-                  let libArgs' = commonArgs `mappend` flibArgs
-                  runHaddock verbosity mbWorkDir tmpFileOpts comp platform haddockProg True libArgs'
+                      commonArgs
+                  runHaddock
+                    verbosity
+                    mbWorkDir
+                    tmpFileOpts
+                    comp
+                    platform
+                    haddockProg
+                    True
+                    flibArgs
               )
               >> return index
           CExe _ -> when (flag haddockExecutables) (smsg >> doExe component) >> return index
@@ -547,13 +569,11 @@ fromHaddockProjectFlags flags =
     }
 
 fromPackageDescription :: HaddockTarget -> PackageDescription -> HaddockArgs
-fromPackageDescription haddockTarget pkg_descr =
+fromPackageDescription _haddockTarget pkg_descr =
   mempty
-    { argInterfaceFile = Flag $ haddockName pkg_descr
+    { argInterfaceFile = Flag $ haddockPath pkg_descr
     , argPackageName = Flag $ packageId $ pkg_descr
-    , argOutputDir =
-        Dir $
-          "doc" </> "html" </> haddockDirName haddockTarget pkg_descr
+    , argOutputDir = Dir $ "doc" </> "html"
     , argPrologue =
         Flag $
           ShortText.fromShortText $
@@ -674,9 +694,13 @@ fromLibrary
   -> ComponentLocalBuildInfo
   -> Maybe PathTemplate
   -- ^ template for HTML location
+  -> HaddockTarget
+  -> PackageDescription
   -> Library
+  -> HaddockArgs
+  -- ^ common args
   -> IO HaddockArgs
-fromLibrary verbosity haddockArtifactsDirs lbi clbi htmlTemplate lib = do
+fromLibrary verbosity haddockArtifactsDirs lbi clbi htmlTemplate haddockTarget pkg_descr lib commonArgs = do
   inFiles <- map snd `fmap` getLibSourceFiles verbosity lbi lib clbi
   args <-
     mkHaddockArgs
@@ -687,10 +711,29 @@ fromLibrary verbosity haddockArtifactsDirs lbi clbi htmlTemplate lib = do
       htmlTemplate
       inFiles
       (libBuildInfo lib)
-  return
-    args
-      { argHideModules = (mempty, otherModules (libBuildInfo lib))
-      }
+  let args' =
+        commonArgs
+          <> args
+            { argOutputDir =
+                Dir $ haddockLibraryDirPath haddockTarget pkg_descr lib
+            , argInterfaceFile = Flag $ haddockLibraryPath pkg_descr lib
+            }
+      args'' =
+        args'
+          { argHideModules = (mempty, otherModules (libBuildInfo lib))
+          , argTitle = Flag $ haddockPackageLibraryName pkg_descr lib
+          , -- we need to accommodate for `argOutputDir`, see `haddockLibraryPath`
+            argBaseUrl = case (libName lib, argBaseUrl args') of
+              (LSubLibName _, Flag url) -> Flag $ ".." </> url
+              (_, a) -> a
+          , argContents = case (libName lib, argContents args') of
+              (LSubLibName _, Flag url) -> Flag $ ".." </> url
+              (_, a) -> a
+          , argIndex = case (libName lib, argIndex args') of
+              (LSubLibName _, Flag url) -> Flag $ ".." </> url
+              (_, a) -> a
+          }
+  return args''
 
 fromExecutable
   :: Verbosity
@@ -701,9 +744,13 @@ fromExecutable
   -> ComponentLocalBuildInfo
   -> Maybe PathTemplate
   -- ^ template for HTML location
+  -> HaddockTarget
+  -> PackageDescription
   -> Executable
+  -> HaddockArgs
+  -- ^ common args
   -> IO HaddockArgs
-fromExecutable verbosity haddockArtifactsDirs lbi clbi htmlTemplate exe = do
+fromExecutable verbosity haddockArtifactsDirs lbi clbi htmlTemplate haddockTarget pkg_descr exe commonArgs = do
   inFiles <- map snd `fmap` getExeSourceFiles verbosity lbi exe clbi
   args <-
     mkHaddockArgs
@@ -714,10 +761,27 @@ fromExecutable verbosity haddockArtifactsDirs lbi clbi htmlTemplate exe = do
       htmlTemplate
       inFiles
       (buildInfo exe)
+  let args' =
+        commonArgs
+          <> args
+            { argOutputDir =
+                Dir $
+                  haddockDirName haddockTarget pkg_descr
+                    </> unUnqualComponentName (exeName exe)
+            }
   return
-    args
-      { argOutputDir = Dir $ unUnqualComponentName $ exeName exe
-      , argTitle = Flag $ unUnqualComponentName $ exeName exe
+    args'
+      { argTitle = Flag $ unUnqualComponentName $ exeName exe
+      , -- we need to accommodate `argOutputDir`
+        argBaseUrl = case argBaseUrl args' of
+          Flag url -> Flag $ ".." </> url
+          NoFlag -> NoFlag
+      , argContents = case argContents args' of
+          Flag url -> Flag $ ".." </> url
+          NoFlag -> NoFlag
+      , argIndex = case argIndex args' of
+          Flag url -> Flag $ ".." </> url
+          NoFlag -> NoFlag
       }
 
 fromForeignLib
@@ -729,9 +793,13 @@ fromForeignLib
   -> ComponentLocalBuildInfo
   -> Maybe PathTemplate
   -- ^ template for HTML location
+  -> HaddockTarget
+  -> PackageDescription
   -> ForeignLib
+  -> HaddockArgs
+  -- ^ common args
   -> IO HaddockArgs
-fromForeignLib verbosity haddockArtifactsDirs lbi clbi htmlTemplate flib = do
+fromForeignLib verbosity haddockArtifactsDirs lbi clbi htmlTemplate haddockTarget pkg_descr flib commonArgs = do
   inFiles <- map snd `fmap` getFLibSourceFiles verbosity lbi flib clbi
   args <-
     mkHaddockArgs
@@ -742,10 +810,27 @@ fromForeignLib verbosity haddockArtifactsDirs lbi clbi htmlTemplate flib = do
       htmlTemplate
       inFiles
       (foreignLibBuildInfo flib)
+  let args' =
+        commonArgs
+          <> args
+            { argOutputDir =
+                Dir $
+                  haddockDirName haddockTarget pkg_descr
+                    </> unUnqualComponentName (foreignLibName flib)
+            }
   return
-    args
-      { argOutputDir = Dir $ unUnqualComponentName $ foreignLibName flib
-      , argTitle = Flag $ unUnqualComponentName $ foreignLibName flib
+    args'
+      { argTitle = Flag $ unUnqualComponentName $ foreignLibName flib
+      , -- we need to accommodate `argOutputDir`
+        argBaseUrl = case argBaseUrl args' of
+          Flag url -> Flag $ ".." </> url
+          NoFlag -> NoFlag
+      , argContents = case argContents args' of
+          Flag url -> Flag $ ".." </> url
+          NoFlag -> NoFlag
+      , argIndex = case argIndex args' of
+          Flag url -> Flag $ ".." </> url
+          NoFlag -> NoFlag
       }
 
 compToExe :: Component -> Maybe Executable
@@ -1117,7 +1202,8 @@ haddockPackagePaths ipkgs mkHtmlPath = do
   interfaces <-
     sequenceA
       [ case interfaceAndHtmlPath ipkg of
-        Nothing -> return (Left (packageId ipkg))
+        Nothing -> do
+          return (Left (packageId ipkg))
         Just (interface, html) -> do
           (html', hypsrc') <-
             case html of
diff --git a/Cabal/src/Distribution/Simple/Install.hs b/Cabal/src/Distribution/Simple/Install.hs
index c46f28b352932c3b029b02b412dc3ffa8e9b6d61..435d3fbbebc8ddecb1b49884bd1a4d6737dc3cc6 100644
--- a/Cabal/src/Distribution/Simple/Install.hs
+++ b/Cabal/src/Distribution/Simple/Install.hs
@@ -38,7 +38,7 @@ import Distribution.Types.UnqualComponentName
 
 import Distribution.Package
 import Distribution.PackageDescription
-import Distribution.Simple.BuildPaths (haddockName, haddockPref)
+import Distribution.Simple.BuildPaths (haddockPath, haddockPref)
 import Distribution.Simple.BuildTarget
 import Distribution.Simple.Compiler
   ( CompilerFlavor (..)
@@ -199,8 +199,8 @@ copyPackage verbosity pkg_descr lbi distPref copydest = do
     -- copy in htmlPref first.
     let haddockInterfaceFileSrc =
           haddockPref ForDevelopment distPref pkg_descr
-            </> makeRelativePathEx (haddockName pkg_descr)
-        haddockInterfaceFileDest = interfacePref </> haddockName pkg_descr
+            </> makeRelativePathEx (haddockPath pkg_descr)
+        haddockInterfaceFileDest = interfacePref </> haddockPath pkg_descr
     -- We only generate the haddock interface file for libs, So if the
     -- package consists only of executables there will not be one:
     exists <- doesFileExist $ i haddockInterfaceFileSrc
diff --git a/Cabal/src/Distribution/Simple/Register.hs b/Cabal/src/Distribution/Simple/Register.hs
index 78053111a4aa6ca7552886b30dd234b979a5d4e7..7648c867f993b0463535a77830d8e25a7582c278 100644
--- a/Cabal/src/Distribution/Simple/Register.hs
+++ b/Cabal/src/Distribution/Simple/Register.hs
@@ -548,7 +548,7 @@ generalInstalledPackageInfo adjustRelIncDirs pkg abi_hash lib lbi clbi installDi
     , IPI.ldOptions = ldOptions bi
     , IPI.frameworks = map getSymbolicPath $ frameworks bi
     , IPI.frameworkDirs = map getSymbolicPath $ extraFrameworkDirs bi
-    , IPI.haddockInterfaces = [haddockdir installDirs </> haddockName pkg]
+    , IPI.haddockInterfaces = [haddockdir installDirs </> haddockLibraryPath pkg lib]
     , IPI.haddockHTMLs = [htmldir installDirs]
     , IPI.pkgRoot = Nothing
     , IPI.libVisibility = libVisibility lib
diff --git a/Cabal/src/Distribution/Simple/Setup/Haddock.hs b/Cabal/src/Distribution/Simple/Setup/Haddock.hs
index 402544ce5111754648a86b1260fd59dcc21c8d67..c896288b4313a5f0e43840c29043c9115445028d 100644
--- a/Cabal/src/Distribution/Simple/Setup/Haddock.hs
+++ b/Cabal/src/Distribution/Simple/Setup/Haddock.hs
@@ -441,7 +441,6 @@ data HaddockProjectFlags = HaddockProjectFlags
   , haddockProjectVerbosity :: Flag Verbosity
   , -- haddockBaseUrl is not supported, a fixed value is provided
     haddockProjectResourcesDir :: Flag String
-  , haddockProjectOutputDir :: Flag FilePath
   }
   deriving (Show, Generic, Typeable)
 
@@ -465,7 +464,6 @@ defaultHaddockProjectFlags =
     , haddockProjectKeepTempFiles = Flag False
     , haddockProjectVerbosity = Flag normal
     , haddockProjectResourcesDir = NoFlag
-    , haddockProjectOutputDir = NoFlag
     , haddockProjectInterfaces = NoFlag
     }
 
@@ -613,13 +611,6 @@ haddockProjectOptions _showOrParseArgs =
       haddockProjectResourcesDir
       (\v flags -> flags{haddockProjectResourcesDir = v})
       (reqArgFlag "DIR")
-  , option
-      ""
-      ["output-dir"]
-      "Generate haddock documentation into this directory. This flag is provided as a technology preview and is subject to change in the next releases."
-      haddockProjectOutputDir
-      (\v flags -> flags{haddockProjectOutputDir = v})
-      (reqArgFlag "DIR")
   ]
 
 emptyHaddockProjectFlags :: HaddockProjectFlags
diff --git a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
index 5da4e970b1cf221b72fbcc106fd2c25b7e1579f4..0b88a79581050a48a5ae1b1b7811bb1864059793 100644
--- a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
+++ b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
@@ -3,6 +3,7 @@ module Distribution.Client.CmdHaddockProject
   , haddockProjectAction
   ) where
 
+import Control.Monad (mapM)
 import Distribution.Client.Compat.Prelude hiding (get)
 import Prelude ()
 
@@ -11,8 +12,8 @@ import qualified Distribution.Client.CmdHaddock as CmdHaddock
 
 import Distribution.Client.DistDirLayout
   ( CabalDirLayout (..)
-  , DistDirLayout (..)
   , StoreDirLayout (..)
+  , distBuildDirectory
   )
 import Distribution.Client.InstallPlan (foldPlanPackage)
 import qualified Distribution.Client.InstallPlan as InstallPlan
@@ -24,7 +25,6 @@ import Distribution.Client.ProjectOrchestration
   , ProjectBaseContext (..)
   , ProjectBuildContext (..)
   , TargetSelector (..)
-  , printPlan
   , pruneInstallPlanToTargets
   , resolveTargets
   , runProjectPreBuildPhase
@@ -52,6 +52,12 @@ import Distribution.Client.Setup
   )
 import Distribution.Client.TargetProblem (TargetProblem (..))
 
+import Distribution.Simple.BuildPaths
+  ( haddockDirName
+  , haddockLibraryDirPath
+  , haddockLibraryPath
+  , haddockPath
+  )
 import Distribution.Simple.Command
   ( CommandUI (..)
   )
@@ -75,6 +81,7 @@ import Distribution.Simple.Program.Db
 import Distribution.Simple.Setup
   ( HaddockFlags (..)
   , HaddockProjectFlags (..)
+  , HaddockTarget (..)
   , Visibility (..)
   , defaultCommonSetupFlags
   , defaultHaddockFlags
@@ -84,9 +91,11 @@ import Distribution.Simple.Utils
   ( copyDirectoryRecursive
   , createDirectoryIfMissingVerbose
   , dieWithException
+  , info
   , warn
   )
 import Distribution.Types.InstalledPackageInfo (InstalledPackageInfo (..))
+import Distribution.Types.PackageDescription (PackageDescription (subLibraries))
 import Distribution.Types.PackageId (pkgName)
 import Distribution.Types.PackageName (unPackageName)
 import Distribution.Types.UnitId (unUnitId)
@@ -98,7 +107,7 @@ import Distribution.Verbosity as Verbosity
 
 import Distribution.Client.Errors
 import System.Directory (doesDirectoryExist, doesFileExist)
-import System.FilePath (normalise, takeDirectory, (<.>), (</>))
+import System.FilePath (normalise, takeDirectory, (</>))
 
 haddockProjectAction :: HaddockProjectFlags -> [String] -> GlobalFlags -> IO ()
 haddockProjectAction flags _extraArgs globalFlags = do
@@ -149,7 +158,10 @@ haddockProjectAction flags _extraArgs globalFlags = do
                 else NoFlag
           , haddockKeepTempFiles = haddockProjectKeepTempFiles flags
           , haddockResourcesDir = haddockProjectResourcesDir flags
-          , haddockOutputDir = haddockProjectOutputDir flags
+          -- NOTE: we don't pass `haddockOutputDir`. If we do, we'll need to
+          -- make sure `InstalledPackageInfo` contains the right path to
+          -- haddock interfaces.  Instead we build documentation inside
+          -- `dist-newstyle` directory and copy it to the output directory.
           }
       nixFlags =
         (commandDefaultFlags CmdHaddock.haddockCommand)
@@ -199,8 +211,6 @@ haddockProjectAction flags _extraArgs globalFlags = do
                   elaboratedPlan
           return (elaboratedPlan', targets)
 
-      printPlan verbosity baseCtx buildCtx
-
       let elaboratedPlan :: ElaboratedInstallPlan
           elaboratedPlan = elaboratedPlanOriginal buildCtx
 
@@ -255,68 +265,68 @@ haddockProjectAction flags _extraArgs globalFlags = do
 
       packageInfos <- fmap (nub . concat) $ for pkgs $ \pkg ->
         case pkg of
-          Left _
-            | not localStyle ->
-                return []
-          Left package -> do
-            -- TODO: this might not work for public packages with sublibraries.
-            -- Issue #9026.
+          Left package | localStyle -> do
             let packageName = unPackageName (pkgName $ sourcePackageId package)
                 destDir = outputDir </> packageName
             fmap catMaybes $ for (haddockInterfaces package) $ \interfacePath -> do
               let docDir = takeDirectory interfacePath
               a <- doesFileExist interfacePath
               case a of
-                True ->
+                True -> do
                   copyDirectoryRecursive verbosity docDir destDir
-                    >> return
-                      ( Just
-                          ( packageName
-                          , interfacePath
-                          , Hidden
-                          )
-                      )
+                  return $ Just $ Right (packageName, interfacePath, Hidden)
                 False -> return Nothing
+          Left _ -> return []
           Right package ->
             case elabLocalToProject package of
               True -> do
                 let distDirParams = elabDistDirParams sharedConfig' package
-                    unitId = unUnitId (elabUnitId package)
+                    pkg_descr = elabPkgDescription package
+
+                    packageName = pkgName $ elabPkgSourceId package
+                    unitId = elabUnitId package
+                    packageDir = haddockDirName ForDevelopment pkg_descr
+                    destDir = outputDir </> packageDir
+                    interfacePath = destDir </> haddockPath pkg_descr
+
                     buildDir = distBuildDirectory distLayout distDirParams
-                    packageName = unPackageName (pkgName $ elabPkgSourceId package)
-                    -- TODO: is there a better way to recognise if the library
-                    -- is the main library?
-                    mainLib =
-                      prettyShow (elabPkgSourceId package) ++ "-inplace"
-                        == prettyShow (elabUnitId package)
-                    name = if mainLib then packageName else unitId
-
-                let docDir =
+                    docDir =
                       buildDir
                         </> "doc"
                         </> "html"
-                        </> packageName
-                    destDir = outputDir </> name
-                    interfacePath =
-                      destDir
-                        </> packageName
-                        <.> "haddock"
+                        </> packageDir
+
                 a <- doesDirectoryExist docDir
-                case a of
-                  True -> do
+                if a
+                  then do
                     copyDirectoryRecursive verbosity docDir destDir
-                    return
-                      [
-                        ( name
-                        , interfacePath
-                        , Visible
+                    let infos :: [(String, FilePath, Visibility)]
+                        infos =
+                          (unPackageName packageName, interfacePath, Visible)
+                            : [ (sublibDirPath, sublibInterfacePath, Visible)
+                              | lib <- subLibraries pkg_descr
+                              , let sublibDirPath = haddockLibraryDirPath ForDevelopment pkg_descr lib
+                                    sublibInterfacePath =
+                                      outputDir
+                                        </> sublibDirPath
+                                        </> haddockLibraryPath pkg_descr lib
+                              ]
+                    infos' <-
+                      mapM
+                        ( \x@(_, path, _) -> do
+                            e <- doesFileExist path
+                            return $
+                              if e
+                                then Right x
+                                else Left path
                         )
-                      ]
-                  False -> do
+                        infos
+                    return infos'
+                  else do
                     warn
                       verbosity
                       ( "haddocks of "
-                          ++ show unitId
+                          ++ unUnitId unitId
                           ++ " not found in the store"
                       )
                     return []
@@ -324,56 +334,51 @@ haddockProjectAction flags _extraArgs globalFlags = do
                 | not localStyle ->
                     return []
               False -> do
-                let packageName = unPackageName (pkgName $ elabPkgSourceId package)
+                let pkg_descr = elabPkgDescription package
                     unitId = unUnitId (elabUnitId package)
                     packageDir =
                       storePackageDirectory
                         (cabalStoreDirLayout cabalLayout)
                         (pkgConfigCompiler sharedConfig')
                         (elabUnitId package)
+                    -- TODO: use `InstallDirTemplates`
                     docDir = packageDir </> "share" </> "doc" </> "html"
-                    destDir = outputDir </> packageName
-                    interfacePath =
-                      destDir
-                        </> packageName
-                        <.> "haddock"
+                    destDir = outputDir </> haddockDirName ForDevelopment pkg_descr
+                    interfacePath = destDir </> haddockPath pkg_descr
                 a <- doesDirectoryExist docDir
                 case a of
-                  True ->
+                  True -> do
                     copyDirectoryRecursive verbosity docDir destDir
-                      -- non local packages will be hidden in haddock's
-                      -- generated contents page
-                      >> return
-                        [
-                          ( unitId
-                          , interfacePath
-                          , Hidden
-                          )
-                        ]
+                    -- non local packages will be hidden in haddock's
+                    -- generated contents page
+                    return [Right (unitId, interfacePath, Hidden)]
                   False -> do
-                    warn
-                      verbosity
-                      ( "haddocks of "
-                          ++ show unitId
-                          ++ " not found in the store"
-                      )
-                    return []
+                    return [Left unitId]
 
       --
       -- generate index, content, etc.
       --
 
+      let (missingHaddocks, packageInfos') = partitionEithers packageInfos
+      when (not (null missingHaddocks)) $ do
+        warn verbosity "missing haddocks for some packages from the store"
+        -- Show the package list if `-v1` is passed; it's usually a long list.
+        -- One needs to add `package` stantza in `cabal.project` file for
+        -- `cabal` to include a version which has haddocks (or set
+        -- `documentation: True` in the global config).
+        info verbosity (intercalate "\n" missingHaddocks)
+
       let flags' =
             flags
               { haddockProjectDir = Flag outputDir
               , haddockProjectInterfaces =
                   Flag
                     [ ( interfacePath
-                      , Just name
-                      , Just name
+                      , Just url
+                      , Just url
                       , visibility
                       )
-                    | (name, interfacePath, visibility) <- packageInfos
+                    | (url, interfacePath, visibility) <- packageInfos'
                     ]
               }
       createHaddockIndex
diff --git a/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.cabal.out b/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.cabal.out
index cb4f828829196a929993e1791a6caf5c16883284..0448dac63ffd87464f6a7cd54a9942302a750a7a 100644
--- a/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.cabal.out
+++ b/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.cabal.out
@@ -8,7 +8,7 @@ for mylib-0.1.0.0...
 Preprocessing library for mylib-0.1.0.0...
 Running Haddock on library instantiated with Database = <Database>
 for mylib-0.1.0.0...
-Documentation created: ../setup-external.cabal.dist/work/mylib/dist/doc/html/mylib/
+Documentation created: ../setup-external.cabal.dist/work/mylib/dist/doc/html/mylib
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -22,7 +22,7 @@ Building library for mysql-0.1.0.0...
 # Setup haddock
 Preprocessing library for mysql-0.1.0.0...
 Running Haddock on library for mysql-0.1.0.0...
-Documentation created: ../setup-external.cabal.dist/work/mysql/dist/doc/html/mysql/
+Documentation created: ../setup-external.cabal.dist/work/mysql/dist/doc/html/mysql
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -35,7 +35,7 @@ Building library for postgresql-0.1.0.0...
 # Setup haddock
 Preprocessing library for postgresql-0.1.0.0...
 Running Haddock on library for postgresql-0.1.0.0...
-Documentation created: ../setup-external.cabal.dist/work/postgresql/dist/doc/html/postgresql/
+Documentation created: ../setup-external.cabal.dist/work/postgresql/dist/doc/html/postgresql
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -51,7 +51,7 @@ Preprocessing library for mylib-0.1.0.0...
 Running Haddock on library instantiated with
   Database = mysql-0.1.0.0:Database.MySQL
 for mylib-0.1.0.0...
-Documentation created: ../setup-external.cabal.dist/work/mylib/dist/doc/html/mylib/
+Documentation created: ../setup-external.cabal.dist/work/mylib/dist/doc/html/mylib
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -69,7 +69,7 @@ Preprocessing library for mylib-0.1.0.0...
 Running Haddock on library instantiated with
   Database = postgresql-0.1.0.0:Database.PostgreSQL
 for mylib-0.1.0.0...
-Documentation created: ../setup-external.cabal.dist/work/mylib/dist/doc/html/mylib/
+Documentation created: ../setup-external.cabal.dist/work/mylib/dist/doc/html/mylib
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -84,7 +84,7 @@ Building library for src-0.1.0.0...
 # Setup haddock
 Preprocessing library for src-0.1.0.0...
 Running Haddock on library for src-0.1.0.0...
-Documentation created: ../setup-external.cabal.dist/work/src/dist/doc/html/src/
+Documentation created: ../setup-external.cabal.dist/work/src/dist/doc/html/src
 # Setup copy
 Installing library in <PATH>
 # Setup register
diff --git a/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.out b/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.out
index 299d6a831b333cec850bbb6a7dbb0d419db70570..19a089db14ffaf6959f9ce3a89b17551b5cb033a 100644
--- a/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.out
+++ b/cabal-testsuite/PackageTests/Backpack/Includes2/setup-external.out
@@ -8,7 +8,7 @@ for mylib-0.1.0.0...
 Preprocessing library for mylib-0.1.0.0...
 Running Haddock on library instantiated with Database = <Database>
 for mylib-0.1.0.0...
-Documentation created: ../setup-external.dist/work/mylib/dist/doc/html/mylib/
+Documentation created: ../setup-external.dist/work/mylib/dist/doc/html/mylib
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -22,7 +22,7 @@ Building library for mysql-0.1.0.0...
 # Setup haddock
 Preprocessing library for mysql-0.1.0.0...
 Running Haddock on library for mysql-0.1.0.0...
-Documentation created: ../setup-external.dist/work/mysql/dist/doc/html/mysql/
+Documentation created: ../setup-external.dist/work/mysql/dist/doc/html/mysql
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -35,7 +35,7 @@ Building library for postgresql-0.1.0.0...
 # Setup haddock
 Preprocessing library for postgresql-0.1.0.0...
 Running Haddock on library for postgresql-0.1.0.0...
-Documentation created: ../setup-external.dist/work/postgresql/dist/doc/html/postgresql/
+Documentation created: ../setup-external.dist/work/postgresql/dist/doc/html/postgresql
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -51,7 +51,7 @@ Preprocessing library for mylib-0.1.0.0...
 Running Haddock on library instantiated with
   Database = mysql-0.1.0.0:Database.MySQL
 for mylib-0.1.0.0...
-Documentation created: ../setup-external.dist/work/mylib/dist/doc/html/mylib/
+Documentation created: ../setup-external.dist/work/mylib/dist/doc/html/mylib
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -69,7 +69,7 @@ Preprocessing library for mylib-0.1.0.0...
 Running Haddock on library instantiated with
   Database = postgresql-0.1.0.0:Database.PostgreSQL
 for mylib-0.1.0.0...
-Documentation created: ../setup-external.dist/work/mylib/dist/doc/html/mylib/
+Documentation created: ../setup-external.dist/work/mylib/dist/doc/html/mylib
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -84,7 +84,7 @@ Building library for src-0.1.0.0...
 # Setup haddock
 Preprocessing library for src-0.1.0.0...
 Running Haddock on library for src-0.1.0.0...
-Documentation created: ../setup-external.dist/work/src/dist/doc/html/src/
+Documentation created: ../setup-external.dist/work/src/dist/doc/html/src
 # Setup copy
 Installing library in <PATH>
 # Setup register
diff --git a/cabal-testsuite/PackageTests/Backpack/Includes2/setup-per-component.out b/cabal-testsuite/PackageTests/Backpack/Includes2/setup-per-component.out
index 01888faed974444400b4c23347fbec61799ae125..36c406d858426c361b6ee7dc7747f9a6bced8515 100644
--- a/cabal-testsuite/PackageTests/Backpack/Includes2/setup-per-component.out
+++ b/cabal-testsuite/PackageTests/Backpack/Includes2/setup-per-component.out
@@ -8,7 +8,7 @@ for Includes2-0.1.0.0...
 Preprocessing library 'mylib' for Includes2-0.1.0.0...
 Running Haddock on library 'mylib' instantiated with Database = <Database>
 for Includes2-0.1.0.0...
-Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/
+Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/mylib
 # Setup copy
 Installing internal library mylib in <PATH>
 # Setup register
@@ -22,7 +22,7 @@ Building library 'mysql' for Includes2-0.1.0.0...
 # Setup haddock
 Preprocessing library 'mysql' for Includes2-0.1.0.0...
 Running Haddock on library 'mysql' for Includes2-0.1.0.0...
-Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/
+Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/mysql
 # Setup copy
 Installing internal library mysql in <PATH>
 # Setup register
@@ -35,7 +35,7 @@ Building library 'postgresql' for Includes2-0.1.0.0...
 # Setup haddock
 Preprocessing library 'postgresql' for Includes2-0.1.0.0...
 Running Haddock on library 'postgresql' for Includes2-0.1.0.0...
-Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/
+Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/postgresql
 # Setup copy
 Installing internal library postgresql in <PATH>
 # Setup register
@@ -54,7 +54,7 @@ Preprocessing library 'mylib' for Includes2-0.1.0.0...
 Running Haddock on library 'mylib' instantiated with
   Database = mysql-0.1.0.0:Database.MySQL
 for Includes2-0.1.0.0...
-Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/
+Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/mylib
 # Setup copy
 Installing internal library mylib in <PATH>
 # Setup register
@@ -75,7 +75,7 @@ Preprocessing library 'mylib' for Includes2-0.1.0.0...
 Running Haddock on library 'mylib' instantiated with
   Database = postgresql-0.1.0.0:Database.PostgreSQL
 for Includes2-0.1.0.0...
-Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/
+Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/mylib
 # Setup copy
 Installing internal library mylib in <PATH>
 # Setup register
@@ -90,7 +90,7 @@ Building library for Includes2-0.1.0.0...
 # Setup haddock
 Preprocessing library for Includes2-0.1.0.0...
 Running Haddock on library for Includes2-0.1.0.0...
-Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2/
+Documentation created: ../setup-per-component.dist/work/Includes2/dist/doc/html/Includes2
 # Setup copy
 Installing library in <PATH>
 # Setup register
diff --git a/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-explicit.out b/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-explicit.out
index b27b2d8eb1ae311d22406da0dad16ff1c9e90dca..72bf091632d4c7bb106f362ca9ac372af06bca23 100644
--- a/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-explicit.out
+++ b/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-explicit.out
@@ -8,7 +8,7 @@ for sigs-0.1.0.0...
 Preprocessing library for sigs-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for sigs-0.1.0.0...
-Documentation created: ../../setup-external-explicit.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs/
+Documentation created: ../../setup-external-explicit.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -24,7 +24,7 @@ for indef-0.1.0.0...
 Preprocessing library for indef-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for indef-0.1.0.0...
-Documentation created: ../../setup-external-explicit.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef/
+Documentation created: ../../setup-external-explicit.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef
 # Setup copy
 Installing library in <PATH>
 # Setup register
diff --git a/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.cabal.out b/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.cabal.out
index 6d0abf817af5d5a1fa9d63800c62b366462b2c35..34e7a1204b5d5e1770fbc9537e5677986d8a3dd5 100644
--- a/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.cabal.out
+++ b/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.cabal.out
@@ -8,7 +8,7 @@ for sigs-0.1.0.0...
 Preprocessing library for sigs-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for sigs-0.1.0.0...
-Documentation created: ../../setup-external-ok.cabal.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs/
+Documentation created: ../../setup-external-ok.cabal.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -24,7 +24,7 @@ for indef-0.1.0.0...
 Preprocessing library for indef-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for indef-0.1.0.0...
-Documentation created: ../../setup-external-ok.cabal.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef/
+Documentation created: ../../setup-external-ok.cabal.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -41,7 +41,7 @@ Preprocessing library for sigs-0.1.0.0...
 Running Haddock on library instantiated with
   Data.Map = containers-<VERSION>:Data.Map
 for sigs-0.1.0.0...
-Documentation created: ../../setup-external-ok.cabal.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs/
+Documentation created: ../../setup-external-ok.cabal.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -58,7 +58,7 @@ Preprocessing library for indef-0.1.0.0...
 Running Haddock on library instantiated with
   Data.Map = containers-<VERSION>:Data.Map
 for indef-0.1.0.0...
-Documentation created: ../../setup-external-ok.cabal.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef/
+Documentation created: ../../setup-external-ok.cabal.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef
 # Setup copy
 Installing library in <PATH>
 # Setup register
diff --git a/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.out b/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.out
index 8fc173d40f02d35c716d2cac9ac086d724955b2e..630edbba1a234c6270ff85b37eb8cc51f392f869 100644
--- a/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.out
+++ b/cabal-testsuite/PackageTests/Backpack/Includes3/setup-external-ok.out
@@ -8,7 +8,7 @@ for sigs-0.1.0.0...
 Preprocessing library for sigs-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for sigs-0.1.0.0...
-Documentation created: ../../setup-external-ok.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs/
+Documentation created: ../../setup-external-ok.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -24,7 +24,7 @@ for indef-0.1.0.0...
 Preprocessing library for indef-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for indef-0.1.0.0...
-Documentation created: ../../setup-external-ok.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef/
+Documentation created: ../../setup-external-ok.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -41,7 +41,7 @@ Preprocessing library for sigs-0.1.0.0...
 Running Haddock on library instantiated with
   Data.Map = containers-<VERSION>:Data.Map
 for sigs-0.1.0.0...
-Documentation created: ../../setup-external-ok.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs/
+Documentation created: ../../setup-external-ok.dist/work/repo/sigs-0.1.0.0/dist/doc/html/sigs
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -58,7 +58,7 @@ Preprocessing library for indef-0.1.0.0...
 Running Haddock on library instantiated with
   Data.Map = containers-<VERSION>:Data.Map
 for indef-0.1.0.0...
-Documentation created: ../../setup-external-ok.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef/
+Documentation created: ../../setup-external-ok.dist/work/repo/indef-0.1.0.0/dist/doc/html/indef
 # Setup copy
 Installing library in <PATH>
 # Setup register
diff --git a/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.cabal.out b/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.cabal.out
index 1c8de306e5d638c9e3c275dad285c1ee5bd7c95c..6cdb57602364ebb8883a2f47241dcf1b6471a623 100644
--- a/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.cabal.out
+++ b/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.cabal.out
@@ -6,7 +6,7 @@ Building library for p-0.1.0.0...
 # Setup haddock
 Preprocessing library for p-0.1.0.0...
 Running Haddock on library for p-0.1.0.0...
-Documentation created: ../setup.cabal.dist/work/p/dist/doc/html/p/
+Documentation created: ../setup.cabal.dist/work/p/dist/doc/html/p
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -19,4 +19,4 @@ Building library for q-0.1.0.0...
 # Setup haddock
 Preprocessing library for q-0.1.0.0...
 Running Haddock on library for q-0.1.0.0...
-Documentation created: ../setup.cabal.dist/work/q/dist/doc/html/q/
+Documentation created: ../setup.cabal.dist/work/q/dist/doc/html/q
diff --git a/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.out b/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.out
index ee41d01148bf4cb59ef2e3fbbe9ed19cfc7daf7a..ba66136d02a2021398804564467c79070a45aa21 100644
--- a/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.out
+++ b/cabal-testsuite/PackageTests/Backpack/Reexport1/setup.out
@@ -6,7 +6,7 @@ Building library for p-0.1.0.0...
 # Setup haddock
 Preprocessing library for p-0.1.0.0...
 Running Haddock on library for p-0.1.0.0...
-Documentation created: ../setup.dist/work/p/dist/doc/html/p/
+Documentation created: ../setup.dist/work/p/dist/doc/html/p
 # Setup copy
 Installing library in <PATH>
 # Setup register
@@ -19,4 +19,4 @@ Building library for q-0.1.0.0...
 # Setup haddock
 Preprocessing library for q-0.1.0.0...
 Running Haddock on library for q-0.1.0.0...
-Documentation created: ../setup.dist/work/q/dist/doc/html/q/
+Documentation created: ../setup.dist/work/q/dist/doc/html/q
diff --git a/cabal-testsuite/PackageTests/Haddock/setup.cabal.out b/cabal-testsuite/PackageTests/Haddock/setup.cabal.out
index a13ae638ac4e7121fc4ae88e4366713e8d45071b..a55ef1a732ad9d1b68cc05dcdaf2176b663e68bb 100644
--- a/cabal-testsuite/PackageTests/Haddock/setup.cabal.out
+++ b/cabal-testsuite/PackageTests/Haddock/setup.cabal.out
@@ -3,4 +3,4 @@ Configuring Haddock-0.1...
 # Setup haddock
 Preprocessing library for Haddock-0.1...
 Running Haddock on library for Haddock-0.1...
-Documentation created: setup.cabal.dist/work/dist/doc/html/Haddock/
+Documentation created: setup.cabal.dist/work/dist/doc/html/Haddock
diff --git a/cabal-testsuite/PackageTests/Haddock/setup.out b/cabal-testsuite/PackageTests/Haddock/setup.out
index a16722bc65c0da8c2862d173072a81d627969ee0..550d84c45aeca4284b796b5139b8859f60217c21 100644
--- a/cabal-testsuite/PackageTests/Haddock/setup.out
+++ b/cabal-testsuite/PackageTests/Haddock/setup.out
@@ -3,4 +3,4 @@ Configuring Haddock-0.1...
 # Setup haddock
 Preprocessing library for Haddock-0.1...
 Running Haddock on library for Haddock-0.1...
-Documentation created: setup.dist/work/dist/doc/html/Haddock/
+Documentation created: setup.dist/work/dist/doc/html/Haddock
diff --git a/cabal-testsuite/PackageTests/HaddockArgs/quickjump.out b/cabal-testsuite/PackageTests/HaddockArgs/quickjump.out
index f81b0b948529bd59519dcd82e6f0b2414a0450ce..c892ec8e80a1cd2a61fb2bce3b12de8a4739716a 100644
--- a/cabal-testsuite/PackageTests/HaddockArgs/quickjump.out
+++ b/cabal-testsuite/PackageTests/HaddockArgs/quickjump.out
@@ -14,7 +14,7 @@ for sigs-0.1.0.0...
 Preprocessing library for sigs-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for sigs-0.1.0.0...
-Documentation created: <ROOT>/quickjump.dist/work/./dist/<TMPDIR>/sigs-0.1.0.0/dist/doc/html/sigs/
+Documentation created: <ROOT>/quickjump.dist/work/./dist/<TMPDIR>/sigs-0.1.0.0/dist/doc/html/sigs
 Installing library in <PATH>
 Configuring library for indef-0.1.0.0...
 Preprocessing library for indef-0.1.0.0...
@@ -23,7 +23,7 @@ for indef-0.1.0.0...
 Preprocessing library for indef-0.1.0.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for indef-0.1.0.0...
-Documentation created: <ROOT>/quickjump.dist/work/./dist/<TMPDIR>/indef-0.1.0.0/dist/doc/html/indef/
+Documentation created: <ROOT>/quickjump.dist/work/./dist/<TMPDIR>/indef-0.1.0.0/dist/doc/html/indef
 Installing library in <PATH>
 Configuring library for example-1.0...
 Preprocessing library for example-1.0...
@@ -32,4 +32,4 @@ for example-1.0...
 Preprocessing library for example-1.0...
 Running Haddock on library instantiated with Data.Map = <Data.Map>
 for example-1.0...
-Documentation created: <ROOT>/quickjump.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/example-1.0/doc/html/example/
+Documentation created: <ROOT>/quickjump.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/example-1.0/doc/html/example
diff --git a/cabal-testsuite/PackageTests/HaddockBuildDepends/cabal.out b/cabal-testsuite/PackageTests/HaddockBuildDepends/cabal.out
index 64f999e4368d1b9d7f58e77f5cdbcf9999db473f..8eff18e3d6c35afc42ec31096ce1e2c0968a2a0b 100644
--- a/cabal-testsuite/PackageTests/HaddockBuildDepends/cabal.out
+++ b/cabal-testsuite/PackageTests/HaddockBuildDepends/cabal.out
@@ -17,11 +17,11 @@ Preprocessing library for lib-1...
 Building library for lib-1...
 Preprocessing library for lib-1...
 Running Haddock on library for lib-1...
-Documentation created: <ROOT>/cabal.dist/work/./dist/<TMPDIR>/lib-1/dist/doc/html/lib/
+Documentation created: <ROOT>/cabal.dist/work/./dist/<TMPDIR>/lib-1/dist/doc/html/lib
 Installing library in <PATH>
 Configuring library for a-0.1.0.0...
 Preprocessing library for a-0.1.0.0...
 Building library for a-0.1.0.0...
 Preprocessing library for a-0.1.0.0...
 Running Haddock on library for a-0.1.0.0...
-Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/a-0.1.0.0/doc/html/a/
+Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/a-0.1.0.0/doc/html/a
diff --git a/cabal-testsuite/PackageTests/HaddockNewline/setup.cabal.out b/cabal-testsuite/PackageTests/HaddockNewline/setup.cabal.out
index 7db9a69eefee640104ebc11828bf60cb144681f5..57539271f24f08143a9ec3226bf1e6c2bf7a73fe 100644
--- a/cabal-testsuite/PackageTests/HaddockNewline/setup.cabal.out
+++ b/cabal-testsuite/PackageTests/HaddockNewline/setup.cabal.out
@@ -3,4 +3,4 @@ Configuring HaddockNewline-0.1.0.0...
 # Setup haddock
 Preprocessing library for HaddockNewline-0.1.0.0...
 Running Haddock on library for HaddockNewline-0.1.0.0...
-Documentation created: setup.cabal.dist/work/dist/doc/html/HaddockNewline/
+Documentation created: setup.cabal.dist/work/dist/doc/html/HaddockNewline
diff --git a/cabal-testsuite/PackageTests/HaddockNewline/setup.out b/cabal-testsuite/PackageTests/HaddockNewline/setup.out
index 579085125568b725851a1cdd672378327887dcbb..f18bb263e040c6400b5221cc73731f053b91aacb 100644
--- a/cabal-testsuite/PackageTests/HaddockNewline/setup.out
+++ b/cabal-testsuite/PackageTests/HaddockNewline/setup.out
@@ -3,4 +3,4 @@ Configuring HaddockNewline-0.1.0.0...
 # Setup haddock
 Preprocessing library for HaddockNewline-0.1.0.0...
 Running Haddock on library for HaddockNewline-0.1.0.0...
-Documentation created: setup.dist/work/dist/doc/html/HaddockNewline/
+Documentation created: setup.dist/work/dist/doc/html/HaddockNewline
diff --git a/cabal-testsuite/PackageTests/HaddockProject/haddock-project.out b/cabal-testsuite/PackageTests/HaddockProject/haddock-project.out
index 50ede874c75dacde37e2483bca7afec8b243a693..bfa16bf91c54ba8d3ac3e3a628d083728c998ef4 100644
--- a/cabal-testsuite/PackageTests/HaddockProject/haddock-project.out
+++ b/cabal-testsuite/PackageTests/HaddockProject/haddock-project.out
@@ -4,10 +4,6 @@ Downloading the latest package list from test-local-repo
 Warning: haddock-project command is experimental, it might break in the future
 Resolving dependencies...
 Build profile: -w ghc-<GHCVER> -O1
-In order, the following will be built:
- - async-2.2.4 (lib) (requires build)
- - a-0.1.0.0 (lib) (first run)
-Build profile: -w ghc-<GHCVER> -O1
 In order, the following will be built:
  - async-2.2.4 (lib) (requires build)
  - a-0.1.0.0 (lib) (configuration changed)
@@ -16,10 +12,10 @@ Preprocessing library for async-2.2.4...
 Building library for async-2.2.4...
 Preprocessing library for async-2.2.4...
 Running Haddock on library for async-2.2.4...
-Documentation created: <ROOT>/dist-newstyle/<TMPDIR>/async-2.2.4/dist/doc/html/async/
+Documentation created: <ROOT>/dist-newstyle/<TMPDIR>/async-2.2.4/dist/doc/html/async
 Installing library in <PATH>
 Configuring library for a-0.1.0.0...
 Preprocessing library for a-0.1.0.0...
 Running Haddock on library for a-0.1.0.0...
-Documentation created: <ROOT>/dist-newstyle/build/<ARCH>/ghc-<GHCVER>/a-0.1.0.0/doc/html/a/
+Documentation created: <ROOT>/dist-newstyle/build/<ARCH>/ghc-<GHCVER>/a-0.1.0.0/doc/html/a
 Documentation created: haddocks/index.html
diff --git a/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.cabal.out b/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.cabal.out
index bdc57a81bfdd8d26416b6b8565392bb85ab2b153..dbd8c26e948b62333cf7f3d37ad5d1704acfb85e 100644
--- a/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.cabal.out
+++ b/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.cabal.out
@@ -18,10 +18,10 @@ Registering library 'foo-internal-after' for foo-0.1.0.0...
 # Setup haddock
 Preprocessing library 'foo-internal-before' for foo-0.1.0.0...
 Running Haddock on library 'foo-internal-before' for foo-0.1.0.0...
-Documentation created: haddock.cabal.dist/work/dist/doc/html/foo/
+Documentation created: haddock.cabal.dist/work/dist/doc/html/foo/foo-internal-before
 Preprocessing library for foo-0.1.0.0...
 Running Haddock on library for foo-0.1.0.0...
-Documentation created: haddock.cabal.dist/work/dist/doc/html/foo/
+Documentation created: haddock.cabal.dist/work/dist/doc/html/foo
 Preprocessing library 'foo-internal-after' for foo-0.1.0.0...
 Running Haddock on library 'foo-internal-after' for foo-0.1.0.0...
-Documentation created: haddock.cabal.dist/work/dist/doc/html/foo/
+Documentation created: haddock.cabal.dist/work/dist/doc/html/foo/foo-internal-after
diff --git a/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.out b/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.out
index 44ee78242448acc9f3cd3c64f3944eb94d66b28a..6259fcfeb0cdfd8deef1c0b9ab31461518b418f8 100644
--- a/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.out
+++ b/cabal-testsuite/PackageTests/InternalLibraries/Haddock/haddock.out
@@ -18,10 +18,10 @@ Registering library 'foo-internal-after' for foo-0.1.0.0...
 # Setup haddock
 Preprocessing library 'foo-internal-before' for foo-0.1.0.0...
 Running Haddock on library 'foo-internal-before' for foo-0.1.0.0...
-Documentation created: haddock.dist/work/dist/doc/html/foo/
+Documentation created: haddock.dist/work/dist/doc/html/foo/foo-internal-before
 Preprocessing library for foo-0.1.0.0...
 Running Haddock on library for foo-0.1.0.0...
-Documentation created: haddock.dist/work/dist/doc/html/foo/
+Documentation created: haddock.dist/work/dist/doc/html/foo
 Preprocessing library 'foo-internal-after' for foo-0.1.0.0...
 Running Haddock on library 'foo-internal-after' for foo-0.1.0.0...
-Documentation created: haddock.dist/work/dist/doc/html/foo/
+Documentation created: haddock.dist/work/dist/doc/html/foo/foo-internal-after
diff --git a/cabal-testsuite/PackageTests/NewHaddock/DisableDoc/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/DisableDoc/cabal.out
index ac34ca8e161f56c84d9bae2be2c75a58c08cf0cd..0683a3921ce7e84a86419189c40cb5ef5a517596 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/DisableDoc/cabal.out
+++ b/cabal-testsuite/PackageTests/NewHaddock/DisableDoc/cabal.out
@@ -13,4 +13,4 @@ Installing library in <PATH>
 Configuring library for B-0.1.0.0...
 Preprocessing library for B-0.1.0.0...
 Running Haddock on library for B-0.1.0.0...
-Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/B-0.1.0.0/doc/html/B/
+Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/B-0.1.0.0/doc/html/B
diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockForHackageCmdOutput/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockForHackageCmdOutput/cabal.out
index e17593a966c06733df7cad3e2a754ddb42aa3574..5a0ba91417401db0233bc7eb493b428876a5831a 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockForHackageCmdOutput/cabal.out
+++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockForHackageCmdOutput/cabal.out
@@ -6,5 +6,5 @@ In order, the following will be built:
 Configuring library for A-0.0.0...
 Preprocessing library for A-0.0.0...
 Running Haddock on library for A-0.0.0...
-Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/A-0.0.0/doc/html/A-0.0.0-docs/, <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/A-0.0.0/doc/html/A-0.0.0-docs/A.txt
+Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/A-0.0.0/doc/html/A-0.0.0-docs, <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/A-0.0.0/doc/html/A-0.0.0-docs/A.txt
 Documentation tarball created: <ROOT>/cabal.dist/work/./dist/A-0.0.0-docs.tar.gz
diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.out
index 38e563846788691bbdddc3f5aa877f29dfabcafd..38614b49b84a242936dca49b2ab61e5f43f4ebbc 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.out
+++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.out
@@ -8,4 +8,4 @@ In order, the following will be built:
 Configuring library for A-0.0.0...
 Preprocessing library for A-0.0.0...
 Running Haddock on library for A-0.0.0...
-Documentation created: <ROOT>/docs/
+Documentation created: <ROOT>/docs/A
diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.test.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.test.hs
index 1bfe939dab9132f54e2adaae44754aab0546bd1c..de59c2f90ee095306a8548e4836db8a8a0e79e22 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputCmd/cabal.test.hs
@@ -8,4 +8,4 @@ main = cabalTest . withRepo "repo" $ do
   let docsDir = testDir </> "docs"
   liftIO (removePathForcibly docsDir)
   r <- cabal' "haddock" ["--haddock-output-dir=docs", "A"]
-  assertFindInFile "A minimal test package for testing haddock." (docsDir </> "index.html")
+  assertFindInFile "A minimal test package for testing haddock." (docsDir </> "A" </> "index.html")
diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.out
index 38e563846788691bbdddc3f5aa877f29dfabcafd..38614b49b84a242936dca49b2ab61e5f43f4ebbc 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.out
+++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.out
@@ -8,4 +8,4 @@ In order, the following will be built:
 Configuring library for A-0.0.0...
 Preprocessing library for A-0.0.0...
 Running Haddock on library for A-0.0.0...
-Documentation created: <ROOT>/docs/
+Documentation created: <ROOT>/docs/A
diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.test.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.test.hs
index ba3a957ef6039fe390aa7b277c79ae787ebf99a1..db5b6d493a20b37e57fea85408b9566740a2af4c 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOutput/HaddockOutputConfig/cabal.test.hs
@@ -8,4 +8,4 @@ main = cabalTest . withRepo "repo" $ do
   let docsDir = testDir </> "docs"
   liftIO (removePathForcibly docsDir)
   r <- cabal' "haddock" ["A"]
-  assertFindInFile "A minimal test package for testing haddock." (docsDir </> "index.html")
+  assertFindInFile "A minimal test package for testing haddock." (docsDir </> "A" </> "index.html")
diff --git a/cabal-testsuite/PackageTests/NewHaddock/ImplyDependencies/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/ImplyDependencies/cabal.out
index 07fc04a111912d81b890602d198df4d1bd79bd19..32f39065358832299a5094d6a24f309395714f70 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/ImplyDependencies/cabal.out
+++ b/cabal-testsuite/PackageTests/NewHaddock/ImplyDependencies/cabal.out
@@ -11,9 +11,9 @@ Preprocessing library for A-0.1.0.0...
 Building library for A-0.1.0.0...
 Preprocessing library for A-0.1.0.0...
 Running Haddock on library for A-0.1.0.0...
-Documentation created: <ROOT>/cabal.dist/work/./dist/<TMPDIR>/A-0.1.0.0/dist/doc/html/A/
+Documentation created: <ROOT>/cabal.dist/work/./dist/<TMPDIR>/A-0.1.0.0/dist/doc/html/A
 Installing library in <PATH>
 Configuring library for B-0.1.0.0...
 Preprocessing library for B-0.1.0.0...
 Running Haddock on library for B-0.1.0.0...
-Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/B-0.1.0.0/doc/html/B/
+Documentation created: <ROOT>/cabal.dist/work/dist/build/<ARCH>/ghc-<GHCVER>/B-0.1.0.0/doc/html/B