diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 73976608226406fb3172844aba6097810a89d584..0cb6e600c738cb498050b31f5b54d5ac5827190d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
-
 stages:
   - build-and-test
+  - deploy
+  - post-deploy-test
 
 
 .build-and-test:
@@ -28,18 +29,12 @@ stages:
     - ccache --max-size=20G
     - ccache --show-stats
 
-    # Ice configuration to run in Docker.
-    - export ICE_DEFAULT_HOST="127.0.0.1"
-    - export ICE_RUN_AS_ROOT="true"
-
     # Activate Axii.
     - source /axii/scripts/install_axii.sh
+    - _axii_auto_env_refresh
 
   script:
-    # Create workspace.
-    - axii workspace create ~/workspace workspace
-    - axii workspace activate workspace
-    - _axii_auto_env_refresh
+    - echo "ArmarX Workspace = '$ARMARX_WORKSPACE'"
 
     # Use workspace configuration from project.
     - cp "$CI_PROJECT_DIR/.gitlab/ci/armarx-workspace.json" "$ARMARX_WORKSPACE/armarx-workspace.json"
@@ -71,14 +66,6 @@ stages:
 
     - ccache --show-stats
 
-    # Try starting Ice.
-    - armarx switch docker_test --ice-host 127.0.0.1 --ice-port 10000 --ice-default-host 127.0.0.1 --mongo-host 127.0.0.1 --mongo-port 10001
-    - armarx profile
-    - armarx status || true
-    #- armarx start
-    # armarx status
-    #- armarx stop
-
     # Test.
     # ToDo: Add and use `axii ws test -m "$PROJECT_MODULE"`
     - cd "$PROJECT_PATH_IN_WORKSPACE/build"
@@ -93,11 +80,91 @@ build-and-test-bionic:
   stage: build-and-test
   extends: .build-and-test
 
-  image: git.h2t.iar.kit.edu:5050/sw/armarx/meta/axii:latest-bionic
+  image: git.h2t.iar.kit.edu:5050/sw/armarx/armarx-gui:latest-bionic
 
 
 build-and-test-jammy:
   stage: build-and-test
   extends: .build-and-test
 
-  image: git.h2t.iar.kit.edu:5050/sw/armarx/meta/axii:latest-jammy
+  image: git.h2t.iar.kit.edu:5050/sw/armarx/armarx-gui:latest-jammy
+
+
+docker-bionic:
+  stage: deploy
+  needs: ["build-and-test-bionic"]
+  image:
+    name: gcr.io/kaniko-project/executor:v1.9.0-debug
+    entrypoint: [""]
+  script:
+    - /kaniko/executor
+      --context "${CI_PROJECT_DIR}"
+      --dockerfile "${CI_PROJECT_DIR}/docker/bionic"
+      --destination "${CI_REGISTRY_IMAGE}:latest-bionic"
+
+  rules:
+    - if: $CI_COMMIT_BRANCH == "master"
+
+
+docker-jammy:
+  stage: deploy
+  needs: ["build-and-test-jammy"]
+  image:
+    name: gcr.io/kaniko-project/executor:v1.9.0-debug
+    entrypoint: [""]
+  script:
+    - /kaniko/executor
+      --context "${CI_PROJECT_DIR}"
+      --dockerfile "${CI_PROJECT_DIR}/docker/jammy"
+      --destination "${CI_REGISTRY_IMAGE}:latest-jammy"
+
+  rules:
+    - if: $CI_COMMIT_BRANCH == "master"
+
+
+.test-docker-image-common:
+
+  before_script:
+    - source /axii/scripts/install_axii.sh
+    - _axii_auto_env_refresh
+
+  script:
+    - echo "ArmarX Workspace = '$ARMARX_WORKSPACE'"
+    - printenv
+
+    - axii workspace list-modules
+    - axii workspace list-modules --deps
+    - axii workspace info
+    - echo "RobotAPI directory = '$RobotAPI_DIR'"
+
+    - which armarx
+    - which armarx-package
+
+    - armarx switch docker_test --ice-host 127.0.0.1 --ice-port 10000 --ice-default-host 127.0.0.1 --mongo-host 127.0.0.1 --mongo-port 10001
+    - armarx profile
+    - armarx status || true
+
+    - cd $ArmarXGui_DIR
+    - ctest --output-on-failure .
+
+
+test-docker-image-bionic:
+  stage: post-deploy-test
+  needs: ["docker-bionic"]
+  extends: .test-docker-image-common
+
+  image: git.h2t.iar.kit.edu:5050/sw/armarx/robot-api:latest-bionic
+
+  rules:
+    - if: $CI_COMMIT_BRANCH == "master"
+
+
+test-docker-image-jammy:
+  stage: post-deploy-test
+  needs: ["docker-jammy"]
+  extends: .test-docker-image-common
+
+  image: git.h2t.iar.kit.edu:5050/sw/armarx/robot-api:latest-jammy
+
+  rules:
+    - if: $CI_COMMIT_BRANCH == "master"
diff --git a/docker/armarx-workspace.json b/docker/armarx-workspace.json
new file mode 100644
index 0000000000000000000000000000000000000000..7052317cebc5fc6d5def5789b2da698583a252f4
--- /dev/null
+++ b/docker/armarx-workspace.json
@@ -0,0 +1,14 @@
+{
+  "modules": {
+    "armarx/RobotAPI": {}
+  },
+  "global": {
+    "prepare": {
+      "cmake": {
+        "definitions": {
+          "CMAKE_BUILD_TYPE": "RelWithDebInfo"
+        }
+      }
+    }
+  }
+}
diff --git a/docker/bionic b/docker/bionic
new file mode 100644
index 0000000000000000000000000000000000000000..66e01cea105fa3c1f84f0592df96f7fecd93d40f
--- /dev/null
+++ b/docker/bionic
@@ -0,0 +1,24 @@
+FROM git.h2t.iar.kit.edu:5050/sw/armarx/armarx-gui:latest-bionic
+
+# Setup environment.
+SHELL ["/bin/bash", "-c"]
+
+# Setup apt environment.
+RUN apt-get -qq update
+
+# Setup repository in Docker.
+WORKDIR $ARMARX_WORKSPACE/armarx/RobotAPI
+COPY --chmod=755 . .
+
+# Use workspace config.
+COPY docker/armarx-workspace.json $ARMARX_WORKSPACE/armarx-workspace.json
+
+# Fix "CMake Error in CMakeLists.txt: Imported target "VirtualRobot" includes non-existent path "/usr/lib/include"
+# (caused by at least dmp)
+RUN mkdir -p /usr/lib/include
+
+# Run the upgrade.
+RUN axii workspace system --accept-apt-install
+# ToDo: Prevent this from updating the target itself.
+RUN axii workspace update --prefer-https
+RUN axii workspace upgrade
diff --git a/docker/jammy b/docker/jammy
new file mode 100644
index 0000000000000000000000000000000000000000..1eef819fef3a422d72cc063ff21054897d313ab0
--- /dev/null
+++ b/docker/jammy
@@ -0,0 +1,20 @@
+FROM git.h2t.iar.kit.edu:5050/sw/armarx/armarx-gui:latest-jammy
+
+# Setup environment.
+SHELL ["/bin/bash", "-c"]
+
+# Setup apt environment.
+RUN apt-get -qq update
+
+# Setup repository in Docker.
+WORKDIR $ARMARX_WORKSPACE/armarx/RobotAPI
+COPY --chmod=755 . .
+
+# Use workspace config.
+COPY docker/armarx-workspace.json $ARMARX_WORKSPACE/armarx-workspace.json
+
+# Run the upgrade.
+RUN axii workspace system --accept-apt-install
+# ToDo: Prevent this from updating the target itself.
+RUN axii workspace update --prefer-https
+RUN axii workspace upgrade