diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 332ef9a3825886525787ae19ee1f216a9099506e..d7aa7f24cd0d5af3f726e5ded07c8f2e04e56c58 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -105,25 +105,16 @@ check-clang-format:
     expire_in: 3 days
     paths:
       - ${CI_PROJECT_DIR}/build/CMakeFiles/CMakeOutput.log
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull-push    
 
 # config for gcc
 config-u-18_04:
   extends: .config
   image: corsika/devel:u-18.04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
 
 # config for clang
 config-clang-8:
   extends: .config
   image: corsika/devel:clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
 
 
 
@@ -138,7 +129,9 @@ config-clang-8:
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
+    - cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
     - cmake --build . -- -j4
   rules:
     - if: $CI_MERGE_REQUEST_ID
@@ -148,30 +141,22 @@ config-clang-8:
     - if: $CI_COMMIT_BRANCH
       when: manual
   allow_failure: true
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull-push
 
 # build for gcc
 build-u-18_04:
   extends: .build
   image: corsika/devel:u-18.04
-  dependencies:
-    - config-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs: 
+    - job: config-u-18_04
+      artifacts: false
 
 # build for clang
 build-clang-8:
   extends: .build
   image: corsika/devel:clang-8
-  dependencies:
-    - config-clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
-
+  needs:
+    - job: config-clang-8
+      artifacts: false
 
 
 
@@ -185,7 +170,9 @@ build-clang-8:
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
+    - cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
     - set -o pipefail
     - ctest -j4 
   rules:
@@ -202,29 +189,22 @@ build-clang-8:
     reports:
       junit:
         - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull-push
 
 # test for gcc
 test-u-18_04:
   extends: .test
   image: corsika/devel:u-18.04
-  dependencies:
-    - build-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs:
+    - job: build-u-18_04
+      artifacts: false
 
 # test for clang
 test-clang-8:
   extends: .test
   image: corsika/devel:clang-8
-  dependencies:
-    - build-clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
+  needs:
+    - job: build-clang-8
+      artifacts: false
 
 
 
@@ -239,7 +219,9 @@ test-clang-8:
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
+    - cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
     - cmake --build . -- -j4
     - set -o pipefail
     - ctest -j4 
@@ -257,29 +239,22 @@ test-clang-8:
     reports:
       junit:
         - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull-push
 
 # build_test for gcc
 build_test-u-18_04:
   extends: .build_test
   image: corsika/devel:u-18.04
-  dependencies:
-    - config-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs:
+    - job: config-u-18_04
+      artifacts: false
 
 # build_test for clang
 build_test-clang-8:
   extends: .build_test
   image: corsika/devel:clang-8
-  dependencies:
-    - config-clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
+  needs:
+    - job: config-clang-8
+      artifacts: false
 
 
 
@@ -295,7 +270,9 @@ build_test-clang-8:
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
+    - cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
     - cmake --build . -- -j4
     - set -o pipefail
     - ctest -j4
@@ -323,29 +300,23 @@ build_test-clang-8:
     paths:
       - ${CI_PROJECT_DIR}/build/build_examples/examples.log.gz
       - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull
 
 # build_test_example for gcc
 build_test_example-u-18_04:
   extends: .build_test_example
   image: corsika/devel:u-18.04
-  dependencies:
-    - config-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs:
+    - job: config-u-18_04
+      artifacts: false
+
 
 # build_test_example for clang
 build_test_example-clang-8:
   extends: .build_test_example
   image: corsika/devel:clang-8
-  dependencies:
-    - config-clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
+  needs:
+    - job: config-clang-8
+      artifacts: false
 
 
 
@@ -360,7 +331,9 @@ build_test_example-clang-8:
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
+    - cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
     - set -o pipefail
     - make -j2 install
   rules:
@@ -374,29 +347,22 @@ build_test_example-clang-8:
     - if: $CI_COMMIT_TAG
       when: manual
       allow_failure: true
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull
 
 # install for gcc
 install-u-18_04:
   extends: .install
   image: corsika/devel:u-18.04
-  dependencies:
-    - build-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs:
+    - job: build-u-18_04
+      artifacts: false
 
 # install for clang
 install-clang-8:
   extends: .install
   image: corsika/devel:clang-8
-  dependencies:
-    - build-clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
+  needs:
+    - job: build-clang-8
+      artifacts: false
 
 
 
@@ -411,6 +377,7 @@ install-clang-8:
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Release -DUSE_Pythia8_C8=C8
     - cmake --build . -- -j4
@@ -433,11 +400,6 @@ install-clang-8:
     - if: $CI_COMMIT_TAG
       when: manual
       allow_failure: true
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull
   artifacts:
     when: always
     expire_in: 3 days
@@ -452,19 +414,17 @@ install-clang-8:
 release-full-u-18_04:
   extends: .release
   image: corsika/devel:u-18.04
-  dependencies:
-    - config-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs:
+    - job: config-u-18_04
+      artifacts: false
 
 # release for clang
 release-full-clang-8:
   extends: .release
   image: corsika/devel:clang-8
-  dependencies:
-    - config-clang-8
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang"
+  needs:
+    - job: config-clang-8
+      artifacts: false
 
 
 
@@ -474,12 +434,14 @@ release-full-clang-8:
 
 coverage:
   image: corsika/devel:u-18.04
-  dependencies:
-    - config-u-18_04
+  needs:
+    - job: config-u-18_04
+      artifacts: false
   stage: optional
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
     - cmake .. -DCMAKE_BUILD_TYPE=Coverage -DUSE_Pythia8_C8=C8
     - cmake --build . -- -j4
@@ -501,12 +463,6 @@ coverage:
     expire_in: 1 year
     paths:
       - ${CI_PROJECT_DIR}/build/coverage-report.tar.gz
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
 
 
 
@@ -517,14 +473,17 @@ coverage:
 ##########################################################
 sanity:
   image: corsika/devel:u-18.04
-  dependencies:
-    - config-u-18_04
+  needs:
+    - job: config-u-18_04
+      artifacts: false
+
   stage: optional
   tags:
     - corsika
   script:
+    - mkdir -p build
     - cd build
-    - cmake .. -DWITH_CORSIKA_SANITIZERS_ENABLED=ON
+    - cmake .. -DWITH_CORSIKA_SANITIZERS_ENABLED=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
     - cmake --build . -- -j4
   rules:
     - if: '$CI_MERGE_REQUEST_LABELS =~ /Ready for code review/' # run on merge requests, if label 'Ready for code review' is set
@@ -537,12 +496,6 @@ sanity:
     - if: $CI_COMMIT_TAG
       when: manual
       allow_failure: true
-  cache:
-    paths:
-      - ${CI_PROJECT_DIR}/build/
-    untracked: true
-    policy: pull
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
 
 ##########################################################
 # template for all Python jobs
@@ -569,10 +522,9 @@ sanity:
 python-3.8:
   extends: .python
   image: corsika/devel:u-18.04
-  dependencies:
-    - build-u-18_04
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  needs:
+    - job: build-u-18_04
+      artifacts: false
   artifacts:
     when: always
     expire_in: 1 year
diff --git a/.gitlab-ci.yml-cache b/.gitlab-ci.yml-cache
new file mode 100644
index 0000000000000000000000000000000000000000..fe2865b43182d3afac7a1513212bcd1cde988e13
--- /dev/null
+++ b/.gitlab-ci.yml-cache
@@ -0,0 +1,581 @@
+variables:
+  GIT_STRATEGY: $CORSIKA8_GIT_STRATEGY # clone: fresh clone, fetch: update
+  GIT_SSL_NO_VERIFY: "1"
+  GIT_DEPTH: "1"
+  # to re-use clones also in different forks
+  GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_CONCURRENT_ID/$CI_PROJECT_NAME
+  ## Runtime options for sanitizers
+  # (detect_leaks=0 because leak detection doesn't work in CI, but you can
+  # try to test with leak detection locally by using detect_leaks=1)
+  UBSAN_OPTIONS: "print_stacktrace=1"
+  LSAN_OPTIONS: "log_threads=1"
+  ASAN_OPTIONS: "detect_leaks=0:detect_stack_use_after_return=1"
+  # location of AirShowerPhysics/corsika-data
+  CORSIKA_DATA: "${CI_PROJECT_DIR}/modules/data" # the git submodule
+  corsika_DIR: "${CI_PROJECT_DIR}/build/install" # for cmake to find corsikaConfig.cmake
+  # _alternatively_ corsika-data can be downloaded as submodule:
+  GIT_SUBMODULE_STRATEGY: normal # none: we get the submodules in before_script,
+                                 # normal: get submodules automatically
+  CTEST_OUTPUT_ON_FAILURE: 1
+
+
+#
+# multi-step pipeline for each commit
+#
+# Mote: "Draft:" merge request, non-Draft merge requests and "Ready for Code Review" MR are all
+#       handled explicitly
+#
+stages:
+  - quality
+  - config
+  - build
+  - test
+  - build_test
+  - example
+  - build_test_example
+  - python
+  - install
+  - optional
+
+
+
+
+####### CODE QUALITY CHECK ##############
+
+##########################################################
+check-copyrights:
+  image: corsika/devel:u-18.04
+  stage: quality
+  tags:
+    - corsika
+  script:
+    - ./do-copyright.py
+  rules:
+    - if: $CI_MERGE_REQUEST_ID
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_BRANCH
+  allow_failure: true
+
+##########################################################
+check-clang-format:
+  image: corsika/devel:clang-8
+  stage: quality
+  tags:
+    - corsika
+  script:
+    - ./do-clang-format.py --all
+  rules:
+    - if: $CI_MERGE_REQUEST_ID
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_BRANCH
+  allow_failure: true
+
+### CodeQuality tool ####
+#include:
+#  - template: Code-Quality.gitlab-ci.yml
+#
+#code_quality:
+#  stage: quality
+#  rules:
+#    - if: '$CODE_QUALITY_DISABLED'
+#      when: never
+#    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # Run code quality job in merge request pipelines
+#    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'      # Run code quality job in pipelines on the master branch (but not in other branch pipelines)
+#    - if: '$CI_COMMIT_TAG'                               # Run code quality job in pipelines for tags
+
+####### CONFIG ##############
+
+##########################################################
+# the generic config template job
+# job/stage to just prepare cmake
+.config:
+  stage: config
+  tags:
+    - corsika
+  script:
+    - mkdir -p build
+    - cd build
+    - cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=Debug -DUSE_Pythia8_C8=C8
+  rules:
+    - if: $CI_MERGE_REQUEST_ID
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_BRANCH
+  artifacts:
+    when: on_failure
+    expire_in: 3 days
+    paths:
+      - ${CI_PROJECT_DIR}/build/CMakeFiles/CMakeOutput.log
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull-push    
+
+# config for gcc
+config-u-18_04:
+  extends: .config
+  image: corsika/devel:u-18.04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# config for clang
+config-clang-8:
+  extends: .config
+  image: corsika/devel:clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+####### BUILD (only manual) ##############
+
+##########################################################
+# the generic build template job
+# normal pipeline for each commit
+.build:
+  stage: build
+  tags:
+    - corsika
+  script:
+    - cd build
+    - cmake --build . -- -j4
+  rules:
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+    - if: $CI_COMMIT_TAG
+      when: manual
+    - if: $CI_COMMIT_BRANCH
+      when: manual
+  allow_failure: true
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull-push
+
+# build for gcc
+build-u-18_04:
+  extends: .build
+  image: corsika/devel:u-18.04
+  dependencies:
+    - config-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# build for clang
+build-clang-8:
+  extends: .build
+  image: corsika/devel:clang-8
+  dependencies:
+    - config-clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+####### TEST (only manual)  ##############
+
+##########################################################
+# generic test template job
+# normal pipeline for each commit
+.test:
+  stage: test
+  tags:
+    - corsika
+  script:
+    - cd build
+    - set -o pipefail
+    - ctest -j4 
+  rules:
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+    - if: $CI_COMMIT_TAG
+      when: manual
+    - if: $CI_COMMIT_BRANCH
+      when: manual
+  allow_failure: true
+  artifacts:
+    when: always
+    expire_in: 3 days
+    reports:
+      junit:
+        - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull-push
+
+# test for gcc
+test-u-18_04:
+  extends: .test
+  image: corsika/devel:u-18.04
+  dependencies:
+    - build-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# test for clang
+test-clang-8:
+  extends: .test
+  image: corsika/devel:clang-8
+  dependencies:
+    - build-clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+####### BUILD-TEST (all builds <= Draft, default) ##############
+
+##########################################################
+# the generic build_test template job
+# normal pipeline for each commit
+.build_test:
+  stage: build_test
+  tags:
+    - corsika
+  script:
+    - cd build
+    - cmake --build . -- -j4
+    - set -o pipefail
+    - ctest -j4 
+  rules:
+    - if: '$CI_MERGE_REQUEST_ID && $CI_MERGE_REQUEST_TITLE =~ /^Draft:/'
+      allow_failure: false
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+      allow_failure: true
+  artifacts:
+    when: always
+    expire_in: 3 days
+    paths:
+      - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+    reports:
+      junit:
+        - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull-push
+
+# build_test for gcc
+build_test-u-18_04:
+  extends: .build_test
+  image: corsika/devel:u-18.04
+  dependencies:
+    - config-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# build_test for clang
+build_test-clang-8:
+  extends: .build_test
+  image: corsika/devel:clang-8
+  dependencies:
+    - config-clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+
+####### BUILD-TEST-EXAMPLE (only non-Draft)  ##############
+
+##########################################################
+# generic example template job
+# normal pipeline for each commit
+.build_test_example:
+  stage: build_test_example
+  tags:
+    - corsika
+  script:
+    - cd build
+    - cmake --build . -- -j4
+    - set -o pipefail
+    - ctest -j4
+    - make install
+    - mkdir -p build_examples
+    - cd build_examples
+    - cmake ../install/share/corsika/examples
+    - make -j4
+    - make -j4 run_examples | gzip -v -9 > examples.log.gz
+  rules:
+    - if: '$CI_MERGE_REQUEST_ID && $CI_MERGE_REQUEST_TITLE =~ /^Draft:/'
+      when: manual
+      allow_failure: true
+    - if: $CI_COMMIT_BRANCH
+    - if: $CI_MERGE_REQUEST_ID
+    - if: $CI_COMMIT_TAG
+      when: manual
+      allow_failure: true
+  artifacts:
+    when: always
+    expire_in: 3 days
+    reports:
+      junit:
+        - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+    paths:
+      - ${CI_PROJECT_DIR}/build/build_examples/examples.log.gz
+      - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull
+
+# build_test_example for gcc
+build_test_example-u-18_04:
+  extends: .build_test_example
+  image: corsika/devel:u-18.04
+  dependencies:
+    - config-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# build_test_example for clang
+build_test_example-clang-8:
+  extends: .build_test_example
+  image: corsika/devel:clang-8
+  dependencies:
+    - config-clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+####### INSTALL  ##############
+
+##########################################################
+# generic install template job
+# make install
+.install:
+  stage: install
+  tags:
+    - corsika
+  script:
+    - cd build
+    - set -o pipefail
+    - make -j2 install
+  rules:
+    - if: '$CI_MERGE_REQUEST_LABELS =~ /Ready for code review/' # run on merge requests, if label 'Ready for code review' is set
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+      when: manual
+      allow_failure: true
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+      allow_failure: true
+    - if: $CI_COMMIT_TAG
+      when: manual
+      allow_failure: true
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull
+
+# install for gcc
+install-u-18_04:
+  extends: .install
+  image: corsika/devel:u-18.04
+  dependencies:
+    - build-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# install for clang
+install-clang-8:
+  extends: .install
+  image: corsika/devel:clang-8
+  dependencies:
+    - build-clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+####### OPTIONAL ##############
+
+##########################################################
+# generic release template job
+# optional release pipeline for each commit
+.release:
+  stage: optional
+  tags:
+    - corsika
+  script:
+    - cd build
+    - cmake .. -DCMAKE_BUILD_TYPE=Release -DUSE_Pythia8_C8=C8
+    - cmake --build . -- -j4
+    - set -o pipefail
+    - ctest -j4
+    - make install
+    - mkdir -p build_examples
+    - cd build_examples
+    - cmake ../install/share/corsika/examples
+    - make -j4
+    - make -j4 run_examples | gzip -v -9 > examples.log.gz
+  rules:
+    - if: '$CI_MERGE_REQUEST_LABELS =~ /Ready for code review/' # run on merge requests, if label 'Ready for code review' is set
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+      when: manual
+      allow_failure: true
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+      allow_failure: true
+    - if: $CI_COMMIT_TAG
+      when: manual
+      allow_failure: true
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull
+  artifacts:
+    when: always
+    expire_in: 3 days
+    reports:
+      junit:
+        - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+    paths:
+      - ${CI_PROJECT_DIR}/build/build_examples/examples.log.gz
+      - ${CI_PROJECT_DIR}/build/test_outputs/junit*.xml
+
+# release for gcc
+release-full-u-18_04:
+  extends: .release
+  image: corsika/devel:u-18.04
+  dependencies:
+    - config-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+# release for clang
+release-full-clang-8:
+  extends: .release
+  image: corsika/devel:clang-8
+  dependencies:
+    - config-clang-8
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang"
+
+
+
+
+##########################################################
+# the coverage generation should either run when manually requested, OR always on the master
+
+coverage:
+  image: corsika/devel:u-18.04
+  dependencies:
+    - config-u-18_04
+  stage: optional
+  tags:
+    - corsika
+  script:
+    - cd build
+    - cmake .. -DCMAKE_BUILD_TYPE=Coverage -DUSE_Pythia8_C8=C8
+    - cmake --build . -- -j4
+    - ctest -j4 
+    - cmake --build . --target coverage
+    - tar czf coverage-report.tar.gz coverage-report
+  coverage: '/^.*lines\.+:\s(.*\%)\s/'
+  rules:
+    - if: '$CI_MERGE_REQUEST_LABELS =~ /Ready for code review/' # run on merge requests, if label 'Ready for code review' is set
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+      allow_failure: true
+    - if: $CI_COMMIT_TAG
+      when: manual
+      allow_failure: true
+  artifacts:
+    when: always
+    expire_in: 1 year
+    paths:
+      - ${CI_PROJECT_DIR}/build/coverage-report.tar.gz
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+
+
+
+
+
+
+##########################################################
+sanity:
+  image: corsika/devel:u-18.04
+  dependencies:
+    - config-u-18_04
+  stage: optional
+  tags:
+    - corsika
+  script:
+    - cd build
+    - cmake .. -DWITH_CORSIKA_SANITIZERS_ENABLED=ON
+    - cmake --build . -- -j4
+  rules:
+    - if: '$CI_MERGE_REQUEST_LABELS =~ /Ready for code review/' # run on merge requests, if label 'Ready for code review' is set
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+      when: manual
+      allow_failure: true
+    - if: $CI_MERGE_REQUEST_ID
+      when: manual
+      allow_failure: true
+    - if: $CI_COMMIT_TAG
+      when: manual
+      allow_failure: true
+  cache:
+    paths:
+      - ${CI_PROJECT_DIR}/build/
+    untracked: true
+    policy: pull
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+
+##########################################################
+# template for all Python jobs
+.python:
+  stage: python
+  tags:
+    - corsika
+  before_script:
+    - apt-get update && apt-get install -y python3-pip
+    - pip3 install --upgrade cython
+  script:
+    - cd ${CI_PROJECT_DIR}/python  # change into the Python directory
+    - pip3 install --user -e '.[test]'  # install the package + test deps
+    - python3 --version
+    - python3 -m mypy corsika
+    - python3 -m isort --atomic --check-only corsika tests
+    - python3 -m black -t py37 corsika tests
+    - python3 -m flake8 corsika tests
+    - python3 -m pytest --cov=corsika tests
+    - cd ${CI_PROJECT_DIR}  # reset the directory
+  coverage: '/^TOTAL\s*\d+\s*\d+\s*(.*\%)/'
+
+# the default Python version Ubuntu 18.04 is Python3.8
+python-3.8:
+  extends: .python
+  image: corsika/devel:u-18.04
+  dependencies:
+    - build-u-18_04
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc"
+  artifacts:
+    when: always
+    expire_in: 1 year
+    paths:
+      - ${CI_PROJECT_DIR}/Python/python-test.log
+  allow_failure: true