diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fd0433470238bc16a8b0976aed96ff06de3a12da..0b8a9197f61023d24b359083fc419e1bd06b51d2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,6 @@ variables:
 stages:
   - build
 
-
 build-tags:
   image: docker:latest
   stage: build
@@ -13,46 +12,76 @@ build-tags:
   before_script:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
   script:
-    - VERSION_1=`grep 'version="*"' core/Dockerfile | cut -d '"' -f2`
     - IMAGE_1="$CI_REGISTRY_IMAGE/pvs_core"
     - docker pull "$IMAGE_1":latest || true
-    - docker build --cache-from "$IMAGE_1":latest -t "$IMAGE_1":dev -t "$IMAGE_1":$VERSION_1 core/
-    - VERSION_2=`grep 'version="*"' preprocessor/Dockerfile | cut -d '"' -f2`
+    - docker build --cache-from "$IMAGE_1":latest -t "$IMAGE_1":dev -t "$IMAGE_1":$CI_COMMIT_TAG core/
     - IMAGE_2="$CI_REGISTRY_IMAGE/pvs_preprocessor"
     - docker pull "$IMAGE_2":latest || true
-    - docker build --cache-from "$IMAGE_2":latest -t "$IMAGE_2":dev -t "$IMAGE_2":$VERSION_2 preprocessor/
-    - VERSION_3=`grep 'version="*"' client/Dockerfile | cut -d '"' -f2`
+    - docker build --cache-from "$IMAGE_2":latest -t "$IMAGE_2":dev -t "$IMAGE_2":$CI_COMMIT_TAG preprocessor/
     - IMAGE_3="$CI_REGISTRY_IMAGE/pvs_client"
     - docker pull "$IMAGE_3":latest || true
-    - docker build --cache-from "$IMAGE_3":latest -t "$IMAGE_3":dev -t "$IMAGE_3":$VERSION_3 client/
-    - VERSION_4=`grep 'version="*"' cache/Dockerfile | cut -d '"' -f2`
+    - docker build --cache-from "$IMAGE_3":latest -t "$IMAGE_3":dev -t "$IMAGE_3":$CI_COMMIT_TAG client/
     - IMAGE_4="$CI_REGISTRY_IMAGE/pvs_cache"
     - docker pull "$IMAGE_4":latest || true
-    - docker build --cache-from "$IMAGE_4":latest -t "$IMAGE_4":dev -t "$IMAGE_4":$VERSION_4 cache/
-    - VERSION_5=`grep 'version="*"' fluentd/Dockerfile | cut -d '"' -f2`
+    - docker build --cache-from "$IMAGE_4":latest -t "$IMAGE_4":dev -t "$IMAGE_4":$CI_COMMIT_TAG cache/
     - IMAGE_5="$CI_REGISTRY_IMAGE/fluentd"
     - docker pull "$IMAGE_5":latest || true
-    - docker build --cache-from "$IMAGE_5":latest -t "$IMAGE_5":dev -t "$IMAGE_5":$VERSION_5 fluentd/
-    - VERSION_6=`grep 'version="*"' ingestor/Dockerfile | cut -d '"' -f2`
+    - docker build --cache-from "$IMAGE_5":latest -t "$IMAGE_5":dev -t "$IMAGE_5":$CI_COMMIT_TAG fluentd/
     - IMAGE_6="$CI_REGISTRY_IMAGE/pvs_ingestor"
     - docker pull "$IMAGE_6":latest || true
-    - docker build --cache-from "$IMAGE_6":latest -t "$IMAGE_6":dev -t "$IMAGE_6":$VERSION_6 ingestor/
+    - docker build --cache-from "$IMAGE_6":latest -t "$IMAGE_6":dev -t "$IMAGE_6":$CI_COMMIT_TAG ingestor/
     - cd ./testing && ./gitlab_test.sh
     - if [ $? -ne 0 ]; then exit 1; fi  # actually fail build
-    - docker push "$IMAGE_1":$VERSION_1
+    - docker push "$IMAGE_1":$CI_COMMIT_TAG
     - docker push "$IMAGE_1":latest
-    - docker push "$IMAGE_2":$VERSION_2
+    - docker push "$IMAGE_2":$CI_COMMIT_TAG
     - docker push "$IMAGE_2":latest
-    - docker push "$IMAGE_3":$VERSION_3
+    - docker push "$IMAGE_3":$CI_COMMIT_TAG
     - docker push "$IMAGE_3":latest
-    - docker push "$IMAGE_4":$VERSION_4
+    - docker push "$IMAGE_4":$CI_COMMIT_TAG
     - docker push "$IMAGE_4":latest
-    - docker push "$IMAGE_5":$VERSION_5
+    - docker push "$IMAGE_5":$CI_COMMIT_TAG
     - docker push "$IMAGE_5":latest
-    - docker push "$IMAGE_6":$VERSION_6
+    - docker push "$IMAGE_6":$CI_COMMIT_TAG
     - docker push "$IMAGE_6":latest
   only:
     - tags
+build-staging:
+  image: docker:latest
+  stage: build
+  services:
+    - docker:dind
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+  script:
+    - IMAGE_1="$CI_REGISTRY_IMAGE/pvs_core"
+    - docker pull "$IMAGE_1":staging || true
+    - docker build --cache-from "$IMAGE_1":staging -t "$IMAGE_1":dev -t "$IMAGE_1":staging core/
+    - IMAGE_2="$CI_REGISTRY_IMAGE/pvs_preprocessor"
+    - docker pull "$IMAGE_2":staging || true
+    - docker build --cache-from "$IMAGE_2":staging -t "$IMAGE_2":dev -t "$IMAGE_2":staging preprocessor/
+    - IMAGE_3="$CI_REGISTRY_IMAGE/pvs_client"
+    - docker pull "$IMAGE_3":staging || true
+    - docker build --cache-from "$IMAGE_3":staging -t "$IMAGE_3":dev -t "$IMAGE_3":staging client/
+    - IMAGE_4="$CI_REGISTRY_IMAGE/pvs_cache"
+    - docker pull "$IMAGE_4":staging || true
+    - docker build --cache-from "$IMAGE_4":staging -t "$IMAGE_4":dev -t "$IMAGE_4":staging cache/
+    - IMAGE_5="$CI_REGISTRY_IMAGE/fluentd"
+    - docker pull "$IMAGE_5":staging || true
+    - docker build --cache-from "$IMAGE_5":staging -t "$IMAGE_5":dev -t "$IMAGE_5":staging fluentd/
+    - IMAGE_6="$CI_REGISTRY_IMAGE/pvs_ingestor"
+    - docker pull "$IMAGE_6":staging || true
+    - docker build --cache-from "$IMAGE_6":staging -t "$IMAGE_6":dev -t "$IMAGE_6":staging ingestor/
+    - cd ./testing && ./gitlab_test.sh
+    - if [ $? -ne 0 ]; then exit 1; fi  # actually fail build
+    - docker push "$IMAGE_1":staging
+    - docker push "$IMAGE_2":staging
+    - docker push "$IMAGE_3":staging
+    - docker push "$IMAGE_4":staging
+    - docker push "$IMAGE_5":staging
+    - docker push "$IMAGE_6":staging
+  only:
+    - staging
 build:
   image: docker:latest
   stage: build
@@ -62,24 +91,25 @@ build:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
   script:
     - IMAGE="$CI_REGISTRY_IMAGE/pvs_core"
-    - docker pull "$IMAGE":latest || true
-    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":dev core/
+    - docker pull "$IMAGE":staging || true
+    - docker build --cache-from "$IMAGE":staging -t "$IMAGE":dev core/
     - IMAGE="$CI_REGISTRY_IMAGE/pvs_preprocessor"
-    - docker pull "$IMAGE":latest || true
-    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":dev preprocessor/
+    - docker pull "$IMAGE":staging || true
+    - docker build --cache-from "$IMAGE":staging -t "$IMAGE":dev preprocessor/
     - IMAGE="$CI_REGISTRY_IMAGE/pvs_client"
-    - docker pull "$IMAGE":latest || true
-    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":dev client/
+    - docker pull "$IMAGE":staging || true
+    - docker build --cache-from "$IMAGE":staging -t "$IMAGE":dev client/
     - IMAGE="$CI_REGISTRY_IMAGE/pvs_cache"
-    - docker pull "$IMAGE":latest || true
-    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":dev cache/
+    - docker pull "$IMAGE":staging || true
+    - docker build --cache-from "$IMAGE":staging -t "$IMAGE":dev cache/
     - IMAGE="$CI_REGISTRY_IMAGE/fluentd"
-    - docker pull "$IMAGE":latest || true
-    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":dev fluentd/
+    - docker pull "$IMAGE":staging || true
+    - docker build --cache-from "$IMAGE":staging -t "$IMAGE":dev fluentd/
     - IMAGE="$CI_REGISTRY_IMAGE/pvs_ingestor"
-    - docker pull "$IMAGE":latest || true
-    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":dev ingestor/
+    - docker pull "$IMAGE":staging || true
+    - docker build --cache-from "$IMAGE":staging -t "$IMAGE":dev ingestor/
     - cd ./testing && ./gitlab_test.sh
     - if [ $? -ne 0 ]; then exit 1; fi  # actually fail build
   except:
     - tags
+    - staging