diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1b03623e38ee8b71b789f7ad8a97c2572bae416f..c960f0f0119c294b0a1969e81f7ec39eaed719b4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,39 +1,50 @@
 image: maven:3.9.9-eclipse-temurin-21-alpine
 
 variables:
-  MAVEN_DEPLOY_CLI_OPTS: "--no-transfer-progress -DskipTests"
   MAVEN_CLI_OPTS: >-
     -s .m2/ci_settings.xml --batch-mode
     -Dmaven.plugin.validation=brief
   DOCKER_HOST: tcp://docker:2375
   DOCKER_TLS_CERTDIR: ""
   DOCKER_DRIVER: overlay2
+  NEXUS_IMAGE_REGISTRY_URL: docker.ozg-sh.de
 
 services:
   - docker:24.0.5-dind
 
-cache:
-  paths:
-    - .m2/repository/
-    - target/
-
 stages:
   - build
   - test
   - publish
 
-package:
-  stage: build
-  script:
-    - mvn clean package -DskipTests=true $MAVEN_CLI_OPTS
-  artifacts:
-    paths:
-      - target/*.jar
-
-test:
-  stage: test
-  script:
-    - mvn test $MAVEN_CLI_OPTS
+include:
+  # Maven Build, Test and Verify
+  - component: $CI_SERVER_FQDN/ozg-cloud/devops/ci-components/maven_build@main
+    inputs:
+      maven_cli_options: $MAVEN_CLI_OPTS
+      build_stage: build
+      test_stage: test
+  # Maven Deploy for MR, Snapshot and Release to GitLab
+  - component: $CI_SERVER_FQDN/ozg-cloud/devops/ci-components/maven_deploy@main
+    inputs:
+      job_prefix: gitlab
+      stage: publish
+      maven_cli_options: >-
+        -s .m2/ci_settings.xml --batch-mode
+        -Dmaven.plugin.validation=brief
+      maven_profile: "-Pgitlab-deploy"
+      image_registry: $CI_REGISTRY_IMAGE
+  # Maven Deploy for MR, Snapshot and Release to Nexus
+  - component: $CI_SERVER_FQDN/ozg-cloud/devops/ci-components/maven_deploy@main
+    inputs:
+      job_prefix: nexus
+      stage: publish
+      maven_cli_options: >-
+        -s .m2/ci_settings.xml --batch-mode
+        -Dmaven.plugin.validation=brief
+      maven_profile: "-Pnexus-deploy"
+      image_registry: $NEXUS_IMAGE_REGISTRY_URL
+      append_artifact_id_to_registry: true
 
 .helm:
   before_script:
@@ -50,42 +61,11 @@ test-helm:
   script:
     - sh run_helm_test.sh
 
-verify:
-  stage: test
-  script:
-    - mvn verify $MAVEN_CLI_OPTS
-
 .get-version:
   before_script:
     - export PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout $MAVEN_CLI_OPTS | cut -d'-' -f1)
-    - export PROJECT_ARTIFACTID=$(mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout $MAVEN_CLI_OPTS)
-    - export NEXUS_IMAGE_PREFIX="docker.ozg-sh.de/${PROJECT_ARTIFACTID}"
-    - export MERGE_REQUEST_TAG="${PROJECT_VERSION}-MR-${CI_MERGE_REQUEST_IID}"
-    - export SNAPSHOT_TAG="${PROJECT_VERSION}-${CI_COMMIT_BRANCH}"
 
 # Merge request jobs
-push-merge-request-image-gitlab:
-  stage: publish
-  extends: .get-version
-  script:
-    - export PRIMARY_IMAGE_TAG=${MERGE_REQUEST_TAG}
-    - export IMAGE_TAGS="${CI_REGISTRY_IMAGE}:${MERGE_REQUEST_TAG},${CI_REGISTRY_IMAGE}:${MERGE_REQUEST_TAG}-${CI_COMMIT_SHORT_SHA}"
-    - mvn deploy -Pgitlab-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS
-  rules:
-    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
-      when: manual
-
-push-merge-request-image-nexus:
-  stage: publish
-  extends: .get-version
-  script:
-    - export PRIMARY_IMAGE_TAG=${MERGE_REQUEST_TAG}
-    - export IMAGE_TAGS="${NEXUS_IMAGE_PREFIX}:${MERGE_REQUEST_TAG},${NEXUS_IMAGE_PREFIX}:${MERGE_REQUEST_TAG}-${CI_COMMIT_SHORT_SHA}"
-    - mvn deploy -Pnexus-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS
-  rules:
-    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
-  when: manual
-
 push-merge-request-helm-nexus:
   stage: publish
   variables:
@@ -118,26 +98,6 @@ push-keystore-assembler-image-nexus:
     - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
 
 # Snapshot jobs
-push-snapshot-image-gitlab:
-  stage: publish
-  extends: .get-version
-  script:
-    - export PRIMARY_IMAGE_TAG=${SNAPSHOT_TAG}
-    - export IMAGE_TAGS="${CI_REGISTRY_IMAGE}:${SNAPSHOT_TAG},${CI_REGISTRY_IMAGE}:${SNAPSHOT_TAG}-${CI_COMMIT_SHORT_SHA},${CI_REGISTRY_IMAGE}:snapshot-latest"
-    - mvn deploy -Pgitlab-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS
-  only:
-    - main
-
-push-snapshot-image-nexus:
-  stage: publish
-  extends: .get-version
-  script:
-    - export PRIMARY_IMAGE_TAG=${SNAPSHOT_TAG}
-    - export IMAGE_TAGS="${NEXUS_IMAGE_PREFIX}:${SNAPSHOT_TAG},${NEXUS_IMAGE_PREFIX}:${SNAPSHOT_TAG}-${CI_COMMIT_SHORT_SHA},${NEXUS_IMAGE_PREFIX}:snapshot-latest"
-    - mvn deploy -Pnexus-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS
-  only:
-    - main
-
 push-snapshot-helm-nexus:
   stage: publish
   variables:
@@ -157,28 +117,6 @@ push-snapshot-helm-nexus:
       - "*.tgz"
 
 # Release jobs
-push-release-image-gitlab:
-  stage: publish
-  extends: .get-version
-  script:
-    - mvn versions:set -DnewVersion=${CI_COMMIT_TAG} $MAVEN_CLI_OPTS
-    - export PRIMARY_IMAGE_TAG=${CI_COMMIT_TAG}
-    - export IMAGE_TAGS="${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG},${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}-release,${CI_REGISTRY_IMAGE}:latest"
-    - mvn deploy -Pgitlab-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS
-  rules:
-    - if: $CI_COMMIT_TAG
-
-push-release-image-nexus:
-  stage: publish
-  extends: .get-version
-  script:
-    - mvn versions:set -DnewVersion=${CI_COMMIT_TAG} $MAVEN_CLI_OPTS
-    - export PRIMARY_IMAGE_TAG=${CI_COMMIT_TAG}
-    - export IMAGE_TAGS="${NEXUS_IMAGE_PREFIX}:${CI_COMMIT_TAG},${NEXUS_IMAGE_PREFIX}:${CI_COMMIT_TAG}-release,${NEXUS_IMAGE_PREFIX}:latest"
-    - mvn deploy -Pnexus-deploy $MAVEN_DEPLOY_CLI_OPTS $MAVEN_CLI_OPTS
-  rules:
-    - if: $CI_COMMIT_TAG
-
 push-release-helm-nexus:
   stage: publish
   variables: