diff --git a/cblrepo.cabal b/cblrepo.cabal
--- a/cblrepo.cabal
+++ b/cblrepo.cabal
@@ -1,5 +1,5 @@
 name: cblrepo
-version: 0.23.0
+version: 0.24.0
 cabal-version: >= 1.23
 license: OtherLicense
 license-file: LICENSE-2.0
@@ -62,7 +62,7 @@
                    Unixutils ==1.54.*,
                    unix ==2.7.*,
                    ansi-wl-pprint ==0.6.*,
-                   aeson ==0.11.*,
+                   aeson ==1.0.*,
                    stringsearch ==0.3.*,
                    optparse-applicative ==0.13.*,
                    safe ==0.3.*,
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -81,7 +81,9 @@
 
 cmdUpgradesCmd = command "upgrades" (info (helper <*> cmdUpgradesOpts) (fullDesc <> progDesc "Check for packages that can be upgraded"))
   where
-    cmdUpgradesOpts = CmdUpgrades <$> switch (short 's' <> help "A shorter output suitable for scripting")
+    cmdUpgradesOpts = CmdUpgrades
+                      <$> switch (short 's' <> help "A shorter output suitable for scripting")
+                      <*> switch (short 'x' <> help "Limit list to packages with new x-revision")
 
 cmdListPkgsCmd = command "list" (info (helper <*> cmdListPkgsOpts) (fullDesc <> progDesc "List packages in repo"))
   where
diff --git a/src/Upgrades.hs b/src/Upgrades.hs
--- a/src/Upgrades.hs
+++ b/src/Upgrades.hs
@@ -28,31 +28,35 @@
 import Control.Monad.Reader
 import Data.Maybe
 import Distribution.Text
-import Distribution.Version
+import Distribution.Version hiding (thisVersion)
 
 upgrades :: Command ()
 upgrades = do
-    db <- asks (dbFile . fst) >>= liftIO . readDb
-    aD <- asks $ appDir . fst
-    aCS <- asks $ idxStyle .optsCmd . fst
-    cfg <- asks snd
-    availPkgsNVers <- liftIO $ buildPkgVersions <$> readIndexFile aD (getIndexFileName cfg)
-    let nonBasePkgs = filter (not . isBasePkg) db
-        pkgsNVers = map (pkgName &&& pkgVersion &&& pkgXRev) nonBasePkgs
-        outdated = filter
-            (\ (p, vx) -> maybe False (> vx) (latestVersion availPkgsNVers p))
-            pkgsNVers
-        printer = if aCS
-            then printOldShort
-            else printOld
-    liftIO $ mapM_ (printer availPkgsNVers) outdated
+  db <- asks (dbFile . fst) >>= liftIO . readDb
+  aD <- asks $ appDir . fst
+  aCS <- asks $ idxStyle .optsCmd . fst
+  xrevsOnly <- asks $ xrevs . optsCmd . fst
+  cfg <- asks snd
+  availPkgsNVers <- liftIO $ buildPkgVersions <$> readIndexFile aD (getIndexFileName cfg)
+  let nonBasePkgs = filter (not . isBasePkg) db
+      pkgsNVers = map (pkgName &&& pkgVersion &&& pkgXRev) nonBasePkgs
+      filterFunc = if xrevsOnly
+                   then (\ (p, (v, x)) -> maybe False (> x) (snd <$> thisVersion availPkgsNVers p v))
+                   else (\ (p, vx) -> maybe False (> vx) (latestVersion availPkgsNVers p undefined))
+      outdated = filter filterFunc pkgsNVers
+      printer = if aCS
+                then printNewShort
+                else printUpgrades
+  if xrevsOnly
+    then liftIO $ mapM_ (printer thisVersion availPkgsNVers) outdated
+    else liftIO $ mapM_ (printer latestVersion availPkgsNVers) outdated
 
-printOld :: PkgVersions -> (String, (Version, Int)) -> IO ()
-printOld avail (p, (v, x)) = putStrLn $ p ++ ": " ++ display v ++ ":x" ++ show x ++ " (" ++ display lv ++ ":x" ++ show lx ++ ")"
-    where
-        (lv, lx) = fromJust $ latestVersion avail p
+printUpgrades verFunc avail (pkgName, (pkgVer, pkgXRev)) = putStrLn $
+  pkgName ++ ": " ++ display pkgVer ++ ":x" ++ show pkgXRev ++ " (" ++ display lv ++ ":x" ++ show lx ++ ")"
+  where
+    (lv, lx) = fromJust $ verFunc avail pkgName pkgVer
 
-printOldShort :: PkgVersions -> (String, (Version, Int)) -> IO ()
-printOldShort avail (p, _) = putStrLn $ p ++ "," ++ display l
-    where
-        l = fst $ fromJust $ latestVersion avail p
+printNewShort verFunc avail (pkgName, (pkgVer, _)) = putStrLn $
+  pkgName ++ "," ++ display l
+  where
+    l = fst $ fromJust $ verFunc avail pkgName pkgVer
diff --git a/src/Util/HackageIndex.hs b/src/Util/HackageIndex.hs
--- a/src/Util/HackageIndex.hs
+++ b/src/Util/HackageIndex.hs
@@ -58,7 +58,8 @@
                 Just ver -> createPkgVerMap (M.insertWith (++) (head parts) [(ver, xrev)] acc) es
             where
                 parts = splitDirectories (Tar.entryPath e)
-                ver = parts `atMay` 1 >>= simpleParse
+                ver = if length parts == 3 then parts `atMay` 1 >>= simpleParse
+                      else Nothing
                 content = case Tar.entryContent e of
                     Tar.NormalFile c _ -> Just $ BSLU.toString c
                     _ -> Nothing
@@ -70,9 +71,18 @@
         createPkgVerMap _ (Tar.Fail _) = undefined
 
 latestVersion :: PkgVersions
-    -> String -- ^ package name
-    -> Maybe (Version, Int)
-latestVersion pnv pkg = last . sort <$> M.lookup  pkg pnv
+  -> String -- ^ package name
+  -> Version
+  -> Maybe (Version, Int)
+latestVersion pnv pkg _ = last . sort <$> M.lookup  pkg pnv
+
+thisVersion :: PkgVersions
+  -> String -- ^ package name
+  -> Version
+  -> Maybe (Version, Int) -- ^ xrev
+thisVersion pnvs pkgName pkgVer = do
+  vers <- M.lookup pkgName pnvs
+  find (\ (v, _) -> v == pkgVer) vers
 
 extractCabal :: BSL.ByteString  -- ^ the index
     -> String                   -- ^ package name
diff --git a/src/Util/Misc.hs b/src/Util/Misc.hs
--- a/src/Util/Misc.hs
+++ b/src/Util/Misc.hs
@@ -176,7 +176,7 @@
     | CmdListPkgs
         { listGhc :: Bool, listDistro :: Bool, noListRepo :: Bool
         , listFmt :: CmdListFormat, pkgs :: [String] }
-    | CmdUpgrades { idxStyle :: Bool }
+    | CmdUpgrades { idxStyle :: Bool, xrevs :: Bool }
     | CmdPkgBuild { ghcVer :: Version, ghcRel :: Int, patchDir :: FilePath, pkgs :: [String] }
     | CmdConvertDb { inDbFile :: FilePath, outDbFile :: FilePath }
     | CmdRemovePkg { pkgs :: [String] }
diff --git a/src/Versions.hs b/src/Versions.hs
--- a/src/Versions.hs
+++ b/src/Versions.hs
@@ -25,6 +25,7 @@
 import Data.Map as M
 import Distribution.Text
 import Distribution.Version
+import Data.List
 
 versions :: Command ()
 versions = do
@@ -35,7 +36,7 @@
     let printFunc = if l then printLatestVersion else printAllVersions
     liftIO $ do
         pkgsNVers <- buildPkgVersions <$> readIndexFile aD (getIndexFileName cfg)
-        mapM_ (\ pkg -> printFunc (pkg, M.lookup pkg pkgsNVers)) pkgs
+        mapM_ (\ pkg -> printFunc (pkg, reverse . sort <$> M.lookup pkg pkgsNVers)) pkgs
 
 printAllVersions :: (String, Maybe [(Version, Int)]) -> IO ()
 printAllVersions (p, Nothing) = putStrLn $ p ++ ": No such package"
