diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index febfa025304cc8b1d9f68734224f50ab4018a9e2..26a39e6997ac307f85eca032d14864080ce83fa3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,42 +2,22 @@
 
 variables:
   FLATDEB_PROJECT_URL: https://gitlab.apertis.org/infrastructure/apertis-flatdeb.git
-  APERTIS_RELEASE: "v2021dev2"
+  APERTIS_RELEASE: "v2022dev0"
   upload_host: archive@images.apertis.org
   upload_root_main: /srv/images/public/flatpak/mildenhall
   upload_root_test: /srv/images/test/flatpak/mildenhall/$CI_COMMIT_REF_SLUG
 
-image: registry.gitlab.apertis.org/infrastructure/apertis-docker-images/${APERTIS_RELEASE}-package-builder
+image: registry.gitlab.apertis.org/infrastructure/apertis-docker-images/${APERTIS_RELEASE}-flatdeb-builder
 
 stages:
+  - build base
   - build runtime
 
-build-runtime:
+.build:
   variables:
     GIT_STRATEGY: clone
-  stage: build runtime
-  tags:
-    - kvm
   before_script:
-    - apt update
-    - apt install -y binutils debootstrap debos flatpak ostree pigz python3 python3-debian python3-gi python3-yaml systemd-container time flatpak-builder
     - chmod 0400 "$ARCHIVE_SECRET_FILE"
-  script:
-    - git clone --branch apertis/${APERTIS_RELEASE} --depth 1 ${FLATDEB_PROJECT_URL}
-    - apertis-flatdeb/run.py --suite=${APERTIS_RELEASE} --arch=amd64 base
-    - apertis-flatdeb/run.py --suite=${APERTIS_RELEASE} --arch=amd64 runtimes runtimes/org.apertis.mildenhall.yaml
-    - |
-      case "$CI_COMMIT_REF_NAME" in
-        apertis/*)
-          export UPLOAD_ROOT=$upload_root_main
-          ;;
-        *)
-          export UPLOAD_ROOT=$upload_root_test
-          ;;
-      esac
-    - ssh -oStrictHostKeyChecking=no -i "$ARCHIVE_SECRET_FILE" "$upload_host" mkdir -p "$UPLOAD_ROOT"
-    - rsync -e "ssh -oStrictHostKeyChecking=no -i $ARCHIVE_SECRET_FILE" -aP ~/.cache/flatdeb/ostree-repo/. "$upload_host:$UPLOAD_ROOT"
-    - ssh -oStrictHostKeyChecking=no -i "$ARCHIVE_SECRET_FILE" "$upload_host" flatpak build-update-repo "$UPLOAD_ROOT"
   only:
     refs:
       - branches
@@ -46,3 +26,51 @@ build-runtime:
       - $ARCHIVE_SECRET_FILE
   except:
     - tags
+
+.upload:
+  after_script:
+    - |
+      if [[ -f $(pwd)/flatdeb-builddir/ostree-repo/summary ]]; then
+        case "$CI_COMMIT_REF_NAME" in
+          apertis/*)
+            export UPLOAD_ROOT=$upload_root_main
+            ;;
+          *)
+            export UPLOAD_ROOT=$upload_root_test
+            ;;
+        esac
+        ssh -oStrictHostKeyChecking=no -i "$ARCHIVE_SECRET_FILE" "$upload_host" mkdir -p "$UPLOAD_ROOT"
+        rsync -e "ssh -oStrictHostKeyChecking=no -i $ARCHIVE_SECRET_FILE" -aP $(pwd)/flatdeb-builddir/ostree-repo/. "$upload_host:$UPLOAD_ROOT"
+        ssh -oStrictHostKeyChecking=no -i "$ARCHIVE_SECRET_FILE" "$upload_host" flatpak build-update-repo "$UPLOAD_ROOT"
+      fi
+
+build-base:
+  extends:
+    - .build
+  stage: build base
+  script:
+    - /opt/apertis-flatdeb/run.py --build-area=$(pwd)/flatdeb-builddir --ostree-repo=$(pwd)/flatdeb-builddir/ostree-repo --suite=${APERTIS_RELEASE} --arch=amd64 base
+  artifacts:
+    expire_in: 1d
+    paths:
+      - flatdeb-builddir/base-${APERTIS_RELEASE}-amd64.tar.gz
+
+build-platform-runtime:
+  extends:
+    - .build
+    - .upload
+  stage: build runtime
+  script:
+    - /opt/apertis-flatdeb/run.py --build-area=$(pwd)/flatdeb-builddir --ostree-repo=$(pwd)/flatdeb-builddir/ostree-repo --suite=${APERTIS_RELEASE} --arch=amd64 --platform runtimes runtimes/org.apertis.mildenhall.yaml
+  dependencies:
+    - build-base
+
+build-sdk-runtime:
+  extends:
+    - .build
+    - .upload
+  stage: build runtime
+  script:
+    - /opt/apertis-flatdeb/run.py --build-area=$(pwd)/flatdeb-builddir --ostree-repo=$(pwd)/flatdeb-builddir/ostree-repo --suite=${APERTIS_RELEASE} --arch=amd64 --sdk runtimes runtimes/org.apertis.mildenhall.yaml
+  dependencies:
+    - build-base
diff --git a/ci-flatpak-builder.yml b/ci-flatpak-builder.yml
index 6171de0062588a78586d7ef797deb71c27e3cdf6..f9bc807358ba48df37072c6d37fffd1f3f9b5785 100644
--- a/ci-flatpak-builder.yml
+++ b/ci-flatpak-builder.yml
@@ -1,12 +1,12 @@
 # vi:et:sts=2
 
 variables:
-  APERTIS_RELEASE: "v2021dev2"
+  APERTIS_RELEASE: "v2022dev0"
   upload_host: archive@images.apertis.org
   upload_root_main: /srv/images/public/flatpak/mildenhall
   upload_root_test: /srv/images/test/flatpak/mildenhall/$CI_COMMIT_REF_SLUG
 
-image: registry.gitlab.apertis.org/infrastructure/apertis-docker-images/${APERTIS_RELEASE}-package-builder
+image: registry.gitlab.apertis.org/infrastructure/apertis-docker-images/${APERTIS_RELEASE}-flatdeb-builder
 
 stages:
   - build app
@@ -16,11 +16,9 @@ build-app:
     GIT_STRATEGY: clone
   stage: build app
   before_script:
-    - apt update
-    - apt install -y binutils debootstrap debos flatpak ostree pigz python3 python3-debian python3-gi python3-yaml systemd-container time flatpak-builder
     - chmod 0400 "$ARCHIVE_SECRET_FILE"
-    - flatpak --if-not-exists --user remote-add --no-gpg-verify mildenhall https://images.apertis.org/public/flatpak/mildenhall
-    - flatpak install -y org.apertis.mildenhall.Platform org.apertis.mildenhall.Sdk
+    - flatpak --if-not-exists --user remote-add --no-gpg-verify mildenhall https://images.apertis.org/flatpak/mildenhall
+    - flatpak install -y org.apertis.mildenhall.Platform//${APERTIS_RELEASE} org.apertis.mildenhall.Sdk//${APERTIS_RELEASE}
   script:
     - REPODIR=$(mktemp -d repo-XXXXXX)
     - chmod 755 ${REPODIR}
diff --git a/suites/v2021dev2.yaml b/suites/v2022dev0.yaml
similarity index 100%
rename from suites/v2021dev2.yaml
rename to suites/v2022dev0.yaml