diff --git a/Cabal/Distribution/PackageDescription.hs b/Cabal/Distribution/PackageDescription.hs
index 1124d0c80df18db04f87d730856cde6c88c40243..17ca9ea79329bbf719bc8119eebbf235db6b5f21 100644
--- a/Cabal/Distribution/PackageDescription.hs
+++ b/Cabal/Distribution/PackageDescription.hs
@@ -193,7 +193,8 @@ data PackageDescription
         dataFiles      :: [FilePath],
         dataDir        :: FilePath,
         extraSrcFiles  :: [FilePath],
-        extraTmpFiles  :: [FilePath]
+        extraTmpFiles  :: [FilePath],
+        extraHtmlFiles :: [FilePath]
     }
     deriving (Show, Read, Eq)
 
@@ -256,7 +257,8 @@ emptyPackageDescription
                       dataFiles    = [],
                       dataDir      = "",
                       extraSrcFiles = [],
-                      extraTmpFiles = []
+                      extraTmpFiles = [],
+                      extraHtmlFiles = []
                      }
 
 -- | The type of build system used by this package.
diff --git a/Cabal/Distribution/PackageDescription/Check.hs b/Cabal/Distribution/PackageDescription/Check.hs
index 8826b0500cd65ae7cf2ad52dc7532fffb662ca7e..3d8ac627e58c723ffd16dafe37c0d6fd3542ccbc 100644
--- a/Cabal/Distribution/PackageDescription/Check.hs
+++ b/Cabal/Distribution/PackageDescription/Check.hs
@@ -848,10 +848,11 @@ checkPaths pkg =
       _            -> False
     -- paths that must be relative
     relPaths =
-         [ (path, "extra-src-files") | path <- extraSrcFiles pkg ]
-      ++ [ (path, "extra-tmp-files") | path <- extraTmpFiles pkg ]
-      ++ [ (path, "data-files")      | path <- dataFiles     pkg ]
-      ++ [ (path, "data-dir")        | path <- [dataDir      pkg]]
+         [ (path, "extra-src-files")  | path <- extraSrcFiles  pkg ]
+      ++ [ (path, "extra-tmp-files")  | path <- extraTmpFiles  pkg ]
+      ++ [ (path, "extra-html-files") | path <- extraHtmlFiles pkg ]
+      ++ [ (path, "data-files")       | path <- dataFiles      pkg ]
+      ++ [ (path, "data-dir")         | path <- [dataDir       pkg]]
       ++ concat
          [    [ (path, "c-sources")        | path <- cSources        bi ]
            ++ [ (path, "install-includes") | path <- installIncludes bi ]
diff --git a/Cabal/Distribution/PackageDescription/Parse.hs b/Cabal/Distribution/PackageDescription/Parse.hs
index 4cec0dac0459f1ac8674284ff41656567577675e..5e4acb7f8ad25e5f036bdbebff89f50ae734e7c7 100644
--- a/Cabal/Distribution/PackageDescription/Parse.hs
+++ b/Cabal/Distribution/PackageDescription/Parse.hs
@@ -170,6 +170,9 @@ pkgDescrFieldDescrs =
  , listField "extra-tmp-files"
            showFilePath       parseFilePathQ
            extraTmpFiles          (\val pkg -> pkg{extraTmpFiles=val})
+ , listField "extra-html-files"
+           showFilePath    parseFilePathQ
+           extraHtmlFiles         (\val pkg -> pkg{extraHtmlFiles=val})
  ]
 
 -- | Store any fields beginning with "x-" in the customFields field of
diff --git a/Cabal/Distribution/Simple/Haddock.hs b/Cabal/Distribution/Simple/Haddock.hs
index d166d03da19277d50ce88f497b5983f134b3ce59..94676d02c3b77251509bb439df79352bd1b0e88b 100644
--- a/Cabal/Distribution/Simple/Haddock.hs
+++ b/Cabal/Distribution/Simple/Haddock.hs
@@ -75,11 +75,11 @@ import Distribution.Simple.Build (initialBuildSteps)
 import Distribution.Simple.InstallDirs (InstallDirs(..), PathTemplateEnv, PathTemplate,
                                         PathTemplateVariable(..),
                                         toPathTemplate, fromPathTemplate,
-                                        substPathTemplate,
-                                        initialPathTemplateEnv)
+                                        substPathTemplate, initialPathTemplateEnv)
 import Distribution.Simple.LocalBuildInfo
          ( LocalBuildInfo(..), Component(..), ComponentLocalBuildInfo(..)
-         , withAllComponentsInBuildOrder )
+         , withAllComponentsInBuildOrder
+         , absoluteInstallDirs, CopyDest(NoCopyDest) )
 import Distribution.Simple.BuildPaths ( haddockName,
                                         hscolourPref, autogenModulesDir,
                                         )
@@ -92,7 +92,7 @@ import Distribution.InstalledPackageInfo
 import Distribution.Simple.Utils
          ( die, warn, notice, intercalate, setupMessage
          , createDirectoryIfMissingVerbose, withTempFile, copyFileVerbose
-         , withTempDirectory
+         , withTempDirectory, matchFileGlob
          , findFileWithExtension, findFile )
 import Distribution.Text
          ( display, simpleParse )
@@ -102,15 +102,16 @@ import Language.Haskell.Extension
 -- Base
 import System.Directory(removeFile, doesFileExist, createDirectoryIfMissing)
 
-import Control.Monad ( when, guard )
+import Control.Monad ( when, guard, forM_ )
 import Control.Exception (assert)
 import Data.Monoid
 import Data.Maybe    ( fromMaybe, listToMaybe )
 
 import System.FilePath((</>), (<.>), splitFileName, splitExtension,
-                       normalise, splitPath, joinPath)
+                       normalise, splitPath, joinPath, takeDirectory)
 import System.IO (hClose, hPutStrLn)
 import Distribution.Version
+import Distribution.Simple.SrcDist (copyFileTo)
 
 -- Types
 
@@ -219,6 +220,14 @@ haddock pkg_descr lbi suffixes flags = do
                           lbi isVersion2 bi (commonArgs `mappend` exeArgs)
             runHaddock verbosity keepTempFiles confHaddock exeArgs'
         _ -> return ()
+
+    flip mapM_ (extraHtmlFiles pkg_descr) $ \ fpath -> do
+      files <- matchFileGlob fpath
+      let dir = takeDirectory (flat_htmldir </> "html")
+          InstallDirs { htmldir = flat_htmldir } =
+              absoluteInstallDirs pkg_descr lbi NoCopyDest
+      -- sequence_ [ do copyFileTo verbosity dir file | file <- files ]
+      forM_ files $ copyFileTo verbosity dir
   where
     verbosity     = flag haddockVerbosity
     keepTempFiles = flag haddockKeepTempFiles
diff --git a/Cabal/Distribution/Simple/SrcDist.hs b/Cabal/Distribution/Simple/SrcDist.hs
index 1e781ba2d57c62f841b05c8f4df7dd016b91b41f..fccbebaade0a5a731af1aca4635e9af184b59da5 100644
--- a/Cabal/Distribution/Simple/SrcDist.hs
+++ b/Cabal/Distribution/Simple/SrcDist.hs
@@ -64,6 +64,8 @@ module Distribution.Simple.SrcDist (
   snapshotPackage,
   snapshotVersion,
   dateToSnapshotNumber,
+
+  copyFileTo
   )  where
 
 import Distribution.PackageDescription
@@ -223,7 +225,7 @@ prepareTree verbosity pkg_descr0 mb_lbi distPref targetDir pps = do
 
   when (not (null (licenseFile pkg_descr))) $
     copyFileTo verbosity targetDir (licenseFile pkg_descr)
-  flip mapM_ (extraSrcFiles pkg_descr) $ \ fpath -> do
+  flip mapM_ (extraSrcFiles pkg_descr ++ extraHtmlFiles pkg_descr) $ \ fpath -> do
     files <- matchFileGlob fpath
     sequence_
       [ do copyFileTo verbosity targetDir file