diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f9c46a2e2e5081e5a5151dd761d83ccc027ae8f9..e1600dda2ebb8df6868d8a1bad2121c4fc74c4b5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,16 +2,27 @@ stages:
   - build
   - deploy
 
-build ubuntu:
+"build: [cuda-10]":
   stage: build
   tags: [linux, shell]
   script:
     - image_name="${CI_REGISTRY}/${CI_PROJECT_PATH,,}"
-    - podman build --cgroup-manager=cgroupfs --pull -t "${image_name}/ubuntu" ubuntu
-    - podman build --cgroup-manager=cgroupfs -t "${image_name}/jupyterhub" jupyterhub/base
-    - podman build --cgroup-manager=cgroupfs -t "${image_name}/jupyterhub_vim" jupyterhub/vim
+    - cuda_tag="cuda-10"
+    - podman build --cgroup-manager=cgroupfs --pull -t "${image_name}/ubuntu:${cuda_tag}" -f ubuntu/cuda-10/Dockerfile ubuntu
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub:${cuda_tag}" jupyterhub/base
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub_vim:${cuda_tag}" jupyterhub/vim
 
-deploy ubuntu:
+"build: [cuda-11]":
+  stage: build
+  tags: [linux, shell]
+  script:
+    - image_name="${CI_REGISTRY}/${CI_PROJECT_PATH,,}"
+    - cuda_tag="cuda-11"
+    - podman build --cgroup-manager=cgroupfs --pull -t "${image_name}/ubuntu:${cuda_tag}" -f ubuntu/cuda-11/Dockerfile ubuntu
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub:${cuda_tag}" jupyterhub/base
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub_vim:${cuda_tag}" jupyterhub/vim
+
+deploy:
   stage: deploy
   tags: [linux, shell]
   only:
@@ -22,13 +33,23 @@ deploy ubuntu:
     - image_name="${CI_REGISTRY}/${CI_PROJECT_PATH,,}"
     - podman push "${image_name}/ubuntu"
     - calver="$(date -u +'%Y%m%dT%H%MZ')"
-    - podman tag "${image_name}/jupyterhub" "${image_name}/jupyterhub:$calver"
-    - podman push "${image_name}/jupyterhub:$calver"
-    - podman image rm "${image_name}/jupyterhub:$calver"
-    - docker pull "${image_name}/jupyterhub:$calver"
-    - podman tag "${image_name}/jupyterhub_vim" "${image_name}/jupyterhub_vim:$calver"
-    - podman push "${image_name}/jupyterhub_vim:$calver"
-    - podman image rm "${image_name}/jupyterhub_vim:$calver"
-    - docker pull "${image_name}/jupyterhub_vim:$calver"
+    - cuda_tag="cuda-10"
+    - podman tag "${image_name}/jupyterhub:${cuda_tag}" "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman tag "${image_name}/jupyterhub_vim:${cuda_tag}" "${image_name}/jupyterhub_vim:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - cuda_tag="cuda-11"
+    - podman tag "${image_name}/jupyterhub:${cuda_tag}" "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman tag "${image_name}/jupyterhub_vim:${cuda_tag}" "${image_name}/jupyterhub_vim:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
   after_script:
     - podman logout "${CI_REGISTRY}"
diff --git a/jupyterhub/base/Dockerfile b/jupyterhub/base/Dockerfile
index d298e15a2382b401141ccf165556f00c4f620f18..ca8a0c06bc669d4926542df2a863f5b00fcb7501 100755
--- a/jupyterhub/base/Dockerfile
+++ b/jupyterhub/base/Dockerfile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: Apache-2.0
-FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/ubuntu
+ARG CUDA_TAG
+FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/ubuntu:${CUDA_TAG}
 
 LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
 LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
diff --git a/jupyterhub/vim/Dockerfile b/jupyterhub/vim/Dockerfile
index 7db424368d55bba8636ddb1f7477d50783029267..daca3bcc7c53f0e273a2ed5648c887edd2351c14 100755
--- a/jupyterhub/vim/Dockerfile
+++ b/jupyterhub/vim/Dockerfile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: Apache-2.0
-FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/jupyterhub
+ARG CUDA_TAG
+FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/jupyterhub:${CUDA_TAG}
 
 LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
 LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
diff --git a/ubuntu/Dockerfile b/ubuntu/cuda-10/Dockerfile
similarity index 100%
rename from ubuntu/Dockerfile
rename to ubuntu/cuda-10/Dockerfile
diff --git a/ubuntu/cuda-11/Dockerfile b/ubuntu/cuda-11/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..31e4bf517dff8c56aa327043cea6a9728aeb1d0c
--- /dev/null
+++ b/ubuntu/cuda-11/Dockerfile
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: Apache-2.0
+
+ARG UBUNTU_VERSION=18.04
+ARG CUDA_VERSION=11.3.0
+FROM nvidia/cudagl:${CUDA_VERSION}-base-ubuntu${UBUNTU_VERSION}
+ENV CUDA ${CUDA_VERSION}
+
+LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
+LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
+
+ARG TZ=Europe/Berlin
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends apt-utils >/dev/null 2>&1 && \
+    apt-get install -y --no-install-recommends software-properties-common && \
+    apt-get update && \
+    apt-get install -y locales && \
+    locale-gen en_US.UTF-8 && \
+    echo $TZ > /etc/timezone && \
+    apt-get install -y tzdata && \
+    rm /etc/localtime && \
+    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
+    dpkg-reconfigure -f noninteractive tzdata && \
+    apt-get install -y --no-install-recommends \
+        build-essential \
+        pkg-config \
+        git \
+        file \
+        nano \
+        zip \
+        unzip \
+        curl \
+        wget \
+        rsync \
+        && \
+    apt-get install -y \
+        python3-dev \
+        python3-pip \
+        python3-venv \
+        python3-setuptools \
+        python3-distutils \
+        && \
+    apt-get clean
+
+ARG CUDNN_VERSION=8.2.0.53-1
+ENV CUDNN ${CUDNN_VERSION}
+
+ARG CUDNN_MAJOR_VERSION=8
+ENV CUDNN_MAJOR_VERSION ${CUDNN_MAJOR_VERSION}
+
+ARG LIBNVINFER_VERSION=8.0.0-1
+ARG LIBNVINFER_MAJOR_VERSION=8
+
+ENV CUDA_TOOLKIT_PATH /usr/local/cuda
+
+RUN /bin/bash -c "apt-get update && \
+    CUDA_VERSION=\${CUDA%.*} && \
+    apt-get install -y --no-install-recommends \
+        cuda-command-line-tools-\${CUDA_VERSION//./-} \
+        libcublas-dev-\${CUDA_VERSION//./-} \
+        cuda-nvrtc-dev-\${CUDA_VERSION//./-} \
+        cuda-cudart-dev-\${CUDA_VERSION//./-} \
+        libcufft-dev-\${CUDA_VERSION//./-} \
+        libcurand-dev-\${CUDA_VERSION//./-} \
+        libcusolver-dev-\${CUDA_VERSION//./-} \
+        libcusparse-dev-\${CUDA_VERSION//./-} \
+        libcudnn\${CUDNN_MAJOR_VERSION}-dev=\${CUDNN}+cuda\${CUDA_VERSION} \
+        && \
+    find /usr/local/cuda-\${CUDA_VERSION}/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \
+    rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v\${CUDNN_MAJOR_VERSION}.a && \
+    apt-get install -y --no-install-recommends \
+        libnvinfer\${LIBNVINFER_MAJOR_VERSION}=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION} \
+        libnvinfer-dev=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION} \
+        libnvinfer-plugin-dev=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION} \
+        libnvinfer-plugin\${LIBNVINFER_MAJOR_VERSION}=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION}"
+
+RUN apt-get update && \
+    apt-get install -y \
+        libglu1-mesa \
+        libjpeg62 \
+        liborc-0.4 \
+        ffmpeg \
+        && \
+    apt-get clean
+
+COPY pip.conf /etc/
+
+ENV PYTHON_VERSION=3.8
+ENV PYTHON_PIP_VERSION=20.2.3
+ENV PYTHON_SETUPTOOLS_VERSION=50.3.0
+
+RUN apt-get install -y \
+        python${PYTHON_VERSION} \
+        python${PYTHON_VERSION}-dev \
+        python${PYTHON_VERSION}-venv \
+        && \
+    apt-get clean && \
+    python${PYTHON_VERSION} -m pip install --upgrade \
+        pip==${PYTHON_PIP_VERSION} \
+        setuptools==${PYTHON_SETUPTOOLS_VERSION}