diff --git a/Gemfile b/Gemfile
index c28ecb2d6d2ddb82c8cbd78e90e2c59f24607352..a1eae116bce4500a9144a9e65503c69cb76cdff1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -23,10 +23,10 @@ gem "delayed_job_web"
 gem "devise"
 gem "devise-i18n"
 gem "enum_help"
-gem "faceted_search"#, path: "../../noesya/faceted_search"
+# gem "faceted_search"#, path: "../../noesya/faceted_search"
+gem "faceted_search"
 gem "font-awesome-sass"
 gem "front_matter_parser"
-gem "gdpr", "~> 1.2.5"
 gem "geocoder", "~> 1.8"
 gem "geo_point"
 gem "gitlab"
diff --git a/Gemfile.lock b/Gemfile.lock
index 10a3a71f782a71c32c4a4705020b5f6f6c7a6408..a93bf9338577c783ee930fcacd32ed6240440ff5 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -93,7 +93,7 @@ GEM
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
       tzinfo (~> 2.0)
-    addressable (2.8.1)
+    addressable (2.8.3)
       public_suffix (>= 2.0.2, < 6.0)
     angularjs-rails (1.8.0)
     annotate (3.2.0)
@@ -102,8 +102,8 @@ GEM
     autoprefixer-rails (10.4.13.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.726.0)
-    aws-sdk-core (3.170.0)
+    aws-partitions (1.742.0)
+    aws-sdk-core (3.171.0)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.5)
@@ -111,7 +111,7 @@ GEM
     aws-sdk-kms (1.63.0)
       aws-sdk-core (~> 3, >= 3.165.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.119.1)
+    aws-sdk-s3 (1.120.1)
       aws-sdk-core (~> 3, >= 3.165.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.4)
@@ -135,7 +135,7 @@ GEM
     builder (3.2.4)
     byebug (11.1.3)
     cancancan (3.3.0)
-    capybara (3.38.0)
+    capybara (3.39.0)
       addressable
       matrix
       mini_mime (>= 0.1.3)
@@ -154,7 +154,7 @@ GEM
       caxlsx (>= 3.0)
     cocoon (1.2.15)
     concurrent-ruby (1.2.2)
-    countries (5.3.1)
+    countries (5.3.2)
       unaccent (~> 0.3)
     country_select (8.0.1)
       countries (~> 5.0)
@@ -176,7 +176,7 @@ GEM
       delayed_job (> 2.0.3)
       rack-protection (>= 1.5.5)
       sinatra (>= 1.4.4)
-    devise (4.9.0)
+    devise (4.9.2)
       bcrypt (~> 3.0)
       orm_adapter (~> 0.1)
       railties (>= 4.1.0)
@@ -194,7 +194,7 @@ GEM
     ethon (0.16.0)
       ffi (>= 1.15.0)
     execjs (2.8.1)
-    faceted_search (3.6.1)
+    faceted_search (3.6.2)
       font-awesome-sass
       rails (>= 5.2.0)
     faraday (2.7.4)
@@ -221,13 +221,9 @@ GEM
     ffi (1.15.5)
     figaro (1.2.0)
       thor (>= 0.14.0, < 2)
-    font-awesome-sass (6.3.0)
+    font-awesome-sass (6.4.0)
       sassc (~> 2.0)
     front_matter_parser (1.0.1)
-    gdpr (1.2.5)
-      js_cookie_rails
-      rails
-      sassc-rails
     geo_calc (0.7.8)
       activesupport (>= 3.0.1)
       geo_units (~> 0.3.2)
@@ -279,8 +275,6 @@ GEM
       thor (>= 0.14, < 2.0)
     jquery-ui-rails (6.0.1)
       railties (>= 3.2.16)
-    js_cookie_rails (2.2.0)
-      railties (>= 3.1)
     json (2.6.3)
     jwt (2.7.0)
     kamifusen (1.11.2)
@@ -303,7 +297,7 @@ GEM
     listen (3.8.0)
       rb-fsevent (~> 0.10, >= 0.10.3)
       rb-inotify (~> 0.9, >= 0.9.10)
-    loofah (2.19.1)
+    loofah (2.20.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.5.9)
     mail (2.8.1)
@@ -329,7 +323,7 @@ GEM
     mini_magick (4.12.0)
     mini_mime (1.1.2)
     minitest (5.18.0)
-    msgpack (1.6.1)
+    msgpack (1.7.0)
     multi_xml (0.6.0)
     multipart-post (2.3.0)
     mustermann (3.0.0)
@@ -346,7 +340,7 @@ GEM
       timeout
     net-smtp (0.3.3)
       net-protocol
-    nio4r (2.5.8)
+    nio4r (2.5.9)
     nokogiri (1.14.2-arm64-darwin)
       racc (~> 1.4)
     nokogiri (1.14.2-x86_64-darwin)
@@ -383,7 +377,7 @@ GEM
     pg (1.4.6)
     popper_js (2.11.6)
     public_suffix (5.0.1)
-    puma (6.1.1)
+    puma (6.2.1)
       nio4r (~> 2.0)
     racc (1.6.2)
     rack (2.2.6.4)
@@ -391,7 +385,7 @@ GEM
       rack (>= 1.2.0)
     rack-protection (3.0.5)
       rack
-    rack-test (2.0.2)
+    rack-test (2.1.0)
       rack (>= 1.3)
     rails (7.0.4.3)
       actioncable (= 7.0.4.3)
@@ -461,7 +455,7 @@ GEM
     sawyer (0.9.2)
       addressable (>= 2.3.5)
       faraday (>= 0.17.3, < 3)
-    selenium-webdriver (4.8.1)
+    selenium-webdriver (4.8.6)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)
       websocket (~> 1.0)
@@ -511,7 +505,7 @@ GEM
       unicode-display_width (>= 1.1.1, < 3)
     thor (1.2.1)
     tilt (2.1.0)
-    time (0.2.1)
+    time (0.2.2)
       date
     timeout (0.3.2)
     typhoeus (1.4.0)
@@ -527,9 +521,9 @@ GEM
       faraday-multipart (~> 1.0.4)
       httparty (~> 0.20)
       oauth2 (>= 2.0.8)
-    uri (0.12.0)
+    uri (0.12.1)
     vcr (6.1.0)
-    version_gem (1.1.1)
+    version_gem (1.1.2)
     warden (1.2.9)
       rack (>= 2.0.9)
     web-console (4.2.0)
@@ -588,7 +582,6 @@ DEPENDENCIES
   figaro
   font-awesome-sass
   front_matter_parser
-  gdpr (~> 1.2.5)
   geo_point
   geocoder (~> 1.8)
   gitlab
diff --git a/app/assets/javascripts/admin/appstack.js b/app/assets/javascripts/admin/appstack.js
index 288469caaf16052c44adc410d92efad1a25c718e..b31c6e41d67e537bdcd274d4908f55cedcd19f17 100644
--- a/app/assets/javascripts/admin/appstack.js
+++ b/app/assets/javascripts/admin/appstack.js
@@ -7,7 +7,6 @@
 //= require cropperjs/dist/cropper
 //= require jquery-cropper/dist/jquery-cropper
 //= require appstack/app
-//= require gdpr/cookie_consent
 //= require sortablejs/Sortable
 //= require summernote/summernote-bs5
 //= require slug/slug
diff --git a/app/assets/javascripts/admin/plugins/codemirror.js b/app/assets/javascripts/admin/plugins/codemirror.js
index 553e9afd748b24c9bf3dee73f9bd49c39d0b5d11..d5c5157e220cb3de930bef7fa961de2e3e9e65f8 100644
--- a/app/assets/javascripts/admin/plugins/codemirror.js
+++ b/app/assets/javascripts/admin/plugins/codemirror.js
@@ -22,27 +22,34 @@ window.codemirrorManager = {
 
     createInstance: function (textarea) {
         'use strict';
-        var mode = textarea.getAttribute('data-codemirror-mode'),
+        var config = this.defaultConfig(),
+            mode = textarea.getAttribute('data-codemirror-mode'),
             indentationLevel = window.parseInt(textarea.getAttribute('data-codemirror-indentation'));
 
         if (isNaN(indentationLevel)) {
             indentationLevel = 2;
         }
+        config['mode'] = mode;
+        config['indentUnit'] = indentationLevel;
+        return CodeMirror.fromTextArea(textarea, config);
+    },
 
-        return CodeMirror.fromTextArea(textarea, {
+    defaultConfig: function () {
+        return {
             lineNumbers: true,
             matchBrackets: true,
             styleActiveLine: true,
-            indentUnit: indentationLevel,
-            viewportMargin: Infinity,
-            mode: mode
-        });
+            indentUnit: 2,
+            lineWrapping: true,
+            viewportMargin: Infinity
+        }
     },
 
     invoke: function () {
         'use strict';
         return {
-            init: this.init.bind(this)
+            init: this.init.bind(this),
+            defaultConfig: this.defaultConfig.bind(this)
         };
     }
 }.invoke();
diff --git a/app/assets/javascripts/admin/plugins/sortable.js b/app/assets/javascripts/admin/plugins/sortable.js
index ab073755a18f930db9ac6dc3c088b4a04ee10e64..13bd1be56b1f5ae2ba3ed5a47071bbac52906319 100644
--- a/app/assets/javascripts/admin/plugins/sortable.js
+++ b/app/assets/javascripts/admin/plugins/sortable.js
@@ -28,6 +28,7 @@ window.sortableManager = {
             animation: 150,
             fallbackOnBody: true,
             swapThreshold: 0.65,
+            forceFallback: true,
             onEnd: sortableType === 'inputs' ? this.updateViaInputs : this.updateViaXhr
         });
     },
diff --git a/app/assets/javascripts/admin/pure.js b/app/assets/javascripts/admin/pure.js
index 94017fb5f5845850521b0e158949325b6794e6f7..7446ed6e6b6deb58b3f342be5815f0c0e4422390 100644
--- a/app/assets/javascripts/admin/pure.js
+++ b/app/assets/javascripts/admin/pure.js
@@ -8,7 +8,6 @@
 //= require jquery-cropper/dist/jquery-cropper
 // TODO remove appstack js
 //= require appstack/app
-//= require gdpr/cookie_consent
 //= require sortablejs/Sortable
 //= require summernote/summernote-bs5
 //= require slug/slug
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 19545a0bccd3fa9908e5b35280ed224190b74b3e..e8a0f2e802bc126febf0934d16a09fd55818ac04 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -8,7 +8,6 @@
 //= require simple_form_password_with_hints
 //= require simple_form_bs5_file_input
 //= require summernote/summernote-bs5
-//= require gdpr/cookie_consent
 //= require autocomplete-rails
 //= require_tree ./application/plugins
 //= require_self
diff --git a/app/assets/javascripts/devise.js b/app/assets/javascripts/devise.js
index 26efc2d665f4a7e902f56e9075c6baec61b83df2..87f4ad18ee3ead168bb2e72b76cfb736557c7246 100644
--- a/app/assets/javascripts/devise.js
+++ b/app/assets/javascripts/devise.js
@@ -8,7 +8,6 @@
 //= require simple_form_bs5_file_input
 //= require cropperjs/dist/cropper
 //= require jquery-cropper/dist/jquery-cropper
-//= require gdpr/cookie_consent
 //= require_self
 //= require_tree ./admin/plugins
 
diff --git a/app/assets/javascripts/extranet.js b/app/assets/javascripts/extranet.js
index acfd1811ba7440b3a839c8868adee361bf550d1c..f82a3bacb14d7873d0bef0c38bd5f1f2832cafc4 100644
--- a/app/assets/javascripts/extranet.js
+++ b/app/assets/javascripts/extranet.js
@@ -10,7 +10,6 @@
 //= require simple_form_password_with_hints
 //= require simple_form_bs5_file_input
 //= require summernote/summernote-bs5
-//= require gdpr/cookie_consent
 //= require autocomplete-rails
 //= require_tree ./application/plugins
 //= require_tree ./extranet
diff --git a/app/assets/stylesheets/admin/appstack.sass b/app/assets/stylesheets/admin/appstack.sass
index 3413526ba440914d25ccfa8aea3f2e44d45ddf3e..d2a849435d0051d3cd1b00934fd699d71e0f826d 100644
--- a/app/assets/stylesheets/admin/appstack.sass
+++ b/app/assets/stylesheets/admin/appstack.sass
@@ -6,7 +6,6 @@
 @import 'simple_form_bs5_file_input'
 @import 'summernote-bs5'
 @import 'cropperjs/dist/cropper'
-@import 'gdpr/cookie_consent'
 @import 'codemirror/lib/codemirror'
 @import '../commons/*'
 @import 'commons/*'
diff --git a/app/assets/stylesheets/admin/pure.sass b/app/assets/stylesheets/admin/pure.sass
index 3a2248c6d08bd76b573ece1fce347666a5d0c63a..b3638de514982db5fb02d87543400830c493721b 100644
--- a/app/assets/stylesheets/admin/pure.sass
+++ b/app/assets/stylesheets/admin/pure.sass
@@ -1,6 +1,7 @@
 @import 'pure/utils'
 @import 'pure/fonts'
 @import 'pure/variables'
+@import 'pure/grid'
 @import 'bootstrap'
 @import 'bootstrap-icons/font/bootstrap-icons'
 @import 'font-awesome'
@@ -9,7 +10,6 @@
 @import 'simple_form_bs5_file_input'
 @import 'summernote-bs5'
 @import 'cropperjs/dist/cropper'
-@import 'gdpr/cookie_consent'
 @import 'codemirror/lib/codemirror'
 @import '../commons/*'
 @import 'commons/*'
diff --git a/app/assets/stylesheets/admin/pure/grid.sass b/app/assets/stylesheets/admin/pure/grid.sass
new file mode 100644
index 0000000000000000000000000000000000000000..ffdb47b85b9d4a40d07889a70e80e9d6f0ad4053
--- /dev/null
+++ b/app/assets/stylesheets/admin/pure/grid.sass
@@ -0,0 +1,4 @@
+*
+    --bs-gutter-x: 64px !important
+    @media (max-width: 768px)
+        --bs-gutter-x: 32px !important
diff --git a/app/assets/stylesheets/admin/pure/variables.sass b/app/assets/stylesheets/admin/pure/variables.sass
index bcd959e9ea98b566114aeabdef909d7929e94cca..1e3305457cad1f4d0d149afba451c0a6c4c7e375 100644
--- a/app/assets/stylesheets/admin/pure/variables.sass
+++ b/app/assets/stylesheets/admin/pure/variables.sass
@@ -26,8 +26,6 @@ $color-background-alt: #F5F5F5
 
 $font-family-sans-serif: "Basier Square", sans-serif
 
-$grid-gutter-width: 64px
-
 $border-radius: 2px
 $border-radius-sm: $border-radius
 $border-radius-lg: $border-radius
diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass
index cbdad2dd5161fd3e130203aabb7e325e41f39451..407658cd3780ab5ca9bb1ff60e3db4f77441fd70 100644
--- a/app/assets/stylesheets/application.sass
+++ b/app/assets/stylesheets/application.sass
@@ -3,7 +3,6 @@
 @import 'simple_form_password_with_hints'
 @import 'simple_form_bs5_file_input'
 @import 'cropperjs/dist/cropper'
-@import 'gdpr/cookie_consent'
 @import 'faceted_search'
 @import 'commons/*'
 @import 'application/*'
diff --git a/app/assets/stylesheets/extranet.sass b/app/assets/stylesheets/extranet.sass
index 7beab43bb867d71afd0fe6afdbf4e304fc0976d3..de4182540a5c480f4ce792507521b2e02d6ebb41 100644
--- a/app/assets/stylesheets/extranet.sass
+++ b/app/assets/stylesheets/extranet.sass
@@ -6,7 +6,6 @@
 @import 'simple_form_password_with_hints'
 @import 'simple_form_bs5_file_input'
 @import 'summernote-bs5'
-@import 'gdpr/cookie_consent'
 @import 'cropperjs/dist/cropper'
 @import 'commons/summernote'
 @import 'commons/bootstrap-icons'
diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb
index c61a843e58791e9a9ef8d7a41d369eb5a5ead517..44877c2ca6c1bad74748e8d284e6308881751e23 100644
--- a/app/controllers/admin/application_controller.rb
+++ b/app/controllers/admin/application_controller.rb
@@ -1,7 +1,6 @@
 class Admin::ApplicationController < ApplicationController
   layout 'admin/layouts/application'
 
-  include WithFeatures
   include Admin::Filterable
 
   def set_theme
diff --git a/app/controllers/admin/communication/websites_controller.rb b/app/controllers/admin/communication/websites_controller.rb
index d83628439f6b2d87ab09005347ef20cd8f185d65..5cb335ea0cc3ab1eba7974c7b9048584868525c6 100644
--- a/app/controllers/admin/communication/websites_controller.rb
+++ b/app/controllers/admin/communication/websites_controller.rb
@@ -5,7 +5,6 @@ class Admin::Communication::WebsitesController < Admin::Communication::Websites:
   def index
     @websites = apply_scopes(@websites).ordered.page(params[:page])
     breadcrumb
-    add_breadcrumb Communication::Website.model_name.human(count: 2), admin_communication_websites_path
   end
 
   def show
diff --git a/app/controllers/admin/research/journals/papers_controller.rb b/app/controllers/admin/research/journals/papers_controller.rb
index 614f191a858dbb39778c5727dbb35a83ea1c4a78..4aa72926b27d94e6a251cfe42df09d4f3ffffc15 100644
--- a/app/controllers/admin/research/journals/papers_controller.rb
+++ b/app/controllers/admin/research/journals/papers_controller.rb
@@ -62,6 +62,11 @@ class Admin::Research::Journals::PapersController < Admin::Research::Journals::A
 
   private
 
+  # For Admin::Reorderable
+  def model
+    Research::Journal::Paper
+  end
+
   def breadcrumb
     super
     add_breadcrumb Research::Journal::Paper.model_name.human(count: 2), admin_research_journal_papers_path
@@ -72,7 +77,7 @@ class Admin::Research::Journals::PapersController < Admin::Research::Journals::A
     params.require(:research_journal_paper)
           .permit(
             :title, :slug, :text, :published, :published_at, :received_at, :accepted_at,
-            :summary, :abstract, :meta_description, :doi,
+            :summary, :abstract, :meta_description, :doi, :authors_list,
             :pdf, :references, :keywords, :research_journal_volume_id, :kind_id, person_ids: [])
           .merge(university_id: current_university.id)
   end
diff --git a/app/controllers/admin/research/laboratories/application_controller.rb b/app/controllers/admin/research/laboratories/application_controller.rb
index 343066b58ef9d47431ee5b74d56f9ceadc4e72fc..aa0479df79491d827528b39509d796fa34973553 100644
--- a/app/controllers/admin/research/laboratories/application_controller.rb
+++ b/app/controllers/admin/research/laboratories/application_controller.rb
@@ -6,6 +6,12 @@ class Admin::Research::Laboratories::ApplicationController < Admin::Research::Ap
 
   protected
 
+  def breadcrumb
+    super
+    add_breadcrumb Research::Laboratory.model_name.human(count: 2), admin_research_laboratories_path
+    add_breadcrumb @laboratory, [:admin, @laboratory]
+  end
+
   def default_url_options
     return {} unless params.has_key? :laboratory_id
     {
diff --git a/app/controllers/admin/research/laboratories_controller.rb b/app/controllers/admin/research/laboratories_controller.rb
index 67621fc6420f7fd87216cd0a495d96df3c19f599..596d5ffee012358992dfa2558b2c3a8757645871 100644
--- a/app/controllers/admin/research/laboratories_controller.rb
+++ b/app/controllers/admin/research/laboratories_controller.rb
@@ -8,7 +8,6 @@ class Admin::Research::LaboratoriesController < Admin::Research::ApplicationCont
   def index
     @laboratories = apply_scopes(@laboratories).ordered.page(params[:page])
     breadcrumb
-    add_breadcrumb Research::Laboratory.model_name.human(count: 2), admin_research_laboratories_path
   end
 
   def show
@@ -51,6 +50,12 @@ class Admin::Research::LaboratoriesController < Admin::Research::ApplicationCont
 
   protected
 
+  def breadcrumb
+    super
+    add_breadcrumb Research::Laboratory.model_name.human(count: 2), admin_research_laboratories_path
+    breadcrumb_for @laboratory
+  end
+
   def laboratory_params
     params.require(:research_laboratory)
           .permit(:name, :address, :zipcode, :city, :country)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 2cafc0d28ff964e5ff23c672f4c9e60071a444c1..9a81171e5b9f3674e0d413d62d52893cb5cd4304 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,7 +1,8 @@
 class ApplicationController < ActionController::Base
+  include WithDomain
   include WithErrors
+  include WithFeatures
   include WithLocale
-  include WithDomain
 
   before_action :ensure_university, :authenticate_user!
 
diff --git a/app/controllers/admin/application_controller/with_features.rb b/app/controllers/application_controller/with_features.rb
similarity index 94%
rename from app/controllers/admin/application_controller/with_features.rb
rename to app/controllers/application_controller/with_features.rb
index 8ba479e4723be421901213aa23d6901b86fbf5bd..76993e34ad0e6549bfd1b77eb2673d3ebfee4ac6 100644
--- a/app/controllers/admin/application_controller/with_features.rb
+++ b/app/controllers/application_controller/with_features.rb
@@ -1,4 +1,4 @@
-module Admin::ApplicationController::WithFeatures
+module ApplicationController::WithFeatures
   extend ActiveSupport::Concern
 
   included do
diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb
index a18cea80675c5043b2ab837d9314e0c19aeb753c..e1af31ce1eea741ddf330d6fa08343fce50337eb 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/extranet/document/category.rb b/app/models/communication/extranet/document/category.rb
index 91f8d0214a7c43a1855d10d939a118d9cb68f77a..5c56538726df9c72493be52bf0cd553a20264d54 100644
--- a/app/models/communication/extranet/document/category.rb
+++ b/app/models/communication/extranet/document/category.rb
@@ -26,7 +26,8 @@ class Communication::Extranet::Document::Category < ApplicationRecord
 
   belongs_to :extranet, class_name: 'Communication::Extranet'
 
-  has_many :documents
+  has_many :communication_extranet_documents, class_name: "Communication::Extranet::Document"
+  alias_attribute :documents, :communication_extranet_documents
 
   validates :name, presence: true
 
diff --git a/app/models/communication/extranet/document/kind.rb b/app/models/communication/extranet/document/kind.rb
index 7f3afa35591e32ab62a3f2e4c046eac1e3a8aa71..c5fa1d03b3245e90d062ee407d2c7add322790aa 100644
--- a/app/models/communication/extranet/document/kind.rb
+++ b/app/models/communication/extranet/document/kind.rb
@@ -26,7 +26,8 @@ class Communication::Extranet::Document::Kind < ApplicationRecord
 
   belongs_to :extranet, class_name: 'Communication::Extranet'
 
-  has_many :documents
+  has_many :communication_extranet_documents, class_name: "Communication::Extranet::Document"
+  alias_attribute :documents, :communication_extranet_documents
 
   validates :name, presence: true
 
diff --git a/app/models/research/journal/paper.rb b/app/models/research/journal/paper.rb
index 94aa3ad37a2ec379a4c5dad0b98511577eeea2ed..8de2e27f965e3562a2eafcf7dd32ad2adc367122 100644
--- a/app/models/research/journal/paper.rb
+++ b/app/models/research/journal/paper.rb
@@ -5,6 +5,7 @@
 #  id                         :uuid             not null, primary key
 #  abstract                   :text
 #  accepted_at                :date
+#  authors_list               :text
 #  doi                        :string
 #  keywords                   :text
 #  meta_description           :text
@@ -68,7 +69,7 @@ class Research::Journal::Paper < ApplicationRecord
 
   validates :title, presence: true
 
-  scope :ordered, -> { order(published_at: :desc, created_at: :desc) }
+  scope :ordered, -> { order(:position, published_at: :desc, created_at: :desc) }
 
   def for_website?(website)
     journal == website.about
diff --git a/app/services/osuny/simple_navigation_renderer.rb b/app/services/osuny/simple_navigation_renderer.rb
index b6857b68e21279677696b68b500714ad00d18d76..b1dcd9275ac3f0fdfcef8fad3ed1c1a3092b0e34 100644
--- a/app/services/osuny/simple_navigation_renderer.rb
+++ b/app/services/osuny/simple_navigation_renderer.rb
@@ -1,5 +1,5 @@
 class Osuny::SimpleNavigationRenderer < SimpleNavigation::Renderer::Base
-  OPEN = "<div class=\"col-md-4 col-lg-3 mb-5\">"
+  OPEN = "<div class=\"col-sm-6 col-md-4 col-lg-3 mb-5\">"
   CLOSE = "</div>"
 
   attr_accessor :content, :index, :item
diff --git a/app/views/admin/communication/blocks/edit.html.erb b/app/views/admin/communication/blocks/edit.html.erb
index ef3bdd551b48abed3a1b9777a873eb1824610619..e0f924d33a0146637d75a04189a3613cacc8876f 100644
--- a/app/views/admin/communication/blocks/edit.html.erb
+++ b/app/views/admin/communication/blocks/edit.html.erb
@@ -121,6 +121,7 @@
           toolbar: window.SUMMERNOTE_CONFIGS[config].toolbar, // Dependent of app/assets/javascripts/admin/plugins/summernote.js
           followingToolbar: true,
           disableDragAndDrop: true,
+          codemirror: window.codemirrorManager.defaultConfig(),
           callbacks: {
             onChange: function(contents, $editable) {
               element.value = contents;
@@ -130,13 +131,11 @@
         });
       },
       initCodemirror(element) {
-        var editor = CodeMirror.fromTextArea(element, {
-            lineNumbers: true,
-            styleActiveLine: true,
-            indentUnit: 2,
-            viewportMargin: Infinity,
-            mode: element.getAttribute('data-codemirror-mode')
-        });
+        var config = window.codemirrorManager.defaultConfig(),
+            mode = element.getAttribute('data-codemirror-mode'),
+            editor;
+        config['mode'] = mode;
+        editor = CodeMirror.fromTextArea(element, config);
         editor.on("change", function (instance, changeObj) {
           element.value = instance.getValue();
           element.dispatchEvent(new Event('input'));
diff --git a/app/views/admin/dashboard/index.html.erb b/app/views/admin/dashboard/index.html.erb
index 55aa138b2dcff0bdfdde3b336e4935d16527d6e0..80eba40611e439bd71505158b1944202b9adc468 100644
--- a/app/views/admin/dashboard/index.html.erb
+++ b/app/views/admin/dashboard/index.html.erb
@@ -101,7 +101,9 @@
 <% if current_admin_theme == 'pure' %>
   <div class="row mt-5 pt-5">
     <div class="col-lg-2">
-      <%= image_tag "admin/university.jpg", class: 'img-fluid'%>
+      <%= link_to admin_university_root_path do %>
+        <%= image_tag "admin/university.jpg", class: 'img-fluid'%>
+      <% end %>
     </div>
     <div class="col-lg-4">
       <%= osuny_panel University.model_name.human do %>
@@ -141,9 +143,6 @@
           <%= link_to t("#{term}"), t("#{term}_url"), target: '_blank', rel: 'noreferrer' %>
         </li>
       <% end %>
-      <li class="list-inline-item">
-        <%= link_to t('cookies_consent_choice'), '', class: 'js-gdpr__cookie_consent__display_again' %>
-      </li>
     </ul>
   </div>
 <% end %>
diff --git a/app/views/admin/dashboard/namespace.html.erb b/app/views/admin/dashboard/namespace.html.erb
index 9521b0e0988dab33369764028a44af76a8c76faa..d3667f4a08fa35aaf2b8b29dba39679e8623cc02 100644
--- a/app/views/admin/dashboard/namespace.html.erb
+++ b/app/views/admin/dashboard/namespace.html.erb
@@ -12,10 +12,12 @@
         class_name = part.first
         path = send part.last
         title = class_name.model_name.human(count: 2)
-        description = class_name.human_attribute_name('description')
-        # TODO
-        description = t 'administration.qualiopi.description' if class_name == Administration::Qualiopi
-        description = t 'activerecord.attributes.research/hal.description' if class_name == Research::Hal
+        # Exemples:
+        # administration.description.parts.qualiopi
+        # research.description.parts.researcher
+        # research.hal.description.parts.publication
+        key = "#{@namespace.to_s.underscore.gsub('/', '.')}.description.parts.#{class_name.to_s.demodulize.downcase}"
+        description = t "#{key}.description"
         %>
         <div class="col-lg-6 mt-5">
           <%= osuny_panel title do %>
@@ -30,8 +32,8 @@
     <div class="offset-lg-1 col-lg-4">
       <%= image_tag "admin/#{@namespace.to_s.underscore}.jpg", class: 'img-fluid pure__chapter__image'%>
       <p class="small text-lg-end mt-3">
-        Illustration de Virginia Frances Sterrett. 
-        Source : University of California Libraries, the Internet Archive.
+        Illustration de Virginia Frances Sterrett<br>
+        Source : University of California Libraries, the Internet Archive
       </p>
     </div>
   <% end %>
diff --git a/app/views/admin/layouts/themes/_appstack.html.erb b/app/views/admin/layouts/themes/_appstack.html.erb
index 331f7b38364abd8c6d9a9b7a46c14fb087a0b5b0..96264a0a66990ef247ed2d5b1fc2a8604521e200 100644
--- a/app/views/admin/layouts/themes/_appstack.html.erb
+++ b/app/views/admin/layouts/themes/_appstack.html.erb
@@ -27,7 +27,6 @@
     </div>
   </div>
   <%= javascript_include_tag 'admin/appstack' %>
-  <%= render 'gdpr/cookie_consent' %>
   <%= render 'bugsnag' %>
   <%= render 'summernote_localization' %>
 </body>
diff --git a/app/views/admin/layouts/themes/_pure.html.erb b/app/views/admin/layouts/themes/_pure.html.erb
index 965029888465752746d75e9336121af843a8d2e2..b6e54cbba664e91fd9a116ee58858d6cf35de1f0 100644
--- a/app/views/admin/layouts/themes/_pure.html.erb
+++ b/app/views/admin/layouts/themes/_pure.html.erb
@@ -20,7 +20,6 @@
   <%= render "admin/layouts/themes/pure/commands" %>
   <%= render "admin/layouts/themes/pure/footer" %>
   <%= javascript_include_tag 'admin/pure' %>
-  <%= render 'gdpr/cookie_consent' %>
   <%= render 'bugsnag' %>
   <%= render 'summernote_localization' %>
 </body>
diff --git a/app/views/admin/layouts/themes/pure/_nav.html.erb b/app/views/admin/layouts/themes/pure/_nav.html.erb
index 4e18def30d29207c87a930a3a8bddd84ffb88eac..5c34176bea861792e4764b0e404761586af15e82 100644
--- a/app/views/admin/layouts/themes/pure/_nav.html.erb
+++ b/app/views/admin/layouts/themes/pure/_nav.html.erb
@@ -42,7 +42,7 @@ context ||= :admin
     <div class="container-fluid">
       <div class="row">
         <%= render_navigation context: context, renderer: Osuny::SimpleNavigationRenderer %>
-        <div class="col-md-4 col-lg-3">
+        <div class="col-sm-6 col-md-4 col-lg-3">
           <% 
           if current_user.picture.attached? && current_user.picture.variable? 
             image = current_user.picture.variant(resize: '200x200')
diff --git a/app/views/admin/research/journals/papers/_form.html.erb b/app/views/admin/research/journals/papers/_form.html.erb
index 38964171148e7cbc473ad05352b31aa7181b5942..b3cd705d9edf20280240a5f00234c8fbfef3cd9c 100644
--- a/app/views/admin/research/journals/papers/_form.html.erb
+++ b/app/views/admin/research/journals/papers/_form.html.erb
@@ -6,6 +6,7 @@
     <div class="col-md-8">
       <%= osuny_panel t('content') do %>
         <%= f.input :title, as: :text, input_html: { rows: 3 } %>
+        <%= f.input :summary %>
         <%= f.input :abstract, as: :text, input_html: { rows: 8 } %>
         <%= f.input :pdf %>
         <%= f.input :doi %>
@@ -41,6 +42,7 @@
                                                         .researchers
                                                         .ordered,
                           as: :check_boxes %>
+        <%= f.input :authors_list %>
         <%= f.association :kind, collection: @journal.kinds.ordered if @journal.kinds.any? %>
       <% end %>
       <%= render 'admin/application/meta_description/form', f: f, about: paper %>
diff --git a/app/views/admin/research/journals/papers/_list.html.erb b/app/views/admin/research/journals/papers/_list.html.erb
index aae767ac2b8b319769010821e6873a2f74786c99..2cfd0e29d761f738d376613ad0b33bc9526e6f6b 100644
--- a/app/views/admin/research/journals/papers/_list.html.erb
+++ b/app/views/admin/research/journals/papers/_list.html.erb
@@ -10,11 +10,10 @@
     </thead>
     <tbody>
       <% papers.each do |paper| %>
-        <tr>
+        <tr class="<%= 'draft' unless paper.published? %>">
           <td>
             <%= link_to paper,
-                        admin_research_journal_paper_path(journal_id: paper.journal, id: paper),
-                        class: "#{'draft' unless paper.published?}" %>
+                        admin_research_journal_paper_path(journal_id: paper.journal, id: paper) %>
           </td>
           <td><%= link_to paper.volume, admin_research_journal_volume_path(paper.volume) if paper.volume %></td>
           <td><%= l(paper.published_at.to_time, format: :date_with_explicit_month) if paper.published_at.present? %></td>
diff --git a/app/views/admin/research/journals/papers/show.html.erb b/app/views/admin/research/journals/papers/show.html.erb
index 5718ef637b39b4cad79077e6c4ae1c8d0218bafd..9af4652babc147e2e8c8837b1bed4a3efa97c153 100644
--- a/app/views/admin/research/journals/papers/show.html.erb
+++ b/app/views/admin/research/journals/papers/show.html.erb
@@ -59,12 +59,16 @@
           <% end %>
           <% if @paper.people.any? %>
             <%= osuny_label Research::Journal::Paper.human_attribute_name('people') %>
-            <ul class="list-unstyled mb-0">
+            <ul class="list-unstyled">
               <% @paper.people.each do |person| %>
                 <li><%= link_to person, admin_research_researcher_path(person) %></li>
               <% end %>
             </ul>
           <% end %>
+          <% if @paper.authors_list.present? %>
+            <%= osuny_label Research::Journal::Paper.human_attribute_name('authors_list') %>
+            <p><%= @paper.authors_list %></p>
+          <% end %>
       <% end %>
       <%= render 'admin/application/meta_description/show', about: @paper %>
     </div>
diff --git a/app/views/admin/research/journals/papers/static.html.erb b/app/views/admin/research/journals/papers/static.html.erb
index 3177194e9bfb282ae92fa52a1f415024dde6c5c7..396ade972c97f3c506f255675234eb1eebfb2227 100644
--- a/app/views/admin/research/journals/papers/static.html.erb
+++ b/app/views/admin/research/journals/papers/static.html.erb
@@ -28,6 +28,8 @@ researchers:
 <% @about.people.each do |person| %>
 - "<%= person.slug %>"
 <% end %>
+authors_list: >
+  <%= prepare_text_for_static @about.authors_list %>
 <%= render 'admin/application/meta_description/static' %>
 <%= render 'admin/application/summary/static' %>
 abstract: >
diff --git a/app/views/admin/research/journals/volumes/show.html.erb b/app/views/admin/research/journals/volumes/show.html.erb
index 540e195f935a3edd4eadafa857d899a20ee29554..f083f12cf6bcd80ee6f5431176b40a5b1b3ee0ec 100644
--- a/app/views/admin/research/journals/volumes/show.html.erb
+++ b/app/views/admin/research/journals/volumes/show.html.erb
@@ -21,7 +21,7 @@
               </thead>
               <tbody data-sortable data-sort-url="<%= reorder_admin_research_journal_papers_path(journal_id: @journal.id) %>">
                 <% @papers.each do |paper| %>
-                  <tr data-id="<%= paper.id %>">
+                  <tr data-id="<%= paper.id %>" class="<%= 'draft' unless paper.published? %>">
                     <% if can? :reorder, Research::Journal::Paper %>
                       <td><i class="<%= Icon::DRAG %> handle"></i></td>
                     <% end %>
diff --git a/app/views/api/layouts/application.html.erb b/app/views/api/layouts/application.html.erb
index 29a6ebea36ce213ade8cdce3702a2260918f7191..1053513aec3a9f60eb18b13556c008ad70ed8bce 100644
--- a/app/views/api/layouts/application.html.erb
+++ b/app/views/api/layouts/application.html.erb
@@ -23,7 +23,6 @@
       <%= yield %>
     </main>
     <%= render 'footer' %>
-    <%= render 'gdpr/cookie_consent' %>
     <%= render 'bugsnag' %>
   </body>
 </html>
diff --git a/app/views/application/_footer.html.erb b/app/views/application/_footer.html.erb
index 530f5a966f9b8b3f19be1e545ee2823448ba94cd..abd05f1f855f16846bd4eefb57306e8110e027fc 100644
--- a/app/views/application/_footer.html.erb
+++ b/app/views/application/_footer.html.erb
@@ -1,27 +1,24 @@
-<footer class="pt-5">
-  <div class="container text-center">
-    <div class="mb-5">
+<footer class="mt-5 pt-5">
+  <div class="container">
+    <div class="mb-5 text-lg-center">
       <%= image_tag 'osuny-black.svg', width: 80 %>
     </div>
-    <nav class="nav justify-content-center">
+    <nav class="nav small d-block d-lg-flex justify-content-lg-center">
       <%= link_to t('terms_of_service'),
                   t('terms_of_service_url'),
-                  class: 'nav-link',
+                  class: 'nav-link ps-0',
                   target: '_blank',
                   rel: 'noreferrer' %>
       <%= link_to t('privacy_policy'),
                   t('privacy_policy_url'),
-                  class: 'nav-link',
+                  class: 'nav-link ps-0',
                   target: '_blank',
                   rel: 'noreferrer' %>
       <%= link_to t('cookies_policy'),
                   t('cookies_policy_url'),
-                  class: 'nav-link',
+                  class: 'nav-link ps-0',
                   target: '_blank',
                   rel: 'noreferrer' %>
-      <%= link_to t('cookies_consent_choice'),
-                  '',
-                  class: 'nav-link js-gdpr__cookie_consent__display_again' %>
     </nav>
   </div>
 </footer>
diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb
index 08194d186dc16e87a888231f500e9a43dee4a33e..5bb6d917bb75447f5ad32f404aceade0130ceabe 100644
--- a/app/views/devise/registrations/edit.html.erb
+++ b/app/views/devise/registrations/edit.html.erb
@@ -4,7 +4,7 @@
   <%= f.error_notification %>
 
   <div class="row">
-    <div class="col-md-4">
+    <div class="col-lg-6">
       <%= f.input :email, required: true %>
       <%= f.input :first_name,
                   required: true,
@@ -13,15 +13,12 @@
       <%= f.input :last_name,
                   required: true,
                   input_html: { autocomplete: "last_name" } %>
-    </div>
-    <div class="col-md-4">
       <%= f.association :language,
                         include_blank: false,
                         label_method: lambda { |l| t("languages.#{l.iso_code.to_s}") } %>
-      <%= f.input :mobile_phone %>
       <%= f.input :admin_theme, include_blank: false %>
     </div>
-    <div class="col-md-4">
+    <div class="col-lg-6">
       <%= f.input :password,
                   as: :password_with_hints,
                   allow_password_uncloaking: true,
@@ -35,6 +32,7 @@
                   hint: t(".leave_blank_if_you_don_t_want_to_change_it"),
                   required: false,
                   input_html: { autocomplete: "new-password" } %>
+      <%= f.input :mobile_phone %>
       <%= f.input :picture,
                   as: :single_deletable_file,
                   input_html: { accept: '.jpg,.jpeg,.png,.svg' },
diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb
index 34db524df5ac26e9ec94e93f7afb440ab5d695eb..cc85287f0ac19054fb0b051522e7b1684be16a12 100644
--- a/app/views/devise/registrations/new.html.erb
+++ b/app/views/devise/registrations/new.html.erb
@@ -6,7 +6,7 @@
   <%= f.error_notification %>
 
   <div class="row">
-    <div class="col-md-6">
+    <div class="col-lg-6">
       <%= f.input :email,
                   required: true,
                   input_html: { autocomplete: "email" } %>
@@ -22,7 +22,7 @@
                         label_method: lambda { |l| t("languages.#{l.iso_code.to_s}") },
                         include_blank: :translate %>
     </div>
-    <div class="col-md-6">
+    <div class="col-lg-6">
       <%= f.input :password,
                   as: :password_with_hints,
                   required: true,
diff --git a/app/views/devise/two_factor_authentication/show.html.erb b/app/views/devise/two_factor_authentication/show.html.erb
index 964870ab3d7a2c78b0fa0198938d3c72bffb8b79..5fab80bda2581319923c14e3fd135c57ccf599da 100644
--- a/app/views/devise/two_factor_authentication/show.html.erb
+++ b/app/views/devise/two_factor_authentication/show.html.erb
@@ -1,6 +1,8 @@
 <%= content_for :title, t('.title') %>
 
-<h4>
+<h4 class="mb-5"><%= t('.title') %></h4>
+
+<p>
   <% if resource.direct_otp %>
     <% if resource.direct_otp_delivery_method == 'mobile_phone' %>
       <%= t('devise.two_factor_authentication.enter_code_direct_otp_mobile_phone', phone: masked_phone(resource.mobile_phone)) %>
@@ -10,11 +12,11 @@
   <% else %>
     <%= t('devise.two_factor_authentication.enter_code_totp') %>
   <% end %>
-</h4>
+</p>
 
 <%= simple_form_for(resource, url: user_two_factor_authentication_path, html: { method: :put, class: 'my-3' }) do |f| %>
-  <div class="row">
-    <div class="col-md-6">
+  <div class="row pure__row--small">
+    <div class="col-lg-6">
       <div class="form-inputs">
         <div class="form-group required mt-0">
           <%= text_field_tag :code,
@@ -25,7 +27,7 @@
                               autofocus: true,
                               autocomplete: 'off',
                               class: 'form-control string required'%>
-          <p class="mt-2 mb-0">
+          <p class="mt-2 mb-5">
             <% if resource.direct_otp %>
               <%= link_to t('devise.two_factor_authentication.resend_code'), [:resend_code, resource_name, :two_factor_authentication] %>
             <% else %>
@@ -38,11 +40,11 @@
         </div>
       </div>
     </div>
-    <div class="col-md-6">
+    <div class="col-lg-6">
       <%= link_to t('devise.shared.links.sign_out'),
                   destroy_user_session_path,
                   method: :delete,
-                  class: "btn btn-danger float-end" %>
+                  class: "btn btn-outline-danger" %>
       <%= f.button  :submit,
                     t('devise.two_factor_authentication.validate'),
                     class: "btn btn-primary" %>
diff --git a/app/views/extranet/application/_footer.html.erb b/app/views/extranet/application/_footer.html.erb
index 90c6d199b9fba77c8d58b1e512e88671c735f37f..6f774e2449b0e57f4d82608656fcf81e1aa8dd3c 100644
--- a/app/views/extranet/application/_footer.html.erb
+++ b/app/views/extranet/application/_footer.html.erb
@@ -45,10 +45,6 @@ about = current_extranet.about
                     target: '_blank',
                     rel: 'noreferrer' if current_extranet.has_cookies_policy? %>
         <%= link_to t('extranet.data'), data_path %>
-        <%= link_to t('cookies_consent_choice'),
-                    '',
-                    class: 'js-gdpr__cookie_consent__display_again' %>
-                  
         <%= t 'extranet.osuny_html' %>
       </nav>
     </div>
diff --git a/app/views/extranet/gdpr/_cookie_consent.html.erb b/app/views/extranet/gdpr/_cookie_consent.html.erb
deleted file mode 100644
index 3a1cfe18e18ad1aff4e2fffef35dbf87a7a0dfd3..0000000000000000000000000000000000000000
--- a/app/views/extranet/gdpr/_cookie_consent.html.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-<div class="gdpr__cookie_consent js-gdpr__cookie_consent">
-  <div class="gdpr__cookie_consent__text">
-    <%= t('gdpr.cookie_consent.text') %>
-    <%= t('gdpr.cookie_consent.learn_more_html', link: cookies_policy_path) %>
-  </div>
-  <div class="gdpr__cookie_consent__buttons">
-    <button class="gdpr__cookie_consent__buttons__ok js-gdpr__cookie_consent__buttons__ok btn btn-primary btn-sm btn-xs"> <%= t('gdpr.cookie_consent.button_ok') %></button>
-    <button class="gdpr__cookie_consent__buttons__ko js-gdpr__cookie_consent__buttons__ko btn btn-primary btn-sm btn-xs"> <%= t('gdpr.cookie_consent.button_ko') %></button>
-  </div>
-</div>
\ No newline at end of file
diff --git a/app/views/extranet/layouts/application.html.erb b/app/views/extranet/layouts/application.html.erb
index 8b20a64470b47db0a214116ba3c18c4e12a065a1..ccad435576b5eec0aea0abed45ea8745def16a78 100644
--- a/app/views/extranet/layouts/application.html.erb
+++ b/app/views/extranet/layouts/application.html.erb
@@ -11,7 +11,6 @@
       <%= yield %>
     </main>
     <%= render 'extranet/application/footer' %>
-    <%= render 'extranet/gdpr/cookie_consent' %>
     <%= render 'bugsnag' %>
     <%= javascript_include_tag 'extranet' %>
     <script src="https://example.osuny.org/js/extranet.js"></script>
diff --git a/app/views/extranet/layouts/devise.html.erb b/app/views/extranet/layouts/devise.html.erb
index f94aae6fee43e9285b0b021aa7c4ae9b779a4464..69ff30bdc1c2f7817e2ff0782323af130aab3621 100644
--- a/app/views/extranet/layouts/devise.html.erb
+++ b/app/views/extranet/layouts/devise.html.erb
@@ -24,12 +24,10 @@
               <%= link_to t('terms_of_service'), terms_path, rel: 'noreferrer' if current_extranet.has_terms? %>
               <%= link_to t('privacy_policy'), privacy_policy_path, rel: 'noreferrer' if current_extranet.has_privacy_policy? %>
               <%= link_to t('cookies_policy'), cookies_policy_path, rel: 'noreferrer' if current_extranet.has_cookies_policy? %>
-              <%= link_to t('cookies_consent_choice'), '', class: 'js-gdpr__cookie_consent__display_again' %>
           </footer>
         </div>
       </div>
     </main>
-    <%= render 'extranet/gdpr/cookie_consent' %>
     <%= render 'bugsnag' %>
     <%= javascript_include_tag 'extranet' %>
   </body>
diff --git a/app/views/extranet/pages/data.html.erb b/app/views/extranet/pages/data.html.erb
index 9829d185e2b5fd62fa23b975bf54bec05ea8e2b6..4fc343aa0f4a3e1f1615ce10944ecfb3d7b1fe51 100644
--- a/app/views/extranet/pages/data.html.erb
+++ b/app/views/extranet/pages/data.html.erb
@@ -5,9 +5,14 @@
 
 <div class="row">
   <% @metrics.each do |metric| %>
-  <div class="col-md-3">
-    <p class="h1 mb-0"><%= metric[:value] %></p>
-    <p><%= metric[:name] %></p>
-  </div>
+    <% 
+    value = metric[:value]
+    next if value.zero?
+    name = metric[:name]
+    %>
+    <div class="col-md-3">
+      <p class="h1 mb-0"><%= value %></p>
+      <p><%= name %></p>
+    </div>
   <% end %>
 </div>
\ No newline at end of file
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index d7a2782bd31e89f40eb05cc1090e87caeb0b5ed7..fa8ec3ad26ada8cec7b7640605039a938125412a 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -17,7 +17,6 @@
       <%= yield %>
     </main>
     <%= render 'footer' %>
-    <%= render 'gdpr/cookie_consent' %>
     <%= render 'bugsnag' %>
     <%= render 'summernote_localization' %>
   </body>
diff --git a/app/views/layouts/devise.html.erb b/app/views/layouts/devise.html.erb
index 6c3eb195df94f507849be3b7c6073a7cf27339bc..09a94714b1c8e7954b3b9da2e3093fe40d5a9bf9 100644
--- a/app/views/layouts/devise.html.erb
+++ b/app/views/layouts/devise.html.erb
@@ -12,29 +12,20 @@
   </head>
   <body class="<%= body_classes %>">
     <div class="container">
-      <div class="row">
-        <div class="col-sm-10 mx-auto">
-          <h1 class="my-5 py-5 text-center">
-            <%= link_to root_path do %>
-              <%= render 'logo' %>
-            <% end %>
-          </h1>
-          <div class="card">
-            <div class="card-body text-start">
-              <% unless notice.blank? %>
-                <div class="alert alert-success mt-2" role="alert"><%= notice.html_safe %></div>
-              <% end %>
-              <% unless alert.blank? %>
-                <div class="alert alert-danger mt-2" role="alert"><%= alert.html_safe %></div>
-              <% end %>
-              <%= yield %>
-            </div>
-          </div>
-        </div>
-      </div>
+      <h1 class="my-5 py-5 text-center">
+        <%= link_to root_path do %>
+          <%= render 'logo' %>
+        <% end %>
+      </h1>
+      <% unless notice.blank? %>
+        <div class="alert alert-success mt-2" role="alert"><%= notice.html_safe %></div>
+      <% end %>
+      <% unless alert.blank? %>
+        <div class="alert alert-danger mt-2" role="alert"><%= alert.html_safe %></div>
+      <% end %>
+      <%= yield %>
     </div>
     <%= render 'footer' %>
-    <%= render 'gdpr/cookie_consent' %>
     <%= render 'bugsnag' %>
     <%= render 'summernote_localization' %>
   </body>
diff --git a/config/initializers/simple_form_bootstrap.rb b/config/initializers/simple_form_bootstrap.rb
index 94970409dc65038c3e60da402c40b1473a3e3aae..c1e2f2441ab327ea3c49ce6ebdc5a3441e71ddaf 100644
--- a/config/initializers/simple_form_bootstrap.rb
+++ b/config/initializers/simple_form_bootstrap.rb
@@ -79,7 +79,7 @@ SimpleForm.setup do |config|
   config.wrappers :vertical_collection, item_wrapper_class: 'form-check', item_label_class: 'form-check-label', tag: 'fieldset', class: 'mb-3' do |b|
     b.use :html5
     b.optional :readonly
-    b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba|
+    b.wrapper :legend_tag, tag: 'legend', class: 'form-label pt-0' do |ba|
       ba.use :label_text
     end
     b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'
@@ -91,7 +91,7 @@ SimpleForm.setup do |config|
   config.wrappers :vertical_collection_inline, item_wrapper_class: 'form-check form-check-inline', item_label_class: 'form-check-label', tag: 'fieldset', class: 'mb-3' do |b|
     b.use :html5
     b.optional :readonly
-    b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba|
+    b.wrapper :legend_tag, tag: 'legend', class: 'form-label pt-0' do |ba|
       ba.use :label_text
     end
     b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'
@@ -158,7 +158,7 @@ SimpleForm.setup do |config|
     b.optional :pattern
     b.optional :min_max
     b.optional :readonly
-    b.use :label, class: 'col-sm-3 col-form-label'
+    b.use :label, class: 'col-sm-3 form-label'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'
       ba.use :full_error, wrap_with: { class: 'invalid-feedback' }
@@ -184,7 +184,7 @@ SimpleForm.setup do |config|
   config.wrappers :horizontal_collection, item_wrapper_class: 'form-check', item_label_class: 'form-check-label', class: 'row mb-3' do |b|
     b.use :html5
     b.optional :readonly
-    b.use :label, class: 'col-sm-3 col-form-label pt-0'
+    b.use :label, class: 'col-sm-3 form-label pt-0'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'
       ba.use :full_error, wrap_with: { class: 'invalid-feedback d-block' }
@@ -196,7 +196,7 @@ SimpleForm.setup do |config|
   config.wrappers :horizontal_collection_inline, item_wrapper_class: 'form-check form-check-inline', item_label_class: 'form-check-label', class: 'row mb-3' do |b|
     b.use :html5
     b.optional :readonly
-    b.use :label, class: 'col-sm-3 col-form-label pt-0'
+    b.use :label, class: 'col-sm-3 form-label pt-0'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid'
       ba.use :full_error, wrap_with: { class: 'invalid-feedback d-block' }
@@ -211,7 +211,7 @@ SimpleForm.setup do |config|
     b.optional :maxlength
     b.optional :minlength
     b.optional :readonly
-    b.use :label, class: 'col-sm-3 col-form-label'
+    b.use :label, class: 'col-sm-3 form-label'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid'
       ba.use :full_error, wrap_with: { class: 'invalid-feedback' }
@@ -223,7 +223,7 @@ SimpleForm.setup do |config|
   config.wrappers :horizontal_select, class: 'row mb-3' do |b|
     b.use :html5
     b.optional :readonly
-    b.use :label, class: 'col-sm-3 col-form-label'
+    b.use :label, class: 'col-sm-3 form-label'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-select', error_class: 'is-invalid', valid_class: 'is-valid'
       ba.use :full_error, wrap_with: { class: 'invalid-feedback' }
@@ -235,7 +235,7 @@ SimpleForm.setup do |config|
   config.wrappers :horizontal_multi_select, class: 'row mb-3' do |b|
     b.use :html5
     b.optional :readonly
-    b.use :label, class: 'col-sm-3 col-form-label'
+    b.use :label, class: 'col-sm-3 form-label'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.wrapper class: 'd-flex flex-row justify-content-between align-items-center' do |bb|
         bb.use :input, class: 'form-select mx-1', error_class: 'is-invalid', valid_class: 'is-valid'
@@ -251,7 +251,7 @@ SimpleForm.setup do |config|
     b.use :placeholder
     b.optional :readonly
     b.optional :step
-    b.use :label, class: 'col-sm-3 col-form-label pt-0'
+    b.use :label, class: 'col-sm-3 form-label pt-0'
     b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-range', error_class: 'is-invalid', valid_class: 'is-valid'
       ba.use :full_error, wrap_with: { class: 'invalid-feedback' }
diff --git a/config/locales/administration/en.yml b/config/locales/administration/en.yml
index ce23b4dc0ca7a26af92318a5d25a3b6b9ecb3ad8..e0c0b5c419908f895e6f36d91d8f7e4decff4fcd 100644
--- a/config/locales/administration/en.yml
+++ b/config/locales/administration/en.yml
@@ -29,5 +29,6 @@ en:
     description:
       text: L'administration, sous ses multiples formes, se définit principalement par ses activités au service de l'intérêt général. L'administration agit dans l'intérêt général et respecte le principe de légalité. Elle est tenue à l'obligation de neutralité et au respect du principe de laïcité. Elle se conforme au principe d'égalité et garantit à chacun un traitement impartial.
       source: Code des relations entre le public et l'administration
-    qualiopi:
-      description: Aide à la vérification de la conformité de l'offre de formation avec la norme Qualiopi
\ No newline at end of file
+      parts:
+        qualiopi:
+          description: Help in checking the conformity of the training offer with the Qualiopi standard
\ No newline at end of file
diff --git a/config/locales/administration/fr.yml b/config/locales/administration/fr.yml
index 3b955daa3605e95b9397bf31ec1a3858f676fc05..5b57ec79688ca012b705af04a0f053d04d03df39 100644
--- a/config/locales/administration/fr.yml
+++ b/config/locales/administration/fr.yml
@@ -29,5 +29,6 @@ fr:
     description:
       text: L'administration, sous ses multiples formes, se définit principalement par ses activités au service de l'intérêt général. L'administration agit dans l'intérêt général et respecte le principe de légalité. Elle est tenue à l'obligation de neutralité et au respect du principe de laïcité. Elle se conforme au principe d'égalité et garantit à chacun un traitement impartial.
       source: Code des relations entre le public et l'administration
-    qualiopi:
-      description: Aide à la vérification de la conformité de l'offre de formation avec la norme Qualiopi
\ No newline at end of file
+      parts:
+        qualiopi:
+          description: Aide à la vérification de la conformité de l'offre de formation avec la norme Qualiopi
diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml
index b829f6d995adec126a0beaca00c19e900969300b..64e53987fa5579d78d1862d6bb34e68a5079d767 100644
--- a/config/locales/communication/en.yml
+++ b/config/locales/communication/en.yml
@@ -68,7 +68,6 @@ en:
         about_type: About
         color: Couleur
         cookies_policy: Cookies policy
-        description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées
         favicon: Favicon (.png)
         feature_alumni: Alumni
         feature_contacts: Directory
@@ -129,7 +128,6 @@ en:
         access_token: Access token
         created_at: Creation
         default_language: Default language
-        description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap
         git_branch: Git branch
         git_endpoint: Git endpoint
         git_provider: Git provider
@@ -629,6 +627,11 @@ en:
     description:
       text: Communiquer, c'est mettre en commun; et mettre en commun, c'est l'acte qui nous constitue. Si l'on estime que cet acte est impossible, on refuse tout projet humain.
       source: Albert Jacquard, Petite philosophie à l'usage des non-philosophes, 1997
+      parts:
+        website:
+          description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap
+        extranet:
+          description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées
     manage_authors: Manage authors
     number_of_posts: Nunber of posts
     website:
diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml
index 87a098e11f611aaf8fe77fd1fab402503a56c916..937454802264a93513e030d56d8b019f639cadd9 100644
--- a/config/locales/communication/fr.yml
+++ b/config/locales/communication/fr.yml
@@ -68,7 +68,6 @@ fr:
         about_type: Type d'extranet
         color: Couleur
         cookies_policy: Politique de cookies
-        description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées
         favicon: Favicon (.png)
         feature_alumni: Alumni
         feature_contacts: Annuaire
@@ -129,7 +128,6 @@ fr:
         access_token: Access token
         created_at: Création
         default_language: Langue par défaut
-        description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap
         git_branch: Branche
         git_endpoint: Point d'accès Git
         git_provider: Provider Git
@@ -629,6 +627,11 @@ fr:
     description:
       text: Communiquer, c'est mettre en commun; et mettre en commun, c'est l'acte qui nous constitue. Si l'on estime que cet acte est impossible, on refuse tout projet humain.
       source: Albert Jacquard, Petite philosophie à l'usage des non-philosophes, 1997
+      parts:
+        website:
+          description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap
+        extranet:
+          description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées
     manage_authors: Gérer les auteur·rice·s
     number_of_posts: Nombre d'actualités
     website:
diff --git a/config/locales/education/en.yml b/config/locales/education/en.yml
index dfd4c369afe61c0ab0183e43a73ca2592fec2af5..73051d2483cdc4bf52dcc5371c58f3c88ae590cb 100644
--- a/config/locales/education/en.yml
+++ b/config/locales/education/en.yml
@@ -94,6 +94,17 @@ en:
     description: 
       text: L’éducation est l’ensemble des processus et des procédés qui permettent à tout enfant humain d’accéder progressivement à la culture, l’accès à la culture étant ce qui distingue l’homme de l’animal.
       source: Olivier Reboul, La philosophie de l'éducation, 2018
+      parts:
+        diploma:
+          description: Présentation des diplômes et de leurs caractéristiques
+        program:
+          description: Présentation exhaustive des formations, de leurs contenus, modalités pédagogiques et perspectives
+        teacher:
+          description: Présentation des enseignants et enseignantes, avec leur biographie et leurs enseignements dans les différentes formations
+        school:
+          description: Présentation des écoles, de leurs coordonnées, enseignements, équipes et informations administratives
+        alumnus:
+          description: Présentation des étudiants et étudiantes ayant étudié dans les différentes formations
     manage_programs: Manage programs
     manage_roles: Manage roles
     manage_teachers: Manage teachers
diff --git a/config/locales/education/fr.yml b/config/locales/education/fr.yml
index 73b87aa91267510676b1d9f11a5cd7a1ce285f4e..0b92fa951f7cfdd071ec508f36722dd99c96572a 100644
--- a/config/locales/education/fr.yml
+++ b/config/locales/education/fr.yml
@@ -31,7 +31,6 @@ fr:
         school: École
         year: Année
       education/diploma:
-        description: Présentation des diplômes et de leurs caractéristiques
         duration: Durée
         ects: Crédits ECTS
         level: Niveau
@@ -44,7 +43,6 @@ fr:
         capacity: Capacité
         contacts: Contacts
         continuing: Formation continue
-        description: Présentation exhaustive des formations, de leurs contenus, modalités pédagogiques et perspectives
         diploma: Diplôme
         duration: Durée
         downloadable_summary: Document de synthèse téléchargeable
@@ -77,7 +75,6 @@ fr:
         administrators: Équipe administrative
         city: Ville
         country: Pays
-        description: Présentation des écoles, de leurs coordonnées, enseignements, équipes et informations administratives
         name: Nom
         phone: Téléphone
         programs: Formations dispensées
@@ -85,8 +82,6 @@ fr:
         url: Site Web
         websites: Sites Web associés
         zipcode: Code postal
-      university/person/teacher:
-        description: Présentation des enseignants et enseignantes, avec leur biographie et leurs enseignements dans les différentes formations
   admin:
     education:
       programs:
@@ -99,6 +94,17 @@ fr:
     description: 
       text: L’éducation est l’ensemble des processus et des procédés qui permettent à tout enfant humain d’accéder progressivement à la culture, l’accès à la culture étant ce qui distingue l’homme de l’animal.
       source: Olivier Reboul, La philosophie de l'éducation, 2018
+      parts:
+        diploma:
+          description: Présentation des diplômes et de leurs caractéristiques
+        program:
+          description: Présentation exhaustive des formations, de leurs contenus, modalités pédagogiques et perspectives
+        teacher:
+          description: Présentation des enseignants et enseignantes, avec leur biographie et leurs enseignements dans les différentes formations
+        school:
+          description: Présentation des écoles, de leurs coordonnées, enseignements, équipes et informations administratives
+        alumnus:
+          description: Présentation des étudiants et étudiantes ayant étudié dans les différentes formations
     manage_programs: Gérer les formations
     manage_roles: Gérer les rôles
     manage_teachers: Gérer les enseignants·es
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 85a703d66c0b73e6628130a3174cc0a88e4a1dc9..551e5fb3b8104a64070910aec3a0232cf3e89bd9 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -46,7 +46,6 @@ en:
         summernote_locale: Summernote locale code
       user:
         admin_theme: Admin Theme
-        description: Personne utilisant Osuny, dotée d'un compte authentifié
         email: Email
         first_name: First name
         language: Favourite language
@@ -202,8 +201,6 @@ en:
     empty: Folder is empty
     open: Open folder
     close: Close folder
-  gdpr:
-    privacy_policy: https://osuny.org/politique-de-confidentialite
   hello: "Hello %{name}!"
   home: Home
   imports:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 1e441444b1eb2e7cdc625f2a9c766e8050721f85..1fc37088e5c8ff952d9534c617e994326808d2da 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -46,7 +46,6 @@ fr:
         summernote_locale: Nom de la locale Summernote
       user:
         admin_theme: Thème de l'administration
-        description: Personne utilisant Osuny, dotée d'un compte authentifié
         email: Email
         first_name: Prénom
         language: Langue préférée
@@ -202,8 +201,6 @@ fr:
     empty: Le dossier est vide
     open: Ouvrir le dossier
     close: Fermer le dossier
-  gdpr:
-    privacy_policy: https://osuny.org/politique-de-confidentialite
   hello: "Bonjour %{name} !"
   home: Accueil
   imports:
diff --git a/config/locales/research/en.yml b/config/locales/research/en.yml
index c4fb2a96bcc223eaf9c4d25a7fd34b6985c9475a..f1b08768dfd99f990341e15d3d8f1fe5e85b336b 100644
--- a/config/locales/research/en.yml
+++ b/config/locales/research/en.yml
@@ -36,15 +36,12 @@ en:
         one: Thesis
         other: Theses
     attributes:
-      research/hal:
-        description: Publications et auteur·e·s dans la base de données HAL
       research/hal/author:
         docid: HAL identifier
         first_name: First name
         full_name: Full name
         last_name: Last name
       research/hal/publication:
-        description: Publications scientifiques importées automatiquement de HAL
         docid: Identifier
         doi_url: URL DOI
         publication_date: Publication date
@@ -52,11 +49,11 @@ en:
         url: URL
         hal_url: URL HAL
       research/journal:
-        description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche
         issn: ISSN
         title: Title
       research/journal/paper:
         abstract: Abstract
+        authors_list: Authors list
         doi: DOI
         keywords: Keywords
         pdf: PDF
@@ -84,7 +81,6 @@ en:
         address: Address
         country: Country
         city: City
-        description: Structure de recherche hébergeant le travail des chercheur·e·s
         name: Name
         zipcode: Zipcode
       research/laboratory/axis:
@@ -96,7 +92,6 @@ en:
         author: Author
         completed: Completed?
         completed_at: Completed at
-        description: Production scientifique permettant d'obtenir le titre de Docteur·e
         director: Director
         laboratory: Laboratory
         started_at: Started at
@@ -109,12 +104,30 @@ en:
     description:
       text: La recherche scientifique est, à la fois, une démarche créatrice de connaissances motivée par la curiosité pure et une activité génératrice d’innovations qui augmentent les moyens d’action et de diagnostic sur la nature, l’homme et la société. Ces deux aspects de la recherche, le fondamental et l’appliqué, loin de s’opposer, sont complémentaires l’un de l’autre. La recherche fondamentale crée le socle de connaissances à partir duquel naissent les applications et, inversement, les avancées technologiques procurent les outils d’investigation de plus en plus perfectionnés qui conduisent à approfondir nos connaissances fondamentales.
       source: Serge Haroche, Prix Nobel de physique 2012
+      parts:
+        hal:
+          description: Publications et auteur·e·s dans la base de données HAL
+        journal:
+          description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche
+        laboratory:
+          description: Structure de recherche hébergeant le travail des chercheur·e·s
+        researcher:
+          description: Personne physique liée à une université, une composante, un laboratoire, etc.
+        thesis:
+          description: Production scientifique permettant d'obtenir le titre de Docteur·e
     hal:
+      description:
+        parts:
+          author:
+            description: Profils des chercheur·e·s dans la base de données HAL
+          publication:
+            description: Publications scientifiques importées automatiquement de HAL
       title: HAL
       select_identifier: Select all the HAL authors that correspond to this researcher. Use the publications to be sure it's the same person.
   simple_form:
     hints:
       research_journal_paper:
+        authors_list: Type the authors list directly in this field if you don't want to use the checkboxes above
         doi: "You can type the DOI identifier without https://, for example “10.19182/perspective/31918”"
       research_journal_volume:
         cover: JPG or PNG file
diff --git a/config/locales/research/fr.yml b/config/locales/research/fr.yml
index 895456f73ddbd7bcec3fc8c0c87c7413a95e72e7..aa30b2e68121d829cb4a8d6c68199c0570ac136a 100644
--- a/config/locales/research/fr.yml
+++ b/config/locales/research/fr.yml
@@ -36,16 +36,12 @@ fr:
         one: Thèse
         other: Thèses
     attributes:
-      research/hal:
-        description: Publications et auteur·e·s dans la base de données HAL
       research/hal/author:
-        description: Profils des chercheur·e·s dans la base de données HAL
         docid: Identifiant HAL
         first_name: Prénom
         full_name: Nom complet
         last_name: Nom
       research/hal/publication:
-        description: Publications scientifiques importées automatiquement de HAL
         docid: Identifiant
         doi_url: URL DOI
         publication_date: Date de publication
@@ -53,11 +49,11 @@ fr:
         url: URL
         hal_url: URL HAL
       research/journal:
-        description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche
         issn: ISSN
         title: Titre
       research/journal/paper:
         abstract: Extrait
+        authors_list: Liste des auteur·e·s
         doi: DOI
         keywords: Mots clés
         pdf: PDF
@@ -85,7 +81,6 @@ fr:
         address: Adresse
         country: Pays
         city: Ville
-        description: Structure de recherche hébergeant le travail des chercheur·e·s
         name: Nom
         zipcode: Code postal
       research/laboratory/axis:
@@ -94,10 +89,9 @@ fr:
         text: Texte
       research/thesis:
         abstract: Résumé
-        author: Auteur·rice
+        author: Auteur·e
         completed: Complétée ?
         completed_at: Complétée le
-        description: Production scientifique permettant d'obtenir le titre de Docteur·e
         director: Directeur·rice
         laboratory: Laboratoire
         started_at: Commencée le
@@ -110,11 +104,29 @@ fr:
     description:
       text: La recherche scientifique est, à la fois, une démarche créatrice de connaissances motivée par la curiosité pure et une activité génératrice d’innovations qui augmentent les moyens d’action et de diagnostic sur la nature, l’homme et la société. Ces deux aspects de la recherche, le fondamental et l’appliqué, loin de s’opposer, sont complémentaires l’un de l’autre. La recherche fondamentale crée le socle de connaissances à partir duquel naissent les applications et, inversement, les avancées technologiques procurent les outils d’investigation de plus en plus perfectionnés qui conduisent à approfondir nos connaissances fondamentales.
       source: Serge Haroche, Prix Nobel de physique 2012
+      parts:
+        hal:
+          description: Publications et auteur·e·s dans la base de données HAL
+        journal:
+          description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche
+        laboratory:
+          description: Structure de recherche hébergeant le travail des chercheur·e·s
+        researcher:
+          description: Personne physique liée à une université, une composante, un laboratoire, etc.
+        thesis:
+          description: Production scientifique permettant d'obtenir le titre de Docteur·e
     hal:
+      description:
+        parts:
+          author:
+            description: Profils des chercheur·e·s dans la base de données HAL
+          publication:
+            description: Publications scientifiques importées automatiquement de HAL
       select_identifier: Choisissez tou·te·s les auteur·e·s HAL correspondant à cette personne. Appuyez-vous sur les publications pour vérifier qu'il s'agit de la bonne personne.
   simple_form:
     hints:
       research_journal_paper:
+        authors_list: Tapez la liste des auteurs si vous n'utilisez pas les cases à cocher “Auteur·e·s” ci-dessus
         doi: "Vous pouvez saisir l'identifiant DOI sans https://, par exemple “10.19182/perspective/31918”"
       research_journal_volume:
         cover: Fichier JPG ou PNG
diff --git a/config/locales/university/en.yml b/config/locales/university/en.yml
index d34e017176ef0c82fa94f1f837227529c86248b7..a569d75d16de2579838d21c6c31c06a9bc89178a 100644
--- a/config/locales/university/en.yml
+++ b/config/locales/university/en.yml
@@ -68,7 +68,6 @@ en:
         communication_website_posts: Posts
         contacts: Contact information
         country: Country
-        description: Personne physique liée à une université, une composante, un laboratoire, etc.
         education_programs: Programs
         email: Email
         essentials: Essentials
@@ -208,6 +207,13 @@ en:
     description:
       text: Une université est une institution d'enseignement supérieur, d'étude et de recherche, constituée par la réunion de divers établissements nommés suivant les traditions “collèges”, “facultés”, “instituts”, “départements”, “centres”, “sections”, “unités” ou écoles spécifiques, mais aussi bibliothèque ou atelier, médiathèque ou musée, etc. formant un ensemble administratif cohérent avec un statut de droit défini, public, privé ou éventuellement mixte.
       source: Wikipedia
+      parts:
+        person:
+          description: Personne physique liée à une université, une composante, un laboratoire, etc.
+        organization:
+          description: Personne morale liée à une université, une composante, un laboratoire, etc.
+        user:
+          description: Personne utilisant Osuny, dotée d'un compte authentifié
     internal_key: Internal Key
     invoice_informations: Invoice informations
     manage_alumni: Manage alumni
diff --git a/config/locales/university/fr.yml b/config/locales/university/fr.yml
index 04fec52d272960beb59ac8d4de712cd7de6e9de2..289fa01a0e68909af5584ef23b282b8d3b674a13 100644
--- a/config/locales/university/fr.yml
+++ b/config/locales/university/fr.yml
@@ -34,7 +34,6 @@ fr:
         categories: Catégories
         city: Ville
         country: Pays
-        description: Personne morale liée à une université, une composante, un laboratoire, etc.
         digital: Coordonnées numériques
         email: Email
         kind: Type
@@ -68,7 +67,6 @@ fr:
         communication_website_posts: Actualités
         contacts: Coordonnées
         country: Pays
-        description: Personne physique liée à une université, une composante, un laboratoire, etc.
         education_programs: Formations
         email: Email
         essentials: Informations essentielles
@@ -208,6 +206,13 @@ fr:
     description:
       text: Une université est une institution d'enseignement supérieur, d'étude et de recherche, constituée par la réunion de divers établissements nommés suivant les traditions “collèges”, “facultés”, “instituts”, “départements”, “centres”, “sections”, “unités” ou écoles spécifiques, mais aussi bibliothèque ou atelier, médiathèque ou musée, etc. formant un ensemble administratif cohérent avec un statut de droit défini, public, privé ou éventuellement mixte.
       source: Wikipedia
+      parts:
+        person:
+          description: Personne physique liée à une université, une composante, un laboratoire, etc.
+        organization:
+          description: Personne morale liée à une université, une composante, un laboratoire, etc.
+        user:
+          description: Personne utilisant Osuny, dotée d'un compte authentifié
     internal_key: Clé interne
     invoice_informations: Données de facturation
     manage_alumni: Gérer les alumni
diff --git a/config/routes/admin/administration.rb b/config/routes/admin/administration.rb
index 1e2581e82cb84a7708069f067b5ef1fcb6dcbd03..cd5c1ac24aaba28f21c9a2bc72150c41da993670 100644
--- a/config/routes/admin/administration.rb
+++ b/config/routes/admin/administration.rb
@@ -2,6 +2,7 @@ namespace :administration do
   namespace :qualiopi do
     resources :criterions, only: [:index, :show]
     resources :indicators, only: [:index, :show]
+    root to: 'criterions#index'
   end
   root to: 'dashboard#index'
 end
diff --git a/db/migrate/20230405142031_add_authors_list_to_research_journal_papers.rb b/db/migrate/20230405142031_add_authors_list_to_research_journal_papers.rb
new file mode 100644
index 0000000000000000000000000000000000000000..cacd25eeb35bd8b2361aa821878e301f13aaeb83
--- /dev/null
+++ b/db/migrate/20230405142031_add_authors_list_to_research_journal_papers.rb
@@ -0,0 +1,5 @@
+class AddAuthorsListToResearchJournalPapers < ActiveRecord::Migration[7.0]
+  def change
+    add_column :research_journal_papers, :authors_list, :text
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 61b664759abad49dedad4660b95e5a347b4d5248..90fb648f002649d4e932e84f13512ca13f023a81 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_04_05_142031) 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: 2
+    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 "indirect_object_type", null: false
+    t.uuid "indirect_object_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "direct_source_type"
+    t.uuid "direct_source_id"
+    t.index ["direct_source_type", "direct_source_id"], name: "index_communication_website_connections_on_source"
+    t.index ["indirect_object_type", "indirect_object_id"], name: "index_communication_website_connections_on_object"
+    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
@@ -749,6 +782,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do
     t.date "received_at"
     t.date "accepted_at"
     t.string "doi"
+    t.text "authors_list"
     t.index ["kind_id"], name: "index_research_journal_papers_on_kind_id"
     t.index ["research_journal_id"], name: "index_research_journal_papers_on_research_journal_id"
     t.index ["research_journal_volume_id"], name: "index_research_journal_papers_on_research_journal_volume_id"
@@ -763,7 +797,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 +817,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 +828,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 +840,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 +854,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 +872,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 +911,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 +949,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 +1005,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 +1019,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 +1034,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 +1046,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 +1095,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 +1122,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"