diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd0005d1bd13d986a29908c7fd9feb8c536ccc42..8703a6ccc4479252f07b7b5e6b28656b4852b544 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,70 +1,175 @@
+---
 stages:
-- triggers
-- test
+    - build_0
+    - build_1
+    - build_2
+    - snapshot
+    - build_standalone
+    - test
+#- publish
+#- announce
 
-#####################################################
-### ATLAS KV (a test of cvmfs functionality)
-#####################################################
+##########################
+## Templates #############
 
-job_test_kv:
-  stage: test
-  image: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-builder/dind:qa
-  tags:
-      - hep-workload-gpu-docker-builder
-  before_script:
-      - export CIENV_CVMFSVOLUME=/scratch/cvmfs_hep/CI-JOB-${CI_JOB_ID}
-      - export CVMFS_IMAGE=gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-builder/cvmfs-image:${CI_COMMIT_TAG:-$CI_COMMIT_BRANCH}
-      - docker pull ${CVMFS_IMAGE}
-      - docker run --name cvmfs_${CI_JOB_ID} -d --privileged -v ${CIENV_CVMFSVOLUME}:/cvmfs:shared ${CVMFS_IMAGE} -r atlas.cern.ch -t /tmp/traces
-  script: 
-      - sleep 1m # to give time to cvmfs to start
-      - export CIENV_CVMFSVOLUME=/scratch/cvmfs_hep/CI-JOB-${CI_JOB_ID}
-      - docker exec cvmfs_${CI_JOB_ID} cvmfs_config probe
-      - docker run --rm -v ${CIENV_CVMFSVOLUME}:/cvmfs gitlab-registry.cern.ch/hep-benchmarks/hep-workloads/atlas-kv-bmk:ci1.2 -c 2 -t 1 -e 4
-      - docker exec cvmfs_${CI_JOB_ID} cvmfs_talk -i atlas.cern.ch tracebuffer flush
-      - docker exec cvmfs_${CI_JOB_ID} python /usr/libexec/cvmfs/shrinkwrap/spec_builder.py --policy=exact /tmp/traces/cvmfs-atlas.cern.ch.trace.log /tmp/traces/cvmfs-atlas.cern.ch.spec
-      - docker cp cvmfs_${CI_JOB_ID}:/tmp/traces ${CI_PROJECT_DIR}/traces  
-  after_script:
-      - docker rm -f cvmfs_${CI_JOB_ID}
-  only:
-      variables:
-      - $CI_COMMIT_BRANCH =~ /^qa.*$/
-      - $CI_COMMIT_TAG =~ /^v.*$/
-  artifacts:
-    paths:
-      - ${CI_PROJECT_DIR}/traces
-    expire_in: 1 week
-    when: always
+# .definition_build_image_kaniko: &template_build_image_kaniko
+#     tags:
+#         - hep-workload-gpu-docker-builder
+#     image: # NB enable shared runners and do not specify a CI tag
+#         name: gitlab-registry.cern.ch/ci-tools/docker-image-builder # CERN version of the Kaniko image
+#         entrypoint: [""]
+#     script:
+#         - echo "current commit is ${CI_COMMIT_SHA:0:8}"
+#         - echo "current branch is ${CI_COMMIT_BRANCH}"
+#         - echo "current tag is ${CI_COMMIT_TAG}"
+#         - if [[ -z $DOCKERFILE ]]; then echo "ERROR variable DOCKERFILE is not defined "; exit 1; fi 
+#         - if [[ -z $CONTEXT ]]; then echo "ERROR variable CONTEXT is not defined "; exit 1; fi 
+#         - if [[ -z $IMAGE_NAME ]]; then echo "ERROR variable IMAGE_NAME is not defined "; exit 1; fi 
+#         - if [[ -z $IMAGE_TAG ]]; then echo "ERROR variable IMAGE_TAG is not defined "; exit 1; fi 
+#         - export DESTINATIONS="--destination $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG --destination $CI_REGISTRY_IMAGE/$IMAGE_NAME:ci-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA:0:8}"
+#         - echo "DESTINATIONS $DESTINATIONS"
+#         # Prepare Kaniko configuration file
+#         - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
+#         # Build and push the image from the Dockerfile at the root of the project.
+#         # To push to a specific docker tag, amend the --destination parameter, e.g. --destination $CI_REGISTRY_IMAGE:$CI_BUILD_REF_NAME
+#         # See https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#variables-reference for available variables
+#         - /kaniko/executor --context $CONTEXT --dockerfile $DOCKERFILE $DESTINATIONS
 
-#####################################################
-### CMS PATATRACK 
-#####################################################
+.definition_build_image: &template_build_image
+    tags:
+        - hep-workload-gpu-docker-builder
+    image: 
+        name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-builder/dind:qa # Use instead of kaniko. FIXME use a prod tag
+        entrypoint: [""]
+    script:
+        - echo "current commit is ${CI_COMMIT_SHA:0:8}"
+        - echo "current branch is ${CI_COMMIT_BRANCH}"
+        - echo "current tag is ${CI_COMMIT_TAG}"
+        - if [[ -z $DOCKERFILE ]]; then echo "ERROR variable DOCKERFILE is not defined "; exit 1; fi 
+        - if [[ -z $CONTEXT ]]; then echo "ERROR variable CONTEXT is not defined "; exit 1; fi 
+        - if [[ -z $IMAGE_NAME ]]; then echo "ERROR variable IMAGE_NAME is not defined "; exit 1; fi 
+        - if [[ -z $IMAGE_TAG ]]; then echo "ERROR variable IMAGE_TAG is not defined "; exit 1; fi 
+        - docker rmi -f $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG || echo "image $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG does not exist"
+        - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin gitlab-registry.cern.ch
+        - docker build --no-cache -t $CI_REGISTRY_IMAGE/$IMAGE_NAME:ci-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA:0:8} -f $DOCKERFILE $CONTEXT
+        - dockert tag $CI_REGISTRY_IMAGE/$IMAGE_NAME:ci-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA:0:8} $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
+        - docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME:ci-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA:0:8}
+        - docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
+        - docker rmi $CI_REGISTRY_IMAGE/$IMAGE_NAME:ci-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA:0:8}
 
-patatrack:
-  stage: triggers
-  trigger:
-    include: 
-      - local: cms/cms-patatrack-ci.yml
-    strategy: depend
-  only:
-    variables:
-      - $CI_COMMIT_BRANCH =~ /^qa.*$/
-      - $CI_COMMIT_TAG =~ /^v.*$/
+###########################################################
+# docker in docker image: to trigger other docker runs
+###########################################################
 
-#####################################################
-### LHC Simple Track
-#####################################################
+job_build_image_step0: 
+    stage: build_0
+    before_script:
+        - export DOCKERFILE=$CI_PROJECT_DIR/cms/patatrack/ci-scripts/nvidia.Dockerfile.0
+        - export CONTEXT=$CI_PROJECT_DIR/cms/patatrack
+        - export IMAGE_NAME=cms/cms-patatrack-nvidia-0
+        - export IMAGE_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_BRANCH}
+    <<: *template_build_image
+    only:
+        changes:
+          - cms/patatrack/ci-scripts/nvidia.Dockerfile.0
 
-simpletrack:
-  stage: triggers
-  trigger:
-    include: lhc/simpletrack/.simpletrack-ci.yml
-    strategy: depend
-  only:
-    variables:
-    - $CI_COMMIT_BRANCH =~ /^qa.*$/
-    - $CI_COMMIT_TAG =~ /^v.*$/
-    changes:
-    - lhc/simpletrack/Dockerfile.*
-    - lhc/simpletrack/lhc-simpletrack.*
-    - lhc/simpletrack/.simpletrack-ci.yml
+
+job_build_image_step1: 
+    stage: build_1
+    before_script:
+        - export DOCKERFILE=$CI_PROJECT_DIR/cms/patatrack/ci-scripts/nvidia.Dockerfile.1
+        - export CONTEXT=$CI_PROJECT_DIR/cms/patatrack
+        - export IMAGE_NAME=cms/cms-patatrack-nvidia-1
+        - export IMAGE_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_BRANCH}
+    <<: *template_build_image
+    only:
+        changes:
+            - cms/patatrack/ci-scripts/nvidia.Dockerfile.0
+            - cms/patatrack/ci-scripts/nvidia.Dockerfile.1
+
+job_build_image_step2: 
+    stage: build_2
+    before_script:
+        - export DOCKERFILE=$CI_PROJECT_DIR/cms/patatrack/ci-scripts/nvidia.Dockerfile.2
+        - export CONTEXT=$CI_PROJECT_DIR/cms/patatrack
+        - export IMAGE_NAME=cms/cms-patatrack-nvidia-2
+        - export IMAGE_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_BRANCH}
+    <<: *template_build_image
+    only:
+        changes:
+            - cms/patatrack/ci-scripts/nvidia.Dockerfile.*
+            - cms/patatrack/cms-patatrack/*
+            - cms/patatrack/cms-patatrack/utility_scripts/*
+
+job_snapshot_cvmfs: 
+    stage: snapshot
+    tags:
+        - hep-workload-gpu-docker-builder
+    image:
+        name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-builder/dind:qa
+    before_script:
+        - source cms/patatrack/ci-scripts/snapshot_cvmfs.sh
+        - _before_script
+    script: 
+        - source cms/patatrack/ci-scripts/snapshot_cvmfs.sh
+        - _script
+    after_script:
+        - source cms/patatrack/ci-scripts/snapshot_cvmfs.sh
+        - _after_script
+    only:
+        variables:
+            - $CI_COMMIT_BRANCH =~ /^qa.*$/
+            - $CI_COMMIT_TAG =~ /^v.*$/
+        changes:
+            - cms/patatrack/ci-scripts/nvidia.Dockerfile.*
+            - cms/patatrack/ci-scripts/snapshot_cvmfs.sh
+            - cms/patatrack/cms-patatrack/*
+            - cms/patatrack/cms-patatrack/utility_scripts/*
+    artifacts:
+        paths:
+            - ${CI_PROJECT_DIR}/traces
+            - ${CI_PROJECT_DIR}/cvmfs_export_dir_content
+            - ${CI_PROJECT_DIR}/cvmfs_export_py2-scipy_content
+            - ${CI_PROJECT_DIR}/cms/patatrack/cvmfs
+        expire_in: 1 week
+        when: always
+
+job_build_standalone_image: 
+    stage: build_standalone
+    before_script:
+        - export DOCKERFILE=$CI_PROJECT_DIR/cms/patatrack/ci-scripts/nvidia.Dockerfile.2
+        - export CONTEXT=$CI_PROJECT_DIR/cms/patatrack
+        - export IMAGE_NAME=cms/cms-patatrack-nvidia-bmk
+        - export IMAGE_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_BRANCH}
+    <<: *template_build_image
+    only:
+        changes:
+            - cms/patatrack/ci-scripts/nvidia.Dockerfile.*
+            - cms/patatrack/ci-scripts/snapshot_cvmfs.sh
+            - cms/patatrack/cms-patatrack/*
+            - cms/patatrack/cms-patatrack/utility_scripts/*
+
+job_test_standalone_image: 
+    stage: test
+    tags:
+        - hep-workload-gpu-docker-builder
+    image:
+        name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-builder/dind:qa
+    script: 
+        - source cms/patatrack/ci-scripts/test_standalone_image.sh
+        - _script        
+    only:
+        variables:
+            - $CI_COMMIT_BRANCH =~ /^qa.*$/
+            - $CI_COMMIT_TAG =~ /^v.*$/
+        changes:
+            - cms/patatrack/ci-scripts/nvidia.Dockerfile.*
+            - cms/patatrack/ci-scripts/snapshot_cvmfs.sh
+            - cms/patatrack/ci-scripts/test_standalone_image.sh
+            - cms/patatrack/cms-patatrack/*
+            - cms/patatrack/cms-patatrack/utility_scripts/*
+    artifacts:
+        paths:
+            - ${CI_PROJECT_DIR}/${RESULTS_DIR}
+        expire_in: 1 week
+        when: always
\ No newline at end of file