diff --git a/polkadot/.github/workflows/auto-label-prs.yml b/polkadot/.github/workflows/auto-label-prs.yml
deleted file mode 100644
index 50539b80b98b74748835286166b36fbf100f2314..0000000000000000000000000000000000000000
--- a/polkadot/.github/workflows/auto-label-prs.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: Label PRs
-on:
-  pull_request:
-    types: [opened,ready_for_review]
-
-jobs:
-  label-new-prs:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Label drafts
-        uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # 1.0.4
-        if: github.event.pull_request.draft == true
-        with:
-          add-labels: 'A3-inprogress'
-          remove-labels: 'A0-pleasereview'
-      - name: Label PRs
-        uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # 1.0.4
-        if: github.event.pull_request.draft == false && ! contains(github.event.pull_request.labels.*.name, 'A2-insubstantial')
-        with:
-          add-labels: 'A0-pleasereview'
-          remove-labels: 'A3-inprogress'
diff --git a/polkadot/.github/workflows/check-D-labels.yml b/polkadot/.github/workflows/check-D-labels.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9abefaa6fa10034c56432709ede371309a77df2b
--- /dev/null
+++ b/polkadot/.github/workflows/check-D-labels.yml
@@ -0,0 +1,50 @@
+name: Check D labels
+
+on:
+  pull_request:
+    types: [labeled, opened, synchronize, unlabeled]
+    paths:
+      - runtime/polkadot/**
+      - runtime/kusama/**
+      - runtime/common/**
+      - primitives/src/**
+
+jobs:
+  check-labels:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Pull image
+        env:
+          IMAGE: paritytech/ruled_labels:0.4.0
+        run: docker pull $IMAGE
+
+      - name: Check labels
+        env:
+          IMAGE: paritytech/ruled_labels:0.4.0
+          MOUNT: /work
+          GITHUB_PR: ${{ github.event.pull_request.number }}
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          API_BASE: https://api.github.com/repos
+          REPO: ${{ github.repository }}
+          RULES_PATH: labels/ruled_labels
+          CHECK_SPECS: specs_polkadot.yaml
+        run: |
+          echo "REPO: ${REPO}"
+          echo "GITHUB_PR: ${GITHUB_PR}"
+          # Clone repo with labels specs
+          git clone https://github.com/paritytech/labels
+          # Fetch the labels for the PR under test
+          labels=$( curl -H "Authorization: token ${GITHUB_TOKEN}" -s "$API_BASE/${REPO}/pulls/${GITHUB_PR}" | jq '.labels | .[] | .name' | tr "\n" ",")
+
+          if [ -z "${labels}" ]; then
+            docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --tags audit --no-label
+          fi
+
+          labels_args=${labels: :-1}
+          printf "Checking labels: %s\n" "${labels_args}"
+
+          # Prevent the shell from splitting labels with spaces
+          IFS=","
+
+          # --dev is more useful to debug mode to debug
+          docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --labels ${labels_args} --dev --tags audit
diff --git a/polkadot/.github/workflows/check-labels.yml b/polkadot/.github/workflows/check-labels.yml
index f0f5556ebedee9aa0154488894edaf272ad4955a..df0a0e9cf02dd182492f7ecbf5a8bf9c4ebbf254 100644
--- a/polkadot/.github/workflows/check-labels.yml
+++ b/polkadot/.github/workflows/check-labels.yml
@@ -8,16 +8,38 @@ jobs:
   check-labels:
     runs-on: ubuntu-latest
     steps:
-      - name: Checkout sources
-        uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-          ref: ${{ github.event.pull_request.head.ref }}
-          repository: ${{ github.event.pull_request.head.repo.full_name }}
+      - name: Pull image
+        env:
+          IMAGE: paritytech/ruled_labels:0.4.0
+        run: docker pull $IMAGE
+
       - name: Check labels
-        run: bash ${{ github.workspace }}/scripts/ci/github/check_labels.sh
         env:
+          IMAGE: paritytech/ruled_labels:0.4.0
+          MOUNT: /work
           GITHUB_PR: ${{ github.event.pull_request.number }}
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          HEAD_SHA: ${{ github.event.pull_request.head.sha }}
-          BASE_SHA: ${{ github.event.pull_request.base.sha }}
+          API_BASE: https://api.github.com/repos
+          REPO: ${{ github.repository }}
+          RULES_PATH: labels/ruled_labels
+          CHECK_SPECS: specs_polkadot.yaml
+        run: |
+          echo "REPO: ${REPO}"
+          echo "GITHUB_PR: ${GITHUB_PR}"
+          # Clone repo with labels specs
+          git clone https://github.com/paritytech/labels
+          # Fetch the labels for the PR under test
+          labels=$( curl -H "Authorization: token ${GITHUB_TOKEN}" -s "$API_BASE/${REPO}/pulls/${GITHUB_PR}" | jq '.labels | .[] | .name' | tr "\n" ",")
+
+          if [ -z "${labels}" ]; then
+            docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --tags PR --no-label
+          fi
+
+          labels_args=${labels: :-1}
+          printf "Checking labels: %s\n" "${labels_args}"
+
+          # Prevent the shell from splitting labels with spaces
+          IFS=","
+
+          # --dev is more useful to debug mode to debug
+          docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --labels ${labels_args} --dev --tags PR