diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd31993d469c3047b5ee070cdfedb344919ebe24..5a06afd63d4f4764adb40b266ce6e97c90c63807 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -27,12 +27,8 @@ build ubuntu-18.04:
     - CACHE_FILE="/var/lib/gitlab-runner/.local/share/robofish-docker-gpu-driver-version"
     - if [[ -f $CACHE_FILE ]] && [[ "$(cat $CACHE_FILE)" == "$GPU_DRIVER_VERSION" ]]; then OPTS=''; else OPTS='--no-cache'; fi
     - echo -n $GPU_DRIVER_VERSION > $CACHE_FILE
-    - docker build $OPTS --pull -t "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:base-ubuntu18.04" -f ubuntu18.04/base/Dockerfile ubuntu18.04/base
-    - docker push "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:base-ubuntu18.04"
-    - docker build $OPTS --pull -t "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:devel-ubuntu18.04" -f ubuntu18.04/devel/Dockerfile ubuntu18.04
-    - docker push "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:devel-ubuntu18.04"
-    - docker build $OPTS --pull -t "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:cuda-devel-ubuntu18.04" -f ubuntu18.04/cuda-devel/Dockerfile ubuntu18.04
-    - docker push "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:cuda-devel-ubuntu18.04"
+    - docker build $OPTS --pull -t "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:ubuntu-18.04" -f ubuntu-18.04/Dockerfile ubuntu-18.04
+    - docker push "${CI_REGISTRY}/${CI_PROJECT_PATH,,}:ubuntu-18.04"
   after_script:
     - docker logout "${CI_REGISTRY}"
 
diff --git a/ubuntu-18.04/Dockerfile b/ubuntu-18.04/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..9919f328a132795518e83197913719b30db81ab5
--- /dev/null
+++ b/ubuntu-18.04/Dockerfile
@@ -0,0 +1,41 @@
+FROM nvidia/cudagl:10.0-runtime-ubuntu18.04
+
+LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
+LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
+
+ENV TZ=Europe/Berlin
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends software-properties-common && \
+    add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
+    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 \
+        gcc-9 g++-9 \
+        ninja-build \
+        curl \
+        git \
+        p7zip-full \
+        file \
+        nano && \
+    apt-get install -y \
+        ffmpeg \
+        python3.7 \
+        python3.7-venv \
+        python3-pip \
+        python3-setuptools \
+        python3-distutils
+
+ADD agki-nas01.imp.fu-berlin.de-ca-cert.crt /usr/local/share/ca-certificates/agki-nas01.imp.fu-berlin.de-ca-cert.crt
+RUN update-ca-certificates
+
+RUN apt-get clean
diff --git a/ubuntu18.04/base/agki-nas01.imp.fu-berlin.de-ca-cert.crt b/ubuntu-18.04/agki-nas01.imp.fu-berlin.de-ca-cert.crt
similarity index 100%
rename from ubuntu18.04/base/agki-nas01.imp.fu-berlin.de-ca-cert.crt
rename to ubuntu-18.04/agki-nas01.imp.fu-berlin.de-ca-cert.crt
diff --git a/ubuntu18.04/base/Dockerfile b/ubuntu18.04/base/Dockerfile
deleted file mode 100644
index bbc6468e214a13867a0ab6e2923f8d6f77b2a9c1..0000000000000000000000000000000000000000
--- a/ubuntu18.04/base/Dockerfile
+++ /dev/null
@@ -1,129 +0,0 @@
-FROM nvidia/cudagl:10.0-devel-ubuntu18.04
-
-LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
-LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
-
-ENV TZ=Europe/Berlin
-ENV DEBIAN_FRONTEND=noninteractive
-
-COPY qtifwsilent.qs /tmp/qtifwsilent.qs
-RUN apt-get update && \
-    apt-get install -y --no-install-recommends software-properties-common && \
-    add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
-    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 \
-        gcc-8 g++-8 \
-        ninja-build \
-        curl \
-        git \
-        p7zip-full \
-        file \
-        nano && \
-    apt-get install -y \
-        libcudnn7-dev \
-        libgfortran3 \
-        protobuf-compiler \
-        graphviz \
-        fuse \
-        ffmpeg \
-        libboost-all-dev \
-        libopenblas-dev \
-        liblapack-dev \
-        libcurl4-openssl-dev \
-        libzmq3-dev \
-        libprotobuf-dev \
-        libepoxy-dev \
-        libglm-dev \
-        libegl1-mesa-dev \
-        libcgal-dev \
-        libjsoncpp-dev \
-        libwebsocketpp-dev \
-        libfreetype6-dev \
-        libharfbuzz-dev \
-        libeigen3-dev \
-        libpulse-mainloop-glib0 \
-        libxkbcommon-x11-0 \
-        libgstreamer-plugins-base1.0-0 \
-        python3.7 \
-        python3.7-dev \
-        python3.7-venv \
-        python3-pip \
-        python3-setuptools \
-        python3-distutils && \
-    cd /tmp && \
-    curl -sSLO https://download.qt.io/official_releases/qt/5.12/5.12.4/qt-opensource-linux-x64-5.12.4.run && \
-    chmod +x qt-opensource-linux-x64-5.12.4.run && \
-    env QT_INSTALL_DIR=/opt/qt5 ./qt-opensource-linux-x64-5.12.4.run --script qtifwsilent.qs -platform minimal && \
-    rm qt-opensource-linux-x64-5.12.4.run && \
-    rm qtifwsilent.qs && \
-    curl -sSL -o /usr/local/bin/linuxdeployqt https://github.com/probonopd/linuxdeployqt/releases/download/5/linuxdeployqt-5-x86_64.AppImage && \
-    chmod +x /usr/local/bin/linuxdeployqt
-ENV Qt5_DIR /opt/qt5/5.12.4/gcc_64/lib/cmake/Qt5
-
-RUN python3.7 -m pip --no-cache-dir install \
-        graphviz \
-        opencv-python==3.4.5.20 \
-        nose \
-        nose-timer \
-        pylint \
-        requests \
-        Pillow \
-        wheel \
-        twine \
-        h5py \
-        joblib \
-        psutil
-
-RUN cd /tmp && \
-    curl -sSLO https://cmake.org/files/v3.15/cmake-3.15.4.tar.gz && \
-    tar -xf cmake-3.15.4.tar.gz && \
-    cd cmake-3.15.4 && \
-    ./configure --prefix=/usr/local && \
-    make install -j$(nproc --all) && \
-    cd .. && \
-    rm -rf cmake-3.15.4*
-
-COPY hdf5-1.10.2-no-trailing-attributes.patch /tmp
-RUN cd /tmp && \
-    curl -sSLO https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.2/src/hdf5-1.10.2.tar.bz2 && \
-    tar -xf hdf5-1.10.2.tar.bz2 && \
-    cd hdf5-1.10.2 && \
-    patch -p1 -i /tmp/hdf5-1.10.2-no-trailing-attributes.patch && \
-    cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -G Ninja && \
-    ninja -C build install && \
-    cd .. && \
-    rm -rf hdf5-1.10.2*
-
-RUN cd /tmp && \
-    curl -sSLO https://github.com/pybind/pybind11/archive/v2.3.0.tar.gz && \
-    tar -xf v2.3.0.tar.gz && \
-    cd pybind11-2.3.0 && \
-    cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DPYBIND11_TEST=off -G Ninja && \
-    ninja -C build install && \
-    cd .. && \
-    rm -f v2.3.0.tar.gz && \
-    rm -rf pybind11-2.3.0
-
-RUN cd /tmp && \
-    curl -sSLO https://github.com/rpclib/rpclib/archive/v2.2.1.tar.gz && \
-    tar -xf v2.2.1.tar.gz && \
-    cd rpclib-2.2.1 && \
-    cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -G Ninja && \
-    ninja -C build install && \
-    cd .. && \
-    rm -f v2.2.1.tar.gz && \
-    rm -rf rpclib-2.2.1
-
-ADD agki-nas01.imp.fu-berlin.de-ca-cert.crt /usr/local/share/ca-certificates/agki-nas01.imp.fu-berlin.de-ca-cert.crt
-RUN update-ca-certificates
-
-RUN apt-get clean
diff --git a/ubuntu18.04/base/hdf5-1.10.2-no-trailing-attributes.patch b/ubuntu18.04/base/hdf5-1.10.2-no-trailing-attributes.patch
deleted file mode 100644
index 5da079e5d8308591b225f07adfb187b3addfad72..0000000000000000000000000000000000000000
--- a/ubuntu18.04/base/hdf5-1.10.2-no-trailing-attributes.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-Attributes must preceed function declarator
---- a/src/H5detect.c
-+++ b/src/H5detect.c
-@@ -1360,8 +1360,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C89_integers(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C89_integers(void)
- {
-     DETECT_BYTE(signed char,      SCHAR,        d_g[nd_g]); nd_g++;
-     DETECT_BYTE(unsigned char,      UCHAR,        d_g[nd_g]); nd_g++;
-@@ -1388,8 +1388,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C89_floats(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C89_floats(void)
- {
-     DETECT_F(float,     FLOAT,      d_g[nd_g]); nd_g++;
-     DETECT_F(double,    DOUBLE,     d_g[nd_g]); nd_g++;
-@@ -1410,8 +1410,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C99_integers8(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C99_integers8(void)
- {
- #if H5_SIZEOF_INT8_T>0
-   #if H5_SIZEOF_INT8_T==1
-@@ -1472,8 +1472,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C99_integers16(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C99_integers16(void)
- {
- #if H5_SIZEOF_INT16_T>0
-     DETECT_I(int16_t,           INT16,        d_g[nd_g]); nd_g++;
-@@ -1510,8 +1510,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C99_integers32(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C99_integers32(void)
- {
- #if H5_SIZEOF_INT32_T>0
-     DETECT_I(int32_t,           INT32,        d_g[nd_g]); nd_g++;
-@@ -1548,8 +1548,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C99_integers64(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C99_integers64(void)
- {
- #if H5_SIZEOF_INT64_T>0
-     DETECT_I(int64_t,           INT64,        d_g[nd_g]); nd_g++;
-@@ -1599,8 +1599,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C99_integers(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C99_integers(void)
- {
-     /* break it down to more subroutines so that each module subroutine */
-     /* is smaller and takes less time to compile with optimization on.  */
-@@ -1625,8 +1625,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_C99_floats(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_C99_floats(void)
- {
- #if H5_SIZEOF_DOUBLE == H5_SIZEOF_LONG_DOUBLE
-     /*
-@@ -1656,8 +1656,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--static void
--detect_alignments(void) HDF_NO_UBSAN
-+static void HDF_NO_UBSAN
-+detect_alignments(void)
- {
-     /* Detect structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */
-     DETECT_M(void *,              POINTER,      m_g[na_g]); na_g++;
-@@ -1744,8 +1744,8 @@
-  *
-  *-------------------------------------------------------------------------
-  */
--int
--main(void) HDF_NO_UBSAN
-+int HDF_NO_UBSAN
-+main(void)
- {
- 
- #if defined(H5_HAVE_SETSYSINFO) && defined(SSI_NVPAIRS)
diff --git a/ubuntu18.04/base/qtifwsilent.qs b/ubuntu18.04/base/qtifwsilent.qs
deleted file mode 100644
index 429a7928bd968010f6204efc695a68f79b8e4669..0000000000000000000000000000000000000000
--- a/ubuntu18.04/base/qtifwsilent.qs
+++ /dev/null
@@ -1,51 +0,0 @@
-function Controller() {
-    installer.autoRejectMessageBoxes();
-    installer.installationFinished.connect(function() {
-        gui.clickButton(buttons.NextButton);
-    })
-}
-
-Controller.prototype.WelcomePageCallback = function() {
-    gui.clickButton(buttons.NextButton, 7000);
-}
-
-Controller.prototype.CredentialsPageCallback = function() {
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.IntroductionPageCallback = function() {
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.TargetDirectoryPageCallback = function() {
-    gui.currentPageWidget().TargetDirectoryLineEdit.setText(installer.environmentVariable("QT_INSTALL_DIR"));
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.ComponentSelectionPageCallback = function() {
-    var widget = gui.currentPageWidget();
-    widget.deselectAll();
-    widget.selectComponent("qt.qt5.5124.gcc_64");
-    widget.selectComponent("qt.qt5.5124.qtcharts");
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.LicenseAgreementPageCallback = function() {
-    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.StartMenuDirectoryPageCallback = function() {
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.ReadyForInstallationPageCallback = function() {
-    gui.clickButton(buttons.NextButton);
-}
-
-Controller.prototype.FinishedPageCallback = function() {
-    var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm;
-    if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox)
-        checkBoxForm.launchQtCreatorCheckBox.checked = false;
-    gui.clickButton(buttons.FinishButton);
-}
diff --git a/ubuntu18.04/cuda-devel/Dockerfile b/ubuntu18.04/cuda-devel/Dockerfile
deleted file mode 100644
index 6da21ecd0330346e67c239114743f4e51e9f6339..0000000000000000000000000000000000000000
--- a/ubuntu18.04/cuda-devel/Dockerfile
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:base-ubuntu18.04
-
-# NOTE: This still uses prebuild non-CUDA OpenCV. Compile OpenCV from source if CUDA support in OpenCV is required.
-RUN apt-get update && \
-    apt-get install -y libopencv-dev && \
-    cd /opt && \
-    curl -sSLO https://github.com/apache/incubator-mxnet/releases/download/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz && \
-    tar -xf apache-mxnet-src-1.5.1-incubating.tar.gz --owner root --group root --no-same-owner && \
-    rm -f apache-mxnet-src-1.5.1-incubating.tar.gz && \
-    mv apache-mxnet-src-1.5.1-incubating mxnet-1.5.1 && \
-    cd mxnet-1.5.1 && \
-    cmake -Bbuild -H. \
-        -DCMAKE_CXX_STANDARD=14 -DUSE_CXX14_IF_AVAILABLE=ON \
-        -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
-        -DUSE_CUDA=ON -DUSE_CUDNN=ON -DUSE_NCCL=ON \
-        -DUSE_OPENCV=ON -DUSE_OPENMP=ON \
-        -DUSE_LAPACK=ON -DUSE_MKL_IF_AVAILABLE=OFF \
-        -DUSE_DIST_KVSTORE=ON \
-        -DUSE_CPP_PACKAGE=ON \
-        -DUSE_SIGNAL_HANDLER=ON \
-        -DENABLE_CUDA_RTC=ON \
-        -DBUILD_CPP_EXAMPLES=OFF \
-        -DUSE_GPERFTOOLS=OFF \
-        -DUSE_JEMALLOC=OFF \
-        -G Ninja && \
-    ninja -C build && \
-    cd python && \
-    python3.7 setup.py install && \
-    apt-get clean
-ENV MXNet_DIR /opt/mxnet-1.5.1
diff --git a/ubuntu18.04/devel/Dockerfile b/ubuntu18.04/devel/Dockerfile
deleted file mode 100644
index eb742f24ce1e2cb29d2c63d1ee20ca4ef2958168..0000000000000000000000000000000000000000
--- a/ubuntu18.04/devel/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:base-ubuntu18.04
-
-RUN apt-get update && \
-    apt-get install -y libopencv-dev && \
-    cd /opt && \
-    curl -sSLO https://github.com/apache/incubator-mxnet/releases/download/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz && \
-    tar -xf apache-mxnet-src-1.5.1-incubating.tar.gz --owner root --group root --no-same-owner && \
-    rm -f apache-mxnet-src-1.5.1-incubating.tar.gz && \
-    mv apache-mxnet-src-1.5.1-incubating mxnet-1.5.1 && \
-    cd mxnet-1.5.1 && \
-    cmake -Bbuild -H. \
-        -DCMAKE_CXX_STANDARD=14 -DUSE_CXX14_IF_AVAILABLE=ON \
-        -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
-        -DUSE_CUDA=OFF -DUSE_CUDNN=OFF -DUSE_NCCL=OFF \
-        -DUSE_OPENCV=ON -DUSE_OPENMP=ON \
-        -DUSE_LAPACK=ON -DUSE_MKL_IF_AVAILABLE=OFF \
-        -DUSE_DIST_KVSTORE=ON \
-        -DUSE_CPP_PACKAGE=ON \
-        -DUSE_SIGNAL_HANDLER=ON \
-        -DENABLE_CUDA_RTC=OFF \
-        -DBUILD_CPP_EXAMPLES=OFF \
-        -DUSE_GPERFTOOLS=OFF \
-        -DUSE_JEMALLOC=OFF \
-        -G Ninja && \
-    ninja -C build && \
-    cd python && \
-    python3.7 setup.py install && \
-    apt-get clean
-ENV MXNet_DIR /opt/mxnet-1.5.1