diff --git a/meta/classes-recipe/imagetypes_wic.bbclass b/meta/classes-recipe/imagetypes_wic.bbclass
index c1647081..6cf7bd8e 100644
--- a/meta/classes-recipe/imagetypes_wic.bbclass
+++ b/meta/classes-recipe/imagetypes_wic.bbclass
@@ -143,7 +143,7 @@ check_for_wic_warnings() {
     fi
 }
 
-do_image_wic[depends] += "${@bb.utils.contains('ROOTFS_FEATURES', 'generate-sbom', 'sbom-chroot:do_sbomchroot_deploy', '', d)}"
+do_image_wic[depends] += "${@bb.utils.contains('ROOTFS_FEATURES', 'generate-sbom', 'sbom-chroot:do_build', '', d)}"
 do_image_wic[file-checksums] += "${WKS_FILE_CHECKSUM}"
 IMAGE_CMD:wic() {
     generate_wic_image
diff --git a/meta/classes-recipe/rootfs-deploy.bbclass b/meta/classes-recipe/rootfs-deploy.bbclass
new file mode 100644
index 00000000..35b1a5cc
--- /dev/null
+++ b/meta/classes-recipe/rootfs-deploy.bbclass
@@ -0,0 +1,30 @@
+# This software is a part of Isar.
+# Copyright (c) Siemens AG, 2026
+#
+# Inherit this class to deploy the rootfs as a compressed tarball
+# and remove the (local) extracted rootfs after deployment.
+
+ROOTFS_TAR_FLAGS ?= ""
+ROOTFS_ZSTD_CLEVEL ?= "8"
+ROOTFS_DEPLOY_DIR ?= "${DEPLOY_DIR}/chroot-${PN}"
+ROOTFS_DEPLOY_FILE ?= "${ROOTFS_DEPLOY_DIR}/${HOST_DISTRO}-${HOST_ARCH}_${DISTRO}-${DISTRO_ARCH}.tar.zst"
+
+do_rootfs_deploy[dirs] = "${ROOTFS_DEPLOY_DIR}"
+do_rootfs_deploy[network] = "${TASK_USE_SUDO}"
+do_rootfs_deploy() {
+    # deploy with empty var to make it smaller
+    lopts="--one-file-system"
+    ZSTD="zstd -${ROOTFS_ZSTD_CLEVEL} -T${ZSTD_THREADS}"
+
+    run_privileged \
+        tar -C ${ROOTFSDIR} -cpS $lopts ${ROOTFS_TAR_FLAGS} . \
+            | $ZSTD > ${ROOTFS_DEPLOY_FILE}
+    # cleanup extracted rootfs
+    run_privileged rm -rf ${ROOTFSDIR}
+}
+addtask do_rootfs_deploy before do_build after do_rootfs
+
+CLEANFUNCS += "rootfs_deploy_clean"
+rootfs_deploy_clean() {
+    rm -rf ${ROOTFS_DEPLOY_FILE}
+}
diff --git a/meta/classes/sbom.bbclass b/meta/classes/sbom.bbclass
index dad8e8f6..f7adde36 100644
--- a/meta/classes/sbom.bbclass
+++ b/meta/classes/sbom.bbclass
@@ -79,7 +79,7 @@ do_generate_sbom[cleandirs] += "${SBOM_LOCAL_DEPLOYDIR}"
 do_generate_sbom[sstate-inputdirs] = "${SBOM_LOCAL_DEPLOYDIR}"
 do_generate_sbom[sstate-outputdirs] = "${DEPLOY_DIR_SBOM}"
 do_generate_sbom[network] = "${TASK_USE_SUDO}"
-do_generate_sbom[depends] += "sbom-chroot:do_sbomchroot_deploy"
+do_generate_sbom[depends] += "sbom-chroot:do_build"
 python do_generate_sbom() {
     sbom_doc_uuid(d)
     try:
diff --git a/meta/recipes-devtools/sbom-chroot/sbom-chroot.bb b/meta/recipes-devtools/sbom-chroot/sbom-chroot.bb
index f347327b..4727efe4 100644
--- a/meta/recipes-devtools/sbom-chroot/sbom-chroot.bb
+++ b/meta/recipes-devtools/sbom-chroot/sbom-chroot.bb
@@ -26,17 +26,8 @@ SBOM_IMAGE_INSTALL = "python3-debsbom python3-spdx-tools python3-cyclonedx-lib"
 ROOTFSDIR = "${WORKDIR}/rootfs"
 ROOTFS_PACKAGES = "${SBOM_IMAGE_INSTALL}"
 
-do_sbomchroot_deploy[dirs] = "${SBOM_DIR}"
-do_sbomchroot_deploy[network] = "${TASK_USE_SUDO}"
-do_sbomchroot_deploy() {
-    # deploy with empty var to make it smaller
-    lopts="--one-file-system --exclude=var/*"
-    ZSTD="zstd -${SSTATE_ZSTD_CLEVEL} -T${ZSTD_THREADS}"
-
-    run_privileged \
-        tar -C ${ROOTFSDIR} -cpS $lopts ${ROOTFS_TAR_ATTR_FLAGS} . \
-            | $ZSTD > ${SBOM_CHROOT}
-    # cleanup extracted rootfs
-    run_privileged rm -rf ${ROOTFSDIR}
-}
-addtask do_sbomchroot_deploy before do_build after do_rootfs
+inherit rootfs-deploy
+
+ROOTFS_DEPLOY_DIR = "${SBOM_DIR}"
+ROOTFS_DEPLOY_FILE = "${SBOM_CHROOT}"
+ROOTFS_TAR_FLAGS += "--exclude=var/*"
diff --git a/meta/recipes-devtools/sbuild-chroot/sbuild-chroot.inc b/meta/recipes-devtools/sbuild-chroot/sbuild-chroot.inc
index 80c43d20..ae9e0e76 100644
--- a/meta/recipes-devtools/sbuild-chroot/sbuild-chroot.inc
+++ b/meta/recipes-devtools/sbuild-chroot/sbuild-chroot.inc
@@ -70,28 +70,12 @@ ROOTFS_POSTPROCESS_COMMAND:remove = "rootfs_cleanup_base_apt"
 
 DEPLOY_SCHROOT = "${@d.getVar('SCHROOT_' + d.getVar('SBUILD_VARIANT').upper() + '_DIR')}${SBUILD_SCHROOT_SUFFIX}"
 
-sbuildchroot_deploy_tree() {
-    ln -Tfsr "${ROOTFSDIR}" "${DEPLOY_SCHROOT}"
-}
-sbuildchroot_deploy_tar() {
-    lopts="--one-file-system --exclude=var/cache/apt/archives --exclude=isar-apt"
-    # we cannot use pzstd, as this results in a different magic
-    # (zstd skippable frame) which is not detected by sbuild
-    # https://salsa.debian.org/debian/sbuild/-/blob/d975d388a98627a0d7d112791e441c27a6d529df/lib/Sbuild/ChrootUnshare.pm#L608
-    ZSTD="zstd -${SSTATE_ZSTD_CLEVEL} -T${ZSTD_THREADS}"
-    run_privileged \
-        tar -C ${ROOTFSDIR} -cpS $lopts ${ROOTFS_TAR_ATTR_FLAGS} . \
-            | $ZSTD > ${DEPLOY_SCHROOT}.tar.zst
-    # cleanup extracted rootfs
-    run_privileged rm -rf ${ROOTFSDIR}
-}
+inherit rootfs-deploy
+
+ROOTFS_DEPLOY_DIR = "${DEPLOY_DIR}/schroot-${SBUILD_VARIANT}"
+ROOTFS_DEPLOY_FILE = "${DEPLOY_SCHROOT}"
+ROOTFS_DEPLOY_FILE:unshare = "${DEPLOY_SCHROOT}.tar.zst"
 
-do_sbuildchroot_deploy[network] = "${TASK_USE_SUDO}"
-do_sbuildchroot_deploy[dirs] += "${DEPLOY_DIR}/schroot-${SBUILD_VARIANT}"
-python do_sbuildchroot_deploy() {
-    if d.getVar('ISAR_CHROOT_MODE') == 'unshare':
-        bb.build.exec_func('sbuildchroot_deploy_tar', d)
-    else:
-        bb.build.exec_func('sbuildchroot_deploy_tree', d)
+do_rootfs_deploy:schroot() {
+    ln -Tfsr "${ROOTFSDIR}" "${ROOTFS_DEPLOY_FILE}"
 }
-addtask sbuildchroot_deploy before do_build after do_rootfs
