diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,26 @@
+# 2.0.6 (2020-06-28) Fedora 33
+- spec: use packager's name in %changelog
+- spec: default package versions to Stackage LTS 16
+- spec now also leaves newly prepped source tree around
+- spec: handle testsuite tool deps separately
+- spec, refresh, update: more care about whether to revise or not
+- diff: ignore release field
+- prep: be quiet
+- spec: add a comment for missing testsuite deps
+- only allow specifying major Stackage LTS versions (not minor):
+  for more progressive updating logic (lts-n -> lts-(n+1) -> nightly -> Hackage)
+- spec: don't warn "spec exists" explicitly
+- spec: take specified stream into account for subpackaging
+- update: finally run prep to check update okay
+- prep/srpm --verbose and local --quiet options
+- spec: move chmod for docs to %prep
+- spec: check existing .spec file for detecting dropped deps and executable deps
+- update: also commit revised .cabal file when no update
+- fix copying of cached tarballs (longstanding defect)
+
 # 2.0.5.1 (2020-06-11)
 - spec: fix grep breakage in 2.0.5 release
-- spec, refresh and update now leave newly prepped source tree around
+- refresh and update now leave newly prepped source tree around
 - spec: dropped deprecated %post and %postun scriptlets
 
 # 2.0.5 (2020-06-10)
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -4,8 +4,6 @@
 	pandoc -s -t man $< > $@
 
 stack-all:
-	stack --resolver nightly --stack-yaml stack-ghc810.yaml build
-	@echo
 	stack --resolver nightly build
 	@echo
 	stack --resolver lts build
@@ -21,7 +19,3 @@
 	stack --resolver lts-11 --stack-yaml stack-lts11.yaml build
 	@echo
 	stack --resolver lts-10 --stack-yaml stack-lts11.yaml build
-	@echo
-	stack --resolver lts-9 --stack-yaml stack-lts9.yaml build
-	@echo
-	stack --resolver lts-8 --stack-yaml stack-lts9.yaml build
diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,17 +1,19 @@
+- installmissing' only installs libs
+- cblrpm local gi-ibus fails looking for ghc-haskell-gi-overloading-prof
+  - need unified handling of deps
+- depsort subpkgs
+- check for cabal-install
 - read cabal-tweak-flag for correct deps
-- spec: use user's email
+
 - spec --force does not work (file busy)
 - use tmp workspace for duration of executation to reference prep(are) etc
-- guess user email address
 - lts downgrades for older branches
 - support internal libs: eg dns-internal
 - fix lts package version check to ignore old snapshot results (eg old nightly)
 - diff misses flags in subpackages: eg skylighting-core
-- cabal-tweak-drop-dep "ignored" by update etc
 - switch to v2 commands
 - subpackage deps for testsuite: eg QuickCheck's splitmix
 - if not revised then update .orig should not be revised
-- revised not revise! (always assume revise)
 - use .Cblrpm/ for refresh?
 - delete unrevised .cabal?
 - changelog for subpkg bumps
@@ -28,20 +30,15 @@
   - refresh: avoid checking subpackaging versions
   - spec: fixed/static subpackage versions (when checking for their deps)
 - spec: cdeps for subpackages (example package?)
-- tests tools dep going into deps (eg hspec-discover for network)
 
 - for bin package --subpackage should add Prof deps for Devel deps
   (testcase: git-annex subpackage needs base-prof etc)
 
 - local --stream: ignores stream
 
-- hsp fragile - catch failure with clearer error
-
 * builddep repeats looking for versions of missing packages
   https://github.com/juhp/cabal-rpm/issues/60
 
-- `cblrpm update -s lts` runs cabal update, even when already latest!
-
 * switch to Cabal 2 for better License handling
 
 * drop dummy deps like fail, bytestring-builder and mtl-compat
@@ -50,20 +47,17 @@
 
 - add rpmlint command
 
-- only "cabal update" when needed
-
 - support --without-prof and --without-haddock
 
 - merge refresh and update specs generation
 
 - spec --bounds
 - rework "BR: ghc-*-static" with %{?_isa}
-- move Main to app?
 - check for cabal executable
 - revisions of subpackages
 - use Set for deps?
 
-wrote the complete spec file atomically
+write the complete spec file atomically
 
 ## Misc
 ? run "cabal update" if package-version not found
@@ -100,7 +94,6 @@
 - warm about new missing deps
 - reverse deps and rebuilds
 - update subpkg sources
-- depsort sources
 
 ## depends
 - dependency graphs or sorted recursive deps
@@ -117,4 +110,3 @@
 - ignore whitespace option
 - diff two versions
 - --ignore
-- --ignore-common (Release:, etc)
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:             2.0.5.1
+Version:             2.0.6
 Synopsis:            RPM packaging tool for Haskell Cabal-based packages
 Description:
     This package provides a RPM packaging tool for Haskell Cabal-based packages.
@@ -45,6 +45,7 @@
     Build-depends: base < 5,
                    Cabal > 1.10 && < 3.3,
                    directory,
+                   extra,
                    filepath,
                    optparse-applicative,
                    process,
diff --git a/src/Commands/Diff.hs b/src/Commands/Diff.hs
--- a/src/Commands/Diff.hs
+++ b/src/Commands/Diff.hs
@@ -21,17 +21,18 @@
 
 import Commands.Spec (createSpecFile)
 import FileUtils (mktempdir)
-import PackageUtils (PackageData (..), prepare)
-import SysCmd (die, optionalProgram)
+import PackageUtils (dropChangelog, editSpecField, getSpecField,
+                     PackageData (..), prepare)
+import SysCmd (die)
 import Types
 
-import SimpleCmd (grep_, pipe_, pipe3_)
-
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
 #else
 import Control.Applicative ((<$>))
 #endif
+import Control.Monad
 import Distribution.Verbosity (silent)
+import SimpleCmd (grep_, pipe)
 import System.Directory (removeDirectoryRecursive)
 import System.FilePath ((<.>))
 import System.Posix.Env (getEnvDefault)
@@ -44,15 +45,13 @@
     Just spec -> do
       subpkg <- grep_ "%{subpkgs}" spec
       tmpdir <- mktempdir
-      speccblrpm <- createSpecFile False silent flags False False pkgtype (if subpkg then Just Nothing else Nothing) (Just tmpdir) mpvs
+      speccblrpm <- createSpecFile False True silent flags False False pkgtype (if subpkg then Just Nothing else Nothing) (Just tmpdir) mpvs
+      currel <- getSpecField "Release" spec
+      let suffix = "%{?dist}"
+      editSpecField "Release" (currel ++ suffix) speccblrpm
       diffcmd <- words <$> getEnvDefault "CBLRPM_DIFF" "diff -u"
-      hawk <- optionalProgram "hawk"
-      if hawk
-        then
-        pipe3_ (head diffcmd, tail diffcmd ++ [spec, speccblrpm])
-          ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])
-          ("hawk", ["-d''", "-a", "takeWhile (/= [\"%changelog\"])"])
-        else
-        pipe_ (head diffcmd, tail diffcmd ++ [spec, speccblrpm])
+      out <- dropChangelog <$> pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])
         ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])
+      unless (null out) $
+        putStrLn out
       removeDirectoryRecursive tmpdir
diff --git a/src/Commands/Install.hs b/src/Commands/Install.hs
--- a/src/Commands/Install.hs
+++ b/src/Commands/Install.hs
@@ -48,11 +48,11 @@
   case mspec of
     Nothing ->
       withTempDirectory $ \ _ -> do
-      spec <- rpmBuild Binary flags pkgtype subpackage mpvs
+      spec <- rpmBuild Binary False flags pkgtype subpackage mpvs
       rpmdir <- rpmEval "%{_rpmdir}"
       rpmspec [] (fmap (</> "%{arch}/%{name}-%{version}-%{release}.%{arch}.rpm") rpmdir) spec >>= rpmInstall False
     Just spec -> do
-      rpmBuild_ Binary flags pkgtype subpackage mpvs
+      rpmBuild_ Binary False flags pkgtype subpackage mpvs
       rpmdir <- rpmEval "%{_rpmdir}"
       rpmspec [] (fmap (</> "%{arch}/%{name}-%{version}-%{release}.%{arch}.rpm") rpmdir) spec >>= rpmInstall False
 
diff --git a/src/Commands/Refresh.hs b/src/Commands/Refresh.hs
--- a/src/Commands/Refresh.hs
+++ b/src/Commands/Refresh.hs
@@ -17,14 +17,13 @@
   refresh
   ) where
 
-import Paths_cabal_rpm (version)
 import Commands.Spec (createSpecFile)
 import FileUtils (withTempDirectory)
 import Header (headerVersion, withSpecHead)
-import PackageUtils (PackageData (..), cabal_, patchSpec,
-                     prepare)
+import PackageUtils (PackageData (..), cabal_, patchSpec, prepare)
 import SysCmd (die, optionalProgram)
 import Types
+import Paths_cabal_rpm (version)
 
 import SimpleCmd (cmd, cmd_, grep_)
 import SimpleCmd.Git (rwGitDir)
@@ -34,8 +33,10 @@
 import Control.Applicative ((<$>))
 #endif
 import Control.Monad (unless, when)
+import Data.Maybe
 import Data.Version (showVersion)
 import Distribution.Verbosity (silent)
+import SimpleCabal (customFieldsPD)
 import System.Directory (copyFile, createDirectoryIfMissing, doesFileExist,
                          renameFile, setCurrentDirectory)
 import System.Environment (getEnv)
@@ -52,7 +53,7 @@
       when rwGit $ do
         local <- cmd "git" ["diff"] :: IO String
         unless (null local) $
-          putStrLn "Working dir contain local changes!"
+          putStrLn "Working dir contains local changes!"
           -- exitSuccess
       withSpecHead spec $ \ headerwords -> do
         let cblrpmver = headerVersion headerwords
@@ -64,8 +65,9 @@
                   DefaultPkg | "--standalone" `elem` headerwords -> StandalonePkg
                   _ -> pkgtype
           subpkg <- grep_ "%{subpkgs}" spec
+          let wasrevised = isJust $ lookup "x-revision" $ customFieldsPD (packageDesc pkgdata)
           oldspec <- createOldSpec subpkg cblrpmver spec
-          newspec <- createSpecFile True silent [] False False spectype (if subpkg then Just Nothing else Nothing) Nothing mpvs
+          newspec <- createSpecFile True wasrevised silent [] False False spectype (if subpkg then Just Nothing else Nothing) Nothing mpvs
           patchSpec dryrun Nothing oldspec newspec
 --          setCurrentDirectory cwd
 --          when rwGit $
diff --git a/src/Commands/RpmBuild.hs b/src/Commands/RpmBuild.hs
--- a/src/Commands/RpmBuild.hs
+++ b/src/Commands/RpmBuild.hs
@@ -37,24 +37,24 @@
 import Control.Monad (void, when)
 import Distribution.Verbosity (normal)
 
-rpmBuild :: RpmStage -> Flags -> PackageType -> Bool
+rpmBuild :: RpmStage -> Bool -> Flags -> PackageType -> Bool
          -> Maybe PackageVersionSpecifier -> IO FilePath
-rpmBuild stage flags pkgtype subpackage mpvs = do
+rpmBuild stage quiet flags pkgtype subpackage mpvs = do
   pkgdata <- prepare flags mpvs True False
   when (stage == Binary) $
     void $ pkgInstallMissing' pkgdata
   let pkgDesc = packageDesc pkgdata
       mspec = specFilename pkgdata
-  specFile <- maybe (createSpecFile False normal flags False False pkgtype (if subpackage then Just Nothing else Nothing) Nothing mpvs)
+  specFile <- maybe (createSpecFile False True normal flags False False pkgtype (if subpackage then Just Nothing else Nothing) Nothing mpvs)
               (\ s -> putStrLn ("Using existing" +-+ s) >> return s)
               mspec
   let pkgid = package pkgDesc
   bringTarball pkgid True (Just specFile)
-  rpmbuild stage specFile
+  rpmbuild quiet stage specFile
 
   return specFile
 
-rpmBuild_ :: RpmStage -> Flags -> PackageType -> Bool
+rpmBuild_ :: RpmStage -> Bool -> Flags -> PackageType -> Bool
           -> Maybe PackageVersionSpecifier -> IO ()
-rpmBuild_ stage flags pkgtype subpackage mpvs =
-  void $ rpmBuild stage flags pkgtype subpackage mpvs
+rpmBuild_ stage quiet flags pkgtype subpackage mpvs =
+  void $ rpmBuild stage quiet flags pkgtype subpackage mpvs
diff --git a/src/Commands/Spec.hs b/src/Commands/Spec.hs
--- a/src/Commands/Spec.hs
+++ b/src/Commands/Spec.hs
@@ -28,11 +28,16 @@
 import PackageUtils (bringTarball, latestPackage, PackageData (..), prepare)
 import SimpleCabal (buildable, mkPackageName, PackageDescription (..),
                     PackageIdentifier(..), PackageName, showVersion)
-import SimpleCmd ((+-+), cmdMaybe, grep_, removePrefix)
+import SimpleCmd ((+-+),
+#if MIN_VERSION_simple_cmd(0,2,2)
+                  grep,
+#endif
+                  cmdMaybe,
+                  grep_, removePrefix)
 import Stackage (defaultLTS)
 import Types
 
-import Control.Monad    (filterM, forM_, unless, void, when, (>=>))
+import Control.Monad.Extra
 
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
 #else
@@ -40,8 +45,7 @@
 #endif
 
 import Data.Char        (toUpper)
-import Data.List        (groupBy, intercalate, intersect, isPrefixOf,
-                         nub, sort, (\\))
+import Data.List.Extra
 import Data.Maybe       (isJust, fromMaybe, fromJust)
 import Data.Time.Clock  (getCurrentTime)
 import Data.Time.Format (formatTime)
@@ -85,21 +89,18 @@
 #endif
 
 
-rstrip :: (Char -> Bool) -> String -> String
-rstrip p = reverse . dropWhile p . reverse
-
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
 #else
 unUnqualComponentName :: String -> String
 unUnqualComponentName = id
 #endif
 
-createSpecFile :: Bool -> Verbosity -> Flags -> Bool -> Bool -> PackageType
-               -> Maybe (Maybe Stream) -> Maybe FilePath
+createSpecFile :: Bool -> Bool -> Verbosity -> Flags -> Bool -> Bool
+               -> PackageType -> Maybe (Maybe Stream) -> Maybe FilePath
                -> Maybe PackageVersionSpecifier
                -> IO FilePath
-createSpecFile keep verbose flags testsuite force pkgtype subpkgStream mdest mpvs = do
-  pkgdata <- prepare flags mpvs True keep
+createSpecFile keep revise verbose flags testsuite force pkgtype subpkgStream mdest mpvs = do
+  pkgdata <- prepare flags mpvs revise keep
   let mspec = case pkgtype of
                 SpecFile f -> Just f
                 _ -> specFilename pkgdata
@@ -152,15 +153,17 @@
   targetSpecAlreadyExists <- doesFileExist targetSpecFile
   -- run commands before opening file to prevent empty file on error
   -- maybe shell commands should be in a monad or something
-  droppedDeps <- if targetSpecAlreadyExists then do
-      map (mkPackageName . removePrefix "cabal-tweak-drop-dep ") <$> grep "^cabal-tweak-drop-dep" targetSpecFile
+  let topSpecFile = pkgname <.> "spec"
+  topSpecExists <- doesFileExist topSpecFile
+  droppedDeps <- if topSpecExists then
+      map (mkPackageName . removePrefix "cabal-tweak-drop-dep ") <$> grep "^cabal-tweak-drop-dep " topSpecFile
       else return []
   pkgdeps <- do
     alldeps <- packageDependencies pkgDesc
     return $ alldeps {buildDeps = buildDeps alldeps \\ droppedDeps}
   let outputFile = targetSpecFile ++ if not force && targetSpecAlreadyExists then ".cblrpm" else ""
   if targetSpecAlreadyExists
-    then warn verbose $ targetSpecFile +-+ "exists:" +-+ (if force then "forcing overwrite" else "creating") +-+ outputFile
+    then warn verbose $ (if force then "overwriting" else "creating") +-+ outputFile
     else do
     let realdir dir = "cblrpm." `isPrefixOf` takeBaseName dir
     when (maybe True realdir mdest) $
@@ -204,7 +207,7 @@
   let syn' = if null syn
              then "Haskell" +-+ name +-+ "package"
              else (unwords . lines . initialCapital) syn
-  let summary = rstrip (== '.') syn'
+  let summary = dropWhileEnd (== '.') syn'
   when (length ("Summary     : " ++ syn') > 79) $
     warn verbose "this package has a long synopsis."
 
@@ -249,7 +252,7 @@
     miss <- if subpackage || standalone then missingLibraries pkgDesc else return []
     return $ nub (subs ++ miss) \\ droppedDeps
   subpkgs <- if subpackage then
-    mapM (getsubpkgMacro (fromMaybe mstream subpkgStream) mspec >=>
+    mapM (getsubpkgMacro (streamSubpackage mstream subpkgStream) mspec >=>
           \(m,pv) -> global m (display pv) >> return ("%{" ++ m ++ "}")) missingLibs
     else return []
   let hasSubpkgs = subpkgs /= []
@@ -257,23 +260,26 @@
     global "subpkgs" $ unwords subpkgs
     putNewline
 
-  let testsuiteDeps = testsuiteDependencies' pkgDesc
+  let (testsuiteDeps,testsuiteTools) = testsuiteDependencies' pkgDesc
   missTestDeps <- filterM (notSrcOrInst . RpmHsLib Devel) testsuiteDeps
-  let testable = not (null testsuiteDeps) && (null missTestDeps || testsuite)
+  let testable = notNull testsuiteDeps && (null missTestDeps || testsuite)
   if testable then do
     put "%bcond_without tests"
     putNewline
-    else unless (null testsuiteDeps) $
-         warn verbose $ "testsuite ignored due to missing deps: " ++ unwords (map display missTestDeps)
+    else unless (null testsuiteDeps) $ do
+         put $ "# testsuite missing deps: " ++ unwords (map display missTestDeps)
+         putNewline
   let version = display $ pkgVersion pkgid
       release = "1"
   revised <-
     if isJust $ lookup "x-revision" (customFieldsPD pkgDesc)
     then return True
     else do
-      let local = display pkgid <.> "cabal"
-      have <- doesFileExist local
-      if have then grep_ "x-revision" local else return False
+      if revise then do
+        let local = display pkgid <.> "cabal"
+        have <- doesFileExist local
+        if have then grep_ "x-revision" local else return False
+      else return False
   putHdr "Name" (if binlib then "%{pkg_name}" else basename)
   putHdr "Version" version
   when hasSubpkgs $
@@ -295,7 +301,7 @@
   put "# End cabal-rpm sources"
   putNewline
   put "# Begin cabal-rpm deps:"
-  when (mkPackageName "Cabal" `notElem` buildDeps pkgdeps || not hasLib || not (null (setupDeps pkgdeps))) $ do
+  when (mkPackageName "Cabal" `notElem` buildDeps pkgdeps || not hasLib || notNull (setupDeps pkgdeps)) $ do
 --    put "# Setup"
     when (mkPackageName "Cabal" `notElem` buildDeps pkgdeps) $
       putHdr "BuildRequires" "ghc-Cabal-devel"
@@ -317,10 +323,10 @@
     -- when (epel7 &&
     --       any (\ d -> d `elem` map showDep ["template-haskell", "hamlet"]) deps) $
     --   putHdr "ExclusiveArch" "%{ghc_arches_with_ghci}"
-  let testDeps = sort $ testsuiteDeps \\ (mkPackageName "Cabal" : (buildDeps pkgdeps ++ setupDeps pkgdeps))
-  when (testable && not (null testDeps)) $ do
+  let testDeps = testsuiteDeps \\ (mkPackageName "Cabal" : (buildDeps pkgdeps ++ setupDeps pkgdeps))
+  when (testable && notNull testDeps) $ do
     put "%if %{with tests}"
-    mapM_ (putHdr "BuildRequires" . showRpm . RpmHsLib Devel) testDeps
+    mapM_ (putHdr "BuildRequires") $ (sort . map showRpm) (map (RpmHsLib Devel) testDeps ++ map RpmOther testsuiteTools)
     put "%endif"
 
   let common = binlib && datafiles /= [] && not standalone
@@ -334,7 +340,7 @@
       putStrLn "checking for deps of missing dependencies:"
       let deptype = if standalone then Devel else Prof
       forM_ missingLibs $ \ pkg -> do
-        more <- packageDeps flags (fromMaybe mstream subpkgStream) pkg
+        more <- packageDeps flags (streamSubpackage mstream subpkgStream) pkg
         let moredeps = sort $ more \\ (buildDeps pkgdeps ++ missingLibs)
         unless (null moredeps) $ do
           put $ "# for missing dep '" ++ display pkg ++ "':"
@@ -431,6 +437,22 @@
     (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpkgs) else  "")
   when revised $
     put $ "cp -bp %{SOURCE" ++ show (1 + length subpkgs) ++ "}" +-+ pkg_name <.> "cabal"
+  let extrasourcedocs = sort $ filter (`elem` docs) $ extraSrcFiles pkgDesc
+  unless (null extrasourcedocs) $ do
+    let pkgdir = display pkgid
+    havePrep <- doesDirectoryExist pkgdir
+    if havePrep then do
+      executabledocs <- do
+        exedocs <- filterM (fmap executable . getPermissions . (pkgdir </>)) extrasourcedocs
+        if notNull exedocs then
+          return exedocs
+          else do
+          if topSpecExists then do
+            ((words . removePrefix "chmod a-x ") =<<) <$> grep "^chmod a-x " topSpecFile
+          else return []
+      unless (null executabledocs) $
+        put $ "chmod a-x" +-+ unwords executabledocs
+      else warn verbose $ "Check file permissions of" +-+ unwords extrasourcedocs
   put "# End cabal-rpm setup"
   sectionNewline
 
@@ -477,16 +499,6 @@
     put "find %{buildroot}%{_libdir} -name 'libHS%{pkgver}-*.so' -delete"
     put "rm -r %{buildroot}%{ghclibdir}"
 
-  let extrasourcedocs = sort $ filter (`elem` docs) $ extraSrcFiles pkgDesc
-  unless (null extrasourcedocs) $ do
-    let pkgdir = display pkgid
-    havePrep <- doesDirectoryExist pkgdir
-    if havePrep then do
-      executabledocs <- filterM (fmap executable . getPermissions . (pkgdir </>)) extrasourcedocs
-      unless (null executabledocs) $
-        put $ "chmod a-x" +-+ unwords executabledocs
-      else warn verbose $ "Check file permissions of" +-+ unwords extrasourcedocs
-
   put "# End cabal-rpm install"
   sectionNewline
 
@@ -560,7 +572,8 @@
   put "%changelog"
   now <- getCurrentTime
   let date = formatTime defaultTimeLocale "%a %b %e %Y" now
-  put $ "*" +-+ date +-+ "Fedora Haskell SIG <haskell@lists.fedoraproject.org> - " ++ version ++ "-" ++ release
+  packager <- fromMaybe "Fedora Haskell SIG <haskell@lists.fedoraproject.org>" <$> cmdMaybe "rpmdev-packager" []
+  put $ "*" +-+ date +-+ packager ++ " - " ++ version ++ "-" ++ release
   put $ "- spec file generated by cabal-rpm-" ++ V.showVersion Paths_cabal_rpm.version
   hClose h
   return outputFile
@@ -568,7 +581,7 @@
 createSpecFile_ :: Verbosity -> Flags -> Bool -> Bool -> PackageType
                 -> Maybe (Maybe Stream) -> Maybe PackageVersionSpecifier -> IO ()
 createSpecFile_ verbose flags testsuite force pkgtype subpkgStream mpvs =
-  void (createSpecFile False verbose flags testsuite force pkgtype subpkgStream Nothing mpvs)
+  void (createSpecFile True True verbose flags testsuite force pkgtype subpkgStream Nothing mpvs)
 
 isBuildable :: Executable -> Bool
 isBuildable exe = buildable $ buildInfo exe
@@ -640,9 +653,6 @@
 number :: [a] -> [(String,a)]
 number = zip (map show [(1::Int)..])
 
-notNull :: [a] -> Bool
-notNull = not . null
-
 getPkgName :: Maybe FilePath -> PackageDescription -> Bool -> IO (String, Bool)
 getPkgName (Just spec) pkgDesc binary = do
   let name = display . pkgName $ package pkgDesc
@@ -659,8 +669,18 @@
 quoteMacros "" = ""
 quoteMacros (c:cs) = (if c == '%' then "%%" else [c]) ++ quoteMacros cs
 
--- use simple-cmd > 0.2.1
+#if !MIN_VERSION_simple_cmd(0,2,2)
 grep :: String -> FilePath -> IO [String]
 grep pat file = do
   mres <- cmdMaybe "grep" [pat, file]
   return $ maybe [] lines mres
+#endif
+
+streamSubpackage :: Maybe Stream -> Maybe (Maybe Stream) -> Maybe Stream
+streamSubpackage _ (Just (Just stream)) = Just stream
+streamSubpackage mstream _ = mstream
+
+#if !MIN_VERSION_extra(1,6,8)
+notNull :: [a] -> Bool
+notNull = not . null
+#endif
diff --git a/src/Commands/Update.hs b/src/Commands/Update.hs
--- a/src/Commands/Update.hs
+++ b/src/Commands/Update.hs
@@ -20,14 +20,14 @@
 
 import Commands.Spec (createSpecFile)
 import Header (headerOption, withSpecHead)
-import PackageUtils (PackageData (..), bringTarball, editSpecField,
-                     getRevisedCabal, getSpecField, latestPackage,
-                     patchSpec, pkgSpecPkgData, prepare)
+import PackageUtils (PackageData (..), RpmStage(Prep), bringTarball,
+                     editSpecField, getRevisedCabal, getSpecField, latestPackage,
+                     patchSpec, pkgSpecPkgData, rpmbuild)
 import Stackage (defaultLTS)
 import SysCmd (die)
 import Types
 
-import SimpleCabal (PackageDescription (customFieldsPD, package),
+import SimpleCabal (customFieldsPD, package,
                     PackageIdentifier (..), showVersion)
 import SimpleCmd (cmd_, error', grep_, shell_, (+-+))
 import SimpleCmd.Git (grepGitConfig, rwGitDir)
@@ -89,12 +89,12 @@
         then putStrLn $ "current" +-+ display oldver +-+ "is newer!"
         else do
         newrev <- getRevisedCabal newPkgId
-        unless updated $
+        when (newver == oldver) $
           putStrLn "Package is already latest version."
         when (newrev || updated) $ do
           subpkg <- grep_ "%{subpkgs}" spec
-          (curspec, _) <- createSpecVersion oldPkgId spec wasrevised (if subpkg then Just Nothing else Nothing)
-          (newspec, newrevised) <- createSpecVersion newPkgId spec True (if subpkg then Just mstream else Nothing)
+          curspec <- createSpecVersion oldPkgId spec wasrevised (if subpkg then Just Nothing else Nothing)
+          newspec <- createSpecVersion newPkgId spec True (if subpkg then Just mstream else Nothing)
           currel <- getSpecField "Release" spec
           let suffix = "%{?dist}"
               defrelease = "1"
@@ -106,38 +106,39 @@
           if updated && not subpkg
             then editSpecField "Release" (defrelease ++ suffix) spec
             else editSpecField "Release" (currel ++ suffix) spec
+          rwGit <- rwGitDir
           when updated $ do
             -- FIXME reset when all subpkgs updated
             unless subpkg $
               editSpecField "Release" ("0" ++ suffix) spec
             cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ showVersion newver, spec]
-            rwGit <- rwGitDir
             when (rwGit && subpkg) $ do
               cmd_ "cp" ["-p", "sources", "sources.cblrpm"]
               cmd_ "sed" ["-i", "/" ++ display oldPkgId <.> "tar.gz" ++ "/d", "sources.cblrpm"]
             bringTarball newPkgId False (Just spec)
-            distgit <- grepGitConfig "\\(pkgs\\|src\\)."
-            when (rwGit && distgit) $ do
+          distgit <- grepGitConfig "\\(pkgs\\|src\\)."
+          when (rwGit && distgit) $ do
+            when updated $ do
               cmd_ "fedpkg" ["new-sources", display newPkgId <.> "tar.gz"]
               when subpkg $ do
                 shell_ $ "cat sources >>" +-+ "sources.cblrpm"
                 renameFile "sources.cblrpm" "sources"
-              when newrevised $
-                cmd_ "git" ["add", display newPkgId <.> "cabal"]
               when wasrevised $
                 cmd_ "git" ["rm", display oldPkgId <.> "cabal"]
+            when newrev $
+              cmd_ "git" ["add", display newPkgId <.> "cabal"]
+            if updated then
               cmd_ "git" ["commit", "-a", "-m", "update to" +-+ showVersion newver]
+              else
+              when newrev $
+              cmd_ "git" ["commit", "-a", "-m", "revised .cabal file"]
+          rpmbuild True Prep spec
   where
     -- Just Nothing is default stream
-    createSpecVersion :: PackageIdentifier -> String -> Bool -> Maybe (Maybe Stream) -> IO (FilePath, Bool)
+    createSpecVersion :: PackageIdentifier -> String -> Bool -> Maybe (Maybe Stream) -> IO FilePath
     createSpecVersion pkgid spec revise subpkgStream = do
-      pd <- prepare [] (streamPkgToPVS Nothing (Just pkgid)) revise True
-      let pkgdata = pd { specFilename = Just spec }
-          dir = ".Cblrpm/" ++ display pkgid ++ if revise then ".revised" else ".orig"
+      let dir = ".Cblrpm/" ++ display pkgid ++ if revise then ".revised" else ".orig"
       direxists <- doesDirectoryExist dir
       when direxists $ removeDirectoryRecursive dir
       createDirectoryIfMissing True dir
-      newspec <- createSpecFile True silent [] False False (SpecFile spec) subpkgStream (Just dir) (streamPkgToPVS Nothing (Just pkgid))
-      let newrevised =
-            isJust $ lookup "x-revision" (customFieldsPD (packageDesc pkgdata))
-      return (newspec, newrevised)
+      createSpecFile True revise silent [] False False (SpecFile spec) subpkgStream (Just dir) (streamPkgToPVS Nothing (Just pkgid))
diff --git a/src/Dependencies.hs b/src/Dependencies.hs
--- a/src/Dependencies.hs
+++ b/src/Dependencies.hs
@@ -43,7 +43,9 @@
                     exeDepName,
                     PackageDescription (package),
                     PackageName, pkgcfgDepName, pkgName,
-                    setupDependencies, testsuiteDependencies)
+                    setupDependencies, testsuiteDependencies,
+                    unPackageName
+                   )
 import SimpleCmd (cmd, cmdBool, removePrefix, removeSuffix, warning, (+-+))
 import SimpleCmd.Rpm (rpmspec)
 
@@ -57,8 +59,10 @@
 import Data.Maybe (catMaybes, fromJust, isNothing, mapMaybe)
 
 import Distribution.Text (display)
-import Distribution.PackageDescription (allBuildInfo, BuildInfo (..),  hasLibs)
-
+import Distribution.PackageDescription (allLibraries, buildInfo, BuildInfo (..),
+                                        executables, hasLibs, Library(..),
+                                        testBuildInfo, testSuites)
+import Distribution.Types.ExeDependency (ExeDependency(..))
 import System.Directory (doesDirectoryExist, doesFileExist)
 import System.FilePath ((<.>), (</>))
 
@@ -79,7 +83,10 @@
     let self = pkgName $ package pkgDesc
         deps = filter excludedPkgs $ buildDependencies pkgDesc
         setup = filter excludedPkgs $ setupDependencies pkgDesc
-        buildinfo = allBuildInfo pkgDesc
+        buildinfo = [ bi | lib <- allLibraries pkgDesc
+                         , let bi = libBuildInfo lib ] ++
+                    [ bi | exe <- executables pkgDesc
+                         , let bi = buildInfo exe ]
         tools =  nub $ map exeDepName (concatMap buildTools buildinfo)
         pkgcfgs = nub $ map pkgcfgDepName $ concatMap pkgconfigDepends buildinfo
         clibs = nub $ concatMap extraLibs buildinfo
@@ -132,12 +139,6 @@
 packageDependencies pkgDesc = do
     let (deps, setup, tools', clibs', pkgcfgs) = dependencies pkgDesc
         excludedTools n = n `notElem` ["ghc", "hsc2hs", "perl"]
-        mapTools "cabal" = "cabal-install"
-        mapTools "gtk2hsC2hs" = "gtk2hs-buildtools"
-        mapTools "gtk2hsHookGenerator" = "gtk2hs-buildtools"
-        mapTools "gtk2hsTypeGen" = "gtk2hs-buildtools"
-        mapTools "hspec-discover" = "ghc-hspec-discover-devel"
-        mapTools tool = tool
         tools = filter excludedTools $ nub $ map mapTools tools'
     clibsWithErrors <- mapM resolveLib clibs'
 
@@ -147,9 +148,25 @@
     let showPkgCfg p = "pkgconfig(" ++ p ++ ")"
     return $ PackageDepends deps setup tools (nub clibs) (map showPkgCfg pkgcfgs)
 
-testsuiteDependencies' :: PackageDescription -> [PackageName]
-testsuiteDependencies' =
-  filter excludedPkgs . testsuiteDependencies
+mapTools :: String -> String
+mapTools "cabal" = "cabal-install"
+mapTools "gtk2hsC2hs" = "gtk2hs-buildtools"
+mapTools "gtk2hsHookGenerator" = "gtk2hs-buildtools"
+mapTools "gtk2hsTypeGen" = "gtk2hs-buildtools"
+mapTools "hspec-discover" = "ghc-hspec-discover-devel"
+mapTools tool = tool
+
+testsuiteDependencies' :: PackageDescription -> ([PackageName],[String])
+testsuiteDependencies' pkgDesc =
+  let self = pkgName $ package pkgDesc in
+  ((filter excludedPkgs . testsuiteDependencies) pkgDesc,
+   map mapTools ((delete (display self) . nub) (testTools ++ testToolDeps)))
+  where
+    tests = map testBuildInfo $ testSuites pkgDesc
+    testTools = map exeDepName $ concatMap buildTools tests
+    testToolDeps = map prettyShow $ concatMap buildToolDepends tests
+
+    prettyShow (ExeDependency pn _ _) = unPackageName pn
 
 missingPackages :: PackageDescription -> IO [RpmPackage]
 missingPackages pkgDesc = do
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -57,13 +57,13 @@
     [ Subcommand "spec" "Generate a spec file" $
       createSpecFile_ <$> quietOpt <*> flags <*> testsuite <*> force <*> pkgtype <*> fmap toSubpkgStream subpackage <*> pkgVerSpecifier
     , Subcommand "srpm" "Generate an srpm" $
-      rpmBuild_ Source <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
+      rpmBuild_ Source <$> verboseRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
     , Subcommand "prep" "Unpack source" $
-      rpmBuild_ Prep <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
+      rpmBuild_ Prep <$> verboseRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
     , Subcommand "local" "Build rpm package locally" $
-      rpmBuild_ Binary <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
+      rpmBuild_ Binary <$> quietRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
     , Subcommand "build" "Alias for 'local' - builds rpm locally" $
-      rpmBuild_ Binary <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
+      rpmBuild_ Binary <$> quietRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier
     , Subcommand "builddep" "Install build dependencies with dnf" $
       builddep <$> flags <*> pkgVerSpecifier
     , Subcommand "install" "Build and install recursively" $
@@ -92,6 +92,9 @@
 
     flags :: Parser Flags
     flags = optionalWith auto 'f' "flag" "[(String,Bool)]" "Set or disable Cabal flags" []
+
+    quietRpmbuild = switchWith 'q' "quiet" "Quiet rpmbuild output"
+    verboseRpmbuild = flagWith True False 'v' "verbose" "Verbose rpmbuild output"
 
     testsuite :: Parser Bool
     testsuite = switchWith 'T' "tests" "Force enabling the test-suite (even if deps missing)"
diff --git a/src/PackageUtils.hs b/src/PackageUtils.hs
--- a/src/PackageUtils.hs
+++ b/src/PackageUtils.hs
@@ -19,6 +19,7 @@
   bringTarball,
   cabal_,
   checkForSpecFile,
+  dropChangelog,
   editSpecField,
   getRevisedCabal,
   getSpecField,
@@ -40,11 +41,19 @@
 import SimpleCabal (finalPackageDescription, licenseFiles, mkPackageName,
                     PackageDescription, PackageIdentifier(..), PackageName,
                     tryFindPackageDesc)
-import SimpleCmd (cmd, cmd_, cmdBool, cmdIgnoreErr, cmdLines, error', grep_,
-                  removePrefix, sudo, sudo_, (+-+))
+import SimpleCmd (cmd, cmd_, cmdBool, cmdIgnoreErr, cmdLines,
+#if MIN_VERSION_simple_cmd(0,2,2)
+                  cmdStderrToStdout,
+#else
+                  cmdSilent,
+#endif
+                  error', grep_, removePrefix, sudo, sudo_, (+-+))
 import SimpleCmd.Git (isGitDir, grepGitConfig)
 import SimpleCmd.Rpm (rpmspec)
 import SysCmd (optionalProgram, requireProgram, rpmEval)
+#if MIN_VERSION_simple_cmd(0,2,2)
+import System.Exit (ExitCode (..))
+#endif
 import Stackage (defaultLTS, latestStackage)
 import Types
 
@@ -55,7 +64,7 @@
 import Control.Monad    (filterM, unless, void, when)
 
 import Data.Char (toLower)
-import Data.List (isPrefixOf, isSuffixOf, nub, sort)
+import Data.List
 import Data.Maybe
 import Data.Time.Clock (diffUTCTime, getCurrentTime)
 
@@ -67,8 +76,7 @@
                          removeDirectoryRecursive, renameFile,
                          setCurrentDirectory)
 import System.Environment (getEnv)
-import System.FilePath ((</>), (<.>), dropFileName, takeBaseName, takeExtensions,
-                        takeFileName)
+import System.FilePath
 import System.IO (hIsTerminalDevice, stdout)
 import System.Posix.Files (accessTime, fileMode, getFileStatus,
                            modificationTime, setFileMode)
@@ -97,6 +105,7 @@
 
 bringTarball :: PackageIdentifier -> Bool -> Maybe FilePath -> IO ()
 bringTarball pkgid revise mspec = do
+  let tarfile = display pkgid <.> "tar.gz"
   havespec <- case mspec of
                 Nothing -> return False
                 Just spec -> doesFileExist spec
@@ -121,8 +130,6 @@
     when (not allExist' && havespec) $
       cmd_ "spectool" ["-g", "-S", "-C", srcdir, fromJust mspec]
  where
-  tarfile = display pkgid <.> "tar.gz"
-
   sourceFieldFile :: String -> FilePath
   sourceFieldFile field =
     if null field then
@@ -142,7 +149,12 @@
       unless havecache cabalUpdate
       remotes <- getDirectoryContents_ cacheparent
 
-      let tarpath = display (pkgName pkgid) </> display (pkgVersion pkgid) </> tarfile
+      let pkgid' =
+            fromMaybe (error' $ "Parse failed for:" +-+ dropExtensions file) $
+            simpleParse (dropExtensions file)
+          tarfile = display pkgid' <.> "tar.gz"
+          tarpath =
+              display (pkgName pkgid') </> display (pkgVersion pkgid') </> tarfile
           paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes
       -- if more than one tarball, should maybe warn if they are different
       tarballs <- filterM doesFileExist paths
@@ -150,7 +162,7 @@
         then if ranFetch
              then error $ "no" +-+ tarfile +-+ "found"
              else do
-             cabal_ "fetch" ["-v0", "--no-dependencies", display pkgid]
+             cabal_ "fetch" ["-v0", "--no-dependencies", display pkgid']
              copyTarball True dir file
         else do
         createDirectoryIfMissing True dir
@@ -172,6 +184,7 @@
   let file = display (pkgName pkgid) <.> "cabal"
   dir <- getSourceDir
   withTempDirectory $ \ _ -> do
+    -- FIXME use cabal-file
     dl <- cmdBool "wget" ["--quiet", "https://hackage.haskell.org/package" </> display pkgid </> file]
     if not dl
       then return False
@@ -184,8 +197,8 @@
 
 data RpmStage = Binary | Source | Prep deriving Eq
 
-rpmbuild :: RpmStage -> FilePath -> IO ()
-rpmbuild mode spec = do
+rpmbuild :: Bool -> RpmStage -> FilePath -> IO ()
+rpmbuild quiet mode spec = do
   let rpmCmd = case mode of
         Binary -> "a"
         Source -> "s"
@@ -195,10 +208,29 @@
   let rpmdirs_override =
         [ "--define="++ mcr +-+ cwd | gitDir,
           mcr <- ["_builddir", "_rpmdir", "_srcrpmdir", "_sourcedir"]]
-  cmd_ "rpmbuild" $ ["-b" ++ rpmCmd] ++
-    ["--nodeps" | mode == Prep] ++
-    rpmdirs_override ++
-    [spec]
+  let args = ["-b" ++ rpmCmd] ++ ["--nodeps" | mode == Prep] ++
+             rpmdirs_override ++ [spec]
+  if not quiet then
+    cmd_ "rpmbuild" args
+    else do
+    putStr "Running rpmbuild: "
+#if MIN_VERSION_simple_cmd(0,2,2)
+    -- may hang for build
+    (ret, out) <- cmdStderrToStdout "rpmbuild" args
+    case ret of
+      ExitSuccess -> putStrLn "done"
+      ExitFailure _ -> error' $ "\n" ++ dropToPrefix "+ /usr/bin/chmod -Rf" out
+  where
+    dropToPrefix :: String -> String -> String
+    dropToPrefix _ "" = ""
+    dropToPrefix prefix cs =
+      let ls = lines cs
+          rest = dropWhile (not . (prefix `isPrefixOf`)) ls
+      in unlines (if null rest then tail ls else tail rest)
+#else
+    cmdSilent "rpmbuild" args
+    putStrLn "done"
+#endif
 
 cabalUpdate :: IO ()
 cabalUpdate = do
@@ -364,11 +396,11 @@
             specTime <- modificationTime <$> getFileStatus specFile
             dirTime <- accessTime <$> getFileStatus namever
             when (specTime > dirTime) $ do
-              rpmbuild Prep specFile
+              rpmbuild True Prep specFile
               dExists' <- doesDirectoryExist namever
               when dExists' $ cmd_ "touch" [namever]
             else
-            rpmbuild Prep specFile
+            rpmbuild True Prep specFile
           tryFindPackageDesc namever
 
 -- findSpecFile :: PackageDescription -> RpmFlags -> IO (FilePath, Bool)
@@ -440,9 +472,10 @@
 -- redundant mdir was earlier for update
 patchSpec :: Bool -> Maybe FilePath -> FilePath -> FilePath -> IO ()
 patchSpec dryrun mdir oldspec newspec = do
-  diff <- cmdIgnoreErr "diff" ["-u2", "-I", "- spec file generated by cabal-rpm", "-I", "Fedora Haskell SIG <haskell@lists.fedoraproject.org>", oldspec, newspec] "" >>= cmdIgnoreErr "sed" ["-e", "s%.Cblrpm/%%", "-e", "s/.cblrpm//"]
+  diff <- cmdIgnoreErr "diff" ["-u2", "-I", "- spec file generated by cabal-rpm", "-I", "Fedora Haskell SIG <haskell@lists.fedoraproject.org>", oldspec, newspec] "" >>= cmdIgnoreErr "sed" ["-e", "s%.Cblrpm/%%", "-e", "s/.cblrpm//"] . dropChangelog
   putStrLn diff
   unless dryrun $ do
+    putStrLn ""
     out <- cmdIgnoreErr "patch" opts diff
     putStrLn out
   where
@@ -450,6 +483,14 @@
 
     count :: Eq a => a -> [a] -> Int
     count x =  length . filter (==x)
+
+dropChangelog :: String -> String
+dropChangelog cs =
+  let ls = lines cs in
+  if " %changelog" `elem` ls then
+    let rest = (dropWhileEnd ("@@ " `isPrefixOf`) . dropWhileEnd (== " ") . takeWhile (/= " %changelog")) ls in
+      if length rest > 2 then unlines rest else ""
+    else cs
 
 packageManager :: IO String
 packageManager = do
diff --git a/src/Stackage.hs b/src/Stackage.hs
--- a/src/Stackage.hs
+++ b/src/Stackage.hs
@@ -41,10 +41,10 @@
 import Types
 
 defaultLTS :: Stream
-defaultLTS = LTS "14"
+defaultLTS = LTS 16
 
 latestLTS :: Stream
-latestLTS = LTS "15"
+latestLTS = LTS 16
 
 stackageList :: Stream -> PackageName -> IO (Maybe PackageIdentifier)
 stackageList stream pkg = do
@@ -82,11 +82,13 @@
     Just pkgid -> do
       putStrLn $ display pkgid +-+ "in Stackage" +-+ showStream stream
       return mpkgid
-    Nothing -> case mstream of
-      Nothing -> if defaultLTS == latestLTS then return Nothing
-                 else latestStackage (Just LatestLTS) pkg
-      Just s -> case s of
-        LTS n | LTS n < latestLTS -> latestStackage (Just LatestLTS) pkg
-        LTS n | LTS n >= latestLTS -> latestStackage (Just LatestNightly) pkg
-        LatestLTS -> latestStackage (Just LatestNightly) pkg
-        _ -> return Nothing
+    Nothing ->
+      maybe (return Nothing) (\ nstream -> latestStackage (Just nstream) pkg) $ newerStream stream
+  where
+    newerStream :: Stream -> Maybe Stream
+    newerStream (LTS n) =
+      if LTS n < latestLTS
+        then Just (LTS (n+1))
+        else Just LatestNightly
+    newerStream LatestLTS = Just LatestNightly
+    newerStream _ = Nothing
diff --git a/src/SysCmd.hs b/src/SysCmd.hs
--- a/src/SysCmd.hs
+++ b/src/SysCmd.hs
@@ -20,14 +20,14 @@
   die,
   optionalProgram,
   requireProgram,
-  rpmEval,
-  trySystem) where
+  rpmEval
+  ) where
 
 #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
 #else
 import Control.Applicative ((<$>))
 #endif
-import Control.Monad    (void, when)
+import Control.Monad
 import Data.Maybe       (isJust, isNothing)
 
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
@@ -37,7 +37,6 @@
 #endif
 
 import System.Directory (findExecutable)
-import System.Process (rawSystem)
 
 import SimpleCmd (cmd)
 
@@ -54,11 +53,6 @@
 optionalProgram :: String -> IO Bool
 optionalProgram c =
   isJust <$> findExecutable c
-
-trySystem :: String -> [String] -> IO ()
-trySystem c args = do
-  requireProgram c
-  void $ rawSystem c args
 
 -- can't live in PackageUtils due to circular dep with Distro
 rpmEval :: String -> IO (Maybe String)
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -89,14 +89,14 @@
 --   where tagWithValue ('-':name) = (mkFlagName (map toLower name), False)
 --         tagWithValue name       = (mkFlagName (map toLower name), True)
 
-data Stream = LTS String | LatestLTS | Nightly String | LatestNightly | Hackage
+data Stream = LTS Int | LatestLTS | Nightly String | LatestNightly | Hackage
   deriving (Eq, Ord)
 
 showStream :: Stream -> String
 showStream LatestNightly = "nightly"
 showStream LatestLTS = "lts"
 showStream (Nightly date) = "nightly-" <> date
-showStream (LTS ver) = "lts-" <> ver
+showStream (LTS ver) = "lts-" <> show ver
 showStream Hackage = "hackage"
 
 instance Read Stream where
@@ -107,8 +107,8 @@
     let (date,rest) = span (\ c -> isDigit c || c == '-') $ removePrefix "nightly-" input in
        [(Nightly date,rest)]
   readsPrec _ input | "lts-" `isPrefixOf` input =
-    let (ver,rest) = span (\ c -> isDigit c || c == '.') $ removePrefix "lts-" input in
-      [(LTS ver,rest)]
+    let (ver,rest) = span isDigit $ removePrefix "lts-" input in
+      [(LTS (read ver),rest)]
   readsPrec _ _ = []
 
 removePrefix :: String -> String-> String
