diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index 9d416568bbec3fd1e8cbf19a89b4965b2da3613f..5f72b3c115acd9cf03abe787ca05856f32cf902e 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -227,6 +227,8 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         self.annee_but = (formsemestre.semestre_id + 1) // 2
         "le rang de l'année dans le BUT: 1, 2, 3"
         assert self.annee_but in (1, 2, 3)
+        self.explications: set[str] = set()
+        "set of strings, explications à afficher dans le formulaire"
         # ---- inscription et parcours
         inscription = formsemestre.etuds_inscriptions.get(etud.id)
         if inscription is None:
diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py
index 2abbeb1d824c25a17c814edafd556f703d861cfb..160cc8cdde972456cd8e44d88375ea6228ad3ab4 100644
--- a/app/but/jury_but_view.py
+++ b/app/but/jury_but_view.py
@@ -135,6 +135,7 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
                     _gen_but_niveau_ue(
                         ue,
                         deca.decisions_ues[ue.id],
+                        deca=deca,
                         disabled=read_only or ue_read_only,
                         annee_prec=ue_read_only,
                         niveau_id=ue.niveau_competence.id,
@@ -190,11 +191,13 @@ def _gen_but_select(
 def _gen_but_niveau_ue(
     ue: UniteEns,
     dec_ue: DecisionsProposeesUE,
+    deca: DecisionsProposeesAnnee,
     disabled: bool = False,
     annee_prec: bool = False,
     niveau_id: int = None,
     ue_dispense: bool = False,
 ) -> str:
+    "html snippet pour une UE. Ajoute éventuellement des explications dans le deca."
     if dec_ue.ue_status and dec_ue.ue_status["is_capitalized"]:
         moy_ue_str = f"""<span class="ue_cap">{
             scu.fmt_note(dec_ue.moy_ue_with_cap)}</span>"""
@@ -220,6 +223,12 @@ def _gen_but_niveau_ue(
             </div>
         </div>
         """
+        deca.explications.add(f"UE {ue.acronyme} capitalisée, {etat_en_cours}")
+        deca.explications.add("Certaines UEs sont déjà capitalisées.")
+        deca.explications.add(
+            """<b>Le code jury à saisir sur les UEs porte toujours sur celles du semestre en cours.
+            Lorsque l'ancienne note est meilleure, elle est rappelée et soulignée.</b>"""
+        )
     elif dec_ue.formsemestre is None:
         # Validation d'UE antérieure (semestre hors année scolaire courante)
         if dec_ue.validation:
@@ -234,6 +243,9 @@ def _gen_but_niveau_ue(
                 <div>Non reprise dans l'année en cours</div>
             </div>
             """
+            deca.explications.add(
+                f"UE {ue.acronyme} antérieure validée non reprise dans ce semestre."
+            )
         else:
             moy_ue_str = """<span>-</span>"""
             scoplement = """<div class="scoplement">
@@ -242,6 +254,7 @@ def _gen_but_niveau_ue(
                 </div>
             </div>
             """
+            deca.explications.add(f"Pas d'UE {ue.acronyme} en cours ou validée.")
     else:
         moy_ue_str = f"""<span>{scu.fmt_note(dec_ue.moy_ue)}</span>"""
         if dec_ue.code_valide:
@@ -261,6 +274,9 @@ def _gen_but_niveau_ue(
                 UE déjà capitalisée avec résultat moins favorable.
                 </div>
                 """
+                deca.explications.add(
+                    f"UE {ue.acronyme} déjà capitalisée avec résultat moins favorable."
+                )
             else:
                 scoplement = ""
 
diff --git a/app/static/css/jury_but.css b/app/static/css/jury_but.css
index 295e9496a06a94603f440e5d56cd190b55992091..b469f1498e222fcd124a507f1596ae24f3ca3458 100644
--- a/app/static/css/jury_but.css
+++ b/app/static/css/jury_but.css
@@ -42,14 +42,17 @@ ul.modimpls_att {
     min-width: var(--sco-content-min-width);
     max-width: var(--sco-content-max-width);
 }
+
 div.jury_but_warning {
     background-color: yellow;
     border-color: red;
     padding-bottom: 4px;
 }
+
 div.jury_but_box_title {
     margin-bottom: 10px;
 }
+
 .but_annee {
     margin-left: 32px;
     display: inline-grid;
@@ -114,15 +117,22 @@ div.jury_but_box_title {
 
 
 .but_navigation {
-    padding-top: 16px;
-    margin-left: 50px;
-    margin-right: 50px;
+    margin-top: 16px;
+    padding-top: 8px;
+    border-top: 1px solid #999;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    width: 100%;
 }
 
 .but_navigation div {
     display: inline-block;
-    margin-left: 50px;
-    margin-right: 50px;
+    min-width: 100px;
+}
+
+.but_navigation div.center {
+    margin: 0 auto;
 }
 
 div.but_section_annee {
@@ -277,6 +287,10 @@ div.but_doc table tr td.amue {
 }
 
 .but_autorisations_passage.but_explanation {
+    color: var(--color-explanation);
+}
+
+.but_explications {
     font-weight: normal;
     color: var(--color-explanation);
 }
@@ -285,4 +299,14 @@ div.but_doc table tr td.amue {
     font-size: 110%;
     margin-bottom: 8px;
     margin-left: 16px;
+}
+
+.but_submit {
+    margin-top: 12px;
+}
+
+.btn.btn-default.but_submit_button {
+    font-weight: bold;
+    font-size: 18px;
+    padding: 16px 16px;
 }
\ No newline at end of file
diff --git a/app/views/jury_validations.py b/app/views/jury_validations.py
index fe008e1498dfc2e4a49b9afc389d0e7131767518..1a636e1a02e7092e6c19d37930e9d6923371b095 100644
--- a/app/views/jury_validations.py
+++ b/app/views/jury_validations.py
@@ -233,7 +233,7 @@ def formsemestre_validation_but(
         <div class="prev">
            {prev_lnk}
         </div>
-        <div class="back_list">
+        <div class="back_list center">
             <a href="{
                 url_for(
                     "notes.formsemestre_recapcomplet",
@@ -398,7 +398,13 @@ def formsemestre_validation_but(
     )
 
     H.append(jury_but_view.show_etud(deca, read_only=read_only))
-
+    # Remarques / explications
+    if deca.explications:
+        explications = "</li><li>".join(sorted(deca.explications))
+        H.append(
+            f"""<div class="but_explications"><ul><li>{explications}</li></ul></div>"""
+        )
+    # Autorisations de passage
     autorisations_idx = deca.get_autorisations_passage()
     div_autorisations_passage = (
         f"""
@@ -409,7 +415,7 @@ def formsemestre_validation_but(
     """
         if autorisations_idx
         else """<div class="but_autorisations_passage but_explanation">
-            pas d'autorisations de passage enregistrées.
+            Pas d'autorisations de passage enregistrées.
             </div>
             """
     )
@@ -457,13 +463,14 @@ def formsemestre_validation_but(
                 <em>permettre la saisie manuelles des codes
                 {"d'année et " if deca.jury_annuel else ""}
                 de niveaux.
-                Dans ce cas, assurez-vous de la cohérence entre les codes d'UE/RCUE/Année !
+                Assurez-vous alors de la cohérence entre les codes d'UE/RCUE/Année !
                 </em>
             </input>
             </div>
 
+            <div class="but_submit"><button type="submit" class="btn btn-default but_submit_button"
+                >Enregistrer ces décisions</button></div>
             <div class="but_buttons">
-                <span><input type="submit" value="Enregistrer ces décisions"></span>
                 <span>{erase_span}</span>
             </div>
             """