diff --git a/CUDA_VERSION_MATRIX.md b/CUDA_VERSION_MATRIX.md
index ef52e17d9092be1c4d219bb2afa50cb89b20593c..b74f03a772ba33bd1242f3de2678591e964b771e 100644
--- a/CUDA_VERSION_MATRIX.md
+++ b/CUDA_VERSION_MATRIX.md
@@ -41,7 +41,6 @@ given.
 | CUDA   | Linux driver version | Windows driver version[^6] |
 |:-------|:---------------------|:---------------------------|
 | 12.8.0 | ≥ 570.26             | ≥ 570.65                   |
-| 12.6.3 | ≥ 560.35.05          | ≥ 561.17                   |
 | 12.6.2 | ≥ 560.35.03          | ≥ 560.94                   |
 | 12.5.0 | ≥ 555.42.02          | ≥ 555.85                   |
 | 11.8.0 | ≥ 520.61.05          | ≥ 520.06                   |
@@ -58,7 +57,6 @@ Only works with
 | CUDA   | Driver version 535[^7] | Driver version 470[^8] |
 |:-------|:----------------------:|:----------------------:|
 | 12.8.0 | 🟢                      | 🔵                      |
-| 12.6.3 | 🟢                      | 🔵                      |
 | 12.6.2 | 🟢                      | 🔵                      |
 | 12.5.0 | 🟢                      | 🔵                      |
 | 11.8.0 | 🟡                      | 🟢                      |
diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md
index bf56114c9c20948f2770929c9cd86e7fae23f3f9..c8c49e9ad7c7c67b462f717698317feacd760a37 100644
--- a/VERSION_MATRIX.md
+++ b/VERSION_MATRIX.md
@@ -8,7 +8,7 @@ Topmost entry = Tag `latest`
 
 | R     | Python  | Jupyter Hub | Jupyter Lab | code‑server (Code) | RStudio       | Neovim | Git    | Git LFS | Pandoc | CRAN date  | Linux distro |
 |:------|:--------|:------------|:------------|:-------------------|:--------------|:-------|:-------|:--------|:-------|:-----------|:-------------|
-| 4.4.2 | 3.12.9  | 5.2.1       | 4.3.5       | 4.97.2 (1.97.2)    | 2024.12.1+563 | 0.10.4 | 2.48.1 | 3.6.1   | 3.4    |            | Debian 12    |
+| 4.4.2 | 3.12.9  | 5.2.1       | 4.3.5       | 4.97.2 (1.97.2)    | 2024.12.1+563 | 0.10.4 | 2.48.1 | 3.6.1   | 3.4    | 2025‑02‑28 | Debian 12    |
 | 4.4.1 | 3.12.7  | 5.2.1       | 4.2.5       | 4.93.1 (1.93.1)    | 2024.09.0+375 | 0.10.2 | 2.47.0 | 3.5.1   | 3.2    | 2024‑10‑31 | Debian 12    |
 | 4.4.0 | 3.12.4  | 5.0.0       | 4.2.2       | 4.90.0 (1.90.0)    | 2024.04.2+764 | n/a    | 2.45.2 | 3.5.1   | 3.1.11 | 2024‑06‑14 | Debian 12    |
 | 4.3.3 | 3.11.9  | 4.1.5       | 4.1.6       | 4.23.0 (1.88.0)    | n/a           | n/a    | 2.44.0 | 3.5.1   | 3.1.11 | 2024‑04‑24 | Debian 12    |
@@ -24,7 +24,7 @@ Topmost entry = Tag `latest`
 
 | R     | CTAN date  | Quarto      |
 |:------|:-----------|:------------|
-| 4.4.2 |            | 1.6.42      |
+| 4.4.2 | 2025‑02‑28 | 1.6.42      |
 | 4.4.1 | 2024‑10‑31 | 1.5.57      |
 | 4.4.0 | 2024‑06‑14 | 1.4.555     |
 | 4.3.3 | 2024‑04‑24 | 1.4.553     |
@@ -40,7 +40,7 @@ Topmost entry = Tag `latest`
 
 | R     | QGIS   | SAGA  | OTB[^1] |
 |:------|:-------|:------|:--------|
-| 4.4.2 | 3.40.3 | 9.1.3 | 9.1.0   |
+| 4.4.2 | 3.42.0 | 9.1.3 | 9.1.0   |
 | 4.4.1 | 3.40.0 | 9.1.3 | 9.1.0   |
 | 4.4.0 | 3.36.3 | 9.1.3 | 9.0.0   |
 | 4.3.3 | 3.36.2 | 9.1.3 | 9.0.0   |
diff --git a/base/4.4.2.Dockerfile b/base/4.4.2.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..47c7a0815e40f1cd0612f279cd05054488002580
--- /dev/null
+++ b/base/4.4.2.Dockerfile
@@ -0,0 +1,518 @@
+ARG BASE_IMAGE=debian
+ARG BASE_IMAGE_TAG=12
+ARG BUILD_ON_IMAGE=glcr.b-data.ch/r/ver
+ARG R_VERSION=4.4.2
+ARG CUDA_IMAGE_FLAVOR
+
+ARG NB_USER=jovyan
+ARG NB_UID=1000
+ARG JUPYTERHUB_VERSION=5.2.1
+ARG JUPYTERLAB_VERSION=4.3.5
+ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
+ARG CODE_SERVER_VERSION=4.97.2
+ARG RSTUDIO_VERSION=2024.12.1+563
+ARG NEOVIM_VERSION=0.10.4
+ARG GIT_VERSION=2.48.1
+ARG GIT_LFS_VERSION=3.6.1
+ARG PANDOC_VERSION=3.4
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} AS files
+
+ARG RSTUDIO_VERSION
+
+ARG NB_UID
+ENV NB_GID=100
+
+RUN mkdir /files
+
+COPY assets /files
+COPY conf/ipython /files
+COPY conf/jupyter /files
+COPY conf/jupyterlab /files
+COPY conf/rstudio /files
+COPY conf/shell /files
+COPY conf${CUDA_IMAGE:+/cuda}/shell /files
+COPY conf/user /files
+COPY scripts /files
+
+  ## Copy content of skel directory to backup
+RUN cp -a /files/etc/skel/. /files/var/backups/skel \
+  && chown -R ${NB_UID}:${NB_GID} /files/var/backups/skel \
+  ## Copy custom fonts
+  && mkdir -p /files/usr/local/share/jupyter/lab/static/assets \
+  && cp -a /files/opt/code-server/src/browser/media/css \
+    /files/usr/local/share/jupyter/lab/static/assets \
+  && cp -a /files/opt/code-server/src/browser/media/fonts \
+    /files/usr/local/share/jupyter/lab/static/assets \
+  && mkdir -p /files/etc/rstudio/fonts \
+  && cp "/files/opt/code-server/src/browser/media/fonts/MesloLGS NF Regular.woff" \
+    "/files/etc/rstudio/fonts/MesloLGS NF.woff" \
+  && cp "/files/opt/code-server/src/browser/media/fonts/MesloLGS NF Regular.woff2" \
+    "/files/etc/rstudio/fonts/MesloLGS NF.woff2" \
+  && if [ -n "${CUDA_VERSION}" ]; then \
+    ## Use standard R terminal for CUDA images
+    ## radian forces usage of /usr[/local]/bin/python
+    sed -i 's|/usr/local/bin/radian|/usr/local/bin/R|g' \
+      /files/var/backups/skel/.local/share/code-server/User/settings.json; \
+    ## Use entrypoint of CUDA image
+    mv /opt/nvidia/entrypoint.d /opt/nvidia/nvidia_entrypoint.sh \
+      /files/usr/local/bin; \
+    mv /files/usr/local/bin/start.sh \
+      /files/usr/local/bin/entrypoint.d/99-start.sh; \
+    mv /files/usr/local/bin/nvidia_entrypoint.sh \
+      /files/usr/local/bin/start.sh; \
+  fi \
+  && if [ -z "${RSTUDIO_VERSION}" ]; then \
+    rm -rf /files/etc/rstudio \
+      /files/usr/local/bin/before-notebook.d/*-rstudio.sh \
+      /files/var/backups/skel/.config; \
+  fi \
+  ## Ensure file modes are correct when using CI
+  ## Otherwise set to 777 in the target image
+  && find /files -type d -exec chmod 755 {} \; \
+  && find /files -type f -exec chmod 644 {} \; \
+  && find /files/usr/local/bin -type f -exec chmod 755 {} \; \
+  && find /files/etc/profile.d -type f -exec chmod 755 {} \;
+
+FROM glcr.b-data.ch/neovim/nvsi:${NEOVIM_VERSION} AS nvsi
+FROM glcr.b-data.ch/git/gsi/${GIT_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS gsi
+FROM glcr.b-data.ch/git-lfs/glfsi:${GIT_LFS_VERSION} AS glfsi
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} AS base
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} AS base-rstudio
+
+ARG RSTUDIO_VERSION
+
+ENV RSTUDIO_VERSION=${RSTUDIO_VERSION}
+
+## Connect to RStudio via unix socket
+ENV JUPYTER_RSESSION_PROXY_USE_SOCKET=1
+
+FROM base${RSTUDIO_VERSION:+-rstudio}
+
+ARG NCPUS=1
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+ARG BUILD_ON_IMAGE
+ARG CUDA_IMAGE_FLAVOR
+ARG NB_USER
+ARG NB_UID
+ARG JUPYTERHUB_VERSION
+ARG JUPYTERLAB_VERSION
+ARG CODE_BUILTIN_EXTENSIONS_DIR
+ARG CODE_SERVER_VERSION
+ARG NEOVIM_VERSION
+ARG GIT_VERSION
+ARG GIT_LFS_VERSION
+ARG PANDOC_VERSION
+ARG BUILD_START
+
+ARG CODE_WORKDIR
+
+ARG CUDA_IMAGE_LICENSE=${CUDA_VERSION:+"NVIDIA Deep Learning Container License"}
+ARG IMAGE_LICENSE=${CUDA_IMAGE_LICENSE:-"MIT"}
+ARG IMAGE_SOURCE=https://gitlab.b-data.ch/jupyterlab/r/docker-stack
+ARG IMAGE_VENDOR="b-data GmbH"
+ARG IMAGE_AUTHORS="Olivier Benz <olivier.benz@b-data.ch>"
+
+LABEL org.opencontainers.image.licenses="$IMAGE_LICENSE" \
+      org.opencontainers.image.source="$IMAGE_SOURCE" \
+      org.opencontainers.image.vendor="$IMAGE_VENDOR" \
+      org.opencontainers.image.authors="$IMAGE_AUTHORS"
+
+ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION}${CUDA_IMAGE_FLAVOR:+-}${CUDA_IMAGE_FLAVOR} \
+    NB_USER=${NB_USER} \
+    NB_UID=${NB_UID} \
+    JUPYTERHUB_VERSION=${JUPYTERHUB_VERSION} \
+    JUPYTERLAB_VERSION=${JUPYTERLAB_VERSION} \
+    CODE_SERVER_VERSION=${CODE_SERVER_VERSION} \
+    NEOVIM_VERSION=${NEOVIM_VERSION} \
+    GIT_VERSION=${GIT_VERSION} \
+    GIT_LFS_VERSION=${GIT_LFS_VERSION} \
+    PANDOC_VERSION=${PANDOC_VERSION} \
+    BUILD_DATE=${BUILD_START}
+
+ENV NB_GID=100
+
+## Installing V8 on Linux, the alternative way
+## https://ropensci.org/blog/2020/11/12/installing-v8
+ENV DOWNLOAD_STATIC_LIBV8=1
+
+## Disable prompt to install miniconda
+ENV RETICULATE_MINICONDA_ENABLED=0
+
+## Install Neovim
+COPY --from=nvsi /usr/local /usr/local
+## Install Git
+COPY --from=gsi /usr/local /usr/local
+## Install Git LFS
+COPY --from=glfsi /usr/local /usr/local
+
+USER root
+
+RUN dpkgArch="$(dpkg --print-architecture)" \
+  ## Unminimise if the system has been minimised
+  && if [ $(command -v unminimize) ]; then \
+    yes | unminimize; \
+  fi \
+  && apt-get update \
+  && apt-get -y install --no-install-recommends \
+    bash-completion \
+    build-essential \
+    curl \
+    file \
+    fontconfig \
+    g++ \
+    gcc \
+    gfortran \
+    gnupg \
+    htop \
+    info \
+    jq \
+    libclang-dev \
+    man-db \
+    nano \
+    ncdu \
+    procps \
+    psmisc \
+    screen \
+    sudo \
+    swig \
+    tmux \
+    vim-tiny \
+    wget \
+    zsh \
+    ## Neovim: Additional runtime recommendations
+    ripgrep \
+    ## Git: Additional runtime dependencies
+    libcurl3-gnutls \
+    liberror-perl \
+    ## Git: Additional runtime recommendations
+    less \
+    ssh-client \
+  ## Python: Additional dev dependencies
+  && if [ -z "$PYTHON_VERSION" ]; then \
+    apt-get -y install --no-install-recommends \
+      python3-dev \
+      ## Install Python package installer
+      ## (dep: python3-distutils, python3-setuptools and python3-wheel)
+      python3-pip \
+      ## Install venv module for python3
+      python3-venv; \
+    ## make some useful symlinks that are expected to exist
+    ## ("/usr/bin/python" and friends)
+    for src in pydoc3 python3 python3-config; do \
+      dst="$(echo "$src" | tr -d 3)"; \
+      if [ -s "/usr/bin/$src" ] && [ ! -e "/usr/bin/$dst" ]; then \
+        ln -svT "$src" "/usr/bin/$dst"; \
+      fi \
+    done; \
+  else \
+    ## Force update pip, setuptools and wheel
+    pip install --upgrade --force-reinstall \
+      pip \
+      setuptools \
+      wheel; \
+  fi \
+  ## Install font MesloLGS NF
+  && mkdir -p /usr/share/fonts/truetype/meslo \
+  && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Regular.ttf" \
+  && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Bold.ttf" \
+  && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Italic.ttf" \
+  && curl -sL https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf -o "/usr/share/fonts/truetype/meslo/MesloLGS NF Bold Italic.ttf" \
+  && fc-cache -fsv \
+  ## Git: Set default branch name to main
+  && git config --system init.defaultBranch main \
+  ## Git: Store passwords for one hour in memory
+  && git config --system credential.helper "cache --timeout=3600" \
+  ## Git: Merge the default branch from the default remote when "git pull" is run
+  && git config --system pull.rebase false \
+  ## Install pandoc
+  && curl -sLO https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
+  && dpkg -i pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
+  && rm pandoc-${PANDOC_VERSION}-1-${dpkgArch}.deb \
+  ## Delete potential user with UID 1000
+  && if grep -q 1000 /etc/passwd; then \
+    userdel --remove $(id -un 1000); \
+  fi \
+  ## Do not set user limits for sudo/sudo-i
+  && sed -i 's/.*pam_limits.so/#&/g' /etc/pam.d/sudo \
+  && if [ -f "/etc/pam.d/sudo-i" ]; then \
+    sed -i 's/.*pam_limits.so/#&/g' /etc/pam.d/sudo-i; \
+  fi \
+  ## Add user
+  && useradd -l -m -s $(which zsh) -N -u ${NB_UID} ${NB_USER} \
+  ## Mark home directory as populated
+  && touch /home/${NB_USER}/.populated \
+  && chown ${NB_UID}:${NB_GID} /home/${NB_USER}/.populated \
+  && chmod go+w /home/${NB_USER}/.populated \
+  ## Create backup directory for home directory
+  && mkdir -p /var/backups/skel \
+  && chown ${NB_UID}:${NB_GID} /var/backups/skel \
+  ## Install Tini
+  && curl -sL https://github.com/krallin/tini/releases/download/v0.19.0/tini-${dpkgArch} -o /usr/local/bin/tini \
+  && chmod +x /usr/local/bin/tini \
+  ## Clean up
+  && rm -rf /tmp/* \
+  && rm -rf /var/lib/apt/lists/* \
+    ${HOME}/.cache
+
+ENV PATH=/opt/code-server/bin:$PATH \
+    CS_DISABLE_GETTING_STARTED_OVERRIDE=1
+
+## Install code-server
+RUN mkdir /opt/code-server \
+  && cd /opt/code-server \
+  && curl -sL https://github.com/coder/code-server/releases/download/v${CODE_SERVER_VERSION}/code-server-${CODE_SERVER_VERSION}-linux-$(dpkg --print-architecture).tar.gz | tar zxf - --no-same-owner --strip-components=1 \
+  ## Copy custom fonts
+  && mkdir -p /opt/code-server/src/browser/media/fonts \
+  && cp -a /usr/share/fonts/truetype/meslo/*.ttf /opt/code-server/src/browser/media/fonts \
+  ## Include custom fonts
+  && sed -i 's|</head>|	<link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n	</head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
+  && sed -i 's|</head>|	<link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n	</head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
+  && sed -i 's|</head>|	<link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n	</head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
+  && sed -i 's|</head>|	<link rel="preload" href="{{BASE}}/_static/src/browser/media/fonts/MesloLGS NF Bold Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">\n	</head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
+  && sed -i 's|</head>|	<link rel="stylesheet" type="text/css" href="{{BASE}}/_static/src/browser/media/css/fonts.css">\n	</head>|g' /opt/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html \
+  ## Install code-server extensions
+  && cd /tmp \
+  && curl -sLO https://dl.b-data.ch/vsix/piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension piotrpalarz.vscode-gitignore-generator-1.0.3.vsix \
+  && curl -sLO https://dl.b-data.ch/vsix/mutantdino.resourcemonitor-1.0.7.vsix \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mutantdino.resourcemonitor-1.0.7.vsix \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension alefragnani.project-manager \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitHub.vscode-pull-request-github \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension GitLab.gitlab-workflow \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-python.python \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-toolsai.jupyter \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension christian-kohler.path-intellisense \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension eamodio.gitlens@11.7.0 \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mhutchie.git-graph \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension redhat.vscode-yaml \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension grapecity.gc-excelviewer \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension editorconfig.editorconfig \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension DavidAnson.vscode-markdownlint \
+  ## Create folders temp and tmp for Jupyter extension
+  && cd /opt/code-server/lib/vscode/extensions/ms-toolsai.jupyter-* \
+  && mkdir -m 1777 temp \
+  && mkdir -m 1777 tmp \
+  ## Clean up
+  && rm -rf /tmp/* \
+    ${HOME}/.config \
+    ${HOME}/.local
+
+## Install RStudio
+RUN if [ -n "${RSTUDIO_VERSION}" ]; then \
+    dpkgArch="$(dpkg --print-architecture)"; \
+    . /etc/os-release; \
+    apt-get update; \
+    ## Install lsb-release
+    if [ "$ID" = "debian" ]; then \
+      dpkg --compare-versions "$VERSION_ID" lt "12"; \
+      condDebian=$?; \
+    fi; \
+    if [ "$ID" = "ubuntu" ]; then \
+      dpkg --compare-versions "$VERSION_ID" lt "23.04"; \
+      condUbuntu=$?; \
+    fi; \
+    if [ "$condDebian" = "0" ]; then \
+      curl -sL \
+        http://mirrors.kernel.org/debian/pool/main/l/lsb-release-minimal/lsb-release_12.0-1_all.deb \
+        -o lsb-release.deb; \
+      dpkg -i lsb-release.deb; \
+      rm lsb-release.deb; \
+    elif [ "$condUbuntu" = "0" ]; then \
+      curl -sL \
+        http://mirrors.kernel.org/ubuntu/pool/main/l/lsb-release-minimal/lsb-release_12.0-2_all.deb \
+        -o lsb-release.deb; \
+      dpkg -i lsb-release.deb; \
+      rm lsb-release.deb; \
+    else \
+      apt-get -y install --no-install-recommends lsb-release; \
+    fi; \
+    ## Map Ubuntu codename
+    if [ "$ID" = "debian" ]; then \
+      case "$VERSION_CODENAME" in \
+        bullseye) UBUNTU_CODENAME="focal" ;; \
+        bookworm) UBUNTU_CODENAME="jammy" ;; \
+        *) echo "error: Debian $VERSION unsupported"; exit 1 ;; \
+      esac; \
+    fi; \
+    ## Install RStudio
+    apt-get -y install --no-install-recommends \
+      libapparmor1 \
+      libpq5 \
+      libssl-dev; \
+    rm -rf /var/lib/apt/lists/*; \
+    DOWNLOAD_FILE=rstudio-server-$(echo $RSTUDIO_VERSION | tr + -)-$dpkgArch.deb; \
+    wget --progress=dot:mega \
+      "https://download2.rstudio.org/server/$UBUNTU_CODENAME/$dpkgArch/$DOWNLOAD_FILE" || \
+      wget --progress=dot:mega \
+      "https://s3.amazonaws.com/rstudio-ide-build/server/$UBUNTU_CODENAME/$dpkgArch/$DOWNLOAD_FILE"; \
+    dpkg -i "$DOWNLOAD_FILE"; \
+    rm "$DOWNLOAD_FILE"; \
+    ## Enable rstudio-server and rserver system-wide
+    ln -fs /usr/lib/rstudio-server/bin/rstudio-server /usr/local/bin; \
+    ln -fs /usr/lib/rstudio-server/bin/rserver /usr/local/bin; \
+    ## Copy custom fonts
+    cp "/opt/code-server/src/browser/media/fonts/MesloLGS NF Regular.ttf" \
+      "/etc/rstudio/fonts/MesloLGS NF.ttf"; \
+  fi
+
+## Install JupyterLab
+RUN export PIP_BREAK_SYSTEM_PACKAGES=1 \
+  && pip install \
+    jupyter-server-proxy \
+    jupyterhub==${JUPYTERHUB_VERSION} \
+    jupyterlab==${JUPYTERLAB_VERSION} \
+    jupyterlab-git \
+    jupyterlab-lsp \
+    notebook \
+    nbclassic \
+    nbconvert \
+    python-lsp-server[all] \
+    ${RSTUDIO_VERSION:+jupyter-rsession-proxy} \
+  ## Jupyter Server Proxy: Set maximum allowed HTTP body size to 10 GiB
+  && sed -i 's/AsyncHTTPClient(/AsyncHTTPClient(max_body_size=10737418240, /g' \
+    /usr/local/lib/python*/*-packages/jupyter_server_proxy/handlers.py \
+  ## Jupyter Server Proxy: Set maximum allowed websocket message size to 1 GiB
+  && sed -i 's/"_default_max_message_size",.*$/"_default_max_message_size", 1024 \* 1024 \* 1024/g' \
+    /usr/local/lib/python*/*-packages/jupyter_server_proxy/websocket.py \
+  && sed -i 's/_default_max_message_size =.*$/_default_max_message_size = 1024 \* 1024 \* 1024/g' \
+    /usr/local/lib/python*/*-packages/tornado/websocket.py \
+  ## Copy custom fonts
+  && mkdir -p /usr/local/share/jupyter/lab/static/assets/fonts \
+  && cp -a /usr/share/fonts/truetype/meslo/*.ttf /usr/local/share/jupyter/lab/static/assets/fonts \
+  ## Include custom fonts
+  && sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
+  && sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
+  && sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
+  && sed -i 's|</head>|<link rel="preload" href="{{page_config.fullStaticUrl}}/assets/fonts/MesloLGS NF Bold Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
+  && sed -i 's|</head>|<link rel="stylesheet" type="text/css" href="{{page_config.fullStaticUrl}}/assets/css/fonts.css"></head>|g' /usr/local/share/jupyter/lab/static/index.html \
+  ## Clean up
+  && rm -rf /tmp/* \
+    ${HOME}/.cache
+
+## Install R related stuff
+RUN apt-get update \
+  && apt-get -y install --no-install-recommends \
+    ## Current ZeroMQ library for R pbdZMQ
+    libzmq3-dev \
+    ## Required for R extension
+    libcairo2-dev \
+    libcurl4-openssl-dev \
+    libfontconfig1-dev \
+    libssl-dev \
+    libtiff-dev \
+    libxml2-dev \
+  ## Install radian
+  && export PIP_BREAK_SYSTEM_PACKAGES=1 \
+  && pip install radian \
+  ## Provide NVBLAS-enabled radian_
+  ## Enabled at runtime and only if nvidia-smi and at least one GPU are present
+  && if [ ! -z "$CUDA_IMAGE" ]; then \
+    nvblasLib="$(cd $CUDA_HOME/lib* && ls libnvblas.so* | head -n 1)"; \
+    cp -a $(which radian) $(which radian)_; \
+    echo '#!/bin/bash' > $(which radian)_; \
+    echo "command -v nvidia-smi >/dev/null && nvidia-smi -L | grep 'GPU[[:space:]]\?[[:digit:]]\+' >/dev/null && export LD_PRELOAD=$nvblasLib" \
+      >> $(which radian)_; \
+    echo "$(which radian) \"\${@}\"" >> $(which radian)_; \
+  fi \
+  ## Install httpgd
+  ## Archived on 2025-02-14 as requires archived package 'unigd'.
+  && install2.r --error --skipinstalled -n $NCPUS \
+    unigd \
+    AsioHeaders \
+  && curl -sLO https://cran.r-project.org/src/contrib/Archive/httpgd/httpgd_2.0.2.tar.gz \
+  && R CMD INSTALL httpgd_2.0.2.tar.gz \
+  && rm httpgd_2.0.2.tar.gz \
+  ## Install the R kernel for Jupyter, languageserver and httpgd
+  && install2.r --error --deps TRUE --skipinstalled -n $NCPUS \
+    IRkernel \
+    languageserver \
+    httpgd \
+  && Rscript -e "IRkernel::installspec(user = FALSE, displayname = paste('R', Sys.getenv('R_VERSION')))" \
+  ## Get rid of libcairo2-dev and its dependencies (incl. python3)
+  && apt-get -y purge libcairo2-dev \
+  && apt-get -y autoremove \
+  ## IRkernel: Enable 'image/svg+xml' instead of 'image/png' for plot display
+  ## IRkernel: Enable 'application/pdf' for PDF conversion
+  && echo "options(jupyter.plot_mimetypes = c('text/plain', 'image/svg+xml', 'application/pdf'))" \
+    >> $(R RHOME)/etc/Rprofile.site \
+  ## IRkernel: Include user's private bin in PATH
+  && echo "if (dir.exists(file.path(Sys.getenv('HOME'), 'bin')) &&" \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo '  !grepl(file.path(Sys.getenv('\''HOME'\''), '\''bin'\''), Sys.getenv('\''PATH'\''))) {' \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo "  Sys.setenv(PATH = paste(file.path(Sys.getenv('HOME'), 'bin'), Sys.getenv('PATH')," \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo "    sep = .Platform\$path.sep))}" \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo "if (dir.exists(file.path(Sys.getenv('HOME'), '.local', 'bin')) &&" \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo '  !grepl(file.path(Sys.getenv('\''HOME'\''), '\''.local'\'', '\''bin'\''), Sys.getenv('\''PATH'\''))) {' \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo "  Sys.setenv(PATH = paste(file.path(Sys.getenv('HOME'), '.local', 'bin'), Sys.getenv('PATH')," \
+    >> $(R RHOME)/etc/Rprofile.site \
+  && echo "    sep = .Platform\$path.sep))}" \
+    >> $(R RHOME)/etc/Rprofile.site \
+  ## Install code-server extension
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension REditorSupport.r \
+  ## REditorSupport.r: Disable help panel and revert to old behaviour
+  && echo "options(vsc.helpPanel = FALSE)" >> $(R RHOME)/etc/Rprofile.site \
+  ## Change ownership and permission of $(R RHOME)/etc/*.site
+  && chown :"$NB_GID" "$(R RHOME)/etc" "$(R RHOME)/etc/"*.site \
+  && chmod g+w "$(R RHOME)/etc" "$(R RHOME)/etc/"*.site \
+  ## Strip libraries of binary packages installed from P3M
+  && RLS=$(Rscript -e "cat(Sys.getenv('R_LIBS_SITE'))") \
+  && strip ${RLS}/*/libs/*.so \
+  ## Clean up
+  && rm -rf /tmp/* \
+    /var/lib/apt/lists/* \
+    ${HOME}/.cache \
+    ${HOME}/.config \
+    ${HOME}/.ipython \
+    ${HOME}/.local
+
+## Switch back to ${NB_USER} to avoid accidental container runs as root
+USER ${NB_USER}
+
+ENV HOME=/home/${NB_USER} \
+    CODE_WORKDIR=${CODE_WORKDIR:-/home/${NB_USER}/projects} \
+    SHELL=/usr/bin/zsh \
+    TERM=xterm-256color
+
+WORKDIR ${HOME}
+
+## Install Oh My Zsh with Powerlevel10k theme
+RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended \
+  && git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${HOME}/.oh-my-zsh/custom/themes/powerlevel10k \
+  && ${HOME}/.oh-my-zsh/custom/themes/powerlevel10k/gitstatus/install -f \
+  && sed -i 's/ZSH="\/home\/jovyan\/.oh-my-zsh"/ZSH="$HOME\/.oh-my-zsh"/g' ${HOME}/.zshrc \
+  && sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="powerlevel10k\/powerlevel10k"/g' ${HOME}/.zshrc \
+  && echo "\n# set PATH so it includes user's private bin if it exists\nif [ -d \"\$HOME/bin\" ] && [[ \"\$PATH\" != *\"\$HOME/bin\"* ]] ; then\n    PATH=\"\$HOME/bin:\$PATH\"\nfi" | tee -a ${HOME}/.bashrc ${HOME}/.zshrc \
+  && echo "\n# set PATH so it includes user's private bin if it exists\nif [ -d \"\$HOME/.local/bin\" ] && [[ \"\$PATH\" != *\"\$HOME/.local/bin\"* ]] ; then\n    PATH=\"\$HOME/.local/bin:\$PATH\"\nfi" | tee -a ${HOME}/.bashrc ${HOME}/.zshrc \
+  && echo "\n# Update last-activity timestamps while in screen/tmux session\nif [ ! -z \"\$TMUX\" -o ! -z \"\$STY\" ] ; then\n    busy &\nfi" >> ${HOME}/.bashrc \
+  && echo "\n# Update last-activity timestamps while in screen/tmux session\nif [ ! -z \"\$TMUX\" -o ! -z \"\$STY\" ] ; then\n    setopt nocheckjobs\n    busy &\nfi" >> ${HOME}/.zshrc \
+  && echo "\n# To customize prompt, run \`p10k configure\` or edit ~/.p10k.zsh." >> ${HOME}/.zshrc \
+  && echo "[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh" >> ${HOME}/.zshrc \
+  ## Create user's private bin
+  && mkdir -p ${HOME}/.local/bin \
+  ## Record population timestamp
+  && date -uIseconds > ${HOME}/.populated \
+  ## Create backup of home directory
+  && cp -a ${HOME}/. /var/backups/skel
+
+## Copy files as late as possible to avoid cache busting
+COPY --from=files /files /
+COPY --from=files /files/var/backups/skel ${HOME}
+
+ARG JUPYTER_PORT=8888
+ENV JUPYTER_PORT=${JUPYTER_PORT}
+
+EXPOSE $JUPYTER_PORT
+
+## Configure container startup
+ENTRYPOINT ["tini", "-g", "--", "start.sh"]
+CMD ["start-notebook.sh"]
diff --git a/common/subtags/devtools/4.4.2.Dockerfile b/common/subtags/devtools/4.4.2.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..431c21efc8d257522c5fd75b894f21aeb7a52562
--- /dev/null
+++ b/common/subtags/devtools/4.4.2.Dockerfile
@@ -0,0 +1,91 @@
+ARG BASE_IMAGE=debian
+ARG BASE_IMAGE_TAG=12
+ARG BUILD_ON_IMAGE
+ARG R_VERSION=4.4.2
+
+ARG NODE_VERSION=20.18.1
+ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
+
+FROM glcr.b-data.ch/nodejs/nsi/${NODE_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS nsi
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+ARG BUILD_ON_IMAGE
+
+ARG NODE_VERSION
+ARG CODE_BUILTIN_EXTENSIONS_DIR
+ARG BUILD_START
+
+ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
+    NODE_VERSION=${NODE_VERSION} \
+    BUILD_DATE=${BUILD_START}
+
+## Prevent Corepack showing the URL when it needs to download software
+ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
+
+## Install Node.js
+COPY --from=nsi /usr/local /usr/local
+
+USER root
+
+ENV HOME=/root
+
+WORKDIR ${HOME}
+
+RUN apt-get update \
+  && apt-get install -y --no-install-recommends \
+    bats \
+    libkrb5-dev \
+    libsecret-1-dev \
+    libx11-dev \
+    libxkbfile-dev \
+    libxt6 \
+    quilt \
+    rsync \
+  && if [ -n "$PYTHON_VERSION" ]; then \
+    ## make some useful symlinks that are expected to exist
+    ## ("/usr/bin/python" and friends)
+    for src in pydoc3 python3 python3-config; do \
+      dst="$(echo "$src" | tr -d 3)"; \
+      if [ -s "/usr/bin/$src" ] && [ ! -e "/usr/bin/$dst" ]; then \
+        ln -svT "$src" "/usr/bin/$dst"; \
+      fi \
+    done; \
+  fi \
+  ## Clean up Node.js installation
+  && bash -c 'rm -f /usr/local/bin/{docker-entrypoint.sh,yarn*}' \
+  && bash -c 'mv /usr/local/{CHANGELOG.md,LICENSE,README.md} \
+    /usr/local/share/doc/node' \
+  ## Enable corepack (Yarn, pnpm)
+  && corepack enable \
+  ## Install nFPM
+  && echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' \
+    | tee /etc/apt/sources.list.d/goreleaser.list \
+  && apt-get update \
+  && apt-get install -y --no-install-recommends nfpm \
+  ## Install code-server extensions
+  && code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
+    --install-extension dbaeumer.vscode-eslint \
+  && code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
+    --install-extension esbenp.prettier-vscode \
+  && code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
+    --install-extension ms-python.black-formatter \
+  && code-server --extensions-dir "$CODE_BUILTIN_EXTENSIONS_DIR" \
+    --install-extension timonwong.shellcheck \
+  ## Enable shellcheck system-wide
+  && ln -sf "$CODE_BUILTIN_EXTENSIONS_DIR"/timonwong.shellcheck-*/binaries/*/*/shellcheck \
+    /usr/local/bin/shellcheck \
+  ## Clean up
+  && rm -rf /tmp/* \
+  && rm -rf /var/lib/apt/lists/* \
+    "$HOME/.config" \
+    "$HOME/.local"
+
+## Switch back to ${NB_USER} to avoid accidental container runs as root
+USER ${NB_USER}
+
+ENV HOME=/home/${NB_USER}
+
+WORKDIR ${HOME}
diff --git a/geospatial/4.4.2.Dockerfile b/geospatial/4.4.2.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..7efd2d691b63928fe9ca5b4313e3a514421e035e
--- /dev/null
+++ b/geospatial/4.4.2.Dockerfile
@@ -0,0 +1,80 @@
+ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/verse
+ARG R_VERSION=4.4.2
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}
+
+ARG NCPUS=1
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+ARG BUILD_ON_IMAGE
+ARG BUILD_START
+
+ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
+    BUILD_DATE=${BUILD_START}
+
+USER root
+
+RUN apt-get update \
+  && apt-get install -y --no-install-recommends \
+    libfftw3-dev \
+    libgdal-dev \
+    libgeos-dev \
+    libgsl0-dev \
+    #libgl1-mesa-dev \
+    #libglu1-mesa-dev \
+    libhdf4-alt-dev \
+    #libhdf5-dev \
+    libjq-dev \
+    #libpq-dev \
+    libproj-dev \
+    libprotobuf-dev \
+    libnetcdf-dev \
+    #libsqlite3-dev \
+    #libssl-dev \
+    libudunits2-dev \
+    nco \
+    netcdf-bin \
+    postgis \
+    protobuf-compiler \
+    sqlite3 \
+    tk-dev \
+    #unixodbc-dev
+  && install2.r --error --skipinstalled -n $NCPUS \
+    #RColorBrewer \
+    RNetCDF \
+    classInt \
+    deldir \
+    gstat \
+    hdf5r \
+    lidR \
+    mapdata \
+    mapview \
+    ncdf4 \
+    proj4 \
+    raster \
+    rlas \
+    sf \
+    sfarrow \
+    sp \
+    spacetime \
+    spatstat \
+    spatialreg \
+    spdep \
+    stars \
+    terra \
+    tidync \
+    tmap \
+    geoR \
+    geosphere \
+  ## from bioconductor
+  && R -e "BiocManager::install('rhdf5', update = FALSE, ask = FALSE)" \
+  ## Strip libraries of binary packages installed from P3M
+  && RLS=$(Rscript -e "cat(Sys.getenv('R_LIBS_SITE'))") \
+  && strip ${RLS}/*/libs/*.so \
+  ## Clean up
+  && rm -rf /tmp/* \
+  && rm -rf /var/lib/apt/lists/*
+
+## Switch back to ${NB_USER} to avoid accidental container runs as root
+USER ${NB_USER}
diff --git a/qgisprocess/4.4.2.Dockerfile b/qgisprocess/4.4.2.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..a9656707852e157eee538a3849ae69380f71e4bc
--- /dev/null
+++ b/qgisprocess/4.4.2.Dockerfile
@@ -0,0 +1,265 @@
+ARG BASE_IMAGE=debian
+ARG BASE_IMAGE_TAG=12
+ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/geospatial
+ARG R_VERSION=4.4.2
+ARG QGIS_VERSION=3.42.0
+
+ARG SAGA_VERSION
+ARG OTB_VERSION
+## OTB_VERSION=9.1.0
+
+ARG PROC_SAGA_NG_VERSION
+
+FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS files
+
+ARG OTB_VERSION
+
+ARG NB_UID=1000
+ENV NB_GID=100
+
+RUN mkdir /files
+
+COPY conf/user /files
+COPY scripts /files
+
+RUN if [ "$(uname -m)" = "x86_64" ]; then \
+    ## QGIS: Set OTB application folder and OTB folder
+    qgis3Ini="/files/var/backups/skel/.local/share/QGIS/QGIS3/profiles/default/QGIS/QGIS3.ini"; \
+    echo "\n[Processing]" >> ${qgis3Ini}; \
+    if [ -z "${OTB_VERSION}" ]; then \
+      echo "Configuration\OTB_APP_FOLDER=/usr/lib/otb/applications" >> \
+        ${qgis3Ini}; \
+      echo "Configuration\OTB_FOLDER=/usr\n" >> ${qgis3Ini}; \
+    else \
+      echo "Configuration\OTB_APP_FOLDER=/usr/local/lib/otb/applications" >> \
+        ${qgis3Ini}; \
+      echo "Configuration\OTB_FOLDER=/usr/local\n" >> ${qgis3Ini}; \
+    fi \
+  fi \
+  && chown -R ${NB_UID}:${NB_GID} /files/var/backups/skel \
+  ## Ensure file modes are correct when using CI
+  ## Otherwise set to 777 in the target image
+  && find /files -type d -exec chmod 755 {} \; \
+  && find /files -type f -exec chmod 644 {} \; \
+  && find /files/usr/local/bin -type f -exec chmod 755 {} \;
+
+FROM glcr.b-data.ch/qgis/qgissi/${QGIS_VERSION}/${BASE_IMAGE}:${BASE_IMAGE_TAG} AS qgissi
+FROM glcr.b-data.ch/saga-gis/saga-gissi${SAGA_VERSION:+/}${SAGA_VERSION:-:none}${SAGA_VERSION:+/$BASE_IMAGE}${SAGA_VERSION:+:$BASE_IMAGE_TAG} AS saga-gissi
+FROM glcr.b-data.ch/orfeotoolbox/otbsi${OTB_VERSION:+/}${OTB_VERSION:-:none}${OTB_VERSION:+/$BASE_IMAGE}${OTB_VERSION:+:$BASE_IMAGE_TAG} AS otbsi
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}
+
+ARG NCPUS=1
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+ARG BUILD_ON_IMAGE
+ARG QGIS_VERSION
+ARG SAGA_VERSION
+ARG OTB_VERSION
+ARG PROC_SAGA_NG_VERSION
+ARG BUILD_START
+
+ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
+    QGIS_VERSION=${QGIS_VERSION} \
+    SAGA_VERSION=${SAGA_VERSION} \
+    OTB_VERSION=${OTB_VERSION} \
+    BUILD_DATE=${BUILD_START}
+
+USER root
+
+ENV HOME=/root \
+    ## GRASS GIS: Make sure the distro's python is used
+    GRASS_PYTHON=/usr/bin/python3
+
+WORKDIR ${HOME}
+
+## Install QGIS
+COPY --from=qgissi /usr /usr
+## Install SAGA GIS
+COPY --from=saga-gissi /usr /usr
+## Install Orfeo Toolbox
+COPY --from=otbsi /usr/local /usr/local
+ENV GDAL_DRIVER_PATH=${OTB_VERSION:+disable} \
+    OTB_APPLICATION_PATH=${OTB_VERSION:+/usr/local/lib/otb/applications} \
+    OTB_INSTALL_DIR=${OTB_VERSION:+/usr/local}
+ENV OTB_APPLICATION_PATH=${OTB_APPLICATION_PATH:-/usr/lib/otb/applications} \
+    OTB_INSTALL_DIR=${OTB_INSTALL_DIR:-/usr}
+
+RUN apt-get update \
+  && apt-get -y install --no-install-recommends \
+    ## Multimedia files trancoding
+    ffmpeg \
+    ## QGIS: Additional runtime dependencies
+    '^libexiv2-[0-9]+$' \
+    '^libgdal[0-9]+$' \
+    libgeos-c1v5 \
+    '^libgsl[0-9]+$' \
+    libjs-jquery \
+    libjs-leaflet \
+    '^libprotobuf-lite[0-9]+$' \
+    libqca-qt5-2-plugins \
+    '^libqscintilla2-qt5-[0-9]+$' \
+    libqt5core5a \
+    libqt5gui5 \
+    libqt5keychain1 \
+    libqt5multimediawidgets5 \
+    libqt5network5 \
+    libqt5quickwidgets5 \
+    libqt5serialport5 \
+    libqt5sql5 \
+    libqt5webkit5 \
+    libqt5widgets5 \
+    libqt5xml5 \
+    libqwt-qt5-6 \
+    '^libspatialindex[0-9]+$' \
+    '^libzip[0-9]+$' \
+    ocl-icd-libopencl1 \
+    qt3d-assimpsceneimport-plugin \
+    qt3d-defaultgeometryloader-plugin \
+    qt3d-gltfsceneio-plugin \
+    qt3d-scene2d-plugin \
+    qt5-image-formats-plugins \
+    ## QGIS: Python 3 Support
+    gdal-bin \
+    libfcgi0ldbl \
+    libsqlite3-mod-spatialite \
+    python3-gdal \
+    python3-jinja2 \
+    python3-lxml \
+    python3-matplotlib \
+    python3-owslib \
+    python3-plotly \
+    python3-psycopg2 \
+    python3-pygments \
+    python3-pyproj \
+    python3-pyqt5 \
+    python3-pyqt5.qsci \
+    python3-pyqt5.qtmultimedia \
+    python3-pyqt5.qtpositioning \
+    python3-pyqt5.qtserialport \
+    python3-pyqt5.qtsql \
+    python3-pyqt5.qtsvg \
+    python3-pyqt5.qtwebkit \
+    python3-sip \
+    python3-yaml \
+    qttools5-dev-tools \
+    ## QGIS: Additional runtime recommendations
+    grass \
+    ## QGIS: Additional runtime suggestions
+    gpsbabel \
+    ## SAGA GIS: Supplementary runtime dependencies [^1]
+    libdxflib3 \
+    libhpdf-2.3.0 \
+    libsvm3 \
+    libwxgtk3.*-dev \
+    $(test -z "${SAGA_VERSION}" && echo "saga") \
+  ## Orfeo Toolbox: Supplementary runtime dependencies
+  && if [ "$(uname -m)" = "x86_64" ]; then \
+    apt-get -y install --no-install-recommends \
+      '^libboost-filesystem[0-9].[0-9]+.[0-9]$' \
+      '^libboost-serialization[0-9].[0-9]+.[0-9]$' \
+      libglew2.* \
+      '^libinsighttoolkit4.[0-9]+$' \
+      libmuparser2v5 \
+      libmuparserx4.* \
+      '^libopencv-core[0-9][0-9.][0-9][a-z]?$' \
+      '^libopencv-ml[0-9][0-9.][0-9][a-z]?$' \
+      libtinyxml-dev \
+      $(test -z "${OTB_VERSION}" && echo "otb-* monteverdi"); \
+    if [ ! -z "${OTB_VERSION}" ]; then \
+      if [ "$(echo ${OTB_VERSION} | cut -c 1)" -lt "8" ]; then \
+        apt-get -y install --no-install-recommends \
+          '^libopenthreads[0-9]+$' \
+          libossim1; \
+      fi; \
+      ## Orfeo Toolbox: Clean up installation
+      bash -c 'rm -rf /usr/local/{otbenv.profile,recompile_bindings.sh,tools}'; \
+      if [ -f /usr/local/README ]; then \
+        mv /usr/local/README /usr/local/share/doc/otb; \
+      fi; \
+      if [ -f /usr/local/LICENSE ]; then \
+        mv /usr/local/LICENSE /usr/local/share/doc/otb; \
+      fi \
+    else \
+      mkdir -p /usr/lib/otb; \
+      ln -rs /usr/lib/$(uname -m)-linux-gnu/otb/applications \
+        /usr/lib/otb/applications; \
+    fi \
+  fi \
+  ## GRASS GIS: Configure dynamic linker run time bindings
+  && echo "$(grass --config path)/lib" | tee /etc/ld.so.conf.d/libgrass.conf \
+  && ldconfig \
+  ## SAGA GIS: Add en_GB.UTF-8 and update locale
+  && sed -i "s/# $LANG/$LANG/g" /etc/locale.gen \
+  && sed -i "s/# en_GB.UTF-8/en_GB.UTF-8/g" /etc/locale.gen \
+  && locale-gen \
+  ## [^1]: SAGA GIS: libvigraimpex11 is not available for jammy
+  && if $(! grep -q "jammy" /etc/os-release); then \
+    apt-get -y install --no-install-recommends '^libvigraimpex[0-9]+$'; \
+  fi \
+  ## Clean up
+  && rm -rf /tmp/* \
+  && rm -rf /var/lib/apt/lists/* \
+    ${HOME}/.cache \
+    ${HOME}/.grass*
+
+## Install QGIS related stuff
+RUN apt-get update \
+  ## Install QGIS-Plugin-Manager
+  && apt-get -y install --no-install-recommends python3-pip \
+  && export PIP_BREAK_SYSTEM_PACKAGES=1 \
+  && /usr/bin/pip install qgis-plugin-manager \
+  ## Install qgisprocess, the R interface to QGIS
+  && install2.r --error --skipinstalled -n $NCPUS qgisprocess \
+  ## Strip libraries of binary packages installed from P3M
+  && RLS=$(Rscript -e "cat(Sys.getenv('R_LIBS_SITE'))") \
+  && strip ${RLS}/*/libs/*.so \
+  ## Clean up
+  && if [ ! -z "$PYTHON_VERSION" ]; then \
+    apt-get -y purge python3-pip; \
+    apt-get -y autoremove; \
+  fi \
+  && rm -rf /var/lib/apt/lists/* \
+    ${HOME}/.cache \
+    ${HOME}/.config \
+    ${HOME}/.local
+
+## Switch back to ${NB_USER} to avoid accidental container runs as root
+USER ${NB_USER}
+
+ENV HOME=/home/${NB_USER} \
+    ## Qt: Support running on headless computer
+    QT_QPA_PLATFORM=offscreen
+
+WORKDIR ${HOME}
+
+## Copy files as late as possible to avoid cache busting
+COPY --from=files /files /
+COPY --from=files /files/var/backups/skel ${HOME}
+
+  ## QGIS: Install plugin 'Processing Saga NextGen Provider'
+RUN mkdir -p ${HOME}/.local/share/QGIS/QGIS3/profiles/default/python/plugins \
+  && cd ${HOME}/.local/share/QGIS/QGIS3/profiles/default/python/plugins \
+  && qgis-plugin-manager init \
+  && qgis-plugin-manager update \
+  && qgis-plugin-manager install 'Processing Saga NextGen Provider'=="${PROC_SAGA_NG_VERSION:-0.0.7}" \
+  ## QGIS: Enable plugins
+  && qgis_process plugins enable processing_saga_nextgen \
+  && qgis_process plugins enable grassprovider \
+  && if [ "$(uname -m)" = "x86_64" ]; then \
+    ## QGIS: Install and enable OTB plugin
+    qgis-plugin-manager install 'OrfeoToolbox Provider'; \
+    qgis_process plugins enable orfeoToolbox_provider; \
+  fi \
+  && rm -rf .cache_qgis_plugin_manager \
+  ## Clean up
+  && rm -rf \
+    ${HOME}/.cache/QGIS \
+    ${HOME}/.cache/qgis_process_ \
+    ${HOME}/.config \
+    ${HOME}/.grass* \
+  ## Create backup of QGIS settings
+  && cp -a ${HOME}/.local/share/QGIS /var/backups/skel/.local/share
+
+ENV PYTHONPATH=${PYTHONPATH:+$PYTHONPATH:}${OTB_VERSION:+/usr/local/lib/otb/python}
diff --git a/tidyverse/4.4.2.Dockerfile b/tidyverse/4.4.2.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..b3eca496356d08dd9593cdcea4057583491962f5
--- /dev/null
+++ b/tidyverse/4.4.2.Dockerfile
@@ -0,0 +1,56 @@
+ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/base
+ARG R_VERSION=4.4.2
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}
+
+ARG NCPUS=1
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+ARG BUILD_ON_IMAGE
+ARG BUILD_START
+
+ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
+    BUILD_DATE=${BUILD_START}
+
+USER root
+
+RUN apt-get update \
+  && apt-get -y install --no-install-recommends \
+    cmake \
+    default-libmysqlclient-dev \
+    #libxml2-dev \
+    libfribidi-dev \
+    libgit2-dev \
+    libharfbuzz-dev \
+    libpq-dev \
+    libsasl2-dev \
+    libsqlite3-dev \
+    libssh2-1-dev \
+    #libtiff-dev \
+    libxtst6 \
+    unixodbc-dev \
+  && install2.r --error --skipinstalled -n $NCPUS BiocManager \
+  && install2.r --error --deps TRUE --skipinstalled -n $NCPUS \
+    tidyverse \
+    dplyr \
+    devtools \
+    formatR \
+  ## dplyr database backends
+  && install2.r --error --skipinstalled -n $NCPUS \
+    arrow \
+    duckdb \
+    fst \
+  ## Get rid of libharfbuzz-dev and its dependencies (incl. python3)
+  && apt-get -y purge libharfbuzz-dev \
+  && apt-get -y autoremove \
+  && apt-get -y install --no-install-recommends libharfbuzz-icu0 \
+  ## Strip libraries of binary packages installed from P3M
+  && RLS=$(Rscript -e "cat(Sys.getenv('R_LIBS_SITE'))") \
+  && strip ${RLS}/*/libs/*.so \
+  ## Clean up
+  && rm -rf /tmp/* \
+  && rm -rf /var/lib/apt/lists/*
+
+## Switch back to ${NB_USER} to avoid accidental container runs as root
+USER ${NB_USER}
diff --git a/verse/4.4.2.Dockerfile b/verse/4.4.2.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..9071c9f23895e2045ff26e778c2944154d7e98c9
--- /dev/null
+++ b/verse/4.4.2.Dockerfile
@@ -0,0 +1,191 @@
+ARG BUILD_ON_IMAGE=glcr.b-data.ch/jupyterlab/r/tidyverse
+ARG R_VERSION=4.4.2
+ARG CODE_BUILTIN_EXTENSIONS_DIR=/opt/code-server/lib/vscode/extensions
+ARG QUARTO_VERSION=1.6.42
+ARG CTAN_REPO=https://www.texlive.info/tlnet-archive/2025/02/28/tlnet
+
+FROM ${BUILD_ON_IMAGE}:${R_VERSION}
+
+ARG NCPUS=1
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+ARG BUILD_ON_IMAGE
+ARG CODE_BUILTIN_EXTENSIONS_DIR
+ARG QUARTO_VERSION
+ARG CTAN_REPO
+ARG CTAN_REPO_BUILD_LATEST
+ARG BUILD_START
+
+USER root
+
+ENV PARENT_IMAGE=${BUILD_ON_IMAGE}:${R_VERSION} \
+    QUARTO_VERSION=${QUARTO_VERSION} \
+    BUILD_DATE=${BUILD_START}
+
+ENV HOME=/root \
+    PATH=/opt/TinyTeX/bin/linux:/opt/quarto/bin:$PATH
+
+WORKDIR ${HOME}
+
+## Add LaTeX, rticles and bookdown support
+RUN dpkgArch="$(dpkg --print-architecture)" \
+  && apt-get update \
+  && apt-get install -y --no-install-recommends \
+    default-jdk \
+    fonts-roboto \
+    ghostscript \
+    hugo \
+    lbzip2 \
+    libbz2-dev \
+    libglpk-dev \
+    libgmp3-dev \
+    libgl1-mesa-dev \
+    libglu1-mesa-dev \
+    libharfbuzz-dev \
+    libhunspell-dev \
+    libicu-dev \
+    liblzma-dev \
+    #libpcre2-dev \
+    libmagick++-dev \
+    libopenmpi-dev \
+    libpoppler-cpp-dev \
+    librdf0-dev \
+    ## Installing libnode-dev uninstalls nodejs
+    ## https://github.com/jeroen/V8/issues/100
+    #libnode-dev \
+    librsvg2-bin \
+    qpdf \
+    texinfo \
+    ## Python: For h5py wheels (arm64)
+    libhdf5-dev \
+  ## Install R package redland
+  && install2.r --error --skipinstalled -n $NCPUS redland \
+  ## Explicitly install runtime library sub-deps of librdf0-dev
+  && apt-get install -y \
+    libcurl4-openssl-dev \
+    libxslt-dev \
+    librdf0 \
+    redland-utils \
+    rasqal-utils \
+    raptor2-utils \
+  ## Get rid of librdf0-dev and its dependencies (incl. libcurl4-gnutls-dev)
+  && apt-get -y autoremove \
+  ## Install quarto
+  && curl -sLO https://github.com/quarto-dev/quarto-cli/releases/download/v${QUARTO_VERSION}/quarto-${QUARTO_VERSION}-linux-${dpkgArch}.tar.gz \
+  && mkdir -p /opt/quarto \
+  && tar -xzf quarto-${QUARTO_VERSION}-linux-${dpkgArch}.tar.gz -C /opt/quarto --no-same-owner --strip-components=1 \
+  && rm quarto-${QUARTO_VERSION}-linux-${dpkgArch}.tar.gz \
+  ## Exempt quarto from address space limit
+  && sed -i 's/"${QUARTO_DENO}"/prlimit -v=unlimited: "${QUARTO_DENO}"/g' \
+    /opt/quarto/bin/quarto \
+  ## Remove quarto pandoc
+  && rm /opt/quarto/bin/tools/$(uname -m)/pandoc \
+  ## Link to system pandoc
+  && ln -s /usr/bin/pandoc /opt/quarto/bin/tools/$(uname -m)/pandoc \
+  ## Tell APT about the TeX Live installation
+  ## by building a dummy package using equivs
+  && apt-get install -y --no-install-recommends equivs \
+  && cd /tmp \
+  && wget https://github.com/scottkosty/install-tl-ubuntu/raw/master/debian-control-texlive-in.txt \
+  && equivs-build debian-* \
+  && mv texlive-local*.deb texlive-local.deb \
+  && dpkg -i texlive-local.deb \
+  && apt-get -y purge equivs \
+  && apt-get -y autoremove \
+  ## Admin-based install of TinyTeX
+  && CTAN_REPO_ORIG=${CTAN_REPO} \
+  && CTAN_REPO=${CTAN_REPO_BUILD_LATEST:-$CTAN_REPO} \
+  && export CTAN_REPO \
+  && wget -qO- "https://yihui.org/tinytex/install-unx.sh" \
+    | sh -s - --admin --no-path \
+  && mv ${HOME}/.TinyTeX /opt/TinyTeX \
+  && sed -i "s|${HOME}/.TinyTeX|/opt/TinyTeX|g" \
+    /opt/TinyTeX/texmf-var/fonts/conf/texlive-fontconfig.conf \
+  && ln -rs /opt/TinyTeX/bin/$(uname -m)-linux \
+    /opt/TinyTeX/bin/linux \
+  && /opt/TinyTeX/bin/linux/tlmgr path add \
+  && tlmgr update --self \
+  ## TeX packages as requested by the community
+  && curl -sSLO https://yihui.org/gh/tinytex/tools/pkgs-yihui.txt \
+  && tlmgr install $(cat pkgs-yihui.txt | tr '\n' ' ') \
+  && rm -f pkgs-yihui.txt \
+  ## TeX packages as in rocker/verse
+  && tlmgr install \
+    context \
+    pdfcrop \
+  ## TeX packages as in jupyter/scipy-notebook
+  && tlmgr install \
+    cm-super \
+    dvipng \
+  ## TeX packages specific for nbconvert
+  && tlmgr install \
+    oberdiek \
+    titling \
+  && tlmgr path add \
+  && tlmgr option repository ${CTAN_REPO_ORIG} \
+  && Rscript -e "tinytex::r_texmf()" \
+  && chown -R root:${NB_GID} /opt/TinyTeX \
+  && chmod -R g+w /opt/TinyTeX \
+  && chmod -R g+wx /opt/TinyTeX/bin \
+  ## Make the TeX Live fonts available as system fonts
+  && cp /opt/TinyTeX/texmf-var/fonts/conf/texlive-fontconfig.conf \
+    /etc/fonts/conf.d/09-texlive.conf \
+  && fc-cache -fsv \
+  && install2.r --error --skipinstalled -n $NCPUS PKI \
+  ## And some nice R packages for publishing-related stuff
+  && install2.r --error --deps TRUE --skipinstalled -n $NCPUS \
+    blogdown \
+    bookdown \
+    distill \
+    quarto \
+    rticles \
+    rJava \
+    xaringan \
+  ## Install Cairo: R Graphics Device using Cairo Graphics Library
+  ## Install magick: Advanced Graphics and Image-Processing in R
+  && install2.r --error --skipinstalled -n $NCPUS \
+    Cairo \
+    magick \
+  ## Get rid of libharfbuzz-dev
+  && apt-get -y purge libharfbuzz-dev \
+  ## Get rid of libmagick++-dev
+  && apt-get -y purge libmagick++-dev \
+  ## and their dependencies (incl. python3)
+  && apt-get -y autoremove \
+  && apt-get -y install --no-install-recommends \
+    '^libmagick\+\+-6.q16-[0-9]+$' \
+    imagemagick \
+  ## Install code-server extensions
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension quarto.quarto \
+  && code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension James-Yu.latex-workshop \
+  && if [ -n "${RSTUDIO_VERSION}" ]; then \
+    ## Check for quarto redundancy
+    if [ -d /opt/quarto ]; then \
+      ## Remove RStudio quarto
+      rm -rf /usr/lib/rstudio-server/bin/quarto; \
+      ## Link to system quarto
+      ln -s /opt/quarto /usr/lib/rstudio-server/bin/quarto; \
+    fi \
+  fi \
+  ## Strip libraries of binary packages installed from P3M
+  && RLS=$(Rscript -e "cat(Sys.getenv('R_LIBS_SITE'))") \
+  && strip ${RLS}/*/libs/*.so \
+  ## Update default PATH settings in /etc/profile.d/00-reset-path.sh
+  && sed -i 's|/opt/code-server/bin|/opt/TinyTeX/bin/linux:/opt/quarto/bin:/opt/code-server/bin|g' /etc/profile.d/00-reset-path.sh \
+  ## Clean up
+  && rm -rf /tmp/* \
+  && rm -rf /var/lib/apt/lists/* \
+    ${HOME}/.config \
+    ${HOME}/.local \
+    ${HOME}/.vscode-remote \
+    ${HOME}/.wget-hsts
+
+## Switch back to ${NB_USER} to avoid accidental container runs as root
+USER ${NB_USER}
+
+ENV CTAN_REPO=${CTAN_REPO}
+
+ENV HOME=/home/${NB_USER}
+
+WORKDIR ${HOME}