diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,297 @@
+## v0.8.3.0 (2023-05-06)
+
+Release v0.8.3.0
+
+- Add `[profile?]` by default to dev-lang/ghc in RDEPEND
+
+  Packages that require profiling and depend on the 'base' library
+  (e.g. all of them) will need USE=profile on ghc.
+
+- Only add current ARCH to KEYWORDS
+
+  No longer pass KEYWORDS forward from previous ebuilds. Only add
+  current ARCH by default.
+
+## v0.8.2.2 (2023-04-29)
+
+v0.8.2.2
+
+Set modern defaults for LocalInfo in Portage.Host (this will help in
+the event that askPortageq fails, such as on a clean stage3 chroot)
+
+## v0.8.2.1 (2023-04-02)
+
+v0.8.2.1
+
+Allow Setup.hs to work without cabal-doctest
+
+## v0.8.2.0 (2023-03-03)
+
+v0.8.2.0
+
+Update GHCCore dependency list:
+
+- Mark 'stm' as non-upgradeable, 'parsec' and 'text' as upgradeable
+- Update bundled version of 'process'
+- Add `ghc-9.2.*` entries
+- Remove ancient `<ghc-8.8` entries
+
+## v0.8.1.0 (2023-02-16)
+
+v0.8.1.0
+
+- Revert change that adds dev-haskell/process to ebuilds
+
+## v0.8.0.0 (2022-12-25)
+
+v0.8.0.0
+
+- Switch 'cabal' submodule to new 3.8 branch
+- Use new updateAction from cabal-install
+- Builds on ghc-9.2
+- Make process an upgradeable package
+
+Thanks-to: Miezhiko <Miezhiko@gmail.com>
+
+## v0.7.3.1 (2022-12-07)
+
+Bump to v0.7.3.1
+
+- Support optparse-applicative-0.17
+
+## v0.7.3.0 (2022-08-26)
+
+Add remote-id support for metadata.xml
+
+## v0.7.2.1 (2022-07-23)
+
+Release v0.7.2.1
+
+## v0.7.2 (2022-07-19)
+
+Release v0.7.2
+
+Main change is automated hackage revision
+handling when using 'hackport merge'.
+
+## v0.7.1.2 (2022-07-17)
+
+Release version 0.7.1.2
+
+Main user-facing change is the removal of repoman.
+
+## v0.7.1.1 (2022-02-19)
+
+Tag version 0.7.1.1: minor .cabal file fixes
+
+## v0.7.1 (2022-02-19)
+
+Tag version 0.7.1. Main changes include:
+
+- ghc-9.0.2 library detection and bundled library changes
+- bumped and patched submodules for compatibility with newer deps
+- miscellaneous changes to test-suite, http-only websites list, docs
+  and .cabal file.
+
+## v0.7 (2021-07-10)
+
+release 0.7
+
+## v0.6.7 (2020-12-18)
+
+release v0.6.7
+
+## v0.6.6 (2020-07-27)
+
+Release v0.6.6
+
+Changes:
+
+* Add `Hspec` test suite, migrating older `HUnit` tests to `Hspec`.
+
+  There are currently 55 tests validating parsers, `metadata.xml`
+  generators, licence converters and more to mitigate against
+  unintended regressions
+
+* Add `doctest` test suite to validate code comments.
+
+  Although hackport is not a library, code comments are still
+  important. Where we have code examples, let's make sure they are
+  correct
+
+* Comment the code in many places
+
+* Refactor code, such as splitting `Merge.hs` between itself and
+  `Merge/Utils.hs`, applying some hlint suggestions, and addressing
+  some compiler warnings
+
+* Fix a bug in the `Suffix` parser
+
+* Raise `base` lower bound to 4.9 (hackport has not been able to build
+  on `base-4.8` for many versions)
+
+* Add GitHub CI for the GHC versions 8.0 -> 8.10 inclusive
+
+* Set licence to GPL-3 in `.cabal` file, which it always was
+
+* Rebase onto `Cabal-3.4` and `hackage-security-0.6.0.1` submodules
+
+* Improve licence handling to more accurately generate the correct
+  licence string where possible. This also fixes a regression which
+  snuck in after a previous `Cabal` submodule upgrade, which would
+  generate invalid GPL licence strings if the package's `.cabal` file
+  used a `SPDX` licence identifier such as `GPL-<v>-or-later`
+
+* Automate the addition of new USE flags into an existing
+  `metadata.xml`.
+
+  This new functionality alerts the user to the new `USE` flags (if
+  any), and overwrites the existing `metadata.xml` with the union of
+  the existing and new `USE` flags. This also updates any `USE` flag
+  descriptions, as well as any other updated `metadata.xml` elements
+
+* Add `GHC-8.8.4` library detection.
+
+## v0.6.5 (2020-07-01)
+
+Release 0.6.5
+
+## v0.6.4 (2020-01-31)
+
+Release 0.6.4
+
+## v0.6.3 (2020-01-19)
+
+hackport.cabal: release 0.6.3
+
+Signed-off-by: Jack Todaro <jack.todaro@posteo.net>
+
+## v0.6.2 (2020-01-04)
+
+release v0.6.2
+
+## v0.6.1 (2019-10-07)
+
+Release v0.6.1
+
+## v0.6 (2019-02-04)
+
+New in 0.6:
+
+* Builds with GHC 8.6
+* Generates EAPI 7-compliant ebuilds
+* Generates USE flags in the metadata.xml if the file does not yet exist.
+
+## v0.5.6 (2018-05-30)
+
+release 0.5.6
+
+## v0.5.5 (2018-03-15)
+
+release v0.5.5
+
+## v0.5.4 (2017-09-23)
+
+Release v0.5.4
+
+## v0.5.3 (2017-05-24)
+
+release v0.5.3
+
+## v0.5.2 (2017-02-25)
+
+tag v0.5.2
+
+## v0.5.1 (2016-11-12)
+
+release v0.5.1
+
+## v0.5 (2016-04-20)
+
+release 0.5
+
+## v0.4.7 (2016-02-06)
+
+release 0.4.6
+
+## v0.4.6 (2015-08-12)
+
+release 0.4.6
+
+## v0.4.5 (2015-03-28)
+
+release 0.4.5
+
+## v0.4.4 (2014-09-26)
+
+release v0.4.4
+
+## v0.4.3 (2014-07-24)
+
+release 0.4.3
+
+## v0.4.2 (2014-05-29)
+
+release 0.4.2
+
+## v0.4.1 (2014-05-29)
+
+release 0.4.1
+
+## v0.4 (2014-04-05)
+
+release v0.4
+
+## v0.3.6 (2014-01-07)
+
+tag release v0.3.6
+
+## v0.3.5 (2013-11-28)
+
+hackport.cabal: tag 0.3.5
+
+Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
+
+## v0.3.4 (2013-09-14)
+
+release 0.3.4
+
+## v0.3.3 (2013-07-31)
+
+release 0.3.3
+
+## v0.3.2 (2013-01-01)
+
+release v0.3.2
+
+## v0.3.1 (2012-11-28)
+
+release 0.3.1
+
+## v0.3 (2012-10-17)
+
+release 0.3
+
+## v0.2.19 (2012-09-24)
+
+release 0.2.19
+
+## v0.2.18 (2012-05-29)
+
+release 0.2.18
+
+## v0.2.17 (2012-02-29)
+
+release 0.2.17
+
+## v0.2.16 (2012-02-16)
+
+release 0.2.16
+
+## v0.2.15 (2012-02-05)
+
+release 0.2.15
+
+## v0.2.14 (2011-11-28)
+
+release 0.2.13
diff --git a/hackport.cabal b/hackport.cabal
--- a/hackport.cabal
+++ b/hackport.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name:          hackport
-version:       0.8.2.2
+version:       0.8.3.0
 license:       GPL-3.0-or-later
 license-file:  LICENSE
 author:        Henning Günther, Duncan Coutts, Lennart Kolmodin
diff --git a/src/Merge.hs b/src/Merge.hs
--- a/src/Merge.hs
+++ b/src/Merge.hs
@@ -14,6 +14,7 @@
   , mergeGenericPackageDescription
   ) where
 
+import           Control.Applicative
 import           Control.Monad
 import           Control.Exception.Lifted
 import qualified Data.Text as T
@@ -211,7 +212,7 @@
       merged_PN = Portage.cabal_pn_to_PN merged_cabal_pkg_name
       pkgdir    = overlayPath </> Portage.unCategory cat </> merged_PN
   existing_meta <- liftIO $ EM.findExistingMeta pkgdir
-  let requested_cabal_flags = Merge.first_just_of [users_cabal_flags, EM.cabal_flags existing_meta]
+  let requested_cabal_flags = users_cabal_flags <|> EM.cabal_flags existing_meta
 
       -- accepts things, like: "cabal_flag:iuse_name", "+cabal_flag", "-cabal_flag"
       read_fas :: Maybe String -> (CabalFlags, [(String, String)])
@@ -402,6 +403,12 @@
   forM_ ghc_packages $
       \name -> info $ "Excluded packages (comes with ghc): " ++ Cabal.unPackageName name
 
+  -- We only add the current arch to KEYWORDS
+  thisArch <- run_cmd "portageq envvar ARCH" >>=
+      maybe
+          (die "Error running 'portageq envvar ARCH'")
+          (pure . head . lines)
+
   let pp_fn (cabal_fn, yesno) = b yesno ++ Cabal.unFlagName cabal_fn
           where b True  = ""
                 b False = "-"
@@ -430,17 +437,19 @@
                       p  = if Cabal.flagDefault x then "+" else ""
                   in p ++ cfn_to_iuse fn
 
-      ebuild =   (\e -> e { E.depend        =            Merge.dep tdeps} )
-               . (\e -> e { E.depend_extra  = S.toList $ Merge.dep_e tdeps } )
-               . (\e -> e { E.rdepend       =            Merge.rdep tdeps} )
-               . (\e -> e { E.rdepend_extra = S.toList $ Merge.rdep_e tdeps } )
-               . (\e -> e { E.src_configure = build_configure_call $
-                                                  selected_flags (active_flags, user_specified_fas) } )
-               . (\e -> e { E.iuse = E.iuse e ++ map to_iuse active_flag_descs })
+      ebuild =   (\e -> e { E.iuse = E.iuse e ++ map to_iuse active_flag_descs })
                . ( case requested_cabal_flags of
                        Nothing  -> id
                        Just ucf -> (\e -> e { E.used_options  = E.used_options e ++ [("flags", ucf)] }))
-               $ C2E.cabal2ebuild cat (Merge.packageDescription pkgDesc)
+               $ (C2E.cabal2ebuild cat (Merge.packageDescription pkgDesc))
+                  { E.depend        =            Merge.dep tdeps
+                  , E.depend_extra  = S.toList $ Merge.dep_e tdeps
+                  , E.rdepend       =            Merge.rdep tdeps
+                  , E.rdepend_extra = S.toList $ Merge.rdep_e tdeps
+                  , E.src_configure = build_configure_call $
+                      selected_flags (active_flags, user_specified_fas)
+                  , E.keywords      = [ '~' : thisArch ]
+                  }
 
   let active_flag_descs_renamed =
         (\f -> f { Cabal.flagName = Cabal.mkFlagName . cfn_to_iuse . Cabal.unFlagName
@@ -539,19 +548,16 @@
   liftIO $ createDirectoryIfMissing True edir
   now <- liftIO $ TC.getCurrentTime
 
-  let (existing_keywords, existing_license) = (EM.keywords existing_meta, EM.license existing_meta)
-      new_keywords = maybe (E.keywords ebuild) (map Merge.to_unstable) existing_keywords
+  let existing_license = EM.license existing_meta
       new_license  = either (\err -> maybe (Left err)
                                            Right
                                            existing_license)
                             Right
                             (E.license ebuild)
-      ebuild'      = ebuild { E.keywords = new_keywords
-                            , E.license = new_license
+      ebuild'      = ebuild { E.license = new_license
                             }
       s_ebuild'    = E.showEBuild now ebuild'
 
-  notice $ "Current keywords: " ++ show existing_keywords ++ " -> " ++ show new_keywords
   notice $ "Current license:  " ++ show existing_license ++ " -> " ++ show new_license
 
   notice $ "Writing " ++ elocal
diff --git a/src/Merge/Dependencies.hs b/src/Merge/Dependencies.hs
--- a/src/Merge/Dependencies.hs
+++ b/src/Merge/Dependencies.hs
@@ -125,7 +125,7 @@
     cabal_dep :: Portage.Dependency
     cabal_dep = cabalDependency overlay (packageDescription pkg) compiler_info
     ghc_dep :: Portage.Dependency
-    ghc_dep = compilerInfoToDependency compiler_info
+    ghc_dep = add_profile $ compilerInfoToDependency compiler_info
     extra_libs :: Portage.Dependency
     extra_libs = Portage.DependAllOf $ findCLibs (packageDescription pkg)
     pkg_config_libs :: [Portage.Dependency]
diff --git a/src/Merge/Utils.hs b/src/Merge/Utils.hs
--- a/src/Merge/Utils.hs
+++ b/src/Merge/Utils.hs
@@ -8,7 +8,6 @@
 module Merge.Utils
   ( readPackageString
   , getPreviousPackageId
-  , first_just_of
   , drop_prefix
   , squash_debug
   , convert_underscores
@@ -21,7 +20,6 @@
   ) where
 
 import qualified Control.Applicative as A
-import qualified Control.Monad as M
 import qualified Data.Char as C
 import           Data.Maybe (catMaybes, mapMaybe)
 import qualified Data.List as L
@@ -80,12 +78,6 @@
   case pkgIds of
     x:_ -> Just x
     _ -> Nothing
-
--- | Alias for 'msum'.
--- 
--- prop> \a -> first_just_of a == M.msum a
-first_just_of :: [Maybe a] -> Maybe a
-first_just_of = M.msum
 
 -- | Remove @with@ or @use@ prefixes from flag names.
 --
diff --git a/src/Portage/EBuild.hs b/src/Portage/EBuild.hs
--- a/src/Portage/EBuild.hs
+++ b/src/Portage/EBuild.hs
@@ -82,7 +82,7 @@
     homepage = "https://hackage.haskell.org/package/${HACKAGE_N}",
     license = Left "unassigned license?",
     slot = "0",
-    keywords = ["~amd64","~x86"],
+    keywords = [],
     iuse = [],
     depend = empty_dependency,
     depend_extra = [],
diff --git a/src/Portage/EMeta.hs b/src/Portage/EMeta.hs
--- a/src/Portage/EMeta.hs
+++ b/src/Portage/EMeta.hs
@@ -13,6 +13,7 @@
   ) where
 
 import Control.Monad
+import Control.Monad.IO.Class
 import Data.Char (isSpace)
 import qualified Data.List as L
 
@@ -84,24 +85,28 @@
                    }
 
 -- | Find the existing package metadata from the last available ebuild.
-findExistingMeta :: FilePath -> IO EMeta
-findExistingMeta pkgdir =
-    do ebuilds <- filter (L.isSuffixOf ".ebuild") `fmap` do b <- doesDirectoryExist pkgdir
-                                                            if b then getDirectoryContents pkgdir
-                                                                 else return []
-       -- TODO: version sort
-       e_metas <- forM ebuilds $ \e ->
-                      do let e_path = pkgdir </> e
-                         e_conts <- readFile e_path
-                         return EMeta { keywords = extractKeywords e e_conts
-                                      , license = extractLicense  e e_conts
-                                      , cabal_flags = extractCabalFlags e e_conts
-                                      , description = extractDescription e e_conts
-                                      }
-       let get_latest candidates = last (Nothing : filter (/= Nothing) candidates)
-           aggregated_meta = EMeta { keywords = get_latest $ map keywords e_metas
-                                   , license = get_latest $ map license e_metas
-                                   , cabal_flags = get_latest $ map cabal_flags e_metas
-                                   , description = get_latest $ map description e_metas
-                                   }
-       return aggregated_meta
+findExistingMeta :: MonadIO m => FilePath -> m EMeta
+findExistingMeta pkgdir = liftIO $ do
+    ebuilds <- filter (L.isSuffixOf ".ebuild") <$> do
+        b <- doesDirectoryExist pkgdir
+        if b
+            then getDirectoryContents pkgdir
+            else pure []
+    -- TODO: version sort
+    eMetas <- forM ebuilds $ \e -> do
+        let ePath = pkgdir </> e
+        eConts <- readFile ePath
+        pure EMeta
+            { keywords = extractKeywords e eConts
+            , license = extractLicense e eConts
+            , cabal_flags = extractCabalFlags e eConts
+            , description = extractDescription e eConts
+            }
+    let get_latest candidates = last (Nothing : filter (/= Nothing) candidates)
+        aggregated_meta = EMeta
+            { keywords = get_latest $ map keywords eMetas
+            , license = get_latest $ map license eMetas
+            , cabal_flags = get_latest $ map cabal_flags eMetas
+            , description = get_latest $ map description eMetas
+            }
+    pure aggregated_meta
diff --git a/src/Util.hs b/src/Util.hs
--- a/src/Util.hs
+++ b/src/Util.hs
@@ -14,27 +14,28 @@
     , die
     ) where
 
+import Control.Monad.IO.Class
 import System.IO
 import System.Process
 import System.Exit (ExitCode(..))
 import qualified Distribution.Simple.Utils as Cabal
 import Hackport.Env
 
--- 'run_cmd' executes command and returns it's standard output
--- as 'String'.
-
-run_cmd :: String -> IO (Maybe String)
-run_cmd cmd = do (hI, hO, hE, hProcess) <- runInteractiveCommand cmd
-                 hClose hI
-                 output <- hGetContents hO
-                 errors <- hGetContents hE -- TODO: propagate error to caller
-                 length output `seq` hClose hO
-                 length errors `seq` hClose hE
+-- | 'run_cmd' executes command and returns it's standard output
+--   as 'String'.
+run_cmd :: MonadIO m => String -> m (Maybe String)
+run_cmd cmd = liftIO $ do
+    (hI, hO, hE, hProcess) <- runInteractiveCommand cmd
+    hClose hI
+    output <- hGetContents hO
+    errors <- hGetContents hE -- TODO: propagate error to caller
+    length output `seq` hClose hO
+    length errors `seq` hClose hE
 
-                 exitCode <- waitForProcess hProcess
-                 return $ if (output == "" || exitCode /= ExitSuccess)
-                          then Nothing
-                          else Just output
+    exitCode <- waitForProcess hProcess
+    return $ if (output == "" || exitCode /= ExitSuccess)
+        then Nothing
+        else Just output
 
 debug :: (HasGlobalEnv m, MonadIO m) => String -> m ()
 debug s = askGlobalEnv >>= \(GlobalEnv v _ _) -> liftIO $ Cabal.debug v s
