diff --git a/.zuul.d/jobs.yaml b/.zuul.d/jobs.yaml
index 65c828b4f..a9666d63c 100644
--- a/.zuul.d/jobs.yaml
+++ b/.zuul.d/jobs.yaml
@@ -27,6 +27,7 @@
         # Image based tests
         - centos/8-build-succeeds
         - centos/8-stream-build-succeeds
+        - centos/9-stream-build-succeeds
         - fedora/build-succeeds
         - opensuse/build-succeeds
         - opensuse/opensuse15-build-succeeds
diff --git a/diskimage_builder/elements/centos/root.d/10-centos-cloud-image b/diskimage_builder/elements/centos/root.d/10-centos-cloud-image
index 29c6ba787..ed7964b05 100755
--- a/diskimage_builder/elements/centos/root.d/10-centos-cloud-image
+++ b/diskimage_builder/elements/centos/root.d/10-centos-cloud-image
@@ -29,7 +29,12 @@ else
         elif [[ "arm64" =~ "$ARCH" ]]; then
             ARCH="aarch64"
         fi
-        DIB_CLOUD_IMAGES=${DIB_CLOUD_IMAGES:-http://cloud.centos.org/centos/${DIB_RELEASE}/${ARCH}/images}
+        if [[ "${DIB_RELEASE}" == "9" ]]; then
+            dib_release_path=9-stream
+        else
+            dib_release_path=${DIB_RELEASE}
+        fi
+        DIB_CLOUD_IMAGES=${DIB_CLOUD_IMAGES:-http://cloud.centos.org/centos/${dib_release_path}/${ARCH}/images}
     else
         echo 'centos root element only support the x86_64, aarch64 and ppc64le values for $ARCH'
         exit 1
@@ -51,7 +56,12 @@ else
     if [[ "${DIB_RELEASE}" = 7 ]]; then
         BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-CentOS-${DIB_RELEASE}-${ARCH}-${DIB_FLAVOR}.qcow2.xz}
     else
-        BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-$(curl -s https://cloud.centos.org/centos/${DIB_RELEASE}/${ARCH}/images/ | grep -o "CentOS-.[^>]*${DIB_FLAVOR}-.[^>]*.qcow2" | sort -r | head -1)}
+        if [[ "${DIB_RELEASE}" == "9" ]]; then
+            dib_release_path=9-stream
+        else
+            dib_release_path=${DIB_RELEASE}
+        fi
+        BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-$(curl -s https://cloud.centos.org/centos/${dib_release_path}/${ARCH}/images/ | grep -o "CentOS-.[^>]*${DIB_FLAVOR}-.[^>]*.qcow2" | sort -r | head -1)}
     fi
     BASE_IMAGE_TAR=$BASE_IMAGE_FILE.tgz
     IMAGE_LOCATION=$DIB_CLOUD_IMAGES/$BASE_IMAGE_FILE
diff --git a/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/README.rst b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/README.rst
new file mode 100644
index 000000000..9b5793d27
--- /dev/null
+++ b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/README.rst
@@ -0,0 +1 @@
+Centos Stream 9 test
diff --git a/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/element-deps b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/element-deps
new file mode 100644
index 000000000..3a391e3e9
--- /dev/null
+++ b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/element-deps
@@ -0,0 +1,3 @@
+base
+epel
+openstack-ci-mirrors
diff --git a/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/environment.d/10-set-distro.bash b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/environment.d/10-set-distro.bash
new file mode 100644
index 000000000..29a6ae5ea
--- /dev/null
+++ b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/environment.d/10-set-distro.bash
@@ -0,0 +1 @@
+export DIB_RELEASE='9-stream'
diff --git a/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/test-output-formats b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/test-output-formats
new file mode 100644
index 000000000..7895a8334
--- /dev/null
+++ b/diskimage_builder/elements/centos/test-elements/9-stream-build-succeeds/test-output-formats
@@ -0,0 +1 @@
+qcow2
\ No newline at end of file
diff --git a/diskimage_builder/elements/epel/pre-install.d/05-rpm-epel-release b/diskimage_builder/elements/epel/pre-install.d/05-rpm-epel-release
index 5810e4ede..1d3816a9f 100755
--- a/diskimage_builder/elements/epel/pre-install.d/05-rpm-epel-release
+++ b/diskimage_builder/elements/epel/pre-install.d/05-rpm-epel-release
@@ -6,7 +6,7 @@ fi
 set -eu
 set -o pipefail
 
-if [[ ${DISTRO_NAME} =~ "centos" ]]; then
+if [[ ${DISTRO_NAME} =~ "centos" && "${DIB_RELEASE%-stream}" -lt '9' ]]; then
     # Centos has "epel-release" in extras, which is default enabled.
     ${YUM} install -y epel-release
 else
diff --git a/diskimage_builder/elements/grub2/pkg-map b/diskimage_builder/elements/grub2/pkg-map
index e747eb693..94f877e0c 100644
--- a/diskimage_builder/elements/grub2/pkg-map
+++ b/diskimage_builder/elements/grub2/pkg-map
@@ -6,6 +6,13 @@
         "signed_shim_efi": "shim",
         "grub_bios": "grub2"
       }
+    },
+    "centos": {
+      "9": {
+        "signed_grub_efi": "efibootmgr grub2-efi-x64",
+        "signed_shim_efi": "shim",
+        "grub_bios": "grub2"
+      }
     }
   },
   "family":{
diff --git a/diskimage_builder/elements/openstack-ci-mirrors/environment.d/11-dib-distribution-mirror.bash b/diskimage_builder/elements/openstack-ci-mirrors/environment.d/11-dib-distribution-mirror.bash
index e5b70b798..1cde1a265 100644
--- a/diskimage_builder/elements/openstack-ci-mirrors/environment.d/11-dib-distribution-mirror.bash
+++ b/diskimage_builder/elements/openstack-ci-mirrors/environment.d/11-dib-distribution-mirror.bash
@@ -33,8 +33,13 @@ elif [[ "${DISTRO_NAME}" == "debian" ]]; then
 elif [[ "${DISTRO_NAME}" == "fedora" ]]; then
     export DIB_DISTRIBUTION_MIRROR=$NODEPOOL_FEDORA_MIRROR
 elif [[ "${DISTRO_NAME}" == "centos" ]]; then
-    export DIB_DISTRIBUTION_MIRROR=$NODEPOOL_CENTOS_MIRROR
-    export DIB_EPEL_MIRROR=$NODEPOOL_EPEL_MIRROR
+    if [[ "${DIB_RELEASE}" == '9-stream' ]]; then
+        # NOTE(ianw) 2021-10-18 : no 9-stream mirrors, yet
+        :
+    else
+        export DIB_DISTRIBUTION_MIRROR=$NODEPOOL_CENTOS_MIRROR
+        export DIB_EPEL_MIRROR=$NODEPOOL_EPEL_MIRROR
+    fi
 elif [[ "${DISTRO_NAME}" == "centos7" ]]; then
     export DIB_DISTRIBUTION_MIRROR=$NODEPOOL_CENTOS_MIRROR
     export DIB_EPEL_MIRROR=$NODEPOOL_EPEL_MIRROR