diff --git a/app/but/jury_but_pv.py b/app/but/jury_but_pv.py
index c0b07ba24580e7aab296a0660ba9c34e14831938..1462f1fbf8a9b61f0f758146ac8af47e46b1538f 100644
--- a/app/but/jury_but_pv.py
+++ b/app/but/jury_but_pv.py
@@ -105,7 +105,7 @@ def pvjury_page_but(formsemestre_id: int, fmt="html"):
         },
         xls_style_base=xls_style_base,
     )
-    return tab.make_page(fmt=fmt, javascripts=["js/etud_info.js"], init_qtip=True)
+    return tab.make_page(fmt=fmt, javascripts=["js/etud_info.js"])
 
 
 def pvjury_table_but(
diff --git a/app/scodoc/TrivialFormulator.py b/app/scodoc/TrivialFormulator.py
index fe71c12bdbed46b7231010b0798e24d43c6d7986..cbabc42d5373dda65825186d2414b47b6e6f3913 100644
--- a/app/scodoc/TrivialFormulator.py
+++ b/app/scodoc/TrivialFormulator.py
@@ -95,7 +95,6 @@ def TrivialFormulator(
           To use text_suggest elements, one must:
             - specify options in text_suggest_options (a dict)
             - HTML page must load JS AutoSuggest.js and CSS autosuggest_inquisitor.css
-            - bodyOnLoad must call JS function init_tf_form(formid)
     """
     method = method.lower()
     if method == "get":
@@ -776,9 +775,12 @@ var {field}_as = new bsn.AutoSuggest('{field}', {field}_opts);
             # => only one form with text_suggest field on a page.
             R.append(
                 """<script type="text/javascript">
-            function init_tf_form(formid) {
+            function init_tf_form() {
                 %s
             }
+            document.addEventListener('DOMContentLoaded', function() {
+                init_tf_form();
+            });
             </script>"""
                 % "\n".join(suggest_js)
             )
diff --git a/app/scodoc/html_sco_header.py b/app/scodoc/html_sco_header.py
index 011ab49d9c1b3024fc20760a08782df346c0e445..7a0f4441a95db015c1def05a2c3db2bde40cf4af 100644
--- a/app/scodoc/html_sco_header.py
+++ b/app/scodoc/html_sco_header.py
@@ -27,10 +27,7 @@
 
 """HTML Header/Footer for ScoDoc pages"""
 
-import html
-
 from flask import g, render_template, url_for
-from flask import request
 from flask_login import current_user
 
 import app.scodoc.sco_utils as scu
@@ -85,7 +82,6 @@ _HTML_BEGIN = f"""<!DOCTYPE html>
 
 <head>
 <meta charset="UTF-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
 <meta http-equiv="Content-Style-Type" content="text/css" />
@@ -98,6 +94,7 @@ _HTML_BEGIN = f"""<!DOCTYPE html>
 <link href="{scu.STATIC_DIR}/css/scodoc.css" rel="stylesheet" type="text/css" />
 <link href="{scu.STATIC_DIR}/css/menu.css" rel="stylesheet" type="text/css" />
 <link rel="stylesheet" type="text/css" href="{scu.STATIC_DIR}/DataTables/datatables.min.css" />
+<link href="{scu.STATIC_DIR}/css/gt_table.css" rel="stylesheet" type="text/css" />
 <script src="{scu.STATIC_DIR}/libjs/menu.js"></script>
 <script src="{scu.STATIC_DIR}/libjs/bubble.js"></script>
 <script>
@@ -121,12 +118,19 @@ _HTML_BEGIN = f"""<!DOCTYPE html>
 <script src="{scu.STATIC_DIR}/libjs/qtip/jquery.qtip-3.0.3.min.js"></script>
 <link type="text/css" rel="stylesheet" href="{scu.STATIC_DIR}/libjs/qtip/jquery.qtip-3.0.3.min.css" />
 
+<link type="text/css" rel="stylesheet" href="{scu.STATIC_DIR}/libjs/timepicker-1.3.5/jquery.timepicker.min.css" />
+<script src="{scu.STATIC_DIR}/libjs/timepicker-1.3.5/jquery.timepicker.min.js"></script>
+
 <script src="{scu.STATIC_DIR}/js/scodoc.js"></script>
 <script src="{scu.STATIC_DIR}/js/etud_info.js"></script>
+
+<script src="{scu.STATIC_DIR}/libjs/qtip/jquery.qtip-3.0.3.min.js"></script>
+<link type="text/css" rel="stylesheet" href="{scu.STATIC_DIR}/libjs/qtip/jquery.qtip-3.0.3.min.css" />
 """
 
 
 def scodoc_top_html_header(page_title="ScoDoc: bienvenue"):
+    """HTML header for top level pages"""
     H = [
         _HTML_BEGIN % {"page_title": page_title, "encoding": scu.SCO_ENCODING},
         """</head><body id="gtrcontent">""",
@@ -143,13 +147,8 @@ def sco_header(
     cssstyles=(),  # additionals CSS sheets
     javascripts=(),  # additionals JS filenames to load
     scripts=(),  # script to put in page header
-    bodyOnLoad="",  # JS
-    init_qtip=False,  # include qTip
     init_google_maps=False,  # Google maps
-    init_datatables=True,
     titrebandeau="",  # titre dans bandeau superieur
-    head_message="",  # message action (petit cadre jaune en haut) DEPRECATED
-    user_check=True,  # verifie passwords temporaires
     etudid=None,
     formsemestre_id=None,
 ):
@@ -162,12 +161,6 @@ def sco_header(
         g.current_etudid = etudid
     scodoc_flash_status_messages()
 
-    # Get head message from http request:
-    if not head_message:
-        if request.method == "POST":
-            head_message = request.form.get("head_message", "")
-        elif request.method == "GET":
-            head_message = request.args.get("head_message", "")
     params = {
         "page_title": page_title or sco_version.SCONAME,
         "no_side_bar": no_side_bar,
@@ -176,37 +169,13 @@ def sco_header(
         "titrebandeau_mkup": "<td>" + titrebandeau + "</td>",
         "authuser": current_user.user_name,
     }
-    if bodyOnLoad:
-        params["bodyOnLoad_mkup"] = """onload="%s" """ % bodyOnLoad
-    else:
-        params["bodyOnLoad_mkup"] = ""
     if no_side_bar:
         params["margin_left"] = "1em"
     else:
         params["margin_left"] = "140px"
 
-    H = [
-        """<!DOCTYPE html><html lang="fr">
-<!-- ScoDoc legacy -->
-<head>
-<meta charset="utf-8"/>
-<title>%(page_title)s</title>
-<meta name="LANG" content="fr" />
-<meta name="DESCRIPTION" content="ScoDoc" />
+    H = [_HTML_BEGIN % params]
 
-"""
-        % params
-    ]
-    # jQuery UI
-    # can modify loaded theme here
-    H.append(
-        f"""
-        <link type="text/css" rel="stylesheet"
-            href="{scu.STATIC_DIR}/libjs/jquery-ui-1.10.4.custom/css/smoothness/jquery-ui-1.10.4.custom.min.css" />
-        <link type="text/css" rel="stylesheet"
-            href="{scu.STATIC_DIR}/libjs/timepicker-1.3.5/jquery.timepicker.min.css" />
-        """
-    )
     if init_google_maps:
         # It may be necessary to add an API key:
         H.append('<script src="https://maps.google.com/maps/api/js"></script>')
@@ -219,61 +188,17 @@ def sco_header(
 
     H.append(
         f"""
-<link href="{scu.STATIC_DIR}/css/scodoc.css" rel="stylesheet" type="text/css" />
-<link href="{scu.STATIC_DIR}/css/menu.css" rel="stylesheet" type="text/css" />
-<link href="{scu.STATIC_DIR}/css/gt_table.css" rel="stylesheet" type="text/css" />
-
-<script src="{scu.STATIC_DIR}/libjs/menu.js"></script>
-<script src="{scu.STATIC_DIR}/libjs/bubble.js"></script>
 <script>
- window.onload=function(){{
-     if (document.getElementById('gtrcontent')) {{
-        enableTooltips("gtrcontent");
-     }}
-     if (document.getElementById('sidebar')) {{
-        enableTooltips("sidebar");
-     }}
- }};
  const SCO_URL="{url_for("scolar.index_html", scodoc_dept=g.scodoc_dept)}";
  const SCO_TIMEZONE="{scu.TIME_ZONE}";
 </script>"""
     )
 
-    # jQuery
-    H.append(
-        f"""
-    <script src="{scu.STATIC_DIR}/jQuery/jquery.js"></script>
-    <script src="{scu.STATIC_DIR}/libjs/jquery.field.min.js"></script>
-    """
-    )
-    # qTip
-    if init_qtip:
-        H.append(
-            f"""<script src="{scu.STATIC_DIR}/libjs/qtip/jquery.qtip-3.0.3.min.js"></script>
-        <link type="text/css" rel="stylesheet"
-            href="{scu.STATIC_DIR}/libjs/qtip/jquery.qtip-3.0.3.min.css" />
-        """
-        )
-
-    H.append(
-        f"""<script
-        src="{scu.STATIC_DIR}/libjs/jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.min.js"></script>
-        <script src="{scu.STATIC_DIR}/libjs/timepicker-1.3.5/jquery.timepicker.min.js"></script>
-        <script src="{scu.STATIC_DIR}/js/scodoc.js"></script>
-        """
-    )
-    if init_google_maps:
+    if init_google_maps:  # utilisé uniquement pour carte lycées
         H.append(
             f'<script src="{scu.STATIC_DIR}/libjs/jquery.ui.map.full.min.js"></script>'
         )
-    if init_datatables:
-        H.append(
-            f"""<link rel="stylesheet" type="text/css" href="{scu.STATIC_DIR}/DataTables/datatables.min.css"/>
-        <script src="{scu.STATIC_DIR}/DataTables/datatables.min.js"></script>"""
-        )
-    # H.append(
-    #    f'<link href="{scu.STATIC_DIR}/css/tooltip.css" rel="stylesheet" type="text/css" />'
-    # )
+
     # JS additionels
     for js in javascripts:
         H.append(f"""<script src="{scu.STATIC_DIR}/{js}"></script>\n""")
@@ -295,15 +220,16 @@ def sco_header(
             H.append(script)
         H.append("""</script>""")
 
-    H.append("</head>")
-
-    # Body et bandeau haut:
-    H.append("""<body %(bodyOnLoad_mkup)s>""" % params)
-    H.append(scu.CUSTOM_HTML_HEADER)
-    #
-    if not no_side_bar:
-        H.append(html_sidebar.sidebar(etudid))
-    H.append("""<div id="gtrcontent">""")
+    # Fin head, Body et bandeau haut:
+    H.append(
+        f"""</head>
+<!-- Legacy ScoDoc header -->
+<body>
+{scu.CUSTOM_HTML_HEADER}
+{'' if no_side_bar else html_sidebar.sidebar(etudid)}
+<div id="gtrcontent">
+"""
+    )
     # En attendant le replacement complet de cette fonction,
     # inclusion ici des messages flask
     H.append(render_template("flashed_messages.j2"))
@@ -311,10 +237,6 @@ def sco_header(
     # Barre menu semestre:
     H.append(formsemestre_page_title(formsemestre_id))
 
-    #
-    if head_message:
-        H.append('<div class="head_message">' + html.escape(head_message) + "</div>")
-    #
     # div pour affichage messages temporaires
     H.append('<div id="sco_msg" class="head_message"></div>')
     #
diff --git a/app/scodoc/sco_archives_etud.py b/app/scodoc/sco_archives_etud.py
index da1fcbb9896c7e66313fe26d10468e40736b96cd..9b332b030556e8e7633c50bb8f7177ba19bcec8c 100644
--- a/app/scodoc/sco_archives_etud.py
+++ b/app/scodoc/sco_archives_etud.py
@@ -217,7 +217,6 @@ def etud_delete_archive(etudid, archive_name, dialog_confirmed=False):
                 "scolar.fiche_etud",
                 scodoc_dept=g.scodoc_dept,
                 etudid=etudid,
-                head_message="annulation",
             ),
             parameters={"etudid": etudid, "archive_name": archive_name},
         )
diff --git a/app/scodoc/sco_archives_formsemestre.py b/app/scodoc/sco_archives_formsemestre.py
index f3eb098d4d20be8277cd7a159c04c0f6e5d5c5f0..f2fbde23b1383a526c5488ba8c56c12eed08e4b3 100644
--- a/app/scodoc/sco_archives_formsemestre.py
+++ b/app/scodoc/sco_archives_formsemestre.py
@@ -242,7 +242,6 @@ def formsemestre_archive(formsemestre_id, group_ids: list[int] = None):
             "Archiver les PV et résultats du semestre",
             javascripts=sco_groups_view.JAVASCRIPTS,
             cssstyles=sco_groups_view.CSSSTYLES,
-            init_qtip=True,
         ),
         """<p class="help">Cette page permet de générer et d'archiver tous
 les documents résultant de ce semestre: PV de jury, lettres individuelles,
diff --git a/app/scodoc/sco_etape_apogee_view.py b/app/scodoc/sco_etape_apogee_view.py
index 5845013b39b53af9c288f3e19c8baa50aba9ae68..9a576be8c98d70ef151b2b3c72e6b9e398f7208b 100644
--- a/app/scodoc/sco_etape_apogee_view.py
+++ b/app/scodoc/sco_etape_apogee_view.py
@@ -597,7 +597,6 @@ def _view_etuds_page(
     return f"""
         {html_sco_header.sco_header(
             page_title=title,
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         )}
         <h2>{title}</h2>
@@ -751,7 +750,6 @@ def view_apo_csv(etape_apo="", semset_id="", fmt="html"):
     H = [
         html_sco_header.sco_header(
             page_title=f"""Maquette Apogée enregistrée pour {etape_apo}""",
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         ),
         f"""<h2>Étudiants dans la maquette Apogée {etape_apo}</h2>
diff --git a/app/scodoc/sco_export_results.py b/app/scodoc/sco_export_results.py
index 2d90f3c1153f4030281b08d9ab64d86647b94016..b28bd63d5a7f95bec5e1399489409af67b141531 100644
--- a/app/scodoc/sco_export_results.py
+++ b/app/scodoc/sco_export_results.py
@@ -287,7 +287,6 @@ def scodoc_table_results(
     H = [
         html_sco_header.sco_header(
             page_title="Export résultats",
-            init_qtip=True,
             javascripts=html_sco_header.BOOTSTRAP_MULTISELECT_JS
             + ["js/etud_info.js", "js/export_results.js"],
             cssstyles=html_sco_header.BOOTSTRAP_MULTISELECT_CSS,
diff --git a/app/scodoc/sco_find_etud.py b/app/scodoc/sco_find_etud.py
index 621390ff1f904aab411f052b28f6d37424989080..6fad97cb40d5801beec364ab714069515df95293 100644
--- a/app/scodoc/sco_find_etud.py
+++ b/app/scodoc/sco_find_etud.py
@@ -181,7 +181,6 @@ def search_etud_in_dept(expnom=""):
         html_sco_header.sco_header(
             page_title="Recherche d'un étudiant",
             no_side_bar=False,
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         )
     ]
diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py
index dc066f219031b578d4d64019b3e951e27f744497..e5744970990951325aa852bc9c03686858399645 100644
--- a/app/scodoc/sco_formsemestre_edit.py
+++ b/app/scodoc/sco_formsemestre_edit.py
@@ -86,7 +86,6 @@ def formsemestre_createwithmodules():
             page_title="Création d'un semestre",
             javascripts=["libjs/AutoSuggest.js", "js/formsemestre_edit.js"],
             cssstyles=["css/autosuggest_inquisitor.css"],
-            bodyOnLoad="init_tf_form('')",
         ),
         """<h2>Mise en place d'un semestre de formation</h2>""",
     ]
@@ -108,7 +107,6 @@ def formsemestre_editwithmodules(formsemestre_id):
             "Modification du semestre",
             javascripts=["libjs/AutoSuggest.js", "js/formsemestre_edit.js"],
             cssstyles=["css/autosuggest_inquisitor.css"],
-            bodyOnLoad="init_tf_form('')",
         )
     ]
     if not formsemestre.etat:
@@ -1168,7 +1166,6 @@ def formsemestre_clone(formsemestre_id):
             "Copie du semestre",
             javascripts=["libjs/AutoSuggest.js"],
             cssstyles=["css/autosuggest_inquisitor.css"],
-            bodyOnLoad="init_tf_form('')",
         ),
         """<p class="help">Cette opération duplique un semestre: on reprend les mêmes modules et responsables. Aucun étudiant n'est inscrit.</p>""",
     ]
diff --git a/app/scodoc/sco_formsemestre_inscriptions.py b/app/scodoc/sco_formsemestre_inscriptions.py
index 217a096e55ad5807a35be360714092bf0c875aa7..bbe9f4f3c7fda18e69ffec932ffe9b902ef9e8c5 100644
--- a/app/scodoc/sco_formsemestre_inscriptions.py
+++ b/app/scodoc/sco_formsemestre_inscriptions.py
@@ -853,7 +853,6 @@ def formsemestre_inscrits_ailleurs(formsemestre_id):
     H = [
         html_sco_header.html_sem_header(
             "Inscriptions multiples parmi les étudiants du semestre ",
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         )
     ]
diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py
index 40ff6d7cf7ff334bf812ebdc003ac1dd4ec392e8..c111520d1dbadc28352abcceb9a8af76272443a9 100644
--- a/app/scodoc/sco_groups_view.py
+++ b/app/scodoc/sco_groups_view.py
@@ -116,7 +116,6 @@ def groups_view(
     { html_sco_header.sco_header(
             javascripts=JAVASCRIPTS,
             cssstyles=CSSSTYLES,
-            init_qtip=True,
         )
     }
     <style>
@@ -586,8 +585,8 @@ def groups_table(
         etud_info["_nom_disp_order"] = etud_sort_key(etud_info)
         etud_info["_prenom_target"] = fiche_url
 
-        etud_info["_nom_disp_td_attrs"] = (
-            'id="%s" class="etudinfo"' % (etud_info["etudid"])
+        etud_info["_nom_disp_td_attrs"] = 'id="%s" class="etudinfo"' % (
+            etud_info["etudid"]
         )
         etud_info["bourse_str"] = "oui" if etud_info["boursier"] else "non"
         if etud_info["etat"] == "D":
diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py
index 968c85d6c601b1082c3400d3d71acf3c797906f0..4d1d31b46e4eb8f57176cb96a052895536a95bbd 100644
--- a/app/scodoc/sco_inscr_passage.py
+++ b/app/scodoc/sco_inscr_passage.py
@@ -315,7 +315,6 @@ def formsemestre_inscr_passage(
     H = [
         html_sco_header.sco_header(
             page_title="Passage des étudiants",
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         )
     ]
diff --git a/app/scodoc/sco_lycee.py b/app/scodoc/sco_lycee.py
index 1508c70a381c76b0b328b24a01fbe4a2697f7de2..79273e1675d7a56164904f3fb7f1db05a0f44a0c 100644
--- a/app/scodoc/sco_lycee.py
+++ b/app/scodoc/sco_lycee.py
@@ -98,7 +98,6 @@ def scodoc_table_etuds_lycees(fmt="html"):
         html_sco_header.sco_header(
             page_title=tab.page_title,
             init_google_maps=True,
-            init_qtip=True,
             javascripts=["js/etud_info.js", "js/map_lycees.js"],
         ),
         """<h2 class="formsemestre">Lycées d'origine des %d étudiants (%d semestres)</h2>"""
@@ -219,7 +218,6 @@ def formsemestre_etuds_lycees(
         html_sco_header.sco_header(
             page_title=tab.page_title,
             init_google_maps=True,
-            init_qtip=True,
             cssstyles=sco_groups_view.CSSSTYLES,
             javascripts=sco_groups_view.JAVASCRIPTS
             + ["js/etud_info.js", "js/map_lycees.js"],
diff --git a/app/scodoc/sco_moduleimpl_inscriptions.py b/app/scodoc/sco_moduleimpl_inscriptions.py
index 2e5968b69cf61fea6b0e2621055e1e27e62f57a5..bc78942fd16503b4e0e336b37e71425f9091a766 100644
--- a/app/scodoc/sco_moduleimpl_inscriptions.py
+++ b/app/scodoc/sco_moduleimpl_inscriptions.py
@@ -84,7 +84,6 @@ def moduleimpl_inscriptions_edit(
         return  # can_change_inscriptions raises exception
     header = html_sco_header.sco_header(
         page_title="Inscription au module",
-        init_qtip=True,
         javascripts=["js/etud_info.js"],
     )
     footer = html_sco_header.sco_footer()
@@ -304,7 +303,6 @@ def moduleimpl_inscriptions_stats(formsemestre_id):
         html_sco_header.html_sem_header(
             "Inscriptions aux modules et UE du semestre",
             javascripts=["js/etud_info.js", "js/moduleimpl_inscriptions_stats.js"],
-            init_qtip=True,
         )
     ]
 
diff --git a/app/scodoc/sco_pv_forms.py b/app/scodoc/sco_pv_forms.py
index b204819ecf3ba856e2f9fd1f1202638024b16209..d90363aa6ed0a30f7accf52fcf932fab947e805f 100644
--- a/app/scodoc/sco_pv_forms.py
+++ b/app/scodoc/sco_pv_forms.py
@@ -264,7 +264,6 @@ def formsemestre_pvjury(formsemestre_id, fmt="html", publish=True):
     H = [
         html_sco_header.html_sem_header(
             "Décisions du jury pour le semestre",
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         ),
         """<p>(dernière modif le %s)</p>""" % dpv["date"],
@@ -372,7 +371,6 @@ def formsemestre_pvjury_pdf(formsemestre_id, group_ids: list[int] = None, etudid
             f"Édition du PV de jury {etuddescr}",
             javascripts=sco_groups_view.JAVASCRIPTS,
             cssstyles=sco_groups_view.CSSSTYLES,
-            init_qtip=True,
         ),
         f"""<div class="help">Utiliser cette page pour éditer des versions provisoires des PV.
           <span class="fontred">Il est recommandé d'archiver les versions définitives:
@@ -559,7 +557,6 @@ def formsemestre_lettres_individuelles(formsemestre_id, group_ids=[]):
             "Édition des lettres individuelles",
             javascripts=sco_groups_view.JAVASCRIPTS,
             cssstyles=sco_groups_view.CSSSTYLES,
-            init_qtip=True,
         ),
         f"""<p class="help">Utiliser cette page pour éditer des versions provisoires des PV.
           <span class="fontred">Il est recommandé d'archiver les versions définitives: <a
diff --git a/app/scodoc/sco_recapcomplet.py b/app/scodoc/sco_recapcomplet.py
index f45d43da2d54a8df27caf6ec8634c2fc7df66b9a..98075d762eb156f0e66d675ee87992919d9c09ce 100644
--- a/app/scodoc/sco_recapcomplet.py
+++ b/app/scodoc/sco_recapcomplet.py
@@ -123,7 +123,6 @@ def formsemestre_recapcomplet(
             page_title=f"{formsemestre.sem_modalite()}: "
             + ("jury" if mode_jury else "moyennes"),
             no_side_bar=True,
-            init_qtip=True,
             javascripts=["js/etud_info.js", "js/table_recap.js"],
         ),
         sco_formsemestre_status.formsemestre_status_head(
diff --git a/app/scodoc/sco_report.py b/app/scodoc/sco_report.py
index db037e70cf633612cf1b0808cdd8eff532f257d3..919f70e4c58aacf9646247bde89c6d2624c1da26 100644
--- a/app/scodoc/sco_report.py
+++ b/app/scodoc/sco_report.py
@@ -1367,7 +1367,6 @@ def formsemestre_suivi_cursus(
     H = [
         html_sco_header.sco_header(
             page_title=tab.page_title,
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         ),
         """<h2 class="formsemestre">Cursus suivis par les étudiants de ce semestre</h2>""",
diff --git a/app/scodoc/sco_saisie_excel.py b/app/scodoc/sco_saisie_excel.py
index d725dae55f159734164dfc2cf1392c5b51bf9b77..c95f154b9a270b76c3cef992fe93b512b390bbde 100644
--- a/app/scodoc/sco_saisie_excel.py
+++ b/app/scodoc/sco_saisie_excel.py
@@ -1001,7 +1001,6 @@ def saisie_notes_tableur(evaluation_id: int, group_ids=()):
             page_title=page_title,
             javascripts=sco_groups_view.JAVASCRIPTS,
             cssstyles=sco_groups_view.CSSSTYLES,
-            init_qtip=True,
         ),
         sco_evaluations.evaluation_describe(evaluation_id=evaluation_id),
         """<span class="eval_title">Saisie des notes par fichier</span>""",
diff --git a/app/scodoc/sco_saisie_notes.py b/app/scodoc/sco_saisie_notes.py
index 86b2cc30383b02bb29c7c48aaf6e89d1693ea11d..ecdf83bb920c30266b487a0b3e5dde86906cd25d 100644
--- a/app/scodoc/sco_saisie_notes.py
+++ b/app/scodoc/sco_saisie_notes.py
@@ -668,7 +668,6 @@ def saisie_notes(evaluation_id: int, group_ids: list = None):
             page_title=page_title,
             javascripts=sco_groups_view.JAVASCRIPTS + ["js/saisie_notes.js"],
             cssstyles=sco_groups_view.CSSSTYLES,
-            init_qtip=True,
         ),
         sco_evaluations.evaluation_describe(
             evaluation_id=evaluation_id, link_saisie=False
diff --git a/app/scodoc/sco_semset.py b/app/scodoc/sco_semset.py
index e70392c9ef517ca9e38b2407aecada28a73c18f0..2eb4c4b3949c822c6f0d8186ca669d77565aca12 100644
--- a/app/scodoc/sco_semset.py
+++ b/app/scodoc/sco_semset.py
@@ -519,7 +519,6 @@ def semset_page(fmt="html"):
     H = [
         html_sco_header.sco_header(
             page_title=page_title,
-            init_qtip=True,
             javascripts=["libjs/jinplace-1.2.1.min.js"],
         ),
         """<script>$(function() {
diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py
index 19c64367d5faee4eed0921c376b20e7d6f0e22e7..f92c9a38aa474a842ff3ed18270c79122f771baf 100644
--- a/app/scodoc/sco_synchro_etuds.py
+++ b/app/scodoc/sco_synchro_etuds.py
@@ -171,7 +171,6 @@ def formsemestre_synchro_etuds(
     H = [
         html_sco_header.sco_header(
             page_title="Synchronisation étudiants",
-            init_qtip=True,
             javascripts=["js/etud_info.js"],
         )
     ]
diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py
index 90cb4365bf0b7da424d3447f8ca33a2d7a210918..29bccd68af4f0704a87f07fef591cfdf6a1b735d 100644
--- a/app/scodoc/sco_utils.py
+++ b/app/scodoc/sco_utils.py
@@ -1056,6 +1056,15 @@ def flash_once(message: str):
         g.sco_flashed_once.add(message)
 
 
+def html_flash_message(message: str):
+    """HTML for flashed messaged, for legacy codes"""
+    return f"""<div class="container flashes">
+        <div class="alert alert-info alert-message" role="alert">
+        {message}
+        </div>
+    </div>"""
+
+
 def sendCSVFile(data, filename):  # DEPRECATED  utiliser send_file
     """publication fichier CSV."""
     return send_file(data, filename=filename, mime=CSV_MIMETYPE, attached=True)
diff --git a/app/templates/base.j2 b/app/templates/base.j2
index c936da1ed80a4913736a250c422bb832343dab70..87bda5b78cb72d4eb126f2ca6ed0d01272cb7f35 100644
--- a/app/templates/base.j2
+++ b/app/templates/base.j2
@@ -94,11 +94,6 @@
 {{ super() }}
 <script src="{{scu.STATIC_DIR}}/libjs/menu.js"></script>
 <script src="{{scu.STATIC_DIR}}/libjs/bubble.js"></script>
-<script src="{{scu.STATIC_DIR}}/jQuery/jquery.js"></script>
-<script src="{{scu.STATIC_DIR}}/jQuery/jquery-migrate-1.2.0.min.js"></script>
-<script src="{{scu.STATIC_DIR}}/libjs/jquery.field.min.js"></script>
-<script src="{{scu.STATIC_DIR}}/libjs/jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.min.js"></script>
-<script src="{{scu.STATIC_DIR}}/libjs/qtip/jquery.qtip-3.0.3.min.js"></script>
 <script src="{{scu.STATIC_DIR}}/js/scodoc.js"></script>
 <script>
     const SCO_URL = "{% if g.scodoc_dept %}{{
diff --git a/app/views/absences.py b/app/views/absences.py
index 546d393438d08341720ad4095094f3c27b9be441..ad10908eae2a9fad87df196fb73d927936193a0b 100644
--- a/app/views/absences.py
+++ b/app/views/absences.py
@@ -247,7 +247,6 @@ def list_billets():
         html_sco_header.sco_header(
             page_title="Billet d'absence non traités",
             javascripts=["js/etud_info.js"],
-            init_qtip=True,
         ),
         f"<h2>Billets d'absence en attente de traitement ({table.get_nb_rows()})</h2>",
     ]
diff --git a/app/views/notes.py b/app/views/notes.py
index ab00691277093e0849cc2048dbaaa353e8ef1fed..697eee5c43f789d539d6e570f8ae2f52e3a34eca 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -951,7 +951,6 @@ def edit_enseignants_form(moduleimpl_id):
         page_title=f"Enseignants du module {modimpl.module.titre or modimpl.module.code}",
         javascripts=["libjs/AutoSuggest.js"],
         cssstyles=["css/autosuggest_inquisitor.css"],
-        bodyOnLoad="init_tf_form('')",
     )
     footer = html_sco_header.sco_footer()
 
@@ -1044,7 +1043,9 @@ def edit_enseignants_form(moduleimpl_id):
                 or ens.id == modimpl.responsable_id
             ):
                 H.append(
-                    f"""<p class="help">Enseignant {ens.user_name} déjà dans la liste !</p>"""
+                    scu.html_flash_message(
+                        f"Enseignant {ens.user_name} déjà dans la liste !"
+                    )
                 )
             else:
                 modimpl.enseignants.append(ens)
@@ -1078,7 +1079,6 @@ def edit_moduleimpl_resp(moduleimpl_id: int):
             }">module {modimpl.module.titre or ""}</a>""",
             javascripts=["libjs/AutoSuggest.js"],
             cssstyles=["css/autosuggest_inquisitor.css"],
-            bodyOnLoad="init_tf_form('')",
         )
     ]
     help_str = """<p class="help">Taper le début du nom de l'enseignant.</p>"""
@@ -1770,7 +1770,6 @@ def evaluation_listenotes():
             page_title=page_title,
             cssstyles=["css/verticalhisto.css"],
             javascripts=["js/etud_info.js"],
-            init_qtip=True,
         )
         F = html_sco_header.sco_footer()
         return H + html_content + F
diff --git a/app/views/scolar.py b/app/views/scolar.py
index 43259822a522adf124de3b1094ec8021227ca713..92a8b1bc74637bad3b435171da4cc3ff42853654 100644
--- a/app/views/scolar.py
+++ b/app/views/scolar.py
@@ -951,7 +951,6 @@ def partition_editor(formsemestre_id: int, edit_partition=False):
                 "js/partition_editor.js",
             ],
             page_title=f"Partitions de {formsemestre.titre_annee()}",
-            init_datatables=True,
         ),
         """<h2></h2>""",
         render_template(
diff --git a/app/views/users.py b/app/views/users.py
index 5065c17c8ad52ddbef59b589ba017d372a24efc9..48d76a86489c11315283524050bc06c70ad9a24b 100644
--- a/app/views/users.py
+++ b/app/views/users.py
@@ -1002,7 +1002,7 @@ def form_change_password(user_name=None):
     if not can_handle_passwd(user):
         return "\n".join(
             [
-                html_sco_header.sco_header(user_check=False),
+                html_sco_header.sco_header(),
                 "<p>Vous n'avez pas la permission de changer ce mot de passe</p>",
                 html_sco_header.sco_footer(),
             ]