diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..73976608226406fb3172844aba6097810a89d584
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,103 @@
+
+stages:
+  - build-and-test
+
+
+.build-and-test:
+
+  cache:
+    # https://docs.gitlab.com/ee/ci/caching/#share-caches-across-jobs-in-different-branches
+    key: one-key-to-rule-them-all
+    paths:
+      - .apt
+      - .ccache
+
+  before_script:
+    # Apt cache configuration.
+    - rm -rf /var/cache/apt/archives || true
+    - rm -f /etc/apt/apt.conf.d/docker-clean  # Remove docker-clean script to avoid cache deletion.
+    - mkdir .apt || true
+    - ln -s "$CI_PROJECT_DIR/.apt" /var/cache/apt/archives
+
+    # Update apt info.
+    - apt-get update
+
+    # Ccache configuration and introspection.
+    - apt-get install ccache --yes
+    - ccache --set-config=cache_dir="$CI_PROJECT_DIR/.ccache"
+    - 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
+
+  script:
+    # Create workspace.
+    - axii workspace create ~/workspace workspace
+    - axii workspace activate workspace
+    - _axii_auto_env_refresh
+
+    # Use workspace configuration from project.
+    - cp "$CI_PROJECT_DIR/.gitlab/ci/armarx-workspace.json" "$ARMARX_WORKSPACE/armarx-workspace.json"
+    - cat "$ARMARX_WORKSPACE/armarx-workspace.json"
+
+    - axii workspace env
+    - _axii_auto_env_refresh
+
+    - echo "Workspace information:"
+    - axii workspace list-modules
+    - axii workspace list-modules --deps
+    - axii workspace info
+
+    - export PROJECT_MODULE="armarx/RobotAPI"
+    - export PROJECT_PATH_IN_WORKSPACE="$armarx__RobotAPI__PATH"
+
+    # Symlink project directory into Axii workspace.
+    - mkdir -p "$(dirname $PROJECT_PATH_IN_WORKSPACE)"
+    - ln -s "$CI_PROJECT_DIR" "$PROJECT_PATH_IN_WORKSPACE"
+
+    # Fix "CMake Error in CMakeLists.txt: Imported target "VirtualRobot" includes non-existent path "/usr/lib/include"
+    # (caused by at least dmp)
+    - mkdir -p /usr/lib/include
+
+    # Upgrade.
+    - axii workspace system --accept-apt-install
+    - axii workspace update --prefer-https
+    - axii workspace upgrade -m "$PROJECT_MODULE"
+
+    - 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"
+    - ctest --output-on-failure --output-junit "$CI_PROJECT_DIR/report.xml" .
+
+  artifacts:
+    reports:
+      junit: report.xml
+
+
+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
+
+
+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
diff --git a/.gitlab/ci/armarx-workspace.json b/.gitlab/ci/armarx-workspace.json
new file mode 100644
index 0000000000000000000000000000000000000000..ae5ce8a95c44efa6def8c0525c11708a114a1429
--- /dev/null
+++ b/.gitlab/ci/armarx-workspace.json
@@ -0,0 +1,17 @@
+{
+  "modules": {
+    "tools/ccache/default": {},
+    "armarx/RobotAPI": {}
+  },
+  "global": {
+    "prepare": {
+      "cmake": {
+        "definitions": {
+          "CMAKE_BUILD_TYPE": "RelWithDebInfo",
+          "CMAKE_C_COMPILER_LAUNCHER": "$CCACHE",
+          "CMAKE_CXX_COMPILER_LAUNCHER": "$CCACHE"
+        }
+      }
+    }
+  }
+}
diff --git a/source/RobotAPI/libraries/ArmarXObjects/test/ArmarXObjectsTest.cpp b/source/RobotAPI/libraries/ArmarXObjects/test/ArmarXObjectsTest.cpp
index 433fc67ec7890cbb7fede64d2edda22533e46eb8..4a775da39159a8e0a8435f88679368b3cf39a0dc 100644
--- a/source/RobotAPI/libraries/ArmarXObjects/test/ArmarXObjectsTest.cpp
+++ b/source/RobotAPI/libraries/ArmarXObjects/test/ArmarXObjectsTest.cpp
@@ -24,13 +24,15 @@
 
 #define ARMARX_BOOST_TEST
 
-#include <RobotAPI/Test.h>
 #include "../ArmarXObjects.h"
 
 #include <iostream>
 
-#include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
+#include <ArmarXCore/core/system/cmake/CMakePackageFinder.h>
+
+#include <RobotAPI/Test.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h>
+#include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h>
 
 
 namespace fs = std::filesystem;
@@ -38,7 +40,6 @@ namespace fs = std::filesystem;
 
 BOOST_AUTO_TEST_SUITE(arondto_ObjectPose_test)
 
-
 BOOST_AUTO_TEST_CASE(test_ObjectType_copy_assignment)
 {
     BOOST_TEST_MESSAGE("Constructor");
@@ -76,17 +77,25 @@ BOOST_AUTO_TEST_CASE(test_ObjectPose_copy_assignment)
 BOOST_AUTO_TEST_SUITE_END()
 
 
-
 BOOST_AUTO_TEST_SUITE(ObjectFinderTest)
 
-
 BOOST_AUTO_TEST_CASE(test_find)
 {
     using namespace armarx;
 
+    {
+        armarx::CMakePackageFinder packageFinder(ObjectFinder::DefaultObjectsPackageName);
+        if (not packageFinder.packageFound())
+        {
+            // Do not test further.
+            BOOST_CHECK(true);
+            return;
+        }
+    }
+
     ObjectFinder finder;
 
-    bool checkPaths = false;
+    const bool checkPaths = false;
     std::vector<ObjectInfo> objects = finder.findAllObjects(checkPaths);
     BOOST_CHECK_GT(objects.size(), 0);
 
@@ -106,5 +115,4 @@ BOOST_AUTO_TEST_CASE(test_find)
 }
 
 
-
 BOOST_AUTO_TEST_SUITE_END()