diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Aura Changelog
 
+## 2.1.0 (2020-02-17)
+
+- Reinstated `-Aw`, which downloads a snapshot tarball of an AUR package.
+
 ## 2.0.6 (2020-02-16)
 
 - Fixed the broken `-S`.
diff --git a/aura.cabal b/aura.cabal
--- a/aura.cabal
+++ b/aura.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               aura
-version:            2.0.6
+version:            2.1.0
 synopsis:
   A secure package manager for Arch Linux and the AUR, written in Haskell.
 
@@ -48,7 +48,7 @@
     , errors                       ^>=2.3
     , http-client                  >=0.5 && <0.7
     , nonempty-containers          ^>=0.3
-    , prettyprinter                >=1.2 && <1.6
+    , prettyprinter                >=1.2 && <1.7
     , prettyprinter-ansi-terminal  ^>=1.1
     , transformers                 ^>=0.5
     , typed-process                ^>=0.2
@@ -89,14 +89,13 @@
   build-depends:
     , aeson             >=1.2  && <1.5
     , aeson-pretty      ^>=0.8
-    , algebraic-graphs  >=0.1  && <0.5
+    , algebraic-graphs  >=0.1  && <0.6
     , aur               ^>=6.3
-    , compactable       ^>=0.1
     , filepath          ^>=1.4
     , generic-lens      >=1.1  && <1.3
     , http-types        >=0.9  && <0.13
     , language-bash     ^>=0.8
-    , megaparsec        ^>=7
+    , megaparsec        >=7    && <9
     , microlens-ghc     ^>=0.4
     , mwc-random        ^>=0.14
     , network-uri       ^>=2.6
diff --git a/exec/Flags.hs b/exec/Flags.hs
--- a/exec/Flags.hs
+++ b/exec/Flags.hs
@@ -11,13 +11,13 @@
 import           Aura.Pacman (defaultLogFile, pacmanConfFile)
 import           Aura.Settings
 import           Aura.Types
-import qualified Data.List.NonEmpty as NEL
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
-import           Lens.Micro
+import           Lens.Micro (Traversal')
 import           Options.Applicative
 import           RIO hiding (exp, log)
 import           RIO.List.Partial (foldr1)
+import qualified RIO.NonEmpty.Partial as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           System.Path (Absolute, Path, fromAbsoluteFilePath, toFilePath)
@@ -227,6 +227,7 @@
            | AurSearch    Text
            | AurUpgrade  (Set PkgName)
            | AurJson     (NESet PkgName)
+           | AurTarball  (NESet PkgName)
            deriving (Show)
 
 data AurSwitch = AurIgnore      (Set PkgName)
@@ -268,13 +269,14 @@
    <*> (S.fromList <$> many switches)
   )
   where bigA    = flag' () (long "aursync" <> short 'A' <> help "Install packages from the AUR.")
-        mods    = ds <|> ainfo <|> pkgb <|> search <|> upgrade <|> aur
+        mods    = ds <|> ainfo <|> pkgb <|> search <|> upgrade <|> aur <|> tarball
         ds      = AurDeps <$> (flag' () (long "deps" <> short 'd' <> hidden <> help "View dependencies of an AUR package.") *> somePkgs')
         ainfo   = AurInfo <$> (flag' () (long "info" <> short 'i' <> hidden <> help "View AUR package information.") *> somePkgs')
         pkgb    = AurPkgbuild <$> (flag' () (long "pkgbuild" <> short 'p' <> hidden <> help "View an AUR package's PKGBUILD file.") *> somePkgs')
         search  = AurSearch <$> strOption (long "search" <> short 's' <> metavar "STRING" <> hidden <> help "Search the AUR via a search string.")
         upgrade = AurUpgrade <$> (flag' () (long "sysupgrade" <> short 'u' <> hidden <> help "Upgrade all installed AUR packages.") *> fmap (S.map PkgName) manyArgs')
         aur     = AurJson <$> (flag' () (long "json" <> hidden <> help "Retrieve package JSON straight from the AUR.") *> somePkgs')
+        tarball = AurTarball <$> (flag' () (long "downloadonly" <> short 'w' <> hidden <> help "Download a package tarball.") *> somePkgs')
         switches = ign <|> igg
         ign  = AurIgnore . S.fromList . map PkgName . T.split (== ',') <$>
           strOption (long "ignore" <> metavar "PKG(,PKG,...)" <> hidden <> help "Ignore given packages.")
diff --git a/exec/Settings.hs b/exec/Settings.hs
--- a/exec/Settings.hs
+++ b/exec/Settings.hs
@@ -27,7 +27,6 @@
 import           Aura.Types
 import           Aura.Utils
 import           Control.Error.Util (failWith)
-import           Control.Monad.Trans.Class (lift)
 import           Control.Monad.Trans.Except
 import           Data.Bifunctor (Bifunctor(..))
 import qualified Data.Set.NonEmpty as NES
diff --git a/exec/aura.hs b/exec/aura.hs
--- a/exec/aura.hs
+++ b/exec/aura.hs
@@ -117,6 +117,7 @@
         Left (AurSearch s)    -> A.aurPkgSearch s
         Left (AurUpgrade ps)  -> bool (trueRoot . sudo) id (switch ss DryRun) $ A.upgradeAURPkgs ps
         Left (AurJson ps)     -> A.aurJson ps
+        Left (AurTarball ps)  -> A.fetchTarball ps
     Right (Backup o) ->
       case o of
         Nothing              -> sudo . liftIO $ B.saveState ss
@@ -157,4 +158,4 @@
 viewConfFile :: RIO Env ()
 viewConfFile = do
   pth <- asks (either id id . configPathOf . commonConfigOf . settings)
-  liftIO . void . runProcess @IO $ proc "less" [toFilePath pth]
+  void . runProcess $ proc "less" [toFilePath pth]
diff --git a/lib/Aura/Build.hs b/lib/Aura/Build.hs
--- a/lib/Aura/Build.hs
+++ b/lib/Aura/Build.hs
@@ -25,16 +25,14 @@
 import           Aura.Settings
 import           Aura.Types
 import           Aura.Utils
-import           Control.Compactable (traverseMaybe)
-import           Control.Monad.Trans.Class (lift)
 import           Control.Monad.Trans.Except
 import           Data.Generics.Product (field)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Semigroup.Foldable (fold1)
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           RIO
 import           RIO.Directory (setCurrentDirectory)
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           System.Path
diff --git a/lib/Aura/Commands/A.hs b/lib/Aura/Commands/A.hs
--- a/lib/Aura/Commands/A.hs
+++ b/lib/Aura/Commands/A.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE BangPatterns      #-}
 {-# LANGUAGE DataKinds         #-}
 {-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE LambdaCase        #-}
 {-# LANGUAGE MonoLocalBinds    #-}
 {-# LANGUAGE MultiWayIf        #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -24,6 +25,7 @@
   , I.displayPkgDeps
   , displayPkgbuild
   , aurJson
+  , fetchTarball
   ) where
 
 import           Aura.Colour
@@ -39,7 +41,6 @@
 import           Control.Error.Util (hush)
 import           Data.Aeson.Encode.Pretty (encodePretty)
 import           Data.Generics.Product (field)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           Data.Text.Prettyprint.Doc
@@ -51,8 +52,9 @@
 import           RIO
 import qualified RIO.ByteString as B
 import qualified RIO.ByteString.Lazy as BL
-import           RIO.List (intersperse)
+import qualified RIO.List as L
 import           RIO.List.Partial (maximum)
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           RIO.Text.Partial (splitOn)
@@ -158,7 +160,7 @@
           verboseInfo  = repo <> n <+> v <+> "(" <> l <+> "|" <+> p <>
                          ")" <> (if e then annotate bold " [installed]" else "") <> "\n    " <> d
           repo = magenta "aur/"
-          n = fold . intersperse (bCyan $ pretty r) . map (annotate bold . pretty) . splitOn r $ aurNameOf i
+          n = fold . L.intersperse (bCyan $ pretty r) . map (annotate bold . pretty) . splitOn r $ aurNameOf i
           d = maybe "(null)" pretty $ aurDescriptionOf i
           l = yellow . pretty $ aurVotesOf i  -- `l` for likes?
           p = yellow . pretty . T.pack . printf "%0.2f" $ popularityOf i
@@ -171,7 +173,7 @@
 displayPkgbuild ps = do
   man <- asks (managerOf . settings)
   pbs <- catMaybes <$> traverse (liftIO . getPkgbuild man) (toList ps)
-  liftIO . traverse_ (\p -> B.putStr @IO p >> B.putStr "\n") $ pbs ^.. each . field @"pkgbuild"
+  traverse_ (\p -> B.putStr p >> B.putStr "\n") $ pbs ^.. each . field @"pkgbuild"
 
 isntMostRecent :: (AurInfo, Versioning) -> Bool
 isntMostRecent (ai, v) = trueVer > Just v
@@ -182,10 +184,25 @@
 aurJson ps = do
   m <- asks (managerOf . settings)
   infos <- liftMaybeM (Failure connectionFailure_1) . fmap hush . liftIO $ f m ps
-  liftIO $ traverse_ (BL.putStrLn @IO . encodePretty) infos
+  traverse_ (BL.putStrLn . encodePretty) infos
   where
     f :: Manager -> NESet PkgName -> IO (Either ClientError [AurInfo])
     f m = info m . (^.. each . field @"name") . toList
+
+-- | @https://aur.archlinux.org/cgit/aur.git/snapshot/aura-bin.tar.gz@
+fetchTarball :: NESet PkgName -> RIO Env ()
+fetchTarball ps = do
+  ss <- asks settings
+  traverse_ (liftIO . g ss) ps
+  where
+    f :: PkgName -> String
+    f (PkgName p) =
+      "https://aur.archlinux.org/cgit/aur.git/snapshot/" <> T.unpack p <> ".tar.gz"
+
+    g :: Settings -> PkgName -> IO ()
+    g ss p@(PkgName pn) = urlContents (managerOf ss) (f p) >>= \case
+      Nothing -> warn ss . missingPkg_5 p $ langOf ss
+      Just bs -> writeFileBinary (T.unpack pn <> ".tar.gz") bs
 
 ------------
 -- REPORTING
diff --git a/lib/Aura/Commands/B.hs b/lib/Aura/Commands/B.hs
--- a/lib/Aura/Commands/B.hs
+++ b/lib/Aura/Commands/B.hs
@@ -24,9 +24,9 @@
 import           Aura.Settings
 import           Aura.State
 import           Aura.Utils (optionalPrompt, putTextLn)
-import qualified Data.List.NonEmpty as NEL
 import           RIO
-import           RIO.List (partition)
+import qualified RIO.List as L
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Text as T
 import           System.Path (takeFileName, toFilePath, toUnrootedFilePath)
 import           System.Path.IO (removeFile)
@@ -37,7 +37,7 @@
 cleanStates :: Settings -> Word -> IO ()
 cleanStates ss (fromIntegral -> n) = do
   stfs <- reverse <$> getStateFiles
-  (pinned, others) <- partition p <$> traverse (\sf -> (sf,) <$> readState sf) stfs
+  (pinned, others) <- L.partition p <$> traverse (\sf -> (sf,) <$> readState sf) stfs
   warn ss . cleanStates_4 (length stfs) $ langOf ss
   unless (null pinned) . warn ss . cleanStates_6 (length pinned) $ langOf ss
   forM_ (NEL.nonEmpty stfs) $ \stfs' -> do
diff --git a/lib/Aura/Commands/C.hs b/lib/Aura/Commands/C.hs
--- a/lib/Aura/Commands/C.hs
+++ b/lib/Aura/Commands/C.hs
@@ -32,13 +32,13 @@
 import           Aura.Types
 import           Aura.Utils
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (nonEmpty)
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           Lens.Micro ((^?), _Just)
 import           RIO
-import           RIO.List (groupBy, sort, (\\))
+import qualified RIO.List as L
 import qualified RIO.Map as M
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           System.Path
@@ -53,7 +53,7 @@
   ss    <- asks settings
   let cachePath = either id id . cachePathOf $ commonConfigOf ss
   reals <- liftIO $ pkgsInCache ss pkgs
-  traverse_ (report red reportBadDowngradePkgs_1) . nonEmpty . toList $ NES.toSet pkgs S.\\ reals
+  traverse_ (report red reportBadDowngradePkgs_1) . NEL.nonEmpty . toList $ NES.toSet pkgs S.\\ reals
   unless (null reals) $ do
     cache   <- liftIO $ cacheContents cachePath
     choices <- traverse (getDowngradeChoice cache) $ toList reals
@@ -63,7 +63,7 @@
 -- downgrade to.
 getDowngradeChoice :: Cache -> PkgName -> RIO Env PackagePath
 getDowngradeChoice cache pkg =
-  case nonEmpty $ getChoicesFromCache cache pkg of
+  case NEL.nonEmpty $ getChoicesFromCache cache pkg of
     Nothing      -> throwM . Failure $ reportBadDowngradePkgs_2 pkg
     Just choices -> do
       ss <- asks settings
@@ -71,14 +71,14 @@
       liftIO $ getSelection (T.pack . toFilePath . path) choices
 
 getChoicesFromCache :: Cache -> PkgName -> [PackagePath]
-getChoicesFromCache (Cache cache) p = sort . M.elems $ M.filterWithKey (\(SimplePkg pn _) _ -> p == pn) cache
+getChoicesFromCache (Cache cache) p = L.sort . M.elems $ M.filterWithKey (\(SimplePkg pn _) _ -> p == pn) cache
 
 -- | Print all package filenames that match a given `Text`.
 searchCache :: Text -> RIO Env ()
 searchCache ps = do
   ss <- asks settings
   matches <- liftIO $ cacheMatches ss ps
-  liftIO . traverse_ (putTextLn . T.pack . toFilePath . path) $ sort matches
+  liftIO . traverse_ (putTextLn . T.pack . toFilePath . path) $ L.sort matches
 
 -- | The destination folder must already exist for the back-up to begin.
 backupCache :: Path Absolute -> RIO Env ()
@@ -135,7 +135,7 @@
   (Cache cache) <- liftIO $ cacheContents cachePath
   let !files    = M.elems cache
       grouped   = take toSave . reverse <$> groupByName files
-      toRemove  = files \\ fold grouped
+      toRemove  = files L.\\ fold grouped
   liftIO $ traverse_ (removeFile . path) toRemove
 
 -- | Only package files with a version not in any PkgState will be
@@ -154,6 +154,6 @@
 
 -- | Typically takes the contents of the package cache as an argument.
 groupByName :: [PackagePath] -> [[PackagePath]]
-groupByName pkgs = groupBy sameBaseName $ sort pkgs
+groupByName pkgs = L.groupBy sameBaseName $ L.sort pkgs
     where sameBaseName a b = baseName a == baseName b
           baseName p = simplepkg p ^? _Just . field @"name"
diff --git a/lib/Aura/Commands/L.hs b/lib/Aura/Commands/L.hs
--- a/lib/Aura/Commands/L.hs
+++ b/lib/Aura/Commands/L.hs
@@ -25,12 +25,11 @@
 import           Aura.Settings
 import           Aura.Types (PkgName(..))
 import           Aura.Utils
-import           Control.Compactable (fmapEither)
 import           Data.Generics.Product (field)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Set.NonEmpty (NESet)
 import           Data.Text.Prettyprint.Doc
 import           RIO hiding (FilePath)
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Text as T
 import qualified RIO.Text.Partial as T
 import           System.Path (toFilePath)
@@ -51,7 +50,7 @@
 viewLogFile :: RIO Env ()
 viewLogFile = do
   pth <- asks (toFilePath . either id id . logPathOf . commonConfigOf . settings)
-  liftIO . void . runProcess @IO $ proc "less" [pth]
+  void . runProcess $ proc "less" [pth]
 
 -- | Print all lines in the log file which contain a given `Text`.
 searchLogFile :: Settings -> Text -> IO ()
@@ -65,7 +64,7 @@
 logInfoOnPkg pkgs = do
   ss <- asks settings
   let pth = toFilePath . either id id . logPathOf $ commonConfigOf ss
-  logFile <- Log . T.lines . decodeUtf8Lenient <$> liftIO (readFileBinary @IO pth)
+  logFile <- Log . T.lines . decodeUtf8Lenient <$> readFileBinary pth
   let (bads, goods) = fmapEither (logLookup logFile) $ toList pkgs
   traverse_ (report red reportNotInLog_1) $ NEL.nonEmpty bads
   liftIO . traverse_ putTextLn $ map (renderEntry ss) goods
diff --git a/lib/Aura/Core.hs b/lib/Aura/Core.hs
--- a/lib/Aura/Core.hs
+++ b/lib/Aura/Core.hs
@@ -39,21 +39,18 @@
 import           Aura.Settings
 import           Aura.Types
 import           Aura.Utils
-import           Control.Compactable (fmapEither)
 import           Control.Monad.Trans.Maybe
 import           Data.Bifunctor (bimap)
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (NonEmpty)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           Data.Text.Prettyprint.Doc
 import           Data.Text.Prettyprint.Doc.Render.Terminal
 import           Data.These (These(..))
-import           Lens.Micro ((^.))
 import           RIO hiding ((<>))
 import qualified RIO.ByteString as B
-import           RIO.List (unzip)
+import qualified RIO.List as L
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           System.Path.IO (doesFileExist)
@@ -94,7 +91,7 @@
 -- there is no way to guarantee that the list of `NESet`s will itself be
 -- non-empty.
 partitionPkgs :: NonEmpty (NESet Package) -> ([Prebuilt], [NESet Buildable])
-partitionPkgs = bimap fold f . unzip . map g . toList
+partitionPkgs = bimap fold f . L.unzip . map g . toList
   where g = fmapEither toEither . toList
         f = mapMaybe (fmap NES.fromList . NEL.nonEmpty)
         toEither (FromAUR b)  = Right b
diff --git a/lib/Aura/Dependencies.hs b/lib/Aura/Dependencies.hs
--- a/lib/Aura/Dependencies.hs
+++ b/lib/Aura/Dependencies.hs
@@ -31,8 +31,6 @@
 import           Aura.Utils (maybe', putText)
 import           Control.Error.Util (note)
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (NonEmpty)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Semigroup.Foldable (foldMap1)
 import           Data.Set.NonEmpty (pattern IsEmpty, pattern IsNonEmpty, NESet)
 import qualified Data.Set.NonEmpty as NES
@@ -41,6 +39,7 @@
 import           Lens.Micro
 import           RIO
 import qualified RIO.Map as M
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 
diff --git a/lib/Aura/Install.hs b/lib/Aura/Install.hs
--- a/lib/Aura/Install.hs
+++ b/lib/Aura/Install.hs
@@ -35,12 +35,9 @@
 import           Aura.Pkgbuild.Security
 import           Aura.Settings
 import           Aura.Types
-import           Aura.Utils (optionalPrompt, putTextLn)
-import           Control.Compactable (fmapEither)
+import           Aura.Utils (fmapEither, optionalPrompt, putTextLn)
 import           Control.Scheduler (Comp(..), traverseConcurrently)
 import           Data.Generics.Product (HasField'(..), field, super)
-import           Data.List.NonEmpty (NonEmpty)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Semigroup.Foldable (fold1)
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
@@ -49,8 +46,9 @@
 import           Lens.Micro (each, (^..))
 import           RIO hiding (FilePath)
 import           RIO.Directory (setCurrentDirectory)
-import           RIO.List (partition, sort)
+import qualified RIO.List as L
 import qualified RIO.Map as M
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           System.Path (fromAbsoluteFilePath)
@@ -193,17 +191,17 @@
 
 reportPkgsToInstall :: [Prebuilt] -> [NESet Buildable] -> RIO Env ()
 reportPkgsToInstall rps bps = do
-  let (explicits, ds) = partition isExplicit $ foldMap toList bps
+  let (explicits, ds) = L.partition isExplicit $ foldMap toList bps
   f reportPkgsToInstall_1 rps
   f reportPkgsToInstall_3 ds
   f reportPkgsToInstall_2 explicits
   where
-    f m xs = traverse_ (report green m) . NEL.nonEmpty . sort $ xs ^.. each . field @"name"
+    f m xs = traverse_ (report green m) . NEL.nonEmpty . L.sort $ xs ^.. each . field @"name"
 
 reportListOfDeps :: [Prebuilt] -> [NESet Buildable] -> IO ()
 reportListOfDeps rps bps = f rps *> f (foldMap toList bps)
   where f :: HasField' "name" s PkgName => [s] -> IO ()
-        f = traverse_ putTextLn . sort . (^.. each . field' @"name" . field' @"name")
+        f = traverse_ putTextLn . L.sort . (^.. each . field' @"name" . field' @"name")
 
 pkgbuildDiffs :: Set Buildable -> RIO Env ()
 pkgbuildDiffs ps = asks settings >>= check
@@ -223,6 +221,6 @@
         else liftIO $ do
           setCurrentDirectory "/tmp"
           let new = "/tmp/new.pb"
-          writeFileBinary @IO new $ p ^. field @"pkgbuild" . field @"pkgbuild"
+          writeFileBinary new $ p ^. field @"pkgbuild" . field @"pkgbuild"
           liftIO . warn ss $ reportPkgbuildDiffs_3 pn lang
           diff ss (pkgbuildPath pn) $ fromAbsoluteFilePath new
diff --git a/lib/Aura/Languages.hs b/lib/Aura/Languages.hs
--- a/lib/Aura/Languages.hs
+++ b/lib/Aura/Languages.hs
@@ -39,12 +39,11 @@
 import qualified Aura.Languages.Fields as Fields
 import           Aura.Types
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (NonEmpty)
 import           Data.Ratio ((%))
 import           Data.Text.Prettyprint.Doc
 import           Data.Text.Prettyprint.Doc.Render.Terminal
 import           RIO
-import           RIO.List (intersperse)
+import qualified RIO.List as L
 import qualified RIO.Map as M
 import qualified RIO.Map.Partial as M
 import qualified RIO.Text as T
@@ -324,22 +323,22 @@
 
 getRealPkgConflicts_2 :: PkgName -> Language -> Doc AnsiStyle
 getRealPkgConflicts_2 (bt . view (field @"name") -> p) = \case
-    Japanese   -> p <> "は無視されるパッケージ！`pacman.conf`を参考に。"
-    Polish     -> p <> " jest ignorowany! Sprawdź plik `pacman.conf`."
-    Croatian   -> p <> " je ignoriran paket! Provjerite svoj `pacman.conf`."
-    Swedish    -> p <> " är ett ignorerat paket! Kolla din `pacman.conf`-fil."
-    German     -> p <> " ist ein ignoriertes Paket! Siehe /etc/pacman.conf."
-    Spanish    -> "¡" <> p <> " es un paquete ignorado! Revisa tu fichero `pacman.conf`."
-    Portuguese -> p <> " é um pacote ignorado conforme configuração em `pacman.conf`!"
-    French     -> "Le paquet " <> p <> " est ignoré. Vous devriez jeter un œil à votre `pacman.conf`."
-    Russian    -> "Пакет " <> p <> " игнорируется! Проверьте ваш файл `pacman.conf`."
-    Italian    -> p <> " è un pacchetto ignorato, controllare `pacman.conf`."
-    Serbian    -> "Пакет " <> p <> " је игнорисан! Видите ваш фајл „pacman.conf“."
-    Norwegian  -> p <> " er en ignorert pakke! Sjekk din `pacman.conf`-fil."
-    Indonesia  -> p <> " merupakan paket yang diabaikan! Lihat `pacman.conf` anda."
-    Chinese    -> p <> " 是一个被忽略的包！请查看你的 `pacman.conf` 文件。"
-    Esperanto  -> p <> " estas malatenta pakaĵo! Vidu vian `pacman.conf` dosieron."
-    _          -> p <> " is an ignored package! See your `pacman.conf` file."
+  Japanese   -> p <> "は無視されるパッケージ！`pacman.conf`を参考に。"
+  Polish     -> p <> " jest ignorowany! Sprawdź plik `pacman.conf`."
+  Croatian   -> p <> " je ignoriran paket! Provjerite svoj `pacman.conf`."
+  Swedish    -> p <> " är ett ignorerat paket! Kolla din `pacman.conf`-fil."
+  German     -> p <> " ist ein ignoriertes Paket! Siehe /etc/pacman.conf."
+  Spanish    -> "¡" <> p <> " es un paquete ignorado! Revisa tu fichero `pacman.conf`."
+  Portuguese -> p <> " é um pacote ignorado conforme configuração em `pacman.conf`!"
+  French     -> "Le paquet " <> p <> " est ignoré. Vous devriez jeter un œil à votre `pacman.conf`."
+  Russian    -> "Пакет " <> p <> " игнорируется! Проверьте ваш файл `pacman.conf`."
+  Italian    -> p <> " è un pacchetto ignorato, controllare `pacman.conf`."
+  Serbian    -> "Пакет " <> p <> " је игнорисан! Видите ваш фајл „pacman.conf“."
+  Norwegian  -> p <> " er en ignorert pakke! Sjekk din `pacman.conf`-fil."
+  Indonesia  -> p <> " merupakan paket yang diabaikan! Lihat `pacman.conf` anda."
+  Chinese    -> p <> " 是一个被忽略的包！请查看你的 `pacman.conf` 文件。"
+  Esperanto  -> p <> " estas malatenta pakaĵo! Vidu vian `pacman.conf` dosieron."
+  _          -> p <> " is an ignored package! See your `pacman.conf` file."
 
 missingPkg_2 :: [DepError] -> Language -> Doc AnsiStyle
 missingPkg_2 ps l = vsep $ map (depError l) ps
@@ -369,7 +368,11 @@
 missingPkg_4 pns = \case
   Spanish    -> vsep $ "Se detectaron los siguientes ciclos de dependencia:" : pns'
   _ -> vsep $ "The following dependency cycles were detected:" : pns'
-  where pns' = map (hsep . map pretty . intersperse "=>" . map (view (field @"name")) . toList) pns
+  where pns' = map (hsep . map pretty . L.intersperse "=>" . map (view (field @"name")) . toList) pns
+
+missingPkg_5 :: PkgName -> Language -> Doc AnsiStyle
+missingPkg_5 (PkgName p) = \case
+  _ -> bt p <> " does not exist."
 
 -----------------
 -- aura functions
diff --git a/lib/Aura/MakePkg.hs b/lib/Aura/MakePkg.hs
--- a/lib/Aura/MakePkg.hs
+++ b/lib/Aura/MakePkg.hs
@@ -20,12 +20,12 @@
 import           Aura.Types
 import           Aura.Utils (optionalPrompt)
 import           Control.Error.Util (note)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           Lens.Micro (_2)
 import           RIO
 import qualified RIO.ByteString.Lazy as BL
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Text as T
 import           System.Path
     (Absolute, Path, fromAbsoluteFilePath, toFilePath, (</>))
diff --git a/lib/Aura/Packages/AUR.hs b/lib/Aura/Packages/AUR.hs
--- a/lib/Aura/Packages/AUR.hs
+++ b/lib/Aura/Packages/AUR.hs
@@ -32,15 +32,11 @@
 import           Aura.Pkgbuild.Fetch
 import           Aura.Settings
 import           Aura.Types
-import           Control.Compactable (fmapEither)
-import           Control.Concurrent.STM.TVar (modifyTVar')
+import           Aura.Utils (fmapEither)
 import           Control.Error.Util (hush, note)
-import           Control.Monad.Trans.Class (lift)
 import           Control.Monad.Trans.Maybe
 import           Control.Scheduler (Comp(..), traverseConcurrently)
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (NonEmpty)
-import qualified Data.List.NonEmpty as NEL
 import           Data.Set.NonEmpty (NESet)
 import qualified Data.Set.NonEmpty as NES
 import           Data.Versions (versioning)
@@ -48,8 +44,9 @@
 import           Linux.Arch.Aur
 import           Network.HTTP.Client (Manager)
 import           RIO
-import           RIO.List (sortBy)
+import qualified RIO.List as L
 import qualified RIO.Map as M
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Set as S
 import qualified RIO.Text as T
 import           System.Path
@@ -140,7 +137,7 @@
 -- RPC CALLS
 ------------
 sortAurInfo :: Maybe BuildSwitch -> [AurInfo] -> [AurInfo]
-sortAurInfo bs ai = sortBy compare' ai
+sortAurInfo bs ai = L.sortBy compare' ai
   where compare' = case bs of
                      Just SortAlphabetically -> compare `on` aurNameOf
                      _ -> \x y -> compare (aurVotesOf y) (aurVotesOf x)
diff --git a/lib/Aura/Packages/Repository.hs b/lib/Aura/Packages/Repository.hs
--- a/lib/Aura/Packages/Repository.hs
+++ b/lib/Aura/Packages/Repository.hs
@@ -22,12 +22,10 @@
 import           Aura.Pacman (pacmanLines, pacmanOutput)
 import           Aura.Settings (CommonSwitch(..), Settings(..), shared)
 import           Aura.Types
-import           Aura.Utils (getSelection)
-import           Control.Compactable (fmapEither, traverseEither)
+import           Aura.Utils (fmapEither, getSelection, traverseEither)
 import           Control.Error.Util (hush, note)
 import           Control.Scheduler (Comp(..), traverseConcurrently)
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (NonEmpty(..))
 import qualified Data.Set.NonEmpty as NES
 import           Data.Versions
 import           RIO hiding (try)
diff --git a/lib/Aura/State.hs b/lib/Aura/State.hs
--- a/lib/Aura/State.hs
+++ b/lib/Aura/State.hs
@@ -30,19 +30,17 @@
 import           Aura.Settings
 import           Aura.Types
 import           Aura.Utils
-import           Control.Compactable (fmapMaybe)
 import           Control.Error.Util (hush)
 import           Data.Aeson
 import           Data.Generics.Product (field)
-import           Data.List.NonEmpty (NonEmpty, nonEmpty)
 import           Data.Versions
-import           Lens.Micro ((^.))
 import           RIO
 import qualified RIO.ByteString.Lazy as BL
-import           RIO.List (intercalate, partition, sort)
+import qualified RIO.List as L
 import           RIO.List.Partial ((!!))
 import qualified RIO.Map as M
 import qualified RIO.Map.Unchecked as M
+import qualified RIO.NonEmpty as NEL
 import qualified RIO.Text as T
 import           RIO.Time
 import           System.Path
@@ -69,7 +67,7 @@
     <$> v .: "time"
     <*> v .: "pinned"
     <*> fmap f (v .: "packages")
-    where f = fmapMaybe (hush . versioning)
+    where f = M.mapMaybe (hush . versioning)
 
 data StateDiff = StateDiff
   { _toAlter  :: ![SimplePkg]
@@ -112,7 +110,7 @@
 getStateFiles :: IO [Path Absolute]
 getStateFiles = do
   createDirectoryIfMissing True stateCache
-  sort . map (stateCache </>) <$> getDirectoryContents stateCache
+  L.sort . map (stateCache </>) <$> getDirectoryContents stateCache
 
 -- | Save a package state.
 -- In writing the first state file, the `states` directory is created automatically.
@@ -125,7 +123,7 @@
   notify ss . saveState_1 $ langOf ss
 
 dotFormat :: ZonedTime -> String
-dotFormat (ZonedTime t _) = intercalate "." items
+dotFormat (ZonedTime t _) = L.intercalate "." items
     where items = [ show ye
                   , printf "%02d(%s)" mo (mnths !! (mo - 1))
                   , printf "%02d" da
@@ -139,7 +137,7 @@
 -- | Does its best to restore a state chosen by the user.
 restoreState :: RIO Env ()
 restoreState =
-  liftIO getStateFiles >>= maybe (throwM $ Failure restoreState_2) f . nonEmpty
+  liftIO getStateFiles >>= maybe (throwM $ Failure restoreState_2) f . NEL.nonEmpty
   where f :: NonEmpty (Path Absolute) -> RIO Env ()
         f sfs = do
           ss  <- asks settings
@@ -151,8 +149,8 @@
               curr <- liftIO currentState
               Cache cache <- liftIO $ cacheContents pth
               let StateDiff rein remo = compareStates past curr
-                  (okay, nope)        = partition (`M.member` cache) rein
-              traverse_ (report red restoreState_1 . fmap (^. field @"name")) $ nonEmpty nope
+                  (okay, nope)        = L.partition (`M.member` cache) rein
+              traverse_ (report red restoreState_1 . fmap (^. field @"name")) $ NEL.nonEmpty nope
               reinstallAndRemove (mapMaybe (`M.lookup` cache) okay) remo
 
 selectState :: NonEmpty (Path Absolute) -> IO (Path Absolute)
diff --git a/lib/Aura/Utils.hs b/lib/Aura/Utils.hs
--- a/lib/Aura/Utils.hs
+++ b/lib/Aura/Utils.hs
@@ -32,6 +32,9 @@
   , getSelection
     -- * Misc.
   , maybe'
+  , fmapEither
+  , traverseMaybe
+  , traverseEither
   ) where
 
 import           Aura.Colour
@@ -228,3 +231,23 @@
 -- | `maybe` with the function at the end.
 maybe' :: b -> Maybe a -> (a -> b) -> b
 maybe' zero m f = maybe zero f m
+
+-- | Borrowed from Compactable.
+fmapEither :: (a -> Either b c) -> [a] -> ([b], [c])
+fmapEither f = foldl' (deal f) ([],[])
+  where
+    deal :: (a -> Either b c) -> ([b], [c]) -> a -> ([b], [c])
+    deal g ~(bs, cs) a = case g a of
+      Left b  -> (b:bs, cs)
+      Right c -> (bs, c:cs)
+
+-- | Borrowed from Compactable.
+traverseMaybe :: Applicative f => (a -> f (Maybe b)) -> [a] -> f [b]
+traverseMaybe f = go
+  where
+    go (x:xs) = maybe id (:) <$> f x <*> go xs
+    go []     = pure []
+
+-- | Borrowed from Compactable.
+traverseEither :: Applicative f => (a -> f (Either b c)) -> [a] -> f ([b], [c])
+traverseEither f = fmap partitionEithers . traverse f
