diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7ae7f1f1210aad6799d7da03c1d48be9fd15b7f7..0b83c1f92a5c157f026b3500b76806fec6ff3613 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,7 +2,7 @@ image: docker:latest
 
 workflow:
   rules:
-    # don't create a pipeline if its a commit pipeline, on a branch and that branch has open merge requests.
+    # Don't create a pipeline if commit is on a branch with open merge requests
     - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
       when: never
     - when: always
@@ -21,7 +21,8 @@ variables:
 stages:
   - versioning
   - build
-  - tests
+  - prepare_tests
+  - run_tests
   - docs
   - deploy
 
@@ -51,15 +52,13 @@ versioning:
 # Docker login
 .prepare:
   stage: build
-  needs: ["versioning"]
-  image: docker:latest
   tags:
     - dind
   before_script:
     - echo "Logging in as $CI_REGISTRY_USER @ $CI_REGISTRY"
     - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
 
-# Create and push the integration image to the gitlab registry, if it does not exist.
+# Create and push the integration image to the gitlab registry, if it does not exist
 build_base:
   stage: build
   extends: .prepare
@@ -84,15 +83,9 @@ build_base:
           -f Docker/Dockerfile-base .
         docker push $INTEGRATION_BASE_IMAGE
       fi
-  tags:
-    - das6
 
 install_linc:
   stage: build
-  needs: ["versioning","build_base"]
-  image: docker:latest
-  tags:
-    - dind
   extends: .prepare
   script:
     - |
@@ -105,9 +98,8 @@ install_linc:
     - docker push $INTEGRATION_IMAGE
 
 download_data:
-  needs: ["versioning","install_linc"]
   image: $INTEGRATION_IMAGE
-  stage: build
+  stage: prepare_tests
   script:
     - mkdir data && cd data
     - wget -nv https://support.astron.nl/software/ci_data/linc/$TEST_HBA_DATASET_NAME -O $TEST_HBA_DATASET_NAME && tar xfz $TEST_HBA_DATASET_NAME && rm -f $TEST_HBA_DATASET_NAME
@@ -122,9 +114,7 @@ download_data:
     - data
 
 validate_scripts:
-  stage: tests
-  # Versioning required for $INTEGRATION_IMAGE
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - |
@@ -136,30 +126,25 @@ validate_scripts:
       ((errors == 0))
 
 blsmooth:
-  stage: tests
-  # Versioning required for $INTEGRATION_IMAGE
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container steps/blsmooth.cwl test_jobs/blsmooth.json
 
 find_skymodel_cal:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PYTHONPATH steps/find_skymodel_cal.cwl test_jobs/find_skymodel_cal.json
 
 check_ateam_separation:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PATH --preserve-environment PYTHONPATH steps/check_ateam_separation.cwl test_jobs/check_ateam_separation.json
 
 run_hba_calibrator:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PATH --preserve-environment LINC_DATA_ROOT --preserve-environment PYTHONPATH --outdir results --leave-tmpdir --tmpdir-prefix /tmp/run_hba_calibrator/ workflows/HBA_calibrator.cwl test_jobs/HBA_calibrator.json
@@ -172,8 +157,7 @@ run_hba_calibrator:
     when: on_failure
 
 run_hba_target:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PATH --preserve-environment LINC_DATA_ROOT --preserve-environment PYTHONPATH --outdir results --leave-tmpdir --tmpdir-prefix /tmp/run_hba_target/ workflows/HBA_target.cwl test_jobs/HBA_target.json
@@ -190,8 +174,7 @@ run_hba_target:
     when: on_failure
 
 run_hba_target_selfcal:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PATH --preserve-environment LINC_DATA_ROOT --preserve-environment PYTHONPATH --outdir results --leave-tmpdir --tmpdir-prefix /tmp/run_hba_target/ workflows/HBA_target.cwl test_jobs/HBA_target_selfcal.json
@@ -208,8 +191,7 @@ run_hba_target_selfcal:
     when: on_failure
 
 run_lba_calibrator:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PATH --preserve-environment LINC_DATA_ROOT --preserve-environment PYTHONPATH --outdir results --leave-tmpdir --tmpdir-prefix /tmp/run_lba_calibrator workflows/LBA_calibrator.cwl test_jobs/LBA_calibrator.json
@@ -222,8 +204,7 @@ run_lba_calibrator:
     when: on_failure
 
 run_lba_target:
-  stage: tests
-  needs: ["versioning", "download_data"]
+  stage: run_tests
   image: $INTEGRATION_IMAGE
   script:
     - cwltool --no-container --preserve-environment PATH --preserve-environment LINC_DATA_ROOT --preserve-environment PYTHONPATH --outdir results --leave-tmpdir --tmpdir-prefix /tmp/run_lba_target/ workflows/LBA_target.cwl test_jobs/LBA_target.json
@@ -241,7 +222,6 @@ run_lba_target:
 
 build_doc:
   stage: docs
-  needs: ["versioning", "download_data"]
   image: $INTEGRATION_IMAGE
   before_script:
     - apt-get update
@@ -263,10 +243,6 @@ build_doc:
 # Deploy to docker hub
 deploy_docker:
   stage: deploy
-  needs: ["versioning", "download_data"]
-  image: docker:latest
-  tags:
-    - dind
   before_script:
     - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
     - echo $DH_REGISTRY_PASSWORD | docker login -u $DH_REGISTRY_USER --password-stdin
@@ -284,8 +260,6 @@ deploy_docker:
 # Deploy a release version
 deploy_release:
   stage: deploy
-  needs: ["versioning", "download_data"]
-  image: docker:latest
   tags:
     - dind
   before_script:
@@ -315,9 +289,7 @@ deploy_release:
 
 deploy_docker_tag_stable:
   stage: deploy
-  needs: ["versioning", "download_data"]
   when: manual
-  image: docker:latest
   tags:
     - dind
   before_script: