diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 77ed03fcb1a3eede5a87e807ab6c9a927a232c20..d4f49d083aa232ff0951d30a74722e9bc1f06207 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -36,6 +36,7 @@ stages:
   - test
   - docs
   - release
+  - deploy
   - verify
   - scan
 
@@ -407,12 +408,24 @@ release-images:
   stage: release
   image: docker:${DOCKER_VERSION}-dind
   dependencies:
-    - test-metadata-service
-    - test-data-service
     - test-analyse-service
+    - test-auth-service-init
+    - test-data-service
+    - test-lib
+    - test-metadata-service
+    - test-search-service
+    - test-search-service-init
+    - test-ui
+  variables:
+    BUILD_VERSION: ""
   only:
     refs:
+      - dev
       - /^release-.*/
+  rules:
+    - if: $CI_COMMIT_REF_NAME == dev
+      variables:
+        BUILD_VERSION: "+git.${CI_COMMIT_SHORT_SHA}"
   before_script:
     - "docker logout ${CI_REGISTRY_URL}"
     - "echo ${CI_REGISTRY_PASSWORD} | docker login --username ${CI_REGISTRY_USER} --password-stdin ${CI_REGISTRY_URL}"
@@ -527,6 +540,27 @@ verify-dist:
   script:
     - "curl -v --output /dev/null --fail https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${APP_VERSION}/dist.tar.gz"
 
+deploy-staging:
+  image: docker.io/alpine:${ALPINE_VERSION}
+  stage: deploy
+  only:
+    refs:
+      - dev
+  variables:
+    KUBECONFIG: ./kubecfg
+  environment:
+    name: staging/datalab
+    url: ${CI_ENV_STAGING_URL}
+  before_script:
+    - apk add --no-cache helm kubectl make
+    - echo ${CI_K8S_CONFIG} | base64 -d > ./kubecfg
+    - make build-helm
+    - helm -n ${CI_ENV_STAGING_NAMESPACE} uninstall ${CI_ENV_STAGING_RELEASE_NAME} --ignore-not-found
+    - kubectl -n ${CI_ENV_STAGING_NAMESPACE} delete pvc --all
+    - echo "${CI_K8S_VALUES}" | base64 -d > ./values.yaml
+  script:
+    - helm -n ${CI_ENV_STAGING_NAMESPACE} upgrade --install ${CI_ENV_STAGING_RELEASE_NAME} ./build/dbrepo-${CHART_VERSION}.tgz --create-namespace -f ./values.yaml
+
 scan-sonarqube:
   image: sonarsource/sonar-scanner-cli:${SONARQUBE_VERSION}
   stage: scan
diff --git a/make/rel.mk b/make/rel.mk
index 0c4b2bb193f3618e3098d13fd283882701e29a20..c98668f08b9bc79f23be811f3fdfa0f753ca3d24 100644
--- a/make/rel.mk
+++ b/make/rel.mk
@@ -2,29 +2,29 @@
 
 .PHONY: tag-images
 tag-images: build-images ## Tag the docker images.
-	docker tag dbrepo-analyse-service:latest "${REPOSITORY_URL}/analyse-service:${APP_VERSION}"
-	docker tag dbrepo-dashboard-service:latest "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}"
-	docker tag dbrepo-ui:latest "${REPOSITORY_URL}/ui:${APP_VERSION}"
-	docker tag dbrepo-data-service:latest "${REPOSITORY_URL}/data-service:${APP_VERSION}"
-	docker tag dbrepo-auth-service-init:latest "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}"
-	docker tag dbrepo-metadata-service:latest "${REPOSITORY_URL}/metadata-service:${APP_VERSION}"
-	docker tag dbrepo-search-db:latest "${REPOSITORY_URL}/search-db:${APP_VERSION}"
-	docker tag dbrepo-search-service:latest "${REPOSITORY_URL}/search-service:${APP_VERSION}"
-	docker tag dbrepo-search-service-init:latest "${REPOSITORY_URL}/search-service-init:${APP_VERSION}"
-	docker tag dbrepo-storage-service-init:latest "${REPOSITORY_URL}/storage-service-init:${APP_VERSION}"
+	docker tag dbrepo-analyse-service:latest "${REPOSITORY_URL}/analyse-service:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-dashboard-service:latest "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-ui:latest "${REPOSITORY_URL}/ui:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-data-service:latest "${REPOSITORY_URL}/data-service:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-auth-service-init:latest "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-metadata-service:latest "${REPOSITORY_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-search-db:latest "${REPOSITORY_URL}/search-db:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-search-service:latest "${REPOSITORY_URL}/search-service:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-search-service-init:latest "${REPOSITORY_URL}/search-service-init:${APP_VERSION}${BUILD_VERSION}"
+	docker tag dbrepo-storage-service-init:latest "${REPOSITORY_URL}/storage-service-init:${APP_VERSION}${BUILD_VERSION}"
 
 .PHONY: release-images
 release-images: tag-images ## Release the docker images.
-	docker push "${REPOSITORY_URL}/analyse-service:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/ui:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/data-service:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/search-db:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/metadata-service:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/search-service-init:${APP_VERSION}"
-	docker push "${REPOSITORY_URL}/storage-service-init:${APP_VERSION}"
+	docker push "${REPOSITORY_URL}/analyse-service:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/ui:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/data-service:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/search-db:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/search-service-init:${APP_VERSION}${BUILD_VERSION}"
+	docker push "${REPOSITORY_URL}/storage-service-init:${APP_VERSION}${BUILD_VERSION}"
 
 .PHONY: release-helm
 release-helm: gen-helm-doc ## Release the DBRepo and DBRepo MariaDB Galera Helm charts.