diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Changelog
-
-`simple-cabal` uses [PVP Versioning](https://pvp.haskell.org)
-
-## 0.1.1 (2019-10-05)
-- fix tryFindPackageDesc on Cabal 3
-
-## 0.1.0 (2019-09-30)
-- add buildDependencies, setupDependencies, testsuiteDependencies
-  (from cabal-rpm), and tryFindPackageDesc
-- more deps compatibility: showVersion, depPkgName, exeDepName, pkgcfgDepName
-- export PackageName, mkPackageName, unPackageName,
-  allBuildInfo, BuildInfo, FlagName & mkFlagName, licenseFiles
-- no longer export: normal
-- support Cabal-3 (ghc-8.8.1)
-
-## 0.0.0.1 (2019-07-09)
-- allow building with Cabal 1!
-
-## 0.0.0 (2019-06-08)
-- Initially version, mostly taken from cabal-rpm PackageUtils.hs
diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,28 @@
+# Changelog
+
+`simple-cabal` uses [PVP Versioning](https://pvp.haskell.org)
+
+## 0.1.2 (2020-05-23)
+- readFinalPackageDescription deprecates finalPackageDescription
+- add makeFinalPackageDescription
+- add parseFinalPackageDescription for Cabal-2.2+
+- export simpleParse
+- export hasExes and hasLibs
+
+## 0.1.1 (2019-10-05)
+- fix tryFindPackageDesc on Cabal 3
+
+## 0.1.0 (2019-09-30)
+- add buildDependencies, setupDependencies, testsuiteDependencies
+  (from cabal-rpm), and tryFindPackageDesc
+- more deps compatibility: showVersion, depPkgName, exeDepName, pkgcfgDepName
+- export PackageName, mkPackageName, unPackageName,
+  allBuildInfo, BuildInfo, FlagName & mkFlagName, licenseFiles
+- no longer export: normal
+- support Cabal-3 (ghc-8.8.1)
+
+## 0.0.0.1 (2019-07-09)
+- allow building with Cabal 1!
+
+## 0.0.0 (2019-06-08)
+- Initially version, mostly taken from cabal-rpm PackageUtils.hs
diff --git a/SimpleCabal.hs b/SimpleCabal.hs
--- a/SimpleCabal.hs
+++ b/SimpleCabal.hs
@@ -2,7 +2,12 @@
 
 module SimpleCabal (
   findCabalFile,
+  readFinalPackageDescription,
   finalPackageDescription,
+#if MIN_VERSION_Cabal(2,2,0)
+  parseFinalPackageDescription,
+#endif
+  makeFinalPackageDescription,
   getPackageId,
 --  dependencies,
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,4,0)
@@ -16,6 +21,7 @@
   BuildInfo (..),
   depPkgName, exeDepName, pkgcfgDepName,
   FlagName, mkFlagName,
+  hasExes, hasLibs,
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)
 #else
   licenseFiles,
@@ -27,6 +33,7 @@
   readGenericPackageDescription,
   showPkgId,
   showVersion,
+  simpleParse,
   tryFindPackageDesc
   ) where
 
@@ -35,6 +42,9 @@
 import Control.Applicative ((<$>))
 #endif
 
+#if MIN_VERSION_Cabal(2,2,0)
+import qualified Data.ByteString.Char8 as B
+#endif
 import Data.List (delete, nub)
 
 import Distribution.Compiler
@@ -74,12 +84,13 @@
 #endif
   extraLibs,
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
-  FlagName, 
+  FlagName,
   mkFlagName,
 #else
   FlagName (..),
 #endif
   GenericPackageDescription(packageDescription),
+  hasExes, hasLibs,
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
   mkFlagAssignment,
 #endif
@@ -99,7 +110,8 @@
 import Distribution.PackageDescription.Configuration (finalizePackageDescription)
 #endif
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
-import Distribution.PackageDescription.Parsec (readGenericPackageDescription)
+import Distribution.PackageDescription.Parsec
+       (readGenericPackageDescription, parseGenericPackageDescriptionMaybe)
 #elif defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
 import Distribution.PackageDescription.Parse (readGenericPackageDescription)
 #else
@@ -136,6 +148,8 @@
 
 import Distribution.System (Platform (..), buildArch, buildOS)
 
+import Distribution.Text (simpleParse)
+
 import Distribution.Verbosity (normal,
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
 #else
@@ -164,7 +178,7 @@
 --
 -- Errors if more than one or no file found.
 --
--- since @0.0.0.1@
+-- @since 0.0.0.1
 findCabalFile :: IO FilePath
 findCabalFile = do
   allCabals <- filesWithExtension "." ".cabal"
@@ -180,7 +194,7 @@
 
 -- | Get the package name-version from the .cabal file in the current directory.
 --
--- since @0.0.0.1@
+-- @since 0.0.0.1
 getPackageId :: IO PackageIdentifier
 getPackageId = do
   gpd <- findCabalFile >>= readGenericPackageDescription normal
@@ -193,28 +207,60 @@
 readGenericPackageDescription = readPackageDescription
 #endif
 
+#if MIN_VERSION_Cabal(2,2,0)
+-- | only available with Cabal-2.2+
+--
+-- @since 0.1.2
+parseFinalPackageDescription :: [(FlagName, Bool)] -> B.ByteString
+                          -> IO (Maybe PackageDescription)
+parseFinalPackageDescription flags cabalfile = do
+  let mgenPkgDesc = parseGenericPackageDescriptionMaybe cabalfile
+  case mgenPkgDesc of
+    Nothing -> return Nothing
+    Just genPkgDesc -> Just <$> makeFinalPackageDescription flags genPkgDesc
+#endif
+
 -- | Generate PackageDescription from the specified .cabal file and flags.
 --
--- since @0.0.0.1@
+-- deprecated in favour of readFinalPackageDescription
+--
+-- @since 0.0.0.1
 finalPackageDescription :: [(FlagName, Bool)] -> FilePath
                           -> IO PackageDescription
-finalPackageDescription flags cabalfile = do
+finalPackageDescription = readFinalPackageDescription
+
+-- | get PackageDescription from a cabal file
+--
+-- deprecates finalPackageDescription
+--
+-- @since 0.1.2
+readFinalPackageDescription :: [(FlagName, Bool)] -> FilePath
+                            -> IO PackageDescription
+readFinalPackageDescription flags cabalfile =
+  readGenericPackageDescription normal cabalfile >>=
+  makeFinalPackageDescription flags
+
+-- | convert a GenericPackageDescription to a final PackageDescription
+--
+-- @since 0.1.2
+makeFinalPackageDescription :: [(FlagName, Bool)] -> GenericPackageDescription
+                            -> IO PackageDescription
+makeFinalPackageDescription flags genPkgDesc = do
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
 #else
   let defaultProgramDb = defaultProgramConfiguration
 #endif
-  genPkgDesc <- readGenericPackageDescription normal cabalfile
   compiler <- do
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,18,0)
-                              (compiler, _, _) <- configCompilerEx
+    (compiler, _, _) <- configCompilerEx
 #else
-                              (compiler, _) <- configCompiler
+    (compiler, _) <- configCompiler
 #endif
-                                (Just GHC) Nothing Nothing defaultProgramDb normal
+       (Just GHC) Nothing Nothing defaultProgramDb normal
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,22,0)
-                              return (compilerInfo compiler)
+    return (compilerInfo compiler)
 #else
-                              return (compilerId compiler)
+    return (compilerId compiler)
 #endif
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
 #else
@@ -245,6 +291,7 @@
   let self = pkgName $ package pkgDesc in
   delete self . nub . map depPkgName $ concatMap (targetBuildDepends . testBuildInfo) (testSuites pkgDesc)
 
+-- | version string from PackageIdentifier
 packageVersion :: PackageIdentifier -> String
 packageVersion =
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
@@ -253,6 +300,7 @@
   showVersion . pkgVersion
 #endif
 
+-- | convert PackageIdentifier to a displayable string
 showPkgId :: PackageIdentifier -> String
 showPkgId pkgid =
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
@@ -268,6 +316,7 @@
 #endif
 
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)
+-- | render a Version
 showVersion :: Distribution.Version.Version -> String
 showVersion = prettyShow
 #endif
@@ -278,6 +327,7 @@
 mkFlagName = FlagName
 #endif
 
+-- | Find cabal file
 tryFindPackageDesc :: FilePath -> IO FilePath
 tryFindPackageDesc =
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)
@@ -291,29 +341,36 @@
 
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)
 #else
+-- | singleton list of license file
 licenseFiles :: PackageDescription -> [FilePath]
 licenseFiles pkgDesc =
   [licenseFile pkgDesc | licenseFile pkgDesc /= ""]
 #endif
 
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,4,0)
+-- | List build dependencies
 buildDepends :: PackageDescription -> [Dependency]
 buildDepends = flip enabledBuildDepends defaultComponentRequestedSpec
 #endif
 
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+-- | name of legacy exe dep
 exeDepName :: LegacyExeDependency -> String
 exeDepName (LegacyExeDependency n _) = n
 
+-- | pkgconfig dep name
 pkgcfgDepName :: PkgconfigDependency -> String
 pkgcfgDepName (PkgconfigDependency n _) = unPkgconfigName n
 #else
+-- | PackageName of dependency
 depPkgName :: Dependency -> PackageName
 depPkgName (Dependency pn _) = pn
 
+-- | name of dependency
 exeDepName :: Dependency -> String
 exeDepName = unPackageName . depPkgName
 
+-- | name of dependency
 pkgcfgDepName :: Dependency -> String
 pkgcfgDepName = unPackageName . depPkgName
 #endif
@@ -324,6 +381,7 @@
 mkPackageName = PackageName
 #endif
 
+-- | List of setup dependencies
 setupDependencies :: PackageDescription  -- ^pkg description
                   -> [PackageName]         -- ^depends
 #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,24,0)
diff --git a/simple-cabal.cabal b/simple-cabal.cabal
--- a/simple-cabal.cabal
+++ b/simple-cabal.cabal
@@ -1,6 +1,6 @@
 cabal-version:       >= 1.10
 name:                simple-cabal
-version:             0.1.1
+version:             0.1.2
 synopsis:            Cabal file wrapper library
 description:         Find and read .cabal files, and
                      a Cabal dependency compatibility layer.
@@ -14,10 +14,10 @@
 category:            Distribution
 build-type:          Simple
 extra-source-files:  README.md
-                   , CHANGELOG.md
-tested-with:         GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2,
-                     GHC == 8.0.2, GHC == 7.10.3, GHC == 7.8.4, GHC == 7.6.3,
-                     GHC == 7.4.2, GHC == 7.0.4
+                   , ChangeLog.md
+tested-with:         GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4,
+                     GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3, GHC == 7.8.4,
+                     GHC == 7.6.3, GHC == 7.4.2, GHC == 7.0.4
 
 source-repository head
   type:                git
@@ -25,9 +25,10 @@
 
 library
   exposed-modules:     SimpleCabal
-                       
 
+
   build-depends:       base < 5,
+                       bytestring,
                        Cabal,
                        directory,
                        filepath
