diff --git a/.github/workflows/docker_img.yml b/.github/workflows/docker_img.yml
index 76e8788819f6139821b2794a5452ae25ee55d7fe..928c13769d4d699156888a04ee5cad19f0519a1b 100644
--- a/.github/workflows/docker_img.yml
+++ b/.github/workflows/docker_img.yml
@@ -6,16 +6,16 @@ jobs:
   build-docker-img:
     runs-on: ubuntu-latest
     env:
-      MATOMO_ID_DEV: '7'
-      MATOMO_URL_DEV: 'https://stats-dev.humanbrainproject.eu/'
       MATOMO_ID_PROD: '12'
       MATOMO_URL_PROD: 'https://stats.humanbrainproject.eu/'
       PRODUCTION: 'true'
       DOCKER_REGISTRY: 'docker-registry.ebrains.eu/siibra/'
+
       SIIBRA_API_STABLE: 'https://siibra-api-stable.apps.hbp.eu/v1_0'
       SIIBRA_API_RC: 'https://siibra-api-rc.apps.hbp.eu/v1_0'
       SIIBRA_API_LATEST: 'https://siibra-api-latest.apps-dev.hbp.eu/v1_0'
 
+
     steps:
     - uses: actions/checkout@v2
     - name: 'Set matomo env var'
@@ -57,6 +57,7 @@ jobs:
           VERSION=$(git rev-parse --short HEAD)
           echo "EXPERIMENTAL_FEATURE_FLAG=true" >> $GITHUB_ENV
         fi
+        echo "Setting VERSION: $VERSION"
         echo "VERSION=$VERSION" >> $GITHUB_ENV
     - name: 'Build docker image'
       run: |
@@ -88,7 +89,8 @@ jobs:
     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
     steps:
       - uses: actions/checkout@v2
@@ -112,13 +114,13 @@ jobs:
             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 "PATH_POSTFIX=" >> $GITHUB_ENV
+            echo "ROUTE_HOST=siibra-explorer.apps.hbp.eu" >> $GITHUB_ENV
             echo "Deploy on prod cluster..."
           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 "PATH_POSTFIX=-dev" >> $GITHUB_ENV
+            echo "ROUTE_HOST=siibra-explorer.apps-dev.hbp.eu" >> $GITHUB_ENV
             echo "BUILD_TEXT=$BRANCH_NAME" >> $GITHUB_ENV
             echo "Deploy on dev cluster..."
           fi
@@ -127,39 +129,35 @@ jobs:
           oc login $OKD_URL --token=$OKD_SECRET
           oc project $OKD_PROJECT
 
-          # sanitized branchname == remove _ / and lowercase everything
-          SANITIZED_BRANCH_NAME=$(echo ${BRANCH_NAME//[_\/]/} | awk '{ print tolower($0) }')
-          echo "SANITIZED_BRANCH_NAME=$SANITIZED_BRANCH_NAME" >> $GITHUB_ENV
-          echo "Working branch name: $BRANCH_NAME, sanitized branch name: $SANITIZED_BRANCH_NAME"
+          # DEPLOY_ID == remove _ / and lowercase everything from branch
+          DEPLOY_ID=$(echo ${BRANCH_NAME//[_\/]/} | awk '{ print tolower($0) }')
+          echo "DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV
+          
+          ROUTE_PATH=/$DEPLOY_ID
+          echo "ROUTE_PATH=$ROUTE_PATH" >> $GITHUB_ENV
+
+          echo "Working branch name: $BRANCH_NAME, deploy_id: $DEPLOY_ID"
 
           # check if the deploy already exist
-          if oc get dc siibra-explorer-branch-deploy-$SANITIZED_BRANCH_NAME; then
+          if oc get dc ${{ env.OC_TEMPLATE_NAME }}-$DEPLOY_ID; then
             # trigger redeploy if deployconfig exists already
-            echo "dc siibra-explorer-branch-deploy-$SANITIZED_BRANCH_NAME already exist, redeploy..."
-            oc rollout latest dc/siibra-explorer-branch-deploy-$SANITIZED_BRANCH_NAME
+            echo "dc ${{ env.OC_TEMPLATE_NAME }}-$DEPLOY_ID already exist, redeploy..."
+            oc rollout latest dc/${{ env.OC_TEMPLATE_NAME }}-$DEPLOY_ID
           else 
             # create new app if deployconfig does not yet exist
-            echo "dc siibra-explorer-branch-deploy-$SANITIZED_BRANCH_NAME does not yet exist, create new app..."
-            oc new-app --template siibra-explorer-branch-deploy \
+            echo "dc ${{ env.OC_TEMPLATE_NAME }}-$DEPLOY_ID does not yet exist, create new app..."
+            oc new-app --template ${{ env.OC_TEMPLATE_NAME }} \
               -p BRANCH_NAME=$BRANCH_NAME \
-              -p SANITIZED_BRANCH_NAME=$SANITIZED_BRANCH_NAME \
-              -p PATH_POSTFIX=$PATH_POSTFIX \
+              -p DEPLOY_ID=$DEPLOY_ID \
+              -p ROUTE_HOST=$ROUTE_HOST \
+              -p ROUTE_PATH=$ROUTE_PATH \
               -p BUILD_TEXT=$BUILD_TEXT
           fi
       - name: 'Update status badge'
         if: success()
         run: |
 
-          if [[ "$GITHUB_REF" == 'refs/heads/master' ]]
-          then
-            DEPLOY_URL="https://siibra-explorer.apps.hbp.eu/master"
-          elif [[ "$GITHUB_REF" == 'refs/heads/staging' ]]
-          then
-            DEPLOY_URL="https://siibra-explorer.apps.hbp.eu/staging"
-          else
-            DEPLOY_URL="https://siibra-explorer.apps-dev.hbp.eu/${{ env.SANITIZED_BRANCH_NAME }}"
-          fi
-
+          DEPLOY_URL=https://$ROUTE_HOST$ROUTE_PATH
           curl -v \
             -X POST \
             -H "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
@@ -168,5 +166,7 @@ jobs:
             -d '{
               "target_url":"'$DEPLOY_URL'",
               "name": "Deployed at OKD",
+              "description": "Deployed at OKD",
+              "context": "[ebrains-okd-deploy] Deployed at OKD",
               "state": "success"
             }'
diff --git a/.openshift/README.md b/.openshift/v1/README.v1.md
similarity index 98%
rename from .openshift/README.md
rename to .openshift/v1/README.v1.md
index db1f804c7db0affbedcc01c271f015893c51fa20..7be9e08e08289363b9cb34c5fcf46f5769b8cc51 100644
--- a/.openshift/README.md
+++ b/.openshift/v1/README.v1.md
@@ -143,7 +143,6 @@ Per [deployment template](./okd-branch-tmpl.yaml), a number of parameters may be
 | name | required | desc | 
 | --- | --- | --- |
 | `SESSION_SECRET` | | Random strings to encrypt sessions. Not currently used. |
-| `DOCKER_IMAGE_TAG` | true | Dictates which image tag to pull. Currently, possible values are `{latest\|rc\|stable}`. |
 | `BRANCH_NAME` | true | Determines the tag of the image to pull. |
 | `SANITIZED_BRANCH_NAME` | true | Strip all special characters from `BRANCH_NAME`. Acts similar to deploy ID. Distinguishes one deployment from another. Also affects routes: `siibra-explorer-{SANITIZED_BRANCH_NAME}.apps{PATH_POSTFIX}.hbp.eu` |
 | `PATH_POSTFIX` | | Dictates if postfix, if any, should be added to the route: `siibra-explorer-{DEPLOY_FLAVOUR}.apps{PATH_POSTFIX}.hbp.eu`. Defaults to `''` (empty string). Possible value: `-dev`|
diff --git a/.openshift/okd_branch_tmpl.yaml b/.openshift/v1/okd_branch_tmpl_v1.yaml
similarity index 100%
rename from .openshift/okd_branch_tmpl.yaml
rename to .openshift/v1/okd_branch_tmpl_v1.yaml
diff --git a/.openshift/v2/README.v2.md b/.openshift/v2/README.v2.md
new file mode 100644
index 0000000000000000000000000000000000000000..902bfd83fd171eff1881e8bde58849dca4c8a470
--- /dev/null
+++ b/.openshift/v2/README.v2.md
@@ -0,0 +1,150 @@
+# Deployment documentation
+
+This document outlines the deployment of `siibra-explorer` on EBRAINS infrastructure.
+
+## Overview
+
+`siibra-explorer` are continuously deployed on openshift container platform hosted by EBRAINS.
+
+The continuous deployment of `siibra-explorer` involves the following steps:
+
+- building docker image
+- tag the image, and push to registry
+- pull and run the newly built image
+
+## Build
+
+This section outlines the procedure of continuously building and archiving docker images of `siibra-explorer`.
+
+### Images
+
+Docker images are built with [`Dockerfile`](../Dockerfile) by github action withs [yml spec](../.github/workflows/docker_img.yml), and pushed to EBRAINS docker image registry at `docker-registry.ebrains.eu`
+
+`docker-registry.ebrains.eu` is set as the registry
+
+`siibra` is set as the namespace
+
+`siibra-explorer` is set as the image name
+
+The built image will be tagged with the branch name. e.g.
+
+`docker-registry.ebrains.eu/siibra/siibra-explorer:{BRANCH_NAME}`
+
+### Registry
+
+The built docker image will then be pushed to `docker-registry.ebrains.eu` with the access token of a bot account with the rights to push image in `siibra` namespace.
+
+The login credentials are stored in github action secrets:
+
+- username: `{{ secrets.EBRAINS_DOCKER_REG_USER }}`
+- access token: `{{ secrets.EBRAINS_DOCKER_REG_TOKEN }}`
+
+> :warning: There are currently no mechanism to delete artefacts from `docker-registry.ebrains.eu`. One must periodically, manually delete untagged images to avoid filling of allotted diskspace.
+
+---
+
+// TODO setup retention policy to allow automatic deletion of artefacts
+
+---
+
+## Deployment
+
+This section outlines how the built image are deployed.
+
+> :information_source: Previous internal guides described a combination of s2i with docker build strategy. This has been demonstrated to be both slow (at build time) and unreliable (over the deployment lifetime).
+
+### Variables
+
+| cluster   | name           | value | 
+| ---       | ---            | --- |
+| prod      | `PROJECT_NAME` | `interactive-viewer` |
+|           | `OKD_ENDPOINT` | `https://okd.hbp.eu:443` |
+|           | `OKD_SECRET`   | `{{ secrets.OKD_PROD_SECRET }}` (generated once[1] stored in github action secrets) |
+| dev       | `PROJECT_NAME` | `interactive-viewer` |
+|           | `OKD_ENDPOINT` | `https://okd-dev.hbp.eu:443` |
+|           | `OKD_SECRET`   | `{{ secrets.OKD_DEV_SECRET }}` (generated once[1], stored in github action secrets) |
+
+
+### Triggering deployment
+
+Deployments resides in [docker-img.yml](../.github/workflows/docker_img.yml), `job['trigger-deploy']`. The steps are summarised as below:
+
+- determine if targeting prod or dev cluster.
+
+  - If the trigger is update of `master` or `staging` branch, target prod cluster
+
+  - Anyother branch, target dev cluster
+
+- login to openshift container platform with the command
+
+  ```bash
+  oc login ${OKD_ENDPOINT} --token ${OKD_SECRET}
+  ```
+
+- checkout project with the command
+
+  ```bash
+  oc project ${PROJECT_NAME}
+  ```
+
+- check if deployment with name `siibra-explorer-branch-deploy-${SANITIZED_BRANCH_NAME}` exists
+  - if exists, rollout latest deployment with the command 
+  
+    ```bash
+    oc rollout latest dc/siibra-explorer-branch-deploy-${SANITIZED_BRANCH_NAME}
+    ```
+
+  - if does not exist, create new deployment with name `siibra-explorer-branch-deploy-${SANITIZED_BRANCH_NAME}`, using deployment template[2] with corresponding parameters[3]
+
+### [1] OKD service accounts
+
+In order to deploy on OKD clusters in CI/CD pipeline, it is ideal to create a service account. Openshift container platform maintains [a comprehensive guide](https://docs.openshift.com/container-platform/3.11/dev_guide/service_accounts.html) on service account. This section provides a step by step guide on creating the service account.
+
+> :information_source: Why not just use personal access token? 1/ it expires, 2/ it is invalidated when you logout, 3/ (to a less degree, since personal access token has a expiration), revoking personal access token has a greater impact on developer experience, and potentially breaks more things, if one reuses the same personally access token.
+
+#### Prereq
+
+- openshift cli installed (check via `which oc`)
+- login command (easiest method to obtain login command: login via web portal > portrait username (*top right*) > Copy Login Command )
+
+#### Configure a Service Account
+
+- login via terminal (paste login command from prereq)
+- select the desired project via `oc project ${PROJECT_NAME}`
+- create a new SA via: `oc create sa ${SERVICE_ACCOUNT_NAME}`
+- get a new token via: `oc sa get-token ${SERVICE_ACCOUNT_NAME}` (store this token securely, ideally in a password manager)
+- grant the SA ability to create deployments via: `oc policy add-role-to-user edit -z ${SERVICE_ACCOUNT_NAME}`
+
+
+### [2] Deployment template
+
+An [openshift template](./okd-branch-tmpl.yaml) has been added to both production (https://okd.hbp.eu) and develop (https://okd-dev.hbp.eu) clusters.
+
+This is done ahead of any deploys, is valid for all future deploys and rarely needs to be updated.
+
+> :warning: The process of editing template is fragile and error prone. One should be vigilant and update the template as little as possible. Ideally, add new templates and alter the deployment pipeline, rather than edit existing templates.
+
+The template is produced mainly by referencing Openshift container platform [template API](https://docs.openshift.com/container-platform/3.11/rest_api/template_openshift_io/template-template-openshift-io-v1.html).
+
+A number of sensitive variables are stored on the openshift clusters, and added to the container at runtime. They include:
+
+| variable name | from | description |
+| --- | --- | --- |
+| `REDIS_PASSWORD` | `okd_secret.redis-rate-limiting-db-ephemeral.database-password` | password to redis |
+| `*` | `okd_configmap.hbp-oauth-config-map.*` | Contains Client ID, Client secret etc for oauth with EBRAINS IAM service |
+| `*` | `okd_configmap.fluent-logging.*` | Contains fluentd logging variables |
+| `*` | `okd_configmap.plugins.*` | Contains plugins variables |
+| `*` | `okd_configmap.other-deploy-config.*` | Contains other deploy variables |
+
+### [3] Deployment parameters
+
+Per [deployment template](./okd-branch-tmpl.yaml), a number of parameters may be required when creating new deployments.
+
+| name | required | desc | 
+| --- | --- | --- |
+| `SESSION_SECRET` | | Random strings to encrypt sessions. Not currently used. |
+| `BRANCH_NAME` | true | Determines the tag of the image to pull. |
+| `ROUTE_HOST` | true | host field of route service of the deployed template. Possible values are `*.apps.hbp.eu` for prod, `*.apps-dev.hbp.eu` for dev. Must **not** end with `/` |
+| `ROUTE_PATH` | | path field of route service of the deployed template. If set, **must** start with `/`  |
+| `DEPLOY_ID` | true | Strip all special characters from `BRANCH_NAME`. Distinguishes one deployment from another. |
+| `BUILD_TEXT` | | Shows as over lay text, to mark dev build. Defaults to `dev build` |
\ No newline at end of file
diff --git a/.openshift/v2/okd_branch_tmpl_v2.yaml b/.openshift/v2/okd_branch_tmpl_v2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c5af1ef048c81a452243db70e731a1d90bffb026
--- /dev/null
+++ b/.openshift/v2/okd_branch_tmpl_v2.yaml
@@ -0,0 +1,144 @@
+apiVersion: v1
+kind: Template
+metadata:
+  name: siibra-explorer-branch-deploy-2
+  annotations:
+    description: "Deploy branch of siibra-explorer"
+    tags: "nodejs,siibra-explorer"
+objects:
+- apiVersion: v1
+  kind: DeploymentConfig
+  metadata:
+    name: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+    labels:
+      app: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+  spec:
+    replicas: 3
+    revisionHistoryLimit: 10
+    selector:
+      deploymentconfig: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+    template:
+      metadata:
+        labels:
+          app: siibra-explorer-branch-deploy
+          deploymentconfig: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+      spec:
+          containers:
+          - env:
+            - name: SESSION_SECRET
+              value: ${SESSION_SECRET}
+            - name: HOSTNAME
+              value: ${ROUTE_HOST}
+            - name: HOST_PATHNAME
+              value: ${ROUTE_PATH}
+              
+            - name: BUILD_TEXT
+              value: ${BUILD_TEXT}
+            - name: REDIS_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  key: database-password
+                  name: redis-rate-limiting-db-ephemeral
+            envFrom:
+            - configMapRef:
+                name: hbp-oauth-config-map
+            - configMapRef:
+                name: fluent-logging
+            - configMapRef:
+                name: plugins
+            - configMapRef:
+                name: other-deploy-config
+
+            image: "docker-registry.ebrains.eu/siibra/siibra-explorer:${BRANCH_NAME}"
+            imagePullPolicy: Always
+            livenessProbe:
+              failureThreshold: 3
+              httpGet:
+                path: ${ROUTE_PATH}/ready
+                port: 8080
+                scheme: HTTP
+              initialDelaySeconds: 10
+              periodSeconds: 10
+              successThreshold: 1
+              timeoutSeconds: 1
+            readinessProbe:
+              failureThreshold: 3
+              httpGet:
+                path: ${ROUTE_PATH}/ready
+                port: 8080
+                scheme: HTTP
+              initialDelaySeconds: 3
+              periodSeconds: 10
+              successThreshold: 1
+              timeoutSeconds: 6
+            name: siibra-explorer-2-${DEPLOY_ID}
+            ports:
+            - containerPort: 8080
+              protocol: TCP
+            resources: {}
+            terminationMessagePath: /dev/termination-log
+            terminationMessagePolicy: File
+          dnsPolicy: ClusterFirst
+          restartPolicy: Always
+          schedulerName: default-scheduler
+          securityContext: {}
+          terminationGracePeriodSeconds: 30
+- apiVersion: v1
+  kind: Service
+  metadata:
+    labels:
+      app: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+    name: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+  spec:
+    ports:
+    - name: 8080-tcp
+      port: 8080
+      protocol: TCP
+      targetPort: 8080
+    selector:
+      deploymentconfig: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+    type: ClusterIP
+- apiVersion: v1
+  kind: Route
+  metadata:
+    labels:
+      app: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+    name: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+  spec:
+    host: ${ROUTE_HOST}
+    path: ${ROUTE_PATH}
+    port:
+      targetPort: 8080-tcp
+    tls:
+      insecureEdgeTerminationPolicy: Redirect
+      termination: edge
+    to:
+      kind: Service
+      name: siibra-explorer-branch-deploy-2-${DEPLOY_ID}
+      weight: 100
+    wildcardPolicy: None
+
+parameters:
+- description: Session secret
+  from: '[A-Z0-9]{16}'
+  generate: expression
+  name: SESSION_SECRET
+
+- name: BRANCH_NAME
+  required: true
+- name: DEPLOY_ID
+  required: true
+  description: |
+    ID that distinguish deployments.
+    Use only [a-z0-9]{4,}
+- name: ROUTE_HOST
+  description: route/host for the deployed service. Must be unique, or route may not be deployed. Must **NOT** end with with /.
+  required: true
+- name: ROUTE_PATH
+  description: path for the deployed service. May be left empty. If set, must start with /.
+  value: ''
+- name: BUILD_TEXT
+  description: 'UI displaying which build'
+  value: 'dev build'
+labels:
+  template: siibra-explorer-branch-deploy-template-v2
diff --git a/common/util.spec.js b/common/util.spec.js
index a66f12a39bd1307fbc17573f078937e37d742350..2af63766c202999af0a9ca2ccf57a341d947f0ee 100644
--- a/common/util.spec.js
+++ b/common/util.spec.js
@@ -1,4 +1,4 @@
-import { getIdFromFullId, strToRgb } from './util'
+import { getIdFromFullId, strToRgb, verifyPositionArg } from './util'
 
 describe('common/util.js', () => {
   describe('getIdFromFullId', () => {
@@ -76,4 +76,45 @@ describe('common/util.js', () => {
     })
   
   })
+
+  describe('verifyPositionArg', () => {
+    describe('malformed input', () => {
+      let input
+      it('> if props.components[0] is string', () => {
+        input= 'hello world'
+        expect(verifyPositionArg(input)).toBeFalsy()
+      })
+      it('> if position property is object', () => {
+        input={
+          x: 0,
+          y: 0,
+          z: 0
+        }
+        expect(verifyPositionArg(input)).toBeFalsy()
+      })
+
+      it('> if position property is array of incorrect length', () => {
+        input=[]
+        expect(verifyPositionArg(input)).toBeFalsy()
+      })
+
+      it('> if position property is array contain non number elements', () => {
+        input = [1, 2, 'hello world']
+        expect(verifyPositionArg(input)).toBeFalsy()
+      })
+
+      it('> if position property is array contain NaN', () => {
+        input=[1,2,NaN]
+        expect(verifyPositionArg(input)).toBeFalsy()
+      })
+
+    })
+
+    describe('correct input', () => {
+      let input
+      it('> return true', () => {
+        expect(verifyPositionArg([1,2,3])).toBeTruthy()
+      })
+    })
+  })
 })
diff --git a/deploy/server.js b/deploy/server.js
index fdc0fbbbc27c19aafcdb0f989140bf5281000ba2..f628ffe7582de3f3d80178137634fd72885e2e40 100644
--- a/deploy/server.js
+++ b/deploy/server.js
@@ -7,9 +7,10 @@ if (process.env.NODE_ENV !== 'production') {
 
 if (process.env.FLUENT_HOST) {
   const Logger = require('./logging')
+  const os = require('os')
 
   const name = process.env.IAV_NAME || 'IAV'
-  const stage = process.env.IAV_STAGE || 'unnamed-stage'
+  const stage = os.hostname() || 'unknown-host'
 
   const protocol = process.env.FLUENT_PROTOCOL || 'http'
   const host = process.env.FLUENT_HOST || 'localhost'
diff --git a/deploy_env.md b/deploy_env.md
index ca6a5e72c6aa542a6b88471f88eb3174a3b2e05f..bb17c783cbd86d4fa1932a36f44f7a4118012452 100644
--- a/deploy_env.md
+++ b/deploy_env.md
@@ -47,7 +47,6 @@
 | `FLUENT_HOST` | host for fluent logging | `localhost` |
 | `FLUENT_PORT` | port for fluent logging | 24224 |
 | `IAV_NAME` | application name to be logged | `IAV` | 
-| `IAV_STAGE` | deploy of the application | `unnamed-stage` |
 
 ##### CSP
 
diff --git a/docs/releases/v2.5.4.md b/docs/releases/v2.5.4.md
index dcd355d798c930d12a3977f8ac4368d4a8078cce..9d241dcd3d7c011cc3ddeb30f3cb304d170c06c1 100644
--- a/docs/releases/v2.5.4.md
+++ b/docs/releases/v2.5.4.md
@@ -3,3 +3,6 @@
 ## Under the hood
 
 - Added version check for siibra-api
+- Updated deploy template
+- Remove unused components
+- Clean up siibra-api types
diff --git a/e2e/checklist.md b/e2e/checklist.md
new file mode 100644
index 0000000000000000000000000000000000000000..7577819cb3cf150a1fc8588a165c9224b57290c0
--- /dev/null
+++ b/e2e/checklist.md
@@ -0,0 +1,51 @@
+# Staging Checklist
+
+**use incognito browser**
+
+[home page](https://siibra-explorer.apps.hbp.eu/staging/)
+
+## General
+
+- [ ] Can access front page
+- [ ] Can login to oidc v2 via top-right
+
+## Atlas data specific
+
+- [ ] Human multilevel atlas
+  - [ ] on click from home page, MNI152, Julich v2.9 loads without issue
+  - [ ] on hover, show correct region name(s)
+  - [ ] regional is fine :: select hOC1 right
+    - [ ] probabilistic map loads fine
+    - [ ] segmentation layer hides
+    - [ ] `navigate to` button exists, and works
+    - [ ] `Open in KG` button exists and works
+    - [ ] `Description` tabs exists and works
+    - [ ] `Regional features` tab exists and works
+      - [ ] `Receptor density` dataset exists and works
+        - [ ] `Open in KG` button exists and works
+        - [ ] `Preview` tab exists and works
+          - [ ] fingerprint is shown, interactable
+          - [ ] profiles can be loaded, interactable
+          - [ ] AR can be loaded
+      - [ ] `IEEG recordings` exists and works (at least 3)
+        - [ ] GDPR warning triangle
+        - [ ] `Open in KG` button exists and works
+        - [ ] perspective view works
+          - [ ] mesh becomes transparent
+          - [ ] mesh transparency returns when exit the panel
+          - [ ] electrodes appear in perspective view
+          - [ ] some contact points should apepar red (intersect with region)
+        - [ ] electrode tab
+          - [ ] show should a number of contact points
+          - [ ] clicking on electrode should navigate to the contact point location
+    - [ ] `Connectivity` tab exists and works
+      - [ ] on opening tab, PMap disappear, colour mapped segmentation appears
+      - [ ] on closing tab, PMap reappear, segmentation hides
+    - [ ] Explore in other templates exists, and has MNI152 and big brain
+      - [ ] clicking on the respective space will load julich 2.9 in that space
+      - [ ] the navigation should be preserved
+  - [ ] in big brain v2.9 (or latest)
+    - [ ] high res hoc1, hoc2, hoc3, lam1-6 are visible
+- [ ] Waxholm
+  - [ ] v4 are visible
+  - [ ] on hover, show correct region name(s)
\ No newline at end of file
diff --git a/src/atlasComponents/parcellation/regionHierachy/regionHierarchy.style.css b/src/atlasComponents/parcellation/regionHierachy/regionHierarchy.style.css
index 6c0b05f0ebfe29bb0c3afef808d17fa7895000e0..480bb3e62be1e9d1014bccb4fca0c84340ef0401 100644
--- a/src/atlasComponents/parcellation/regionHierachy/regionHierarchy.style.css
+++ b/src/atlasComponents/parcellation/regionHierachy/regionHierarchy.style.css
@@ -58,16 +58,6 @@ input[type="text"]
   height:4rem;
 }
 
-.horizontal-mode .cdk-viewport-wrapper region-list-simple-view
-{
-  width: 200px;
-}
-
-.cdk-viewport-wrapper region-list-simple-view
-{
-  width: 100%;
-}
-
 .cdk-virtual-scroll-viewport-container.horizontal-mode
 {
   height: 6rem;
diff --git a/src/atlasComponents/parcellationRegion/index.ts b/src/atlasComponents/parcellationRegion/index.ts
index b3f4198bc8c372d02e1c43b01cd9809d18de3d1c..cced6b8edf56fd9c723124704267e3f5fd11e722 100644
--- a/src/atlasComponents/parcellationRegion/index.ts
+++ b/src/atlasComponents/parcellationRegion/index.ts
@@ -2,9 +2,7 @@ export {
   ParcellationRegionModule,
 } from "./module"
 
-
 export { RegionDirective } from "./region.directive";
-export { RegionListSimpleViewComponent } from "./regionListSimpleView/regionListSimpleView.component";
 export { RegionMenuComponent } from "./regionMenu/regionMenu.component";
 export { SimpleRegionComponent } from "./regionSimple/regionSimple.component";
 export { RenderViewOriginDatasetLabelPipe } from "./region.base";
\ No newline at end of file
diff --git a/src/atlasComponents/parcellationRegion/module.ts b/src/atlasComponents/parcellationRegion/module.ts
index fe7018e9efa9f3a7f2a54ed1cf8d99273e12cf77..d4507dcaa7e390cbeb96d0a1519c3070bb6ee1d8 100644
--- a/src/atlasComponents/parcellationRegion/module.ts
+++ b/src/atlasComponents/parcellationRegion/module.ts
@@ -5,7 +5,6 @@ import { AngularMaterialModule } from "src/sharedModules";
 import { UtilModule } from "src/util";
 import { RenderViewOriginDatasetLabelPipe } from "./region.base";
 import { RegionDirective } from "./region.directive";
-import { RegionListSimpleViewComponent } from "./regionListSimpleView/regionListSimpleView.component";
 import { RegionMenuComponent } from "./regionMenu/regionMenu.component";
 import { SimpleRegionComponent } from "./regionSimple/regionSimple.component";
 import { BSFeatureModule } from "../regionalFeatures/bsFeatures";
@@ -25,7 +24,6 @@ import { HttpClientModule } from "@angular/common/http";
   ],
   declarations: [
     RegionMenuComponent,
-    RegionListSimpleViewComponent,
     SimpleRegionComponent,
 
     RegionDirective,
@@ -34,7 +32,6 @@ import { HttpClientModule } from "@angular/common/http";
   ],
   exports: [
     RegionMenuComponent,
-    RegionListSimpleViewComponent,
     SimpleRegionComponent,
 
     RegionDirective,
diff --git a/src/atlasComponents/parcellationRegion/region.base.spec.ts b/src/atlasComponents/parcellationRegion/region.base.spec.ts
index ca0c1af0c60e78ba5802329c79a1a88588e92c17..df343917f7bb050a4a0b3553c1fabd7f918bfaa1 100644
--- a/src/atlasComponents/parcellationRegion/region.base.spec.ts
+++ b/src/atlasComponents/parcellationRegion/region.base.spec.ts
@@ -471,53 +471,51 @@ describe('> region.base.ts', () => {
       it('> does not populate if position property is absent', () => {
         regionBase.region = {
           ...mr0
-        }
+        } as any
         expect(regionBase.position).toBeFalsy()
       })
 
       describe('> does not populate if position property is malformed', () => {
-
-        it('> if position property is string', () => {
-          regionBase.region = {
-            ...mr0,
-            position: 'hello world'
-          }
+        it('> if region is falsy', () => {
+          regionBase.region = null
           expect(regionBase.position).toBeFalsy()
         })
-        it('> if position property is object', () => {
+        it('> if props is falsy', () => {
           regionBase.region = {
             ...mr0,
-            position: {
-              x: 0,
-              y: 0,
-              z: 0
-            }
-          }
+            props: null
+          } as any
           expect(regionBase.position).toBeFalsy()
         })
-
-        it('> if position property is array of incorrect length', () => {
+        it('> if props.components is falsy', () => {
           regionBase.region = {
             ...mr0,
-            position: []
-          }
+            props: {
+              components: null
+            }
+          } as any
           expect(regionBase.position).toBeFalsy()
         })
-
-        it('> if position property is array contain non number elements', () => {
+        it('> if props.components[0] is falsy', () => {
           regionBase.region = {
             ...mr0,
-            position: [1, 2, 'hello world']
-          }
+            props: {
+              components: []
+            }
+          } as any
           expect(regionBase.position).toBeFalsy()
         })
 
+        it('> if props.components[0].centroid is falsy', () => {
 
-        it('> if position property is array contain NaN', () => {
           regionBase.region = {
             ...mr0,
-            position: [1, 2, NaN]
-          }
+            props: {
+              components: [{
+                centroid: null
+              }]
+            }
+          } as any
           expect(regionBase.position).toBeFalsy()
         })
       })
@@ -525,8 +523,12 @@ describe('> region.base.ts', () => {
       it('> populates if position property is array with length 3 and non NaN element', () => {
         regionBase.region = {
           ...mr0,
-          position: [1, 2, 3]
-        }
+          props: {
+            components: [{
+              centroid: [1, 2, 3]
+            }]
+          },
+        } as any
         expect(regionBase.position).toBeTruthy()
       })
     })
@@ -549,7 +551,7 @@ describe('> region.base.ts', () => {
         const regionBase = new RegionBase(mockStore)
         regionBase.region = {
           rgb: [100, 120, 140]
-        }
+        } as any
         expect(
           regionBase.rgbString
         ).toEqual(`rgb(100,120,140)`)
@@ -560,7 +562,7 @@ describe('> region.base.ts', () => {
         const regionBase = new RegionBase(mockStore)
         regionBase.region = {
           labelIndex: 65535
-        }
+        } as any
         expect(
           regionBase.rgbString
         ).toEqual(`rgb(255,255,255)`)
@@ -576,7 +578,7 @@ describe('> region.base.ts', () => {
               ngId: 'foo',
               name: 'bar',
               labelIndex: 152
-            }
+            } as any
             expect(strToRgbSpy).toHaveBeenCalledWith(`foo152`)
           })
           it('> if ngId is not defined, use name', () => {
@@ -585,7 +587,7 @@ describe('> region.base.ts', () => {
             regionBase.region = {
               name: 'bar',
               labelIndex: 152
-            }
+            } as any
             expect(strToRgbSpy).toHaveBeenCalledWith(`bar152`)
           })
         })
@@ -601,7 +603,7 @@ describe('> region.base.ts', () => {
           const regionBase = new RegionBase(mockStore)
           regionBase.region = {
             foo: 'bar'
-          }
+          } as any
           expect(
             regionBase.rgbString
           ).toEqual(`rgb(${arr.join(',')})`)
@@ -613,7 +615,7 @@ describe('> region.base.ts', () => {
           const regionBase = new RegionBase(mockStore)
           regionBase.region = {
             foo: 'bar'
-          }
+          } as any
           expect(
             regionBase.rgbString
           ).toEqual(`rgb(255,200,200)`)
diff --git a/src/atlasComponents/parcellationRegion/region.base.ts b/src/atlasComponents/parcellationRegion/region.base.ts
index 31de7af98da5bcc6747b334f71787267b0240cf5..f596afe76f7cfbffc7e83a39c24993e0b52e7530 100644
--- a/src/atlasComponents/parcellationRegion/region.base.ts
+++ b/src/atlasComponents/parcellationRegion/region.base.ts
@@ -8,6 +8,8 @@ import { viewerStateSetConnectivityRegion, viewerStateNavigateToRegion, viewerSt
 import { viewerStateFetchedTemplatesSelector, viewerStateGetSelectedAtlas, viewerStateSelectedTemplateFullInfoSelector, viewerStateSelectedTemplateSelector } from "src/services/state/viewerState/selectors";
 import { strToRgb, verifyPositionArg, getRegionHemisphere } from 'common/util'
 import { getPosFromRegion } from "src/util/siibraApiConstants/fn";
+import { TRegionDetail } from "src/util/siibraApiConstants/types";
+import { IHasId } from "src/util/interfaces";
 
 @Directive()
 export class RegionBase {
@@ -15,7 +17,14 @@ export class RegionBase {
   public rgbString: string
   public rgbDarkmode: boolean
 
-  private _region: any
+  private _region: TRegionDetail & {  
+    context?: {
+      atlas: IHasId
+      template: IHasId
+      parcellation: IHasId
+    }
+    ngId?: string
+  }
 
   private _position: [number, number, number]
   set position(val){
@@ -34,16 +43,12 @@ export class RegionBase {
   set region(val) {
     this._region = val
     this.region$.next(this._region)
-    this.hasContext$.next(!!this._region.context)
+    this.hasContext$.next(!!this._region?.context)
 
     this.position = null
     // bug the centroid returned is currently nonsense
     // this.position = val?.props?.centroid_mm
     if (!this._region) return
-
-    if (val?.position) {
-      this.position = val?.position 
-    }
     const pos = getPosFromRegion(val)
     if (pos) {
       this.position = pos
@@ -65,7 +70,7 @@ export class RegionBase {
 
   get originDatainfos(){
     if (!this._region) return []
-    return this._region._dataset_specs || this._region.originDatainfos
+    return (this._region._dataset_specs || []).filter(spec => spec['@type'] === 'minds/core/dataset/v1.0.0')
   }
 
   public hasContext$: BehaviorSubject<boolean> = new BehaviorSubject(false)
diff --git a/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.component.ts b/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.component.ts
deleted file mode 100644
index 487d2bc7fd1867582acff52b44df985c46387f75..0000000000000000000000000000000000000000
--- a/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.component.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Component, Input } from "@angular/core";
-
-import { Store } from "@ngrx/store";
-import { IavRootStoreInterface } from "src/services/stateStore.service";
-import { RegionBase } from '../region.base'
-
-@Component({
-  selector: 'region-list-simple-view',
-  templateUrl: './regionListSimpleView.template.html',
-  styleUrls: [
-    './regionListSimpleView.style.css',
-  ],
-})
-
-export class RegionListSimpleViewComponent extends RegionBase {
-
-  @Input()
-  public showBrainIcon: boolean = false
-
-  @Input()
-  public showDesc: boolean = false
-
-  constructor(
-    store$: Store<IavRootStoreInterface>,
-  ) {
-    super(store$)
-  }
-}
diff --git a/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.style.css b/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.style.css
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.template.html b/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.template.html
deleted file mode 100644
index 1b4636a59534a5b5fd6cfe1269814e79ab520c2a..0000000000000000000000000000000000000000
--- a/src/atlasComponents/parcellationRegion/regionListSimpleView/regionListSimpleView.template.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-<!-- selected brain region -->
-<div class="flex-grow-1 flex-shrink-1 pt-2 pb-2 d-flex flex-row align-items-center flex-nowrap">
-  <i *ngIf="showBrainIcon" class="flex-grow-0 flex-shrink-0 fas fa-brain mr-2"></i>
-
-  <small class="flex-grow-1 flex-shrink-1 ">
-    {{ region.name }}
-  </small>
-
-  <button mat-icon-button
-    *ngIf="position"
-    class="flex-grow-0 flex-shrink-0"
-    (click)="navigateToRegion()" >
-    <i *ngIf="isSelected" class="fas fa-map-marked-alt"></i>
-  </button>
-
-  <button mat-icon-button
-    class="flex-grow-0 flex-shrink-0"
-    (click)="toggleRegionSelected()" >
-    <i *ngIf="isSelected" class="fas fa-trash"></i>
-    <i *ngIf="!isSelected" class="fas fa-plus"></i>
-  </button>
-</div>
-
-<mat-divider *ngIf="showDesc && region.description"></mat-divider>
-
-<small *ngIf="showDesc && region.description">
-  {{ region.description }}
-</small>
\ No newline at end of file
diff --git a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
index 1849ae9294154b0f4bf873f0af95c273a21de205..db607952a6369db63f42fc4bbf83d7d965c4d711 100644
--- a/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
+++ b/src/atlasComponents/parcellationRegion/regionMenu/regionMenu.template.html
@@ -10,7 +10,6 @@
     <mat-card-title>
       <div class="position-relative region-name iv-custom-comp text">
         {{ region.name }}
-        <small *ngIf="region.status"> ({{region.status}})</small>
       </div>
     </mat-card-title>
 
@@ -22,20 +21,7 @@
       </span>
 
       <!-- origin datas format -->
-      <div *ngFor="let originDataset of (region.originDatasets || []); let index = index"
-        class="ml-2">
-        <i>&#183;</i>
-
-        <span *ngIf="originDataset?.format?.name as regionOrDsFormatName; else fallbackODsnameTmpl">
-          {{ regionOrDsFormatName }}
-        </span>
-        <ng-template #fallbackODsnameTmpl>
-          <span>
-            {{ regionOriginDatasetLabels$ | async | renderViewOriginDatasetlabel : index }}
-          </span>
-        </ng-template>
-      </div>
-
+      
       <mat-divider vertical="true" class="ml-2 h-2rem"></mat-divider>
 
       <!-- position -->
diff --git a/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html b/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html
index 7a8ce3161f2f78846774ca4f0da7f870bc458562..b724ab6f27d2ece74413959934d913d7b48888f5 100644
--- a/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html
+++ b/src/atlasComponents/parcellationRegion/regionSimple/regionSimple.template.html
@@ -1,7 +1,7 @@
 <div class="d-flex flex-row">
 
   <small class="text-truncate flex-shrink-1 flex-grow-1">
-    {{ region.name }}<span *ngIf="region.status" class="text-muted">{{' (' + region.status + ')'}}</span>
+    {{ region.name }}
   </small>
 
   <div class="flex-grow-0 flex-shrink-0 d-flex flex-row">
diff --git a/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts b/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts
index d36cc47d41c7edf1b4101c2544bc0913ccdcadf9..d3fcb22161ad3e74d66002f083f32c724f5224f1 100644
--- a/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts
+++ b/src/atlasComponents/regionalFeatures/bsFeatures/genericInfo/genericInfoCmp/genericInfo.component.ts
@@ -5,14 +5,14 @@ import { ARIA_LABELS, CONST } from 'common/constants'
 import { TBSSummary } from "../../kgDataset";
 import { BsFeatureService } from "../../service";
 import { MAT_DIALOG_DATA } from "@angular/material/dialog";
-import { TDatainfos } from "src/util/siibraApiConstants/types";
+import { TDatainfosDetail } from "src/util/siibraApiConstants/types";
 import { TRegion } from "../../type";
 
 /**
  * this component is specifically used to render side panel ebrains dataset view
  */
 
-export type TInjectableData = TDatainfos & {
+export type TInjectableData = TDatainfosDetail & {
   dataType?: string
   view?: ViewRef | TemplateRef<any>
   region?: TRegion
diff --git a/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts b/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts
index 2cc1dae60470d227368d347a1dccda0b7529d124..5aeb3c1eb2310b954ae6346ca97fe78d67afeb85 100644
--- a/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts
+++ b/src/atlasComponents/regionalFeatures/bsFeatures/kgDataset/showDataset/showDataset.directive.ts
@@ -2,7 +2,7 @@ import { Directive, HostListener, Inject, Input, Optional } from "@angular/core"
 import { MatDialog, MatDialogConfig } from "@angular/material/dialog";
 import { MatSnackBar } from "@angular/material/snack-bar";
 import { OVERWRITE_SHOW_DATASET_DIALOG_TOKEN, TOverwriteShowDatasetDialog } from "src/util/interfaces";
-import { TRegion as TSiibraRegion } from "src/util/siibraApiConstants/types";
+import { TRegionDetail as TSiibraRegion } from "src/util/siibraApiConstants/types";
 import { TRegion as TContextRegion } from 'src/atlasComponents/regionalFeatures/bsFeatures/type'
 
 export const IAV_DATASET_SHOW_DATASET_DIALOG_CMP = 'IAV_DATASET_SHOW_DATASET_DIALOG_CMP'
diff --git a/src/routerModule/util.ts b/src/routerModule/util.ts
index e0115ee6268f033cf55a17e1ddac3c39e1b8839f..bbf8791d3e53851ffb05a9e0acff9646003ff356 100644
--- a/src/routerModule/util.ts
+++ b/src/routerModule/util.ts
@@ -183,12 +183,14 @@ export const cvtFullRouteToState = (fullPath: UrlTree, state: any, _warnCb?: (ar
     returnState['viewerState']['regionsSelected'] = regionsSelected
     returnState['viewerState']['templateSelected'] = templateSelected
 
-    const { scale } = spaceMiscInfoMap.get(templateSelected.id) || { scale: 1 }
-    returnState['viewerState']['navigation'] = parsedNavObj || ({
-      ...DEFAULT_NAV,
-      zoom: 350000 * scale,
-      perspectiveZoom: 1922235.5293810747 * scale
-    })
+    if (templateSelected) {
+      const { scale } = spaceMiscInfoMap.get(templateSelected.id) || { scale: 1 }
+      returnState['viewerState']['navigation'] = parsedNavObj || ({
+        ...DEFAULT_NAV,
+        zoom: 350000 * scale,
+        perspectiveZoom: 1922235.5293810747 * scale
+      })
+    }
   } catch (e) {
     // if error, show error on UI?
     warnCb(`parse template, parc, region error`, e)
diff --git a/src/util/patchPureConstants.ts b/src/util/patchPureConstants.ts
index 681860add48b6393c202f3377f7afc217acd1682..a8fc56c9236692ad2d46c459476b69836c147898 100644
--- a/src/util/patchPureConstants.ts
+++ b/src/util/patchPureConstants.ts
@@ -6,7 +6,7 @@
  */
 
 import { IHasId } from "./interfaces";
-import { TRegion } from "./siibraApiConstants/types";
+import { TRegionSummary } from "./siibraApiConstants/types";
 
 type TAppend = {
   parent: IHasId | { name: string }
@@ -22,7 +22,7 @@ type TPatchRegion = {
   '@id': string
   targetSpace: IHasId[] | '*'
   targetParcellation: IHasId[] | '*'
-  payload: Partial<TRegion>
+  payload: Partial<TRegionSummary>
 } & (TAppend | TPatch)
 
 const encoder = new TextEncoder()
diff --git a/src/util/pureConstant.service.ts b/src/util/pureConstant.service.ts
index d665d97fb00daae8d13275e40bc00aed3027f4b7..3e9b7abd1f9e803826d5df4ed7843133c7174a67 100644
--- a/src/util/pureConstant.service.ts
+++ b/src/util/pureConstant.service.ts
@@ -9,7 +9,7 @@ import { LoggingService } from "src/logging";
 import { viewerStateFetchedAtlasesSelector, viewerStateSelectedTemplateSelector } from "src/services/state/viewerState/selectors";
 import { BS_ENDPOINT, BACKENDURL } from "src/util/constants";
 import { flattenReducer } from 'common/util'
-import { IVolumeTypeDetail, TAtlas, TId, TParc, TRegion, TRegionDetail, TSpaceFull, TSpaceSummary, TVolumeSrc } from "./siibraApiConstants/types";
+import { IVolumeTypeDetail, TAtlas, TId, TParc, TRegionDetail, TRegionSummary, TSpaceFull, TSpaceSummary, TVolumeSrc } from "./siibraApiConstants/types";
 import { MultiDimMap, recursiveMutate, mutateDeepMerge } from "./fn";
 import { patchRegions } from './patchPureConstants'
 import { environment } from "src/environments/environment";
@@ -216,7 +216,7 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
   )
 
   private getRegions(atlasId: string, parcId: string, spaceId: string){
-    return this.http.get<TRegion[]>(
+    return this.http.get<TRegionSummary[]>(
       `${this.bsEndpoint}/atlases/${encodeURIComponent(atlasId)}/parcellations/${encodeURIComponent(parcId)}/regions`,
       {
         params: {
@@ -252,7 +252,7 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
                   if (p.parent['name'] === region.name) {
                     if (!region.children) region.children = []
                     region.children.push(
-                      p.payload as TRegion
+                      p.payload as TRegionSummary
                     )
                   }
                 }
@@ -547,7 +547,11 @@ Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}"
                              * in the case of interpolated, it sucks that the ngLayerObj will be set multiple times
                              */
 
-                            const dedicatedMap = region._dataset_specs.filter(spec => spec.space_id === tmpl.id && spec['volume_type'] === 'neuroglancer/precomputed')
+                            const dedicatedMap = region._dataset_specs.filter(
+                              spec => spec["@type"] === 'fzj/tmp/volume_type/v0.0.1'
+                              && spec.space_id === tmpl.id
+                              && spec['volume_type'] === 'neuroglancer/precomputed'
+                            ) as TVolumeSrc<'neuroglancer/precomputed'>[]
                             if (dedicatedMap.length === 1) {
                               const ngId = getNgId(atlas['@id'], tmpl.id, parc.id, dedicatedMap[0]['@id'])
                               region['ngId'] = ngId
diff --git a/src/util/siibraApiConstants/fn.ts b/src/util/siibraApiConstants/fn.ts
index d1cc7ff554d14490b1ae1d9915d10ff1dbcaba4b..0316b8c94f93b5c9bd0d65f8ed0aa957fe918847 100644
--- a/src/util/siibraApiConstants/fn.ts
+++ b/src/util/siibraApiConstants/fn.ts
@@ -1,7 +1,8 @@
 import { TRegionDetail } from "./types";
 
 export function getPosFromRegion(region: TRegionDetail){
-  if (!region?.props) return null
-  if (!region.props.components?.[0]) return null
-  return region.props.components[0].centroid.map(v => v*1e6) as [number, number, number]
+  if (!!region?.props?.components?.[0]?.centroid) {
+    return region.props.components[0].centroid.map(v => v*1e6) as [number, number, number]  
+  }
+  return null
 }
\ No newline at end of file
diff --git a/src/util/siibraApiConstants/types.ts b/src/util/siibraApiConstants/types.ts
index 7f3170ad6f7f665ba13202a833b7342f86d36037..40feae057c4f86091709af44a3346ce8fdb3b2bb 100644
--- a/src/util/siibraApiConstants/types.ts
+++ b/src/util/siibraApiConstants/types.ts
@@ -96,7 +96,14 @@ export type TParcSummary = {
   name: string
 }
 
-export type TDatainfos = {
+export type TDatainfoSummary = {
+  '@type': 'minds/core/dataset/v1.0.0'
+  kgSchema: string
+  kgId: string
+}
+
+export type TDatainfosDetail = {
+  '@type': 'minds/core/dataset/v1.0.0'
   name: string
   description: string
   urls: {
@@ -148,22 +155,37 @@ export type TParc = {
   _dataset_specs: TDatasetSpec[]
 }
 
+export type TRegionSummary = {
+  name: string
+  labelIndex: number
+  rgb: [number, number, number]
+  id: number
+  availableIn: {
+    id: string
+    name: string
+  }[]
+  _dataset_specs: (TVolumeSrc<keyof IVolumeTypeDetail> | TDatainfoSummary)[]
+  children: TRegionSummary[]
+}
+
 export type TRegionDetail = {
   name: string
-  children: TRegionDetail[]
-  rgb: number[]
-  id: string
   labelIndex: number
-  volumeSrc: {
-    [key: string]: {
-      [key: string]: TVolumeSrc<keyof IVolumeTypeDetail>[]
-    }
+  rgb: [number, number, number]
+  id: {
+    kg: TKgIdentifier
   }
   availableIn: {
     id: string
     name: string
   }[]
+  _dataset_specs: (TVolumeSrc<keyof IVolumeTypeDetail> | TDatainfosDetail)[]
+
+  children: TRegionDetail[]
   hasRegionalMap: boolean
+  links: {
+    [key: string]: string
+  }
   props: {
     components: {
       centroid: [number, number, number]
@@ -171,31 +193,6 @@ export type TRegionDetail = {
     }[]
     space: any
   }
-  links: {
-    [key: string]: string
-  }
-  originDatainfos: TDatainfos[]
+  
 }
 
-export type TRegion = {
-  name: string
-  children: TRegion[]
-
-  labelIndex?: number
-  rgb?: number[]
-  id?: {
-    kg: TKgIdentifier
-  }
-
-  _dataset_specs: TVolumeSrc<keyof IVolumeTypeDetail>[]
-
-  /**
-   * missing 
-   */
-
-  originDatasets?: ({
-    filename: string
-  } & TKgIdentifier) []
-
-  position?: number[]
-}
diff --git a/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts b/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts
index a57a22a767a5acda4826f2c46577a6d25e29b78f..8bf705e68d933cdc60faa91903cb9506025c2895 100644
--- a/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts
+++ b/src/viewerModule/viewerStateBreadCrumb/breadcrumb/breadcrumb.component.ts
@@ -7,7 +7,7 @@ import { distinctUntilChanged, map } from "rxjs/operators";
 import { viewerStateHelperSelectParcellationWithId, viewerStateRemoveAdditionalLayer, viewerStateSetSelectedRegions } from "src/services/state/viewerState.store.helper";
 import { ngViewerActionClearView, ngViewerSelectorClearViewEntries } from "src/services/state/ngViewerState.store.helper";
 import { OVERWRITE_SHOW_DATASET_DIALOG_TOKEN } from "src/util/interfaces";
-import { TDatainfos, TParc, TSimpleInfo } from "src/util/siibraApiConstants/types";
+import { TDatainfosDetail } from "src/util/siibraApiConstants/types";
 
 @Component({
   selector: 'viewer-state-breadcrumb',
@@ -120,10 +120,11 @@ export class ViewerStateBreadCrumb {
 })
 
 export class OriginalDatainfoPipe implements PipeTransform{
-  public transform(arr: TDatainfos[]): TDatainfos[]{
+  public transform(arr: TDatainfosDetail[]): TDatainfosDetail[]{
     if (arr.length > 0) {
       return arr.map(d => {
         return {
+          '@type': 'minds/core/dataset/v1.0.0',
           name: d.name,
           description: d.name,
           urls: [],