diff --git a/Distribution/Make.hs b/Distribution/Make.hs
index 214f9d31801a0e1852a7230033e3365b625dc64d..a50313564bfb6b4ae27e2674d210000a057889be 100644
--- a/Distribution/Make.hs
+++ b/Distribution/Make.hs
@@ -145,7 +145,7 @@ defaultMainNoRead pkg_descr
                 exitWith retVal
 
             HaddockCmd -> do 
-                (_, _, args) <- parseHaddockArgs args []
+                (_, _, args) <- parseHaddockArgs emptyHaddockFlags args []
                 no_extra_flags args
                 retVal <- exec "make docs"
                 case retVal of
diff --git a/Distribution/Setup.hs b/Distribution/Setup.hs
index 1ea64d8ab9817d2685f543ace826b001c07b8587..135cb1efa706b072b7f40fa9545244a997e68b4a 100644
--- a/Distribution/Setup.hs
+++ b/Distribution/Setup.hs
@@ -46,7 +46,8 @@ module Distribution.Setup (--parseArgs,
                            ConfigFlags(..), emptyConfigFlags, configureArgs,
                            CopyFlags(..), CopyDest(..), 
 			   InstallFlags(..), emptyInstallFlags,
-                           BuildFlags(..), CleanFlags(..), HaddockFlags(..), PFEFlags(..),
+                           HaddockFlags(..), emptyHaddockFlags,
+                           BuildFlags(..), CleanFlags(..), PFEFlags(..),
                            RegisterFlags(..), emptyRegisterFlags,
 			   SDistFlags(..),
                            MaybeUserFlag(..), userOverride,
@@ -217,11 +218,16 @@ emptyRegisterFlags = RegisterFlags { regUser=MaybeUserNone,
 				     regWithHcPkg=Nothing,
 				     regVerbose=0 }
 
+data HaddockFlags = HaddockFlags {haddockHoogle :: Bool
+                                 ,haddockVerbose :: Int}
+
+emptyHaddockFlags :: HaddockFlags
+emptyHaddockFlags = HaddockFlags {haddockHoogle = False, haddockVerbose = 0}
+
 -- Following only have verbose flags, but for consistency and
 -- extensibility we make them into a type.
 data BuildFlags   = BuildFlags   {buildVerbose   :: Int}
 data CleanFlags   = CleanFlags   {cleanVerbose   :: Int}
-data HaddockFlags = HaddockFlags {haddockVerbose :: Int}
 data PFEFlags     = PFEFlags     {pfeVerbose     :: Int}
 
 -- |Most of these flags are for Configure, but InstPrefix is for Copy.
@@ -257,6 +263,8 @@ data Flag a = GhcFlag | NhcFlag | HugsFlag | JhcFlag
 	  | DestDir FilePath
           -- For sdist:
           | Snapshot
+          -- For haddock:
+          | HaddockHoogle
           -- For everyone:
           | HelpFlag
           | Verbose Int
@@ -546,10 +554,18 @@ haddockCmd = Cmd {
         cmdName        = "haddock",
         cmdHelp        = "Generate Haddock HTML code from Exposed-Modules.",
         cmdDescription = "Requires cpphs and haddock.",
-        cmdOptions     = [cmd_help, cmd_verbose],
+        cmdOptions     = [cmd_help, cmd_verbose,
+                          Option "" ["hoogle"] (NoArg HaddockHoogle) "Generate a hoogle database"],
         cmdAction      = HaddockCmd
         }
 
+parseHaddockArgs :: HaddockFlags -> [String] -> [OptDescr a] -> IO (HaddockFlags, [a], [String])
+parseHaddockArgs  = parseArgs haddockCmd updateCfg
+  where updateCfg (HaddockFlags hoogle verbose) fl = case fl of
+            HaddockHoogle -> HaddockFlags True verbose
+            Verbose n     -> HaddockFlags hoogle n
+            _             -> error "Unexpected flag!"
+
 programaticaCmd :: Cmd a
 programaticaCmd = Cmd {
         cmdName        = "pfe",
@@ -562,9 +578,6 @@ programaticaCmd = Cmd {
 parseProgramaticaArgs :: [String] -> [OptDescr a] -> IO (PFEFlags, [a], [String])
 parseProgramaticaArgs  = parseNoArgs programaticaCmd PFEFlags
 
-parseHaddockArgs :: [String] -> [OptDescr a] -> IO (HaddockFlags, [a], [String])
-parseHaddockArgs  = parseNoArgs haddockCmd HaddockFlags
-
 cleanCmd :: Cmd a
 cleanCmd = Cmd {
         cmdName        = "clean",
diff --git a/Distribution/Simple.hs b/Distribution/Simple.hs
index 52aaf56847c9d41d806aa4dbb257eef1cf8e5f9b..4eea113d6a1a21dba7ea7cff10aa721c209ed1ca 100644
--- a/Distribution/Simple.hs
+++ b/Distribution/Simple.hs
@@ -295,7 +295,7 @@ defaultMainWorker pkg_descr_in action args hooks
                 postHook postBuild args flags pkg_descr localbuildinfo
 
             HaddockCmd -> do
-                (verbose, _, args) <- parseHaddockArgs args []
+                (verbose, _, args) <- parseHaddockArgs emptyHaddockFlags args []
                 pkg_descr <- hookOrInArgs preHaddock args verbose
 		localbuildinfo <- getPersistBuildConfig
 
@@ -397,7 +397,7 @@ getModulePaths bi =
       mapM (flip (moduleToFilePath (hsSourceDirs bi)) ["hs", "lhs"])
 
 haddock :: PackageDescription -> LocalBuildInfo -> Maybe UserHooks -> HaddockFlags -> IO ()
-haddock pkg_descr lbi hooks (HaddockFlags verbose) = do
+haddock pkg_descr lbi hooks (HaddockFlags hoogle verbose) = do
     let pps = allSuffixHandlers hooks
     confHaddock <- do let programConf = withPrograms lbi
                       let haddockName = programName haddockProgram
@@ -415,6 +415,7 @@ haddock pkg_descr lbi hooks (HaddockFlags verbose) = do
     let mockAll bi = mapM_ (mockPP ["-D__HADDOCK__"] pkg_descr bi lbi tmpDir verbose)
     let showPkg     = showPackageId (package pkg_descr)
     let showDepPkgs = map showPackageId (packageDeps lbi)
+    let outputFlag  = if hoogle then "--hoogle" else "--html"
 
     withLib pkg_descr () $ \lib -> do
         let bi = libBuildInfo lib
@@ -426,7 +427,7 @@ haddock pkg_descr lbi hooks (HaddockFlags verbose) = do
         let haddockFile = joinFileName haddockPref (haddockName pkg_descr)
         -- FIX: replace w/ rawSystemProgramConf?
         rawSystemProgram verbose confHaddock
-                (["--html",
+                ([outputFlag,
                   "--odir=" ++ haddockPref,
                   "--title=" ++ showPkg ++ ": " ++ synopsis pkg_descr,
                   "--package=" ++ showPkg,
@@ -449,7 +450,7 @@ haddock pkg_descr lbi hooks (HaddockFlags verbose) = do
         mockAll bi inFiles
         let outFiles = replaceLitExts inFiles
         rawSystemProgram verbose confHaddock
-                (["--html",
+                ([outputFlag,
                   "--odir=" ++ exeTargetDir,
                   "--title=" ++ exeName exe]
                  ++ map ("--use-package=" ++) (showPkg:showDepPkgs)