diff --git a/.github/workflows/deploy-on-okd.yml b/.github/workflows/deploy-on-okd.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bf13aecca4141f17354c2db444366f5fe8f99dd5
--- /dev/null
+++ b/.github/workflows/deploy-on-okd.yml
@@ -0,0 +1,85 @@
+name: Trigger deploy on OKD
+on:
+  workflow_call:
+
+    inputs:
+      FULL_DEPLOY_ID:
+        required: true
+        type: string
+      OKD_ENDPOINT:
+        required: true
+        type: string
+      OKD_PROJECT:
+        required: true
+        type: string
+
+
+      DEPLOY_ID:
+        required: false
+        type: string
+      BRANCH_NAME:
+        required: false
+        type: string
+      ROUTE_HOST:
+        required: false
+        type: string
+      ROUTE_PATH:
+        required: false
+        type: string
+      BUILD_TEXT:
+        required: false
+        type: string
+
+    secrets:
+      OKD_TOKEN:
+        required: true
+env:
+  OC_TEMPLATE_NAME: 'siibra-explorer-branch-deploy-2'
+jobs:
+  trigger-deploy:
+    runs-on: ubuntu-latest
+    steps:
+    - name: 'Login'
+      run: |
+        oc login ${{ inputs.OKD_ENDPOINT }} --token=${{ secrets.OKD_TOKEN }}
+        oc project ${{ inputs.OKD_PROJECT }}
+    - name: 'Login and import image'
+      run: |
+        if oc get dc ${{ inputs.FULL_DEPLOY_ID }}; then
+          # trigger redeploy if deployconfig exists already
+          echo "dc ${{ inputs.FULL_DEPLOY_ID }} already exist, redeploy..."
+          oc rollout latest dc/${{ inputs.FULL_DEPLOY_ID }}
+        else 
+          # create new app if deployconfig does not yet exist
+          echo "dc ${{ inputs.FULL_DEPLOY_ID }} does not yet exist, create new app..."
+
+          if [[ ! -z "${{ inputs.ROUTE_HOST }}" ]]
+          then
+            echo "ROUTE_HOST not defined!"
+            exit 1
+          fi
+          
+          if [[ ! -z "${{ inputs.ROUTE_PATH }}" ]]
+          then
+            echo "ROUTE_PATH not defined!"
+            exit 1
+          fi
+          
+          if [[ ! -z "${{ inputs.BUILD_TEXT }}" ]]
+          then
+            echo "BUILD_TEXT not defined!"
+            exit 1
+          fi
+          if [[ ! -z "${{ inputs.BRANCH_NAME }}" ]]
+          then
+            echo "BRANCH_NAME not defined!"
+            exit 1
+          fi
+
+          oc new-app --template ${{ env.OC_TEMPLATE_NAME }} \
+            -p BRANCH_NAME=${{ inputs.BRANCH_NAME }} \
+            -p DEPLOY_ID=${{ inputs.DEPLOY_ID }} \
+            -p ROUTE_HOST=${{ inputs.ROUTE_HOST }} \
+            -p ROUTE_PATH=${{ inputs.ROUTE_PATH }} \
+            -p BUILD_TEXT=${{ inputs.BUILD_TEXT }}
+        fi
diff --git a/.github/workflows/docker_img.yml b/.github/workflows/docker_img.yml
index eb5368f03107d568f2157cbee31359bae1f03f6b..13f3947b35af58cb6fd58f3b8981cc8a81f4e1bf 100644
--- a/.github/workflows/docker_img.yml
+++ b/.github/workflows/docker_img.yml
@@ -111,118 +111,127 @@ jobs:
         echo "Pushing $DOCKER_BUILT_TAG"
         docker push $DOCKER_BUILT_TAG
 
-  trigger-deploy:
+  setting-vars:
     if: success()
     runs-on: ubuntu-latest
-    env:
-      GITHUB_API_ROOT: https://api.github.com/repos/fzj-inm1-bda/siibra-explorer
-      OC_TEMPLATE_NAME: 'siibra-explorer-branch-deploy-2'
-
-    needs: build-docker-img
+    outputs:
+      BRANCH_NAME: ${{ steps.set-vars.outputs.BRANCH_NAME }}
+      BUILD_TEXT: ${{ steps.set-vars.outputs.BUILD_TEXT }}
+      DEPLOY_ID: ${{ steps.set-vars.outputs.DEPLOY_ID }}
     steps:
       - uses: actions/checkout@v3
-      - name: Set env var
+      - id: set-vars
+        name: Set vars
         run: |
           echo "Using github.ref: $GITHUB_REF"
+
           BRANCH_NAME=${GITHUB_REF#refs/heads/}
-          echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
-        
+          echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_OUTPUT
+
           echo "Branch is $BRANCH_NAME ."
 
           if [[ "$BRANCH_NAME" == 'master' ]]
           then
-            echo "BUILD_TEXT=" >> $GITHUB_ENV
+            echo "BUILD_TEXT=" >> $GITHUB_OUTPUT
           else
-            echo "BUILD_TEXT=$BRANCH_NAME" >> $GITHUB_ENV
+            echo "BUILD_TEXT=$BRANCH_NAME" >> $GITHUB_OUTPUT
           fi
 
           # DEPLOY_ID == remove _ / and lowercase everything from branch
           DEPLOY_ID=$(echo ${BRANCH_NAME//[_\/]/} | awk '{ print tolower($0) }')
-          echo "DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV
-
-          if [[ "$BRANCH_NAME" == 'master' ]] || [[ "$BRANCH_NAME" == 'staging' ]]
-          then
-            echo "OKD_URL=https://okd.hbp.eu:443" >> $GITHUB_ENV
-            echo "OKD_SECRET=${{ secrets.OKD_PROD_SECRET }}" >> $GITHUB_ENV
-            echo "OKD_PROJECT=interactive-viewer" >> $GITHUB_ENV
-            echo "ROUTE_HOST=siibra-explorer.apps.hbp.eu" >> $GITHUB_ENV
-
-            if [[ "$BRANCH_NAME" == 'master' ]]
-            then
-              FULL_DEPLOY_ID=siibra-explorer-branch-deploy-2-prodpathviewer
-              FULL_DEPLOY_ID2=siibra-explorer-branch-deploy-2-iav-legacy
-              echo "FULL_DEPLOY_ID=$FULL_DEPLOY_ID" >> $GITHUB_ENV
-              echo "FULL_DEPLOY_ID2=$FULL_DEPLOY_ID2" >> $GITHUB_ENV
-            else
-              FULL_DEPLOY_ID=siibra-explorer-branch-deploy-2-stagingpathed
-              echo "FULL_DEPLOY_ID=$FULL_DEPLOY_ID" >> $GITHUB_ENV
-            fi
-
-            echo "Deploy on **prod** cluster..."
-            echo "Deploy id: **${FULL_DEPLOY_ID}** ..."
-            if [ ! -z "$FULL_DEPLOY_ID2" ]
-            then
-              echo "Secondary deploy id: **$FULL_DEPLOY_ID2** ..."
-            fi
-          else
-            echo "OKD_URL=https://okd-dev.hbp.eu:443" >> $GITHUB_ENV
-            echo "OKD_SECRET=${{ secrets.OKD_DEV_SECRET }}" >> $GITHUB_ENV
-            echo "OKD_PROJECT=interactive-atlas-viewer" >> $GITHUB_ENV
-            echo "ROUTE_HOST=siibra-explorer.apps-dev.hbp.eu" >> $GITHUB_ENV
-            echo "BUILD_TEXT=$BRANCH_NAME" >> $GITHUB_ENV
-            FULL_DEPLOY_ID=${{ env.OC_TEMPLATE_NAME }}-$DEPLOY_ID
-            echo "FULL_DEPLOY_ID=$FULL_DEPLOY_ID" >> $GITHUB_ENV
-            echo "Deploy on **dev** cluster ..."
-            echo "Deploy id: **${FULL_DEPLOY_ID}** ..."
-          fi
-      - name: 'Login via oc cli & deploy'
-        run: |
-          oc login $OKD_URL --token=$OKD_SECRET
-          oc project $OKD_PROJECT
-          
-          ROUTE_PATH=/$DEPLOY_ID
-          echo "ROUTE_PATH=$ROUTE_PATH" >> $GITHUB_ENV
-
-          echo "Working branch name: $BRANCH_NAME, deploy_id: $DEPLOY_ID"
-          echo "full deploy id: $FULL_DEPLOY_ID, secondary deploy id: $FULL_DEPLOY_ID2"
-
-          # check if the deploy already exist
-
-          if oc get dc $FULL_DEPLOY_ID; then
-            # trigger redeploy if deployconfig exists already
-            echo "dc $FULL_DEPLOY_ID already exist, redeploy..."
-            oc rollout latest dc/$FULL_DEPLOY_ID
-          else 
-            # create new app if deployconfig does not yet exist
-            echo "dc $FULL_DEPLOY_ID does not yet exist, create new app..."
-            oc new-app --template ${{ env.OC_TEMPLATE_NAME }} \
-              -p BRANCH_NAME=$BRANCH_NAME \
-              -p DEPLOY_ID=$DEPLOY_ID \
-              -p ROUTE_HOST=$ROUTE_HOST \
-              -p ROUTE_PATH=$ROUTE_PATH \
-              -p BUILD_TEXT=$BUILD_TEXT
-          fi
-
-          if [ ! -z "$FULL_DEPLOY_ID2" ]
-          then
-            echo "FULL_DEPLOY_ID2 is defined, trying to redeploy $FULL_DEPLOY_ID2 ..."
-            oc rollout latest dc/$FULL_DEPLOY_ID2
-          fi
-          
-      - name: 'Update status badge'
-        if: success()
-        run: |
-
-          DEPLOY_URL=https://$ROUTE_HOST$ROUTE_PATH
-          curl -v \
-            -X POST \
-            -H "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-            -H 'accept: application/vnd.github.v3+json' \
-            ${GITHUB_API_ROOT}/statuses/${GITHUB_SHA} \
-            -d '{
-              "target_url":"'$DEPLOY_URL'",
-              "name": "Deployed at OKD",
-              "description": "Deployed at OKD",
-              "context": "[ebrains-okd-deploy] Deployed at OKD",
-              "state": "success"
-            }'
+          echo "DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_OUTPUT
+
+  trigger-deploy-master-prod:
+    if: ${{ needs.setting-vars.outputs.BRANCH_NAME == 'master' && success() }}
+    needs:
+      - build-docker-img
+      - setting-vars
+    uses: ./.github/workflows/deploy-on-okd.yml
+    with:
+      FULL_DEPLOY_ID: siibra-explorer-branch-deploy-2-prodpathviewer
+      OKD_ENDPOINT: https://okd.hbp.eu:443
+      OKD_PROJECT: interactive-viewer
+    secrets:
+      okd_token: ${{ secrets.OKD_PROD_SECRET }}
+
+  trigger-deploy-master-legacy:
+    if: ${{ needs.setting-vars.outputs.BRANCH_NAME == 'master' && success() }}
+    needs:
+      - build-docker-img
+      - setting-vars
+    uses: ./.github/workflows/deploy-on-okd.yml
+    with:
+      FULL_DEPLOY_ID: siibra-explorer-branch-deploy-2-iav-legacy
+      OKD_ENDPOINT: https://okd.hbp.eu:443
+      OKD_PROJECT: interactive-viewer
+    secrets:
+      okd_token: ${{ secrets.OKD_PROD_SECRET }}
+      
+  trigger-deploy-staging-viewer-validation:
+    if: ${{ needs.setting-vars.outputs.BRANCH_NAME == 'staging' && success() }}
+    needs:
+      - build-docker-img
+      - setting-vars
+    uses: ./.github/workflows/deploy-on-okd.yml
+    with:
+      FULL_DEPLOY_ID: siibra-explorer-branch-deploy-2-stagingpathed
+      OKD_ENDPOINT: https://okd.hbp.eu:443
+      OKD_PROJECT: interactive-viewer
+    secrets:
+      okd_token: ${{ secrets.OKD_PROD_SECRET }}
+      
+  trigger-deploy-staging-data-validation:
+    if: ${{ needs.setting-vars.outputs.BRANCH_NAME == 'staging' && success() }}
+    needs:
+      - build-docker-img
+      - setting-vars
+    uses: ./.github/workflows/deploy-on-okd.yml
+    with:
+      FULL_DEPLOY_ID: siibra-explorer-rc
+      OKD_ENDPOINT: https://okd.jsc.hbp.eu:443
+      OKD_PROJECT: siibra-explorer
+    secrets:
+      okd_token: ${{ secrets.OKD_JSC_TOKEN }}
+  
+  trigger-deploy-other-viewer:
+    # n.b. "env" context not available in "if" block
+    if: ${{ needs.setting-vars.outputs.BRANCH_NAME != 'staging' && needs.setting-vars.outputs.BRANCH_NAME != 'master' && success() }}
+    uses: ./.github/workflows/deploy-on-okd.yml
+    needs:
+      - build-docker-img
+      - setting-vars
+    with:
+      FULL_DEPLOY_ID: siibra-explorer-branch-deploy-2-${{ needs.setting-vars.outputs.DEPLOY_ID }}
+      OKD_ENDPOINT: https://okd-dev.hbp.eu:443
+      OKD_PROJECT: interactive-atlas-viewer
+      BRANCH_NAME: ${{ needs.setting-vars.outputs.BRANCH_NAME }}
+      DEPLOY_ID: ${{ needs.setting-vars.outputs.DEPLOY_ID }}
+      ROUTE_HOST: siibra-explorer.apps-dev.hbp.eu
+      ROUTE_PATH: /${{ needs.setting-vars.outputs.DEPLOY_ID }}
+      BUILD_TEXT: ${{ needs.setting-vars.outputs.BRANCH_NAME }}
+    secrets:
+      okd_token: ${{ secrets.OKD_DEV_SECRET }}
+
+  trigger-deploy-other-badge:
+    if: ${{ needs.setting-vars.outputs.BRANCH_NAME != 'staging' && needs.setting-vars.outputs.BRANCH_NAME != 'master' && success() }}
+    runs-on: ubuntu-latest
+    env:
+      DEPLOY_URL: https://siibra-explorer.apps-dev.hbp.eu/${{ needs.setting-vars.outputs.DEPLOY_ID }}
+    needs:
+    - trigger-deploy-other-viewer
+    - setting-vars
+    steps:
+    - name: "Update Badge"
+      run: |
+        curl -v \
+          -X POST \
+          -H "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
+          -H 'accept: application/vnd.github.v3+json' \
+          ${GITHUB_API_ROOT}/statuses/${GITHUB_SHA} \
+          -d '{
+            "target_url":"'${{ env.DEPLOY_URL }}'",
+            "name": "Deployed at OKD",
+            "description": "Deployed at OKD",
+            "context": "[ebrains-okd-deploy] Deployed at OKD",
+            "state": "success"
+          }'
diff --git a/package.json b/package.json
index 5362349f32bea024d80e831723fa469611008978..5314a2daa6a1cc8d13088e24bd5568e42ab66b97 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "siibra-explorer",
-  "version": "2.12.0",
+  "version": "2.12.1",
   "description": "siibra-explorer - explore brain atlases. Based on humanbrainproject/nehuba & google/neuroglancer. Built with angular",
   "scripts": {
     "lint": "eslint src --ext .ts",