diff --git a/cabal2nix.cabal b/cabal2nix.cabal
--- a/cabal2nix.cabal
+++ b/cabal2nix.cabal
@@ -1,5 +1,5 @@
 Name:                   cabal2nix
-Version:                1.9
+Version:                1.10
 Copyright:              (c) 2011 Peter Simons and Andres Loeh
 License:                BSD3
 License-File:           LICENSE
@@ -10,7 +10,7 @@
 Synopsis:               Convert Cabal files into Nix build instructions
 Cabal-Version:          >= 1.6
 Build-Type:             Simple
-Tested-With:            GHC == 7.0.4
+Tested-With:            GHC == 6.12.3, GHC == 7.0.4
 Description:
   The cabal2nix utility converts Cabal files into Nix build instructions. The
   commandline syntax is:
@@ -56,12 +56,13 @@
 Executable hackage4nix
   main-is:              Hackage4Nix.hs
   hs-source-dirs:       src
-  Build-Depends:        base >= 3 && < 5, Cabal, pretty, filepath, directory, bytestring,
+  Build-Depends:        base >= 3 && < 5, Cabal >= 1.8, pretty, filepath, directory,
                         regex-posix, mtl, containers
-  Ghc-Options:          -Wall
+  Extensions:           PatternGuards
   other-modules:        Cabal2Nix.Pretty
                         Cabal2Nix.License
                         Cabal2Nix.Name
                         Cabal2Nix.CorePackages
                         Cabal2Nix.Package
                         Cabal2Nix.Hackage
+
diff --git a/src/Cabal2Nix.hs b/src/Cabal2Nix.hs
--- a/src/Cabal2Nix.hs
+++ b/src/Cabal2Nix.hs
@@ -22,7 +22,7 @@
   | "file://"  `isPrefixOf` path = readCabalFile (drop 7 path)
   | otherwise                    = readFile path
 
-data CliOption = PrintHelp | SHA256 String | Maintainer String | Platform String
+data CliOption = PrintHelp | SHA256 String | Maintainer String | Platform String | NoHaddock
   deriving (Eq)
 
 main :: IO ()
@@ -33,6 +33,7 @@
         , Option []    ["sha256"]     (ReqArg SHA256 "HASH")            "sha256 hash of source tarball"
         , Option ['m'] ["maintainer"] (ReqArg Maintainer "MAINTAINER")  "maintainer of this package (may be specified multiple times)"
         , Option ['p'] ["platform"]   (ReqArg Platform "PLATFORM")      "supported build platforms (may be specified multiple times)"
+        , Option []    ["no-haddock"] (NoArg NoHaddock)                 "don't run Haddock when building this package"
         ]
 
       usage :: String
@@ -58,6 +59,7 @@
 
   let uri         = args
       hash        = [ h | SHA256 h <- opts ]
+      noHaddock   = NoHaddock `elem` opts
       maintainers = [ m | Maintainer m <- opts ]
       platforms'  = [ p | Platform p <- opts ]
       platforms
@@ -78,4 +80,4 @@
 
   sha256 <- if null hash then hashPackage packageId else return (head hash)
 
-  putStr (showNixPkg (cabal2nix cabal sha256 platforms maintainers))
+  putStr (showNixPkg (cabal2nix cabal sha256 noHaddock platforms maintainers))
diff --git a/src/Cabal2Nix/CorePackages.hs b/src/Cabal2Nix/CorePackages.hs
--- a/src/Cabal2Nix/CorePackages.hs
+++ b/src/Cabal2Nix/CorePackages.hs
@@ -30,7 +30,7 @@
     "old-time",
     "pretty",
     "process",
-    "random",
+    -- "random",
     "template-haskell",
     -- "time",
     "unix"
diff --git a/src/Cabal2Nix/License.hs b/src/Cabal2Nix/License.hs
--- a/src/Cabal2Nix/License.hs
+++ b/src/Cabal2Nix/License.hs
@@ -16,6 +16,6 @@
 showLic BSD4                              = "self.stdenv.lib.licenses.bsd4"
 showLic MIT                               = "self.stdenv.lib.licenses.mit"
 showLic PublicDomain                      = "self.stdenv.lib.licenses.publicDomain"
-showLic AllRightsReserved                 = show "unknown"
+showLic AllRightsReserved                 = "self.stdenv.lib.licenses.proprietary"
 showLic OtherLicense                      = show "unknown"
 showLic l                                 = error $ "unknown license: " ++ show l
diff --git a/src/Cabal2Nix/Package.hs b/src/Cabal2Nix/Package.hs
--- a/src/Cabal2Nix/Package.hs
+++ b/src/Cabal2Nix/Package.hs
@@ -2,7 +2,7 @@
   ( cabal2nix, showNixPkg
   , PkgName, PkgVersion, PkgSHA256, PkgURL, PkgDescription, PkgLicense
   , PkgIsLib, PkgIsExe, PkgDependencies, PkgBuildTools, PkgExtraLibs
-  , PkgPkgconfigDeps, PkgPlatforms, PkgMaintainers
+  , PkgPkgconfigDeps, PkgPlatforms, PkgMaintainers, PkgNoHaddock, Pkg(..)
   )
   where
 
@@ -27,13 +27,14 @@
 type PkgSHA256        = String
 type PkgURL           = String
 type PkgDescription   = String
-type PkgLicense       = License
+type PkgLicense       = String
 type PkgIsLib         = Bool
 type PkgIsExe         = Bool
 type PkgDependencies  = [Dependency] -- [CondTree ConfVar [Dependency] ()]
 type PkgBuildTools    = [Dependency]
 type PkgExtraLibs     = [String]
 type PkgPkgconfigDeps = [String]
+type PkgNoHaddock     = Bool
 type PkgPlatforms     = [String]
 type PkgMaintainers   = [String]
 
@@ -49,13 +50,14 @@
                PkgBuildTools
                PkgExtraLibs
                PkgPkgconfigDeps
+               PkgNoHaddock
                PkgPlatforms
                PkgMaintainers
   deriving (Show)
 
 showNixPkg :: Pkg -> String
 showNixPkg (Pkg name ver sha256 url desc lic isLib isExe deps
-                tools libs pcs platforms maintainers) =
+                tools libs pcs noHaddock platforms maintainers) =
     render doc
   where
     doc = funargs (map text ("cabal" : pkgInputs)) $$
@@ -73,12 +75,13 @@
               listattr "buildTools"       pkgBuildTools,
               listattr "extraLibraries"   pkgLibs,
               listattr "pkgconfigDepends" pkgPCs,
+              boolattr "noHaddock"        noHaddock noHaddock,
               vcat [
                 text "meta" <+> equals <+> lbrace,
                 nest 2 $ vcat [
                   onlyIf url  $ attr "homepage"    $ string url,
                   onlyIf desc $ attr "description" $ string desc,
-                  attr "license" $ text (showLic lic),
+                  attr "license" $ text lic,
                   onlyIf platforms $
                     sep [
                       text "platforms" <+> equals,
@@ -101,23 +104,24 @@
     pkgInputs     = nub $ pkgLibs ++ pkgPCs ++ pkgBuildTools ++ pkgDeps
 
 
-cabal2nix :: GenericPackageDescription -> PkgSHA256 -> PkgPlatforms -> PkgMaintainers -> Pkg
-cabal2nix cabal sha256 platforms maintainers =
+cabal2nix :: GenericPackageDescription -> PkgSHA256 -> PkgNoHaddock -> PkgPlatforms -> PkgMaintainers -> Pkg
+cabal2nix cabal sha256 noHaddock platforms maintainers =
     Pkg pkgname pkgver sha256 url desc lic
       isLib isExe
       (buildDepends tpkg)
       tools
       libs
       pcs
+      noHaddock
       [ if '.' `elem` p then p else "self.stdenv.lib.platforms." ++ p | p <- platforms ]
       [ if '.' `elem` m then m else "self.stdenv.lib.maintainers." ++ m | m <- maintainers ]
   where
     pkg = packageDescription cabal
     PackageName pkgname = pkgName (package pkg)
     pkgver = showVersion (pkgVersion (package pkg))
-    lic = license pkg
+    lic = showLic (license pkg)
     url = homepage pkg
-    desc = synopsis pkg
+    desc = normalizeDescription (synopsis pkg)
     -- globalDeps = buildDepends pkg
     -- Potentially dangerous: determine a default flattening of the
     -- package description. Better approach: export the conditional
@@ -136,3 +140,13 @@
 
 unDep :: Dependency -> String
 unDep (Dependency (PackageName x) _) = x
+
+normalizeDescription :: String -> String
+normalizeDescription desc
+  | null desc                                             = []
+  | last desc == '.' && length (filter ('.'==) desc) == 1 = normalizeDescription (reverse (tail (reverse desc)))
+  | otherwise                                             = unwords (words desc) >>= quote
+
+quote :: Char -> [Char]
+quote '"'  = "\\\""
+quote c    = [c]
diff --git a/src/Hackage4Nix.hs b/src/Hackage4Nix.hs
--- a/src/Hackage4Nix.hs
+++ b/src/Hackage4Nix.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE OverloadedStrings, PatternGuards #-}
+{-# LANGUAGE PatternGuards #-}
 
 module Main ( main ) where
 
@@ -11,22 +11,13 @@
 import qualified Data.Set as Set
 import Control.Monad.State
 import Control.Exception ( bracket )
-import qualified Data.ByteString.Char8 as BS
 import Text.Regex.Posix
 import Data.Version
 import Text.ParserCombinators.ReadP ( readP_to_S )
 import Distribution.PackageDescription.Parse ( parsePackageDescription, ParseResult(..) )
 import Distribution.PackageDescription ( GenericPackageDescription() )
 import System.Console.GetOpt ( OptDescr(..), ArgDescr(..), ArgOrder(..), usageInfo, getOpt )
-import Cabal2Nix.Package ( cabal2nix, showNixPkg, PkgName, PkgSHA256, PkgPlatforms, PkgMaintainers )
-
-type ByteString = BS.ByteString
-
-pack :: String -> ByteString
-pack = BS.pack
-
-unpack :: ByteString -> String
-unpack = BS.unpack
+import Cabal2Nix.Package ( cabal2nix, showNixPkg, PkgName, PkgVersion, PkgSHA256, PkgPlatforms, PkgMaintainers, PkgNoHaddock )
 
 type PkgSet = Set.Set Pkg
 
@@ -71,61 +62,54 @@
 
 discoverNixFiles :: (FilePath -> Hackage4Nix ()) -> FilePath -> Hackage4Nix ()
 discoverNixFiles yield dirOrFile
-  | "." `isPrefixOf` takeFileName dirOrFile  = msgDebug $ "ignore file or directory " ++ dirOrFile
+  | "." `isPrefixOf` takeFileName dirOrFile  = return ()
   | otherwise                                = do
      isFile <- io (doesFileExist dirOrFile)
      case (isFile, takeExtension dirOrFile) of
-       (True,".nix") -> do
-         msgDebug ("discovered file " ++ dirOrFile)
-         yield dirOrFile
-       (True,_) -> msgDebug $ "ignore file " ++ dirOrFile
-       (False,_) -> do
-         msgDebug ("discovered dir " ++ dirOrFile)
-         io (readDirectory dirOrFile) >>= mapM_ (discoverNixFiles yield . (dirOrFile </>))
+       (True,".nix") -> yield dirOrFile
+       (True,_)     -> return ()
+       (False,_)    -> io (readDirectory dirOrFile) >>= mapM_ (discoverNixFiles yield . (dirOrFile </>))
 
-type PkgVersion = String
-data Pkg = Pkg PkgName PkgVersion PkgSHA256 PkgPlatforms PkgMaintainers FilePath
+type Regenerate = Bool
+data Pkg = Pkg PkgName PkgVersion PkgSHA256 PkgNoHaddock PkgPlatforms PkgMaintainers FilePath Regenerate
   deriving (Show, Eq, Ord)
 
-regmatch :: ByteString -> String -> Bool
-regmatch buf patt = match (makeRegexOpts compExtended execBlank (pack patt)) buf
-
-regsubmatch :: ByteString -> String -> [ByteString]
+regsubmatch :: String -> String -> [String]
 regsubmatch buf patt = let (_,_,_,x) = f in x
-  where f :: (ByteString,ByteString,ByteString,[ByteString])
-        f = match (makeRegexOpts compExtended execBlank (pack patt)) buf
+  where f :: (String,String,String,[String])
+        f = match (makeRegexOpts compExtended execBlank patt) buf
 
 normalizeMaintainer :: String -> String
 normalizeMaintainer x
   | "self.stdenv.lib.maintainers." `isPrefixOf` x = drop 28 x
   | otherwise                                     = x
 
-parseNixFile :: FilePath -> ByteString -> Hackage4Nix (Maybe Pkg)
+parseNixFile :: FilePath -> String -> Hackage4Nix (Maybe Pkg)
 parseNixFile path buf
-  | True    <- (pack path) `regmatch` (concat (intersperse "|" badPackages))
+  | not (buf =~ "cabal.mkDerivation")
+               = msgDebug ("ignore non-cabal package " ++ path) >> return Nothing
+  | any (`isSuffixOf`path) badPackagePaths
                = msgDebug ("ignore known bad package " ++ path) >> return Nothing
-  | True    <- buf `regmatch` "src = (fetchgit|sourceFromHead)"
+  | buf =~ "src = (fetchurl|fetchgit|sourceFromHead)"
                = msgDebug ("ignore non-hackage package " ++ path) >> return Nothing
-  | True    <- buf `regmatch` "noHaddock"
-               = msgDebug ("ignore non-haddock package " ++ path) >> return Nothing
-  | True    <- buf =~ pack "cabal.mkDerivation"
-  , [name]  <- buf `regsubmatch` "name *= *\"([^\"]+)\""
+  | [name]  <- buf `regsubmatch` "name *= *\"([^\"]+)\""
   , [vers]  <- buf `regsubmatch` "version *= *\"([^\"]+)\""
   , [sha]   <- buf `regsubmatch` "sha256 *= *\"([^\"]+)\""
   , plats   <- buf `regsubmatch` "platforms *= *([^;]+);"
   , maint   <- buf `regsubmatch` "maintainers *= *\\[([^\"]+)]"
-              = let plats' = concatMap BS.words (map (BS.map (\c -> if c == '+' then ' ' else c)) plats)
-                    maint' = concatMap BS.words maint
+  , haddock <- buf `regsubmatch` "noHaddock *= *(true|false) *;"
+              = let plats' = concatMap words (map (map (\c -> if c == '+' then ' ' else c)) plats)
+                    maint' = concatMap words maint
+                    noHaddock
+                      | "true":[] <- haddock = True
+                      | otherwise            = False
+                    regenerate = not (name `elem` patchedPackages) &&
+                                 not (buf =~ "preConfigure|configureFlags|postInstall|patchPhase")
                 in
-                  return $ Just $ Pkg (unpack name)
-                                      (unpack vers)
-                                      (unpack sha)
-                                      (map unpack plats')
-                                      (map (normalizeMaintainer . unpack) maint')
-                                      (path)
-  | True <- buf `regmatch` "cabal.mkDerivation"
-              = msgInfo ("failed to parse file " ++ path) >> return Nothing
-  | otherwise = return Nothing
+                  return $ Just $ Pkg name vers sha noHaddock plats'
+                                      (map normalizeMaintainer maint')
+                                      path regenerate
+  | otherwise = msgInfo ("failed to parse file " ++ path) >> return Nothing
 
 readVersion :: String -> Version
 readVersion str =
@@ -136,10 +120,10 @@
 selectLatestVersions :: PkgSet -> PkgSet
 selectLatestVersions = Set.fromList . nubBy f2 . sortBy f1 . Set.toList
   where
-    f1 (Pkg n1 v1 _ _ _ _) (Pkg n2 v2 _ _ _ _)
+    f1 (Pkg n1 v1 _ _ _ _ _ _) (Pkg n2 v2 _ _ _ _ _ _)
       | n1 == n2  = compare v2 v1
       | otherwise = compare n1 n2
-    f2 (Pkg n1 _ _ _ _ _) (Pkg n2 _ _ _ _ _)
+    f2 (Pkg n1 _ _ _ _ _ _ _) (Pkg n2 _ _ _ _ _ _ _)
       = n1 == n2
 
 discoverUpdates :: PkgName -> PkgVersion -> Hackage4Nix [PkgVersion]
@@ -147,53 +131,54 @@
   hackage <- gets _hackageDb
   versionStrings <- io $ readDirectory (hackage </> name)
   let versions = map readVersion versionStrings
-  return [ showVersion v | v <- versions, v > readVersion vers ]
+  return (sort [ showVersion v | v <- versions, v > readVersion vers ])
 
 updateNixPkgs :: [FilePath] -> Hackage4Nix ()
 updateNixPkgs paths = do
   msgDebug $ "updating = " ++ show paths
   flip mapM_ paths $ \fileOrDir ->
     flip discoverNixFiles fileOrDir $ \file -> do
-      nix' <- io (BS.readFile file) >>= parseNixFile file
+      nix' <- io (readFile file) >>= parseNixFile file
       flip (maybe (return ())) nix' $ \nix -> do
-        let Pkg name vers sha plats maints path = nix
-            maints' = nub (sort (maints ++ ["andres","simons"]))
-            plats'
-              | null plats && not (null maints) = ["self.ghc.meta.platforms"]
-              | otherwise                       = plats
-        msgDebug ("re-generate " ++ path)
-        when (null maints) (msgInfo ("warning: no maintainers configured for " ++ path))
-        pkg <- readCabalFile name vers
-        io $ writeFile path (showNixPkg (cabal2nix pkg sha plats' maints'))
+        let Pkg name vers sha noHaddock plats maints path regenerate = nix
         modify $ \cfg -> cfg { _pkgset = Set.insert nix (_pkgset cfg) }
+        when regenerate $ do
+          msgDebug ("re-generate " ++ path)
+          let maints' = nub (sort (maints ++ ["andres","simons"]))
+              plats'
+                | null plats && not (null maints) = ["self.ghc.meta.platforms"]
+                | otherwise                       = plats
+          when (null maints) (msgInfo ("no maintainers configured for " ++ path))
+          pkg <- readCabalFile name vers
+          io $ writeFile path (showNixPkg (cabal2nix pkg sha noHaddock plats' maints'))
   pkgset <- gets (selectLatestVersions . _pkgset)
   updates' <- flip mapM (Set.elems pkgset) $ \pkg -> do
-    let Pkg name vers _ _ _ _ = pkg
+    let Pkg name vers _ _ _ _ _ _ = pkg
     updates <- discoverUpdates name vers
     return (pkg,updates)
   let updates = [ u | u@(_,(_:_)) <- updates' ]
   when (not (null updates)) $ do
     msgInfo "The following updates are available:"
     flip mapM_ updates $ \(pkg,versions) -> do
-      let Pkg name vers _ plats maints path = pkg
+      let Pkg name vers _ noHaddock plats maints path regenerate = pkg
       msgInfo ""
       msgInfo $ name ++ "-" ++ vers ++ ":"
       flip mapM_ versions $ \newVersion -> do
-        msgInfo $ "  " ++ genCabal2NixCmdline (Pkg name newVersion undefined plats maints path)
+        msgInfo $ "  " ++ genCabal2NixCmdline (Pkg name newVersion undefined noHaddock plats maints path regenerate)
   return ()
 
 genCabal2NixCmdline :: Pkg -> String
-genCabal2NixCmdline (Pkg name vers _ plats maints path) = unwords $ ["cabal2nix"] ++ opts ++ [">"++path']
+genCabal2NixCmdline (Pkg name vers _ noHaddock plats maints path _) = unwords $ ["cabal2nix"] ++ opts ++ [">"++path']
     where
-      opts = [cabal] ++ maints' ++ plats'
+      opts = [cabal] ++ maints' ++ plats' ++ if noHaddock then ["--no-haddock"] else []
       cabal = "cabal://" ++ name ++ "-" ++ vers
       maints' = [ "--maintainer=" ++ m | m <- maints ]
       plats'
-        | ["self.ghc.meta.platforms"] == plats     = []
-        | otherwise                                =  [ "--platform=" ++ p | p <- plats ]
+        | ["self.ghc.meta.platforms"] == plats = []
+        | otherwise                            =  [ "--platform=" ++ p | p <- plats ]
       path'
-        | pack path `regmatch` "/[0-9\\.]+\\.nix$" = replaceFileName path (vers <.> "nix")
-        | otherwise                                = path
+        | path =~ "/[0-9\\.]+\\.nix$" = replaceFileName path (vers <.> "nix")
+        | otherwise                   = path
 
 data CliOption = PrintHelp | Verbose | HackageDB FilePath
   deriving (Eq)
@@ -242,53 +227,48 @@
   flip evalStateT cfg (updateNixPkgs args)
 
 
+-- Packages that we cannot parse.
 
+badPackagePaths :: [FilePath]
+badPackagePaths = ["haskell-platform/2011.2.0.1.nix"]
+
 -- Packages that we cannot regenerate automatically yet. This list
 -- should be empty.
 
-badPackages :: [String]
-badPackages = [ "/"++p++"/" | p <- names ]
-  where names =
-          [ "alex"
-          , "cairo"
-          , "citeproc"
-          , "citeproc-hs"
-          , "editline"
-          , "flapjax"
-          , "ghc-events"
-          , "glade"
-          , "glib"
-          , "glut"
-          , "GLUT"
-          , "gtk"
-          , "gtksourceview2"
-          , "haddock"
-          , "haskell-platform"
-          , "haskell-src"
-          , "hfuse"
-          , "hmatrix"
-          , "hp2any-graph"
-          , "idris"
-          , "LambdaHack"
-          , "lhs2tex"
-          , "MazesOfMonad"
-          , "OpenAL"
-          , "OpenGL"
-          , "pango"
-          , "readline"
-          , "repa-examples"
-          , "scion"
-          , "SDL"
-          , "SDL-image"
-          , "SDL-mixer"
-          , "SDL-ttf"
-          , "svgcairo"
-          , "tar"
-          , "terminfo"
-          , "threadscope"
-          , "vacuum"
-          , "wxHaskell"
-          , "X11"
-          , "X11-xft"
-          , "xmobar"
-          ]
+patchedPackages :: [String]
+patchedPackages =
+   [ "alex"              -- undeclared dependencies
+   , "cairo"             -- undeclared dependencies
+   , "citeproc-hs"       -- undeclared dependencies
+   , "editline"          -- undeclared dependencies
+   , "glade"             -- undeclared dependencies
+   , "glib"              -- undeclared dependencies
+   , "epic"              -- undeclared dependencies
+   , "GLUT"              -- undeclared dependencies
+   , "gtk"               -- undeclared dependencies
+   , "gtksourceview2"    -- undeclared dependencies
+   , "haddock"           -- undeclared dependencies
+   , "haskell-src"       -- undeclared dependencies
+   , "hmatrix"           -- undeclared dependencies
+   , "hp2any-graph"      -- undeclared dependencies
+   , "lhs2tex"           -- undeclared dependencies
+   , "OpenAL"            -- undeclared dependencies
+   , "OpenGL"            -- undeclared dependencies
+   , "pango"             -- undeclared dependencies
+   , "idris"             -- undeclared dependencies
+   , "readline"          -- undeclared dependencies
+   , "repa-examples"     -- undeclared dependencies
+   , "scion"             -- expects non-existent networkBytestring
+   , "SDL"               -- undeclared dependencies
+   , "SDL-image"         -- undeclared dependencies
+   , "SDL-mixer"         -- undeclared dependencies
+   , "SDL-ttf"           -- undeclared dependencies
+   , "svgcairo"          -- undeclared dependencies
+   , "terminfo"          -- undeclared dependencies
+   , "xmonad"            -- undeclared dependencies
+   , "xmonad-extras"     -- undeclared dependencies
+   , "vacuum"            -- undeclared dependencies
+   , "wxcore"            -- undeclared dependencies
+   , "X11"               -- undeclared dependencies
+   , "X11-xft"           -- undeclared dependencies
+   ]
