diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for fedora-repoquery
 
+## 0.3.1 (2024-02-12)
+- use dnf5 when available
+- add --all-archs to query across all 64bit architectures
+
 ## 0.3 (2023-11-09)
 - Query: no --qf with --changelog
 - small OS versions now map to centos-stream
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 - `fdrq rawhide firefox`
 
-- `fdrq 38 --requires podman`
+- `fdrq 39 --requires podman`
 
 - `fdrq epel9 ghc`
 
@@ -20,7 +20,7 @@
 
 `$ fdrq --version`
 ```
-0.2
+0.3.1
 ```
 `$ fdrq --help`
 ```
@@ -28,7 +28,8 @@
 
 Usage: fdrq [--version] [(-q|--quiet) | (-v|--verbose)] [-K|--koji] 
             [--devel-channel | --test-channel] [(-m|--mirror URL) | (-D|--dl)] 
-            [(-s|--source) | (-a|--arch ARCH)] [-t|--testing] [-d|--debug] 
+            [(-s|--source) | (-A|--all-archs) | [-a|--arch ARCH]] [-t|--testing]
+            [-d|--debug] 
             ((-z|--cache-size) | (-e|--cache-clean-empty) | (-l|--list) | 
               RELEASE [[REPOQUERY_OPTS] [PACKAGE]...])
 
@@ -48,6 +49,7 @@
                            https://download.fedoraproject.org/pub]
   -D,--dl                  Use dl.fp.o
   -s,--source              Query source repos
+  -A,--all-archs           Query all (64 bit) arch repos
   -a,--arch ARCH           Specify arch [default: x86_64]
   -t,--testing             Fedora updates-testing
   -d,--debug               Show some debug output
diff --git a/fedora-repoquery.cabal b/fedora-repoquery.cabal
--- a/fedora-repoquery.cabal
+++ b/fedora-repoquery.cabal
@@ -1,5 +1,5 @@
 name:                fedora-repoquery
-version:             0.3
+version:             0.3.1
 synopsis:            Fedora repoquery tool
 description:
         CLI tool for querying the location and version of Fedora packages
@@ -7,7 +7,7 @@
 license-file:        COPYING
 author:              Jens Petersen <juhpetersen@gmail.com>
 maintainer:          Jens Petersen <juhpetersen@gmail.com>
-copyright:           2021-2023  Jens Petersen <juhpetersen@gmail.com>
+copyright:           2021-2024  Jens Petersen <juhpetersen@gmail.com>
 category:            Utility
 homepage:            https://github.com/juhp/fedora-repoquery
 bug-reports:         https://github.com/juhp/fedora-repoquery/issues
@@ -21,6 +21,7 @@
                      ||  == 9.0
                      ||  == 9.2
                      ||  == 9.4
+                     ||  == 9.6
 
 source-repository head
   type:                git
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -13,6 +13,7 @@
 #endif
   )
 #endif
+import Control.Monad (forM_)
 #if !MIN_VERSION_simple_cmd_args(0,1,7)
 import Options.Applicative (eitherReader, maybeReader, ReadM)
 #endif
@@ -45,8 +46,9 @@
                flagLongWith ChanProd ChanTest "test-channel" "Use eln test compose [default: production]")
           <*> ((Mirror <$> strOptionWith 'm' "mirror" "URL" ("Fedora mirror [default: " ++ downloadServer ++ "]")) <|>
                flagWith DownloadFpo DlFpo 'D' "dl" "Use dl.fp.o"))
-    <*> optional (flagWith' Source 's' "source" "Query source repos" <|>
-                  optionWith (eitherReader eitherArch) 'a' "arch" "ARCH" ("Specify arch [default:" +-+ showArch sysarch ++ "]"))
+    <*> (flagWith' [Source] 's' "source" "Query source repos" <|>
+         flagWith' allArchs 'A' "all-archs" "Query all (64 bit) arch repos" <|>
+         many (optionWith (eitherReader eitherArch) 'a' "arch" "ARCH" ("Specify arch [default:" +-+ showArch sysarch ++ "]")))
     <*> switchWith 't' "testing" "Fedora updates-testing"
     <*> switchWith 'd' "debug" "Show some debug output"
     <*> (flagWith' CacheSize 'z' "cache-size" "Show total dnf repo metadata cache disksize"
@@ -57,13 +59,15 @@
     releaseM :: ReadM Release
     releaseM = maybeReader readRelease
 
-runMain :: Arch -> Verbosity -> RepoSource -> Maybe Arch -> Bool -> Bool -> Command -> IO ()
-runMain sysarch verbose reposource march testing debug command = do
+runMain :: Arch -> Verbosity -> RepoSource -> [Arch] -> Bool -> Bool -> Command -> IO ()
+runMain sysarch verbose reposource archs testing debug command = do
   case command of
     CacheSize -> cacheSize
     CacheEmpties -> cleanEmptyCaches
     List -> listVersionsCmd verbose reposource sysarch
     Query release args -> do
       if null args
-      then showReleaseCmd debug reposource release sysarch march testing
-      else repoqueryCmd debug verbose release reposource sysarch march testing args
+        then if null archs
+             then showReleaseCmd debug reposource release sysarch Nothing testing
+             else forM_ archs $ \arch -> showReleaseCmd debug reposource release sysarch (Just arch) testing
+      else repoqueryCmd debug verbose release reposource sysarch archs testing args
diff --git a/src/Query.hs b/src/Query.hs
--- a/src/Query.hs
+++ b/src/Query.hs
@@ -20,7 +20,8 @@
 import Network.HTTP.Directory
 import SimpleCmd
 import System.Cached.JSON
-import System.Directory (doesFileExist)
+import System.Directory (doesFileExist, findExecutable)
+import System.FilePath (takeBaseName)
 import Text.Regex
 
 #if !MIN_VERSION_simple_cmd(0,2,0)
@@ -34,28 +35,35 @@
 showReleaseCmd debug reposource release sysarch march testing =
   void $ showRelease debug Normal False reposource release sysarch march testing
 
+-- FIXME --no-redirect?
 repoqueryCmd :: Bool -> Verbosity -> Release -> RepoSource -> Arch
-             -> Maybe Arch -> Bool -> [String] -> IO ()
-repoqueryCmd debug verbose release reposource sysarch march testing args = do
-  repoConfigs <- showRelease debug verbose True reposource release sysarch march testing
-  let qfAllowed = not $ any (`elem` ["-i","--info","-l","--list","-s","--source","--nvr","--nevra","--envra","-qf","--queryformat", "--changelog"]) args
-      queryformat = "%{name}-%{version}-%{release}.%{arch} (%{repoid})"
-  -- LANG=C.utf8
-  rhsm <- doesFileExist "/etc/dnf/plugins/subscription-manager.conf"
-  let cmdargs = "repoquery" :
-                ["--quiet" | verbose /= Verbose] ++
-                -- https://bugzilla.redhat.com/show_bug.cgi?id=1876828
-                ["--disableplugin=subscription-manager" | rhsm] ++
-                (if qfAllowed then ["--qf", queryformat] else []) ++
-                ["--setopt=module_platform_id=platform:" ++ show release] ++
-                concatMap renderRepoConfig repoConfigs ++
-                args
-  when debug $
-    warning $ unwords $ "\ndnf" : map show cmdargs
-  res <- cmdLines "dnf" cmdargs
-  unless (null res) $ do
-    unless (verbose == Quiet) $ warning ""
-    putStrLn $ L.intercalate "\n" res
+             -> [Arch] -> Bool -> [String] -> IO ()
+repoqueryCmd debug verbose release reposource sysarch archs testing args = do
+  forM_ (if null archs then [sysarch] else archs) $ \arch -> do
+    repoConfigs <- showRelease debug verbose True reposource release sysarch (Just arch) testing
+    let qfAllowed = not $ any (`elem` ["-i","--info","-l","--list","-s","--source","--nvr","--nevra","--envra","-qf","--queryformat", "--changelog"]) args
+    mdnf5 <- findExecutable "dnf5"
+    let queryformat =
+          "%{name}-%{version}-%{release}.%{arch} (%{repoid})" ++
+          if isJust mdnf5 then "\n" else ""
+    -- LANG=C.utf8
+    rhsm <- doesFileExist "/etc/dnf/plugins/subscription-manager.conf"
+    let cmdargs = "repoquery" :
+                  ["--quiet" | verbose /= Verbose] ++
+                  -- https://bugzilla.redhat.com/show_bug.cgi?id=1876828
+                  ["--disableplugin=subscription-manager" | rhsm] ++
+                  (if qfAllowed then ["--qf", queryformat] else []) ++
+                  -- drop modules for F39+
+                  ["--setopt=module_platform_id=platform:" ++ show release] ++
+                  concatMap renderRepoConfig repoConfigs ++
+                  args
+    let dnf = fromMaybe "/usr/bin/dnf" mdnf5
+    when debug $
+      warning $ unwords $ ('\n' : takeBaseName dnf) : map show cmdargs
+    res <- cmdLines dnf cmdargs
+    unless (null res) $ do
+      unless (verbose == Quiet) $ warning ""
+      putStrLn $ L.intercalate "\n" res
 
 -- majorVersion :: Release -> String
 -- majorVersion (Fedora n) = show n
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -2,6 +2,7 @@
 
 module Types (
   Arch(..),
+  allArchs,
   eitherArch,
   readArch,
   showArch,
@@ -29,10 +30,13 @@
           | X86_64
           | AARCH64
           | ARMV7HL
-          | S390X
           | PPC64LE
+          | S390X
           | I386
   deriving Eq
+
+allArchs :: [Arch]
+allArchs = [X86_64, AARCH64, PPC64LE, S390X]
 
 eitherArch :: String -> Either String Arch
 eitherArch s =
