diff --git a/Cabal/src/Distribution/Simple/BuildPaths.hs b/Cabal/src/Distribution/Simple/BuildPaths.hs
index 05a9c6c190fee18f28b12786e19a95bea619c2b2..0875de87c91331d4d1b6eb60d1a367b861365372 100644
--- a/Cabal/src/Distribution/Simple/BuildPaths.hs
+++ b/Cabal/src/Distribution/Simple/BuildPaths.hs
@@ -19,6 +19,9 @@ module Distribution.Simple.BuildPaths
   , srcPref
   , buildInfoPref
   , haddockDirName
+  , haddockLibraryDirPath
+  , haddockTestDirPath
+  , haddockBenchmarkDirPath
   , hscolourPref
   , haddockPref
   , autogenPackageModulesDir
@@ -26,7 +29,11 @@ module Distribution.Simple.BuildPaths
   , autogenPathsModuleName
   , autogenPackageInfoModuleName
   , cppHeaderName
-  , haddockName
+  , haddockPath
+  , haddockPackageLibraryName
+  , haddockPackageLibraryName'
+  , haddockLibraryName
+  , haddockLibraryPath
   , mkGenericStaticLibName
   , mkLibName
   , mkProfLibName
@@ -44,6 +51,8 @@ module Distribution.Simple.BuildPaths
   , getSourceFiles
   , getLibSourceFiles
   , getExeSourceFiles
+  , getTestSourceFiles
+  , getBenchmarkSourceFiles
   , getFLibSourceFiles
   , exeBuildDir
   , flibBuildDir
@@ -92,10 +101,44 @@ 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
+
+haddockTestDirPath
+  :: HaddockTarget
+  -> PackageDescription
+  -> TestSuite
+  -> FilePath
+haddockTestDirPath haddockTarget pkg_descr test =
+  haddockDirName haddockTarget pkg_descr </> prettyShow (testName test)
+
+haddockBenchmarkDirPath
+  :: HaddockTarget
+  -> PackageDescription
+  -> Benchmark
+  -> FilePath
+haddockBenchmarkDirPath haddockTarget pkg_descr bench =
+  haddockDirName haddockTarget pkg_descr </> prettyShow (benchmarkName bench)
+
 -- | The directory to which generated haddock documentation should be written.
 haddockPref
   :: HaddockTarget
@@ -139,8 +182,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
@@ -184,6 +254,48 @@ getExeSourceFiles verbosity lbi exe clbi = do
         : coerceSymbolicPath (exeBuildDir lbi exe)
         : hsSourceDirs bi
 
+getTestSourceFiles
+  :: Verbosity
+  -> LocalBuildInfo
+  -> TestSuite
+  -> ComponentLocalBuildInfo
+  -> IO [(ModuleName.ModuleName, SymbolicPath Pkg 'File)]
+getTestSourceFiles verbosity lbi test@TestSuite{testInterface = TestSuiteExeV10 _ path} clbi = do
+  moduleFiles <- getSourceFiles verbosity mbWorkDir searchpaths modules
+  srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs bi) path
+  return ((ModuleName.main, srcMainPath) : moduleFiles)
+  where
+    mbWorkDir = mbWorkDirLBI lbi
+    bi = testBuildInfo test
+    modules = otherModules bi
+    searchpaths =
+      autogenComponentModulesDir lbi clbi
+        : autogenPackageModulesDir lbi
+        : coerceSymbolicPath (testBuildDir lbi test)
+        : hsSourceDirs bi
+getTestSourceFiles _ _ _ _ = return []
+
+getBenchmarkSourceFiles
+  :: Verbosity
+  -> LocalBuildInfo
+  -> Benchmark
+  -> ComponentLocalBuildInfo
+  -> IO [(ModuleName.ModuleName, SymbolicPath Pkg 'File)]
+getBenchmarkSourceFiles verbosity lbi bench@Benchmark{benchmarkInterface = BenchmarkExeV10 _ path} clbi = do
+  moduleFiles <- getSourceFiles verbosity mbWorkDir searchpaths modules
+  srcMainPath <- findFileCwd verbosity mbWorkDir (hsSourceDirs bi) path
+  return ((ModuleName.main, srcMainPath) : moduleFiles)
+  where
+    mbWorkDir = mbWorkDirLBI lbi
+    bi = benchmarkBuildInfo bench
+    modules = otherModules bi
+    searchpaths =
+      autogenComponentModulesDir lbi clbi
+        : autogenPackageModulesDir lbi
+        : coerceSymbolicPath (benchmarkBuildDir lbi bench)
+        : hsSourceDirs bi
+getBenchmarkSourceFiles _ _ _ _ = return []
+
 getFLibSourceFiles
   :: Verbosity
   -> LocalBuildInfo
diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs
index 657991e16b1cf86270faa552c71bceffab2c10d3..ba025a8554939a031cebb261ed8220ff7d03e72e 100644
--- a/Cabal/src/Distribution/Simple/Haddock.hs
+++ b/Cabal/src/Distribution/Simple/Haddock.hs
@@ -92,6 +92,7 @@ import Distribution.Verbosity
 import Distribution.Version
 
 import Control.Monad
+import Data.Bool (bool)
 import Data.Either (rights)
 import System.Directory (doesDirectoryExist, doesFileExist)
 import System.FilePath (isAbsolute, normalise)
@@ -107,6 +108,9 @@ data HaddockArgs = HaddockArgs
   -- ^ Path to the interface file, relative to argOutputDir, required.
   , argPackageName :: Flag PackageIdentifier
   -- ^ Package name, required.
+  , argComponentName :: Flag String
+  -- ^ Optional name used to construct haddock's `--package-name` option for
+  -- various components (tests suites, sublibriaries, etc).
   , argHideModules :: (All, [ModuleName.ModuleName])
   -- ^ (Hide modules ?, modules to hide)
   , argIgnoreExports :: Any
@@ -152,6 +156,8 @@ data HaddockArgs = HaddockArgs
   -- ^ Modules to process.
   , argResourcesDir :: Flag String
   -- ^ haddock's static \/ auxiliary files.
+  , argUseUnicode :: Flag Bool
+  -- ^ haddock's `--use-unicode` flag
   }
   deriving (Generic)
 
@@ -369,8 +375,10 @@ haddock_setupHooks
                   lbi'
                   clbi
                   htmlTemplate
+                  haddockTarget
+                  pkg_descr
                   exe
-              let exeArgs' = commonArgs `mappend` exeArgs
+                  commonArgs
               runHaddock
                 verbosity
                 mbWorkDir
@@ -379,7 +387,7 @@ haddock_setupHooks
                 platform
                 haddockProg
                 True
-                exeArgs'
+                exeArgs
             Nothing -> do
               warn
                 verbosity
@@ -406,9 +414,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,21 +468,78 @@ 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
-          CTest _ -> when (flag haddockTestSuites) (smsg >> doExe component) >> return index
-          CBench _ -> when (flag haddockBenchmarks) (smsg >> doExe component) >> return index
+          CTest test -> do
+            when (flag haddockTestSuites) $ do
+              smsg
+              testArgs <-
+                fromTest
+                  verbosity
+                  haddockArtifactsDirs
+                  lbi'
+                  clbi
+                  htmlTemplate
+                  haddockTarget
+                  pkg_descr
+                  test
+                  commonArgs
+              runHaddock
+                verbosity
+                mbWorkDir
+                tmpFileOpts
+                comp
+                platform
+                haddockProg
+                True
+                testArgs
+            return index
+          CBench bench -> do
+            when (flag haddockBenchmarks) $ do
+              smsg
+              benchArgs <-
+                fromBenchmark
+                  verbosity
+                  haddockArtifactsDirs
+                  lbi'
+                  clbi
+                  htmlTemplate
+                  haddockTarget
+                  pkg_descr
+                  bench
+                  commonArgs
+              runHaddock
+                verbosity
+                mbWorkDir
+                tmpFileOpts
+                comp
+                platform
+                haddockProg
+                True
+                benchArgs
+            return index
 
         return ipi
 
     for_ (extraDocFiles pkg_descr) $ \fpath -> do
       files <- matchDirFileGlob verbosity (specVersion pkg_descr) mbWorkDir fpath
+      let targetDir = Dir $ unDir' (argOutputDir commonArgs) </> haddockDirName haddockTarget pkg_descr
       for_ files $
-        copyFileToCwd verbosity mbWorkDir (unDir $ argOutputDir commonArgs)
+        copyFileToCwd verbosity mbWorkDir (unDir targetDir)
 
 -- | Execute 'Haddock' configured with 'HaddocksFlags'.  It is used to build
 -- index and contents for documentation of multiple packages.
@@ -528,6 +603,7 @@ fromFlags env flags =
           os -> os
     , argOutputDir = maybe mempty (Dir . getSymbolicPath) . flagToMaybe $ setupDistPref commonFlags
     , argGhcOptions = mempty{ghcOptExtra = ghcArgs}
+    , argUseUnicode = haddockUseUnicode flags
     }
   where
     ghcArgs = fromMaybe [] . lookup "ghc" . haddockProgramArgs $ flags
@@ -547,13 +623,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 +748,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 +765,30 @@ 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
+          , argComponentName = toFlag (haddockPackageLibraryName' (pkgName (package pkg_descr)) (libName 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 +799,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 +816,127 @@ 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
+      }
+
+fromTest
+  :: Verbosity
+  -> (SymbolicPath Pkg (Path.Dir Artifacts), SymbolicPath Pkg (Path.Dir Artifacts), SymbolicPath Pkg (Path.Dir Artifacts))
+  -- ^ Directories for -hidir, -odir, and -stubdir to GHC through Haddock.
+  -- See Note [Hi Haddock Recompilation Avoidance]
+  -> LocalBuildInfo
+  -> ComponentLocalBuildInfo
+  -> Maybe PathTemplate
+  -- ^ template for HTML location
+  -> HaddockTarget
+  -> PackageDescription
+  -> TestSuite
+  -> HaddockArgs
+  -- ^ common args
+  -> IO HaddockArgs
+fromTest verbosity haddockArtifactsDirs lbi clbi htmlTemplate haddockTarget pkg_descr test commonArgs = do
+  inFiles <- map snd `fmap` getTestSourceFiles verbosity lbi test clbi
+  args <-
+    mkHaddockArgs
+      verbosity
+      haddockArtifactsDirs
+      lbi
+      clbi
+      htmlTemplate
+      inFiles
+      (testBuildInfo test)
+  let args' =
+        commonArgs
+          <> args
+            { argOutputDir =
+                Dir $
+                  haddockDirName haddockTarget pkg_descr
+                    </> unUnqualComponentName (testName test)
+            }
+  return
+    args'
+      { argTitle = Flag $ prettyShow (packageName pkg_descr)
+      , argComponentName = Flag $ prettyShow (packageName pkg_descr) ++ ":" ++ unUnqualComponentName (testName test)
+      , -- 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
+      }
+
+fromBenchmark
+  :: Verbosity
+  -> (SymbolicPath Pkg (Path.Dir Artifacts), SymbolicPath Pkg (Path.Dir Artifacts), SymbolicPath Pkg (Path.Dir Artifacts))
+  -- ^ Directories for -hidir, -odir, and -stubdir to GHC through Haddock.
+  -- See Note [Hi Haddock Recompilation Avoidance]
+  -> LocalBuildInfo
+  -> ComponentLocalBuildInfo
+  -> Maybe PathTemplate
+  -- ^ template for HTML location
+  -> HaddockTarget
+  -> PackageDescription
+  -> Benchmark
+  -> HaddockArgs
+  -- ^ common args
+  -> IO HaddockArgs
+fromBenchmark verbosity haddockArtifactsDirs lbi clbi htmlTemplate haddockTarget pkg_descr bench commonArgs = do
+  inFiles <- map snd `fmap` getBenchmarkSourceFiles verbosity lbi bench clbi
+  args <-
+    mkHaddockArgs
+      verbosity
+      haddockArtifactsDirs
+      lbi
+      clbi
+      htmlTemplate
+      inFiles
+      (benchmarkBuildInfo bench)
+  let args' =
+        commonArgs
+          <> args
+            { argOutputDir =
+                Dir $
+                  haddockDirName haddockTarget pkg_descr
+                    </> unUnqualComponentName (benchmarkName bench)
+            }
+  return
+    args'
+      { argTitle = Flag $ prettyShow (packageName pkg_descr)
+      , argComponentName = Flag $ prettyShow (packageName pkg_descr) ++ ":" ++ unUnqualComponentName (benchmarkName bench)
+      , -- 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 +948,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 +965,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
@@ -900,20 +1140,18 @@ renderArgs verbosity mbWorkDir tmpFileOpts version comp platform args k = do
                   renderedArgs
                   (\responseFileName -> k ["@" ++ responseFileName] result)
               else k renderedArgs result
-  case argPrologue args of
-    Flag prologueText ->
+  case (argPrologueFile args, argPrologue args) of
+    (Flag pfile, _) ->
+      withPrologueArgs ["--prologue=" ++ pfile]
+    (_, Flag prologueText) ->
       withTempFileEx tmpFileOpts mbWorkDir outputDir "haddock-prologue.txt" $
         \prologueFileName h -> do
           when haddockSupportsUTF8 (hSetEncoding h utf8)
           hPutStrLn h prologueText
           hClose h
           withPrologueArgs ["--prologue=" ++ u prologueFileName]
-    _ ->
-      withPrologueArgs
-        ( case argPrologueFile args of
-            Flag pfile -> ["--prologue=" ++ pfile]
-            _ -> []
-        )
+    (NoFlag, NoFlag) ->
+      withPrologueArgs []
   where
     -- See Note [Symbolic paths] in Distribution.Utils.Path
     i = interpretSymbolicPath mbWorkDir
@@ -962,7 +1200,10 @@ renderPureArgs version comp platform args =
           maybe
             []
             ( \pkg ->
-                [ "--package-name=" ++ prettyShow (pkgName pkg)
+                [ "--package-name="
+                    ++ case argComponentName args of
+                      Flag name -> name
+                      _ -> prettyShow (pkgName pkg)
                 , "--package-version=" ++ prettyShow (pkgVersion pkg)
                 ]
             )
@@ -974,10 +1215,10 @@ renderPureArgs version comp platform args =
     , [ "--quickjump" | isVersion 2 19, True <- flagToList . argQuickJump $ args
       ]
     , ["--hyperlinked-source" | isHyperlinkedSource]
-    , (\(All b, xs) -> bool (map (("--hide=" ++) . prettyShow) xs) [] b)
+    , (\(All b, xs) -> bool [] (map (("--hide=" ++) . prettyShow) xs) b)
         . argHideModules
         $ args
-    , bool ["--ignore-all-exports"] [] . getAny . argIgnoreExports $ args
+    , bool [] ["--ignore-all-exports"] . getAny . argIgnoreExports $ args
     , -- Haddock's --source-* options are ignored once --hyperlinked-source is
       -- set.
       -- See https://haskell-haddock.readthedocs.io/en/latest/invoking.html#cmdoption-hyperlinked-source
@@ -1001,11 +1242,11 @@ renderPureArgs version comp platform args =
             $ args
     , maybe [] ((: []) . ("--css=" ++)) . flagToMaybe . argCssFile $ args
     , maybe [] ((: []) . ("--use-contents=" ++)) . flagToMaybe . argContents $ args
-    , bool ["--gen-contents"] [] . fromFlagOrDefault False . argGenContents $ args
+    , bool [] ["--gen-contents"] . fromFlagOrDefault False . argGenContents $ args
     , maybe [] ((: []) . ("--use-index=" ++)) . flagToMaybe . argIndex $ args
-    , bool ["--gen-index"] [] . fromFlagOrDefault False . argGenIndex $ args
+    , bool [] ["--gen-index"] . fromFlagOrDefault False . argGenIndex $ args
     , maybe [] ((: []) . ("--base-url=" ++)) . flagToMaybe . argBaseUrl $ args
-    , bool [] [verbosityFlag] . getAny . argVerbose $ args
+    , bool [verbosityFlag] [] . getAny . argVerbose $ args
     , map (\o -> case o of Hoogle -> "--hoogle"; Html -> "--html")
         . fromFlagOrDefault []
         . argOutput
@@ -1017,8 +1258,8 @@ renderPureArgs version comp platform args =
         ( (: [])
             . ("--title=" ++)
             . ( bool
-                  (++ " (internal documentation)")
                   id
+                  (++ " (internal documentation)")
                   (getAny $ argIgnoreExports args)
               )
         )
@@ -1040,6 +1281,7 @@ renderPureArgs version comp platform args =
       -- We pass this option by default to haddock to avoid recompilation
       -- See Note [Hi Haddock Recompilation Avoidance]
       ["--no-tmp-comp-dir" | version >= mkVersion [2, 28, 0]]
+    , bool [] ["--use-unicode"] . fromFlagOrDefault False . argUseUnicode $ args
     ]
   where
     -- See Note [Symbolic paths] in Distribution.Utils.Path
@@ -1078,7 +1320,6 @@ renderPureArgs version comp platform args =
               ]
           )
 
-    bool a b c = if c then a else b
     isVersion major minor = version >= mkVersion [major, minor]
     verbosityFlag
       | isVersion 2 5 = "--verbosity=1"
@@ -1117,7 +1358,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..e8d7ba54a2085547104beccce0d457e1a9a6a711 100644
--- a/Cabal/src/Distribution/Simple/Setup/Haddock.hs
+++ b/Cabal/src/Distribution/Simple/Setup/Haddock.hs
@@ -115,6 +115,7 @@ data HaddockFlags = HaddockFlags
   , haddockBaseUrl :: Flag String
   , haddockResourcesDir :: Flag String
   , haddockOutputDir :: Flag FilePath
+  , haddockUseUnicode :: Flag Bool
   }
   deriving (Show, Generic, Typeable)
 
@@ -170,6 +171,7 @@ defaultHaddockFlags =
     , haddockBaseUrl = NoFlag
     , haddockResourcesDir = NoFlag
     , haddockOutputDir = NoFlag
+    , haddockUseUnicode = Flag False
     }
 
 haddockCommand :: CommandUI HaddockFlags
@@ -378,6 +380,13 @@ haddockOptions showOrParseArgs =
         haddockOutputDir
         (\v flags -> flags{haddockOutputDir = v})
         (reqArgFlag "DIR")
+    , option
+        ""
+        ["use-unicode"]
+        "Pass --use-unicode option to haddock"
+        haddockUseUnicode
+        (\v flags -> flags{haddockUseUnicode = v})
+        trueArg
     ]
 
 emptyHaddockFlags :: HaddockFlags
@@ -441,7 +450,7 @@ data HaddockProjectFlags = HaddockProjectFlags
   , haddockProjectVerbosity :: Flag Verbosity
   , -- haddockBaseUrl is not supported, a fixed value is provided
     haddockProjectResourcesDir :: Flag String
-  , haddockProjectOutputDir :: Flag FilePath
+  , haddockProjectUseUnicode :: Flag Bool
   }
   deriving (Show, Generic, Typeable)
 
@@ -465,8 +474,8 @@ defaultHaddockProjectFlags =
     , haddockProjectKeepTempFiles = Flag False
     , haddockProjectVerbosity = Flag normal
     , haddockProjectResourcesDir = NoFlag
-    , haddockProjectOutputDir = NoFlag
     , haddockProjectInterfaces = NoFlag
+    , haddockProjectUseUnicode = NoFlag
     }
 
 haddockProjectCommand :: CommandUI HaddockProjectFlags
@@ -615,11 +624,11 @@ haddockProjectOptions _showOrParseArgs =
       (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")
+      ["use-unicode"]
+      "Pass --use-unicode option to haddock"
+      haddockProjectUseUnicode
+      (\v flags -> flags{haddockProjectUseUnicode = v})
+      trueArg
   ]
 
 emptyHaddockProjectFlags :: HaddockProjectFlags
diff --git a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
index 8c0c21a54272f8221f4041dce9bcdd19657ed592..f632e8b7caaca98a011fb690a21ce03da5fc7807 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,14 @@ import Distribution.Client.Setup
   )
 import Distribution.Client.TargetProblem (TargetProblem (..))
 
+import Distribution.Simple.BuildPaths
+  ( haddockBenchmarkDirPath
+  , haddockDirName
+  , haddockLibraryDirPath
+  , haddockLibraryPath
+  , haddockPath
+  , haddockTestDirPath
+  )
 import Distribution.Simple.Command
   ( CommandUI (..)
   )
@@ -75,6 +83,7 @@ import Distribution.Simple.Program.Db
 import Distribution.Simple.Setup
   ( HaddockFlags (..)
   , HaddockProjectFlags (..)
+  , HaddockTarget (..)
   , Visibility (..)
   , defaultCommonSetupFlags
   , defaultHaddockFlags
@@ -84,9 +93,11 @@ import Distribution.Simple.Utils
   ( copyDirectoryRecursive
   , createDirectoryIfMissingVerbose
   , dieWithException
+  , info
   , warn
   )
 import Distribution.Types.InstalledPackageInfo (InstalledPackageInfo (..))
+import Distribution.Types.PackageDescription (PackageDescription (benchmarks, subLibraries, testSuites))
 import Distribution.Types.PackageId (pkgName)
 import Distribution.Types.PackageName (unPackageName)
 import Distribution.Types.UnitId (unUnitId)
@@ -98,7 +109,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 +160,11 @@ haddockProjectAction flags _extraArgs globalFlags = do
                 else NoFlag
           , haddockKeepTempFiles = haddockProjectKeepTempFiles flags
           , haddockResourcesDir = haddockProjectResourcesDir flags
-          , haddockOutputDir = haddockProjectOutputDir flags
+          , haddockUseUnicode = haddockProjectUseUnicode 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 +214,6 @@ haddockProjectAction flags _extraArgs globalFlags = do
                   elaboratedPlan
           return (elaboratedPlan', targets)
 
-      printPlan verbosity baseCtx buildCtx
-
       let elaboratedPlan :: ElaboratedInstallPlan
           elaboratedPlan = elaboratedPlanOriginal buildCtx
 
@@ -255,61 +268,84 @@ 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)
-                let docDir =
+                    docDir =
                       buildDir
                         </> "doc"
                         </> "html"
-                        </> packageName
-                    destDir = outputDir </> unitId
-                    interfacePath =
-                      destDir
-                        </> packageName
-                        <.> "haddock"
+                        </> packageDir
+
                 a <- doesDirectoryExist docDir
-                case a of
-                  True ->
+                if a
+                  then do
                     copyDirectoryRecursive verbosity docDir destDir
-                      >> return
-                        [
-                          ( unitId
-                          , interfacePath
-                          , Visible
-                          )
-                        ]
-                  False -> do
+                    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
+                              ]
+                            ++ [ (testPath, testInterfacePath, Visible)
+                               | test <- testSuites pkg_descr
+                               , let testPath = haddockTestDirPath ForDevelopment pkg_descr test
+                                     testInterfacePath =
+                                      outputDir
+                                        </> testPath
+                                        </> haddockPath pkg_descr
+                               ]
+                            ++ [ (benchPath, benchInterfacePath, Visible)
+                               | bench <- benchmarks pkg_descr
+                               , let benchPath = haddockBenchmarkDirPath ForDevelopment pkg_descr bench
+                                     benchInterfacePath =
+                                      outputDir
+                                        </> benchPath
+                                        </> haddockPath pkg_descr
+                               ]
+                    infos' <-
+                      mapM
+                        ( \x@(_, path, _) -> do
+                            e <- doesFileExist path
+                            return $
+                              if e
+                                then Right x
+                                else Left path
+                        )
+                        infos
+                    return infos'
+                  else do
                     warn
                       verbosity
                       ( "haddocks of "
-                          ++ show unitId
+                          ++ unUnitId unitId
                           ++ " not found in the store"
                       )
                     return []
@@ -317,57 +353,53 @@ 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'
                     ]
+              , haddockProjectUseUnicode = NoFlag
               }
       createHaddockIndex
         verbosity
diff --git a/cabal-install/src/Distribution/Client/Config.hs b/cabal-install/src/Distribution/Client/Config.hs
index 951155d365b37cb29fb082d758d8000c7c79aaa5..2faf9e1756d98aea15a5528e04bf538a1bab2109 100644
--- a/cabal-install/src/Distribution/Client/Config.hs
+++ b/cabal-install/src/Distribution/Client/Config.hs
@@ -634,6 +634,7 @@ instance Semigroup SavedConfig where
           , haddockBaseUrl = combine haddockBaseUrl
           , haddockResourcesDir = combine haddockResourcesDir
           , haddockOutputDir = combine haddockOutputDir
+          , haddockUseUnicode = combine haddockUseUnicode
           }
         where
           combine = combine' savedHaddockFlags
diff --git a/cabal-install/src/Distribution/Client/PackageHash.hs b/cabal-install/src/Distribution/Client/PackageHash.hs
index 2e7b9320e3dec4008384694274aaaaefa0710c4a..1b30b125204dc37326efe7f0da640e3dcf8032eb 100644
--- a/cabal-install/src/Distribution/Client/PackageHash.hs
+++ b/cabal-install/src/Distribution/Client/PackageHash.hs
@@ -240,6 +240,7 @@ data PackageHashConfigInputs = PackageHashConfigInputs
   , pkgHashHaddockBaseUrl :: Maybe String
   , pkgHashHaddockResourcesDir :: Maybe String
   , pkgHashHaddockOutputDir :: Maybe FilePath
+  , pkgHashHaddockUseUnicode :: Bool
   --     TODO: [required eventually] pkgHashToolsVersions     ?
   --     TODO: [required eventually] pkgHashToolsExtraOptions ?
   }
@@ -349,6 +350,7 @@ renderPackageHashInputs
           , opt "haddock-base-url" Nothing (fromMaybe "") pkgHashHaddockBaseUrl
           , opt "haddock-resources-dir" Nothing (fromMaybe "") pkgHashHaddockResourcesDir
           , opt "haddock-output-dir" Nothing (fromMaybe "") pkgHashHaddockOutputDir
+          , opt "haddock-use-unicode" False prettyShow pkgHashHaddockUseUnicode
           ]
             ++ Map.foldrWithKey (\prog args acc -> opt (prog ++ "-options") [] unwords args : acc) [] pkgHashProgramArgs
     where
diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs
index 0de745526c14aa4aef75c206bfecd22698121b1f..fe8ea884ccca6e1be91eae8645e7c965de88326a 100644
--- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs
+++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs
@@ -508,6 +508,7 @@ commandLineFlagsToProjectConfig globalFlags NixStyleFlags{..} clientInstallFlags
           , packageConfigHaddockInternal = packageConfigHaddockInternal pc
           , packageConfigHaddockQuickJump = packageConfigHaddockQuickJump pc
           , packageConfigHaddockLinkedSource = packageConfigHaddockLinkedSource pc
+          , packageConfigHaddockUseUnicode = packageConfigHaddockUseUnicode pc
           }
       )
 
@@ -824,6 +825,7 @@ convertLegacyPerPackageFlags
         , haddockBaseUrl = packageConfigHaddockBaseUrl
         , haddockResourcesDir = packageConfigHaddockResourcesDir
         , haddockOutputDir = packageConfigHaddockOutputDir
+        , haddockUseUnicode = packageConfigHaddockUseUnicode
         } = haddockFlags
 
       TestFlags
@@ -1225,6 +1227,7 @@ convertToLegacyPerPackageConfig PackageConfig{..} =
         , haddockBaseUrl = packageConfigHaddockBaseUrl
         , haddockResourcesDir = packageConfigHaddockResourcesDir
         , haddockOutputDir = packageConfigHaddockOutputDir
+        , haddockUseUnicode = packageConfigHaddockUseUnicode
         }
 
     testFlags =
@@ -1628,6 +1631,7 @@ legacyPackageConfigFieldDescrs =
             , "base-url"
             , "resources-dir"
             , "output-dir"
+            , "use-unicode"
             ]
           . commandOptionsToFields
        )
diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs
index 08c27b00a3dd8a516fbffa7a215809ba2d8b0dd2..4c2555c472c8286e0745461b3fc89db9772c7e37 100644
--- a/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs
+++ b/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs
@@ -308,6 +308,7 @@ data PackageConfig = PackageConfig
   , packageConfigHaddockBaseUrl :: Flag String -- TODO: [required eventually] use this
   , packageConfigHaddockResourcesDir :: Flag String -- TODO: [required eventually] use this
   , packageConfigHaddockOutputDir :: Flag FilePath -- TODO: [required eventually] use this
+  , packageConfigHaddockUseUnicode :: Flag Bool -- TODO: [required eventually] use this
   , packageConfigHaddockForHackage :: Flag HaddockTarget
   , -- Test options
     packageConfigTestHumanLog :: Flag PathTemplate
diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs
index 19f9907703c80887e6db4ff04128ae81d82f3884..23fed2c5bd1d5e2bb6d018ae2e9d4bb9ad27050e 100644
--- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs
+++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs
@@ -2298,6 +2298,7 @@ elaborateInstallPlan
             elabHaddockBaseUrl = perPkgOptionMaybe pkgid packageConfigHaddockBaseUrl
             elabHaddockResourcesDir = perPkgOptionMaybe pkgid packageConfigHaddockResourcesDir
             elabHaddockOutputDir = perPkgOptionMaybe pkgid packageConfigHaddockOutputDir
+            elabHaddockUseUnicode = perPkgOptionFlag pkgid False packageConfigHaddockUseUnicode
 
             elabTestMachineLog = perPkgOptionMaybe pkgid packageConfigTestMachineLog
             elabTestHumanLog = perPkgOptionMaybe pkgid packageConfigTestHumanLog
@@ -4244,6 +4245,7 @@ setupHsHaddockFlags
       , haddockBaseUrl = maybe mempty toFlag elabHaddockBaseUrl
       , haddockResourcesDir = maybe mempty toFlag elabHaddockResourcesDir
       , haddockOutputDir = maybe mempty toFlag elabHaddockOutputDir
+      , haddockUseUnicode = toFlag elabHaddockUseUnicode
       }
 
 setupHsHaddockArgs :: ElaboratedConfiguredPackage -> [String]
@@ -4402,6 +4404,7 @@ packageHashConfigInputs shared@ElaboratedSharedConfig{..} pkg =
     , pkgHashHaddockBaseUrl = elabHaddockBaseUrl
     , pkgHashHaddockResourcesDir = elabHaddockResourcesDir
     , pkgHashHaddockOutputDir = elabHaddockOutputDir
+    , pkgHashHaddockUseUnicode = elabHaddockUseUnicode
     }
   where
     ElaboratedConfiguredPackage{..} = normaliseConfiguredPackage shared pkg
diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs
index 352e35d415017304d47b49e513bb8b2669ac590a..e7efc4cc4869c75f87a252daed5363dec7e2ca32 100644
--- a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs
+++ b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs
@@ -302,6 +302,7 @@ data ElaboratedConfiguredPackage = ElaboratedConfiguredPackage
   , elabHaddockBaseUrl :: Maybe String
   , elabHaddockResourcesDir :: Maybe String
   , elabHaddockOutputDir :: Maybe FilePath
+  , elabHaddockUseUnicode :: Bool
   , elabTestMachineLog :: Maybe PathTemplate
   , elabTestHumanLog :: Maybe PathTemplate
   , elabTestShowDetails :: Maybe TestShowDetails
diff --git a/cabal-install/src/Distribution/Client/Setup.hs b/cabal-install/src/Distribution/Client/Setup.hs
index a8db5c9810622961083d78502e4e858bbcdcda10..8d594b2a4143c31835438fb03b74e4d65e81a360 100644
--- a/cabal-install/src/Distribution/Client/Setup.hs
+++ b/cabal-install/src/Distribution/Client/Setup.hs
@@ -2446,6 +2446,7 @@ haddockOptions showOrParseArgs =
              , "base-url"
              , "resources-dir"
              , "output-dir"
+             , "use-unicode"
              ]
   ]
 
diff --git a/cabal-install/tests/IntegrationTests2.hs b/cabal-install/tests/IntegrationTests2.hs
index b5b49053b6d67200c17522c6e8298fe770202038..c4341ed72efb86d5634d547955b2795f38ad6998 100644
--- a/cabal-install/tests/IntegrationTests2.hs
+++ b/cabal-install/tests/IntegrationTests2.hs
@@ -2101,6 +2101,7 @@ testConfigOptionComments = do
   "  -- base-url" @=? findLineWith True "base-url" defaultConfigFile
   "  -- resources-dir" @=? findLineWith True "resources-dir" defaultConfigFile
   "  -- output-dir" @=? findLineWith True "output-dir" defaultConfigFile
+  "  -- use-unicode" @=? findLineWith True "use-unicode" defaultConfigFile
 
   "  -- interactive" @=? findLineWith True "interactive" defaultConfigFile
   "  -- quiet" @=? findLineWith True "quiet" defaultConfigFile
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs
index 2c4de05a9a27558179b6a274687516469e860462..04dd86fc92a1ce01ea6d59c222aa0528878528ff 100644
--- a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs
+++ b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs
@@ -727,6 +727,7 @@ instance Arbitrary PackageConfig where
       <*> arbitrary
       <*> arbitrary
       <*> arbitrary
+      <*> arbitrary
       <*> arbitraryFlag arbitraryShortToken
       <*> arbitrary
       <*> shortListOf 5 arbitrary
@@ -795,6 +796,7 @@ instance Arbitrary PackageConfig where
       , packageConfigHaddockBaseUrl = x55
       , packageConfigHaddockResourcesDir = x56
       , packageConfigHaddockOutputDir = x57
+      , packageConfigHaddockUseUnicode = x58
       , packageConfigTestHumanLog = x44
       , packageConfigTestMachineLog = x45
       , packageConfigTestShowDetails = x46
@@ -859,6 +861,7 @@ instance Arbitrary PackageConfig where
         , packageConfigHaddockBaseUrl = x55'
         , packageConfigHaddockResourcesDir = x56'
         , packageConfigHaddockOutputDir = x57'
+        , packageConfigHaddockUseUnicode = x58'
         , packageConfigTestHumanLog = x44'
         , packageConfigTestMachineLog = x45'
         , packageConfigTestShowDetails = x46'
@@ -881,6 +884,7 @@ instance Arbitrary PackageConfig where
               , (x44', x45', x46', x47', x48', x49', x51', x52', x54', x55')
               , x56'
               , x57'
+              , x58'
               )
           ) <-
           shrink
@@ -906,6 +910,7 @@ instance Arbitrary PackageConfig where
               , (x44, x45, x46, x47, x48, x49, x51, x52, x54, x55)
               , x56
               , x57
+              , x58
               )
             )
       ]
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
diff --git a/changelog.d/pr-9821 b/changelog.d/pr-9821
new file mode 100644
index 0000000000000000000000000000000000000000..bc3e9dcae504fdfcfe6a77bb8b5ea099f29fc68e
--- /dev/null
+++ b/changelog.d/pr-9821
@@ -0,0 +1,21 @@
+synopsis: `haddock-project` support for subcomponents
+packages: cabal-install
+prs: #9821
+issues:
+significance: significant
+
+description: {
+
+- `haddock-project` handles sublibraries, test suites and benchmarks.
+- `haddock` receives `--package-name` flag whcih allows to set names of
+  components which are included in the main `index.html` file.
+- added `--use-unicode` flag to `haddock` and `haddock-project` commands.
+- The directory structure of `./dist-newstyle` has changed.  `haddock`
+  subcommand will install `package:sublib` component in a directory
+  `package/sublib` under `l/sublib/doc/html/`.  This is important for
+  `haddock-project` command and in the future might will be useful for hackage
+  support of sublibraries.  See
+  https://github.com/haskell/cabal/pull/9821#discussion_r1548557115.
+
+}
+
diff --git a/doc/cabal-project-description-file.rst b/doc/cabal-project-description-file.rst
index cd80cd3ab72bbced3bf4f9ea9b8f2bd5a151c64a..c2f224cf421697f85a670ec6f2a044b7d308aa2f 100644
--- a/doc/cabal-project-description-file.rst
+++ b/doc/cabal-project-description-file.rst
@@ -1616,6 +1616,12 @@ running ``setup haddock``.
     This flag is provided as a technology preview and is subject to change in the
     next releases.
 
+.. cfg-field:: haddock-use-unicode: boolean
+               --haddock-use-unicode
+    :synopsis: Pass --use-unicode option to haddock.
+
+    Generate HTML documentation which contains unicode characters.
+
 .. cfg-field:: haddock-resources-dir: DIR
                --haddock-resources-dir=DIR
     :synopsis: Location of Haddock's static/auxiliary files.
diff --git a/test/IntegrationTests2/config/default-config b/test/IntegrationTests2/config/default-config
index e74a2c9776411decebb13ff291f3bd15403c86b2..57ae6f847ec4dfbd98f1ba718b9b73d2ab72c448 100644
--- a/test/IntegrationTests2/config/default-config
+++ b/test/IntegrationTests2/config/default-config
@@ -143,6 +143,7 @@ haddock
   -- base-url:
   -- resources-dir:
   -- output-dir:
+  -- use-unicode: False
 
 init
   -- interactive: False
diff --git a/test/IntegrationTests2/nix-config/default-config b/test/IntegrationTests2/nix-config/default-config
index e74a2c9776411decebb13ff291f3bd15403c86b2..57ae6f847ec4dfbd98f1ba718b9b73d2ab72c448 100644
--- a/test/IntegrationTests2/nix-config/default-config
+++ b/test/IntegrationTests2/nix-config/default-config
@@ -143,6 +143,7 @@ haddock
   -- base-url:
   -- resources-dir:
   -- output-dir:
+  -- use-unicode: False
 
 init
   -- interactive: False
diff --git a/tests/IntegrationTests2/config/default-config b/tests/IntegrationTests2/config/default-config
index 8d5b2ea1df658565ce9a2cb9cf8dd8594d739246..94a10d9c1131ede8b6ad7681989283a836ae6134 100644
--- a/tests/IntegrationTests2/config/default-config
+++ b/tests/IntegrationTests2/config/default-config
@@ -145,6 +145,7 @@ haddock
   -- base-url:
   -- resources-dir:
   -- output-dir:
+  -- use-unicode: False
 
 init
   -- interactive: False
diff --git a/tests/IntegrationTests2/nix-config/default-config b/tests/IntegrationTests2/nix-config/default-config
index e74a2c9776411decebb13ff291f3bd15403c86b2..57ae6f847ec4dfbd98f1ba718b9b73d2ab72c448 100644
--- a/tests/IntegrationTests2/nix-config/default-config
+++ b/tests/IntegrationTests2/nix-config/default-config
@@ -143,6 +143,7 @@ haddock
   -- base-url:
   -- resources-dir:
   -- output-dir:
+  -- use-unicode: False
 
 init
   -- interactive: False