diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8585b55275fb1bf120c5844237b769dece9a2958..6a42611b4d2e34a3520d516a2552284c19fafdac 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -35,8 +35,9 @@
     DOCKER_DRIVER: overlay2
     DOCKER_TLS_CERTDIR: "/certs"
     BUILDX_NO_DEFAULT_ATTESTATIONS: "true"
-    GHC_VERSION_BUILD: "9.6.2"
-    CABAL_VERSION_BUILD: "3.10.1.0"
+    GHC_VERSION_BUILD: "9.4.6"
+    CABAL_VERSION_BUILD: "3.8.1.0"
+    STACK_VERSION: "2.11.1"
   before_script:
     - *before-script-build
 
@@ -50,6 +51,7 @@ build:latest-linux-amd64:
       docker build
       --build-arg GHC_VERSION_BUILD
       --build-arg CABAL_VERSION_BUILD
+      --build-arg STACK_VERSION
       --target tester
       -t $CI_APP_REPO:$CI_APP_TAG-linux-amd64
       -t $CI_APP_REPO:$VERSION_MAJ_MIN_PAT-linux-amd64
@@ -58,6 +60,7 @@ build:latest-linux-amd64:
       docker build
       --build-arg GHC_VERSION_BUILD
       --build-arg CABAL_VERSION_BUILD
+      --build-arg STACK_VERSION
       -t $CI_APP_REPO:$CI_APP_TAG-linux-amd64
       -t $CI_APP_REPO:$VERSION_MAJ_MIN_PAT-linux-amd64
       -f latest.Dockerfile .
@@ -79,6 +82,7 @@ build:latest-linux-arm64v8:
       docker build
       --build-arg GHC_VERSION_BUILD
       --build-arg CABAL_VERSION_BUILD
+      --build-arg STACK_VERSION
       --target tester
       -t $CI_APP_REPO:$CI_APP_TAG-linux-arm64v8
       -t $CI_APP_REPO:$VERSION_MAJ_MIN_PAT-linux-arm64v8
@@ -87,6 +91,7 @@ build:latest-linux-arm64v8:
       docker build
       --build-arg GHC_VERSION_BUILD
       --build-arg CABAL_VERSION_BUILD
+      --build-arg STACK_VERSION
       -t $CI_APP_REPO:$CI_APP_TAG-linux-arm64v8
       -t $CI_APP_REPO:$VERSION_MAJ_MIN_PAT-linux-arm64v8
       -f latest.Dockerfile .
@@ -196,6 +201,13 @@ build-manifest:version-linux-multiarch:
           $CI_APP_REPO:$CI_APP_TAG-linux-arm64v8
       fi
       docker manifest push $CI_APP_REPO:$CI_APP_TAG
+    - |
+      docker manifest create $CI_APP_REPO:$VERSION_MAJ_MIN $CI_MANIFEST_LIST
+      if echo $OS_ARCH | grep "linux-arm64v8" >/dev/null ; then
+        docker manifest annotate --variant v8 $CI_APP_REPO:$VERSION_MAJ_MIN \
+          $CI_APP_REPO:$CI_APP_TAG-linux-arm64v8
+      fi
+      docker manifest push $CI_APP_REPO:$VERSION_MAJ_MIN
   rules:
     - if: $CI_COMMIT_BRANCH == "freeze-version"
       changes:
diff --git a/prior/9.2.8.Dockerfile b/prior/9.2.8.Dockerfile
index 9d2a55a303deb874079ad04b728e3d5bbc125e96..f31f44b469045b5617f4e1ad6d3c66807be003d8 100644
--- a/prior/9.2.8.Dockerfile
+++ b/prior/9.2.8.Dockerfile
@@ -1,5 +1,6 @@
 ARG GHC_VERSION_BUILD=9.2.8
 ARG CABAL_VERSION_BUILD=3.6.2.0
+ARG STACK_VERSION=2.11.1
 
 FROM glcr.b-data.ch/ghc/ghc-musl:9.0.2 as bootstrap
 
@@ -29,13 +30,13 @@ RUN apk upgrade --no-cache \
     zlib-dev
 
 RUN cd /tmp \
-  && curl -sSLO https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-src.tar.xz \
-  && curl -sSLO https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-src.tar.xz.sig \
+  && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz \
+  && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz.sig \
   && gpg --keyserver hkps://keyserver.ubuntu.com:443 \
     --receive-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 \
-  && gpg --verify ghc-$GHC_VERSION-src.tar.xz.sig ghc-$GHC_VERSION-src.tar.xz \
-  && tar xf ghc-$GHC_VERSION-src.tar.xz \
-  && cd ghc-$GHC_VERSION \
+  && gpg --verify "ghc-$GHC_VERSION-src.tar.xz.sig" "ghc-$GHC_VERSION-src.tar.xz" \
+  && tar -xJf "ghc-$GHC_VERSION-src.tar.xz" \
+  && cd "ghc-$GHC_VERSION" \
   # Use the LLVM backend
   && cp mk/build.mk.sample mk/build.mk \
   && echo 'BuildFlavour=perf-llvm' >> mk/build.mk \
@@ -54,11 +55,11 @@ RUN cd /tmp \
   && sed -i -e 's/unknown-linux-gnueabi/alpine-linux/g' llvm-targets \
   && sed -i -e 's/unknown-linux-gnu/alpine-linux/g' llvm-targets \
   # See https://unix.stackexchange.com/questions/519092/what-is-the-logic-of-using-nproc-1-in-make-command
-  && make -j$((`nproc`+1)) \
+  && make -j"$(($(nproc)+1))" \
   && make binary-dist \
   && cabal update \
   # See https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history
-  && cabal install --allow-newer --constraint 'Cabal-syntax<3.7' cabal-install-$CABAL_VERSION
+  && cabal install --allow-newer --constraint 'Cabal-syntax<3.7' "cabal-install-$CABAL_VERSION"
 
 FROM alpine:3.16 as builder
 
@@ -106,12 +107,12 @@ RUN apk upgrade --no-cache \
     zlib-dev \
     zlib-static
 
-COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
+COPY --from=bootstrap /tmp/ghc-"$GHC_VERSION"/ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz /tmp/
 COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
 
 RUN cd /tmp \
-  && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
-  && cd ghc-$GHC_VERSION \
+  && tar -xJf ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz \
+  && cd "ghc-$GHC_VERSION" \
   && ./configure --disable-ld-override --prefix=/usr \
   && make install \
   && cd / \
@@ -119,6 +120,8 @@ RUN cd /tmp \
 
 FROM builder as tester
 
+WORKDIR /usr/local/src
+
 COPY Main.hs Main.hs
 
 RUN ghc -static -optl-pthread -optl-static Main.hs \
@@ -131,6 +134,14 @@ RUN ghc -static -optl-pthread -optl-static Main.hs \
   && cabal init -n --is-executable -p tester -l MIT \
   && cabal run
 
+FROM glcr.b-data.ch/commercialhaskell/ssi:${STACK_VERSION} as ssi
+
 FROM builder as final
 
+ARG STACK_VERSION
+
+ENV STACK_VERSION=${STACK_VERSION}
+
+COPY --from=ssi /usr/local/bin/stack /usr/bin/stack
+
 CMD ["ghci"]
diff --git a/prior/9.4.1.Dockerfile b/prior/9.4.1.Dockerfile
index df8b379e95797ceadfddf3e2549441aa8531dc17..fd13368d72412312f4adaaa4efa620ed3ee1e297 100644
--- a/prior/9.4.1.Dockerfile
+++ b/prior/9.4.1.Dockerfile
@@ -98,7 +98,7 @@ RUN apk upgrade --no-cache \
     zlib-static
 
 COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/_build/bindist/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
   && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
diff --git a/prior/9.4.2.Dockerfile b/prior/9.4.2.Dockerfile
index 2dbfd14d17996f9d2fdf8cf1119e87669081fde9..f45b6c6ed91bb4e2c34ef2230ae93e5fe8e17b37 100644
--- a/prior/9.4.2.Dockerfile
+++ b/prior/9.4.2.Dockerfile
@@ -99,7 +99,7 @@ RUN apk upgrade --no-cache \
     zlib-static
 
 COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/_build/bindist/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
   && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
diff --git a/prior/9.4.3.Dockerfile b/prior/9.4.3.Dockerfile
index fc79a1ccf1de051db208d7d4cd35510a2ad5bb34..96399aefbe5fbffe4fdd614097706469502385ee 100644
--- a/prior/9.4.3.Dockerfile
+++ b/prior/9.4.3.Dockerfile
@@ -99,7 +99,7 @@ RUN apk upgrade --no-cache \
     zlib-static
 
 COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/_build/bindist/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
   && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
diff --git a/prior/9.4.4.Dockerfile b/prior/9.4.4.Dockerfile
index c708f37c4705b78d3063537c371ce51c1fd183f7..396987165509a73dc28e52f0b29bffe8cb21c89f 100644
--- a/prior/9.4.4.Dockerfile
+++ b/prior/9.4.4.Dockerfile
@@ -99,7 +99,7 @@ RUN apk upgrade --no-cache \
     zlib-static
 
 COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/_build/bindist/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
   && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
diff --git a/prior/9.4.5.Dockerfile b/prior/9.4.5.Dockerfile
index 98aa6ab85b4fa93169f95bda7f253a8be738e2d0..d9bcaeec0148b8e06f986585e7722ce8f5c6125e 100644
--- a/prior/9.4.5.Dockerfile
+++ b/prior/9.4.5.Dockerfile
@@ -99,7 +99,7 @@ RUN apk upgrade --no-cache \
     zlib-static
 
 COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/_build/bindist/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
   && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
diff --git a/prior/9.4.6.Dockerfile b/prior/9.4.6.Dockerfile
index b1826e5a3ff447a0c5e4c4505d14d57746566f90..db5bcd7f04a501037a35885c5429eaee606b149b 100644
--- a/prior/9.4.6.Dockerfile
+++ b/prior/9.4.6.Dockerfile
@@ -1,5 +1,6 @@
 ARG GHC_VERSION_BUILD=9.4.6
 ARG CABAL_VERSION_BUILD=3.8.1.0
+ARG STACK_VERSION=2.11.1
 
 FROM glcr.b-data.ch/ghc/ghc-musl:9.2.8 as bootstrap
 
@@ -99,7 +100,7 @@ RUN apk upgrade --no-cache \
     zlib-static
 
 COPY --from=bootstrap /tmp/ghc-"$GHC_VERSION"/_build/bindist/ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
   && tar -xJf ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz \
@@ -125,6 +126,14 @@ RUN ghc -static -optl-pthread -optl-static Main.hs \
   && cabal init -n --is-executable -p tester -l MIT \
   && cabal run
 
+FROM glcr.b-data.ch/commercialhaskell/ssi:${STACK_VERSION} as ssi
+
 FROM builder as final
 
+ARG STACK_VERSION
+
+ENV STACK_VERSION=${STACK_VERSION}
+
+COPY --from=ssi /usr/local/bin/stack /usr/local/bin/stack
+
 CMD ["ghci"]
diff --git a/prior/9.6.1.Dockerfile b/prior/9.6.1.Dockerfile
index a54b4cfbbc40b027a49f75299a0cc19247bec627..45f17ed4b26184b12c81c443841f9940ed3174ab 100644
--- a/prior/9.6.1.Dockerfile
+++ b/prior/9.6.1.Dockerfile
@@ -29,13 +29,13 @@ RUN apk upgrade --no-cache \
     zlib-dev
 
 RUN cd /tmp \
-  && curl -sSLO https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-src.tar.xz \
-  && curl -sSLO https://downloads.haskell.org/~ghc/$GHC_VERSION/ghc-$GHC_VERSION-src.tar.xz.sig \
+  && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz \
+  && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz.sig \
   && gpg --keyserver hkps://keyserver.ubuntu.com:443 \
     --receive-keys FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD \
-  && gpg --verify ghc-$GHC_VERSION-src.tar.xz.sig ghc-$GHC_VERSION-src.tar.xz \
-  && tar xf ghc-$GHC_VERSION-src.tar.xz \
-  && cd ghc-$GHC_VERSION \
+  && gpg --verify "ghc-$GHC_VERSION-src.tar.xz.sig" "ghc-$GHC_VERSION-src.tar.xz" \
+  && tar -xJf "ghc-$GHC_VERSION-src.tar.xz" \
+  && cd "ghc-$GHC_VERSION" \
   && ./boot.source \
   && ./configure --disable-ld-override LD=ld.gold \
   # Use the LLVM backend
@@ -46,11 +46,11 @@ RUN cd /tmp \
   && sed -i -e 's/unknown-linux-gnu/alpine-linux/g' llvm-targets \
   && cabal update \
   # See https://unix.stackexchange.com/questions/519092/what-is-the-logic-of-using-nproc-1-in-make-command
-  && hadrian/build binary-dist -j$((`nproc`+1)) \
+  && hadrian/build binary-dist -j"$(($(nproc)+1))" \
     --flavour=perf+llvm+split_sections \
     --docs=none \
   # See https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history
-  && cabal install --allow-newer --constraint 'Cabal-syntax<3.11' cabal-install-$CABAL_VERSION
+  && cabal install --allow-newer --constraint 'Cabal-syntax<3.11' "cabal-install-$CABAL_VERSION"
 
 FROM alpine:3.18 as builder
 
@@ -81,7 +81,7 @@ RUN apk upgrade --no-cache \
     libcurl \
     libffi \
     libffi-dev \
-    llvm16 \
+    llvm14 \
     ncurses-dev \
     ncurses-static \
     openssl-dev \
@@ -98,12 +98,12 @@ RUN apk upgrade --no-cache \
     zlib-dev \
     zlib-static
 
-COPY --from=bootstrap /tmp/ghc-$GHC_VERSION/_build/bindist/ghc-$GHC_VERSION-*-alpine-linux.tar.xz /tmp/
-COPY --from=bootstrap /root/.cabal/bin/cabal /usr/bin/cabal
+COPY --from=bootstrap /tmp/ghc-"$GHC_VERSION"/_build/bindist/ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz /tmp/
+COPY --from=bootstrap /root/.cabal/bin/cabal /usr/local/bin/cabal
 
 RUN cd /tmp \
-  && tar -xJf ghc-$GHC_VERSION-*-alpine-linux.tar.xz \
-  && cd ghc-$GHC_VERSION-*-alpine-linux \
+  && tar -xJf ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz \
+  && cd ghc-"$GHC_VERSION"-*-alpine-linux \
   && ./configure --disable-ld-override \
   && make install \
   && cd / \
@@ -111,6 +111,8 @@ RUN cd /tmp \
 
 FROM builder as tester
 
+WORKDIR /usr/local/src
+
 COPY Main.hs Main.hs
 
 RUN ghc -static -optl-pthread -optl-static Main.hs \