diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+# 2.0.2 (2020-02-20)
+- drop %_devel compat macro
+- default stream is now lts-14
+- sort deps of subpackages
+- metapkgs don't have prof or doc
+- fix generation of subpackages for a new package
+- update: logic reworked to reduce redundant downloads
+
 # 2.0.1 (2020-02-06)
 - quote macros in commented fields
 - read --subpackage from spec header
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@
 	@echo
 	stack --resolver lts-13 --stack-yaml stack-lts13.yaml build
 	@echo
-#	stack --resolver lts-12 --stack-yaml stack-lts12.yaml build
+	stack --resolver lts-12 --stack-yaml stack-lts12.yaml build
 	@echo
 	stack --resolver lts-11 --stack-yaml stack-lts11.yaml build
 	@echo
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.1
+Version:             2.0.2
 Synopsis:            RPM packaging tool for Haskell Cabal-based packages
 Description:
     This package provides a RPM packaging tool for Haskell Cabal-based packages.
diff --git a/src/Commands/Refresh.hs b/src/Commands/Refresh.hs
--- a/src/Commands/Refresh.hs
+++ b/src/Commands/Refresh.hs
@@ -72,10 +72,10 @@
 --            cmd_ "git" ["commit", "-a", "-m", "refreshed to cabal-rpm-" ++ showVersion version]
   where
     createOldSpec :: Bool -> String -> FilePath -> IO FilePath
-    createOldSpec subpkg crVer spec = do
-      cblrpmVersion subpkg crVer
+    createOldSpec subpkg cblrpmver spec = do
+      cblrpmVersion subpkg cblrpmver
       let backup = spec <.> "cblrpm"
-          backup' = backup ++ "-" ++ crVer
+          backup' = backup ++ "-" ++ cblrpmver
       renameFile 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
@@ -49,7 +49,7 @@
               (\ s -> putStrLn ("Using existing" +-+ s) >> return s)
               mspec
   let pkgid = package pkgDesc
-  bringTarball pkgid True specFile
+  bringTarball pkgid True (Just specFile)
   rpmbuild stage specFile
 
   return specFile
diff --git a/src/Commands/Spec.hs b/src/Commands/Spec.hs
--- a/src/Commands/Spec.hs
+++ b/src/Commands/Spec.hs
@@ -219,14 +219,6 @@
     global "pkg_name" name
     global "pkgver" "%{pkg_name}-%{version}"
     putNewline
-  unless standalone $ do
-    global "_devel" $
-      if hasLib
-      -- rpm-4.15 supports %{expr:b?t:f} (not in rhel8)
-      then "%{?ghc_devel_prof}%{!?ghc_devel_prof:devel}"
-      -- FIXME: use static%{_isa}
-      else "%{?ghc_devel_prof:static}%{!?ghc_devel_prof:devel}"
-    putNewline
 
   let pkgver = if hasLib then "%{pkgver}" else pkg_name ++ "-%{version}"
 
@@ -237,11 +229,8 @@
     miss <- if subpackage || standalone then missingLibraries hasLibPkg pkgDesc else return []
     return $ nub (subs ++ miss)
   subpkgs <- if subpackage then
-    case mspec of
-      Just spec ->
-        mapM (getsubpkgMacro mstream spec >=>
-              \(m,pv) -> global m (display pv) >> return ("%{" ++ m ++ "}")) missingLibs
-      Nothing -> return []
+    mapM (getsubpkgMacro mstream mspec >=>
+          \(m,pv) -> global m (display pv) >> return ("%{" ++ m ++ "}")) missingLibs
     else return []
   let hasSubpkgs = subpkgs /= []
   when hasSubpkgs $ do
@@ -286,9 +275,12 @@
     mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Devel d))) setupDeps
   putHdr "BuildRequires" $ "ghc-rpm-macros" ++ (if hasSubpkgs then "-extra" else "")
 
-  unless (null deps) $
+  unless (null deps) $ do
 --    put "# Build"
-    mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Base d) ++ if standalone then "-devel" else "-%{_devel}")) $ sort deps
+    let metaPackages = map mkPackageName ["haskell-gi-overloading"]
+        ghcLibDep d | d `elem` metaPackages = RpmHsLib Devel d
+                    | otherwise = (RpmHsLib $ if standalone then Devel else if hasLibPkg then Prof else Static) d
+    mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (ghcLibDep d))) $ sort deps
   let otherdeps = sort $ tools ++ clibs ++ pkgcfgs
   unless (null otherdeps) $ do
 --    put "# Other"
@@ -316,7 +308,7 @@
       let deptype = if standalone then Devel else Prof
           putPkgDeps pkg = do
             more <- packageDeps flags Nothing pkg
-            let moredeps = more \\ (deps ++ missingLibs)
+            let moredeps = sort $ more \\ (deps ++ missingLibs)
             unless (null moredeps) $ do
               put $ "# for missing dep '" ++ display pkg ++ "':"
               mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib deptype d))) moredeps
@@ -359,8 +351,9 @@
     let isa = "%{?_isa}"
     put $ "%package" +-+ subpkgParam Devel
     putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library development files"
-    putHdr "Provides" $ baselibpkg ++ "-static" ++ versionRelease
-    putHdr "Provides" $ baselibpkg ++ "-static" ++ isa ++ versionRelease
+    when hasModules $ do
+      putHdr "Provides" $ baselibpkg ++ "-static" ++ versionRelease
+      putHdr "Provides" $ baselibpkg ++ "-static" ++ isa ++ versionRelease
     put "%if %{defined ghc_version}"
     putHdr "Requires" "ghc-compiler = %{ghc_version}"
     put "%endif"
@@ -374,27 +367,27 @@
     put $ "%description" +-+ subpkgParam Devel
     put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "library development files."
     sectionNewline
--- ? when hasModules $
-    put "%if %{with haddock}"
-    put $ "%package" +-+ subpkgParam Doc
-    putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library documentation"
-    putHdr "BuildArch" "noarch"
-    putNewline
-    put $ "%description" +-+ subpkgParam Doc
-    put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "library documentation."
-    put "%endif"
-    {- HLINT ignore "Reduce duplication"-}
-    sectionNewline
-    put "%if %{with ghc_prof}"
-    put $ "%package" +-+ subpkgParam Prof
-    putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "profiling library"
-    putHdr "Requires" $ baselibpkg ++ "-devel" ++ isa ++ versionRelease
-    putHdr "Supplements" $ "(" ++ baselibpkg ++ "-devel and ghc-prof)"
-    putNewline
-    put $ "%description" +-+ subpkgParam Prof
-    put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "profiling library."
-    put "%endif"
-    sectionNewline
+    when hasModules $ do
+      put "%if %{with haddock}"
+      put $ "%package" +-+ subpkgParam Doc
+      putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library documentation"
+      putHdr "BuildArch" "noarch"
+      putNewline
+      put $ "%description" +-+ subpkgParam Doc
+      put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "library documentation."
+      put "%endif"
+      {- HLINT ignore "Reduce duplication"-}
+      sectionNewline
+      put "%if %{with ghc_prof}"
+      put $ "%package" +-+ subpkgParam Prof
+      putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "profiling library"
+      putHdr "Requires" $ baselibpkg ++ "-devel" ++ isa ++ versionRelease
+      putHdr "Supplements" $ "(" ++ baselibpkg ++ "-devel and ghc-prof)"
+      putNewline
+      put $ "%description" +-+ subpkgParam Prof
+      put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "profiling library."
+      put "%endif"
+      sectionNewline
 
   when hasSubpkgs $ do
     global "main_version" "%{version}"
@@ -528,15 +521,16 @@
     -- put "# End cabal-rpm files"
     sectionNewline
 
-    put "%if %{with haddock}"
-    put $ "%files" +-+ filesParams Doc
-    mapM_ (\ l -> put $ license_macro +-+ l) licensefiles
-    put "%endif"
-    sectionNewline
-    put "%if %{with ghc_prof}"
-    put $ "%files" +-+ filesParams Prof
-    put "%endif"
-    sectionNewline
+    when hasModules $ do
+      put "%if %{with haddock}"
+      put $ "%files" +-+ filesParams Doc
+      mapM_ (\ l -> put $ license_macro +-+ l) licensefiles
+      put "%endif"
+      sectionNewline
+      put "%if %{with ghc_prof}"
+      put $ "%files" +-+ filesParams Prof
+      put "%endif"
+      sectionNewline
 
   put "%changelog"
   now <- getCurrentTime
@@ -565,7 +559,7 @@
 showLicense PublicDomain = "Public Domain"
 showLicense AllRightsReserved = "Proprietary"
 showLicense OtherLicense = "Unknown"
-                           -- FIXME
+-- FIXME
 showLicense (UnknownLicense l) = removePrefix "LicenseRef" l
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,16,0)
 showLicense (Apache Nothing) = "ASL ?"
@@ -610,12 +604,12 @@
     paragraphs :: [String] -> [String]
     paragraphs = map (unlines . filter notNull) . groupBy (const notNull)
 
-getsubpkgMacro :: Maybe Stream -> FilePath -> PackageName
+getsubpkgMacro :: Maybe Stream -> Maybe FilePath -> PackageName
                -> IO (String, PackageIdentifier)
-getsubpkgMacro mstream spec pkg = do
+getsubpkgMacro mstream mspec pkg = do
   let macro = filter (/= '-') $ display pkg
   pkgid <- latestPackage mstream pkg
-  bringTarball pkgid False spec
+  bringTarball pkgid False mspec
   return (macro, pkgid)
 
 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
@@ -19,7 +19,6 @@
   ) where
 
 import Commands.Spec (createSpecFile)
-import FileUtils (withTempDirectory)
 import Header (headerOption, withSpecHead)
 import PackageUtils (PackageData (..), bringTarball, editSpecField,
                      getRevisedCabal, getSpecField, latestPackage,
@@ -40,8 +39,9 @@
 import Data.Maybe (isJust)
 import Distribution.Text (display)
 import Distribution.Verbosity (silent)
-import System.Directory (createDirectory, renameFile, setCurrentDirectory)
-import System.FilePath ((</>), (<.>))
+import System.Directory (createDirectoryIfMissing, doesDirectoryExist,
+                         removeDirectoryRecursive, renameFile)
+import System.FilePath ((<.>))
 
 update :: Maybe PackageVersionSpecifier -> IO ()
 update mpvs = do
@@ -52,7 +52,8 @@
       let pkgDesc = packageDesc pkgdata
           oldPkgId = package pkgDesc
           name = pkgName oldPkgId
-          revised = isJust $ lookup "x-revision" (customFieldsPD pkgDesc)
+          wasrevised = isJust $ lookup "x-revision" (customFieldsPD pkgDesc)
+      putStrLn $ display oldPkgId +-+ "->"
       newPkgId <- case mpvs of
                     Nothing -> do
                       stream <-
@@ -81,37 +82,34 @@
       if newver < oldver
         then putStrLn $ "current" +-+ display oldver +-+ "is newer!"
         else do
-        getRevisedCabal newPkgId
+        newrev <- getRevisedCabal newPkgId
         unless updated $
           putStrLn "Package is already latest version."
-        when (not revised || updated) $
-          withTempDirectory $ \cwd -> do
-          let specfile = cwd </> spec
-          subpkg <- grep_ "%{subpkgs}" specfile
-          (curspec, _) <- createSpecVersion oldPkgId specfile revised subpkg
-          (newspec, newrevised) <- createSpecVersion newPkgId specfile True subpkg
-          currel <- getSpecField "Release" specfile
+        when (newrev || updated) $ do
+          subpkg <- grep_ "%{subpkgs}" spec
+          (curspec, _) <- createSpecVersion oldPkgId spec wasrevised subpkg
+          (newspec, newrevised) <- createSpecVersion newPkgId spec True subpkg
+          currel <- getSpecField "Release" spec
           let suffix = "%{?dist}"
               defrelease = "1"
-          editSpecField "Release" (defrelease ++ suffix) specfile
-          patchSpec False (Just cwd) curspec newspec
-          ver' <- readVersion <$> getSpecField "Version" specfile
+          editSpecField "Release" (defrelease ++ suffix) spec
+          patchSpec False Nothing curspec newspec
+          ver' <- readVersion <$> getSpecField "Version" spec
           when (ver' /= newver) $
-            editSpecField "Version" (showVersion newver) specfile
+            editSpecField "Version" (showVersion newver) spec
           if updated && not subpkg
-            then editSpecField "Release" (defrelease ++ suffix) specfile
-            else editSpecField "Release" (currel ++ suffix) specfile
+            then editSpecField "Release" (defrelease ++ suffix) spec
+            else editSpecField "Release" (currel ++ suffix) spec
           when updated $ do
             -- FIXME reset when all subpkgs updated
             unless subpkg $
-              editSpecField "Release" ("0" ++ suffix) specfile
-            cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ showVersion newver, specfile]
-            setCurrentDirectory cwd
+              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 spec
+            bringTarball newPkgId False (Just spec)
             distgit <- grepGitConfig "\\(pkgs\\|src\\)."
             when (rwGit && distgit) $ do
               cmd_ "fedpkg" ["new-sources", display newPkgId <.> "tar.gz"]
@@ -120,18 +118,19 @@
                 renameFile "sources.cblrpm" "sources"
               when newrevised $
                 cmd_ "git" ["add", display newPkgId <.> "cabal"]
-              when revised $
+              when wasrevised $
                 cmd_ "git" ["rm", display oldPkgId <.> "cabal"]
               cmd_ "git" ["commit", "-a", "-m", "update to" +-+ showVersion newver]
   where
     createSpecVersion :: PackageIdentifier -> String -> Bool -> Bool -> IO (FilePath, Bool)
     createSpecVersion pkgid spec revise subpkg = do
       pd <- prepare [] (streamPkgToPVS Nothing (Just pkgid)) revise
-      let pkgdata' = pd { specFilename = Just spec }
-          dir = display pkgid ++ if revise then ".revised" else ".orig"
-      createDirectory dir
+      let pkgdata = pd { specFilename = Just spec }
+          dir = ".Cblrpm/" ++ display pkgid ++ if revise then ".revised" else ".orig"
+      direxists <- doesDirectoryExist dir
+      when direxists $ removeDirectoryRecursive dir
+      createDirectoryIfMissing True dir
       newspec <- createSpecFile silent [] False (SpecFile spec) subpkg (Just dir) (streamPkgToPVS Nothing (Just pkgid))
       let newrevised =
-            let pkgDesc = packageDesc pkgdata' in
-              isJust $ lookup "x-revision" (customFieldsPD pkgDesc)
+            isJust $ lookup "x-revision" (customFieldsPD (packageDesc pkgdata))
       return (newspec, newrevised)
diff --git a/src/PackageUtils.hs b/src/PackageUtils.hs
--- a/src/PackageUtils.hs
+++ b/src/PackageUtils.hs
@@ -52,7 +52,7 @@
 #else
 import Control.Applicative ((<$>))
 #endif
-import Control.Monad    (filterM, unless, when)
+import Control.Monad    (filterM, unless, void, when)
 
 import Data.Char (toLower)
 import Data.List (isPrefixOf, isSuffixOf, nub, sort)
@@ -95,11 +95,13 @@
                       in any (`isPrefixOf` lowerName) names
         unlikely name = not $ any (`isSuffixOf` name) ["~", ".cabal"]
 
-bringTarball :: PackageIdentifier -> Bool -> FilePath -> IO ()
-bringTarball pkgid revise spec = do
-  havespec <- doesFileExist spec
+bringTarball :: PackageIdentifier -> Bool -> Maybe FilePath -> IO ()
+bringTarball pkgid revise mspec = do
+  havespec <- case mspec of
+                Nothing -> return False
+                Just spec -> doesFileExist spec
   sources <- if havespec
-             then map sourceFieldFile <$> cmdLines "spectool" ["-S", spec]
+             then map sourceFieldFile <$> cmdLines "spectool" ["-S", fromJust mspec]
              else return [tarfile]
   srcdir <- getSourceDir
   allExist <- and <$> mapM (doesFileExist . (srcdir </>)) sources
@@ -114,10 +116,10 @@
     mapM_ (copyTarball False srcdir) sources
     haveLocalCabal <- doesFileExist $ srcdir </> display pkgid <.> "cabal"
     when (not haveLocalCabal && revise) $
-      getRevisedCabal pkgid
+      void $ getRevisedCabal pkgid
     allExist' <- and <$> mapM (doesFileExist . (srcdir </>)) sources
-    unless allExist' $
-      cmd_ "spectool" ["-g", "-S", "-C", srcdir, spec]
+    when (not allExist' && havespec) $
+      cmd_ "spectool" ["-g", "-S", "-C", srcdir, fromJust mspec]
  where
   tarfile = display pkgid <.> "tar.gz"
 
@@ -165,7 +167,7 @@
       then getCurrentDirectory
       else fromJust <$> rpmEval "%{_sourcedir}"
 
-getRevisedCabal :: PackageIdentifier -> IO ()
+getRevisedCabal :: PackageIdentifier -> IO Bool
 getRevisedCabal pkgid = do
   let file = display (pkgName pkgid) <.> "cabal"
   dir <- getSourceDir
@@ -175,6 +177,7 @@
     when revised $ do
       cmd_ "dos2unix" ["--keepdate", file]
       renameFile file $ dir </> display pkgid <.> "cabal"
+    return revised
 
 data RpmStage = Binary | Source | Prep deriving Eq
 
@@ -342,7 +345,7 @@
           namever <- removePrefix "ghc-" . head <$> rpmspec ["--srpm"] (Just "%{name}-%{version}") specFile
           case simpleParse namever of
             Nothing -> error "pkgid could not be parsed"
-            Just pkgid -> bringTarball pkgid revise specFile
+            Just pkgid -> bringTarball pkgid revise (Just specFile)
           dExists <- doesDirectoryExist namever
           if dExists
             then do
@@ -419,15 +422,19 @@
       mspec <- checkForSpecFile (Just pkg)
       prepStreamPkg flags mspec stream pkg revise
 
+-- 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//"]
+  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/%%"]
   putStrLn diff
   unless dryrun $ do
     out <- cmdIgnoreErr "patch" opts diff
     putStrLn out
   where
-    opts = ["--fuzz=1"] ++ ["-p1" | '/' `elem` newspec] ++ maybe [] (\ d -> ["-d", d]) mdir
+    opts = ["--fuzz=1"] ++ ["-p" ++ show n | let n = count '/' newspec] ++ maybe [] (\ d -> ["-d", d]) mdir
+
+    count :: Eq a => a -> [a] -> Int
+    count x =  length . filter (==x)
 
 packageManager :: IO String
 packageManager = do
diff --git a/src/Stackage.hs b/src/Stackage.hs
--- a/src/Stackage.hs
+++ b/src/Stackage.hs
@@ -41,7 +41,7 @@
 import Types
 
 defaultLTS :: Stream
-defaultLTS = LTS "13"
+defaultLTS = LTS "14"
 
 latestLTS :: Stream
 latestLTS = LTS "14"
