diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 920bd375c4d8fba8cdd1498ba851102623b32d80..29bf2c3476b3b49c15a5d551358ccdfdd65227e8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,5 @@
 stages:
-  - pre-check
+  - preparation
   - build
   - check
   - gui
@@ -11,7 +11,6 @@ variables:
   CONTAINER_GCC_IMAGE: $CI_REGISTRY/ogs/$CI_PROJECT_NAME/gcc
   CONTAINER_GCC_GUI_IMAGE: $CI_REGISTRY/ogs/$CI_PROJECT_NAME/gcc-gui
   CONTAINER_CLANG_IMAGE: $CI_REGISTRY/ogs/$CI_PROJECT_NAME/clang
-  CONTAINER_TAG: latest
   XUNIT_TO_JUNIT_IMAGE: $CI_REGISTRY/ogs/$CI_PROJECT_NAME/xunit-to-junit
   PRECOMMIT_IMAGE: $CI_REGISTRY/ogs/$CI_PROJECT_NAME/pre-commit
   WEB_IMAGE: $CI_REGISTRY/ogs/$CI_PROJECT_NAME/web
diff --git a/scripts/ci/extends/template-build-dockerfile.yml b/scripts/ci/extends/template-build-dockerfile.yml
index 8a8404325f98f0db99965b6b84d043cf3658a8b3..252ac45e1732dd2de2589836a5ade329dc58a9b8 100644
--- a/scripts/ci/extends/template-build-dockerfile.yml
+++ b/scripts/ci/extends/template-build-dockerfile.yml
@@ -15,8 +15,6 @@
       - scripts/ci/extends/template-build-dockerfile.yml
   tags:
     - docker-shell
-  variables:
-    GIT_LFS_SKIP_SMUDGE: "1"
   script:
     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
     - docker pull $IMAGE_REF || true
diff --git a/scripts/ci/extends/template-build-linux.yml b/scripts/ci/extends/template-build-linux.yml
index 995cb4b43695aa7a57e68c2cf59fc5114ab0229d..dd4594d4b72ab5aad70e943fa5100d0e68ca6aa4 100644
--- a/scripts/ci/extends/template-build-linux.yml
+++ b/scripts/ci/extends/template-build-linux.yml
@@ -4,7 +4,7 @@
     - docker
   extends:
     - .test-artifacts
-
+  dependencies: [meta, meta_container]
   variables:
     CCACHE_DIR: "$CI_PROJECT_DIR/.ccache"
 
diff --git a/scripts/ci/extends/template-build-win.yml b/scripts/ci/extends/template-build-win.yml
index 35e5837d93d3a88b860b74d9f75351b817a270a4..7cb85ec78b143635fcd819571b57b506f8c275bf 100644
--- a/scripts/ci/extends/template-build-win.yml
+++ b/scripts/ci/extends/template-build-win.yml
@@ -4,6 +4,7 @@
     - windows
   extends:
     - .vs2019-environment
+  dependencies: [meta, meta_container]
   variables:
   script:
     - mkdir -p $env:BUILD_DIR
diff --git a/scripts/ci/jobs/build-docs.yml b/scripts/ci/jobs/build-docs.yml
index f19bf986ee51805e6a1988f3b2eca2acc9b6c341..9639f63c9816e7f67978980d9f4ae935660872e1 100644
--- a/scripts/ci/jobs/build-docs.yml
+++ b/scripts/ci/jobs/build-docs.yml
@@ -2,18 +2,15 @@ build docs:
   stage: build
   image:
     name: $CONTAINER_GCC_IMAGE
-  needs: [meta]
-
+  dependencies: [meta, meta_container]
   before_script:
     # HACK to easier linking to the generated pages
     - echo '<meta http-equiv="REFRESH" content="0;URL=build/docs/index.html">' >> Doxygen.html
     - mkdir -p build
     - cd build
-
   script:
     - cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DOGS_USE_CONAN=OFF -DOGS_BUILD_PROCESSES=GroundwaterFlow
     - cmake --build . --target doc > >(tee make-docs.output)
-
   artifacts:
     expose_as: 'Doxygen'
     paths:
@@ -24,8 +21,7 @@ build docs:
 check docs links:
   stage: check
   image: $WEB_IMAGE
-  needs:
-    - job: build docs
+  dependencies: [meta_container, "build docs"]
   extends:
       - .rules-master-manual
   script:
@@ -42,8 +38,7 @@ deploy doxygen:
   image: $WEB_IMAGE
   rules:
     - if: '$CI_COMMIT_BRANCH == "master"'
-  needs:
-    - job: build docs
+  dependencies: [meta_container, "build docs"]
   variables:
     GIT_STRATEGY: none
   script:
diff --git a/scripts/ci/jobs/build-gui-linux.yml b/scripts/ci/jobs/build-gui-linux.yml
index efc4b9e86ff0308e98088a3dd1269aace033f338..be06bc9f3208a90b73578d6385d3b5418c64c35c 100644
--- a/scripts/ci/jobs/build-gui-linux.yml
+++ b/scripts/ci/jobs/build-gui-linux.yml
@@ -6,10 +6,6 @@ build gui linux:
   tags:
     - envinf1
     - docker
-  needs:
-    - meta
-    - job: build linux
-      artifacts: false
   rules:
     - if: '$CI_COMMIT_BRANCH == "master"'
     - changes:
diff --git a/scripts/ci/jobs/build-gui-mac.yml b/scripts/ci/jobs/build-gui-mac.yml
index d5f81bccdc8214c234061bede38dc1fea493fbac..6d519473c7c176b0fdb57a572578070ab10c93ae 100644
--- a/scripts/ci/jobs/build-gui-mac.yml
+++ b/scripts/ci/jobs/build-gui-mac.yml
@@ -1,10 +1,6 @@
 build gui mac:
   extends: .template-build-linux
   stage: gui
-  needs:
-    - meta
-    - job: build mac
-      artifacts: false
   tags:
     - mac
   rules:
diff --git a/scripts/ci/jobs/build-gui-win.yml b/scripts/ci/jobs/build-gui-win.yml
index 12d32cd0b0933f8bb29b8e35fda083bc4b58b7a0..13d94a8b8de84f274f2174d67873fdbb0c75b61e 100644
--- a/scripts/ci/jobs/build-gui-win.yml
+++ b/scripts/ci/jobs/build-gui-win.yml
@@ -1,10 +1,6 @@
 build gui win:
   extends: .template-build-win
   stage: gui
-  needs:
-    - meta
-    - job: build win
-      artifacts: false
   rules:
     - if: '$CI_COMMIT_BRANCH == "master"'
     - changes:
diff --git a/scripts/ci/jobs/build-linux-frontend.yml b/scripts/ci/jobs/build-linux-frontend.yml
index 9cdd3a5fb30ef62261406d09ec34f594aae7a0cf..9532d91bff223c977fa84174dd3bf26e96c95cc9 100644
--- a/scripts/ci/jobs/build-linux-frontend.yml
+++ b/scripts/ci/jobs/build-linux-frontend.yml
@@ -4,7 +4,6 @@ build linux frontend:
     - .rules-master-manual
   tags:
     - frontend2
-  needs: [meta]
   variables:
     BUILD_DIR: "build"
     CCACHE_DIR: "/data/ogs/.ccache"
diff --git a/scripts/ci/jobs/build-linux-petsc.yml b/scripts/ci/jobs/build-linux-petsc.yml
index 768514dae816d5f1a788a732ff19fc7623ab9981..41f6a75142b16de00babbfb5a988e694fcb4d542 100644
--- a/scripts/ci/jobs/build-linux-petsc.yml
+++ b/scripts/ci/jobs/build-linux-petsc.yml
@@ -2,7 +2,6 @@ build linux petsc:
   extends: .template-build-linux
   tags:
     - envinf1-shell
-  needs: [meta]
   variables:
     BUILD_DIR: "build-petsc"
     CMAKE_ARGS: "-DOGS_USE_CONAN=OFF -DOGS_USE_PETSC=ON -DBUILD_SHARED_LIBS=ON"
diff --git a/scripts/ci/jobs/build-linux.yml b/scripts/ci/jobs/build-linux.yml
index 2fb29d135b840ae1975c695e8d7bb7bf89cf7265..702e35971950f42c1dc3a75579c0d9a93a48d82e 100644
--- a/scripts/ci/jobs/build-linux.yml
+++ b/scripts/ci/jobs/build-linux.yml
@@ -11,4 +11,3 @@ build linux:
       -DOGS_USE_PYTHON=ON
   image:
     name: $CONTAINER_GCC_IMAGE
-  needs: [meta]
diff --git a/scripts/ci/jobs/build-mac.yml b/scripts/ci/jobs/build-mac.yml
index 0632b6634fd55878d08b6d606d742f24eb815df4..3ede1d8ec3c21d7d6ed54814c98a5cc3db33d8a7 100644
--- a/scripts/ci/jobs/build-mac.yml
+++ b/scripts/ci/jobs/build-mac.yml
@@ -2,7 +2,6 @@ build mac:
   extends: .template-build-linux
   tags:
     - mac
-  needs: [meta]
   variables:
     BUILD_DIR: "build-mac"
     CMAKE_ARGS: >-
diff --git a/scripts/ci/jobs/build-win.yml b/scripts/ci/jobs/build-win.yml
index 1f3212e46ff2450b452581298b65c3cd3dddba90..1a2b931cb649cd56a62fd9843e6da7c79ab95136 100644
--- a/scripts/ci/jobs/build-win.yml
+++ b/scripts/ci/jobs/build-win.yml
@@ -1,6 +1,5 @@
 build win:
   extends: .template-build-win
-  needs: [meta]
   variables:
     BUILD_DIR: build-win
     CMAKE_ARGS: >-
diff --git a/scripts/ci/jobs/build_image.yml b/scripts/ci/jobs/build_image.yml
index e1b4c67b3b9758aca6d995998d504be7dc778dad..498d47c4b7ea8ad19792c890aafd0a7a5a57573c 100644
--- a/scripts/ci/jobs/build_image.yml
+++ b/scripts/ci/jobs/build_image.yml
@@ -1,33 +1,23 @@
 build container images:
-  stage: .pre
+  stage: preparation
   rules:
-    # TODO
-    # - changes:
-      # - ThirdParty/container-maker
-      # - scripts/ci/jobs/build_image.yml
-      # when: always
-    - if: '$CI_COMMIT_BRANCH == "master"'
-      when: always
-  tags:
-    - envinf1-shell # can be changed back when instance-level vars are implemented
-
-  variables:
-    GIT_LFS_SKIP_SMUDGE: "1"
+    - changes:
+      - ThirdParty/container-maker
+      - scripts/ci/jobs/build_image.yml
+  dependencies: [meta_container]
+  tags: [docker-shell]
   extends: .container-maker-setup
   script:
-    - docker login -u $OGS_CI_REGISTRY_USER -p $OGS_CI_REGISTRY_PASSWORD $CI_REGISTRY
-    - docker pull registry.opengeosys.org/ogs/ogs/ogs/gcc || true
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
     - python ThirdParty/container-maker/ogscm/cli.py --build --ogs off
-      --pm system --cvode --cppcheck --docs --gcovr
-      --tag $CONTAINER_GCC_IMAGE:$CONTAINER_TAG --upload
-    - docker pull registry.opengeosys.org/ogs/ogs/ogs/gcc-gui || true
+      --pm system --cvode --cppcheck --docs --gcovr --tfel
+      --tag $CONTAINER_GCC_IMAGE --upload
     - python ThirdParty/container-maker/ogscm/cli.py --build --ogs off
       --pm system --cvode --cppcheck --docs --gcovr --gui
-      --tag $CONTAINER_GCC_GUI_IMAGE:$CONTAINER_TAG --upload
-    - docker pull registry.opengeosys.org/ogs/ogs/ogs/clang || true
+      --tag $CONTAINER_GCC_GUI_IMAGE --upload
     - python ThirdParty/container-maker/ogscm/cli.py --build --ogs off
       --compiler clang --compiler_version 9
-      --tag $CONTAINER_CLANG_IMAGE:$CONTAINER_TAG --upload
+      --tag $CONTAINER_CLANG_IMAGE --upload
 
 ### global project images ###
 build xunit-to-junit image:
@@ -39,14 +29,10 @@ build xunit-to-junit image:
       - scripts/ci/jobs/build_image.yml
   tags:
     - docker-shell
-
-  variables:
-    GIT_LFS_SKIP_SMUDGE: "1"
   script:
     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
-    - docker pull $XUNIT_TO_JUNIT_IMAGE:latest || true
-    - docker build --cache-from $XUNIT_TO_JUNIT_IMAGE:latest -t $XUNIT_TO_JUNIT_IMAGE:latest -f scripts/docker/saxon/Dockerfile scripts/docker/saxon
-    - docker push $XUNIT_TO_JUNIT_IMAGE:latest
+    - docker build --cache-from $XUNIT_TO_JUNIT_IMAGE -t $XUNIT_TO_JUNIT_IMAGE -f scripts/docker/saxon/Dockerfile scripts/docker/saxon
+    - docker push $XUNIT_TO_JUNIT_IMAGE
 
 
 build pre-commit image:
@@ -58,13 +44,10 @@ build pre-commit image:
       - scripts/ci/jobs/build_image.yml
   tags:
     - docker-shell
-  variables:
-    GIT_LFS_SKIP_SMUDGE: "1"
   script:
     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
-    - docker pull $PRECOMMIT_IMAGE:latest || true
-    - docker build --cache-from $PRECOMMIT_IMAGE:latest -t $PRECOMMIT_IMAGE:latest -f scripts/docker/Dockerfile.pre-commit scripts/docker
-    - docker push $PRECOMMIT_IMAGE:latest
+    - docker build --cache-from $PRECOMMIT_IMAGE -t $PRECOMMIT_IMAGE -f scripts/docker/Dockerfile.pre-commit scripts/docker
+    - docker push $PRECOMMIT_IMAGE
 
 build web image:
   stage: .pre
@@ -75,10 +58,7 @@ build web image:
       - scripts/ci/jobs/build_image.yml
   tags:
     - docker-shell
-  variables:
-    GIT_LFS_SKIP_SMUDGE: "1"
   script:
     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
-    - docker pull $WEB_IMAGE:latest || true
-    - docker build --cache-from $WEB_IMAGE:latest -t $WEB_IMAGE:latest -f scripts/docker/Dockerfile.web scripts/docker
-    - docker push $WEB_IMAGE:latest
+    - docker build --cache-from $WEB_IMAGE -t $WEB_IMAGE -f scripts/docker/Dockerfile.web scripts/docker
+    - docker push $WEB_IMAGE
diff --git a/scripts/ci/jobs/check-header.yml b/scripts/ci/jobs/check-header.yml
index c08c0bd2d66f39b07552910b2b3e3ee03411a4cf..3aecf2df4bcfdb39d048ca017d440e9b7f9c6aca 100644
--- a/scripts/ci/jobs/check-header.yml
+++ b/scripts/ci/jobs/check-header.yml
@@ -4,17 +4,14 @@ check header:
   tags:
     - docker
   extends:
-    - .defaults
     - .rules-master-manual
-
+  dependencies: [meta_container]
   variables:
     BUILD_DIR: "build-check-header"
     CCACHE_DIR: "$CI_PROJECT_DIR/.ccache"
     CMAKE_ARGS: "-DOGS_CHECK_HEADER_COMPILATION=ON -DOGS_BUILD_UTILS=ON -DOGS_BUILD_GUI=ON -DOGS_USE_PYTHON=ON -DBUILD_SHARED_LIBS=ON"
-
   image:
     name: $CONTAINER_GCC_GUI_IMAGE
-
   script:
     - mkdir -p $BUILD_DIR
     - cd $BUILD_DIR
@@ -24,7 +21,6 @@ check header:
       -DCMAKE_BUILD_TYPE=$BUILD_TYPE
       -DOGS_BUILD_PROCESSES=$BUILD_PROCESSES || true
     - cat CMakeFiles/CMakeError.log
-
   cache:
     paths:
       - $CCACHE_DIR
diff --git a/scripts/ci/jobs/checks.yml b/scripts/ci/jobs/checks.yml
index f5a530d90b9c4ecc835fa1b5725cc1857d9c6da4..a9540c2342ddabdd6efe7ea4ea714de91a24ba8f 100644
--- a/scripts/ci/jobs/checks.yml
+++ b/scripts/ci/jobs/checks.yml
@@ -17,7 +17,6 @@ compiler warnings:
     - "if [[ $(cat make.output | grep warning -i) ]]; then echo 'There were Clang (macOS) compiler warnings:'; cat make.output | grep warning -i; exit_code=1; fi"
     - exit $exit_code
 
-
 ctest results:
   stage: check
   variables:
diff --git a/scripts/ci/jobs/clang-sanitizer.yml b/scripts/ci/jobs/clang-sanitizer.yml
index 03a3d6691231a2e0f98254ef1b81e7cea9c2ccac..56025a5f2ad5c27bc44638c231f829ac27b403dd 100644
--- a/scripts/ci/jobs/clang-sanitizer.yml
+++ b/scripts/ci/jobs/clang-sanitizer.yml
@@ -1,20 +1,15 @@
 clang sanitizer:
   stage: check
-  tags:
-    - docker
   extends:
-    - .defaults
     - .rules-manual
-
+  dependencies: [meta_container]
   variables:
     BUILD_DIR: "build-sanitizer"
     CMAKE_ARGS: "-DOGS_ADDRESS_SANITIZER=ON -DOGS_UNDEFINED_BEHAVIOR_SANITIZER=ON -DOGS_BUILD_UTILS=ON"
     UBSAN_OPTIONS: "print_stacktrace=1"
     LSAN_OPTIONS: "suppressions=$CI_PROJECT_DIR/scripts/test/leak_sanitizer.suppressions"
-
   image:
     name: $CONTAINER_CLANG_IMAGE
-
   script:
     - mkdir -p $BUILD_DIR
     - cd $BUILD_DIR
diff --git a/scripts/ci/jobs/clang-tidy.yml b/scripts/ci/jobs/clang-tidy.yml
index bc2a24a09277a9b424b1b84bba61969737750e4b..ae03354c33a1dd8be90c32b36b6be30583d8a0a9 100644
--- a/scripts/ci/jobs/clang-tidy.yml
+++ b/scripts/ci/jobs/clang-tidy.yml
@@ -1,11 +1,8 @@
 clang tidy:
   stage: check
-  tags:
-    - docker
   extends:
-    - .defaults
     - .rules-manual
-
+  dependencies: [meta_container]
   variables:
     BUILD_DIR: "build-tidy"
     CMAKE_ARGS: "-DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF -DCMAKE_CXX_CLANG_TIDY=clang-tidy-9"
diff --git a/scripts/ci/jobs/code-quality.yml b/scripts/ci/jobs/code-quality.yml
index 42a76ea4f4b6ea136de4267a28ffd87e9bbd7f60..35d24fb68df66959281e12b7cad7f78e1fed1006 100644
--- a/scripts/ci/jobs/code-quality.yml
+++ b/scripts/ci/jobs/code-quality.yml
@@ -1,7 +1,6 @@
 code_quality:
   stage: check
-  extends:
-    - .defaults
+  needs: []
   rules:
   variables:
     DOCKER_TLS_CERTDIR: "/certs"
diff --git a/scripts/ci/jobs/container.yml b/scripts/ci/jobs/container.yml
index 6a72152961081872bae26f4666e5becf80e1710f..9a4858443d2df63b9ce9f89e87c42de0d5f54163 100644
--- a/scripts/ci/jobs/container.yml
+++ b/scripts/ci/jobs/container.yml
@@ -9,7 +9,6 @@ container:
   variables:
     OPENMPI_VERSIONS: 'off' # 4.0.1
   extends:
-    - .defaults
     - .container-maker-setup
   script:
     - python ThirdParty/container-maker/ogscm/cli.py -B -C -R --ogs . --pm system --cvode --ompi $OPENMPI_VERSIONS
diff --git a/scripts/ci/jobs/meta.yml b/scripts/ci/jobs/meta.yml
index 213210e4fe1c0d3b252a7949f4cf936046f75c84..0abac260b9357ae4e88346f3658f741b763d2924 100644
--- a/scripts/ci/jobs/meta.yml
+++ b/scripts/ci/jobs/meta.yml
@@ -1,7 +1,7 @@
 meta:
   stage: .pre
-  tags:
-    - envinf1-shell
+  tags: [shell]
+    - shell
   script:
     - git fetch --depth 500
     - echo "OGS_VERSION=${CI_COMMIT_TAG:-`git describe --tags --long --dirty --always`}" >> build.env
@@ -9,3 +9,19 @@ meta:
   artifacts:
     reports:
       dotenv: build.env
+
+meta_container:
+  stage: .pre
+  tags: [shell]
+  rules:
+    - changes:
+      - ThirdParty/container-maker
+      - scripts/ci/jobs/build_image.yml
+  script:
+    - echo "CONTAINER_GCC_IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/gcc:$CI_COMMIT_REF_SLUG" >> build.env
+    - echo "CONTAINER_GCC_GUI_IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/gcc-gui:$CI_COMMIT_REF_SLUG" >> build.env
+    - echo "CONTAINER_CLANG_IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/clang:$CI_COMMIT_REF_SLUG" >> build.env
+    - cat build.env
+  artifacts:
+    reports:
+      dotenv: build.env
diff --git a/scripts/ci/jobs/pre-commit.yml b/scripts/ci/jobs/pre-commit.yml
index 7adcf4f9f0e28c58554a176dbdf55236f46b1312..73d530dfea2ee4f70afcaac96bdebec02018073e 100644
--- a/scripts/ci/jobs/pre-commit.yml
+++ b/scripts/ci/jobs/pre-commit.yml
@@ -1,9 +1,8 @@
 pre commit:
-  stage: pre-check
+  stage: preparation
   image:
     name: $PRECOMMIT_IMAGE
-  extends:
-    - .defaults
+  dependencies: [meta_container]
   rules:
     - if: '$CI_COMMIT_BRANCH == "master"'
       when: never
diff --git a/scripts/ci/jobs/tests-large.yml b/scripts/ci/jobs/tests-large.yml
index 5463bb21fe4f6f286d2be6ea48d479b500d337b1..0424a74077824a260c5b353f1770a929cfdf7640 100644
--- a/scripts/ci/jobs/tests-large.yml
+++ b/scripts/ci/jobs/tests-large.yml
@@ -4,17 +4,14 @@ tests large:
     - docker
     - envinf1
   extends:
-    - .defaults
     - .rules-master-manual
-
+  dependencies: [meta_container]
   variables:
     BUILD_DIR: "build-tests-large"
     CCACHE_DIR: "$CI_PROJECT_DIR/.ccache"
     CMAKE_ARGS: "-DOGS_USE_CONAN=OFF"
-
   image:
     name: $CONTAINER_GCC_IMAGE
-
   script:
     - git lfs install
     - git lfs fetch
@@ -27,11 +24,9 @@ tests large:
       -DCMAKE_BUILD_TYPE=$BUILD_TYPE
       -DOGS_BUILD_PROCESSES=$BUILD_PROCESSES
     - cmake --build . --target ctest-large
-
   artifacts:
     paths:
       - $BUILD_DIR/Tests/ctest.xml
-
   cache:
     paths:
       - $CCACHE_DIR
diff --git a/scripts/ci/jobs/web.yml b/scripts/ci/jobs/web.yml
index afa5d414acaad9c580a5ed78aef76b69b98d3371..5fc59561ee9a18d35f2705bfa9d455f443f604ab 100644
--- a/scripts/ci/jobs/web.yml
+++ b/scripts/ci/jobs/web.yml
@@ -5,7 +5,7 @@ web url checker:
     - docker
   extends:
     - .rules-manual
-  needs: []
+  dependencies: [meta_container]
   image:
     name: $WEB_IMAGE
   script:
@@ -19,8 +19,7 @@ web url checker:
 preview web site:
   stage: build
   image: $WEB_IMAGE
-  extends:
-    - .defaults
+  dependencies: [meta_container]
   script:
     # HACK to easier linking to the generated pages
     - echo '<meta http-equiv="REFRESH" content="0;URL=web/public/index.html">' >> WebPreview.html
@@ -45,7 +44,7 @@ preview web site:
 deploy web site:
   stage: package
   image: $WEB_IMAGE
-  needs: []
+  dependencies: [meta_container]
   rules:
     - if: '$CI_COMMIT_BRANCH == "master"'
       changes: