diff --git a/app/controllers/admin/communication/websites_controller.rb b/app/controllers/admin/communication/websites_controller.rb
index 4c83bc938d0e182eaa38daacca27fb0834d09013..e7859ee1893c67eb378813334fded16ea6d2f211 100644
--- a/app/controllers/admin/communication/websites_controller.rb
+++ b/app/controllers/admin/communication/websites_controller.rb
@@ -74,9 +74,10 @@ class Admin::Communication::WebsitesController < Admin::Communication::Websites:
 
   def website_params
     attribute_names = [
-      :name, :url, :repository, :access_token, :about_type, :about_id, :in_production,
+      :name, :url, :repository, :about_type, :about_id, :in_production,
       :git_provider, :git_endpoint, :git_branch, :plausible_url, :deployment_status_badge, language_ids: []
     ]
+    attribute_names << :access_token unless params[:communication_website][:access_token].blank?
     # For now, default language can't be changed, too many implications, especially around special pages.
     attribute_names << :default_language_id unless @website&.persisted?
     params.require(:communication_website).permit(*attribute_names)
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 2e91e15aaf6e8918fbd55aab5ee10ef43615ba03..c234968c2a06679af775c7f5db52ee3e47b76f45 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -50,6 +50,12 @@ module ApplicationHelper
     string.gsub(/(?<=.{3}).+(?=.{2})/, '*******')
   end
 
+  def masked_string(string)
+    string = string.to_s # in case it was nil
+    mask_length = [(string.length - 5), 0].max
+    string.to_s.gsub(/.+(?=.{5})/, '•' * mask_length)
+  end
+
   def language_name(iso_code)
     I18nData.languages(I18n.locale)[iso_code.to_s.upcase].titleize
   end
diff --git a/app/models/ability.rb b/app/models/ability.rb
index 77af5a43a15d7fabda72259494a8db6a1f0279ac..3e883f9979f0e35199bb0a02874fc7328f1cee46 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -138,12 +138,15 @@ class Ability
     can :create, Communication::Block
     can :manage, Communication::Block::Heading, university_id: @user.university_id
     can :create, Communication::Block::Heading
-    can [:read, :analytics], Communication::Website, university_id: @user.university_id
+    can :manage, Communication::Website, university_id: @user.university_id
+    # Est-ce bien raisonnable de laisser supprimer un site ?
+    # Le risque de faussse manip est grand.
+    cannot :destroy, Communication::Website, university_id: @user.university_id
     can :manage, Communication::Website::Category, university_id: @user.university_id
     can :manage, Communication::Website::Imported::Website, university_id: @user.university_id
     can :manage, Communication::Website::Imported::Page, university_id: @user.university_id
     can :manage, Communication::Website::Imported::Post, university_id: @user.university_id
-    can [:read, :update, :reorder], Communication::Website::Menu, university_id: @user.university_id
+    can :manage, Communication::Website::Menu, university_id: @user.university_id
     can :manage, Communication::Website::Menu::Item, university_id: @user.university_id
     can :manage, Communication::Website::Page, university_id: @user.university_id
     can :manage, Communication::Website::Post, university_id: @user.university_id
diff --git a/app/views/admin/communication/websites/_form.html.erb b/app/views/admin/communication/websites/_form.html.erb
index 53f3e1b6ac6f7e7af39f270ba185436f82b24a2c..b74c842aa0e5f636049824ec343c3cc9434489ba 100644
--- a/app/views/admin/communication/websites/_form.html.erb
+++ b/app/views/admin/communication/websites/_form.html.erb
@@ -22,7 +22,11 @@
               <%= f.input :deployment_status_badge, as: :string %>
             </div>
             <div class="col-xl-6">
-              <%= f.input :access_token %>
+              <%= f.input :access_token, 
+                          as: :password, 
+                          placeholder: masked_string(f.object.access_token), 
+                          hint: t("simple_form.hints.communication_website.access_token_#{f.object.access_token.blank? ? 'without' : 'with'}_existing").html_safe
+                          %>
               <%= f.input :repository %>
               <%= f.input :git_branch %>
             </div>
diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml
index 153ee23b13485d2bfd0dc26843165cb98517551e..144a82fb5bd28c492f63617dc6d48ec78f83c841 100644
--- a/config/locales/communication/en.yml
+++ b/config/locales/communication/en.yml
@@ -140,6 +140,7 @@ en:
         in_production: Production
         languages: Languages
         name: Name
+        plausible_url: Plausible dashboard URL
         repository: Repository
         url: URL
       communication/website/category:
@@ -820,10 +821,14 @@ en:
         host: Sans le protocole
         sso_button_label: "Default: Sign in via SSO"
       communication_website:
+        access_token_with_existing: Your Github or Gitlab confidential access token.<br>Leave the field blank if you don't want to change the token.
+        access_token_without_existing: Your Github or Gitlab confidential access token.
         deployment_status_badge: "Badge URL: <a href=\"https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge\" target=\"_blank\">Github</a>, <a href=\"https://docs.gitlab.com/ee/user/project/badges.html\" target=\"_blank\">Gitlab</a>"
         git_branch: 'If blank, default branch will be used'
         git_endpoint: 'If blank, default will be used (https://github.com or https://gitlab.com/api/v4)'
         languages: 'If you select one language the website urls will not be prefixed. If you select more than one language the website will then be considered as multilingual, and therefore all urls will be prefixed with the language (/fr, /en)'
+        plausible_url: Dashboard link generated following the <a href="https://plausible.io/docs/shared-links" target="_blank">official Plausible documentation</a>.
+        repository: As organization/name, for example noesya/bordeauxmontaigne-iut
       communication_website_page:
         breadcrumb_title: If the field is empty, page title will be used in breadcrumbs.
         full_width: On large screens, a full width page uses all available space for the content. This is good for landing pages, or to make them spectacular. If the page is not full width, the content column will be smaller to make reading easier. The unused space might be used for a table of contents.
diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml
index 5a0e78892f931af49d293d8d82c6ff8d00aa6643..63f58839bb6391d029dace6e71fad47b410f8de2 100644
--- a/config/locales/communication/fr.yml
+++ b/config/locales/communication/fr.yml
@@ -130,17 +130,18 @@ fr:
         about_Research::Journal: Site de revue scientifique
         about_Research::Laboratory: Site de laboratoire
         about_type: Type de site
-        access_token: Access token
+        access_token: Jeton d'accès
         created_at: Création
         default_language: Langue par défaut
         deployment_status_badge: Badge de statut du déploiement
         git_branch: Branche
         git_endpoint: Point d'accès Git
-        git_provider: Provider Git
+        git_provider: Fournisseur Git
         in_production: Site en production
         languages: Langues
         name: Nom
-        repository: Repository
+        plausible_url: Tableau de bord Plausible
+        repository: Référentiel
         url: URL
       communication/website/category:
         children: Catégories enfants
@@ -820,10 +821,14 @@ fr:
         host: Sans le protocole
         sso_button_label: "Par défaut : Se connecter en SSO"
       communication_website:
+        access_token_with_existing: Votre jeton d'accès Github ou Gitlab confidentiel.<br>Laisser le champ vide pour ne pas le modifier.
+        access_token_without_existing: Votre jeton d'accès Github ou Gitlab confidentiel.
         deployment_status_badge: "URL du badge : <a href=\"https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge\" target=\"_blank\">Github</a>, <a href=\"https://docs.gitlab.com/ee/user/project/badges.html\" target=\"_blank\">Gitlab</a>"
         git_branch: 'Laisser vide pour la branche par défaut'
         git_endpoint: 'Laisser vide pour les valeurs par défaut (https://github.com ou https://gitlab.com/api/v4)'
         languages: 'Si vous sélectionnez une seule langue les urls ne seront pas préfixées. Si vous en sélectionnez plusieurs le site sera considéré comme multilingue et donc toutes les urls seront préfixées avec la langue (/fr, /en)'
+        plausible_url: Lien de partage généré selon la <a href="https://plausible.io/docs/shared-links" target="_blank">documentation officielle Plausible</a>.
+        repository: Sous la forme organisation/nom, par exemple noesya/bordeauxmontaigne-iut
       communication_website_page:
         breadcrumb_title: Si ce champ est vide le titre de la page sera utilisé dans le fil d'Ariane.
         full_width: Sur de grands écrans, la page en pleine largeur utilisera tout l'espace disponible, ce qui est pertinent pour événementialiser une page. Si la page n'est pas en pleine largeur, l'espace dédié au contenu sera réduit pour faciliter la lecture, et l'espace libre pourra être utilisé pour une table des matières facilitant la navigation.
diff --git a/db/schema.rb b/db/schema.rb
index 8d846ab196a019d264f4f88bf32f1f4b5af3465a..112100075b532564a850f119196fe83a9dcb85e7 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -105,8 +105,8 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_11_073707) do
     t.datetime "updated_at", null: false
     t.string "title"
     t.boolean "published", default: true
-    t.uuid "heading_id"
     t.uuid "communication_website_id"
+    t.uuid "heading_id"
     t.index ["about_type", "about_id"], name: "index_communication_website_blocks_on_about"
     t.index ["communication_website_id"], name: "index_communication_blocks_on_communication_website_id"
     t.index ["heading_id"], name: "index_communication_blocks_on_heading_id"
@@ -223,6 +223,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_11_073707) do
     t.text "home_sentence"
     t.text "sass"
     t.text "css"
+    t.boolean "allow_experiences_modification", default: true
     t.index ["about_type", "about_id"], name: "index_communication_extranets_on_about"
     t.index ["university_id"], name: "index_communication_extranets_on_university_id"
   end
@@ -461,7 +462,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_11_073707) do
     t.index ["university_id"], name: "index_communication_website_pages_on_university_id"
   end
 
-  create_table "communication_website_permalinks", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_permalinks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.string "about_type", null: false