diff --git a/.gitignore b/.gitignore
index 61f0d7a9cb65b52536dc4e6043b47d20d58170c2..2cfca4773e7b10e86f8537bada338de467866dd2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,4 +19,7 @@ BUILD
 debug
 DEBUG
 
+#gitlab-ci-local
+.gitlab-ci-local/
+
 .nfs*
diff --git a/.gitlab-ci-local-env b/.gitlab-ci-local-env
new file mode 100644
index 0000000000000000000000000000000000000000..3ddfc3f0aca75e93c6ef3282d0959cca09ec0568
--- /dev/null
+++ b/.gitlab-ci-local-env
@@ -0,0 +1,4 @@
+PRIVILEGED=1
+ULIMIT=8000:16000
+VOLUME=certs:/certs/client
+VARIABLE="DOCKER_TLS_CERTDIR=/certs"
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ce3e3a77cf84ca18383e817def4c9d23c554bceb..a04c45338fdabfec98923ef6a539a347eb9bbe46 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,10 @@
-image: eicweb.phy.anl.gov:4567/containers/image_recipes/ubuntu_dind:latest
+image: alpine
 
 variables:
   ## External images
-  DOCKER_IMAGE: docker.io/docker:24.0.5
+  # FIXME:
+  #DOCKER_IMAGE: docker.io/docker:24.0.5
+  DOCKER_IMAGE: eicweb.phy.anl.gov:4567/containers/image_recipes/ubuntu_dind:latest
   SINGULARITY_IMAGE: quay.io/singularity/singularity:v3.11.4
 
   ## Application versions used for the main release 
@@ -30,15 +32,15 @@ variables:
   JOBS: 128
 
   ## is this nightly or not?
-  NIGHTLY:
+  NIGHTLY: ""
   ## Add to tag
   NIGHTLY_TAG: "nightly"
 
   ## Additional options for docker build (e.g. --no-cache)
-  BUILD_OPTIONS:
+  BUILD_OPTIONS: ""
 
   ## Version to be set by external trigger
-  VERSION:
+  VERSION: ""
 
   ## Internal tag used for the CI
   INTERNAL_TAG: "pipeline-${CI_PIPELINE_ID}"
@@ -53,19 +55,6 @@ stages:
   - test
   - finalize
 
-default:
-  before_script:
-    - ./gitlab-ci/docker_login.sh -u ${DH_REGISTRY_USER} -p ${DH_EICWEB_TOKEN}
-                                  -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
-    - ./gitlab-ci/docker_login.sh -u ${GITHUB_REGISTRY_USER} -p ${GITHUB_REGISTRY_TOKEN}
-                                  -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
-                                  ${GH_REGISTRY}
-    - ./gitlab-ci/docker_login.sh --ci -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
-  after_script:
-    - docker logout
-    - docker logout ${CI_REGISTRY}
-    - docker logout ${GH_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
@@ -131,7 +120,7 @@ version:
         VERSION="${CI_COMMIT_REF_NAME}-${CI_PIPELINE_ID}"
         EXPORT_TAG=""
       fi
-      echo "INTERNAL_TAG=$INTERNAL_TAG" >> build.env
+      echo "INTERNAL_TAG=$INTERNAL_TAG" > build.env
       echo "VERSION=$VERSION" >> build.env
       echo "NIGHTLY_TAG=$NIGHTLY_TAG" >> build.env
       echo "EXPORT_TAG=$EXPORT_TAG" >> build.env
@@ -140,22 +129,61 @@ version:
     reports:
       dotenv: build.env
 
-## base job settings for all build jobs
+## base job settings for all docker interactions
+.docker:
+  image: ${DOCKER_IMAGE}
+  before_script:
+    - # Login to registries
+      if [[ -n "${EXPORT_TAG}" ]] ; then
+        if [[ -n "${DH_REGISTRY}" ]] ; then
+          ./gitlab-ci/docker_login.sh -u ${DH_REGISTRY_USER} -p ${DH_EICWEB_TOKEN}
+                                      -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
+                                      ${DH_REGISTRY} ;
+        fi ;
+        if [[ -n "${GH_REGISTRY}" ]] ; then
+          ./gitlab-ci/docker_login.sh -u ${GITHUB_REGISTRY_USER} -p ${GITHUB_REGISTRY_TOKEN}
+                                      -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
+                                      ${GH_REGISTRY} ;
+        fi ;
+        if [[ -n "${CI_REGISTRY}" ]] ; then
+          ./gitlab-ci/docker_login.sh -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
+                                      -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
+                                      ${CI_REGISTRY} ;
+        fi ;
+      fi
+  after_script:
+    - # Logout from registries
+      if [[ -n "${EXPORT_TAG}" ]] ; then
+        if [[ -n "${DH_REGISTRY}" ]] ; then
+          docker logout ${DH_REGISTRY}
+        fi ;
+        if [[ -n "${GH_REGISTRY}" ]] ; then
+          docker logout ${GH_REGISTRY}
+        fi ;
+        if [[ -n "${CI_REGISTRY}" ]] ; then
+          docker logout ${CI_REGISTRY}
+        fi ;
+      fi
+
+## base job settings for all docker build jobs
 .build:
+  extends: .docker 
   rules:
     - when: on_success
   resource_group: ${CI_COMMIT_REF_NAME}-${VERSION}
   tags:
     - docker-new
   before_script:
-    - !reference [default, before_script]
+    - !reference [.docker, before_script]
     - mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc ;
       for arch in aarch64 ; do
-        if ! grep --quiet enabled /proc/sys/fs/binfmt_misc/qemu-$arch ; then
+        if ! grep -q enabled /proc/sys/fs/binfmt_misc/qemu-$arch ; then
           docker run --rm --privileged multiarch/qemu-user-static --persistent yes ;
         fi ;
       done
-    - docker buildx create --name builder --driver docker-container --bootstrap --use
+    - docker context create context
+    - docker context use context
+    - docker buildx create --name builder --driver docker-container --bootstrap --use context
 
 ## rules for nightly jobs
 .nightly:
@@ -425,11 +453,9 @@ jug_xl:nightly:
       expire_in: 1 days
       paths:
         - build/${BUILD_IMAGE}.sif
-  before_script: ""
   script:
     - mkdir build
     - singularity pull build/${BUILD_IMAGE}.sif docker://${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG}-${BUILD_TYPE}
-  after_script: ""
 
 jug_xl:singularity:default:
   extends: .singularity
@@ -513,6 +539,7 @@ benchmarks:physics:nightly:
   allow_failure: false
 
 clean:
+  extends: .docker
   stage: finalize
   dependencies:
     - version
@@ -538,6 +565,7 @@ clean:
     - ./gitlab-ci/cleanup_registry.sh -i dind -r 93 ${INTERNAL_TAG}
 
 clean_unstable_mr:
+  extends: .docker
   stage: finalize
   dependencies:
     - clean