diff --git a/app/controllers/extranet/organizations_controller.rb b/app/controllers/extranet/organizations_controller.rb
index a4db07abddd011b52b2197b114513ade47cad9f1..af318f25a12e5deabde835ae1e8818b5be56f243 100644
--- a/app/controllers/extranet/organizations_controller.rb
+++ b/app/controllers/extranet/organizations_controller.rb
@@ -1,4 +1,5 @@
 class Extranet::OrganizationsController < Extranet::ApplicationController
+  before_action :load_organization, only: [:show, :edit, :update]
 
   def search
     @term = params[:term].to_s
@@ -7,5 +8,67 @@ class Extranet::OrganizationsController < Extranet::ApplicationController
                                       .ordered
   end
 
+  def show
+    breadcrumb
+  end
+
+  def new
+    @organization = current_university.organizations.new
+    @organization.name = params[:name] if params.has_key?(:name)
+    breadcrumb
+    add_breadcrumb t('create')
+  end
+
+  def create
+    @organization = current_university.organizations.new(organization_params)
+    if @organization.save
+      redirect_to organization_path(@organization),
+                  notice: t('admin.successfully_created_html', model: @organization.to_s)
+    else
+      breadcrumb
+      add_breadcrumb t('create')
+      render :new, status: :unprocessable_entity
+    end
+  end
+
+  def edit
+    breadcrumb
+    add_breadcrumb t('edit')
+  end
+
+  def update
+    if @organization.update(organization_params)
+      redirect_to organization_path(@organization),
+                  notice: t('admin.successfully_updated_html', model: @organization.to_s)
+    else
+      breadcrumb
+      add_breadcrumb t('edit')
+      render :new, status: :unprocessable_entity
+    end
+  end
+
+  private
+
+  def breadcrumb
+    super
+    add_breadcrumb  University::Organization.model_name.human(count: 2)
+    add_breadcrumb @organization, organization_path(@organization) if @organization.persisted?
+  end
+
+  def load_organization
+    # this is an "experience" organization so it can be not connected to the extranet
+    @organization = current_university.organizations.find_by!(id: params[:id])
+  end
+
+  def organization_params
+    params.require(:university_organization)
+          .permit(
+            :name, :long_name, :summary, :siren, :kind,
+            :address, :address_name, :address_additional, :zipcode, :city, :country, :text,
+            :url, :phone, :email, :linkedin, :twitter, :mastodon,
+            :logo, :logo_delete, :logo_infos,
+            :logo_on_dark_background, :logo_on_dark_background_delete, :logo_on_dark_background_infos,
+          )
+  end
 
 end
diff --git a/app/views/extranet/organizations/_form.html.erb b/app/views/extranet/organizations/_form.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..21d1904fcb3aae321d04ec8d44ba9635165837bf
--- /dev/null
+++ b/app/views/extranet/organizations/_form.html.erb
@@ -0,0 +1,92 @@
+<% url = organization.persisted? ? organization_path(organization) : organizations_path %>
+<%= simple_form_for organization, url: url do |f| %>
+  <%= f.error_notification %>
+  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
+
+  <div class="row">
+    <div class="col-xl-6">
+      <%= f.input :name %>
+      <%= render 'admin/application/summary/form', f: f, about: organization %>
+      <%= f.input :text,
+                  as: :summernote,
+                  input_html: {
+                    data: { 'summernote-config' => 'mini-list' }
+                  } %>
+
+      <h2><%= University::Organization.human_attribute_name('legal') %></h2>
+      <div class="row">
+        <div class="col-xl-6">
+          <%= f.input :long_name %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :kind, include_blank: false %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :siren %>
+        </div>
+      </div>
+    </div>
+
+    <div class="col-xl-6">
+      <h2><%= University::Organization.human_attribute_name('physical') %></h2>
+      <div class="row">
+        <div class="col-xl-6">
+          <%= f.input :address_name %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :address %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :address_additional %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :zipcode %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :city %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :country, input_html: { class: 'form-select' } %>
+        </div>
+      </div>
+
+      <h2><%= University::Organization.human_attribute_name('digital') %></h2>
+      <div class="row">
+        <div class="col-xl-6">
+          <%= f.input :url %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :phone %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :email %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :linkedin %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :twitter %>
+        </div>
+        <div class="col-xl-6">
+          <%= f.input :mastodon %>
+        </div>
+      </div>
+
+      <h2><%= University::Organization.human_attribute_name('logos') %></h2>
+      <%= f.input :logo,
+                  as: :single_deletable_file,
+                  input_html: { accept: '.jpg,.jpeg,.png,.svg' },
+                  preview: 200,
+                  resize: false,
+                  direct_upload: true %>
+      <%= f.input :logo_on_dark_background,
+                  as: :single_deletable_file,
+                  input_html: { accept: '.jpg,.jpeg,.png,.svg' },
+                  preview: 200,
+                  resize: false,
+                  direct_upload: true %>
+    </div>
+
+  </div>
+  <%= submit f %>
+<% end %>
diff --git a/app/views/extranet/organizations/edit.html.erb b/app/views/extranet/organizations/edit.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..8e990f07344d2b5384fcbe9aaa67cbce7e2000ce
--- /dev/null
+++ b/app/views/extranet/organizations/edit.html.erb
@@ -0,0 +1,3 @@
+<% content_for :title, @organization %>
+
+<%= render 'form', organization: @organization %>
diff --git a/app/views/extranet/organizations/new.html.erb b/app/views/extranet/organizations/new.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..96d61c5358d2c3ff3efb5df4fb854c9cbe98b367
--- /dev/null
+++ b/app/views/extranet/organizations/new.html.erb
@@ -0,0 +1,3 @@
+<% content_for :title, University::Organization.model_name.human %>
+
+<%= render 'form', organization: @organization %>
diff --git a/app/views/extranet/organizations/show.html.erb b/app/views/extranet/organizations/show.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..d45b20164b2363af7bfc5702a857e13f855662c6
--- /dev/null
+++ b/app/views/extranet/organizations/show.html.erb
@@ -0,0 +1,149 @@
+<% content_for :title, @organization %>
+<div class="row">
+  <div class="col-md-8">
+    <%= render 'admin/application/summary/show', about: @organization %>
+
+    <%= osuny_panel University::Organization.human_attribute_name('text') do %>
+      <%= @organization.text.to_s.html_safe %>
+    <% end if strip_tags(@organization.text.to_s).present? %>
+
+    <%= osuny_panel University::Organization.human_attribute_name('physical') do %>
+      <div class="row pure__row--small">
+        <% [
+            :address_name,
+            :address,
+            :address_additional,
+            :zipcode,
+            :city,
+          ].each do |property| %>
+          <% value = @organization.send property %>
+          <% next if value.blank? %>
+          <div class="col-xxl-6">
+            <%= osuny_label University::Organization.human_attribute_name(property) %>
+            <p><%= value %></p>
+          </div>
+        <% end %>
+        <% if @organization.country.present? %>
+          <div class="col-xxl-6">
+            <%= osuny_label University::Organization.human_attribute_name('country') %>
+            <p><%= ISO3166::Country[@organization.country].common_name %></p>
+          </div>
+        <% end %>
+        <% if @organization.geolocated? %>
+          <div class="col-xxl-6">
+            <%= osuny_label University::Organization.human_attribute_name('geolocation') %>
+            <p><%= @organization.geo_point.to_s %></p>
+          </div>
+        <% end %>
+      </div>
+    <% end %>
+    <%= osuny_panel University::Organization.human_attribute_name('digital') do %>
+      <div class="row pure__row--small">
+        <% unless @organization.url.blank? %>
+          <div class="col-xxl-6">
+            <%= osuny_label University::Organization.human_attribute_name('url') %>
+            <p><%= link_to  @organization.url,
+                            @organization.url,
+                            target: :_blank %></p>
+          </div>
+        <% end %>
+        <% [
+          :phone,
+              :email,
+              :linkedin,
+              :twitter,
+              :mastodon
+            ].each do |property| %>
+          <% value = @organization.send property %>
+          <% next if value.blank? %>
+          <div class="col-xxl-6">
+            <%= osuny_label University::Organization.human_attribute_name(property) %>
+            <p><%= value %></p>
+          </div>
+        <% end %>
+      </div>
+    <% end %>
+
+
+    <%= osuny_panel University::Organization.human_attribute_name('legal') do %>
+      <div class="row pure__row--small">
+        <div class="col-xxl-6">
+          <%= osuny_label University::Organization.human_attribute_name('long_name') %>
+          <p><%= @organization.long_name %></p>
+        </div>
+        <div class="col-xxl-6">
+          <%= osuny_label University::Organization.human_attribute_name('kind') %>
+          <p><%= @organization.kind_i18n %></p>
+        </div>
+        <div class="col-xxl-6">
+          <%= osuny_label University::Organization.human_attribute_name('siren') %>
+          <p><%= @organization.siren %></p>
+        </div>
+      </div>
+    <% end %>
+
+    <%= render 'admin/communication/blocks/list', about: @organization %>
+  </div>
+
+  <div class="col-md-4">
+    <%= osuny_panel t('metadata') do %>
+      <%= osuny_label University::Organization.human_attribute_name('slug') %>
+      <p><%= @organization.slug %></p>
+      <%= osuny_label University::Organization.human_attribute_name('active') %>
+      <p><%= t @organization.active %></>
+    <% end %>
+
+    <%= osuny_panel t('university.organization.logo') do %>
+      <% if @organization.logo.attached? %>
+        <%= osuny_label University::Organization.human_attribute_name('logo') %><br>
+        <%= kamifusen_tag @organization.logo, class: 'img-fluid img-fill bg-light img-thumbnail p-5 mb-3' %>
+      <% end %>
+      <% if @organization.logo_on_dark_background.attached? %>
+        <%= osuny_label University::Organization.human_attribute_name('logo_on_dark_background') %><br>
+        <%= kamifusen_tag @organization.logo_on_dark_background, class: 'img-fluid img-fill bg-dark img-thumbnail p-5' %>
+      <% end %>
+    <% end if @organization.logo.attached? || @organization.logo_on_dark_background.attached? %>
+
+    <%= render 'admin/application/meta_description/show', about: @organization %>
+  </div>
+</div>
+
+<% if @organization.experiences.any? %>
+  <h2><%= t('university.organization.employees') %></h2>
+
+  <div class="table-responsive">
+    <table class="<%= table_classes %>">
+      <thead>
+        <tr>
+          <th><%= University::Person.human_attribute_name('last_name') %></th>
+          <th><%= University::Person.human_attribute_name('first_name') %></th>
+          <th><%= t('university.person.experience.period') %></th>
+        </tr>
+      </thead>
+      <tbody>
+        <% @organization.experiences.ordered.each do |experience| %>
+          <%
+            alumnus = experience.person
+            path = admin_university_alumnus_path(alumnus)
+          %>
+          <tr>
+            <td><%= link_to_if can?(:read, alumnus), alumnus.last_name, path %></td>
+            <td><%= link_to_if can?(:read, alumnus), alumnus.first_name, path %></td>
+            <td>
+              <%= "#{experience.from_year} - #{experience.to_year.present? ? experience.to_year : t('today')}" %>
+            </td>
+          </tr>
+        <% end %>
+      </tbody>
+    </table>
+  </div>
+<% end %>
+
+<% content_for :action_bar_left do %>
+  <%= destroy_link @organization %>
+  <%= static_link static_admin_university_organization_path(@organization) %>
+<% end %>
+
+<% content_for :action_bar_right do %>
+  <%= edit_link @organization %>
+<% end %>
diff --git a/config/routes/extranet.rb b/config/routes/extranet.rb
index a6a2a200d6c3e96b8447b6d2fe33c9c5b5835450..f62c4b0e96b0d094f1efd00c227b73f203a6d586 100644
--- a/config/routes/extranet.rb
+++ b/config/routes/extranet.rb
@@ -18,7 +18,7 @@ namespace :alumni do
   get 'years/:id' => 'academic_years#show', as: :education_academic_year
   root to: 'persons#index'
 end
-resources :organizations, except: :destroy do
+resources :organizations, except: [:index, :destroy] do
   collection do
     get 'search' => 'organizations#search', as: :search, defaults: { format: 'json' }
   end