diff --git a/.github/workflows/zombienet-reusable-preflight.yml b/.github/workflows/zombienet-reusable-preflight.yml
index f5ac43741ad62695771b39e09c904798adc62600..decbe11a4609c123434ddd3dea2ed40ffdb1b2a6 100644
--- a/.github/workflows/zombienet-reusable-preflight.yml
+++ b/.github/workflows/zombienet-reusable-preflight.yml
@@ -65,6 +65,11 @@ on:
       SOURCE_REF_SLUG:
         value: ${{ jobs.preflight.outputs.SOURCE_REF_SLUG }}
 
+      BUILD_RUN_ID:
+        value: ${{ jobs.wait_build_images.outputs.BUILD_RUN_ID }}
+        description: |
+          Id of the build run, needed to download the artifacts.
+
       # Zombie vars
       PUSHGATEWAY_URL:
         value: ${{ jobs.preflight.outputs.PUSHGATEWAY_URL }}
@@ -216,10 +221,13 @@ jobs:
     needs: [ci-env]
     runs-on: ubuntu-latest
     timeout-minutes: 30
+    outputs:
+      BUILD_RUN_ID: ${{ steps.wait_build.outputs.BUILD_RUN_ID }}
     steps:
       - name: Checkout
         uses: actions/checkout@v4
       - name: Wait until "Build and push images" workflow is done
+        id: wait_build
         env:
           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         run: |
@@ -239,4 +247,15 @@ jobs:
             fi
             sleep 10
           done
-          echo "CI workflow is done."
+
+          #check if the build succeeded
+          RUN_INFO=($(gh run ls -c $SHA -w "Build and push images" --json name,conclusion,databaseId --jq '.[] | select(.name == "Build and push images") | .conclusion, .databaseId'))
+          CONCLUSION=${RUN_INFO[@]:0:1}
+          BUILD_RUN_ID=${RUN_INFO[@]:1:1}
+          if [[ $CONCLUSION == "success" ]]; then
+            echo "CI workflow succeeded. (build run_id: ${BUILD_RUN_ID})"
+            echo "BUILD_RUN_ID=${BUILD_RUN_ID}" >> $GITHUB_OUTPUT
+          else
+            echo "::warning:: CI workflow ('Build and push images') fails with conclusion: $CONCLUSION"
+            exit 1
+          fi;
diff --git a/.github/workflows/zombienet_cumulus.yml b/.github/workflows/zombienet_cumulus.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c2231060c9aa1fe336060ace9768c50bd9d3b0fd
--- /dev/null
+++ b/.github/workflows/zombienet_cumulus.yml
@@ -0,0 +1,315 @@
+name: Zombienet Cumulus
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    types: [opened, synchronize, reopened, ready_for_review]
+  merge_group:
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+  cancel-in-progress: true
+
+env:
+  RUN_IN_CONTAINER: 1
+  FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1
+  LOCAL_DIR: "./cumulus/zombienet/tests"
+  GHA_CLUSTER_SERVER_ADDR: "https://kubernetes.default:443"
+
+# only run if we have changes in [subtrate, cumulus, polkadot] directories or this workflow.
+jobs:
+  preflight:
+    uses: ./.github/workflows/zombienet-reusable-preflight.yml
+
+  zombienet-cumulus-0001-sync_blocks_from_tip_without_connected_collator:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0001-sync_blocks_from_tip_without_connected_collator.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0002-pov_recovery:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0002-pov_recovery.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0003-full_node_catching_up:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0003-full_node_catching_up.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0004-runtime_upgrade:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - uses: actions/download-artifact@v4.1.8
+        with:
+          name: build-test-parachain-${{ needs.preflight.outputs.SOURCE_REF_SLUG }}
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+          run-id: ${{ needs.preflight.outputs.BUILD_RUN_ID }}
+
+      - name: tar
+        run: tar -xvf artifacts.tar
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          ls -ltr *
+          cp ./artifacts/zombienet/wasm_binary_spec_version_incremented.rs.compact.compressed.wasm /tmp/
+          ls /tmp
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0004-runtime_upgrade.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+
+  zombienet-cumulus-0005-migrate_solo_to_para:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0005-migrate_solo_to_para.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0006-rpc_collator_builds_blocks:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0006-rpc_collator_builds_blocks.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0007-full_node_warp_sync:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0007-full_node_warp_sync.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0008-elastic_authoring:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0008-elastic_authoring.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*
+
+  zombienet-cumulus-0009-elastic_pov_recovery:
+    needs: [preflight]
+    if: ${{ needs.preflight.outputs.changes_substrate || needs.preflight.outputs.changes_cumulus || needs.preflight.outputs.changes_polkadot }}
+    runs-on: ${{ needs.preflight.outputs.ZOMBIENET_RUNNER }} # NOTE: should be zombienet-arc-runner (without quotes)
+    timeout-minutes: 60
+    container:
+      image: ${{ needs.preflight.outputs.ZOMBIENET_IMAGE }}
+    env:
+      RELAY_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+      COL_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/test-parachain:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}"
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: script
+        run: |
+          echo "RELAY_IMAGE: $RELAY_IMAGE"
+          echo "COL_IMAGE: $COL_IMAGE"
+          export DEBUG=${{ needs.preflight.outputs.DEBUG }}
+          /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh \
+            --local-dir="$(pwd)/$LOCAL_DIR" \
+            --concurrency=1 \
+            --test="0009-elastic_pov_recovery.zndsl"
+
+      - name: upload logs
+        uses: actions/upload-artifact@v4
+        with:
+          name: zombienet-logs-${{ github.job }}-${{ github.sha }}
+          path: |
+            /tmp/zombie*/logs/*