diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 808d0833dcd9ec428168b4801fef3fee58198460..80d17d0ce41dad7f863537a6162846560a74ce74 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -39,7 +39,6 @@ stages:
   - config
   - build:base      ## base OS image
   - build:dev       ## naked dev container image
-  - build:release   ## dressed release container image
   - deploy          ## build/deploy singularity images
   - test            
   - finalize
@@ -55,39 +54,10 @@ default:
     - docker logout
     - docker logout ${CI_REGISTRY}
 
-## only run CI for in the following cases:
-## master, stable branch, release tag, MR event and nightly builds
-## nightly builds are now part of the regular master build in order to keep
-## all artifacts available at all times.
 workflow:
   rules:
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-    - if: '$CI_COMMIT_BRANCH == "master"'
-    - if: '$CI_COMMIT_BRANCH =~ /^v[0-9]+\.[0-9]+-stable/'          ## main stable branch: vX.Y-stable
-    - if: '$CI_COMMIT_BRANCH =~ /^v[0-9]+\.[0-9]+-[a-z]+-stable/'   ## special stable branch: vX.Y-acadia-stable (etc)
-    - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+/'            ## commit tags start with vX.Y.Z with optional suffix
-
-## plan:
-##  Workflows:
-##  - master      --> config + all build stages + singularity
-#                            + nightly build:release + nightly singularity
-##  - v3.0-stable --> config + all build stages + singularity
-##  - v3.0.0      --> config + all build stages + singularity
-##  - MR          --> config + all build stages
-##
-##  Container images tags
-##  - master      --> testing
-##  - <nightly>   --> nightly (run as part of master)
-##  - v3.0-stable --> 3.0-stable
-##  - v3.0.0      --> 3.0-stable, 3.0.0
-##  - acadia     
-##  - MR          --> 3.0-unstable (on all registries)
-##                --> unstable-mr-XXX (on eicweb only, untag at end of pipeline)
-##  - all other   --> do nothing
-##
-## caching strategy for dispatch to multiple nodes and to avoid
-##  --> try this strategy: https://medium.com/titansoft-engineering/docker-build-cache-sharing-on-multi-hosts-with-buildkit-and-buildx-eb8f7005918e
-##  (first try with buildx didn't pan out, let's try again later)
+    - if: '$CI_COMMIT_BRANCH == "acts-material-scan"'
 
 version:
   stage: config
@@ -97,42 +67,26 @@ version:
       VERSION_FULL=${VERSION}
       VERSION_SHORT=${VERSION%.*}
       TESTING="testing"
-      NIGHTLY="nightly"
     ## determine appropriate major docker tag for this scenario
     - |
       ## internal tag used for the CI. Also temporarily tagged
       ## on eicweb to communicate between jobs (removed in cleanup job)
-      INTERNAL_TAG="testing-$VERSION"
+      INTERNAL_TAG="${TESTING}-$VERSION"
       ## main export tag, optional secondary export tag,
       EXPORT_TAG=${TESTING}
       EXPORT_TAG2=
       ## nightly tag, only used in master
-      NIGHTLY_TAG=${NIGHTLY}
       if [ "x${CI_PIPELINE_SOURCE}" = "xmerge_request_event" ]; then
         INTERNAL_TAG="unstable-mr-${CI_MERGE_REQUEST_ID}"
-        NIGHTLY_TAG="${INTERNAL_TAG}-nightly"
         EXPORT_TAG=${VERSION_SHORT}-unstable
         EXPORT_TAG2=
       elif [[ "$CI_COMMIT_TAG" =~ ^v${VERSION} ]]; then
         VERSION_FULL="${CI_COMMIT_TAG:1}"
         INTERNAL_TAG="stable-tag-${VERSION_FULL}"
-        NIGHTLY_TAG=
-        EXPORT_TAG=${VERSION_FULL}
-        EXPORT_TAG2=
-      elif [ "$CI_COMMIT_BRANCH" = "v${VERSION_SHORT}-stable" ]; then
-        INTERNAL_TAG="stable-br-${VERSION}"
-        NIGHTLY_TAG=
-        EXPORT_TAG=${VERSION_SHORT}-stable
-        EXPORT_TAG2=
-      elif [[ "$CI_COMMIT_BRANCH" =~ ^v${VERSION_SHORT}-[a-z]+-stable ]]; then
-        VERSION_FULL="${CI_COMMIT_BRANCH:1}"
-        INTERNAL_TAG="stable-br-${VERSION_FULL}"
-        NIGHTLY_TAG=
         EXPORT_TAG=${VERSION_FULL}
         EXPORT_TAG2=
       fi
       echo "INTERNAL_TAG=$INTERNAL_TAG" >> build.env
-      echo "NIGHTLY_TAG=$NIGHTLY_TAG" >> build.env
       echo "EXPORT_TAG=$EXPORT_TAG" >> build.env
       echo "EXPORT_TAG2=$EXPORT_TAG2" >> build.env
       cat build.env
@@ -186,7 +140,7 @@ jug_dev:default:
     - version
     - debian_base:default
   variables:
-    BUILD_IMAGE: "jug_dev"
+    BUILD_IMAGE: "acts_material_scan"
   script:
     ## calculate a hash based on the spack.yaml file and the spack directory
     ## and use this spack as a docker variable to force a rebuild when there
@@ -227,60 +181,6 @@ jug_dev:default:
     ## standard exports
     - !reference [.build, script]
 
-jug_xl:default:
-  extends: .build
-  stage: build:release
-  interruptible: true
-  needs:
-    - version
-    - jug_dev:default
-  variables:
-    BUILD_IMAGE: "jug_xl"
-  script:
-    - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} 
-                   -f containers/jug/xl.Dockerfile
-                   --build-arg INTERNAL_TAG=${INTERNAL_TAG}
-                   --build-arg JUGGLER_VERSION=${JUGGLER_VERSION}
-                   --build-arg NPDET_VERSION=${NPDET_VERSION}
-                   --build-arg EICD_VERSION=${EICD_VERSION}
-                   --build-arg AFTERBURNER_VERSION=${AFTERBURNER_VERSION}
-                   --build-arg DETECTOR_VERSION=${DETECTOR_VERSION}
-                   --build-arg IP6_VERSION=${IP6_VERSION}
-                   --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD)
-                   containers/jug
-    - !reference [.build, script]
-
-jug_xl:nightly:
-  extends: .build
-  stage: build:release
-  interruptible: true
-  resource_group: build
-  rules:
-    - if: '$CI_COMMIT_BRANCH == "master"'
-      when: on_success
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: on_success
-    - when: never
-  needs:
-    - version
-    - jug_dev:default
-  variables:
-    BUILD_IMAGE: "jug_xl"
-  script:
-    - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${NIGHTLY_TAG} 
-                   -f containers/jug/xl.Dockerfile
-                   --build-arg INTERNAL_TAG=${INTERNAL_TAG}
-                   --build-arg JUG_VERSION=nightly-$(date +%Y-%m-%d_%H-%M-%S)-$(git rev-parse HEAD)
-                   containers/jug
-    - |
-      PUSH_FLAG=""
-      if [ "$CI_PIPELINE_SOURCE" == "merge_request_event" ]; then
-        PUSH_FLAG="--eicweb"
-      fi
-    - ./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG} 
-                                 -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
-                                 ${NIGHTLY_TAG} ${PUSH_FLAG}
-
 .singularity:
   stage: deploy
   interruptible: true
@@ -296,79 +196,13 @@ jug_xl:nightly:
     - mkdir build
     - singularity pull build/${BUILD_IMAGE}.sif docker://${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG}
 
-jug_dev:singularity:default:
+acts_material_scan:singularity:default:
   extends: .singularity
   needs: 
     - version
     - jug_dev:default
   variables:
-    BUILD_IMAGE: "jug_dev"
-
-jug_xl:singularity:default:
-  extends: .singularity
-  needs: 
-    - version
-    - jug_xl:default
-  variables:
-    BUILD_IMAGE: "jug_xl"
-
-jug_xl:singularity:nightly:
-  stage: deploy
-  interruptible: true
-  needs: 
-    - version
-    - jug_xl:nightly
-  rules:
-    - if: '$CI_COMMIT_BRANCH == "master"'
-      when: on_success
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: on_success
-    - when: never
-  artifacts:
-      expire_in: 1 days
-      paths:
-        - build/${BUILD_IMAGE}.sif
-  variables:
-    BUILD_IMAGE: "jug_xl"
-  script:
-    - mkdir build
-    - singularity pull build/${BUILD_IMAGE}.sif docker://${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${NIGHTLY_TAG}
-
-## trigger juggler rebuild on nightly schedule to ensure both images remain in sync
-juggler:master:
-  stage: deploy
-  rules:
-    - if: '$NIGHTLY != "0" && $CI_COMMIT_BRANCH == "master"'
-      when: on_success
-    - when: never
-  needs:
-    - version
-    - jug_xl:nightly
-  variables:
-    TRIGGERED_BY_NIGHTLY: 1
-    JUGGLER_VERSION: master
-    EICD_VERSION: master
-    NPDET_VERSION: master
-    DETECTOR_VERSION: master
-    IP6_VERSION: master
-  trigger:
-    project: EIC/juggler
-  allow_failure: true
-
-.test:
-  stage: test
-  needs:
-    - version
-    - jug_xl:singularity:nightly
-  rules:
-    - if: '$CI_COMMIT_BRANCH == "master"'
-      when: on_success
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: on_success
-    - when: never
-
-include:
-  - local: 'tests/tutorial/config.yml'
+    BUILD_IMAGE: "acts_material_scan"
 
 cleanup:
   stage: finalize
@@ -378,9 +212,4 @@ cleanup:
     ## remove the pipeline specific export from eicweb if needed
     - echo "Cleaning up pipeline specific docker tags if needed"
     - ./gitlab-ci/cleanup_registry.sh -i debian_base -r 66 ${INTERNAL_TAG}
-    - ./gitlab-ci/cleanup_registry.sh -i jug_dev -r 68 ${INTERNAL_TAG}
-    - ./gitlab-ci/cleanup_registry.sh -i jug_xl -r 69 ${INTERNAL_TAG}
-    - |
-      if [ "$CI_PIPELINE_SOURCE" == "merge_request_event" ]; then
-        ./gitlab-ci/cleanup_registry.sh -i jug_xl -r 69 ${NIGHTLY_TAG}
-      fi
+    - ./gitlab-ci/cleanup_registry.sh -i acts_material_scan -r 70 ${INTERNAL_TAG}
diff --git a/spack.yaml b/spack.yaml
index 104f112a219a782e14d50c8417ad55a88e1960fb..6c0cf6623dc8b7db041a10b52d5e55368ad4eb4c 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -23,7 +23,7 @@ spack:
     - stow@2.3.1
     - cairo@1.16.0 +fc+ft+X+pdf+gobject
     - podio@0.13.1
-    - geant4@10.7.1 cxxstd=17 +opengl +vecgeom +x11 +qt +threads ^qt +opengl
+    - geant4@10.7.1 cxxstd=17 +opengl +vecgeom +x11 +qt -threads ^qt +opengl
     - dd4hep@1.17p1 +geant4 +assimp +hepmc3 +ipo +lcio
     - acts@8.03.0p1 +dd4hep +digitization +identification +json +tgeo +ipo +examples +fatras +geant4
     - genfit@2.00.00