diff --git a/substrate/.gitlab-ci.yml b/substrate/.gitlab-ci.yml
index 25d61cf34961582ad30f566d377baf945716bae2..dcc0cbb7c9693e275e1dd1bbd392e94ff7a52fcb 100644
--- a/substrate/.gitlab-ci.yml
+++ b/substrate/.gitlab-ci.yml
@@ -81,8 +81,14 @@ default:
     paths:
       - artifacts/
 
+.job-switcher:
+  before_script:
+    - if echo "$CI_DISABLED_JOBS" | grep -xF "$CI_JOB_NAME"; then echo "The job has been cancelled in CI settings"; exit 0; fi
+
 .kubernetes-env:
   image:                           "${CI_IMAGE}"
+  before_script:
+    - !reference [.job-switcher, before_script]
   tags:
     - kubernetes-parity-build
 
@@ -95,6 +101,7 @@ default:
 
 .pipeline-stopper-vars:
   script:
+    - !reference [.job-switcher, before_script]
     - echo "Collecting env variables for the cancel-pipeline job"
     - echo "FAILED_JOB_URL=${CI_JOB_URL}" > pipeline-stopper.env
     - echo "FAILED_JOB_NAME=${CI_JOB_NAME}" >> pipeline-stopper.env
@@ -110,6 +117,7 @@ default:
   before_script:
     # TODO: remove unset invocation when we'll be free from 'ENV RUSTC_WRAPPER=sccache' & sccache itself in all images
     - unset RUSTC_WRAPPER
+    - !reference [.job-switcher, before_script]
     - !reference [.rust-info-script, script]
     - !reference [.rusty-cachier, before_script]
     - !reference [.pipeline-stopper-vars, script]
@@ -300,7 +308,6 @@ rusty-cachier-notify:
     PR_NUM:                        "${PR_NUM}"
   trigger:
     project:                       "parity/infrastructure/ci_cd/pipeline-stopper"
-    branch:                        "as-improve"
 
 remove-cancel-pipeline-message:
   stage: .post
diff --git a/substrate/scripts/ci/gitlab/pipeline/build.yml b/substrate/scripts/ci/gitlab/pipeline/build.yml
index 2f8cff7b3ffa62516149590fa3df8f24fe8fba6b..ba529569d0fc14b136712f8dc7eff75e73afffe4 100644
--- a/substrate/scripts/ci/gitlab/pipeline/build.yml
+++ b/substrate/scripts/ci/gitlab/pipeline/build.yml
@@ -62,6 +62,7 @@ build-linux-substrate:
     - job:                         test-linux-stable
       artifacts:                   false
   before_script:
+    - !reference [.job-switcher, before_script]
     - mkdir -p ./artifacts/substrate/
     - !reference [.rusty-cachier, before_script]
     # tldr: we need to checkout the branch HEAD explicitly because of our dynamic versioning approach while building the substrate binary
@@ -94,6 +95,7 @@ build-linux-substrate:
     # this variable gets overriden by "rusty-cachier environment inject", use the value as default
     CARGO_TARGET_DIR:              "$CI_PROJECT_DIR/target"
   before_script:
+    - !reference [.job-switcher, before_script]
     - mkdir -p ./artifacts/subkey
     - !reference [.rusty-cachier, before_script]
   script:
@@ -118,6 +120,7 @@ build-subkey-macos:
   # duplicating before_script & script sections from .build-subkey hidden job
   # to overwrite rusty-cachier integration as it doesn't work on macos
   before_script:
+    - !reference [.job-switcher, before_script]
     - mkdir -p ./artifacts/subkey
   script:
     - cd ./bin/utils/subkey
diff --git a/substrate/scripts/ci/gitlab/pipeline/publish.yml b/substrate/scripts/ci/gitlab/pipeline/publish.yml
index 381a1bc420ef35257709578b16d63920eaa7fc2b..6a0d6d6341304bf63484b4b7f3893d69cc3d5f56 100644
--- a/substrate/scripts/ci/gitlab/pipeline/publish.yml
+++ b/substrate/scripts/ci/gitlab/pipeline/publish.yml
@@ -12,6 +12,7 @@
     DOCKERFILE:                    $PRODUCT.Dockerfile
     IMAGE_NAME:                    docker.io/$IMAGE_PATH
   before_script:
+    - !reference [.job-switcher, before_script]
     - cd ./artifacts/$PRODUCT/
     - VERSION="$(cat ./VERSION)"
     - echo "${PRODUCT} version = ${VERSION}"
diff --git a/substrate/scripts/ci/gitlab/pipeline/test.yml b/substrate/scripts/ci/gitlab/pipeline/test.yml
index ea1240af8bd57932cc28c75aeff895c9b6622907..a468a7b04caeb373f848a2b871d25155aba8ac1c 100644
--- a/substrate/scripts/ci/gitlab/pipeline/test.yml
+++ b/substrate/scripts/ci/gitlab/pipeline/test.yml
@@ -65,6 +65,7 @@ cargo-check-benches:
   before_script:
     # perform rusty-cachier operations before any further modifications to the git repo to make cargo feel cheated not so much
     - !reference [.rust-info-script, script]
+    - !reference [.job-switcher, before_script]
     - !reference [.rusty-cachier, before_script]
     - !reference [.pipeline-stopper-vars, script]
     # merges in the master branch on PRs
@@ -414,6 +415,7 @@ cargo-check-each-crate-macos:
     - .collect-artifacts
     - .pipeline-stopper-artifacts
   before_script:
+    - !reference [.job-switcher, before_script]
     - !reference [.rust-info-script, script]
     - !reference [.pipeline-stopper-vars, script]
   variables: