diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bd43a4cc266a4b947603936b512a12dc6363042b..975c459a0a78a0d93650c4b376fa1aef2a95a2ad 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,14 +9,14 @@ stages:
 
 ## VALIDATION ##
 
-deploy_test1:
+test1:
   stage: integration
   environment:
     name: test1
     url: https://test1.startinblox.com
   script:
     - echo "$APP_CONFIG_TEST1" > config.json
-    - echo "$SSH_ASTRAL_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
     - npm install
     - npm run build
     - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* test1@astral.startinblox.com:~/front/
@@ -26,14 +26,14 @@ deploy_test1:
   tags:
     - deploy
 
-deploy_test2:
+test2:
   stage: integration
   environment:
     name: test2
     url: https://test2.startinblox.com
   script:
     - echo "$APP_CONFIG_TEST2" > config.json
-    - echo "$SSH_ASTRAL_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
     - npm install
     - npm run build
     - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* test2@astral.startinblox.com:~/front/
@@ -43,14 +43,14 @@ deploy_test2:
   tags:
     - deploy
 
-deploy_test3:
+test3:
   stage: integration
   environment:
     name: test3
     url: https://test3.startinblox.com
   script:
     - echo "$APP_CONFIG_TEST3" > config.json
-    - echo "$SSH_ASTRAL_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
     - npm install
     - npm run build
     - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* test3@astral.startinblox.com:~/front/
@@ -60,14 +60,14 @@ deploy_test3:
   tags:
     - deploy
 
-deploy_stg1:
+stg1:
   stage: acceptance
   environment:
     name: stg1
     url: https://stg1.startinblox.com
   script:
     - echo "$APP_CONFIG_STG1" > config.json
-    - echo "$SSH_ASTRAL_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
     - npm install
     - npm run build
     - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* stg1@astral.startinblox.com:~/front/
@@ -77,14 +77,14 @@ deploy_stg1:
   tags:
     - deploy
 
-deploy_stg2:
+stg2:
   stage: acceptance
   environment:
     name: stg2
     url: https://stg2.startinblox.com
   script:
     - echo "$APP_CONFIG_STG2" > config.json
-    - echo "$SSH_ASTRAL_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
     - npm install
     - npm run build
     - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* stg2@astral.startinblox.com:~/front/
@@ -96,26 +96,85 @@ deploy_stg2:
 
 ## LIVE DEPLOYMENTS ##
 
-deploy_nantes:
+alpha:
+  stage: deployment
+  environment:
+    name: paris
+    url: https://alpha.happy-dev.fr
+  script:
+    - echo "$APP_CONFIG_ALPHA" > config.json
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - npm install
+    - npm run build
+    - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* alpha@ssh-alpha.happy-dev.fr:~/www/
+  only:
+    - master
+  when: manual
+  tags:
+    - deploy
+
+etuc:
+  stage: deployment
+  environment:
+    name: etuc
+    url: https://app.digitalplatformobservatory.org
+  script:
+    - echo "$APP_CONFIG_DIGITALPLATFORMOBSERVATORY" > config.json
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - npm install
+    - npm run build
+    - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* etuc@ssh-etuc.happy-dev.fr:~/sib/www/
+  only:
+    - master
+  when: manual
+  tags:
+    - deploy
+
+nantes:
   stage: deployment
   environment:
     name: nantes
-    url: https://nantes.happy-dev.fr
+    url: https://app.nantes.happy-dev.fr
   script:
-    - echo 'Not happening yet...'
+    - echo "$APP_CONFIG_NANTESHD" > config.json
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - npm install
+    - npm run build
+    - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* nantes@ssh-nantes.happy-dev.fr:~/sib/www/
   only:
     - master
   when: manual
   tags:
     - deploy
 
-deploy_paris:
+paris:
   stage: deployment
   environment:
     name: paris
-    url: https://paris.happy-dev.fr
+    url: https://app.paris.happy-dev.fr
   script:
-    - echo 'Not happening yet...'
+    - echo "$APP_CONFIG_PARIS" > config.json
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - npm install
+    - npm run build
+    - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* paris@ssh-paris.happy-dev.fr:~/sib/www/
+  only:
+    - master
+  when: manual
+  tags:
+    - deploy
+
+toulouse:
+  stage: deployment
+  environment:
+    name: toulouse
+    url: https://smart-toulouse.happy-dev.fr
+  script:
+    - echo "$APP_CONFIG_TOULOUSE" > config.json
+    - echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
+    - npm install
+    - npm run build
+    - scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* smart-toulouse@ssh-smart-toulouse.happy-dev.fr:~/www/
   only:
     - master
   when: manual
diff --git a/src/scripts/index.js b/src/scripts/index.js
index acbaa41312c3320d55629fa0cdf48937cee60005..618ae5373180944de802172e058b1d0cf869c96d 100644
--- a/src/scripts/index.js
+++ b/src/scripts/index.js
@@ -76,10 +76,10 @@ function openRightMenu() {
 }
 
 //auxiliary function clears cache & refreshes sib-displays for a given resource ID
-function refreshSibDisplays(resourceId, clearCache = true) {
+function refreshElements(resourceId, clearCache = true, selector="sib-display") {
   let cacheCleared = false;
 
-  Array.from(document.querySelectorAll("sib-display"))
+  Array.from(document.querySelectorAll(selector))
     .filter(sibDisplay => sibDisplay.component.resourceId == resourceId) // keep only elements with resource == edited resource
     .forEach(e => {
       //clear cache if we were unable to before
@@ -95,9 +95,8 @@ function refreshSibDisplays(resourceId, clearCache = true) {
 //NOTE: this is a temporary workaround and should be replaced by a reactive storage
 //https://git.happy-dev.fr/startinblox/framework/sib-core/issues/524
 async function refreshResource(event) {
-
   // if of the edited resource || id of the container of the created resource
-  const resourceId = event.detail.resource["@id"] || event.target.dataset.src;
+  let resourceId = event.detail.resource["@id"] || event.target.dataset.src;
   let resource = document
     .querySelector('[data-src="' + resourceId + '"]')
     .component.resource.getResourceData();
@@ -106,21 +105,21 @@ async function refreshResource(event) {
   let partnerId = null;
   if (resourceId.includes("circle-members")) {
     partnerId = resource["http://happy-dev.fr/owl/#circle"]["@id"];
-  } else if (resourceId.includes("project-members"))
+  } else if (resourceId.includes("project-members")) {
     partnerId = resource["http://happy-dev.fr/owl/#project"]["@id"];
-  
+  }
   //refresh all resources using the partner ID
   if (partnerId != null) {
-    refreshSibDisplays(partnerId);
-    refreshSibDisplays(partnerId + "members/");
+    refreshElements(partnerId);
+    refreshElements(partnerId + "members/");
   }
 
   //special cases updating users/X/circles for the left-side-menu (leaving or joining circle)
   let user = await document.querySelector('sib-auth').getUser();
   if(resourceId.includes('circle') && user != null) {
     let userId = user['@id'];
-    refreshSibDisplays(userId + "circles/");
-    refreshSibDisplays(resourceId.split('/').slice(0,4).join('/')+'/joinable/');
+    refreshElements(userId + "circles/");
+    refreshElements(resourceId.split('/').slice(0,4).join('/')+'/joinable/');
   }
 
   //clear cache on this resource
@@ -132,7 +131,10 @@ async function refreshResource(event) {
   }
 
   //update all displays which use this resource
-  refreshSibDisplays(resourceId, cacheCleared);
+  if(resourceId.includes('/members/')) {
+    refreshElements(resourceId, cacheCleared, "sib-form");
+  }
+  refreshElements(resourceId, cacheCleared);
 }
 
 //auxiliary function performs a redirect
diff --git a/src/views/admin/page-admin-circles.pug b/src/views/admin/page-admin-circles.pug
index c4428bdcfe64015b36baef423348585133c257ce..e16b76e32dd93d300abd77e04ba109f7b8e1e3f9 100644
--- a/src/views/admin/page-admin-circles.pug
+++ b/src/views/admin/page-admin-circles.pug
@@ -51,6 +51,7 @@
               data-label='Leave circle'
             )
 
+        //- displaying both circles on my user..
         sib-display(
           class='table-body'
 
@@ -82,6 +83,7 @@
               submit-button='Join Circle'
             )
 
+        //- ..and federated circles which I can join
         sib-display(
           class='table-body'