diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,14 @@
 # Version history for fedora-repoquery
 
+## 0.9 (2026-06-26)
+- add `--all-epel` releases
+- c10s: use mirror.stream.centos.org
+- improve handling of archived epel major and minor releases
+- preliminary support for pre-stream centos
+- fedora updates Everything was introduced from F28
+- error for i386 arch unless epel6, f25, c7, or older
+- do not include i386 in `--all-archs` (regression in 0.8.2)
+
 ## 0.8.2 (2026-05-10)
 - `--all-archs`: also include source and i386
 - `--koji`: map epel10 to epel10.x
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
 `$ fedora-repoquery rawhide firefox`
 
 ```
-firefox-150.0.1-1.fc45.x86_64 (fedora-rawhide)
+firefox-152.0-1.fc45.x86_64 (fedora-rawhide)
 ```
 (note it is shorter to write `fedora-repoquery 45`).
 
@@ -30,13 +30,14 @@
 `$ fedora-repoquery c10 bash`
 
 ```
+bash-5.2.26-4.el10.x86_64 (c10s-BaseOS)
 bash-5.2.26-6.el10.x86_64 (c10s-BaseOS)
 ```
 
 `$ fedora-repoquery eln kernel`
 
 ```
-kernel-7.1.0-0.rc2.260507g8ab992f815d6.19.eln156.x86_64 (eln-BaseOS)
+kernel-7.1.0-0.rc3.260512g50897c955902.24.eln156.x86_64 (eln-BaseOS)
 ```
 
 Without a release argument, the system yum repo configuration is used:
@@ -50,8 +51,9 @@
 `$ fedora-repoquery --whatrequires pandoc`
 
 ```
+openqa-devel-5^20260604git6376095-3.fc45.noarch (rawhide)
 pandoc-pdf-3.7.0.2-40.fc44.x86_64 (rawhide)
-python3-pypandoc-1.16.2-1.fc44.noarch (rawhide)
+python3-pypandoc-1.17-2.fc45.noarch (rawhide)
 ```
 
 Use the --time (-T) option to display repo timestamps:
@@ -70,7 +72,7 @@
 
 ```
 2026-04-24 23:40:25 +08 <https://mirror.freedif.org/fedora/fedora/linux/releases/44/>
-2026-05-10 10:47:00 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/>
+2026-06-26 08:57:49 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/>
 ```
 
 One can also query multiple releases (or arch's):
@@ -79,9 +81,9 @@
 
 ```
 python3-3.14.0-1.fc43.x86_64 (f43)
-python3-3.14.4-2.fc43.x86_64 (f43-updates)
+python3-3.14.5-1.fc43.x86_64 (f43-updates)
 python3-3.14.3-2.fc44.x86_64 (f44)
-python3-3.14.4-2.fc44.x86_64 (f44-updates)
+python3-3.14.6-1.fc44.x86_64 (f44-updates)
 ```
 
 There is an option to use the CloudFront cache:
@@ -90,16 +92,22 @@
 
 ```
 rust-1.94.1-1.fc44.x86_64 (f44-cf)
-rust-1.95.0-1.fc44.x86_64 (f44-updates-cf)
+rust-1.96.0-1.fc44.x86_64 (f44-updates-cf)
 ```
 which may be faster than dl.fp.o and fresher than other mirrors sometimes.
 
+Querying of epel10 minor versions is supported:
+`$ fedora-repoquery epel10.2 nix`
 
+```
+nix-2.24.15-2.el10_2.x86_64 (epel10.2)
+```
+
 ## Help
 `$ fedora-repoquery --version`
 
 ```
-0.8.2
+0.9
 ```
 
 `$ fedora-repoquery --help`
@@ -109,7 +117,8 @@
 
 Usage: fedora-repoquery [--version] [-4|--dnf4] [(-q|--quiet) | (-v|--verbose)] 
                         [--dynamic] [-T|--time] [-K|--koji] 
-                        [(-m|--mirror URL) | --cf | (-d|--dl)] [-F|--all-fedora]
+                        [(-m|--mirror URL) | --cf | (-d|--dl)] 
+                        [(-F|--all-fedora) | (-E|--all-epel)] 
                         [(-s|--source) | (-A|--all-archs) | 
                           [-a|--repo-arch ARCH]] [-t|--testing] [-D|--debug] 
                         [(-z|--cache-size) | (-e|--cache-clean-empty) | 
@@ -155,6 +164,7 @@
   --cf                     Use CloudFront cache
   -d,--dl                  Use dl.fp.o
   -F,--all-fedora          Query all Fedora releases
+  -E,--all-epel            Query all EPEL releases
   -s,--source              Query source repos
   -A,--all-archs           Query all arch repos
   -a,--repo-arch ARCH      Specify repo arch [default: x86_64]
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.8.2
+version:             0.9
 synopsis:            Fedora release repos package query tool
 description:
         A CLI tool for repoquerying Fedora and Centos Stream release packages:
@@ -52,6 +52,7 @@
                        fedora-releases >= 0.2,
                        filepath,
                        Glob,
+                       http-directory,
                        optparse-applicative,
                        regex-compat,
                        safe,
diff --git a/src/Arch.hs b/src/Arch.hs
--- a/src/Arch.hs
+++ b/src/Arch.hs
@@ -21,7 +21,8 @@
   deriving Eq
 
 allArchs :: [Arch]
-allArchs = [Source, X86_64, AARCH64, PPC64LE, S390X, I386]
+-- no i386 repos after F25 and epel6
+allArchs = [Source, X86_64, AARCH64, PPC64LE, S390X]
 
 eitherArch :: String -> Either String Arch
 eitherArch s =
diff --git a/src/BodhiRelease.hs b/src/BodhiRelease.hs
--- a/src/BodhiRelease.hs
+++ b/src/BodhiRelease.hs
@@ -3,18 +3,24 @@
 module BodhiRelease (
   BodhiRelease (..),
   activeFedoraRelease,
+  activeEPELRelease,
+  activeEPELMinorRelease,
   activeFedoraReleases,
-  fedoraReleaseState,
+  activeEPELReleases,
   rawhideFedoraRelease
   )
 where
 
+import Data.Function (on)
 import qualified Data.List as L
 import Data.Maybe (mapMaybe)
-import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases, lookupKey)
-import SimpleCmd (error')
+import Data.Version.Extra (readVersion, showVersion, Version(..))
+import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases,
+                                          getBodhiEPELReleases, lookupKey)
+import Safe (headMay)
+import SimpleCmd (error', (+-+))
 
-import Types (Natural)
+import Types (Natural, elnVersion)
 
 data BodhiRelease =
   Release {releaseVersion :: String, -- to handle "eln"
@@ -24,18 +30,56 @@
            releasePostBeta :: Bool}
   deriving Eq
 
--- Left is oldest active version
-activeFedoraRelease :: Natural -> IO (Either Natural BodhiRelease)
+activeFedoraRelease :: Natural -> IO (Maybe BodhiRelease)
 activeFedoraRelease n = do
+  -- FIXME include eol releases?
   active <- activeFedoraReleases
   case L.sortOn releaseVersion active of
     [] -> error' "failed to find active releases with Bodhi API"
     (oldest:_) ->
       return $
       case L.find (\r -> releaseVersion r == show n) active of
-        Just rel -> Right rel
-        Nothing -> Left $ read $ releaseVersion oldest
+        Just rel -> Just rel
+        Nothing ->
+          let oldver = read $ releaseVersion oldest in
+            if n < oldver
+            then Nothing
+            else error' $ "unknown fedora release:" +-+ show n
 
+activeEPELRelease :: Natural -> IO (Maybe BodhiRelease)
+activeEPELRelease n = do
+  active <- activeEPELReleases
+  case L.sortOn (readVersion . releaseVersion) active of
+    [] -> error' "failed to find active releases with Bodhi API"
+    (oldest:_) ->
+      return $
+      case L.find (\r -> majorVer (releaseVersion r) == show n) active of
+        Just rel -> Just rel
+        Nothing ->
+          let oldver = read . majorVer $ releaseVersion oldest in
+            if n < oldver
+            then Nothing
+            else error' $ "unknown epel release:" +-+ show n
+  where
+    majorVer = takeWhile (/= '.')
+
+activeEPELMinorRelease :: Version -> IO (Maybe BodhiRelease)
+activeEPELMinorRelease ver = do
+  active <- activeEPELReleases
+  case L.find (\r -> readVersion (releaseVersion r) == ver) active of
+    Just rel -> return $ Just rel
+    Nothing -> do
+      let minors = filter (\r -> ((==) `on` majorVer) ver (readVersion . releaseVersion $ r)) active
+      if majorVer ver < fromIntegral elnVersion &&
+         all (\r -> readVersion (releaseVersion r) > ver) minors
+      then return Nothing
+      else error' $ "unknown epel release:" +-+ showVersion ver
+  where
+    majorVer v =
+      case headMay $ versionBranch v of
+        Just m -> m
+        Nothing -> error $ "no major version:" +-+ showVersion ver
+
 activeFedoraReleases :: IO [BodhiRelease]
 activeFedoraReleases =
   L.nub . mapMaybe maybeRelease <$> getBodhiFedoraReleases
@@ -50,13 +94,19 @@
         Release version state branch composed $
         setting == Just ("post_beta" :: String)
 
-fedoraReleaseState :: Natural -> IO String
-fedoraReleaseState n = do
-  eactive <- activeFedoraRelease n
-  return $
-    case eactive of
-      Left _ -> error' $ "could find F" ++ show n ++ " release (state)"
-      Right rel -> releaseState rel
+activeEPELReleases :: IO [BodhiRelease]
+activeEPELReleases =
+  L.nub . mapMaybe maybeRelease <$> getBodhiEPELReleases
+  where
+    maybeRelease obj = do
+      version <- lookupKey "version" obj
+      branch <- lookupKey "branch" obj
+      state <- lookupKey "state" obj
+      composed <- lookupKey "composed_by_bodhi" obj
+      let setting = lookupKey "setting_status" obj
+      return $
+        Release version state branch composed $
+        setting == Just ("post_beta" :: String)
 
 rawhideFedoraRelease :: IO Natural
 rawhideFedoraRelease = do
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -15,6 +15,7 @@
 #endif
 import Control.Monad (forM_, unless, when)
 import Data.Either (rights, partitionEithers)
+import Data.Maybe (isNothing)
 #if !MIN_VERSION_base(4,11,0)
 import Data.Semigroup ((<>))
 #endif
@@ -33,14 +34,16 @@
 import List (listVersionsCmd)
 import Paths_fedora_repoquery (version)
 import Query
-import Release (activeFedoraReleases, downloadServer, releaseBranch,
-                showReleaseCmd)
+import Release (activeFedoraReleases, activeEPELReleases,downloadServer,
+                releaseBranch, showReleaseCmd)
 import Types (Mirror(..), Release (System), RepoSource(..), Verbosity(..),
               eitherRelease)
 
 data Command = Query [DnfOption] [String]
              | CacheSize | CacheEmpties | DnfHelp | ReleaseList
 
+data AllReleases = AllFedora | AllEPEL
+
 main :: IO ()
 main = do
   hSetBuffering stdout NoBuffering
@@ -66,8 +69,9 @@
           <*> ((Mirror <$> strOptionWith 'm' "mirror" "URL" ("Fedora mirror [default: " ++ downloadServer ++ "]")) <|>
                flagLongWith' CloudFront "cf" "Use CloudFront cache" <|>
                flagWith DownloadFpo DlFpo 'd' "dl" "Use dl.fp.o"))
-    -- FIXME: --all-epel and --all-releases
-    <*> switchWith 'F' "all-fedora" "Query all Fedora releases"
+    -- FIXME: --all-releases ?
+    <*> optional (flagWith' AllFedora 'F' "all-fedora" "Query all Fedora releases" <|>
+                  flagWith' AllEPEL 'E' "all-epel" "Query all EPEL releases")
     <*> (flagWith' [Source] 's' "source" "Query source repos" <|>
          flagWith' allArchs 'A' "all-archs" "Query all arch repos" <|>
          many (optionWith (eitherReader eitherArch) 'a' "repo-arch" "ARCH" ("Specify repo arch [default:" +-+ showArch sysarch ++ "]")))
@@ -151,9 +155,9 @@
   <|> dnfFlag "querytags"
   <|> dnfOption'' "qf" "queryformat"
 
-runMain :: Arch -> Bool -> Verbosity -> Bool -> Bool -> RepoSource -> Bool
-        -> [Arch] -> Bool -> Bool -> Command -> IO ()
-runMain sysarch dnf4 verbose dynredir time reposource allreleases archs testing debug command = do
+runMain :: Arch -> Bool -> Verbosity -> Bool -> Bool -> RepoSource
+        -> Maybe AllReleases -> [Arch] -> Bool -> Bool -> Command -> IO ()
+runMain sysarch dnf4 verbose dynredir time reposource mallreleases archs testing debug command = do
   case command of
     CacheSize -> cacheSize
     CacheEmpties -> cleanEmptyCaches
@@ -163,19 +167,21 @@
       -- spanJust from utility-ht nicer but this gets us enough
       let (args,releases) = partitionEithers $ map eitherRelease relargs
       in do
-        unless (null releases || not allreleases) $
+        unless (null releases || isNothing mallreleases) $
           error' "cannot specify releases and --all-releases"
-        when (null releases && not allreleases) $
+        when (null releases && isNothing mallreleases) $
           when (verbose == Verbose || debug) $
           warning "(using system repos)"
         releaselist <-
           if null releases
           then
-            if allreleases
-            then
-              rights . map (eitherRelease . releaseBranch)
-              <$> activeFedoraReleases
-            else return [System]
+            case mallreleases of
+              Just allreleases ->
+                rights . map (eitherRelease . releaseBranch)
+                <$> case allreleases of
+                      AllFedora -> activeFedoraReleases
+                      AllEPEL -> activeEPELReleases
+              Nothing -> return [System]
           else return releases
         forM_ releaselist $ \release ->
           if null args && null opts
diff --git a/src/Release.hs b/src/Release.hs
--- a/src/Release.hs
+++ b/src/Release.hs
@@ -4,6 +4,7 @@
   showReleaseCmd,
   getRelease,
   activeFedoraReleases,
+  activeEPELReleases,
   BodhiRelease(..),
   downloadServer
   )
@@ -14,12 +15,18 @@
 import qualified Data.CaseInsensitive as CI
 import Data.List.Extra
 import Data.Maybe (fromMaybe)
+import qualified Data.Text as T
 import Data.Time.Format (defaultTimeLocale, parseTimeM, rfc822DateFormat)
 import Data.Time.LocalTime (utcToLocalZonedTime)
-import Data.Version.Extra (readVersion, Version(..))
+import Data.Version.Extra (makeVersion, readVersion, showVersion, Version(..))
 import qualified Distribution.Fedora.Release as F
 import Network.Curl (curlHead, CurlOption(..))
-import Safe (tailSafe)
+import Network.HTTP.Directory (httpDirectory', noTrailingSlash,
+#if MIN_VERSION_http_directory(0,1,9)
+                               (+/+)
+#endif
+                              )
+import Safe (lastMay, tailSafe)
 import SimpleCmd (error', (+-+))
 import Text.Regex (mkRegex, subRegex)
 
@@ -47,6 +54,7 @@
                        _ -> error' $ "invalid minor branch version:" +-+ version
                getRelease' debug dynredir warn checkdate reposource (EpelMinor n minor) sysarch march testing
     _ -> getRelease' debug dynredir warn checkdate reposource release sysarch march testing
+
 -- FIXME should warn or error if url (release) does not exist
 getRelease' :: Bool -> Bool -> Bool -> Bool -> RepoSource -> Release -> Arch
            -> Maybe Arch -> Bool -> IO [(String, URL)]
@@ -58,66 +66,72 @@
   (basicrepos,morerepos) <-
     if koji
     then return ([("koji",urlpath)],[])
-    else
-    case release of
-      Centos n -> return ([("BaseOS",urlpath)],
-                          [("AppStream",url),(if n >= 9 then "CRB" else "PowerTools",url)])
-      ELN -> return ([("BaseOS",urlpath)],
-                     [("AppStream",urlpath),("CRB",urlpath)])
-      Rawhide -> return ([("development", urlpath)],[])
-      -- curl -s https://bodhi.fedoraproject.org/releases/?exclude_archived=True | jq
-      Fedora n -> do
-        eactiverelease <- activeFedoraRelease n
-        case eactiverelease of
-          Left _oldest ->
-              return (("releases", urlpath) :
+    else do
+      when (arch == I386) $ checkI386Release release
+      case release of
+        OldCentos n -> return $
+                       if n >= 8
+                       then ([("BaseOS",urlpath)],
+                             [("AppStream",url),("PowerTools",url)])
+                       else ([("os",urlpath)],[])
+        Centos n -> return ([("BaseOS",urlpath)],
+                            [("AppStream",url),(if n >= 9 then "CRB" else "PowerTools",url)])
+        ELN -> return ([("BaseOS",urlpath)],
+                       [("AppStream",urlpath),("CRB",urlpath)])
+        Rawhide -> return ([("development", urlpath)],[])
+        -- curl -s https://bodhi.fedoraproject.org/releases/?exclude_archived=True | jq
+        Fedora n -> do
+          mactiverelease <- activeFedoraRelease n
+          case mactiverelease of
+            Nothing ->
+                return (("releases", urlpath) :
+                        ("updates", url +//+ ["updates",show n]) :
+                        [("updates-testing", url +//+ ["updates","testing",show n]) | testing]
+                       ,[])
+            Just rel -> do
+              let composed = releaseComposed rel
+                  state = releaseState rel
+                  postbeta = releasePostBeta rel
+              return $
+            -- after Beta Freeze
+            -- {"state": "pending", "composed_by_bodhi": true,
+            --  "create_automatic_updates": false, "setting_status": "post_beta"}
+            --
+            -- final freeze
+            -- {"state": "frozen", "composed_by_bodhi": true,
+            --  "create_automatic_updates": false, "setting_status": "post_beta"}
+            --
+            -- final unfrozen
+            -- {"state": "current", "composed_by_bodhi": true,
+            --  "create_automatic_updates": false, "setting_status": "post_beta"}
+            --
+            -- released
+            -- {"state": "current", "composed_by_bodhi": true,
+            --  "create_automatic_updates": false, "setting_status": null}
+            --
+            -- Rawhide
+            -- {"state": "pending", "composed_by_bodhi": false,
+            --  "create_automatic_updates": true, "setting_status": "pre_beta"}
+                if state `elem` ["pending","frozen"] || state == "current" && postbeta
+                then (("development", urlpath) :
+                      [("updates", url +//+ ["updates",show n]) | postbeta , state == "current"] ++
+                      -- FIXME add way to disable or invert testing
+                      [("updates-testing", url +//+ ["updates","testing",show n]) | testing || composed, state /= "current"]
+                     ,[])
+                else (("releases", urlpath) :
                       ("updates", url +//+ ["updates",show n]) :
-                      [("updates-testing", url +//+ ["updates","testing",show n]) | testing]
+                      [("updates-testing", url +//+ ["updates","testing",show n]) | testing || postbeta]
                      ,[])
-          Right rel -> do
-            let composed = releaseComposed rel
-                state = releaseState rel
-                postbeta = releasePostBeta rel
-            return $
-          -- after Beta Freeze
-          -- {"state": "pending", "composed_by_bodhi": true,
-          --  "create_automatic_updates": false, "setting_status": "post_beta"}
-          --
-          -- final freeze
-          -- {"state": "frozen", "composed_by_bodhi": true,
-          --  "create_automatic_updates": false, "setting_status": "post_beta"}
-          --
-          -- final unfrozen
-          -- {"state": "current", "composed_by_bodhi": true,
-          --  "create_automatic_updates": false, "setting_status": "post_beta"}
-          --
-          -- released
-          -- {"state": "current", "composed_by_bodhi": true,
-          --  "create_automatic_updates": false, "setting_status": null}
-          --
-          -- Rawhide
-          -- {"state": "pending", "composed_by_bodhi": false,
-          --  "create_automatic_updates": true, "setting_status": "pre_beta"}
-              if state `elem` ["pending","frozen"] || state == "current" && postbeta
-              then (("development", urlpath) :
-                    [("updates", url +//+ ["updates",show n]) | postbeta , state == "current"] ++
-                    -- FIXME add way to disable or invert testing
-                    [("updates-testing", url +//+ ["updates","testing",show n]) | testing || composed, state /= "current"]
-                   ,[])
-              else (("releases", urlpath) :
-                    ("updates", url +//+ ["updates",show n]) :
-                    [("updates-testing", url +//+ ["updates","testing",show n]) | testing || postbeta]
-                   ,[])
-      EPEL n -> return
-                (("epel",urlpath) :
-                 [("epel-testing",url +//+ ["testing", show n]) | testing],
-                 [])
-      EpelMinor n m -> return
-                (("epel",urlpath) :
-                 [("epel-testing",url +//+ ["testing", show n ++ "." ++ show m]) | testing],
-                 [])
-      EPEL9Next -> return ([("epelnext",urlpath)],[])
-      System -> error' "showRelease: unsupported for system"
+        EPEL n -> return
+                  (("epel",urlpath) :
+                   [("epel-testing",url +//+ ["testing", show n]) | testing],
+                   [])
+        EpelMinor n m -> return
+                  (("epel",urlpath) :
+                   [("epel-testing",url +//+ ["testing", show n ++ "." ++ show m]) | testing],
+                   [])
+        EPEL9Next -> return ([("epelnext",urlpath)],[])
+        System -> error' "showRelease: unsupported for system"
   rawhide <- rawhideFedoraRelease
   let basicrepourls =
         map (repoConfigArgs reposource sysarch march rawhide release) basicrepos
@@ -133,14 +147,15 @@
             then ["repo.json"]
             else
               case release of
+                OldCentos _ -> ["COMPOSE_ID"]
                 Centos 10 -> ["metadata","composeinfo.json"]
                 Centos _ -> ["COMPOSE_ID"] -- ["metadata","composeinfo.json"]
                 ELN -> ["COMPOSE_ID"]
-                EPEL _ -> ["Everything", "state"]
+                EPEL n -> ["Everything" | n >= 8] ++ ["state"]
                 EpelMinor _ _ -> ["Everything", "state"]
                 EPEL9Next -> ["Everything", "state"]
-                Fedora _ -> if "updates" `isInfixOf` reponame
-                            then ["Everything", "state"]
+                Fedora n -> if "updates" `isInfixOf` reponame
+                            then ["Everything" | n >= 28] ++ ["state"]
                             else ["COMPOSE_ID"]
                 Rawhide -> ["COMPOSE_ID"]
                 System -> error' "system not supported"
@@ -161,13 +176,19 @@
        -> IO (URL,[String])
 getURL debug dynredir reposource@(RepoSource koji _mirror) release arch =
   case release of
+    OldCentos n -> do
+      url <- getOldCentosURL n
+      return (URL url, [])
     Centos n ->
       case n of
         10 ->
           let url = URL $
                 if koji
                 then "https://odcs.stream.centos.org/stream-10"
-                else "https://composes.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/"
+                else
+                  -- FIXME add --nightly and --devel flags?
+                  -- was "https://composes.stream.centos.org/stream-10/production/latest-CentOS-Stream/compose/"
+                  "https://mirror.stream.centos.org/10-stream/"
           in return (url,[])
         9 ->
           let url = URL $
@@ -176,25 +197,31 @@
                 else "https://mirror.stream.centos.org/9-stream/"
           in return (url,[])
         8 -> return (URL "http://vault.centos.org/8-stream/", [])
-        _ -> error' "old Centos is not supported"
+        _ -> error' $ "unknown centos-stream" +-+ show n
     ELN ->
       getFedoraServer debug dynredir reposource ["eln"] ["1"]
-    EPEL n | n < 7 ->
-               return
-               (URL "https://archives.fedoraproject.org/pub/archive/epel", [show n])
-    EPEL n -> getFedoraServer debug dynredir reposource ["epel"] [show n]
-    EpelMinor n m -> getFedoraServer debug dynredir reposource ["epel"] [show n ++ "." ++ show m]
+    EPEL n -> do
+      mactiverel <- activeEPELRelease n
+      case mactiverel of
+        Nothing ->
+          return
+          (URL "https://archives.fedoraproject.org/pub/archive/epel", [show n])
+        Just _rel -> getFedoraServer debug dynredir reposource ["epel"] [show n]
+    EpelMinor n m -> do
+      let ver = makeVersion $ map fromIntegral [n,m]
+      mactiverel <- activeEPELMinorRelease ver
+      case mactiverel of
+        Just _rel -> getFedoraServer debug dynredir reposource ["epel"] [show n ++ "." ++ show m]
+        Nothing ->
+          return (URL "https://archives.fedoraproject.org/pub/archive/epel", [show n ++ "." ++ show m])
     EPEL9Next -> getFedoraServer debug dynredir reposource ["epel","next"] ["9"]
     Fedora n -> do
-      eactiverelease <- activeFedoraRelease n
-      case eactiverelease of
-        Left oldest ->
-          if n < oldest
-          then
+      mactiverel <- activeFedoraRelease n
+      case mactiverel of
+        Nothing ->
           return
           (URL "https://archives.fedoraproject.org/pub/archive" +//+ fedoraTop, ["releases", show n])
-          else error' $ "unknown fedora release:" +-+ show n
-        Right rel ->
+        Just rel ->
           -- state values: ["disabled","pending","frozen","current","archived"]
           let pending = releaseState rel /= "current"
               postbeta = releasePostBeta rel
@@ -240,6 +267,7 @@
                    CloudFront -> "-cf"
       path =
         case release of
+          OldCentos n -> [repo, showArch arch] ++ ["os" | n == 8]
           Centos _ -> [repo, showArch arch] ++ (if arch == Source then ["tree"] else ["os"])
           ELN -> [repo, showArch arch] ++ (if arch == Source then ["tree"] else ["os"])
           EPEL n -> (if n >= 8 then ("Everything" :) else id) [showArch arch] ++ ["tree" | arch == Source]
@@ -263,6 +291,8 @@
         EPEL9Next -> show release ++ if repo == "epelnext-testing" then "-testing" else ""
         EPEL _ -> show release ++ if repo == "epel-testing" then "-testing" else ""
         Centos _ -> show release ++ '-':repo
+        OldCentos 8 -> show release ++  '-':repo
+        OldCentos _ -> show release
         System -> ""
 -- koji
 repoConfigArgs (RepoSource True _mirror) sysarch march _rawhide release (repo,url) =
@@ -329,4 +359,31 @@
 #if !MIN_VERSION_base(4,15,0)
 singleton :: a -> [a]
 singleton x = [x]
+#endif
+
+checkI386Release :: Release -> IO ()
+checkI386Release release =
+  case release of
+    Fedora n | n < 26 -> return ()
+    EPEL n | n < 7 -> return ()
+    OldCentos n | n < 8 -> return ()
+    _ -> error' $ showArch I386 +-+ "not available for" +-+ show release
+
+getOldCentosURL :: Natural -> IO String
+getOldCentosURL n = do
+  let vault = "https://vault.centos.org"
+  ls <- map (T.unpack . noTrailingSlash) <$> httpDirectory' vault
+  let vers = filter (show n `isPrefixOf`) ls \\ ["8-stream", "4.0beta", "4.2beta"]
+  case lastMay $ sort $ map readVersion vers of
+    Nothing -> error' $ "unknown centos version" +-+ show n
+    Just latest -> return $ vault +/+ showVersion latest
+
+#if !MIN_VERSION_http_directory(0,1,9)
+infixr 5 +/+
+(+/+) :: String -> String -> String
+s +/+ t =
+  case (s,t) of
+    ("",_) -> t
+    (_,"") -> s
+    (_,_) -> dropWhileEnd (== '/') s ++ '/' : dropWhile (== '/') t
 #endif
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -6,12 +6,14 @@
   RepoSource(..),
   Verbosity(..),
   Release(..),
-  eitherRelease
+  eitherRelease,
+  elnVersion
   ) where
 
 import Data.Char (isDigit)
 import Data.List.Extra (lower, unsnoc)
 import Numeric.Natural
+import SimpleCmd (error', (+-+))
 
 --import Distribution.Fedora.Repoquery
 
@@ -21,14 +23,19 @@
 data Mirror = DownloadFpo | DlFpo | CloudFront | Mirror String
   deriving Eq
 
--- FIXME: True for koji make into type
+-- FIXME: True for koji, make into type
 data RepoSource = RepoSource Bool Mirror
   deriving Eq
 
--- FIXME deal with epel11.x
-data Release = EpelMinor Natural Natural | EPEL Natural | EPEL9Next
-             | Centos Natural | Fedora Natural
-             | ELN | Rawhide | System
+data Release = EpelMinor Natural Natural
+             | EPEL Natural
+             | EPEL9Next
+             | OldCentos Natural
+             | Centos Natural
+             | Fedora Natural
+             | ELN
+             | Rawhide
+             | System
   deriving (Eq, Ord)
 
 -- FIXME determine via EPEL or Centos
@@ -43,21 +50,31 @@
     "rawhide" -> Right Rawhide
     -- FIXME add proper parsing:
     "epel9-next" -> Right EPEL9Next
-    -- FIXME add epel11.x
-    ('e':'p':'e':'l':'1':'0':'.':n@(_:_)) | all isDigit n -> let br = EpelMinor 10 (read n)
-                                                 in Right br
-    ('e':'p':'e':'l':n@(_:_)) | all isDigit n -> let br = EPEL (read n)
-                                                 in Right br
+    -- disallow "epel9.4" etc
+    ('e':'p':'e':'l':d:'.':_) | isDigit d -> error' $ "unknown release:" +-+ rel
+    -- disallow "epel10." etc
+    ['e','p','e','l',d,d','.'] | all isDigit [d,d'] -> error' $ "bad release:" +-+ rel
+    ('e':'p':'e':'l':'1':d:'.':n@(_:_)) | all isDigit (d:n) ->
+                                            Right $
+                                            EpelMinor (read ['1',d]) $ read n
+    ('e':'p':'e':'l':n@(_:_)) | all isDigit n -> Right $ EPEL $ read n
+    ('c':'e':'n':'t':'o':'s':n@(_:_)) | all isDigit n ->
+                                          Right $ OldCentos $ read n
     ('c':n@(_:_)) ->
       let ver =
             case unsnoc n of
-              Just (v,'s') -> v
+              Just (v,'s') | all isDigit v ->
+                if read v < (8 :: Natural)
+                then error' $ "centos-stream" +-+ v +-+ "does not exist"
+                else v
               _ -> n
       in if null ver
          then Left rel
          else
            if all isDigit ver
-           then Right (Centos $ read ver)
+           then
+             let v = read ver
+             in Right $ (if v < 8 then OldCentos else Centos) v
            else Left rel
     "eln" -> Right ELN
     ('f':n@(_:_)) | all isDigit n -> let r = read n in Right (Fedora r)
@@ -65,7 +82,7 @@
                let r = read ns in
                  Right $
                  case compare r elnVersion of
-                   LT -> Centos r
+                   LT -> (if r >= 8 then Centos else OldCentos) r
                    EQ -> ELN
                    GT -> Fedora r
     _ -> Left rel
@@ -78,4 +95,5 @@
   show EPEL9Next = "epel9" ++ "-next"
   show ELN = "eln"
   show (Centos n) = 'c' : show n ++ "s"
+  show (OldCentos n) = 'c' : show n
   show System = "system"
diff --git a/test/tests.hs b/test/tests.hs
--- a/test/tests.hs
+++ b/test/tests.hs
@@ -32,8 +32,17 @@
   ,([current], Nothing)
   ,([previous], Nothing)
   ,(["eln"], Nothing)
+  ,(["epel10"], Nothing)
   ,(["epel9"], Nothing)
+  ,(["epel8"], Nothing)
+  ,(["epel7"], Nothing)
+  ,(["epel6"], Nothing)
   ,(["c10s"], Nothing)
+  ,(["c9s"], Nothing)
+  ,(["c8s"], Nothing)
+  ,(["centos8"], Nothing)
+  ,(["centos7"], Nothing)
+  ,(["centos6"], Nothing)
   ,(["--cf", current], Nothing)
   ,(["-K", "epel10"], Nothing)
   ,(["-T", "rawhide"], Just "coreutils")
@@ -43,11 +52,18 @@
   ,([prevprev], Just "fontconfig")
   ,(["-t", previous], Just "podman")
   ,(["eln"], Just "ibus")
+  ,(["epel6"], Just "ghc")
+  ,(["epel7"], Just "ghc")
+  ,(["epel8"], Just "ghc")
   ,(["epel9"], Just "ghc")
   ,(["epel10"], Just "ghc")
-  ,(["epel10.0"], Just "ghc-srpm-macros")
+  ,(["epel10.2"], Just "ghc-srpm-macros")
+  ,(["epel10.1"], Just "ghc-srpm-macros")
   ,(["c10"], Just "bash")
   ,(["c9"], Just "kernel")
+  ,(["c8"], Just "bash")
+  ,(["c7"], Just "gcc")
+  ,(["c6"], Just "gcc")
   ,(["rawhide", "--whatprovides"], Just "perl(Regexp::Pattern::License)")
   ]
 
