diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+* 0.12.4 (2018-05-31)
+- now uses Hackage revisions of packages
+- spec --stream STREAM replaces --hackage
+- disable https for ghc < 7.10
+
 * 0.12.3 (2018-05-14)
 - build: remove erroneous tarball check
 - refresh: use cblrpm for old cabal-rpm
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
 [![Hackage](http://img.shields.io/hackage/v/cabal-rpm.png)](http://hackage.haskell.org/package/cabal-rpm)
 [![Stackage LTS](http://stackage.org/package/cabal-rpm/badge/lts)](http://stackage.org/lts/package/cabal-rpm)
 [![Stackage Nightly](http://stackage.org/package/cabal-rpm/badge/nightly)](http://stackage.org/nightly/package/cabal-rpm)
+[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cabal-rpm/Lobby?utm_source=badge&utm_medium=badge&utm_content=badge)
 
 # cabal-rpm
 
diff --git a/cabal-rpm.cabal b/cabal-rpm.cabal
--- a/cabal-rpm.cabal
+++ b/cabal-rpm.cabal
@@ -1,5 +1,5 @@
 Name:                cabal-rpm
-Version:             0.12.3
+Version:             0.12.4
 Synopsis:            RPM packaging tool for Haskell Cabal-based packages
 Description:
     This package provides a RPM packaging tool for Haskell Cabal-based packages.
@@ -10,7 +10,8 @@
     missing dependencies. The diff command compares the current spec file
     with a freshly generated one, the update command updates the spec file
     to latest version from Stackage or Hackage, and the refresh command updates
-    the spec file to the current cabal-rpm packaging.
+    the spec file to the current cabal-rpm packaging. It also handles Hackage
+    revisions of packages.
 Homepage:            https://github.com/juhp/cabal-rpm
 Bug-reports:         https://github.com/juhp/cabal-rpm/issues
 License:             GPL-3
@@ -25,7 +26,7 @@
 Cabal-version:       >=1.6
 Tested-with:         GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4,
                      GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2,
-                     GHC == 8.4.1
+                     GHC == 8.4.2
 
 source-repository head
   type:     git
@@ -36,7 +37,7 @@
   Default:       False
 
 Flag https
-  Description:   Use http to query Stackage
+  Description:   Use http to query Stackage (ghc >= 7.10)
   Default:       True
 
 Executable cabal-rpm
@@ -52,9 +53,9 @@
                       time >= 1.2 && < 1.5
     else
        Build-Depends: time >= 1.5 && < 1.9
-    if flag(https)
+    if impl(ghc >= 7.10) && flag(https)
        Build-Depends: bytestring,
-                      http-client,
+                      http-client >= 0.4.30,
                       http-client-tls,
                       http-conduit
        Cpp-options: -DHTTPS
diff --git a/src/Commands/Depends.hs b/src/Commands/Depends.hs
--- a/src/Commands/Depends.hs
+++ b/src/Commands/Depends.hs
@@ -28,6 +28,7 @@
 #endif
 import Control.Monad (filterM, unless, void)
 import Data.List (nub, sort, (\\))
+import System.FilePath ((<.>))
 
 data Depends = Depends | Requires | Missing
 
@@ -37,8 +38,8 @@
   case action of
     Depends -> do
       (deps, tools, clibs, pkgcfgs, _) <- dependencies pkgDesc
-      let clibs' = map (\ lib -> "lib" ++ lib ++ ".so") clibs
-      let pkgcfgs' = map (++ ".pc") pkgcfgs
+      let clibs' = map (\ lib -> "lib" ++ lib <.> "so") clibs
+      let pkgcfgs' = map (<.> "pc") pkgcfgs
       mapM_ putStrLn $ deps ++ tools ++ clibs' ++ pkgcfgs'
     Requires -> do
       (deps, tools, clibs, pkgcfgs, _) <- packageDependencies False pkgDesc
@@ -67,7 +68,7 @@
 
 missingDepsPkg :: String -> IO [String]
 missingDepsPkg pkg = do
-  pkgdata <- prepare quiet (Just pkg)
+  pkgdata <- prepare quiet (Just pkg) False
   missingPackages (packageDesc pkgdata) >>= filterM notAvail
 
 putMissing :: String -> [String] -> [String] -> IO ()
diff --git a/src/Commands/Diff.hs b/src/Commands/Diff.hs
--- a/src/Commands/Diff.hs
+++ b/src/Commands/Diff.hs
@@ -21,12 +21,12 @@
 import FileUtils (mktempdir, withCurrentDirectory)
 import Options (RpmFlags (..))
 import PackageUtils (PackageData (..), prepare)
-import SysCmd ((+-+), shell)
+import SysCmd ((+-+), die, shell)
 
 import Data.Maybe (isNothing)
-import Distribution.Simple.Utils (die)
 
 import System.Directory (removeDirectoryRecursive)
+import System.FilePath ((<.>))
 import System.Posix.Env (getEnvDefault)
 
 diff :: PackageData -> RpmFlags -> Maybe String -> IO ()
@@ -36,8 +36,8 @@
     Just spec -> do
       tmpdir <- mktempdir
       pd <- if isNothing mpkg then return pkgdata
-            else withCurrentDirectory tmpdir $ prepare flags mpkg
+            else withCurrentDirectory tmpdir $ prepare flags mpkg False
       speccblrpm <- createSpecFile pd flags (Just tmpdir)
       diffcmd <- getEnvDefault "CBLRPM_DIFF" "diff -u"
-      shell $ diffcmd +-+ spec +-+ speccblrpm +-+ "| sed -e s%" ++ speccblrpm ++ "%" ++ spec ++ ".cblrpm" ++ "%"
+      shell $ diffcmd +-+ spec +-+ speccblrpm +-+ "| sed -e s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"
       removeDirectoryRecursive tmpdir
diff --git a/src/Commands/Install.hs b/src/Commands/Install.hs
--- a/src/Commands/Install.hs
+++ b/src/Commands/Install.hs
@@ -29,7 +29,7 @@
 #endif
 import Control.Monad (filterM, unless, when)
 import System.Directory (doesFileExist)
-import System.FilePath ((</>))
+import System.FilePath ((</>), (<.>))
 
 install :: PackageData -> RpmFlags -> IO ()
 install pkgdata flags = do
@@ -42,7 +42,7 @@
   spec <- rpmBuild pkgdata flags Binary
   arch <- cmd "arch" []
   rpmdir <- cmd "rpm" ["--eval", "%{_rpmdir}"]
-  rpms <- map (\ p -> rpmdir </> arch </> p ++ ".rpm") . lines <$>
+  rpms <- map (\ p -> rpmdir </> arch </> p <.> "rpm") . lines <$>
           cmd "rpmspec" ["-q", spec]
   -- metapkgs don't have base package
   filterM doesFileExist rpms >>= rpmInstall
diff --git a/src/Commands/Refresh.hs b/src/Commands/Refresh.hs
--- a/src/Commands/Refresh.hs
+++ b/src/Commands/Refresh.hs
@@ -21,7 +21,7 @@
 import Options (RpmFlags (..))
 import PackageUtils (PackageData (..), cabal_, isGitDir, patchSpec,
                      removePrefix)
-import SysCmd (cmd, cmd_, grep_, notNull, optionalProgram)
+import SysCmd (cmd, cmd_, die, grep_, notNull, optionalProgram)
 
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2))
 #else
@@ -30,12 +30,11 @@
 import Control.Monad (unless, when)
 import Data.List (isPrefixOf)
 import Data.Version (showVersion)
-import Distribution.Simple.Utils (die)
 import System.Directory (copyFile, createDirectoryIfMissing, doesFileExist,
                          getCurrentDirectory, setCurrentDirectory)
 import System.Environment (getEnv)
 --import System.Exit (exitSuccess)
-import System.FilePath ((</>))
+import System.FilePath ((</>), (<.>))
 
 refresh :: PackageData -> RpmFlags -> IO ()
 refresh pkgdata flags =
@@ -67,7 +66,7 @@
     createOldSpec :: String -> FilePath -> IO FilePath
     createOldSpec crVer spec = do
       cblrpmVersion crVer
-      let backup = spec ++ ".cblrpm"
+      let backup = spec <.> "cblrpm"
           backup' = backup ++ "-" ++ crVer
       cmd_ "mv" [backup, backup']
       return backup'
diff --git a/src/Commands/RpmBuild.hs b/src/Commands/RpmBuild.hs
--- a/src/Commands/RpmBuild.hs
+++ b/src/Commands/RpmBuild.hs
@@ -22,9 +22,9 @@
 import Commands.Spec (createSpecFile)
 import Dependencies (pkgInstallMissing)
 import Options (RpmFlags (..))
-import PackageUtils (copyTarball, PackageData (..), packageName,
+import PackageUtils (bringTarball, PackageData (..), packageName,
                      packageVersion, rpmbuild, RpmStage (..))
-import SysCmd (cmd, (+-+))
+import SysCmd ((+-+))
 
 --import Control.Exception (bracket)
 import Control.Monad    (unless, void, when)
@@ -58,12 +58,10 @@
     pkgInstallMissing pkgdata False
 
   unless (stage == BuildDep) $ do
-    srcdir <- cmd "rpm" ["--eval", "%{_sourcedir}"]
     let version = packageVersion pkg
-
-    copyTarball name version False srcdir
-
+    bringTarball (name ++ "-" ++ version) False
     rpmbuild stage False Nothing specFile
+
   return specFile
 
 rpmBuild_ :: PackageData -> RpmFlags -> RpmStage -> IO ()
diff --git a/src/Commands/Spec.hs b/src/Commands/Spec.hs
--- a/src/Commands/Spec.hs
+++ b/src/Commands/Spec.hs
@@ -24,8 +24,8 @@
                      showDep, subPackages, testsuiteDependencies)
 import Distro (Distro(..), detectDistro)
 import Options (RpmFlags (..))
-import PackageUtils (copyTarball, getPkgName, latestPackage,
-                     nameVersion, PackageData (..), packageName,
+import PackageUtils (bringTarball, getPkgName, latestPackage,
+                     PackageData (..), packageName,
                      packageVersion, stripPkgDevel)
 import SysCmd ((+-+), notNull)
 
@@ -37,7 +37,7 @@
 import Data.Char        (toUpper)
 import Data.List        (groupBy, intercalate, intersect, isPrefixOf,
                          nub, sort, (\\))
-import Data.Maybe       (fromMaybe, fromJust)
+import Data.Maybe       (isJust, fromMaybe, fromJust)
 import Data.Time.Clock  (getCurrentTime)
 import Data.Time.Format (formatTime)
 import qualified Data.Version (showVersion)
@@ -78,7 +78,7 @@
 #else
 import System.Locale (defaultTimeLocale)
 #endif
-import System.FilePath (takeBaseName, (</>))
+import System.FilePath (takeBaseName, (</>), (<.>))
 
 import qualified Paths_cabal_rpm (version)
 
@@ -116,7 +116,7 @@
       basename | binlib = "%{pkg_name}"
                | hasExecPkg = name
                | otherwise = "ghc-%{pkg_name}"
-      specFile = fromMaybe "" mdest </> pkgname ++ ".spec"
+      specFile = fromMaybe "" mdest </> pkgname <.> "spec"
       hasExecPkg = binlib || (hasExec && not hasLib)
   -- run commands before opening file to prevent empty file on error
   -- maybe shell commands should be in a monad or something
@@ -223,7 +223,7 @@
   let version = packageVersion pkg
       defRelease = defaultRelease distro
       release = fromMaybe defRelease (rpmRelease flags)
-      revision = show $ maybe (0::Int) read (lookup "x-revision" (customFieldsPD pkgDesc))
+      revision = lookup "x-revision" (customFieldsPD pkgDesc)
   putHdr "Name" (if binlib then "%{pkg_name}" else basename)
   putHdr "Version" version
   when hasSubpkgs $
@@ -244,10 +244,8 @@
   putHdr "Url" $ "https://hackage.haskell.org/package" </> pkg_name
   putHdr "Source0" $ sourceUrl pkgver
   mapM_ (\ (n,p) -> putHdr ("Source" ++ n) (sourceUrl p)) $ number subpkgs
-  when (revision /= "0") $
-    if distro == SUSE
-    then putHdr "Source1" $ "https://hackage.haskell.org/package" </> pkgver </> "revision" </> revision ++ ".cabal#" </> pkg_name ++ ".cabal"
-    else putStrLn "Warning: this is a revised .cabal file"
+  when (isJust revision) $
+    putHdr "Source1" $ "https://hackage.haskell.org/package" </> pkgver </> pkg_name <.> "cabal" ++ "#" </> pkgver <.> "cabal"
   case distro of
     Fedora -> return ()
     _ -> putHdr "BuildRoot" "%{_tmppath}/%{name}-%{version}-build"
@@ -334,8 +332,8 @@
   put "%prep"
   put $ "%setup -q" ++ (if pkgname /= name then " -n" +-+ pkgver else "") +-+
     (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpkgs) else  "")
-  when (distro == SUSE && revision /= "0") $
-    put $ "cp -p %{SOURCE1}" +-+ pkg_name ++ ".cabal"
+  when (isJust revision) $
+    put $ "cp -p %{SOURCE1}" +-+ pkg_name <.> "cabal"
   sectionNewline
 
   put "%build"
@@ -491,7 +489,7 @@
 #endif
 
 sourceUrl :: String -> String
-sourceUrl pv = "https://hackage.haskell.org/package" </> pv </> pv ++ ".tar.gz"
+sourceUrl pv = "https://hackage.haskell.org/package" </> pv </> pv <.> ".tar.gz"
 
 -- http://rosettacode.org/wiki/Word_wrap#Haskell
 wordwrap :: Int -> String -> String
@@ -519,9 +517,8 @@
 getsubpkgMacro :: RpmFlags -> String -> IO (String, String)
 getsubpkgMacro flags pkg = do
   let name = filter (/= '-') pkg
-  pkgver <- latestPackage (rpmHackage flags) pkg
-  let (n,v) = nameVersion pkgver
-  copyTarball n v False "."
+  pkgver <- latestPackage (rpmStream flags) pkg
+  bringTarball pkgver False
   return (name, pkgver)
 
 number :: [a] -> [(String,a)]
diff --git a/src/Commands/Update.hs b/src/Commands/Update.hs
--- a/src/Commands/Update.hs
+++ b/src/Commands/Update.hs
@@ -20,61 +20,68 @@
 import Distro (detectDistro, Distro(..))
 import FileUtils (withTempDirectory)
 import Options (RpmFlags (..))
-import PackageUtils (PackageData (..), bringTarball, isGitDir, latestPackage,
-                     packageName, packageVersion, patchSpec, prepare,
-                     removePrefix)
-import SysCmd (cmd_, grep_, (+-+))
+import PackageUtils (PackageData (..), bringTarball, getRevisedCabal, isGitDir,
+                     latestPackage, packageName, packageVersion, patchSpec,
+                     prepare, removePrefix)
+import SysCmd (cmd_, die, grep_, (+-+))
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2))
 #else
 import Control.Applicative ((<$>))
 #endif
 import Control.Monad (unless, when)
+import Data.Maybe (isJust)
 import Distribution.PackageDescription (PackageDescription (..))
-import Distribution.Simple.Utils (die)
-import Data.Maybe (fromMaybe)
 import System.Directory (createDirectory, getCurrentDirectory,
                          setCurrentDirectory)
+import System.FilePath ((<.>))
 
 update :: PackageData -> RpmFlags -> Maybe String -> IO ()
 update pkgdata flags mpkgver =
   case specFilename pkgdata of
     Nothing -> die "No (unique) .spec file in directory."
     Just spec -> do
-      let pkg = package $ packageDesc pkgdata
+      let pkgDesc = packageDesc pkgdata
+          pkg = package pkgDesc
           name = packageName pkg
           ver = packageVersion pkg
           current = name ++ "-" ++ ver
+          revised = isJust $ lookup "x-revision" (customFieldsPD pkgDesc)
       latest <- case mpkgver of
                   Just pv -> return pv
-                  Nothing -> latestPackage (rpmHackage flags) name
-      if current == latest
-        then putStrLn $ current +-+ "is already latest version."
-        else do
-        bringTarball latest
+                  Nothing -> latestPackage (rpmStream flags) name
+      let updated = current /= latest
+      getRevisedCabal latest
+      unless updated $
+        putStrLn $ current +-+ "is already latest version."
+      when (not revised || updated) $ do
         gitDir <- getCurrentDirectory >>= isGitDir
         rwGit <- if gitDir then grep_ "url = ssh://" ".git/config" else return False
-        when rwGit $
-            cmd_ "fedpkg" ["new-sources", latest ++ ".tar.gz"]
+        when updated $ do
+          bringTarball latest False
+          when rwGit $
+            cmd_ "fedpkg" ["new-sources", latest <.> "tar.gz"]
         withTempDirectory $ \cwd -> do
-          curspec <- createSpecVersion current spec
-          newspec <- createSpecVersion latest spec
+          curspec <- createSpecVersion current spec revised
+          newspec <- createSpecVersion latest spec True
           patchSpec (Just cwd) curspec newspec
           setCurrentDirectory cwd
           distro <- maybe detectDistro return (rpmDistribution flags)
           let suffix = if distro == SUSE then "" else "%{?dist}"
           subpkg <- grep_ "%{subpkgs}" spec
-          unless (subpkg || rpmSubpackage flags) $
+          unless (subpkg || rpmSubpackage flags || not updated) $
             cmd_ "sed" ["-i", "-e s/^\\(Release:        \\).*/\\10" ++ suffix ++ "/", spec]
-          let newver = removePrefix (name ++ "-") latest
-          if distro == SUSE
-            then cmd_ "sed" ["-i", "-e s/^\\(Version:        \\).*/\\1" ++ newver ++ "/", spec]
-            else cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ newver, spec]
-          when rwGit $
-            cmd_ "git" ["commit", "-a", "-m", "update to" +-+ newver]
+          when updated $ do
+            let newver = removePrefix (name ++ "-") latest
+            if distro == SUSE
+              then cmd_ "sed" ["-i", "-e s/^\\(Version:        \\).*/\\1" ++ newver ++ "/", spec]
+              else cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ newver, spec]
+            when rwGit $
+              cmd_ "git" ["commit", "-a", "-m", "update to" +-+ newver]
   where
-    createSpecVersion :: String -> String -> IO FilePath
-    createSpecVersion ver spec = do
-      pkgdata' <- prepare flags (Just ver)
+    createSpecVersion :: String -> String -> Bool -> IO FilePath
+    createSpecVersion pkgver spec revise = do
+      pkgdata' <- prepare flags (Just pkgver) revise
       let pkgdata'' = pkgdata' { specFilename = Just spec }
-      createDirectory ver
-      createSpecFile pkgdata'' flags (Just ver)
+          dir = pkgver <.> if revise then "" else "orig"
+      createDirectory dir
+      createSpecFile pkgdata'' flags (Just dir)
diff --git a/src/Dependencies.hs b/src/Dependencies.hs
--- a/src/Dependencies.hs
+++ b/src/Dependencies.hs
@@ -65,6 +65,7 @@
 #endif
                                         )
 import System.Directory (doesDirectoryExist, doesFileExist)
+import System.FilePath ((<.>))
 import System.IO (hPutStrLn, stderr)
 import System.Posix.User (getEffectiveUserID)
 
@@ -125,7 +126,7 @@
 resolveLib lib = do
   lib64 <- doesDirectoryExist "/usr/lib64"
   let libsuffix = if lib64 then "64" else ""
-  let lib_path = "/usr/lib" ++ libsuffix ++ "/lib" ++ lib ++ ".so"
+  let lib_path = "/usr/lib" ++ libsuffix ++ "/lib" ++ lib <.> "so"
   libInst <- doesFileExist lib_path
   if libInst
     then rpmqueryFile Rpm lib_path
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -32,7 +32,7 @@
 main :: IO ()
 main = do
   (opts, cmd, mpkg) <- getArgs >>= parseArgs
-  pkgdata <- prepare opts mpkg
+  pkgdata <- prepare opts mpkg False
   case cmd of
     "spec"        -> createSpecFile_ pkgdata opts Nothing
     "srpm"        -> rpmBuild_ pkgdata opts Source
@@ -48,7 +48,7 @@
     "missingdeps" -> depends pkgdata Missing
     "update"      -> update pkgdata opts mpkg
     "rpm"         -> do
-      putStrLn "* Warning the 'rpm' command has been renamed to 'local':"
+      putStrLn "* Warning the 'rpm' command has been renamed to 'build':"
       putStrLn "* this alias may be removed in a future release."
       rpmBuild_ pkgdata opts Binary
     c -> error $ "Unknown cmd: " ++ c
diff --git a/src/Options.hs b/src/Options.hs
--- a/src/Options.hs
+++ b/src/Options.hs
@@ -56,7 +56,7 @@
     , rpmBinary              :: Bool
     , rpmStrict              :: Bool
     , rpmSubpackage          :: Bool
-    , rpmHackage             :: Bool
+    , rpmStream              :: Maybe String
     , rpmMissing             :: Bool
     , rpmRelease             :: Maybe String
     , rpmCompilerId          :: Maybe CompilerId
@@ -74,7 +74,7 @@
     , rpmBinary = False
     , rpmStrict = False
     , rpmSubpackage = False
-    , rpmHackage = False
+    , rpmStream = Nothing
     , rpmMissing = False
     , rpmRelease = Nothing
     , rpmCompilerId = Nothing
@@ -94,8 +94,8 @@
     "Force Haskell package name to be base package name"
   , Option "" ["force"] (NoArg (\x -> x { rpmForce = True }))
     "Overwrite existing spec file."
-  , Option "" ["hackage"] (NoArg (\x -> x { rpmHackage = True }))
-    "Use Hackage to get package version instead of Stackage."
+  , Option "s" ["stream"] (ReqArg (\s x -> x { rpmStream = Just s }) "STREAM")
+    "Stackage stream (default 'lts') or 'hackage' used to get package version."
   , Option "" ["missing"] (NoArg (\x -> x { rpmMissing = True }))
     "Comment out missing BuildRequires packages."
   , Option "" ["strict"] (NoArg (\x -> x { rpmStrict = True }))
diff --git a/src/PackageUtils.hs b/src/PackageUtils.hs
--- a/src/PackageUtils.hs
+++ b/src/PackageUtils.hs
@@ -16,7 +16,7 @@
 module PackageUtils (
   bringTarball,
   cabal_,
-  copyTarball,
+  getRevisedCabal,
   getPkgName,
   isGitDir,
   latestPackage,
@@ -37,10 +37,10 @@
   ) where
 
 import FileUtils (filesWithExtension, fileWithExtension,
-                  getDirectoryContents_, mktempdir)
+                  getDirectoryContents_, mktempdir, withTempDirectory)
 import Options (RpmFlags (..))
-import SysCmd (cmd, cmd_, cmdIgnoreErr, cmdSilent, (+-+),
-               optionalProgram, requireProgram, sudo)
+import SysCmd (cmd, cmd_, cmdIgnoreErr, cmdSilent, die, (+-+),
+               grep_, optionalProgram, requireProgram, sudo)
 
 import Stackage (latestStackage)
 
@@ -68,9 +68,16 @@
                                        , mkFlagAssignment
 #endif
                                        )
+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+import Distribution.PackageDescription.Configuration (finalizePD)
+import Distribution.Types.ComponentRequestedSpec (defaultComponentRequestedSpec)
+#else
 import Distribution.PackageDescription.Configuration (finalizePackageDescription)
+#endif
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
 import Distribution.PackageDescription.Parsec (readGenericPackageDescription)
+#elif defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+import Distribution.PackageDescription.Parse (readGenericPackageDescription)
 #else
 import Distribution.PackageDescription.Parse (readPackageDescription)
 #endif
@@ -89,12 +96,16 @@
     configCompiler
 #endif
     )
+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+import Distribution.Simple.Program   (defaultProgramDb)
+#else
 import Distribution.Simple.Program   (defaultProgramConfiguration)
-import Distribution.Simple.Utils (die
+#endif
+import Distribution.Simple.Utils (
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)
-    , tryFindPackageDesc
+    tryFindPackageDesc
 #else
-    , findPackageDesc
+    findPackageDesc
 #endif
     )
 
@@ -129,10 +140,12 @@
                          -> IO (PackageDescription, [FilePath], [FilePath])
 simplePackageDescription cabalfile opts = do
   let verbose = rpmVerbosity opts
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
 #else
   let readGenericPackageDescription = readPackageDescription
+      defaultProgramDb = defaultProgramConfiguration
 #endif
+
   genPkgDesc <- readGenericPackageDescription verbose cabalfile
   compiler <- case rpmCompilerId opts of
                 Just cid -> return
@@ -147,7 +160,7 @@
 #else
                               (compiler, _) <- configCompiler
 #endif
-                                (Just GHC) Nothing Nothing defaultProgramConfiguration verbose
+                                (Just GHC) Nothing Nothing defaultProgramDb verbose
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,22,0)
                               return (compilerInfo compiler)
 #else
@@ -157,6 +170,9 @@
 #else
   let mkFlagAssignment = id
 #endif
+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+  let finalizePackageDescription flags = finalizePD flags defaultComponentRequestedSpec
+#endif
   case finalizePackageDescription (mkFlagAssignment $ rpmConfigurationsFlags opts)
        (const True) (Platform buildArch buildOS)
        compiler
@@ -166,6 +182,7 @@
       (docs, licensefiles) <- findDocsLicenses (dropFileName cabalfile) pd
       return (pd, docs, licensefiles)
 
+
 findDocsLicenses :: FilePath -> PackageDescription -> IO ([FilePath], [FilePath])
 findDocsLicenses dir pkgDesc = do
   contents <- getDirectoryContents dir
@@ -191,8 +208,8 @@
 tryFindPackageDesc = findPackageDesc
 #endif
 
-cabalFromSpec :: FilePath -> IO (FilePath, Maybe FilePath)
-cabalFromSpec specFile = do
+cabalFromSpec :: FilePath -> Bool -> IO (FilePath, Maybe FilePath)
+cabalFromSpec specFile revise = do
   -- no rpmspec command in RHEL 5 and 6
   namever <- removePrefix "ghc-" . head . lines <$> cmd "rpm" ["-q", "--qf", "%{name}-%{version}\n", "--specfile", specFile]
   dExists <- doesDirectoryExist namever
@@ -201,28 +218,75 @@
     specTime <- modificationTime <$> getFileStatus specFile
     dirTime <- accessTime <$> getFileStatus namever
     when (specTime > dirTime) $ do
-      bringTarball namever
+      bringTarball namever revise
       rpmbuild Prep True Nothing specFile
     cabalfile <- tryFindPackageDesc namever
     return (cabalfile, Nothing)
     else do
     tmpdir <- mktempdir
-    bringTarball namever
+    bringTarball namever revise
     rpmbuild Prep True (Just tmpdir) specFile
     cabalfile <- tryFindPackageDesc $ tmpdir </> namever
     return (cabalfile, Just tmpdir)
 
-bringTarball :: FilePath -> IO ()
-bringTarball nv = do
-  srcdir <- do
+bringTarball :: FilePath -> Bool -> IO ()
+bringTarball nv revise = do
+  srcdir <- getSourceDir
+  fExists <- doesFileExist $ srcdir </> tarfile
+  unless fExists $
+    copyTarball False srcdir
+ where
+  tarfile = nv <.> "tar.gz"
+
+  copyTarball :: Bool -> FilePath -> IO ()
+  copyTarball ranFetch dir = do
+    let dest = dir </> tarfile
+    cabalUpdate
+    home <- getEnv "HOME"
+    let cacheparent = home </> ".cabal" </> "packages"
+        (n,v) = nameVersion nv
+    haveLocalCabal <- doesFileExist $ dir </> nv <.> "cabal"
+    when (not haveLocalCabal && revise) $
+      getRevisedCabal nv
+    already <- doesFileExist dest
+    unless already $ do
+      remotes <- getDirectoryContents_ cacheparent
+
+      let tarpath = n </> v </> tarfile
+          paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes
+      -- if more than one tarball, should maybe warn if they are different
+      tarballs <- filterM doesFileExist paths
+      if null tarballs
+        then if ranFetch
+             then error $ "No" +-+ tarfile +-+ "found"
+             else do
+             cabal_ "fetch" ["-v0", "--no-dependencies", nv]
+             copyTarball True dir
+        else do
+        createDirectoryIfMissing True dir
+        copyFile (head tarballs) dest
+        -- cabal-1.18 fetch creates tarballs with mode 0600
+        stat <- getFileStatus dest
+        when (fileMode stat /= 0o100644) $
+          setFileMode dest 0o0644
+
+getSourceDir :: IO FilePath
+getSourceDir = do
     cwd <- getCurrentDirectory
     git <- isGitDir cwd
     if git then return cwd else cmd "rpm" ["--eval", "%{_sourcedir}"]
-  fExists <- doesFileExist $ srcdir </> nv <.> "tar.gz"
-  unless fExists $
-    let (n, v) = nameVersion nv in
-    copyTarball n v False srcdir
 
+getRevisedCabal :: String -> IO ()
+getRevisedCabal nv = do
+  let (n,_) = nameVersion nv
+      file = n <.> "cabal"
+  dir <- getSourceDir
+  withTempDirectory $ \ _ -> do
+    cmd_ "wget" ["--quiet", "https://hackage.haskell.org/package" </> nv </> file]
+    revised <- grep_ "x-revision" file
+    when revised $
+      cmd_ "mv" [file, dir </> nv <.> "cabal"]
+
 nameVersion :: String -> (String, String)
 nameVersion nv =
   if '-' `notElem` nv
@@ -285,8 +349,8 @@
   cabalUpdate
   cmd_ "cabal" (c:args)
 
-tryUnpack :: String -> IO (FilePath, Maybe FilePath)
-tryUnpack pkgver = do
+tryUnpack :: String -> Bool -> IO (FilePath, Maybe FilePath)
+tryUnpack pkgver revise = do
   isdir <- doesDirectoryExist pkgver
   if isdir
     then do
@@ -296,20 +360,18 @@
     cwd <- getCurrentDirectory
     tmpdir <- mktempdir
     setCurrentDirectory tmpdir
-    cabal_ "unpack" ["-v0", pkgver]
+    cabal_ "unpack" $ ["-v0"] ++ ["--pristine" | not revise] ++ [pkgver]
     pth <- tryFindPackageDesc pkgver
     setCurrentDirectory cwd
     return (tmpdir </> pth, Just tmpdir)
 
-latestPackage :: Bool -> String -> IO String
-latestPackage hackage pkg =
-  if hackage
-    then latestHackage pkg
-    else do
-    stk <- latestStackage pkg
-    case stk of
-      Just pv -> return pv
-      Nothing -> latestHackage pkg
+latestPackage :: Maybe String -> String -> IO String
+latestPackage (Just "hackage") pkg = latestHackage pkg
+latestPackage mstr pkg = do
+  stk <- latestStackage mstr pkg
+  case stk of
+    Just pv -> return pv
+    Nothing -> latestHackage pkg
 
 latestHackage :: String -> IO String
 latestHackage pkg = do
@@ -394,34 +456,6 @@
 --   exists <- doesFileExist specfile
 --   return (specfile, exists)
 
-copyTarball :: String -> String -> Bool -> FilePath -> IO ()
-copyTarball n v ranFetch dir = do
-  let tarfile = n ++ "-" ++ v <.> "tar.gz"
-      dest = dir </> tarfile
-  already <- doesFileExist dest
-  unless already $ do
-    cabalUpdate
-    home <- getEnv "HOME"
-    let cacheparent = home </> ".cabal" </> "packages"
-        tarpath = n </> v </> tarfile
-    remotes <- getDirectoryContents_ cacheparent
-    let paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes
-    -- if more than one tarball, should maybe warn if they are different
-    tarballs <- filterM doesFileExist paths
-    if null tarballs
-      then if ranFetch
-           then error $ "No" +-+ tarfile +-+ "found"
-           else do
-             cabal_ "fetch" ["-v0", "--no-dependencies", n ++ "-" ++ v]
-             copyTarball n v True dir
-      else do
-        createDirectoryIfMissing True dir
-        copyFile (head tarballs) dest
-        -- cabal-1.18 fetch creates tarballs with mode 0600
-        stat <- getFileStatus dest
-        when (fileMode stat /= 0o100644) $
-          setFileMode dest 0o0644
-
 data PackageData =
   PackageData { specFilename :: Maybe FilePath
               , docFilenames :: [FilePath]
@@ -431,13 +465,13 @@
 
 -- Nothing implies existing packaging in cwd
 -- Something implies either new packaging or some existing spec file in dir
-prepare :: RpmFlags -> Maybe String -> IO PackageData
-prepare flags mpkgver = do
+prepare :: RpmFlags -> Maybe String -> Bool -> IO PackageData
+prepare flags mpkgver revise = do
   let mpkg = stripVersion <$> mpkgver
   mspec <- checkForSpecFile mpkg
   case mspec of
     Just spec -> do
-      (cabalfile, mtmp) <- cabalFromSpec spec
+      (cabalfile, mtmp) <- cabalFromSpec spec revise
       (pkgDesc, docs, licenses) <- simplePackageDescription cabalfile flags
       maybe (return ()) removeDirectoryRecursive mtmp
       return $ PackageData mspec docs licenses pkgDesc
@@ -445,7 +479,7 @@
       case mpkgver of
         Nothing -> do
           cwd <- getCurrentDirectory
-          prepare flags (Just $ takeFileName cwd)
+          prepare flags (Just $ takeFileName cwd) revise
         Just pkgmver -> do
           mcabal <- checkForCabalFile pkgmver
           case mcabal of
@@ -454,9 +488,9 @@
               return $ PackageData Nothing docs licenses pkgDesc
             Nothing -> do
               pkgver <- if stripVersion pkgmver == pkgmver
-                        then latestPackage (rpmHackage flags) pkgmver
+                        then latestPackage (rpmStream flags) pkgmver
                         else return pkgmver
-              (cabalfile, mtmp) <- tryUnpack pkgver
+              (cabalfile, mtmp) <- tryUnpack pkgver revise
               (pkgDesc, docs, licenses) <- simplePackageDescription cabalfile flags
               maybe (return ()) removeDirectoryRecursive mtmp
               return $ PackageData Nothing docs licenses pkgDesc
diff --git a/src/Stackage.hs b/src/Stackage.hs
--- a/src/Stackage.hs
+++ b/src/Stackage.hs
@@ -20,16 +20,16 @@
   ) where
 
 
-import Control.Monad (when)
-import Data.Maybe (isJust, fromJust)
+import Control.Monad (when, unless)
+import Data.Maybe (isJust, fromJust, fromMaybe)
+import Data.List (isPrefixOf)
 
 #ifdef HTTPS
 import qualified Data.ByteString.Char8 as B
-import Data.List
-import Data.Maybe
+import Data.Maybe (mapMaybe)
 import Network.HTTP.Client
 import Network.HTTP.Client.TLS
-import System.FilePath
+import System.FilePath (takeFileName)
 import SysCmd ((+-+))
 #else
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2))
@@ -68,11 +68,12 @@
     return Nothing
 #endif
 
-latestStackage :: String -> IO (Maybe String)
-latestStackage pkg = do
-  let stream = "lts"
+latestStackage :: Maybe String -> String -> IO (Maybe String)
+latestStackage mstr pkg = do
+  let stream = fromMaybe "lts" mstr
+  unless (any (`isPrefixOf` stream) ["nightly", "lts"]) $
+    putStrLn $ "Unknown Stackage stream:" +-+ stream
   mpkg <- stackageList stream pkg
   when (isJust mpkg) $
     putStrLn $ fromJust mpkg +-+ "in Stackage" +-+ stream
   return mpkg
-
diff --git a/src/SysCmd.hs b/src/SysCmd.hs
--- a/src/SysCmd.hs
+++ b/src/SysCmd.hs
@@ -22,6 +22,7 @@
   cmdMaybe,
   cmdQuiet,
   cmdSilent,
+  die,
   grep_,
   notNull,
   optionalProgram,
@@ -41,7 +42,11 @@
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,18,0)
 import Distribution.Simple.Program.Find (defaultProgramSearchPath,
                                          findProgramOnSearchPath)
+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+import Distribution.Simple.Utils (dieNoVerbosity)
+#else
 import Distribution.Simple.Utils (die)
+#endif
 #else
 import Distribution.Simple.Utils (die, findProgramLocation)
 #endif
@@ -49,6 +54,11 @@
 
 import System.Process (readProcess, readProcessWithExitCode, rawSystem)
 import System.Exit (ExitCode(..))
+
+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+die :: String -> IO a
+die = dieNoVerbosity
+#endif
 
 findProgram :: FilePath -> IO (Maybe FilePath)
 findProgram =
