diff --git a/app/but/cursus_but.py b/app/but/cursus_but.py
index f3c19925e847685168c292670947435545dbc596..7d8243ff5a433353016e24f1ab9ac2fb9d2ae9b7 100644
--- a/app/but/cursus_but.py
+++ b/app/but/cursus_but.py
@@ -632,17 +632,22 @@ def formation_semestre_niveaux_warning(formation: Formation, semestre_idx: int)
 
 def ue_associee_au_niveau_du_parcours(
     ues_possibles: list[UniteEns], niveau: ApcNiveau, sem_name: str = "S"
-) -> UniteEns:
-    "L'UE associée à ce niveau, ou None"
+) -> tuple[UniteEns, str]:
+    """L'UE associée à ce niveau, ou None.
+    Renvoie aussi un message d'avertissement en cas d'associations multiples
+    (en principe un niveau ne doit être associé qu'à une seule UE)
+    """
     ues = [ue for ue in ues_possibles if ue.niveau_competence_id == niveau.id]
+    msg = ""
     if len(ues) > 1:
+        msg = f"""{' et '.join(ue.acronyme for ue in ues)} associées au niveau {niveau} / {sem_name}. Utilisez le cas échéant l'item "Déassocier"."""
         # plusieurs UEs associées à ce niveau: élimine celles sans parcours
-        ues_pair_avec_parcours = [ue for ue in ues if ue.parcours]
-        if ues_pair_avec_parcours:
-            ues = ues_pair_avec_parcours
+        ues_avec_parcours = [ue for ue in ues if ue.parcours]
+        if ues_avec_parcours:
+            ues = ues_avec_parcours
     if len(ues) > 1:
         log(f"_niveau_ues: {len(ues)} associées au niveau {niveau} / {sem_name}")
-    return ues[0] if ues else None
+    return ues[0] if ues else None, msg
 
 
 def parcour_formation_competences(
@@ -700,6 +705,7 @@ def parcour_formation_competences(
                 "ue_impair": None,
                 "ues_pair": [],
                 "ues_impair": [],
+                "warning": "",
             }
         # Toutes les UEs de la formation dans ce parcours ou tronc commun
         ues = [
@@ -715,10 +721,10 @@ def parcour_formation_competences(
         ues_impair_possibles = [ue for ue in ues if ue.semestre_idx == (2 * annee - 1)]
 
         # UE associée au niveau dans ce parcours
-        ue_pair = ue_associee_au_niveau_du_parcours(
+        ue_pair, warning_pair = ue_associee_au_niveau_du_parcours(
             ues_pair_possibles, niveau, f"S{2*annee}"
         )
-        ue_impair = ue_associee_au_niveau_du_parcours(
+        ue_impair, warning_impair = ue_associee_au_niveau_du_parcours(
             ues_impair_possibles, niveau, f"S{2*annee-1}"
         )
 
@@ -736,6 +742,7 @@ def parcour_formation_competences(
                 for ue in ues_impair_possibles
                 if (not ue.niveau_competence) or ue.niveau_competence.id == niveau.id
             ],
+            "warning": ", ".join(filter(None, [warning_pair, warning_impair])),
         }
 
     competences = [
diff --git a/app/static/css/parcour_formation.css b/app/static/css/parcour_formation.css
index 845a5a9e4193f0c721bbb6af81692bb486ec20bd..83bbfba0e7d575da1f779800b7ad842e32642a09 100644
--- a/app/static/css/parcour_formation.css
+++ b/app/static/css/parcour_formation.css
@@ -162,25 +162,35 @@ option.non_associe {
 div.ue_validation_code {
     display: inline-block;
 }
+
 div.ue_validation_code div.code {
     margin-left: 12px;
 }
+
 select.validation_rcue {
     color: black;
     display: inline-block;
     margin-left: 32px;
 }
-div.recap_ects, div.link_edit {
+
+div.recap_ects,
+div.link_edit {
     margin-top: 8px;
     margin-left: 16px;
     margin-right: 16px;
     margin-bottom: 16px;
     font-weight: bold;
 }
+
 div.recap_ects {
     background-color: var(--col-c3-2);
     padding: 4px;
 }
+
 .link_edit a {
     padding-right: 48px;
 }
+
+.niveau-warning {
+    font-weight: bold;
+}
\ No newline at end of file
diff --git a/app/templates/but/parcour_formation.j2 b/app/templates/but/parcour_formation.j2
index b2a74da619d2be26efd5d762243ef3671701e618..91f57b4e0ebd9283984b06bba5fb2206ce98cd09 100644
--- a/app/templates/but/parcour_formation.j2
+++ b/app/templates/but/parcour_formation.j2
@@ -99,6 +99,9 @@
                 {% endif %}
                 </span>
                 {{niv['niveau'].libelle if niv['niveau'] else ''}}
+                {% if niv["warning"] %}
+                    <div class="niveau-warning">{{scu.EMO_WARNING|safe}} {{niv["warning"]}}</div>
+                {% endif %}
             </div>
             <div class="ue impair u{{annee}}1">
                 {{ menu_ue(niv, "impair", 2*annee-1) }}