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/images/communication/blocks/templates/features.jpg b/app/assets/images/communication/blocks/templates/features.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6c32f7e0dac707c1b58cf3c5f02ed8339cdd4096
Binary files /dev/null and b/app/assets/images/communication/blocks/templates/features.jpg differ
diff --git a/app/assets/images/map-marker.svg b/app/assets/images/map-marker.svg
new file mode 100644
index 0000000000000000000000000000000000000000..af0ee6abed009e8b906eb4477f6343b17fed1560
--- /dev/null
+++ b/app/assets/images/map-marker.svg
@@ -0,0 +1,4 @@
+<svg width="18" height="26" viewBox="0 0 18 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.5676 8.7551C17.5676 13.5904 8.78378 26 8.78378 26C8.78378 26 0 13.5904 0 8.7551C0 3.91979 3.93263 0 8.78378 0C13.6349 0 17.5676 3.91979 17.5676 8.7551Z" fill="black"/>
+<circle cx="9.13516" cy="8.43252" r="4.21622" fill="white"/>
+</svg>
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/assets/stylesheets/extranet/pages/_posts.sass b/app/assets/stylesheets/extranet/pages/_posts.sass
index 1d785f2606e0a2728bddb1c9a6375ea115529736..4c657e5294586185082f51b64274f1b31e69eb30 100644
--- a/app/assets/stylesheets/extranet/pages/_posts.sass
+++ b/app/assets/stylesheets/extranet/pages/_posts.sass
@@ -1,4 +1,5 @@
 .posts-show header
+    
     figure
         position: relative
         @include media-breakpoint-up(md)
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/blocks_controller.rb b/app/controllers/admin/communication/blocks_controller.rb
index 3356a1afce19e2b4963a7407d7f2123dfe13f6d4..e344837a881e21b931f89875e4dcb4d4c83e1b82 100644
--- a/app/controllers/admin/communication/blocks_controller.rb
+++ b/app/controllers/admin/communication/blocks_controller.rb
@@ -23,7 +23,7 @@ class Admin::Communication::BlocksController < Admin::Communication::Application
         @previous = @heading
       end
     end
-    @block.about.sync_with_git
+    sync_with_git_if_necessary
   end
 
   def new
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 8711957ea97c66254a3258d05443d217c092d097..af5aab0a4755035095bdb5fa302acee63c63a24f 100644
--- a/app/models/communication/block.rb
+++ b/app/models/communication/block.rb
@@ -42,12 +42,19 @@ class Communication::Block < ApplicationRecord
   # template_blobs would be a better name, because there are files
   has_many_attached :template_images
 
+  # Les numéros sont un peu en vrac
+  # Dans l'idée, pour le futur
+  # 1000 basic
+  # 2000 storytelling
+  # 3000 references
+  # 4000 utilities
   enum template_kind: {
     chapter: 50,
     image: 51,
     gallery: 300,
     video: 52,
     key_figures: 56,
+    features: 2010,
     datatable: 54,
     files: 55,
     embed: 53,
@@ -65,7 +72,7 @@ class Communication::Block < ApplicationRecord
 
   CATEGORIES = {
     basic: [:chapter, :image, :video, :datatable],
-    storytelling: [:key_figures, :gallery, :call_to_action, :testimonials, :timeline],
+    storytelling: [:key_figures, :features, :gallery, :call_to_action, :testimonials, :timeline],
     references: [:pages, :posts, :organization_chart, :partners, :programs],
     utilities: [:files, :definitions, :embed, :contact]
   }
diff --git a/app/models/communication/block/template/feature.rb b/app/models/communication/block/template/feature.rb
new file mode 100644
index 0000000000000000000000000000000000000000..bd888d365cc1fecb680ab6301ca49411336f203b
--- /dev/null
+++ b/app/models/communication/block/template/feature.rb
@@ -0,0 +1,6 @@
+class Communication::Block::Template::Feature < Communication::Block::Template::Base
+
+  has_elements
+  has_component :description, :rich_text
+
+end
diff --git a/app/models/communication/block/template/feature/element.rb b/app/models/communication/block/template/feature/element.rb
new file mode 100644
index 0000000000000000000000000000000000000000..25cd20876617e71004bcb3143b0ecb5568192a4b
--- /dev/null
+++ b/app/models/communication/block/template/feature/element.rb
@@ -0,0 +1,9 @@
+class Communication::Block::Template::Feature::Element < Communication::Block::Template::Base
+
+  has_component :title, :string
+  has_component :description, :text
+  has_component :image, :image
+  has_component :alt, :string
+  has_component :credit, :rich_text
+
+end
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/_index_show.html.erb b/app/views/admin/communication/blocks/_index_show.html.erb
index 6f847236455240041ef17659ce14d6add0ea3d96..a3025dc263078f220f412d717bf2621627f49076 100644
--- a/app/views/admin/communication/blocks/_index_show.html.erb
+++ b/app/views/admin/communication/blocks/_index_show.html.erb
@@ -1,4 +1,4 @@
 <% about.blocks.published.ordered.each do |block| %>
   <% @block = block %>
   <%= render "admin/communication/blocks/templates/#{@block.template_kind}/show" %>
-<% end %>
\ No newline at end of file
+<% end %>
diff --git a/app/views/admin/communication/blocks/edit.html.erb b/app/views/admin/communication/blocks/edit.html.erb
index 79f2958f6232e0b94fe4f89f5c3222ba371826f6..f77f94c8ac8039c82fb20b25481d4fffe3ed6428 100644
--- a/app/views/admin/communication/blocks/edit.html.erb
+++ b/app/views/admin/communication/blocks/edit.html.erb
@@ -119,6 +119,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;
@@ -128,13 +129,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/communication/blocks/templates/features/_edit.html.erb b/app/views/admin/communication/blocks/templates/features/_edit.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..e9a60f1c569c753464c16a159eeab64dd613273f
--- /dev/null
+++ b/app/views/admin/communication/blocks/templates/features/_edit.html.erb
@@ -0,0 +1,35 @@
+<div class="row pure__row--small">
+  <div class="col-xl-6">
+    <%= block_component_edit :description %>
+  </div>
+</div>
+
+<%= block_component_add_element t('.add_element') %>
+<draggable :list="data.elements" handle=".dragHandle" class="mb-3 <%= if_appstack 'list-group' %>">
+  <div v-for="(element, index) in data.elements" class="draggable-item <%= if_appstack 'list-group-item' %>">
+    <div>
+      <a class="btn ps-0 pt-0 dragHandle"><i class="<%= Icon::DRAG %> handle"></i></a>{{element.title}}
+      <a  class="btn btn-sm text-danger float-end pe-0"
+          v-on:click="data.elements.splice(data.elements.indexOf(element), 1)"
+          title="<%= t '.remove_element' %>">
+          <i class="<%= Icon::DELETE %>"></i>
+      </a>
+    </div>
+    <div class="row pure__row--small">
+      <div class="col-lg-4">
+        <%= block_component_edit :title, template: @element %>
+        <%= block_component_edit :description, template: @element, rows: 5 %>
+      </div>
+      <div class="col-lg-4">
+        <%= block_component_edit :image, template: @element %>
+      </div>
+      <div class="col-lg-4" v-show="element.image.id != ''">
+        <%= block_component_edit :alt, template: @element %>
+        <%= block_component_edit :credit, template: @element %>
+      </div>
+    </div>
+  </div>
+</draggable>
+<div v-show="data.elements.length > 2">
+  <%= block_component_add_element t('.add_element') %>
+</div>
\ No newline at end of file
diff --git a/app/views/admin/communication/blocks/templates/features/_preview.html.erb b/app/views/admin/communication/blocks/templates/features/_preview.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/views/admin/communication/blocks/templates/features/_static.html.erb b/app/views/admin/communication/blocks/templates/features/_static.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..2dd180eae5b5d1367c84827e7f24a8b8f89d7ea0
--- /dev/null
+++ b/app/views/admin/communication/blocks/templates/features/_static.html.erb
@@ -0,0 +1,9 @@
+<%= block_component_static :description %>
+      elements:
+<% block.template.elements.each do |element| %>
+<%= block_component_static :title, template: element, list: true, depth: 4 %>
+<%= block_component_static :description, template: element, depth: 5 %>
+<%= block_component_static :image, template: element, depth: 5 %>
+<%= block_component_static :alt, template: element, depth: 5 %>
+<%= block_component_static :credit, template: element, depth: 5 %>
+<% end %>
diff --git a/app/views/admin/communication/blocks/templates/partners/_preview.html.erb b/app/views/admin/communication/blocks/templates/partners/_preview.html.erb
index 0ed3c7414e3528510b5f7897c5f1e6e1d7d2786c..3d14a837cd01c07bf62f7a736c28b8a6926d2b7a 100644
--- a/app/views/admin/communication/blocks/templates/partners/_preview.html.erb
+++ b/app/views/admin/communication/blocks/templates/partners/_preview.html.erb
@@ -1,9 +1,67 @@
-<% @block.template.elements.each do |element| %>
-  <span class="me-2">
-    <% if element.best_logo %>
-      <%= image_tag element.best_logo, height: 90, class: 'bg-light p-2' %>
-    <% else %>
-      <%= element.best_name %>
-    <% end %>
-  </span>
-<% end %>
\ No newline at end of file
+<%
+  class_name = "block block-partners"
+  unless @block.title.blank?
+    class_name += " block-with-title"
+  end
+  class_name += " block-partners--" + @block.template.layout
+%>
+
+<section class="<%= class_name %>">
+  <div class="container">
+    <div class="block-content">
+      <% unless @block.title.blank? && @block.template.description.blank? %>
+        <div class="top">
+          <% unless @block.title.blank? %>
+            <h2><%= @block.title %></h2>
+          <% end %>
+          <% unless @block.template.description.blank? %>
+            <div class="description">
+              <p><%= block_component_preview :description %></p>
+            </div>
+          <% end %>
+        </div>
+      <% end %>
+
+      <% if @block.template.layout == "grid" %>
+        <div class="organizations grid">
+          <% @block.template.elements.each do |element| %>
+            <article class="organization">
+              <h3>
+                <% if element.best_url %>
+                  <a href="<%= element.best_url %>" target="_blank">
+                <% end %>
+                <%= element.best_name %>
+                <% if element.best_url%>
+                  </a>
+                <% end %>
+              </h3>
+              <div class="media">
+                <%= kamifusen_tag element.best_logo, width: 600%>
+              </div>
+            </article>
+          <% end %>
+        </div>
+      <% else %>
+        <div class="map" data-marker-icon="<%= image_path 'map-marker.svg' %>">
+          <% @block.template.elements.each do |element| %>
+            <article class="organization" data-latitude="<%= element.organization.latitude %>" data-longitude="<%= element.organization.longitude %>">
+              <h3>
+                <% if element.best_url %>
+                  <a href="<%= element.best_url %>" target="_blank">
+                <% end %>
+                <%= element.best_name %>
+                <% if element.best_url%>
+                  </a>
+                <% end %>
+              </h3>
+              <div class="media">
+                <%= kamifusen_tag element.best_logo, width: 600%>
+              </div>
+            </article>
+          <% end %>
+        </div>
+      <% end %>
+    </div>
+  </div>
+</section>
+
diff --git a/app/views/admin/communication/websites/categories/_form.html.erb b/app/views/admin/communication/websites/categories/_form.html.erb
index 0769ed9a26c14933cbdd34e5b2854e2cfb62e2e1..44bb161df365955ebd7e93b56af6c48629675c52 100644
--- a/app/views/admin/communication/websites/categories/_form.html.erb
+++ b/app/views/admin/communication/websites/categories/_form.html.erb
@@ -4,37 +4,25 @@
 
   <div class="row">
     <div class="col-md-8">
-      <div class="card flex-fill w-100">
-        <div class="card-header">
-          <h5 class="card-title mb-0"><%= t('content') %></h5>
-        </div>
-        <div class="card-body">
-          <%= f.input :name %>
-          <%= render 'admin/application/summary/form', f: f, about: category %>
-        </div>
-      </div>
+      <%= osuny_panel t('content') do %>
+        <%= f.input :name %>
+        <%= render 'admin/application/summary/form', f: f, about: category %>
+      <% end %>
       <%= render 'admin/application/meta_description/form', f: f, about: category %>
     </div>
     <div class="col-md-4">
-      <div class="card flex-fill w-100">
-        <div class="card-header">
-          <h5 class="card-title mb-0"><%= t('metadata') %></h5>
-        </div>
-        <div class="card-body">
-          <%= f.input :slug,
-                      as: :string,
-                      input_html: category.persisted? ? {} : {
-                        class: 'js-slug-input',
-                        data: { source: '#communication_website_category_name' }
-                      } %>
-          <%= f.association :parent,
-                            collection: collection_tree(@website.categories.for_language(current_website_language), category),
-                            label_method: ->(p) { sanitize p[:label] },
-                            value_method: ->(p) { p[:id] } %>
-          <ul>
-          </ul>
-        </div>
-      </div>
+      <%= osuny_panel t('metadata') do %>
+        <%= f.input :slug,
+                    as: :string,
+                    input_html: category.persisted? ? {} : {
+                      class: 'js-slug-input',
+                      data: { source: '#communication_website_category_name' }
+                    } %>
+        <%= f.association :parent,
+                          collection: collection_tree(@website.categories.for_language(current_website_language), category),
+                          label_method: ->(p) { sanitize p[:label] },
+                          value_method: ->(p) { p[:id] } %>
+      <% end %>
       <%= render 'admin/application/featured_image/edit', about: category, f: f %>
     </div>
   </div>
diff --git a/app/views/admin/dashboard/index.html.erb b/app/views/admin/dashboard/index.html.erb
index 55aa138b2dcff0bdfdde3b336e4935d16527d6e0..e067d7978729903f04eda3bb49b8835ec5664efc 100644
--- a/app/views/admin/dashboard/index.html.erb
+++ b/app/views/admin/dashboard/index.html.erb
@@ -14,14 +14,14 @@
     <%= osuny_panel t('hello', name: current_user.first_name) do %>
       <% if current_admin_theme == 'appstack' %>
         <p>
-          Osuny a un nouveau thème pour l'administration, "Pure". <br>
-          Voulez-vous l'essayer ?
+          Osuny a un nouveau thème pour l'administration, "Pure".
+          Voulez-vous l'essayer ?
         </p>
         <%= link_to 'Changer de thème', admin_set_theme_path(theme: 'pure'), method: :put %>
       <% else %>
         <p>
-          Vous utilisez le thème "Pure" pour l'administration. <br>
-          Voulez-vous revenir au thème "Appstack" ?
+          Vous utilisez le thème "Pure" pour l'administration.
+          Voulez-vous revenir au thème "Appstack" ?
         </p>
         <%= link_to 'Changer de thème', admin_set_theme_path(theme: 'appstack'), method: :put %>
       <% end %>
@@ -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/preview.html.erb b/app/views/admin/layouts/preview.html.erb
index a75239683c70872f68070b3db699cacd49ef0ee0..1ee741dd02b5fa49d9d8ab6bdc8806e224b6004c 100644
--- a/app/views/admin/layouts/preview.html.erb
+++ b/app/views/admin/layouts/preview.html.erb
@@ -35,4 +35,5 @@
       </div>
     </main>
   </body>
+  <script src="https://example.osuny.org/js/preview.js"></script>
 </html>
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 3eb4d9c0fd4a4d0267a3690abb98fc14699dbe02..444e6207a83943f4906d626cf1b5fed187a2d67f 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..e200bb69b183fa9beed2eb58dd97691d74c7f1c1 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,42 +12,37 @@
   <% 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="form-inputs">
-        <div class="form-group required mt-0">
-          <%= text_field_tag :code,
-                              '',
-                              type: 'tel',
-                              pattern: '\d*',
-                              required: true,
-                              autofocus: true,
-                              autocomplete: 'off',
-                              class: 'form-control string required'%>
-          <p class="mt-2 mb-0">
-            <% if resource.direct_otp %>
-              <%= link_to t('devise.two_factor_authentication.resend_code'), [:resend_code, resource_name, :two_factor_authentication] %>
-            <% else %>
-              <%= link_to t('devise.two_factor_authentication.send_code_instead'), [:resend_code, resource_name, :two_factor_authentication] %>
-            <% end %>
-            <% unless resource.mobile_phone.blank? # when phone is blank default code method is already :email so we don't need another link %>
-              • <%= link_to t('devise.two_factor_authentication.send_email_code'), [:resend_code, resource_name, :two_factor_authentication, delivery_method: :email] %>
-            <% end %>
-          </p>
-        </div>
-      </div>
-    </div>
-    <div class="col-md-6">
-      <%= link_to t('devise.shared.links.sign_out'),
-                  destroy_user_session_path,
-                  method: :delete,
-                  class: "btn btn-danger float-end" %>
+  <div class="form-inputs">
+    <div class="input-group required mt-0" style="max-width: 400px">
+      <%= text_field_tag :code,
+                          '',
+                          type: 'tel',
+                          pattern: '\d*',
+                          required: true,
+                          autofocus: true,
+                          autocomplete: 'off',
+                          class: 'form-control string required'%>
       <%= f.button  :submit,
                     t('devise.two_factor_authentication.validate'),
                     class: "btn btn-primary" %>
     </div>
+    <p class="mt-4 mb-5">
+      <% if resource.direct_otp %>
+        <%= link_to t('devise.two_factor_authentication.resend_code'), [:resend_code, resource_name, :two_factor_authentication] %>
+      <% else %>
+        <%= link_to t('devise.two_factor_authentication.send_code_instead'), [:resend_code, resource_name, :two_factor_authentication] %>
+      <% end %>
+      <% unless resource.mobile_phone.blank? # when phone is blank default code method is already :email so we don't need another link %>
+        • <%= link_to t('devise.two_factor_authentication.send_email_code'), [:resend_code, resource_name, :two_factor_authentication, delivery_method: :email] %>
+      <% end %>
+    </p>
   </div>
 <% end %>
+
+<%= link_to t('devise.shared.links.sign_out'),
+            destroy_user_session_path,
+            method: :delete,
+            class: "btn btn-outline-danger" %>
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/extranet/posts/posts/show.html.erb b/app/views/extranet/posts/posts/show.html.erb
index 95b9aa46b1e3aa1863848e92adf087190dd7a9e5..d7bac998f9072f36ee92d940ed5d823b5a293db0 100644
--- a/app/views/extranet/posts/posts/show.html.erb
+++ b/app/views/extranet/posts/posts/show.html.erb
@@ -1,20 +1,27 @@
-<% content_for :title, @post %>
-
-<% content_for :header_right do %>
-  <% if @post.featured_image.attached? %>
-    <figure <% if @post.featured_image_credit.present? %>class="with-credit"<% end %>>
-      <%= kamifusen_tag @post.featured_image, class: 'img-fluid', width: 300 %>
-      <% if @post.featured_image_credit.present? %>
-        <figcaption tabindex="0">
-            <%= sanitize @post.featured_image_credit %>
-        </figcaption>
-      <% end %>
-    </figure>
-  <% end %>
+<% content_for :header do %>
+  <div class="header__info">
+    <h1><%= @post %></h1>
+    <% if @post.published_at %>
+      <p>Publié le <%= l @post.published_at.to_date, format: :long %></p>
+    <% end %>
+    <% if @post.category %>
+      <p>Catégorie : <%= link_to @post.category, posts_category_path(slug: @post.category.slug) %></p>
+    <% end %>
+  </div>
+  <div class="header__additional_data">
+    <% if @post.featured_image.attached? %>
+      <figure <% if @post.featured_image_credit.present? %>class="with-credit"<% end %>>
+        <%= kamifusen_tag @post.featured_image, class: 'img-fluid', width: 300 %>
+        <% if @post.featured_image_credit.present? %>
+          <figcaption tabindex="0">
+              <%= sanitize @post.featured_image_credit %>
+          </figcaption>
+        <% end %>
+      </figure>
+    <% end %>
+  </div>
 <% end %>
 
-<%= link_to @post.category, posts_category_path(slug: @post.category.slug) if @post.category %>
-
 </main>
 <%= render 'admin/communication/blocks/index_show', about: @post %>
 <main>
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 36855bb24ac26295dbdf73898c3e6ebb0d3fb845..fce893ea643ce0fe90c9c30ddbf6602ddda1f078 100644
--- a/config/locales/communication/en.yml
+++ b/config/locales/communication/en.yml
@@ -70,7 +70,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
@@ -131,7 +130,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
@@ -367,6 +365,27 @@ en:
                 label: Iframe title (mandatory for accessibility)
                 placeholder: Enter the title
               warning: Beware, the code below is used as is, without any security filtering. Be extremely careful and never integrate possibly unreliable code.
+          features:
+            description: A list of features with images (often icons) and a description.
+            edit:
+              add_element: Add feature
+              remove_element: Remove feature
+              element:
+                image:
+                  label: Image (.png, .jpg, .svg)
+                  remove: Remove image
+                alt:
+                  label: Alternative text
+                  placeholder: Enter text description
+                credit:
+                  label: Credit
+                  placeholder: Enter image's credit here
+                title:
+                  label: Title
+                  placeholder: Enter title here
+                description:
+                  label: Text
+                  placeholder: Enter text here
           files:
             description: A list of downloadable files, mentioning their file size.
             edit:
@@ -618,6 +637,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:
@@ -707,6 +731,7 @@ en:
           datatable: Table
           definitions: Definitions
           embed: HTML embed
+          features: Features
           files: Files
           gallery: Gallery
           image: Image
diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml
index 02c715e7f02e004b249095a7cc84cb77be4946db..aaf749fa32e4f19e8255da850d9634916908f7e8 100644
--- a/config/locales/communication/fr.yml
+++ b/config/locales/communication/fr.yml
@@ -70,7 +70,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
@@ -131,7 +130,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
@@ -367,6 +365,27 @@ fr:
                 label: Titre de l'iframe (nécessaire pour l'accessibilité)
                 placeholder: Entrer le titre
               warning: Attention, le code ci-dessous est intégré tel quel, sans filtrage de sécurité. N'intégrez jamais de code externe dont la fiabilité n'est pas certaine.
+          features:
+            description: Une liste de fonctionnalités avec des images, par exemple des icônes, et une description.
+            edit:
+              add_element: Ajouter une fonctionnalité
+              remove_element: Supprimer la fonctionnalité
+              element:
+                image:
+                  label: Image (.png, .jpg, .svg)
+                  remove: Enlever l'image
+                alt:
+                  label: Texte alternatif
+                  placeholder: Entrer la description textuelle
+                credit:
+                  label: Crédit
+                  placeholder: Entrer le crédit de l'image ici
+                title:
+                  label: Titre
+                  placeholder: Entrer le titre de la fonctionnalité
+                description:
+                  label: Texte
+                  placeholder: Entrer la description de la fonctionnalité
           files:
             description: Une liste de fichiers téléchargeables, présentés avec leur poids.
             edit:
@@ -618,6 +637,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:
@@ -707,6 +731,7 @@ fr:
           datatable: Tableau
           definitions: Définitions
           embed: Intégration HTML
+          features: Fonctionnalités
           files: Fichiers
           gallery: Galerie
           image: Image
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 a0a5498f52cde0aafcaf7f38e3fd900062b608e7..8bd6bbcebb2bc9c60421d9ab95f3a40ec461be3e 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 c55562e9c2230e5af1087f7637fc063fea561a6a..46b0b74ea80e7e158c83b86080cbeb7d36e061a7 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 8343f3524ad015b1cf380847672ad7720c0aca1c..58543b1e982cae2a4a0729cbc6f1e82e7c910a43 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -782,6 +782,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_21_213542) 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"