diff --git a/app/controllers/admin/communication/blocks/application_controller.rb b/app/controllers/admin/communication/blocks/application_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1399c37ac184db805cae2845149d8badf1961879
--- /dev/null
+++ b/app/controllers/admin/communication/blocks/application_controller.rb
@@ -0,0 +1,8 @@
+class Admin::Communication::Blocks::ApplicationController < Admin::Communication::ApplicationController
+
+  protected
+
+  def breadcrumb
+    short_breadcrumb
+  end
+end
diff --git a/app/controllers/admin/communication/blocks/headings_controller.rb b/app/controllers/admin/communication/blocks/headings_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ee17fb8b353975272b200a3a8459e890ae73d9b5
--- /dev/null
+++ b/app/controllers/admin/communication/blocks/headings_controller.rb
@@ -0,0 +1,111 @@
+class Admin::Communication::Blocks::HeadingsController < Admin::Communication::Blocks::ApplicationController
+  load_and_authorize_resource class: Communication::Block::Heading,
+                              through: :current_university,
+                              through_association: :communication_block_headings
+
+  def reorder
+    ids = params[:ids] || []
+    ids.each.with_index do |id, index|
+      @heading = current_university.communication_block_headings.find(id)
+      @heading.update position: index + 1
+    end
+    @heading.about.sync_with_git
+  end
+
+  def new
+    @heading.about = Polymorphic.find params, :about
+    breadcrumb
+  end
+
+  def show
+    breadcrumb
+  end
+
+  def edit
+    breadcrumb
+  end
+
+  def create
+    @heading.university = current_university
+    if @heading.save
+      sync_with_git_if_necessary
+      redirect_to about_path,
+                  notice: t('admin.successfully_created_html', model: @heading.to_s)
+    else
+      breadcrumb
+      render :new, status: :unprocessable_entity
+    end
+  end
+
+  def update
+    if @heading.update(heading_params)
+      sync_with_git_if_necessary
+      redirect_to about_path,
+                  notice: t('admin.successfully_updated_html', model: @heading.to_s)
+    else
+      breadcrumb
+      add_breadcrumb t('edit')
+      render :edit, status: :unprocessable_entity
+    end
+  end
+
+  def destroy
+    path = about_path
+    @heading.destroy
+    sync_with_git_if_necessary
+    redirect_to path,
+                notice: t('admin.successfully_destroyed_html', model: @heading.to_s)
+  end
+
+  protected
+
+  def sync_with_git_if_necessary
+    return unless @heading.about.respond_to?(:sync_with_git)
+    @heading.about.sync_with_git 
+  end
+
+  # TODO factorize
+  def website_id
+    params[:website_id] || @heading.about&.website.id
+  rescue
+  end
+
+  def extranet_id
+    params[:extranet_id] || @heading.about&.extranet.id
+  rescue
+  end
+
+  def journal_id
+    params[:journal_id] || @heading.about&.journal.id
+  rescue
+  end
+
+  def about_path
+    # La formation ou la page concernée
+    path_method = "admin_#{@heading.about.class.base_class.to_s.parameterize.underscore}_path"
+    path_method_options = { 
+      id: @heading.about_id, 
+      website_id: website_id,
+      extranet_id: extranet_id,
+      journal_id: journal_id
+    }
+    path_method_options[:lang] = @heading.about.language.iso_code if @heading.about.respond_to?(:language)
+    public_send path_method, **path_method_options
+  end
+  # TODO /factorize
+
+  def breadcrumb
+    super
+    add_breadcrumb @heading.about, about_path
+    if @heading.new_record?
+      add_breadcrumb t('admin.communication.blocks.headings.add')
+    else
+      add_breadcrumb @heading
+    end
+  end
+
+  def heading_params
+    params.require(:communication_block_heading)
+          .permit(:about_id, :about_type, :title)
+  end
+end
diff --git a/app/controllers/admin/communication/blocks_controller.rb b/app/controllers/admin/communication/blocks_controller.rb
index 66acee7054e20ff270ec5a38d571c712a088fb16..cc346f1ff2de7ed4527a3e36e9c56d7677d41bd0 100644
--- a/app/controllers/admin/communication/blocks_controller.rb
+++ b/app/controllers/admin/communication/blocks_controller.rb
@@ -13,11 +13,7 @@ class Admin::Communication::BlocksController < Admin::Communication::Application
   end
 
   def new
-    about_class = params[:about_type].constantize
-    about = about_class.find params[:about_id]
-    # Rails uses ActiveRecord::Inheritance#polymorphic_name to hydrate the about_type.
-    # Example: A Block for a Communication::Website::Page::Home will have about_type = "Communication::Website::Page"
-    @block.about = about
+    @block.about = Polymorphic.find params, :about
     breadcrumb
   end
 
diff --git a/app/models/ability.rb b/app/models/ability.rb
index e21baef7eea93efa0694c98252d55ee8f7d30d97..0fe2a5e9bcf18ff55b9abbd5ef4d21813129c949 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -43,6 +43,7 @@ class Ability
     can :manage, University::Person::Involvement, person_id: @user.person&.id
     can :read, University::Person::Involvement, university_id: @user.university_id
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
     can :manage, Research::Journal
   end
 
@@ -57,7 +58,9 @@ class Ability
     can :read, Communication::Website, university_id: @user.university_id
     can :manage, Communication::Website::Post, university_id: @user.university_id
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
     can :create, Communication::Block
+    can :create, Communication::Block::Heading
     can :manage, Research::Journal
   end
 
@@ -75,8 +78,11 @@ class Ability
     can :create, Communication::Website::Menu::Item, university_id: @user.university_id
     can :manage, University::Organization, university_id: @user.university_id
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
     can :create, Communication::Block
+    can :create, Communication::Block::Heading
     can :manage, Research::Journal
   end
 
@@ -90,7 +96,9 @@ class Ability
     can :manage, University::Organization, university_id: @user.university_id
     can :manage, University::Organization::Category, university_id: @user.university_id
     can :manage, Communication::Block, university_id: @user.university_id
+    can :manage, Communication::Block::Heading, university_id: @user.university_id
     can :create, Communication::Block
+    can :create, Communication::Block::Heading
     can :read, Communication::Website, university_id: @user.university_id
     can :analytics, Communication::Website, university_id: @user.university_id
     can :manage, Communication::Website::Page, university_id: @user.university_id
diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb
index 7f4d9e282393d27b53756891308ad2c7518ba541..ed1cd6658bd8b56ea6754cdea1997025a078c4fe 100644
--- a/app/models/communication/block.rb
+++ b/app/models/communication/block.rb
@@ -12,16 +12,19 @@
 #  created_at    :datetime         not null
 #  updated_at    :datetime         not null
 #  about_id      :uuid             indexed => [about_type]
+#  heading_id    :uuid             indexed
 #  university_id :uuid             not null, indexed
 #
 # Indexes
 #
+#  index_communication_blocks_on_heading_id     (heading_id)
 #  index_communication_blocks_on_university_id  (university_id)
 #  index_communication_website_blocks_on_about  (about_type,about_id)
 #
 # Foreign Keys
 #
 #  fk_rails_18291ef65f  (university_id => universities.id)
+#  fk_rails_90ac986fab  (heading_id => communication_block_headings.id)
 #
 class Communication::Block < ApplicationRecord
   include Accessible
diff --git a/app/models/communication/block/heading.rb b/app/models/communication/block/heading.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b3ce66c1a7a7f61d3afab2d784afda6f0bc1879d
--- /dev/null
+++ b/app/models/communication/block/heading.rb
@@ -0,0 +1,45 @@
+# == Schema Information
+#
+# Table name: communication_block_headings
+#
+#  id            :uuid             not null, primary key
+#  about_type    :string           not null, indexed => [about_id]
+#  level         :integer          default(1)
+#  position      :integer
+#  slug          :string
+#  title         :string
+#  created_at    :datetime         not null
+#  updated_at    :datetime         not null
+#  about_id      :uuid             not null, indexed => [about_type]
+#  parent_id     :uuid             indexed
+#  university_id :uuid             not null, indexed
+#
+# Indexes
+#
+#  index_communication_block_headings_on_about          (about_type,about_id)
+#  index_communication_block_headings_on_parent_id      (parent_id)
+#  index_communication_block_headings_on_university_id  (university_id)
+#
+# Foreign Keys
+#
+#  fk_rails_6d3de8388e  (parent_id => communication_block_headings.id)
+#  fk_rails_ae82723550  (university_id => universities.id)
+#
+class Communication::Block::Heading < ApplicationRecord
+  belongs_to  :university
+  belongs_to  :about,
+              polymorphic: true
+  belongs_to  :parent, 
+              class_name: 'Communication::Block::Heading',
+              optional: true
+  has_many    :children,
+              class_name: 'Communication::Block::Heading',
+              foreign_key: :parent_id
+  
+  scope :root, -> { where(level: 1) }
+  default_scope { order(:position) }
+
+  def to_s
+    "#{title}"
+  end
+end
diff --git a/app/models/concerns/with_blocks.rb b/app/models/concerns/with_blocks.rb
index ccf1e024f8c47811b2990cf26529470406f5ca17..c7c71ce88b097819fab2d59404a1972450f4f830 100644
--- a/app/models/concerns/with_blocks.rb
+++ b/app/models/concerns/with_blocks.rb
@@ -3,6 +3,7 @@ module WithBlocks
 
   included do
     has_many :blocks, as: :about, class_name: 'Communication::Block', dependent: :destroy
+    has_many :headings, as: :about, class_name: 'Communication::Block::Heading', dependent: :destroy
   end
 
   def git_block_dependencies
diff --git a/app/models/university/with_communication.rb b/app/models/university/with_communication.rb
index 5dd2a35ba0a12770d34550ec521d462bc3d6bbfb..7506fb822e11cf59b1f9bba43c9ab3fbb348fef9 100644
--- a/app/models/university/with_communication.rb
+++ b/app/models/university/with_communication.rb
@@ -16,9 +16,12 @@ module University::WithCommunication
               class_name: 'Communication::Website::Post',
               dependent: :destroy
 
-    has_many  :communication_blocks,
+              has_many  :communication_blocks,
               class_name: 'Communication::Block',
               dependent: :destroy
     alias_attribute :blocks, :communication_blocks
+    has_many  :communication_block_headings,
+              class_name: 'Communication::Block::Heading',
+              dependent: :destroy
   end
 end
diff --git a/app/services/polymorphic.rb b/app/services/polymorphic.rb
new file mode 100644
index 0000000000000000000000000000000000000000..461b9fabd9c24800ca9557c8b400954e88f7cb85
--- /dev/null
+++ b/app/services/polymorphic.rb
@@ -0,0 +1,11 @@
+class Polymorphic
+  # Rails uses ActiveRecord::Inheritance#polymorphic_name to hydrate the about_type.
+  # Example: A Block for a Communication::Website::Page::Home will have about_type = "Communication::Website::Page"
+  def self.find(params, key)
+    key_id = "#{key}_id".to_sym
+    key_type = "#{key}_type".to_sym
+    klass = params[key_type].constantize
+    id = params[key_id]
+    klass.find id
+  end
+end
\ No newline at end of file
diff --git a/app/views/admin/communication/blocks/_list.html.erb b/app/views/admin/communication/blocks/_list.html.erb
index 482f2d6fd24d9ec2f26162be9714592c30ca3ffb..78a27993151e2393ae91ab5e912e457c519022eb 100644
--- a/app/views/admin/communication/blocks/_list.html.erb
+++ b/app/views/admin/communication/blocks/_list.html.erb
@@ -3,8 +3,16 @@ action = ''
 action += link_to t('admin.communication.blocks.add'),
                   new_admin_communication_block_path(about_id: about.id, about_type: about.class.name),
                   class: button_classes if can? :create, Communication::Block
+action += link_to t('admin.communication.blocks.headings.add'),
+                  new_admin_communication_heading_path(about_id: about.id, about_type: about.class.name),
+                  class: button_classes('ms-2') if can? :create, Communication::Block::Heading
 %>
 <%= osuny_panel Communication::Block.model_name.human(count: 2), action: action do %>
+  <% if about.headings.any? %>
+    <% about.headings.root.each do |heading| %>
+      <%= link_to heading, edit_admin_communication_heading_path(heading) %>
+    <% end %>
+  <% end %>
   <% if about.blocks.any? %>
     <div class="table-responsive">
       <table class="<%= table_classes %>">
diff --git a/app/views/admin/communication/blocks/headings/_form.html.erb b/app/views/admin/communication/blocks/headings/_form.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..34108a9817d51711da3651f514b8fdc27d74d762
--- /dev/null
+++ b/app/views/admin/communication/blocks/headings/_form.html.erb
@@ -0,0 +1,14 @@
+<%
+url = heading.persisted?  ? admin_communication_heading_path(heading)
+                          : admin_communication_headings_path
+%>
+<%= simple_form_for [:admin, heading], url: url do |f| %>
+  <%= f.error_notification %>
+  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
+  <%= f.input :title %>
+  <%= f.input :about_type, as: :hidden %>
+  <%= f.input :about_id, as: :hidden %>
+  <% content_for :action_bar_right do %>
+    <%= submit f %>
+  <% end %>
+<% end %>
diff --git a/app/views/admin/communication/blocks/headings/edit.html.erb b/app/views/admin/communication/blocks/headings/edit.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..fa54c115a75d21f60c197f12f00c0390f74ad936
--- /dev/null
+++ b/app/views/admin/communication/blocks/headings/edit.html.erb
@@ -0,0 +1,2 @@
+<% content_for :title, @heading %>
+<%= render 'form', heading: @heading %>
diff --git a/app/views/admin/communication/blocks/headings/new.html.erb b/app/views/admin/communication/blocks/headings/new.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..43b08afec5cb3b4d0fadc057436bc1260e4aa7f7
--- /dev/null
+++ b/app/views/admin/communication/blocks/headings/new.html.erb
@@ -0,0 +1,2 @@
+<% content_for :title, t('admin.communication.blocks.headings.add') %>
+<%= render 'form', heading: @heading %>
diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml
index 30696959a57ef9179226ec6aa01fea6ca1dd949b..36855bb24ac26295dbdf73898c3e6ebb0d3fb845 100644
--- a/config/locales/communication/en.yml
+++ b/config/locales/communication/en.yml
@@ -55,9 +55,11 @@ en:
         all: All posts
     attributes:
       communication/block:
-        name: Name
+        title: Title
         template: Kind of block
         published: Published?
+      communication/block/heading:
+        title: Title
       communication/extranet:
         about: About
         about_: Independent extranet
@@ -247,6 +249,8 @@ en:
           time_slot:
             from: From
             to: to
+        headings:
+          add: Add a title
         templates:
           call_to_action:
             description: A title, a text, an optional image and up to 3 call to action buttons.
diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml
index 046e1d967786f187d575b05658b60ee2d00a4035..02c715e7f02e004b249095a7cc84cb77be4946db 100644
--- a/config/locales/communication/fr.yml
+++ b/config/locales/communication/fr.yml
@@ -58,6 +58,8 @@ fr:
         title: Titre
         template: Type de bloc
         published: Publié ?
+      communication/block/heading:
+        title: Titre
       communication/extranet:
         about: Sujet de l'extranet
         about_: Extranet indépendant
@@ -247,6 +249,8 @@ fr:
           time_slot:
             from: De
             to: à
+        headings:
+          add: Ajouter un titre
         templates:
           call_to_action:
             description: Un titre, un texte, un visuel et 3 boutons pour inviter les personnes à agir.
diff --git a/config/routes/admin/communication.rb b/config/routes/admin/communication.rb
index c5ddb466f4dbc1e3564ebde5ed0fc659dced1a4e..869c89d9bef569e76a705dbb11c27a37d347301d 100644
--- a/config/routes/admin/communication.rb
+++ b/config/routes/admin/communication.rb
@@ -60,6 +60,7 @@ namespace :communication do
   end
   resources :blocks, controller: 'blocks', except: [:index] do
     collection do
+      resources :headings, controller: 'blocks/headings'
       post :reorder
     end
     member do
diff --git a/db/migrate/20230321082433_create_communication_block_headings.rb b/db/migrate/20230321082433_create_communication_block_headings.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e1f99f85d367629ce9aa945b08a521cc7c6c6439
--- /dev/null
+++ b/db/migrate/20230321082433_create_communication_block_headings.rb
@@ -0,0 +1,16 @@
+class CreateCommunicationBlockHeadings < ActiveRecord::Migration[7.0]
+  def change
+    create_table :communication_block_headings, id: :uuid do |t|
+      t.references :university, null: false, foreign_key: true, type: :uuid
+      t.references :about, polymorphic: true, null: false, type: :uuid
+      t.string :title
+      t.integer :level, default: 1
+      t.references :parent, null: true, foreign_key: {to_table: :communication_block_headings}, type: :uuid
+      t.integer :position
+      t.string :slug
+
+      t.timestamps
+    end
+    add_reference :communication_blocks, :heading, null: true, foreign_key: {to_table: :communication_block_headings}, type: :uuid
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 61b664759abad49dedad4660b95e5a347b4d5248..aac33c6b2b613e876a6597aa1c2c552a14a1bf30 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,13 +10,13 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
+ActiveRecord::Schema[7.0].define(version: 2023_03_21_082433) do
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
   enable_extension "plpgsql"
   enable_extension "unaccent"
 
-  create_table "action_text_rich_texts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "action_text_rich_texts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "name", null: false
     t.text "body"
     t.string "record_type", null: false
@@ -26,7 +26,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
   end
 
-  create_table "active_storage_attachments", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "active_storage_attachments", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "name", null: false
     t.string "record_type", null: false
     t.uuid "record_id", null: false
@@ -36,7 +36,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
   end
 
-  create_table "active_storage_blobs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "active_storage_blobs", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "key", null: false
     t.string "filename", null: false
     t.string "content_type"
@@ -50,13 +50,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_active_storage_blobs_on_university_id"
   end
 
-  create_table "active_storage_variant_records", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "active_storage_variant_records", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "blob_id", null: false
     t.string "variation_digest", null: false
     t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
   end
 
-  create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.integer "number"
     t.text "name"
     t.text "description"
@@ -64,7 +64,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.datetime "updated_at", null: false
   end
 
-  create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "criterion_id", null: false
     t.integer "number"
     t.text "name"
@@ -78,7 +78,23 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["criterion_id"], name: "index_administration_qualiopi_indicators_on_criterion_id"
   end
 
-  create_table "communication_blocks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_block_headings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.string "about_type", null: false
+    t.uuid "about_id", null: false
+    t.string "title"
+    t.integer "level", default: 1
+    t.uuid "parent_id"
+    t.integer "position"
+    t.string "slug"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["about_type", "about_id"], name: "index_communication_block_headings_on_about"
+    t.index ["parent_id"], name: "index_communication_block_headings_on_parent_id"
+    t.index ["university_id"], name: "index_communication_block_headings_on_university_id"
+  end
+
+  create_table "communication_blocks", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "about_type"
     t.uuid "about_id"
@@ -89,7 +105,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.datetime "updated_at", null: false
     t.string "title"
     t.boolean "published", default: true
+    t.uuid "heading_id"
     t.index ["about_type", "about_id"], name: "index_communication_website_blocks_on_about"
+    t.index ["heading_id"], name: "index_communication_blocks_on_heading_id"
     t.index ["university_id"], name: "index_communication_blocks_on_university_id"
   end
 
@@ -175,7 +193,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_communication_extranet_posts_on_university_id"
   end
 
-  create_table "communication_extranets", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_extranets", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.uuid "university_id", null: false
     t.string "host"
@@ -207,7 +225,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_communication_extranets_on_university_id"
   end
 
-  create_table "communication_website_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_categories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
     t.string "name"
@@ -241,7 +259,22 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["communication_website_post_id", "communication_website_category_id"], name: "post_category"
   end
 
-  create_table "communication_website_git_files", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_connections", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.uuid "website_id", null: false
+    t.string "object_type", null: false
+    t.uuid "object_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "source_type"
+    t.uuid "source_id"
+    t.index ["object_type", "object_id"], name: "index_communication_website_connections_on_object"
+    t.index ["source_type", "source_id"], name: "index_communication_website_connections_on_source"
+    t.index ["university_id"], name: "index_communication_website_connections_on_university_id"
+    t.index ["website_id"], name: "index_communication_website_connections_on_website_id"
+  end
+
+  create_table "communication_website_git_files", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "previous_path"
     t.string "about_type", null: false
     t.uuid "about_id", null: false
@@ -253,7 +286,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_git_files_on_website_id"
   end
 
-  create_table "communication_website_imported_authors", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_imported_authors", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.uuid "author_id"
@@ -269,7 +302,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "idx_communication_website_imported_auth_on_website"
   end
 
-  create_table "communication_website_imported_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_imported_categories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.uuid "category_id"
@@ -287,7 +320,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "idx_communication_website_imported_cat_on_website"
   end
 
-  create_table "communication_website_imported_media", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_imported_media", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "identifier"
     t.jsonb "data"
     t.text "file_url"
@@ -302,7 +335,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_imported_media_on_website_id"
   end
 
-  create_table "communication_website_imported_pages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_imported_pages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.uuid "page_id"
@@ -326,7 +359,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_imported_pages_on_website_id"
   end
 
-  create_table "communication_website_imported_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_imported_posts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.uuid "post_id"
@@ -351,7 +384,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_imported_posts_on_website_id"
   end
 
-  create_table "communication_website_imported_websites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_imported_websites", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.integer "status", default: 0
@@ -361,7 +394,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_imported_websites_on_website_id"
   end
 
-  create_table "communication_website_menu_items", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_menu_items", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.uuid "menu_id", null: false
@@ -381,7 +414,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_menu_items_on_website_id"
   end
 
-  create_table "communication_website_menus", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_menus", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
     t.string "title"
@@ -397,7 +430,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_communication_website_menus_on_university_id"
   end
 
-  create_table "communication_website_pages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_pages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
     t.string "title"
@@ -412,10 +445,10 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.text "github_path"
     t.string "featured_image_alt"
     t.text "text"
+    t.text "summary"
     t.string "breadcrumb_title"
     t.text "header_text"
     t.integer "kind"
-    t.text "summary"
     t.string "bodyclass"
     t.uuid "language_id", null: false
     t.text "featured_image_credit"
@@ -429,7 +462,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_communication_website_pages_on_university_id"
   end
 
-  create_table "communication_website_permalinks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_permalinks", id: :uuid, default: -> { "public.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
@@ -443,7 +476,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["website_id"], name: "index_communication_website_permalinks_on_website_id"
   end
 
-  create_table "communication_website_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_posts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
     t.string "title"
@@ -469,7 +502,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_communication_website_posts_on_university_id"
   end
 
-  create_table "communication_websites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_websites", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "url"
@@ -521,7 +554,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["priority", "run_at"], name: "delayed_jobs_priority"
   end
 
-  create_table "education_academic_years", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_academic_years", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.integer "year"
     t.datetime "created_at", null: false
@@ -536,7 +569,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_person_id", "education_academic_year_id"], name: "index_person_academic_year"
   end
 
-  create_table "education_cohorts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_cohorts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "program_id", null: false
     t.uuid "academic_year_id", null: false
@@ -557,7 +590,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_person_id", "education_cohort_id"], name: "index_person_cohort"
   end
 
-  create_table "education_diplomas", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_diplomas", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "short_name"
     t.integer "level", default: 0
@@ -571,7 +604,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_education_diplomas_on_university_id"
   end
 
-  create_table "education_programs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_programs", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.integer "capacity"
@@ -631,7 +664,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["education_program_id", "user_id"], name: "index_education_programs_users_on_program_id_and_user_id"
   end
 
-  create_table "education_schools", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_schools", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "address"
@@ -647,7 +680,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_education_schools_on_university_id"
   end
 
-  create_table "imports", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "imports", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.integer "number_of_lines"
     t.jsonb "processing_errors"
     t.integer "kind"
@@ -660,7 +693,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["user_id"], name: "index_imports_on_user_id"
   end
 
-  create_table "languages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "languages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "iso_code"
     t.datetime "created_at", null: false
@@ -727,7 +760,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_research_journal_paper_kinds_on_university_id"
   end
 
-  create_table "research_journal_papers", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_journal_papers", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "title"
     t.datetime "published_at", precision: nil
     t.uuid "university_id", null: false
@@ -763,7 +796,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["researcher_id"], name: "index_research_journal_papers_researchers_on_researcher_id"
   end
 
-  create_table "research_journal_volumes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_journal_volumes", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "research_journal_id", null: false
     t.string "title"
@@ -783,7 +816,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_research_journal_volumes_on_university_id"
   end
 
-  create_table "research_journals", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_journals", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "title"
     t.text "meta_description"
@@ -794,7 +827,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_research_journals_on_university_id"
   end
 
-  create_table "research_laboratories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_laboratories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "address"
@@ -806,7 +839,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_research_laboratories_on_university_id"
   end
 
-  create_table "research_laboratory_axes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_laboratory_axes", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "research_laboratory_id", null: false
     t.string "name"
@@ -820,7 +853,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_research_laboratory_axes_on_university_id"
   end
 
-  create_table "research_theses", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_theses", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "research_laboratory_id", null: false
     t.uuid "author_id", null: false
@@ -838,7 +871,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_research_theses_on_university_id"
   end
 
-  create_table "universities", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "universities", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "identifier"
     t.string "address"
@@ -877,7 +910,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_university_organization_categories_on_university_id"
   end
 
-  create_table "university_organizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_organizations", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "long_name"
@@ -915,7 +948,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["organization_id"], name: "index_university_organizations_categories_on_organization_id"
   end
 
-  create_table "university_people", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_people", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "user_id"
     t.string "last_name"
@@ -971,7 +1004,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_university_person_categories_on_university_id"
   end
 
-  create_table "university_person_experiences", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_person_experiences", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "person_id", null: false
     t.uuid "organization_id", null: false
@@ -985,7 +1018,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_university_person_experiences_on_university_id"
   end
 
-  create_table "university_person_involvements", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_person_involvements", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "person_id", null: false
     t.integer "kind"
@@ -1000,7 +1033,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_university_person_involvements_on_university_id"
   end
 
-  create_table "university_roles", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_roles", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "target_type"
     t.uuid "target_id"
@@ -1012,7 +1045,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.index ["university_id"], name: "index_university_roles_on_university_id"
   end
 
-  create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "users", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "first_name"
     t.string "last_name"
@@ -1061,6 +1094,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
   add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
   add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
   add_foreign_key "administration_qualiopi_indicators", "administration_qualiopi_criterions", column: "criterion_id"
+  add_foreign_key "communication_block_headings", "communication_block_headings", column: "parent_id"
+  add_foreign_key "communication_block_headings", "universities"
+  add_foreign_key "communication_blocks", "communication_block_headings", column: "heading_id"
   add_foreign_key "communication_blocks", "universities"
   add_foreign_key "communication_extranet_connections", "communication_extranets", column: "extranet_id"
   add_foreign_key "communication_extranet_connections", "universities"
@@ -1085,6 +1121,8 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
   add_foreign_key "communication_website_categories", "education_programs", column: "program_id"
   add_foreign_key "communication_website_categories", "languages"
   add_foreign_key "communication_website_categories", "universities"
+  add_foreign_key "communication_website_connections", "communication_websites", column: "website_id"
+  add_foreign_key "communication_website_connections", "universities"
   add_foreign_key "communication_website_git_files", "communication_websites", column: "website_id"
   add_foreign_key "communication_website_imported_authors", "communication_website_imported_websites", column: "website_id"
   add_foreign_key "communication_website_imported_authors", "universities"