diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # dnf-repo releases
 
+## 0.5.5 (2023-07-02)
+- for dnf5 test for dnf-3 (for config-manager) and also dnf
+- YumRepoFile: fix parsing of "enable = 1" (for UBI)
+- sudo debug: print cmd
+- update simple-prompt to 0.2
+
 ## 0.5.4 (2023-05-06)
 - Revert "don't printAction's if no args"
 - use simple-prompt
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,16 +3,16 @@
 A wrapper of the dnf package manager for fine control of
 enabled/disabled yum repos (eg Copr repos).
 
-dnf is the package manager used by Fedora Linux and also from RHEL 8 on.
+dnf is the package manager used by Fedora Linux, Centos Stream, and RHEL.
 
-DNF is a bit slow at handling multiple repos because it attempts
-to refresh the cached repodata frequently. So it can be advantageous
-to disable smaller repos by default and only enable them as needed
-periodically.
+DNF can get slower with many repos enabled because it attempts
+to refresh its cached repodata frequently. So it can be advantageous
+to disable some small repos by default and only enable them periodically
+as needed.
 
 This tool can temporarily enable/disable repo(s) selected by substring(s).
 Changes to repos' enabled states can be saved too.
-It is also possible to expire repos' caches individually.
+It is also possible to expire repo caches individually.
 
 There are also smart options to enable/disable testing/modular repos
 (and even source/debuginfo repos),
@@ -22,7 +22,7 @@
 
 ```shellsession
 $ dnf-repo --version
-0.5.4
+0.5.5
 $ dnf-repo --help
 DNF wrapper repo tool
 
@@ -65,7 +65,7 @@
   --enable-source          Enable source repos
   --disable-source         Disable source repos
   -c,--add-copr COPR       Create repo file for copr repo
-  -k,--add-koji REPO       Create repo file for koji repo (f37-build, rawhide,
+  -k,--add-koji REPO       Create repo file for koji repo (f38-build, rawhide,
                            epel9-build, etc)
   -u,--repourl URL         Use temporary repo from a baseurl
 ```
@@ -122,9 +122,9 @@
 ```
 
 ### Switch system from rawhide
-Switch a system from Rawhide to F37:
+Switch a system from Rawhide to F38:
 ```shellsession
-$ dnf-repo -d rawhide -e fedora distrosync --releasever 37 fedora-\*
+$ dnf-repo -d rawhide -e fedora distrosync --releasever 38 fedora-\*
 with disabled 'rawhide'
 with enabled 'fedora'
 
diff --git a/dnf-repo.cabal b/dnf-repo.cabal
--- a/dnf-repo.cabal
+++ b/dnf-repo.cabal
@@ -1,5 +1,5 @@
 name:                dnf-repo
-version:             0.5.4
+version:             0.5.5
 synopsis:            DNF wrapper tool to control repos
 description:
         A command-line wrapper of the dnf package manager to
@@ -46,7 +46,7 @@
                        http-directory >= 0.1.9,
                        simple-cmd,
                        simple-cmd-args >= 0.1.8,
-                       simple-prompt
+                       simple-prompt >= 0.2
   default-language:    Haskell2010
   ghc-options:         -Wall
   if impl(ghc >= 8.0)
diff --git a/src/ExpireRepos.hs b/src/ExpireRepos.hs
--- a/src/ExpireRepos.hs
+++ b/src/ExpireRepos.hs
@@ -6,7 +6,7 @@
 import Control.Monad
 import Data.List (nub)
 import SimpleCmd (error')
-import SimplePrompt (yesno)
+import SimplePrompt (yesNo)
 
 import Sudo
 
@@ -17,7 +17,7 @@
 expireRepo dryrun debug repo = do
   old <- read <$> readFile expiredFile :: IO [String]
   let expired = nub $ old ++ [repo]
-  ok <- yesno Nothing $ "Mark '" ++ repo ++ "' cache expired"
+  ok <- yesNo $ "Mark '" ++ repo ++ "' cache expired"
   when ok $ do
     doSudo dryrun debug "sed" ["-i", "-e",
                                "s/" ++ renderShow old ++ "/" ++ renderShow expired ++ "/",
@@ -42,7 +42,7 @@
     else do
     mapM_ putStrLn old
     putStrLn ""
-    ok <- yesno Nothing "Unset cache expirations"
+    ok <- yesNo "Unset cache expirations"
     when ok $ do
       doSudo dryrun debug "sed" ["-i", "-e",
                                "s/" ++ renderShow old ++ "/" ++ renderShow [] ++ "/",
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -12,8 +12,12 @@
 import Network.HTTP.Directory (httpExists', (+/+))
 import SimpleCmd
 import SimpleCmdArgs
-import SimplePrompt (yesno)
-import System.Directory
+import SimplePrompt (yesNo)
+import System.Directory (doesFileExist, findExecutable, withCurrentDirectory,
+#if !MIN_VERSION_simple_cmd(0,2,4)
+                         listDirectory
+#endif
+                        )
 import System.Environment (lookupEnv)
 import System.FilePath
 import System.IO (hSetBuffering, stdout, BufferMode(NoBuffering))
@@ -64,7 +68,7 @@
       flagLongWith' (Specific EnableSource) "enable-source" "Enable source repos" <|>
       flagLongWith' (Specific DisableSource) "disable-source" "Disable source repos" <|>
       AddCopr <$> repoOptionWith 'c' "add-copr" "COPR" "Create repo file for copr repo" <|>
-      AddKoji <$> repoOptionWith 'k' "add-koji" "REPO" "Create repo file for koji repo (f37-build, rawhide, epel9-build, etc)" <|>
+      AddKoji <$> repoOptionWith 'k' "add-koji" "REPO" "Create repo file for koji repo (f38-build, rawhide, epel9-build, etc)" <|>
       RepoURL <$> strOptionWith 'u' "repourl" "URL" "Use temporary repo from a baseurl"
 
 coprRepoTemplate :: FilePath
@@ -117,9 +121,14 @@
         else do
         let changes = concatMap saveRepo actions
         unless (null changes) $ do
-          ok <- yesno Nothing $ "Save changed repo" ++ " enabled state" ++ ['s' | length changes > 1]
-          when ok $
-            doSudo dryrun debug "dnf" $ "config-manager" : changes
+          ok <- yesNo $ "Save changed repo" ++ " enabled state" ++ ['s' | length changes > 1]
+          when ok $ do
+            mdnf3 <- findExecutable "dnf-3"
+            case mdnf3 of
+              -- FIXME cannot combine --disable and --enable
+              Just dnf3 -> doSudo dryrun debug dnf3 $ "config-manager" : changes
+              -- FIXME need to have repo files in changes
+              Nothing -> doSudo dryrun debug "sed" $ "config-manager" : changes
     if null args
       then
       when (null actions || listrepos) $ do
@@ -128,11 +137,17 @@
       else do
       sleep 1
       when save $ putStrLn ""
-      let repoargs = concatMap changeRepo actions
-          weakdeps = maybe [] (\w -> ["--setopt=install_weak_deps=" ++ show w]) mweakdeps
-          quietopt = if quiet then ("-q" :) else id
-          cachedir = ["--setopt=cachedir=/var/cache/dnf" </> relver | relver <- maybeToList (maybeReleaseVer args)]
-        in doSudo dryrun debug "dnf" $ quietopt repoargs ++ cachedir ++ weakdeps ++ args
+      mdnf <- findExecutable "dnf"
+      case mdnf of
+        Just dnf -> do
+          when debug $ putStrLn dnf
+          let repoargs = concatMap changeRepo actions
+              weakdeps = maybe [] (\w -> ["--setopt=install_weak_deps=" ++ show w]) mweakdeps
+              quietopt = if quiet then ("-q" :) else id
+              cachedir = ["--setopt=cachedir=/var/cache/dnf" </> relver | relver <- maybeToList (maybeReleaseVer args)]
+            in doSudo dryrun debug dnf $ quietopt repoargs ++ cachedir ++ weakdeps ++ args
+        -- FIXME rpm-ostree install supports --enablerepo
+        Nothing -> error' "rpm-ostree not supported"
 
 -- FIXME pull non-fedora copr repo file
 addCoprRepo :: Bool -> Bool -> String -> IO ()
@@ -195,7 +210,7 @@
   case mowned of
     Just owner -> warning $ repofile +-+ "owned by" +-+ owner
     Nothing -> do
-      ok <- yesno Nothing $ "Remove " ++ takeFileName repofile
+      ok <- yesNo $ "Remove " ++ takeFileName repofile
       when ok $ do
         doSudo dryrun debug "rm" [repofile]
 
diff --git a/src/Sudo.hs b/src/Sudo.hs
--- a/src/Sudo.hs
+++ b/src/Sudo.hs
@@ -8,8 +8,7 @@
 -- FIXME make this silent (simple-cmd-0.2.7) unless debug
 doSudo :: Bool -> Bool -> String -> [String] -> IO ()
 doSudo dryrun debug c args = do
-  if dryrun
-    then cmdN c args
-    else do
-    when debug $ cmdN c args
+  when (dryrun || debug) $ do
+    cmdN c args
+  unless dryrun $
     sudo_ c args
diff --git a/src/YumRepoFile.hs b/src/YumRepoFile.hs
--- a/src/YumRepoFile.hs
+++ b/src/YumRepoFile.hs
@@ -18,7 +18,7 @@
 import Data.Either (partitionEithers)
 import Data.List.Extra (dropPrefix, dropSuffix,
                         isPrefixOf, isInfixOf, isSuffixOf, nub,
-                        replace, sortOn, stripInfix, trim)
+                        replace, sortOn, splitOn, stripInfix, trim)
 import Data.Maybe (mapMaybe)
 import SimpleCmd (error')
 import System.FilePath.Glob (compile, match)
@@ -260,12 +260,15 @@
     Nothing -> []
     Just (section,rest) ->
       let (enabled,more) =
-            case dropWhile (not . ("enabled=" `isPrefixOf`)) rest of
+            case dropWhile (not . ("enabled" `isPrefixOf`)) rest of
               [] -> error' $ "no enabled field for " ++ section
               (e:more') ->
-                case trim e of
-                  "enabled=1" -> (True,more')
-                  "enabled=0" -> (False,more')
+                case splitOn "=" e of
+                  [_,v] ->
+                    case trim v of
+                      "1" -> (True,more')
+                      "0" -> (False,more')
+                      _ -> error' $ "strange enabled state " ++ e ++ " for " ++ section
                   _ -> error' $ "unknown enabled state " ++ e ++ " for " ++ section
       in (section,(enabled,file)) : parseRepos file more
   where
