diff --git a/app/controllers/admin/education/programs_controller.rb b/app/controllers/admin/education/programs_controller.rb
index ef52df18a37196afe44f7bd304cf782911f3ec1c..d928c482a8427c29d16427b0ec3bf63172fd4a30 100644
--- a/app/controllers/admin/education/programs_controller.rb
+++ b/app/controllers/admin/education/programs_controller.rb
@@ -80,6 +80,7 @@ class Admin::Education::ProgramsController < Admin::Education::ApplicationContro
   def program_params
     params.require(:education_program).permit(
       :name, :slug, :level, :capacity, :ects, :continuing, :description, :published,
+      :featured_image, :featured_image_delete, :featured_image_infos,
       :prerequisites, :objectives, :duration, :registration, :pedagogy,
       :evaluation, :accessibility, :pricing, :contacts, :opportunities, :other,
       :parent_id, school_ids: [], teacher_ids: []
diff --git a/app/models/communication/website/with_media.rb b/app/models/communication/website/with_media.rb
index adc5069cb6ef7b61c345db72e19dd5ab79c6e6ab..c96a5bcc0631b6bbe794b33c9940d74392218b55 100644
--- a/app/models/communication/website/with_media.rb
+++ b/app/models/communication/website/with_media.rb
@@ -2,10 +2,20 @@ module Communication::Website::WithMedia
   extend ActiveSupport::Concern
 
   def active_storage_blobs
-    blob_ids = [best_featured_image&.blob_id, text.embeds.blobs.pluck(:id)].flatten.compact
+    blob_ids = [best_featured_image&.blob_id, rich_text_blob_ids].flatten.compact
     university.active_storage_blobs.where(id: blob_ids)
   end
 
+  def rich_text_reflection_names
+    @rich_text_reflection_names ||= _reflections.select { |name, reflection| reflection.class_name == "ActionText::RichText" }.keys
+  end
+
+  def rich_text_blob_ids
+    rich_text_reflection_names.map { |rich_text_reflection_name|
+      public_send(rich_text_reflection_name).embeds.blobs.pluck(:id)
+    }.flatten
+  end
+
   # Can be overwrite to get featured_image from associated objects (ex: parents)
   def best_featured_image(fallback: true)
     featured_image
diff --git a/app/models/education/program.rb b/app/models/education/program.rb
index 1a504550165153dafa8d97b8b2fac27e951b85bf..004ccd957a732bf000fd4c8d5a1198c48e54c1c1 100644
--- a/app/models/education/program.rb
+++ b/app/models/education/program.rb
@@ -32,6 +32,7 @@ class Education::Program < ApplicationRecord
   include WithGithubFiles
   include WithMenuItemTarget
   include WithTree
+  include Communication::Website::WithMedia
 
   attr_accessor :skip_websites_categories_callback
 
@@ -46,6 +47,7 @@ class Education::Program < ApplicationRecord
   has_rich_text :prerequisites
   has_rich_text :pricing
   has_rich_text :registration
+  has_one_attached_deletable :featured_image
 
   belongs_to :university
   belongs_to :parent,
diff --git a/app/views/admin/education/programs/_form.html.erb b/app/views/admin/education/programs/_form.html.erb
index cad98a94ce61050b304b8bf7d70bdab4518a431c..274caa93f6a02f76e9afffe81b01e6c9bb1b605d 100644
--- a/app/views/admin/education/programs/_form.html.erb
+++ b/app/views/admin/education/programs/_form.html.erb
@@ -24,6 +24,20 @@
           <%= f.association :parent, collection: program.persisted? ? program.list_of_other_programs : current_university.list_of_programs, label_method: ->(p) { sanitize p[:label] }, value_method: ->(p) { p[:id] } %>
         </div>
       </div>
+      <div class="card flex-fill w-100">
+        <div class="card-header">
+          <h5 class="card-title mb-0"><%= t('activerecord.attributes.education/program.featured_image') %></h5>
+        </div>
+        <div class="card-body">
+          <%= f.input :featured_image,
+                      as: :single_deletable_file,
+                      direct_upload: true,
+                      label: false,
+                      input_html: { accept: '.jpg,.jpeg,.png' },
+                      preview: true
+           %>
+        </div>
+      </div>
     </div>
     <div class="col-md-8">
       <div class="card flex-fill w-100">
diff --git a/app/views/admin/education/programs/show.html.erb b/app/views/admin/education/programs/show.html.erb
index bf7ad5710665b4c916e9a6fc217f40414709fd74..3d0e54f67e843123da525d1271bcb9de5499ba74 100644
--- a/app/views/admin/education/programs/show.html.erb
+++ b/app/views/admin/education/programs/show.html.erb
@@ -28,6 +28,16 @@
         <% end %>
       </div>
     </div>
+    <% if @program.featured_image.attached? && @program.featured_image.variable? %>
+      <div class="card flex-fill w-100">
+        <div class="card-header">
+          <h5 class="card-title mb-0"><%= t('activerecord.attributes.education/program.featured_image') %></h5>
+        </div>
+        <div class="card-body">
+          <%= image_tag @program.featured_image.variant(resize: '600'), class: 'img-fluid mb-3' %><br>
+        </div>
+      </div>
+    <% end %>
   </div>
   <div class="col-md-8">
     <div class="card flex-fill w-100">
diff --git a/config/locales/education/en.yml b/config/locales/education/en.yml
index eb3f1b12477f09823eedbca297bcf3d10623a27c..7c0cd5413d5caf4c415dfbde612bace3a257c175 100644
--- a/config/locales/education/en.yml
+++ b/config/locales/education/en.yml
@@ -20,6 +20,7 @@ en:
         duration: Durée
         ects: Crédits ECTS
         evaluation: Modalités d’évaluation
+        featured_image: Featured image
         level: Level
         name: Name
         objectives: Objectifs
diff --git a/config/locales/education/fr.yml b/config/locales/education/fr.yml
index cda0dc8fe472e488414f37b7f90e479a2266e48e..509c363e7f7491be56d547555157f368a9b89fb4 100644
--- a/config/locales/education/fr.yml
+++ b/config/locales/education/fr.yml
@@ -20,6 +20,7 @@ fr:
         duration: Durée
         ects: Crédits ECTS
         evaluation: Modalités d’évaluation
+        featured_image: Image à la une
         level: Niveau
         name: Nom
         objectives: Objectifs