diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js
index cd6e7e2d284eb0ccd0b317aa0bfe03f33c95bad2..78287d1c61c91076bbcd78c89f0ef865eceebd42 100644
--- a/app/assets/javascripts/admin.js
+++ b/app/assets/javascripts/admin.js
@@ -14,6 +14,7 @@
 //= require cocoon
 //= require_self
 //= require_tree ./admin/commons
+//= require_tree ./application/plugins
 //= require_tree ./admin/plugins
 //= require ./admin/communication/init
 
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 66678c1d2bf190af84483be6bf38dfea2ef5e3c5..3dba7831cf39d1cacac76563a98d6a3c3f79bcf5 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -7,7 +7,9 @@
 //= require jquery-cropper/dist/jquery-cropper
 //= require simple_form_password_with_hints
 //= require simple_form_bs5_file_input
+//= require summernote/summernote-bs5
 //= require gdpr/cookie_consent
+//= require_tree ./application/plugins
 //= require_self
 
 window.osuny = {};
diff --git a/app/assets/javascripts/admin/plugins/summernote-paste.js b/app/assets/javascripts/application/plugins/summernote-paste.js
similarity index 100%
rename from app/assets/javascripts/admin/plugins/summernote-paste.js
rename to app/assets/javascripts/application/plugins/summernote-paste.js
diff --git a/app/assets/javascripts/admin/plugins/summernote.js b/app/assets/javascripts/application/plugins/summernote.js
similarity index 100%
rename from app/assets/javascripts/admin/plugins/summernote.js
rename to app/assets/javascripts/application/plugins/summernote.js
diff --git a/app/assets/stylesheets/extranet.sass b/app/assets/stylesheets/extranet.sass
index a7f67a49f885fdbc97f2e650b618243bfa92464b..b3b6e7fd9f16685f8ff1857e7ef61dbc19268ca1 100644
--- a/app/assets/stylesheets/extranet.sass
+++ b/app/assets/stylesheets/extranet.sass
@@ -8,6 +8,7 @@
 @import 'bootstrap-print-css/css/bootstrap-print.min'
 @import 'simple_form_password_with_hints'
 @import 'simple_form_bs5_file_input'
+@import 'summernote-bs5'
 @import 'gdpr/cookie_consent'
 @import 'cropperjs/dist/cropper'
 
@@ -17,3 +18,5 @@
 @import 'extranet/_default/layouts/*'
 @import 'extranet/_default/components/*'
 @import 'extranet/_default/pages/*'
+
+@import 'commons/summernote'
diff --git a/app/controllers/extranet/account_controller.rb b/app/controllers/extranet/account_controller.rb
index de458497330aadcfbbc1a04829406014cfa99883..47ded2d779c9b8130fc550c697a9ea505cef683a 100644
--- a/app/controllers/extranet/account_controller.rb
+++ b/app/controllers/extranet/account_controller.rb
@@ -4,7 +4,7 @@ class Extranet::AccountController < Extranet::ApplicationController
     @person = current_user.person
     breadcrumb
   end
-  
+
   def edit
     breadcrumb
     add_breadcrumb t('extranet.account.edit')
diff --git a/app/controllers/extranet/personal_data_controller.rb b/app/controllers/extranet/personal_data_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..11c7942b9a8f76fcbfd9b758627cdc7b46e88e07
--- /dev/null
+++ b/app/controllers/extranet/personal_data_controller.rb
@@ -0,0 +1,40 @@
+class Extranet::PersonalDataController < Extranet::ApplicationController
+  before_action :load_person
+
+  def show
+    # Superadmins don't have a person
+    breadcrumb
+  end
+
+  def edit
+    breadcrumb
+    add_breadcrumb t('extranet.personal_data.edit')
+  end
+
+  def update
+    @person.update person_params
+    redirect_to personal_data_path, notice: t('extranet.personal_data.updated')
+  end
+
+  private
+
+  def load_person
+    @person = current_user.person
+    raise CanCan::AccessDenied if @person.nil?
+  end
+
+  def person_params
+    params.require(:university_person)
+          .permit(
+            :gender, :birthdate, :description_short, :biography,
+            :phone_mobile, :phone_professional, :phone_personal,
+            :address, :zipcode, :city, :country,
+            :url, :linkedin, :twitter
+          )
+  end
+
+  def breadcrumb
+    super
+    add_breadcrumb t('extranet.personal_data.title'), personal_data_path
+  end
+end
diff --git a/app/models/university/person.rb b/app/models/university/person.rb
index b74f00a392a408651b58a48fc7c5814a4de6bc87..ca6f03bb53cd18eed81fd58c44d6a838fef478df 100644
--- a/app/models/university/person.rb
+++ b/app/models/university/person.rb
@@ -213,6 +213,11 @@ class University::Person < ApplicationRecord
     teacher.for_website?(website)
   end
 
+  def full_street_address
+    return nil if [address, zipcode, city].all?(&:blank?)
+    [address, "#{zipcode} #{city} #{country}".strip].join(', ')
+  end
+
   protected
 
   def explicit_blob_ids
diff --git a/app/views/admin/university/people/_form.html.erb b/app/views/admin/university/people/_form.html.erb
index cfc7beed1bcac347f7cba46deba5c7f5cd7f4259..3244a9df718c303227d9b636ca2be56d3dcc2faa 100644
--- a/app/views/admin/university/people/_form.html.erb
+++ b/app/views/admin/university/people/_form.html.erb
@@ -38,7 +38,6 @@
           </h5>
         </div>
         <div class="card-body">
-
           <div class="row">
             <div class="col-md-6">
               <%= f.input :email %>
diff --git a/app/views/extranet/personal_data/edit.html.erb b/app/views/extranet/personal_data/edit.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..cd5d4cdcd0ce15d448f8f04b39400932bb185a2f
--- /dev/null
+++ b/app/views/extranet/personal_data/edit.html.erb
@@ -0,0 +1,63 @@
+<% content_for :title, @person %>
+
+<%= simple_form_for @person, url: personal_data_path do |f| %>
+  <%= f.error_notification %>
+  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
+
+  <h5><%= University::Person.human_attribute_name('essentials') %></h5>
+
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :gender, label_method: lambda { |g| t("activerecord.attributes.university/person.genders.#{g[1]}") } %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :birthdate, discard_year: true, include_blank: true %>
+    </div>
+  </div>
+  <%= f.input :description_short %>
+  <%= f.input :biography, as: :summernote %>
+
+  <h5><%= University::Person.human_attribute_name('contacts') %></h5>
+
+  <div class="row">
+    <div class="col-md-4">
+      <%= f.input :phone_mobile %>
+    </div>
+    <div class="col-md-4">
+      <%= f.input :phone_professional %>
+    </div>
+    <div class="col-md-4">
+      <%= f.input :phone_personal %>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :address %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :zipcode %>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :city %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :country, input_html: { class: 'form-select' } %>
+    </div>
+  </div>
+
+  <h5><%= University::Person.human_attribute_name('socials') %></h5>
+
+  <%= f.input :url %>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :linkedin %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :twitter %>
+    </div>
+  </div>
+
+  <%= submit f %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/extranet/personal_data/show.html.erb b/app/views/extranet/personal_data/show.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..687b93f94eb579ba778dca3356e5ca12f336f77d
--- /dev/null
+++ b/app/views/extranet/personal_data/show.html.erb
@@ -0,0 +1,56 @@
+<% content_for :title, @person %>
+
+<%= render 'extranet/persons/header', person: @person unless @person.nil? %>
+
+<div class="row">
+  <div class="col-md-9">
+    <div class="biography">
+      <p><%= @person&.biography %></p>
+
+      <h5><%= University::Person.human_attribute_name('contacts') %></h5>
+
+      <% [:phone_mobile, :phone_personal, :phone_professional].each do |attribute_name| %>
+        <% next if @person.public_send(attribute_name).blank? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name(attribute_name) %> :</strong>
+          <%= @person.public_send(attribute_name) %>
+        </p>
+      <% end %>
+
+      <% if @person.full_street_address.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("address") %> :</strong>
+          <%= @person.full_street_address %>
+        </p>
+      <% end %>
+
+      <h5><%= University::Person.human_attribute_name('socials') %></h5>
+
+      <% if @person.url.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("url") %> :</strong>
+          <%= link_to @person.url, @person.url %>
+        </p>
+      <% end %>
+
+      <% if @person.linkedin.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("linkedin") %> :</strong>
+          <%= link_to @person.linkedin, @person.linkedin %>
+        </p>
+      <% end %>
+
+      <% if @person.twitter.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("twitter") %> :</strong>
+            <%= link_to @person.twitter, "https://twitter.com/#{@person.twitter}" %>
+        </p>
+      <% end %>
+    </div>
+  </div>
+  <div class="col-md-3">
+    <div class="mb-4">
+      <%= link_to t('extranet.personal_data.edit'), edit_personal_data_path, class: 'btn btn-primary' %>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/config/locales/extranet/en.yml b/config/locales/extranet/en.yml
index 44d243513f633d0754e9d00d4f410cea0dd1eb40..f723b913924a2a14c9cf2771cfa51687cccf2385 100644
--- a/config/locales/extranet/en.yml
+++ b/config/locales/extranet/en.yml
@@ -17,3 +17,7 @@ en:
     menu: Menu
     organization:
       experiences: Alumni in this organization (%{count})
+    personal_data:
+      edit: Edit
+      title: My personal data
+      updated: Your personal data has been updated!
diff --git a/config/locales/extranet/fr.yml b/config/locales/extranet/fr.yml
index ad237f29afc03f1e3ee2c6f3f27264a08f1a596d..1f95f17b54ce9530400306f9fd256b4b05962706 100644
--- a/config/locales/extranet/fr.yml
+++ b/config/locales/extranet/fr.yml
@@ -17,3 +17,7 @@ fr:
     menu: Menu
     organization:
       experiences: Alumni dans cette organisation (%{count})
+    personal_data:
+      edit: Modifier
+      title: Mes données personnelles
+      updated: Mise à jour des donnes personnelles effectuée !
diff --git a/config/navigation.rb b/config/navigation.rb
index d134fb412b518c612ca6a9b9ac4caa85df34ea5d..c219ff1dcbe58f55120f3277b79d17225e6d7aef 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -16,6 +16,9 @@ SimpleNavigation::Configuration.run do |navigation|
     primary.item  :organizations,
                   University::Organization.model_name.human(count: 2),
                   university_organizations_path
+    primary.item  :personal_data,
+                  t('extranet.personal_data.title'),
+                  personal_data_path
     primary.item  :account,
                   t('extranet.account.my'),
                   account_path
diff --git a/config/routes/extranet.rb b/config/routes/extranet.rb
index 905cf1b2eef45cb2310f08f964e68e03a71fe12b..d4f428f03840211099f49c9ea0f84582f857fbdd 100644
--- a/config/routes/extranet.rb
+++ b/config/routes/extranet.rb
@@ -6,10 +6,13 @@ get 'persons' => 'extranet/persons#index', as: :university_persons
 get 'persons/:id' => 'extranet/persons#show', as: :university_person
 get 'years' => 'extranet/academic_years#index', as: :education_academic_years
 get 'years/:id' => 'extranet/academic_years#show', as: :education_academic_year
-get 'account' => 'extranet/account#show', as: :account 
-get 'account/edit' => 'extranet/account#edit', as: :edit_account 
+get 'account' => 'extranet/account#show', as: :account
+get 'account/edit' => 'extranet/account#edit', as: :edit_account
 patch 'account' => 'extranet/account#update'
-scope :account do 
+scope :account do
   resources :experiences, controller: 'extranet/experiences', except: [:index, :show]
 end
+get 'personal_data' => 'extranet/personal_data#show', as: :personal_data
+get 'personal_data/edit' => 'extranet/personal_data#edit', as: :edit_personal_data
+patch 'personal_data' => 'extranet/personal_data#update'
 root to: 'extranet/home#index'
diff --git a/db/schema.rb b/db/schema.rb
index 0afe11214982c354e9716a90f0165f7d3c0b9d73..35be76a1c3a946de043491d4c0da19d25bbac126 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -44,7 +44,7 @@ ActiveRecord::Schema.define(version: 2022_10_20_141837) do
     t.text "metadata"
     t.string "service_name", null: false
     t.bigint "byte_size", null: false
-    t.string "checksum", null: false
+    t.string "checksum"
     t.datetime "created_at", null: false
     t.uuid "university_id"
     t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true