diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,13 @@
-* 0.7.1
+* 0.8.0 (2013-05-31)
+- new simplier revision to Fedora Packaging
+  - drop %common_summary and %common_description
+  - drop %ghc_package, %ghc_description, %ghc_devel_package,
+    %ghc_devel_description, %ghc_devel_post_postun, %ghc_files,
+    and %ghc_devel_requires
+- check external programs available before use
+- tweaks for ghc-7.6.3 and Cabal-1.16
+
+* 0.7.1 (2013-03-22)
 - add final full-stop to description if missing
 - add ver-rel to initial changelog entry
 - fix use of cblrpm-diff force lib option
@@ -7,7 +16,7 @@
 - output when trying a path
 - map curl C dep to libcurl
 
-* 0.7.0
+* 0.7.0 (2013-01-22)
 - cabal-rpm command renamed to cblrpm, and cabal-rpm-diff to cblrpm-diff
 - cblrpm now has commands for spec, srpm, and build
 - cblrpm will try to install packaged uninstalled depends with sudo yum install
@@ -17,7 +26,7 @@
 - sort extralibs depends
 - cleanup of unused options and help output
 
-* 0.6.6
+* 0.6.6 (2012-11-21)
 - generate BRs and Req's for C libraries (extra-libraries)
 - initial map for some C libs: libglut, libiw, libz, libX*
 - generate BRs and Req's for pkgconfig-depends
@@ -27,7 +36,7 @@
 - backup suffix changed from .cabal-rpm to .cblrpm
 - don't mistake non-existent file in cwd for a package
 
-* 0.6.5
+* 0.6.5 (2012-11-01)
 - drop hscolour BuildRequires
 - simplify generated BuildRequires: drop version ranges for now,
   exclude pkg self, base libs, and Cabal
diff --git a/cabal-rpm.cabal b/cabal-rpm.cabal
--- a/cabal-rpm.cabal
+++ b/cabal-rpm.cabal
@@ -1,11 +1,13 @@
 Name:                cabal-rpm
-Version:             0.7.1
+Version:             0.8.0
 Synopsis:            RPM package creator for Haskell Cabal-based packages
 Description:
     This package generates RPM spec files from Haskell Cabal packages.
     .
     Recent changes:
     .
+    * 0.8.0: new simpler revised Fedora packaging; check external commands available
+    .
     * 0.7.1: various bugfixes and minor improvments
     .
     * 0.7.0: command arg for spec, srpm, or build; installs existing packaged depends with sudo yum
@@ -53,6 +55,8 @@
     Other-modules:
         Distribution.Package.Rpm,
         Distribution.Package.Rpm.Main,
-        Distribution.Package.Rpm.Setup
+        Distribution.Package.Rpm.Setup,
+        Distribution.Package.Rpm.Utils
     Hs-Source-Dirs:     src
     GHC-options:        -fwarn-missing-signatures -Wall
+    Extensions:         CPP
diff --git a/man/cblrpm.1 b/man/cblrpm.1
--- a/man/cblrpm.1
+++ b/man/cblrpm.1
@@ -59,7 +59,7 @@
 .IP
 .nf
 \f[C]
-cblrpm
+cblrpm\ spec
 \f[]
 .fi
 .PP
@@ -67,7 +67,7 @@
 .IP
 .nf
 \f[C]
-cblrpm\ [package]
+cblrpm\ spec\ [package]
 \f[]
 .fi
 .PP
@@ -75,7 +75,7 @@
 .IP
 .nf
 \f[C]
-cblrpm\ [package\-version]
+cblrpm\ spec\ [package\-version]
 \f[]
 .fi
 .PP
@@ -83,7 +83,7 @@
 .IP
 .nf
 \f[C]
-cblrpm\ path/to/some.cabal
+cblrpm\ spec\ path/to/some.cabal
 \f[]
 .fi
 .PP
@@ -91,7 +91,7 @@
 .IP
 .nf
 \f[C]
-cblrpm\ path/to/pkg\-ver.tar.gz
+cblrpm\ spec\ path/to/pkg\-ver.tar.gz
 \f[]
 .fi
 .SH HISTORY
diff --git a/man/cblrpm.1.md b/man/cblrpm.1.md
--- a/man/cblrpm.1.md
+++ b/man/cblrpm.1.md
@@ -51,23 +51,23 @@
 # EXAMPLES
 Create a .spec file for the Cabal src package in current directory:
 
-    cblrpm
+    cblrpm spec
 
 Create a .spec file for package (directory or package name):
  
-    cblrpm [package]
+    cblrpm spec [package]
 
 Create a .spec file for package-version (directory or package name):
 
-    cblrpm [package-version]
+    cblrpm spec [package-version]
 
 Create a .spec file for a .cabal file:
 
-    cblrpm path/to/some.cabal
+    cblrpm spec path/to/some.cabal
 
 Create a .spec file from a tarball:
 
-    cblrpm path/to/pkg-ver.tar.gz
+    cblrpm spec path/to/pkg-ver.tar.gz
 
 # HISTORY
 Cabal-rpm was originally written by Bryan O'Sullivan in 2007-2008
diff --git a/src/Distribution/Package/Rpm.hs b/src/Distribution/Package/Rpm.hs
--- a/src/Distribution/Package/Rpm.hs
+++ b/src/Distribution/Package/Rpm.hs
@@ -21,7 +21,7 @@
 --import Control.Exception (bracket)
 import Control.Monad    (unless, void, when)
 import Data.Char        (toLower)
-import Data.List        (intercalate, isPrefixOf, isSuffixOf, nub, sort)
+import Data.List        (isPrefixOf, isSuffixOf, nub, sort)
 import Data.Maybe       (fromMaybe)
 import Data.Time.Clock  (UTCTime, getCurrentTime)
 import Data.Time.Format (formatTime)
@@ -31,16 +31,16 @@
 import Distribution.Package  (Dependency (..), PackageIdentifier (..),
                               PackageName (..))
 
-import Distribution.Simple.Utils (die, warn)
+import Distribution.Simple.Utils (warn)
 
 import Distribution.PackageDescription (PackageDescription (..), exeName,
                                         hasExes, hasLibs, withExe, allBuildInfo,
                                         BuildInfo (..))
 
-import Distribution.Verbosity (normal)
 --import Distribution.Version (VersionRange, foldVersionRange')
 
 import Distribution.Package.Rpm.Setup (RpmFlags (..))
+import Distribution.Package.Rpm.Utils (trySystem, optionalSudo, (+-+))
 
 import System.Cmd (system)
 import System.Directory (doesDirectoryExist, doesFileExist,
@@ -55,11 +55,6 @@
 
 import qualified Paths_cabal_rpm (version)
 
-(+-+) :: String -> String -> String
-"" +-+ s = s
-s +-+ "" = s
-s +-+ t = s ++ " " ++ t
-
 -- autoreconf :: Verbosity -> PackageDescription -> IO ()
 -- autoreconf verbose pkgDesc = do
 --     ac <- doesFileExist "configure.ac"
@@ -69,16 +64,16 @@
 --             setupMessage verbose "Running autoreconf" pkgDesc
 --             trySystem "autoreconf"
 
-unlessSystem :: String -> String -> IO ()
-unlessSystem tst act = do
+unlessSudo :: String -> String -> IO ()
+unlessSudo tst act = do
     ret <- system tst
     case ret of
       ExitSuccess -> return ()
-      ExitFailure _ -> void $ trySystemWarn act
+      ExitFailure _ -> void $ optionalSudo act
 
 maybeInstall :: String -> IO ()
 maybeInstall pkg = do
-    unlessSystem ("rpm -q" +-+ pkg) ("sudo yum install" +-+ pkg)
+    unlessSudo ("rpm -q" +-+ pkg) ("yum install" +-+ pkg)
 
 rpmBuild :: FilePath -> PackageDescription -> RpmFlags -> Bool -> IO ()
 rpmBuild cabalPath pkgDesc flags binary = do
@@ -95,7 +90,7 @@
     let pkg = package pkgDesc
         name = packageName pkg
     when binary $ do
-        --      trySystem ("sudo yum-builddep" +-+ specFile)
+        -- optionalSystem ("sudo yum-builddep" +-+ specFile)
         mapM_ maybeInstall $ map showDep $ buildDependencies pkgDesc [name]
     cwd <- getCurrentDirectory
     home <- getEnv "HOME"
@@ -115,20 +110,6 @@
                      "--define \"_sourcedir" +-+ srcdir ++ "\"" +-+
                      specFile)
 
-trySystem :: String -> IO ()
-trySystem cmd = do
-    ret <- system cmd
-    case ret of
-      ExitSuccess -> return ()
-      ExitFailure n -> die ("\"" ++ cmd ++ "\"" +-+ "failed with status" +-+ show n)
-
-trySystemWarn :: String -> IO ()
-trySystemWarn cmd = do
-    ret <- system cmd
-    case ret of
-      ExitSuccess -> return ()
-      ExitFailure n -> warn normal ("\"" ++ cmd ++ "\"" +-+ "failed with status" +-+ show n)
-
 defaultRelease :: UTCTime -> IO String
 defaultRelease now = do
     darcsRepo <- doesDirectoryExist "_darcs"
@@ -183,21 +164,21 @@
         specFile = pkgname ++ ".spec"
         isExec = if (rpmLibrary flags) then False else hasExes pkgDesc
         isLib = hasLibs pkgDesc
+        isBinLib = isExec && isLib
     specAlreadyExists <- doesFileExist specFile
     let specFilename = specFile ++ if specAlreadyExists then ".cblrpm" else ""
     when specAlreadyExists $ putStrLn $ specFile +-+ "exists:" +-+ "creating" +-+ specFilename
     h <- openFile specFilename WriteMode
     let putHdr hdr val = hPutStrLn h (hdr ++ ":" ++ padding hdr ++ val)
-        padding hdr = replicate (15 - length hdr) ' '
-        putHdr_ hdr val = unless (null val) $ putHdr hdr val
-        putHdrD hdr val dfl = putHdr hdr (if null val then dfl else val)
+        padding hdr = replicate (14 - length hdr) ' ' ++ " "
         putNewline = hPutStrLn h ""
         put = hPutStrLn h
         putDef v s = put $ "%global" +-+ v +-+ s
         date = formatTime defaultTimeLocale "%a %b %e %Y" now
+        ghcPkg = if isBinLib then "-n ghc-%{name}" else ""
+        ghcPkgDevel = if isBinLib then "-n ghc-%{name}-devel" else "devel"
 
     put "# https://fedoraproject.org/wiki/Packaging:Haskell"
-    put "# https://fedoraproject.org/wiki/PackagingDrafts/Haskell"
     putNewline
 
     -- Some packages conflate the synopsis and description fields.  Ugh.
@@ -206,7 +187,7 @@
               (x:_) -> return (x, x /= syn)
               _ -> do warn verbose "This package has no synopsis."
                       return ("Haskell" +-+ name +-+ "package", False)
-    let common_summary = if synTooLong
+    let summary = if synTooLong
                          then syn' +-+ "[...]"
                          else rstrip (== '.') syn'
     when synTooLong $
@@ -222,20 +203,14 @@
     when isLib $ do
       putDef "pkg_name" name
       putNewline
-      putDef "common_summary" common_summary
-      putNewline
-      putDef "common_description" $ intercalate "\\\n" common_description
-      putNewline
 
     putHdr "Name" (if isExec then (if isLib then "%{pkg_name}" else pkgname) else "ghc-%{pkg_name}")
     putHdr "Version" version
     putHdr "Release" $ release ++ "%{?dist}"
-    if isLib
-      then putHdr "Summary" "%{common_summary}"
-      else putHdrD "Summary" common_summary "This package has no summary"
+    putHdr "Summary" summary
     putNewline
     putHdr "License" $ (showLicense . license) pkgDesc
-    putHdr_ "URL" $ "http://hackage.haskell.org/package/" ++ pkg_name
+    putHdr "URL" $ "http://hackage.haskell.org/package/" ++ pkg_name
     putHdr "Source0" $ "http://hackage.haskell.org/packages/archive/" ++ pkg_name ++ "/%{version}/" ++ pkg_name ++ "-%{version}.tar.gz"
     putNewline
     putHdr "BuildRequires" "ghc-Cabal-devel"
@@ -273,10 +248,33 @@
     putNewline
 
     put "%description"
-    put $ if isLib then "%{common_description}" else unlines common_description
-    putNewline
+    put $ unlines common_description
     putNewline
 
+    when isLib $ do
+      when isExec $ do
+        put $ "%package" +-+ ghcPkg
+        putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library"
+        putNewline
+        put $ "%description" +-+ ghcPkg
+        put $ unlines common_description
+        putNewline
+      put $ "%package" +-+ ghcPkgDevel
+      putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library development files"
+      putHdr "Requires" "ghc-compiler = %{ghc_version}"
+      putHdr "Requires(post)" "ghc-compiler = %{ghc_version}"
+      putHdr "Requires(postun)" "ghc-compiler = %{ghc_version}"
+      putHdr "Requires" $ (if isExec then "ghc-%{name}" else "%{name}") +-+ "= %{version}-%{release}"
+      when (not . null $ clibs ++ pkgcfgs) $ do
+        put "# Begin cabal-rpm deps:"
+        mapM_ (putHdr "Requires") $ map (++ "-devel%{?_isa}") clibs
+        mapM_ (putHdr "Requires") $ map showPkgCfg pkgcfgs
+        put "# End cabal-rpm deps"
+      putNewline
+      put $ "%description" +-+ ghcPkgDevel
+      put $ "This package provides the Haskell" +-+ name +-+ "library development files."
+      putNewline
+
     put "%prep"
     put $ "%setup -q" ++ (if pkgname /= name then " -n %{pkg_name}-%{version}" else "")
     putNewline
@@ -293,25 +291,13 @@
     putNewline
     putNewline
 
-    when (isExec && isLib) $ do
-      put "%ghc_package"
-      putNewline
-      put "%ghc_description"
-      putNewline
-      putNewline
-
     when isLib $ do
-      put "%ghc_devel_package"
-      when (not . null $ clibs ++ pkgcfgs) $ do
-        put "# Begin cabal-rpm deps:"
-        mapM_ (putHdr "Requires") $ map (++ "-devel%{?_isa}") clibs
-        mapM_ (putHdr "Requires") $ map showPkgCfg pkgcfgs
-        put "# End cabal-rpm deps"
-      putNewline
-      put "%ghc_devel_description"
+      put $ "%post" +-+ ghcPkgDevel
+      put "%ghc_pkg_recache"
       putNewline
       putNewline
-      put "%ghc_devel_post_postun"
+      put $ "%postun" +-+ ghcPkgDevel
+      put "%ghc_pkg_recache"
       putNewline
       putNewline
 
@@ -336,7 +322,13 @@
       putNewline
 
     when isLib $ do
-      put $ "%ghc_files" +-+ licenseFile pkgDesc
+      let baseFiles = if isBinLib then "-f ghc-%{name}.files" else "-f %{name}.files"
+          develFiles = if isBinLib then "-f ghc-%{name}-devel.files" else "-f %{name}-devel.files"
+      put $ "%files" +-+ ghcPkg +-+ baseFiles
+      put $ "%doc" +-+ licenseFile pkgDesc
+      putNewline
+      putNewline
+      put $ "%files" +-+ ghcPkgDevel +-+  develFiles
       unless (null docs) $
         put $ "%doc" +-+ unwords docs
       putNewline
@@ -373,3 +365,7 @@
 showLicense AllRightsReserved = "Proprietary"
 showLicense OtherLicense = "Unknown"
 showLicense (UnknownLicense l) = "Unknown" +-+ l
+#if MIN_VERSION_Cabal(1,16,0)
+showLicense (Apache Nothing) = "ASL ?"
+showLicense (Apache (Just ver)) = "ASL" +-+ showVersion ver
+#endif
diff --git a/src/Distribution/Package/Rpm/Main.hs b/src/Distribution/Package/Rpm/Main.hs
--- a/src/Distribution/Package/Rpm/Main.hs
+++ b/src/Distribution/Package/Rpm/Main.hs
@@ -17,6 +17,8 @@
 import Distribution.Compiler (CompilerFlavor (..))
 import Distribution.Package.Rpm (createSpecFile, rpmBuild)
 import Distribution.Package.Rpm.Setup (RpmFlags (..), parseArgs)
+import Distribution.Package.Rpm.Utils (tryReadProcess, trySystem)
+
 import Distribution.PackageDescription (GenericPackageDescription (..),
                                         PackageDescription (..))
 import Distribution.PackageDescription.Configuration (finalizePackageDescription)
@@ -31,7 +33,6 @@
                          removeDirectoryRecursive, setCurrentDirectory)
 import System.Environment (getArgs)
 import System.FilePath.Posix (takeExtension)
-import System.Process (readProcess, system)
 
 main :: IO ()
 main = do (opts, args) <- getArgs >>= parseArgs
@@ -73,7 +74,7 @@
   isdir <- doesDirectoryExist path
   if isdir
     then do
-      putStrLn $ "Trying: " ++ path ++ "/"
+      putStrLn $ "Using " ++ path ++ "/"
       file <- findPackageDesc path
       return (file, Nothing)
     else do
@@ -88,8 +89,8 @@
              else if isSuffixOf ".tar.gz" path
                   then do
                     tmpdir <- mktempdir
-                    _ <- system $ "tar zxf " ++ path ++ " -C " ++ tmpdir ++ " *.cabal"
-                    subdir <- readProcess "ls" [tmpdir] []
+                    trySystem $ "tar zxf " ++ path ++ " -C " ++ tmpdir ++ " *.cabal"
+                    subdir <- tryReadProcess "ls" [tmpdir]
                     file <- findPackageDesc $ tmpdir ++ "/" ++ init subdir
                     return (file, Just tmpdir)
                   else error $ path ++ ": file should be a .cabal or .tar.gz file."
@@ -98,7 +99,7 @@
 tryUnpack pkg = do
   pkgver <- if elem '.' pkg then return pkg
             else do
-              contains_pkg <- readProcess "cabal" ["list", "--simple-output", pkg] []
+              contains_pkg <- tryReadProcess "cabal" ["list", "--simple-output", pkg]
               let pkgs = filter ((== pkg) . fst . break (== ' ')) $ lines contains_pkg
               return $ map (\c -> if c == ' ' then '-' else c) $ last pkgs
   isdir <- doesDirectoryExist pkgver
@@ -110,12 +111,12 @@
     cwd <- getCurrentDirectory
     tmpdir <- mktempdir
     setCurrentDirectory tmpdir
-    _ <- system $ "cabal unpack -v0 " ++ pkgver
+    trySystem $ "cabal unpack -v0 " ++ pkgver
     pth <- findPackageDesc pkgver
     setCurrentDirectory cwd
     return (tmpdir ++ "/" ++ pth, Just tmpdir)
 
 mktempdir :: IO FilePath
 mktempdir = do
-  mktempOut <- readProcess "mktemp" ["-d"] []
+  mktempOut <- tryReadProcess "mktemp" ["-d"]
   return $ init mktempOut
diff --git a/src/Distribution/Package/Rpm/Utils.hs b/src/Distribution/Package/Rpm/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Distribution/Package/Rpm/Utils.hs
@@ -0,0 +1,74 @@
+-- |
+-- Module      :  Distribution.Package.Rpm.Utils
+-- Copyright   :  Jens Petersen 2013
+--
+-- Maintainer  :  Jens Petersen <petersen@fedoraproject.org>
+-- Stability   :  alpha
+-- Portability :  portable
+--
+-- Explanation: Command line option processing for building RPM
+-- packages.
+
+-- This software may be used and distributed according to the terms of
+-- the GNU General Public License, incorporated herein by reference.
+
+module Distribution.Package.Rpm.Utils (
+  requireProgram,
+  trySystem,
+  tryReadProcess,
+  optionalSudo,
+  (+-+)) where
+
+import Control.Monad    (when)
+import Data.Maybe       (isJust, isNothing)
+
+import Distribution.Simple.Utils (die, warn, findProgramLocation)
+import Distribution.Verbosity (normal)
+
+import System.Process (readProcess, system)
+import System.Exit (ExitCode(..))
+
+requireProgram :: String -> IO ()
+requireProgram cmd = do
+    mavail <- findProgramLocation normal cmd
+    when (isNothing mavail) $ die (cmd ++ ": command not found")
+
+optionalProgram :: String -> IO Bool
+optionalProgram cmd = do
+    mavail <- findProgramLocation normal cmd
+    when (isNothing mavail) $ warn normal (cmd ++ ": command not found")
+    return $ isJust mavail
+
+optionalSudo :: String -> IO ()
+optionalSudo cmd = do
+    havesudo <- optionalProgram "sudo"
+    when havesudo $ do
+      let argv = words cmd
+          cmd0 =  head argv 
+      mavail <- findProgramLocation normal cmd0
+      case mavail of
+        Nothing -> warn normal $ cmd0 ++ ": command not found"
+        Just _ -> do
+          ret <- system $ "sudo" +-+ cmd
+          case ret of
+            ExitSuccess -> return ()
+            ExitFailure n -> warn normal ("\"" ++ cmd ++ "\"" +-+ "failed with status" +-+ show n)
+
+trySystem :: String -> IO ()
+trySystem cmd = do
+    requireProgram $ head $ words cmd
+    ret <- system cmd
+    case ret of
+      ExitSuccess -> return ()
+      ExitFailure n -> die ("\"" ++ cmd ++ "\"" +-+ "failed with status" +-+ show n)
+
+tryReadProcess :: FilePath -> [String] -> IO String
+tryReadProcess cmd args = do
+  requireProgram cmd
+  readProcess cmd args []
+
+(+-+) :: String -> String -> String
+"" +-+ s = s
+s +-+ "" = s
+s +-+ t = s ++ " " ++ t
+
