diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 23d8b4bec9ac7c1e78b14394bf7747d11b99db30..6b668bc7371d0108d2459933469068b08fde5f06 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -13,6 +13,10 @@ class ApplicationController < ActionController::Base
 
   private
 
+  def current_ability
+    @current_ability ||= Ability.for(current_user)
+  end
+
   def ensure_university
     render_forbidden unless current_university
   end
diff --git a/app/models/ability.rb b/app/models/ability.rb
index d7fc3e5a9adbfbe564bc42c62570817a93a9c492..e98457ce2a9838b4c08ca234d3e33e732da40dbd 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -3,183 +3,17 @@
 class Ability
   include CanCan::Ability
 
+  def self.for(user)
+    "Ability::#{user.role.classify}".constantize.new user
+  end
+
   def initialize(user)
     @user = user ||= User.new # guest user (not logged in)
-    send @user.role.to_sym
   end
 
   protected
 
-  def visitor
-  end
-
-  def contributor
-    author
-    cannot :publish, Communication::Website::Post
-    cannot :publish, Communication::Website::Agenda::Event
-  end
-  
-  def author
-    managed_websites_ids = @user.websites_to_manage.pluck(:communication_website_id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
-    can :create, Communication::Block
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
-    can :create, Communication::Block::Heading
-    can :read, Communication::Website, university_id: @user.university_id, id: managed_websites_ids
-    can :manage, Communication::Website::Post, university_id: @user.university_id, communication_website_id: managed_websites_ids, author_id: @user.person&.id
-  end
-
-  def teacher
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id, user_id: @user.id).pluck(:id)
-    can :create, Communication::Block
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id, user_id: @user.id).pluck(:id)
-    can :create, Communication::Block::Heading
-    can [:read, :children], Education::Program, university_id: @user.university_id
-    can :manage, University::Person, user_id: @user.id
-    cannot :create, University::Person
-    can :manage, University::Person::Involvement, person_id: @user.person&.id
-    can :read, University::Person::Involvement, university_id: @user.university_id
-    can :read, University::Role, university_id: @user.university_id
-  end
-  
-  def program_manager
-    managed_programs_ids = @user.programs_to_manage.pluck(:education_program_id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
-    can :create, Communication::Block
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
-    can :create, Communication::Block::Heading
-    can :read, Communication::Website, university_id: @user.university_id
-    can :manage, Communication::Website::Post, university_id: @user.university_id
-    can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id
-    can :manage, Education::Program, id: managed_programs_ids
-    can [:read, :children], Education::Program, university_id: @user.university_id
-    cannot :create, Education::Program
-    can :manage, University::Person, university_id: @user.university_id
-    can :manage, University::Person::Involvement, target_type: "Education::Program", target_id: managed_programs_ids
-    can :manage, University::Role, target_type: "Education::Program", target_id: managed_programs_ids
-  end
-
-  def website_manager
-    managed_websites_ids = @user.websites_to_manage.pluck(:communication_website_id)
-    managed_pages_ids = Communication::Website::Page.where(communication_website_id: managed_websites_ids).pluck(:id)
-    managed_posts_ids = Communication::Website::Post.where(communication_website_id: managed_websites_ids).pluck(:id)
-    managed_events_ids = Communication::Website::Agenda::Event.where(communication_website_id: managed_websites_ids).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Organization', about_id: University::Organization.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
-    can :create, Communication::Block
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Organization', about_id: University::Organization.where(university_id: @user.university_id).pluck(:id)
-    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
-    can :create, Communication::Block::Heading
-    can [:read, :analytics], Communication::Website, university_id: @user.university_id, id: managed_websites_ids
-    can :manage, Communication::Website::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
-    can [:read, :update, :reorder], Communication::Website::Menu, university_id: @user.university_id, communication_website_id: managed_websites_ids
-    can :manage, Communication::Website::Menu::Item, university_id: @user.university_id, website_id: managed_websites_ids
-    can :create, Communication::Website::Menu::Item, university_id: @user.university_id
-    can :manage, Communication::Website::Page, university_id: @user.university_id, communication_website_id: managed_websites_ids
-    can :manage, Communication::Website::Post, university_id: @user.university_id, communication_website_id: managed_websites_ids
-    can :manage, University::Organization, university_id: @user.university_id
-    can :manage, University::Person, university_id: @user.university_id
-    can :manage, University::Person::Category, university_id: @user.university_id
-    can :manage, University::Person::Experience, university_id: @user.university_id
-    can :manage, University::Person::Involvement, university_id: @user.university_id
-  end
-
-  def admin
-    admin_university
-    admin_education
-    admin_research
-    admin_communication
-    admin_communication_extranet
-    admin_administration
-    can :manage, Import, university_id: @user.university_id
-  end
-
-  def admin_university
-    can :manage, University::Organization, university_id: @user.university_id
-    can :manage, University::Organization::Category, university_id: @user.university_id
-    can :manage, University::Person, university_id: @user.university_id
-    can :manage, University::Person::Category, university_id: @user.university_id
-    can :manage, University::Person::Experience, university_id: @user.university_id
-    can :manage, University::Person::Involvement, university_id: @user.university_id
-    can :manage, University::Role, university_id: @user.university_id
-    can :read, User, university_id: @user.university_id
-    can :manage, User, university_id: @user.university_id, role: @user.managed_roles
-  end
-
-  def admin_education
-    can :manage, Education::AcademicYear, university_id: @user.university_id
-    can :manage, Education::Cohort, university_id: @user.university_id
-    can :manage, Education::Diploma, university_id: @user.university_id
-    can :manage, Education::Program, university_id: @user.university_id
-    can :manage, Education::School, university_id: @user.university_id
-    can :manage, :all_programs # needed to prevent program_manager to access specific global screens
-  end
-
-  def admin_research
-    can :manage, Research::Hal::Author
-    can :manage, Research::Hal::Publication
-    can :manage, Research::Journal, university_id: @user.university_id
-    can :manage, Research::Journal::Paper, university_id: @user.university_id
-    can :manage, Research::Journal::Paper::Kind, university_id: @user.university_id
-    can :manage, Research::Journal::Volume, university_id: @user.university_id
-    can :manage, Research::Laboratory, university_id: @user.university_id
-    can :manage, Research::Laboratory::Axis, university_id: @user.university_id
-    can :manage, Research::Thesis, university_id: @user.university_id
-  end
-
-  def admin_communication
-    can :manage, Communication::Block, university_id: @user.university_id
-    can :create, Communication::Block
-    can :manage, Communication::Block::Heading, university_id: @user.university_id
-    can :create, Communication::Block::Heading
-    can :manage, Communication::Website, university_id: @user.university_id
-    # Est-ce bien raisonnable de laisser supprimer un site ?
-    # Le risque de faussse manip est grand.
-    cannot :destroy, Communication::Website, university_id: @user.university_id
-    can :manage, Communication::Website::Category, university_id: @user.university_id
-    can :manage, Communication::Website::Imported::Website, university_id: @user.university_id
-    can :manage, Communication::Website::Imported::Page, university_id: @user.university_id
-    can :manage, Communication::Website::Imported::Post, university_id: @user.university_id
-    can :manage, Communication::Website::Menu, university_id: @user.university_id
-    can :manage, Communication::Website::Menu::Item, university_id: @user.university_id
-    can :manage, Communication::Website::Page, university_id: @user.university_id
-    can :manage, Communication::Website::Post, university_id: @user.university_id
-    can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id
-  end
-  
-  def admin_communication_extranet
-    can [:read, :update], Communication::Extranet, university_id: @user.university_id
-    can :manage, Communication::Extranet::Connection, university_id: @user.university_id
-    can :manage, Communication::Extranet::Document, university_id: @user.university_id
-    can :manage, Communication::Extranet::Document::Category, university_id: @user.university_id
-    can :manage, Communication::Extranet::Document::Kind, university_id: @user.university_id
-    can :manage, Communication::Extranet::Post, university_id: @user.university_id
-    can :manage, Communication::Extranet::Post::Category, university_id: @user.university_id
-  end
-
-  def admin_administration
-    can :read, Administration::Qualiopi
-    can :read, Administration::Qualiopi::Criterion
-    can :read, Administration::Qualiopi::Indicator
-  end
-
-  def server_admin
-    can :manage, :all
+  def managed_websites_ids
+    @managed_websites_ids ||= @user.websites_to_manage.pluck(:communication_website_id)
   end
 end
diff --git a/app/models/ability/admin.rb b/app/models/ability/admin.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f6692c611cb18f7a4c4723f9316bc7bd865e1afa
--- /dev/null
+++ b/app/models/ability/admin.rb
@@ -0,0 +1,84 @@
+class Ability::Admin < Ability
+
+  def initialize(user)
+    super
+    admin_university
+    admin_education
+    admin_research
+    admin_communication
+    admin_communication_extranet
+    admin_administration
+    can :manage, Import, university_id: @user.university_id
+  end
+
+  protected
+
+  def admin_university
+    can :manage, University::Organization, university_id: @user.university_id
+    can :manage, University::Organization::Category, university_id: @user.university_id
+    can :manage, University::Person, university_id: @user.university_id
+    can :manage, University::Person::Category, university_id: @user.university_id
+    can :manage, University::Person::Experience, university_id: @user.university_id
+    can :manage, University::Person::Involvement, university_id: @user.university_id
+    can :manage, University::Role, university_id: @user.university_id
+    can :read, User, university_id: @user.university_id
+    can :manage, User, university_id: @user.university_id, role: @user.managed_roles
+  end
+
+  def admin_education
+    can :manage, Education::AcademicYear, university_id: @user.university_id
+    can :manage, Education::Cohort, university_id: @user.university_id
+    can :manage, Education::Diploma, university_id: @user.university_id
+    can :manage, Education::Program, university_id: @user.university_id
+    can :manage, Education::School, university_id: @user.university_id
+    can :manage, :all_programs # needed to prevent program_manager to access specific global screens
+  end
+
+  def admin_research
+    can :manage, Research::Hal::Author
+    can :manage, Research::Hal::Publication
+    can :manage, Research::Journal, university_id: @user.university_id
+    can :manage, Research::Journal::Paper, university_id: @user.university_id
+    can :manage, Research::Journal::Paper::Kind, university_id: @user.university_id
+    can :manage, Research::Journal::Volume, university_id: @user.university_id
+    can :manage, Research::Laboratory, university_id: @user.university_id
+    can :manage, Research::Laboratory::Axis, university_id: @user.university_id
+    can :manage, Research::Thesis, university_id: @user.university_id
+  end
+
+  def admin_communication
+    can :manage, Communication::Block, university_id: @user.university_id
+    can :create, Communication::Block
+    can :manage, Communication::Block::Heading, university_id: @user.university_id
+    can :create, Communication::Block::Heading
+    can :manage, Communication::Website, university_id: @user.university_id
+    # Est-ce bien raisonnable de laisser supprimer un site ?
+    # Le risque de faussse manip est grand.
+    cannot :destroy, Communication::Website, university_id: @user.university_id
+    can :manage, Communication::Website::Category, university_id: @user.university_id
+    can :manage, Communication::Website::Imported::Website, university_id: @user.university_id
+    can :manage, Communication::Website::Imported::Page, university_id: @user.university_id
+    can :manage, Communication::Website::Imported::Post, university_id: @user.university_id
+    can :manage, Communication::Website::Menu, university_id: @user.university_id
+    can :manage, Communication::Website::Menu::Item, university_id: @user.university_id
+    can :manage, Communication::Website::Page, university_id: @user.university_id
+    can :manage, Communication::Website::Post, university_id: @user.university_id
+    can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id
+  end
+  
+  def admin_communication_extranet
+    can [:read, :update], Communication::Extranet, university_id: @user.university_id
+    can :manage, Communication::Extranet::Connection, university_id: @user.university_id
+    can :manage, Communication::Extranet::Document, university_id: @user.university_id
+    can :manage, Communication::Extranet::Document::Category, university_id: @user.university_id
+    can :manage, Communication::Extranet::Document::Kind, university_id: @user.university_id
+    can :manage, Communication::Extranet::Post, university_id: @user.university_id
+    can :manage, Communication::Extranet::Post::Category, university_id: @user.university_id
+  end
+
+  def admin_administration
+    can :read, Administration::Qualiopi
+    can :read, Administration::Qualiopi::Criterion
+    can :read, Administration::Qualiopi::Indicator
+  end
+end
\ No newline at end of file
diff --git a/app/models/ability/contributor.rb b/app/models/ability/contributor.rb
new file mode 100644
index 0000000000000000000000000000000000000000..26b690dc162858d7e61129361ee23954411cd126
--- /dev/null
+++ b/app/models/ability/contributor.rb
@@ -0,0 +1,15 @@
+class Ability::Contributor < Ability
+
+  def initialize(user)
+    super
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
+    can :create, Communication::Block
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
+    can :create, Communication::Block::Heading
+    can :read, Communication::Website, university_id: @user.university_id, id: managed_websites_ids
+    can :manage, Communication::Website::Post, university_id: @user.university_id, communication_website_id: managed_websites_ids, author_id: @user.person&.id
+    cannot :publish, Communication::Website::Post
+  end
+end
\ No newline at end of file
diff --git a/app/models/ability/program_manager.rb b/app/models/ability/program_manager.rb
new file mode 100644
index 0000000000000000000000000000000000000000..04d64c0be92766825b96309ef1f1b421d80ed7aa
--- /dev/null
+++ b/app/models/ability/program_manager.rb
@@ -0,0 +1,30 @@
+class Ability::ProgramManager < Ability
+
+  def initialize(user)
+    super
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
+    can :create, Communication::Block
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: Communication::Website::Post.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: Communication::Website::Agenda::Event.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
+    can :create, Communication::Block::Heading
+    can :read, Communication::Website, university_id: @user.university_id
+    can :manage, Communication::Website::Post, university_id: @user.university_id
+    can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id
+    can :manage, Education::Program, id: managed_programs_ids
+    can [:read, :children], Education::Program, university_id: @user.university_id
+    cannot :create, Education::Program
+    can :manage, University::Person, university_id: @user.university_id
+    can :manage, University::Person::Involvement, target_type: "Education::Program", target_id: managed_programs_ids
+    can :manage, University::Role, target_type: "Education::Program", target_id: managed_programs_ids  end
+
+  protected
+
+  def managed_programs_ids
+    @managed_programs_ids ||= @user.programs_to_manage.pluck(:education_program_id)
+  end
+end
\ No newline at end of file
diff --git a/app/models/ability/server_admin.rb b/app/models/ability/server_admin.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ba1e7f835a3991fc3ea43f9720929e00c2704d47
--- /dev/null
+++ b/app/models/ability/server_admin.rb
@@ -0,0 +1,7 @@
+class Ability::ServerAdmin < Ability
+
+  def initialize(user)
+    super
+    can :manage, :all
+  end
+end
\ No newline at end of file
diff --git a/app/models/ability/teacher.rb b/app/models/ability/teacher.rb
new file mode 100644
index 0000000000000000000000000000000000000000..db0816822859e031fc4f8550ddea8381ed4e92f1
--- /dev/null
+++ b/app/models/ability/teacher.rb
@@ -0,0 +1,18 @@
+class Ability::Teacher < Ability
+
+  def initialize(user)
+    super
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id, user_id: @user.id).pluck(:id)
+    can :create, Communication::Block
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id, user_id: @user.id).pluck(:id)
+    can :create, Communication::Block::Heading
+    can [:read, :children], Education::Program, university_id: @user.university_id
+    can :manage, University::Person, user_id: @user.id
+    cannot :create, University::Person
+    can :manage, University::Person::Involvement, person_id: @user.person&.id
+    can :read, University::Person::Involvement, university_id: @user.university_id
+    can :read, University::Role, university_id: @user.university_id
+  end
+end
\ No newline at end of file
diff --git a/app/models/ability/visitor.rb b/app/models/ability/visitor.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0784040545b0ce67dd09f96d0d75f09488f8f5d7
--- /dev/null
+++ b/app/models/ability/visitor.rb
@@ -0,0 +1,2 @@
+class Ability::Visitor < Ability
+end
\ No newline at end of file
diff --git a/app/models/ability/website_manager.rb b/app/models/ability/website_manager.rb
new file mode 100644
index 0000000000000000000000000000000000000000..593b9fdca0988c9389b947d3d406da6c18a3119c
--- /dev/null
+++ b/app/models/ability/website_manager.rb
@@ -0,0 +1,45 @@
+class Ability::WebsiteManager < Ability
+
+  def initialize(user)
+    super
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Organization', about_id: University::Organization.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
+    can :create, Communication::Block
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Organization', about_id: University::Organization.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
+    can :create, Communication::Block::Heading
+    can [:read, :analytics], Communication::Website, university_id: @user.university_id, id: managed_websites_ids
+    can :manage, Communication::Website::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can [:read, :update, :reorder], Communication::Website::Menu, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can :manage, Communication::Website::Menu::Item, university_id: @user.university_id, website_id: managed_websites_ids
+    can :create, Communication::Website::Menu::Item, university_id: @user.university_id
+    can :manage, Communication::Website::Page, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can :manage, Communication::Website::Post, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can :manage, University::Organization, university_id: @user.university_id
+    can :manage, University::Person, university_id: @user.university_id
+    can :manage, University::Person::Category, university_id: @user.university_id
+    can :manage, University::Person::Experience, university_id: @user.university_id
+    can :manage, University::Person::Involvement, university_id: @user.university_id
+  end
+
+  protected
+
+  def managed_pages_ids
+    @managed_pages_ids ||= Communication::Website::Page.where(communication_website_id: managed_websites_ids).pluck(:id)
+  end
+
+  def managed_posts_ids
+    @managed_posts_ids ||= Communication::Website::Post.where(communication_website_id: managed_websites_ids).pluck(:id)
+  end
+
+  def managed_events_ids
+    @managed_events_ids ||= Communication::Website::Agenda::Event.where(communication_website_id: managed_websites_ids).pluck(:id)
+  end
+
+end
\ No newline at end of file
diff --git a/cron.json b/cron.json
index 5003dcc2da2e14129d8b41d0bcde800bdfe4c23d..b4df0f56cab3ce7f32d203e567b592b28677cce2 100644
--- a/cron.json
+++ b/cron.json
@@ -1,10 +1,12 @@
 {
   "jobs": [
     {
-      "command": "0 1 * * * rails auto:update_publications_from_hal"
+      "command": "0 1 * * * rails auto:update_publications_from_hal",
+      "size": "L"
     },
     {
-      "command": "0 3 * * * rails auto:clean_and_rebuild_websites"
+      "command": "0 3 * * * rails auto:clean_and_rebuild_websites",
+      "size": "XL"
     }
   ]
 }
\ No newline at end of file