diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index deaf69f2821f9bc4ee4787071281f5661e9c60e7..0304201b54056500c4a85e3e181e0d6db6e6cbd3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,9 @@ stages:
   - test
   - deploy
 
+variables:
+  VERSION: '1.0' # version of the TeraFlow release
+
 # include the individual .gitlab-ci.yml of each micro-service
 include: 
   - local: '/src/monitoring/.gitlab-ci.yml'
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+
diff --git a/controller b/controller
new file mode 160000
index 0000000000000000000000000000000000000000..acc18d04c16466d7895a93eb258f363e3ef20740
--- /dev/null
+++ b/controller
@@ -0,0 +1 @@
+Subproject commit acc18d04c16466d7895a93eb258f363e3ef20740
diff --git a/src/monitoring/.gitlab-ci.yml b/src/monitoring/.gitlab-ci.yml
index 9e449f64ffcc2227fed3932f4900c7d94722100a..e40c1e9ee3c2c1410bcfca115396e050d9ba8e1e 100644
--- a/src/monitoring/.gitlab-ci.yml
+++ b/src/monitoring/.gitlab-ci.yml
@@ -2,80 +2,131 @@
 build monitoring:
   variables:
     IMAGE_NAME: 'monitoring' # name of the microservice
-    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
   stage: build
   before_script:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
   script:
-    - docker build -t "$IMAGE_NAME:$IMAGE_TAG" -f ./src/$IMAGE_NAME/Dockerfile ./src/
-    - docker tag "$IMAGE_NAME:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
-    - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
+    - |- 
+        if [[ $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH ]]; then
+          docker build -t "$IMAGE_NAME:$CI_DEFAULT_BRANCH" -t "$IMAGE_NAME:$VERSION" -f ./src/$IMAGE_NAME/Dockerfile ./src/
+          docker tag "$IMAGE_NAME:$CI_DEFAULT_BRANCH" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_DEFAULT_BRANCH"
+          docker tag "$IMAGE_NAME:$VERSION" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$VERSION"
+          docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_DEFAULT_BRANCH"
+          docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$VERSION"
+        elif [[ $CI_PIPELINE_SOURCE == "merge_request_event" ]]; then
+          docker build -t "$IMAGE_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" -f ./src/$IMAGE_NAME/Dockerfile ./src/
+          docker tag "$IMAGE_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
+          docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
+        elif [[ $CI_PIPELINE_SOURCE == "push" ]]; then
+          docker build -t "$IMAGE_NAME:$CI_COMMIT_BRANCH" -f ./src/$IMAGE_NAME/Dockerfile ./src/
+          docker tag "$IMAGE_NAME:$CI_COMMIT_BRANCH" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_BRANCH"
+          docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_BRANCH"
+        fi
   rules:
-    - changes:
-      - src/$IMAGE_NAME/*.{py,in,yml}
-      - src/$IMAGE_NAME/Dockerfile
-      - src/$IMAGE_NAME/tests/*.py
-      - src/$IMAGE_NAME/tests/Dockerfile
-      - manifests/$IMAGE_NAME.yaml
-      - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "push"'
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
 
 # test if the Docker image can be pulled from the gitlab registry
 test monitoring pull:
   variables:
     IMAGE_NAME: 'monitoring' # name of the microservice
-    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
   stage: test
   needs:
     - build monitoring
   before_script:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
   script:
-    - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
+    - |- 
+        if [[ $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH ]]; then
+          docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_DEFAULT_BRANCH"
+          docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$VERSION"
+        elif [[ $CI_PIPELINE_SOURCE == "merge_request_event" ]]; then
+          docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
+        elif [[ $CI_PIPELINE_SOURCE == "push" ]]; then
+          docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_BRANCH"
+        fi
   rules:
-    - changes:
-      - src/$IMAGE_NAME/*.{py,in,yml}
-      - src/$IMAGE_NAME/Dockerfile
-      - src/$IMAGE_NAME/tests/*.py
-      - src/$IMAGE_NAME/tests/Dockerfile
-      - manifests/$IMAGE_NAME.yaml
-      - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "push"'
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
 
 # test if the Docker image can be executed
 test monitoring run:
   variables:
     IMAGE_NAME: 'monitoring' # name of the microservice
-    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
   stage: test
   needs:
     - build monitoring
   before_script:
     - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi  
   script:
-    - docker run -d -p 7070:7070 --name $IMAGE_NAME --network=teraflowbridge --rm "$IMAGE_NAME:$IMAGE_TAG"
+    - |- 
+        if [[ $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH ]]; then
+          docker run -d -p 7070:7070 --name $IMAGE_NAME --network=teraflowbridge --rm "$IMAGE_NAME:$CI_DEFAULT_BRANCH"
+        elif [[ $CI_PIPELINE_SOURCE == "merge_request_event" ]]; then
+          docker run -d -p 7070:7070 --name $IMAGE_NAME --network=teraflowbridge --rm "$IMAGE_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
+        elif [[ $CI_PIPELINE_SOURCE == "push" ]]; then
+          docker run -d -p 7070:7070 --name $IMAGE_NAME --network=teraflowbridge --rm "$IMAGE_NAME:$CI_COMMIT_BRANCH"
+        fi
     - docker ps
   after_script:
-    - docker stop monitoring
+    - docker stop $IMAGE_NAME
   rules:
-    - changes:
-      - src/$IMAGE_NAME/*.{py,in,yml}
-      - src/$IMAGE_NAME/Dockerfile
-      - src/$IMAGE_NAME/tests/*.py
-      - src/$IMAGE_NAME/tests/Dockerfile
-      - manifests/$IMAGE_NAME.yaml
-      - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "push"'
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
 
 # apply unit test to the monitoring component
 test monitoring pytest:
   variables:
     IMAGE_NAME: 'monitoring' # name of the microservice
     IMAGE_NAME_TEST: 'monitoring-test' # name of the microservice
-    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
   stage: test
   needs:
     - build monitoring
   script:
-    - docker build -t "$IMAGE_NAME_TEST:$IMAGE_TAG" -f ./src/$IMAGE_NAME/tests/Dockerfile ./src/
-    - docker run -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" $IMAGE_NAME_TEST:$IMAGE_TAG
+    - docker build -t "$IMAGE_NAME_TEST" -f ./src/$IMAGE_NAME/tests/Dockerfile ./src/
+    - docker run -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" $IMAGE_NAME_TEST
   rules:
     - changes:
       - src/$IMAGE_NAME/*.{py,in,yml}
@@ -89,7 +140,7 @@ test monitoring pytest:
       reports:
         junit: src/$IMAGE_NAME/tests/report.xml
 
-# Deployment of the monitoring service in Kubernetes Cluster
+# Deployment of the monitoring service in development Kubernetes Cluster
 deploy monitoring development:
   variables:
     IMAGE_NAME: 'monitoring' # name of the microservice
@@ -103,14 +154,49 @@ deploy monitoring development:
     - kubectl get all
     - kubectl apply -f "manifests/$IMAGE_NAME.yaml"
     - kubectl get all
+  # environment:
+  #   name: development
+  #   url: https://example.com
+  #   kubernetes:
+  #     namespace: development
   rules:
-    - changes:
-      - src/$IMAGE_NAME/*.{py,in,yml}
-      - src/$IMAGE_NAME/Dockerfile
-      - src/$IMAGE_NAME/tests/*.py
-      - src/$IMAGE_NAME/tests/Dockerfile
-      - manifests/$IMAGE_NAME.yaml
-      - .gitlab-ci.yml
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
       when: manual
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml
 
+# Deployment of the monitoring service in production Kubernetes Cluster
+deploy monitoring production:
+  variables:
+    IMAGE_NAME: 'monitoring' # name of the microservice
+    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+  stage: deploy
+  needs:
+    - build monitoring
+    - test monitoring run
+  script:
+    - kubectl version
+    - kubectl get all
+    - kubectl apply -f "manifests/$IMAGE_NAME.yaml"
+    - kubectl get all
+  # environment:
+  #   name: production
+  #   url: https://example.com
+  #   kubernetes:
+  #     namespace: production
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      when: manual
+      changes:
+        - src/$IMAGE_NAME/*.{py,in,yml}
+        - src/$IMAGE_NAME/Dockerfile
+        - src/$IMAGE_NAME/tests/*.py
+        - src/$IMAGE_NAME/tests/Dockerfile
+        - manifests/$IMAGE_NAME.yaml
+        - .gitlab-ci.yml