diff --git a/app/models/education/school.rb b/app/models/education/school.rb
index 663bf2e000cbb3d821a31676304e6104bfb5ab24..f46defd6f85a8486e6134f7b434bf133584395a9 100644
--- a/app/models/education/school.rb
+++ b/app/models/education/school.rb
@@ -91,7 +91,7 @@ class Education::School < ApplicationRecord
   validates :name, :address, :city, :zipcode, :country, presence: true
 
   scope :ordered, -> { order(:name) }
-  scope :for_program, -> (program_id) { } # TODO @Sebou
+  scope :for_program, -> (program_id) { joins(:programs).where(education_programs: { id: program_id }) }
   scope :for_search_term, -> (term) {
     where("
       unaccent(education_schools.address) ILIKE unaccent(:term) OR
diff --git a/app/models/university/person.rb b/app/models/university/person.rb
index 6e791092ff18b922327524405b8444a739e2085a..6e497a1bf0a4bddec8d4bf6faf999f4961a78f5b 100644
--- a/app/models/university/person.rb
+++ b/app/models/university/person.rb
@@ -44,6 +44,7 @@ class University::Person < ApplicationRecord
   include WithBlobs
   include WithSlug
   include WithPicture
+  include WithRoles
   include WithEducation
 
   LIST_OF_ROLES = [
@@ -77,11 +78,6 @@ class University::Person < ApplicationRecord
                           class_name: 'University::Person::Involvement',
                           dependent: :destroy
 
-  has_many                :involvements_as_administrator,
-                          -> { where(kind: 'administrator') },
-                          class_name: 'University::Person::Involvement',
-                          dependent: :destroy
-
   has_many                :author_websites,
                           -> { distinct },
                           through: :communication_website_posts,
@@ -117,7 +113,16 @@ class University::Person < ApplicationRecord
   scope :researchers,     -> { where(is_researcher: true) }
   scope :alumni,          -> { where(is_alumnus: true) }
   scope :for_role, -> (role) { where("is_#{role}": true) }
-  scope :for_program, -> (program_id) { } # TODO @Sebou
+  scope :for_program, -> (program_id) {
+    left_joins(:education_programs_as_administrator, :education_programs_as_teacher)
+      .where(education_programs: { id: program_id })
+      .or(
+        left_joins(:education_programs_as_administrator, :education_programs_as_teacher)
+          .where(education_programs_as_teachers_university_people: { id: program_id })
+      )
+      .select("university_people.*")
+      .distinct
+  }
   scope :for_search_term, -> (term) {
     where("
       unaccent(concat(university_people.first_name, ' ', university_people.last_name)) ILIKE unaccent(:term) OR
diff --git a/app/models/university/person/involvement.rb b/app/models/university/person/involvement.rb
index 988be24c96c7fa28a9a6eb6c18f87487d5db8a04..735c3f481730ad2d07b6d0df69966a2ae9c7ef87 100644
--- a/app/models/university/person/involvement.rb
+++ b/app/models/university/person/involvement.rb
@@ -32,6 +32,10 @@ class University::Person::Involvement < ApplicationRecord
 
   belongs_to :person, class_name: 'University::Person'
   belongs_to :target, polymorphic: true
+  belongs_to  :university_role,
+              -> { where(university_person_involvements: { target_type: 'University::Role' }) },
+              class_name: "University::Role",
+              foreign_key: "target_id"
 
   validates :person_id, uniqueness: { scope: [:target_id, :target_type] }
   validates :target_id, uniqueness: { scope: [:person_id, :target_type] }
diff --git a/app/models/university/person/with_education.rb b/app/models/university/person/with_education.rb
index 7ceb01ad43e2e20804028b45194de4c4d33be261..eef6b9c79f6c055ec84f1d081f3045ca9315e086 100644
--- a/app/models/university/person/with_education.rb
+++ b/app/models/university/person/with_education.rb
@@ -12,6 +12,12 @@ module University::Person::WithEducation
                             source: :target,
                             source_type: "Education::Program"
 
+    has_many                :education_programs_as_administrator,
+                            -> { distinct },
+                            through: :roles_as_administrator,
+                            source: :target,
+                            source_type: "Education::Program"
+
     has_many                :experiences
 
     has_and_belongs_to_many :cohorts,
@@ -30,13 +36,6 @@ module University::Person::WithEducation
                             association_foreign_key: 'education_program_id'
   end
 
-  def education_programs_as_administrator
-    university.education_programs
-              .joins(:involvements_through_roles)
-              .where(university_person_involvements: { person_id: id })
-              .distinct
-  end
-
   def add_to_cohort(cohort)
     cohorts << cohort unless cohort.in?(cohorts)
     diploma_years << cohort.academic_year unless cohort.academic_year.in? diploma_years
diff --git a/app/models/university/person/with_roles.rb b/app/models/university/person/with_roles.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d9742809f47864e80e3e37d605952b5c33ec35be
--- /dev/null
+++ b/app/models/university/person/with_roles.rb
@@ -0,0 +1,15 @@
+module University::Person::WithRoles
+  extend ActiveSupport::Concern
+
+  included do
+    has_many                :involvements_as_administrator,
+                            -> { where(kind: 'administrator') },
+                            class_name: 'University::Person::Involvement',
+                            dependent: :destroy
+
+    has_many                :roles_as_administrator,
+                            through: :involvements_as_administrator,
+                            source: :target,
+                            source_type: "University::Role"
+  end
+end