diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb
index 5ed9a73d73fa8e1c8daccd9e9fa2e0b9ce34d82d..95c1434d3d0d0be58a17972bdab798dc7af51df8 100644
--- a/app/controllers/admin/application_controller.rb
+++ b/app/controllers/admin/application_controller.rb
@@ -2,6 +2,7 @@ class Admin::ApplicationController < ApplicationController
   layout 'admin/layouts/application'
 
   before_action :authenticate_user!
+  before_action :set_locale
 
   protected
 
@@ -20,4 +21,9 @@ class Admin::ApplicationController < ApplicationController
     object.persisted? ? add_breadcrumb(object, [:admin, object, options])
                       : add_breadcrumb('Créer')
   end
+
+  def set_locale
+    return unless current_user
+    # I18n.locale = current_user.locale
+  end
 end
diff --git a/app/controllers/server/languages_controller.rb b/app/controllers/server/languages_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..05a3de53047d54b9ea68735cecd77f606b7bcd16
--- /dev/null
+++ b/app/controllers/server/languages_controller.rb
@@ -0,0 +1,62 @@
+class Server::LanguagesController < Server::ApplicationController
+  load_and_authorize_resource
+
+  def index
+    breadcrumb
+  end
+
+  def show
+    breadcrumb
+  end
+
+  def new
+    breadcrumb
+  end
+
+  def edit
+    breadcrumb
+    add_breadcrumb 'Modifier'
+  end
+
+  def create
+    breadcrumb
+    if @language.save
+      redirect_to @language, notice: "Language was successfully created."
+    else
+      render :new, status: :unprocessable_entity
+    end
+  end
+
+  def update
+    breadcrumb
+    add_breadcrumb 'Modifier'
+    if @language.update(language_params)
+      redirect_to @language, notice: "Language was successfully updated."
+    else
+      render :edit, status: :unprocessable_entity
+    end
+  end
+
+  def destroy
+    @language.destroy
+    redirect_to languages_url, notice: "Language was successfully destroyed."
+  end
+
+  protected
+
+  def breadcrumb
+    super
+    add_breadcrumb Language.model_name.human(count: 2), server_languages_path
+    if @language
+      if @language.persisted?
+        add_breadcrumb @language, [:server, @language]
+      else
+        add_breadcrumb 'Créer'
+      end
+    end
+  end
+
+  def language_params
+    params.require(:language).permit(:name, :iso_code)
+  end
+end
diff --git a/app/controllers/server/universities_controller.rb b/app/controllers/server/universities_controller.rb
index 196f639dc00f9532556a36412997afeced0c1ccd..efd9c6e57744ba825cad4706afccfc9efb60400e 100644
--- a/app/controllers/server/universities_controller.rb
+++ b/app/controllers/server/universities_controller.rb
@@ -33,6 +33,7 @@ class Server::UniversitiesController < Server::ApplicationController
 
   def update
     breadcrumb
+    add_breadcrumb 'Modifier'
     respond_to do |format|
       if @university.update(university_params)
         format.html { redirect_to [:server, @university], notice: "University was successfully updated." }
diff --git a/app/models/language.rb b/app/models/language.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b6f2b20ac33e96cfef8078aa499ef9ebba903fd8
--- /dev/null
+++ b/app/models/language.rb
@@ -0,0 +1,18 @@
+# == Schema Information
+#
+# Table name: languages
+#
+#  id         :uuid             not null, primary key
+#  iso_code   :string
+#  name       :string
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+class Language < ApplicationRecord
+
+  validates_uniqueness_of :iso_code
+
+  def to_s
+    "#{name}"
+  end
+end
diff --git a/app/views/server/languages/_form.html.erb b/app/views/server/languages/_form.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..17a932c39d4287ca2f2b7996327b203c9281097f
--- /dev/null
+++ b/app/views/server/languages/_form.html.erb
@@ -0,0 +1,14 @@
+<%= simple_form_for [:server, language] do |f| %>
+  <div class="row">
+    <div class="col-md-8">
+      <%= f.input :name %>
+    </div>
+    <div class="col-md-4">
+      <%= f.input :iso_code %>
+    </div>
+  </div>
+
+  <% content_for :buttons do %>
+    <%= submit f %>
+  <% end %>
+<% end %>
diff --git a/app/views/server/languages/edit.html.erb b/app/views/server/languages/edit.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..78b30fd4bcef1467d200372b96e0dd21c8190bcc
--- /dev/null
+++ b/app/views/server/languages/edit.html.erb
@@ -0,0 +1,3 @@
+<% content_for :title, @language %>
+
+<%= render 'form', language: @language %>
diff --git a/app/views/server/languages/index.html.erb b/app/views/server/languages/index.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..c051503a2d32fd5d11179ff651d894390b993988
--- /dev/null
+++ b/app/views/server/languages/index.html.erb
@@ -0,0 +1,27 @@
+<% content_for :title, Language.model_name.human(count: 2) %>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Name</th>
+      <th>Iso code</th>
+      <th></th>
+    </tr>
+  </thead>
+
+  <tbody>
+    <% @languages.each do |language| %>
+      <tr>
+        <td><%= link_to language, [:server, language] %></td>
+        <td><%= language.iso_code %></td>
+        <td class="text-end">
+          <%= link_to t('edit'), edit_server_language_path(language), class: button_classes %>
+        </td>
+      </tr>
+    <% end %>
+  </tbody>
+</table>
+
+<% content_for :buttons do %>
+  <%= link_to t('create'), new_server_language_path, class: button_classes %>
+<% end %>
diff --git a/app/views/server/languages/new.html.erb b/app/views/server/languages/new.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..ec8343274bd11784df9c53448bf08d8feac306aa
--- /dev/null
+++ b/app/views/server/languages/new.html.erb
@@ -0,0 +1,3 @@
+<% content_for :title, Language.model_name.human %>
+
+<%= render 'form', language: @language %>
diff --git a/app/views/server/languages/show.html.erb b/app/views/server/languages/show.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..56a8fc02806c5c28ab452d711669c59651dcbf6a
--- /dev/null
+++ b/app/views/server/languages/show.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, @language %>
+
+<p>
+  <strong>Iso code:</strong>
+  <%= @language.iso_code %>
+</p>
+
+<% content_for :buttons do %>
+  <%= link_to t('edit'), edit_server_language_path(@language), class: button_classes %>
+<% end %>
diff --git a/app/views/server/universities/_university.json.jbuilder b/app/views/server/universities/_university.json.jbuilder
deleted file mode 100644
index 9b20654a61bef23b2f64dd9f9c8c3eaa95d2f9ef..0000000000000000000000000000000000000000
--- a/app/views/server/universities/_university.json.jbuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-json.extract! university, :id, :name, :address, :zipcode, :city, :country, :private, :created_at, :updated_at
-json.url university_url(university, format: :json)
diff --git a/app/views/server/universities/index.json.jbuilder b/app/views/server/universities/index.json.jbuilder
deleted file mode 100644
index 93258cd65becfc42171f90f8c50ba204ee902f8d..0000000000000000000000000000000000000000
--- a/app/views/server/universities/index.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.array! @universities, partial: "universities/university", as: :university
diff --git a/app/views/server/universities/show.json.jbuilder b/app/views/server/universities/show.json.jbuilder
deleted file mode 100644
index c8b159aca6bd32b0ab8312bae06054b3a08954e0..0000000000000000000000000000000000000000
--- a/app/views/server/universities/show.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.partial! "universities/university", university: @university
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 505810077f814e11ee89327c917ecb8168a39b4a..ccc4744ce2b87ebc3957a6cd10430c0271219f06 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -13,6 +13,9 @@ fr:
       university:
         one: Université
         other: Universités
+      language:
+        one: Langue
+        other: Langues
       user:
         one: Utilisateur
         other: Utilisateurs
diff --git a/config/routes.rb b/config/routes.rb
index 92dfc427ed9c6db9a6c6e52eb1b904313641db7c..540db86ee20d0bdd567df9c6a1f6fa5070fb73d8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,5 @@
 Rails.application.routes.draw do
+  resources :languages
   devise_for :users, controllers: {
     registrations: 'users/registrations',
     sessions: 'users/sessions'
@@ -15,6 +16,7 @@ Rails.application.routes.draw do
 
   namespace :server do
     resources :universities
+    resources :languages
     root to: 'dashboard#index'
   end
 
diff --git a/config/server_navigation.rb b/config/server_navigation.rb
index c94ce20ebd18835b37eb1d26886e3c78c39f1cbc..72d21f8591daa4d497f9a952f829bb76a135ebbe 100644
--- a/config/server_navigation.rb
+++ b/config/server_navigation.rb
@@ -6,5 +6,6 @@ SimpleNavigation::Configuration.run do |navigation|
   navigation.items do |primary|
     primary.item :dashboard, t('dashboard'), server_root_path, { icon: 'tachometer-alt', highlights_on: %r{adminserver$} }
     primary.item :universities, University.model_name.human(count: 2), server_universities_path, { icon: 'university' }
+    primary.item :languages, Language.model_name.human(count: 2), server_languages_path, { icon: 'flag' }
   end
 end
diff --git a/db/migrate/20210922091537_create_languages.rb b/db/migrate/20210922091537_create_languages.rb
new file mode 100644
index 0000000000000000000000000000000000000000..aff8421ea84484f654749d5037dc98827ded2d66
--- /dev/null
+++ b/db/migrate/20210922091537_create_languages.rb
@@ -0,0 +1,10 @@
+class CreateLanguages < ActiveRecord::Migration[6.1]
+  def change
+    create_table :languages, id: :uuid do |t|
+      t.string :name
+      t.string :iso_code
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index f5d9441172ebbbba42898a99072abaad02814cef..f7cf9f0e89da5f6c3f1f60aabb9670d6c92c82ee 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2021_09_21_170648) do
+ActiveRecord::Schema.define(version: 2021_09_22_091537) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
@@ -137,6 +137,13 @@ ActiveRecord::Schema.define(version: 2021_09_21_170648) do
     t.index ["university_id"], name: "index_education_programs_on_university_id"
   end
 
+  create_table "languages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.string "iso_code"
+    t.datetime "created_at", precision: 6, null: false
+    t.datetime "updated_at", precision: 6, null: false
+  end
+
   create_table "research_journal_articles", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "title"
     t.text "text"
diff --git a/db/seeds.rb b/db/seeds.rb
index 91fe7b01f06616db9bbfba32fa69b77f77526752..1f63f50f71430073ac00c0abbc4b52ffd4ea56b0 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1,5 +1,8 @@
 University.create name: 'Osuny', identifier: 'demo'
 
+Language.where(name: 'French', iso_code: 'fr').first_or_create
+Language.where(name: 'English', iso_code: 'en').first_or_create
+
 Administration::Qualiopi::Criterion.destroy_all
 Administration::Qualiopi::Criterion.create [
   {
diff --git a/test/controllers/languages_controller_test.rb b/test/controllers/languages_controller_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e7d19856b21fcbe3bcd5c1dd5ac33123f3ce9923
--- /dev/null
+++ b/test/controllers/languages_controller_test.rb
@@ -0,0 +1,48 @@
+require "test_helper"
+
+class LanguagesControllerTest < ActionDispatch::IntegrationTest
+  setup do
+    @language = languages(:one)
+  end
+
+  test "should get index" do
+    get languages_url
+    assert_response :success
+  end
+
+  test "should get new" do
+    get new_language_url
+    assert_response :success
+  end
+
+  test "should create language" do
+    assert_difference('Language.count') do
+      post languages_url, params: { language: { iso_code: @language.iso_code, name: @language.name } }
+    end
+
+    assert_redirected_to language_url(Language.last)
+  end
+
+  test "should show language" do
+    get language_url(@language)
+    assert_response :success
+  end
+
+  test "should get edit" do
+    get edit_language_url(@language)
+    assert_response :success
+  end
+
+  test "should update language" do
+    patch language_url(@language), params: { language: { iso_code: @language.iso_code, name: @language.name } }
+    assert_redirected_to language_url(@language)
+  end
+
+  test "should destroy language" do
+    assert_difference('Language.count', -1) do
+      delete language_url(@language)
+    end
+
+    assert_redirected_to languages_url
+  end
+end
diff --git a/test/fixtures/languages.yml b/test/fixtures/languages.yml
new file mode 100644
index 0000000000000000000000000000000000000000..45b6db8088f23f9ca81c0db14104dcbe77ef2081
--- /dev/null
+++ b/test/fixtures/languages.yml
@@ -0,0 +1,18 @@
+# == Schema Information
+#
+# Table name: languages
+#
+#  id         :uuid             not null, primary key
+#  iso_code   :string
+#  name       :string
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+
+one:
+  name: MyString
+  iso_code: MyString
+
+two:
+  name: MyString
+  iso_code: MyString
diff --git a/test/models/language_test.rb b/test/models/language_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e43f8ceee43e46405bb61aed52d11aa0b856abad
--- /dev/null
+++ b/test/models/language_test.rb
@@ -0,0 +1,17 @@
+# == Schema Information
+#
+# Table name: languages
+#
+#  id         :uuid             not null, primary key
+#  iso_code   :string
+#  name       :string
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+require "test_helper"
+
+class LanguageTest < ActiveSupport::TestCase
+  # test "the truth" do
+  #   assert true
+  # end
+end
diff --git a/test/system/languages_test.rb b/test/system/languages_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b5d0360f238a800d57fc746952a7fb03f40e7918
--- /dev/null
+++ b/test/system/languages_test.rb
@@ -0,0 +1,45 @@
+require "application_system_test_case"
+
+class LanguagesTest < ApplicationSystemTestCase
+  setup do
+    @language = languages(:one)
+  end
+
+  test "visiting the index" do
+    visit languages_url
+    assert_selector "h1", text: "Languages"
+  end
+
+  test "creating a Language" do
+    visit languages_url
+    click_on "New Language"
+
+    fill_in "Iso code", with: @language.iso_code
+    fill_in "Name", with: @language.name
+    click_on "Create Language"
+
+    assert_text "Language was successfully created"
+    click_on "Back"
+  end
+
+  test "updating a Language" do
+    visit languages_url
+    click_on "Edit", match: :first
+
+    fill_in "Iso code", with: @language.iso_code
+    fill_in "Name", with: @language.name
+    click_on "Update Language"
+
+    assert_text "Language was successfully updated"
+    click_on "Back"
+  end
+
+  test "destroying a Language" do
+    visit languages_url
+    page.accept_confirm do
+      click_on "Destroy", match: :first
+    end
+
+    assert_text "Language was successfully destroyed"
+  end
+end