diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c766c2111cd99c7eb0323d8dbd3d1211ffc14ae..d6c8ddc357657f7535d89c951a1bca3e64d691e1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,13 @@
 CHANGELOG
 =========
 
+5.0.0
+-----
+- Migration vers Bootstrap 5 (front-end).
+- Infos à propos de la connexion dans le menu principal : simple bouton 'Connexion' si aucun utilisateur connecté ;
+  bouton 'Déconnexion' déplacé dans le popover.
+
+
 4.0.2
 -----
 - RoleFormatter : correction pour exploiter la méthode __toString() si présente.
@@ -13,6 +20,7 @@ CHANGELOG
 -----
 - Passage de Zend à Laminas
 
+
 3.2.10
 -----
 - Possibilité d'activer ou non (en config) les logs des échecs d'authentification LDAP.
diff --git a/composer.json b/composer.json
index 5250c0f91da842a21170972f4e93e1318d4fe015..4acbea8654caaf79b125c7ba0ae16b17f1dffb5c 100644
--- a/composer.json
+++ b/composer.json
@@ -8,7 +8,7 @@
         }
     ],
     "require": {
-        "unicaen/app": "^4.0",
+        "unicaen/app": "dev-release_5_bs5",
         "unicaen/bjy-authorize": "^4.0",
         "jasig/phpcas": "^1.3",
         "ramsey/uuid": "^3.7",
diff --git a/src/UnicaenAuth/Authentication/Storage/AuthFactory.php b/src/UnicaenAuth/Authentication/Storage/AuthFactory.php
index 124e6d7d0e6424b23078d6fad9f52af6044d98ef..997a47368587dd76ee94e19828520c150fbc7084 100644
--- a/src/UnicaenAuth/Authentication/Storage/AuthFactory.php
+++ b/src/UnicaenAuth/Authentication/Storage/AuthFactory.php
@@ -35,4 +35,4 @@ class AuthFactory
 
         return $storage;
     }
-}
+}
\ No newline at end of file
diff --git a/src/UnicaenAuth/View/Helper/AppConnection.php b/src/UnicaenAuth/View/Helper/AppConnection.php
index 81442a191b5d79529a86b2c62693387b1c2c62c1..ce6aeda8c1861977aa0d8e07d928dae2abae1033 100644
--- a/src/UnicaenAuth/View/Helper/AppConnection.php
+++ b/src/UnicaenAuth/View/Helper/AppConnection.php
@@ -1,30 +1,41 @@
 <?php
+
 namespace UnicaenAuth\View\Helper;
 
 /**
- * Aide de vue générant le lien et les infos concernant la connexion à l'application.
+ * Aide de vue dessinant :
+ * - le nom de l'utilisateur connecté éventuel ;
+ * - le lien de connexion/déconnexion.
  *
- * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
+ * @author Unicaen
  */
 class AppConnection extends \UnicaenApp\View\Helper\AppConnection
 {
-
     /**
-     * Retourne le code HTML généré par cette aide de vue.
-     *
      * @return string
      */
-    public function __toString()
+    public function __toString(): string
     {
-        $connexion = [];
+        $parts = [];
 
-        if (($tmp = $this->getView()->plugin('userCurrent'))) {
-            $connexion[] = "" . $tmp;
+        /** @var \UnicaenAuth\View\Helper\UserCurrent $userCurrentHelper */
+        $userCurrentHelper = $this->getView()->plugin('userCurrent');
+        if ($userCurrentHelper) {
+            if ($html = "" . $userCurrentHelper) {
+                $parts[] = $html;
+            }
         }
-        if (($tmp = $this->getView()->plugin('userConnection'))) {
-            $connexion[] = "" . $tmp;
+
+        /** @var \UnicaenAuth\View\Helper\UserConnection $userConnectionHelper */
+        $userConnectionHelper = $this->getView()->plugin('userConnection');
+        if ($userConnectionHelper) {
+            // On ne dessine que le lien de Connexion.
+            // Le lien de déconnexion est dessiné dans le popover dédié à l'utilisateur connecté.
+            if ($html = $userConnectionHelper->addClass('btn btn-success')->renderConnection()) {
+                $parts[] = $html;
+            }
         }
 
-        return implode(' | ', $connexion);
+        return implode(' | ', $parts);
     }
 }
\ No newline at end of file
diff --git a/src/UnicaenAuth/View/Helper/UserConnection.php b/src/UnicaenAuth/View/Helper/UserConnection.php
index c590c03df9cd96910e39427e9895a0e5e353c9ea..f0a44a4269be602268e38bc413cc7f58b1764bda 100644
--- a/src/UnicaenAuth/View/Helper/UserConnection.php
+++ b/src/UnicaenAuth/View/Helper/UserConnection.php
@@ -1,40 +1,104 @@
 <?php
+
 namespace UnicaenAuth\View\Helper;
 
 /**
- * Aide de vue de génération du lien de connexion/déconnexion à l'appli selon qu'un 
- * utilisateur est connecté ou pas.
+ * Aide de vue dessinant :
+ * - soit le lien de connexion à l'appli : {@see renderConnection()}.
+ * - soit le lien de déconnexion  : {@see renderDisconnection()}.
+ * - soit l'un ou l'autre selon qu'un utilisateur est connecté ou pas : {@see render()}.
  *
- * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
+ * @author Unicaen
  */
 class UserConnection extends UserAbstract
 {
-    /**
-     * Point d'entrée.
-     *
-     * @return UserConnection
-     */
-    public function __invoke()
+    protected $template = '<a class="%s" href="%s" title="%s">%s</a>';
+
+    protected $classes = [
+        'user-connection',
+        //'navbar-link',
+    ];
+
+    public function __invoke(): self
     {
         return $this;
     }
 
+    public function addClass(string $class): self
+    {
+        $this->classes[] = $class;
+
+        return $this;
+    }
+
     /**
-     * Retourne le code HTML généré par cette aide de vue.
-     *
      * @return string
      */
     public function __toString()
     {
-        $template = '%s';
-        $out = sprintf($template, $this->createConnectionLink());
+        return $this->render();
+    }
+
+    public function render(): string
+    {
+        if ($this->getIdentity()) {
+            return $this->renderDisconnection();
+        } else {
+            return $this->renderConnection();
+        }
+    }
+
+    /**
+     * @return string Lien de connexion, ou '' si l'utilisateur est déjà connecté.
+     */
+    public function renderConnection(): string
+    {
+        if ($this->getIdentity()) {
+            return '';
+        }
+
+        $urlHelper = $this->getView()->plugin('url');
+        $href  = $urlHelper('zfcuser/login');
+        $lib   = "Connexion";
+        $title = "Cliquez pour vous authentifier";
+
+        if ($this->getTranslator()) {
+            $lib   = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain());
+            $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain());
+        }
+
+        $classes = implode(' ', $this->classes);
+
+        return sprintf($this->template, $classes, $href, $title, $lib);
+    }
+
+    /**
+     * @return string Lien de déconnexion, ou '' si aucun utilisateur n'est connecté.
+     */
+    public function renderDisconnection(): string
+    {
+        if (!$this->getIdentity()) {
+            return '';
+        }
+
+        $urlHelper = $this->getView()->plugin('url');
+        $href  = $urlHelper('zfcuser/logout');
+        $lib   = "Déconnexion";
+        $title = "Cliquez pour vous déconnecter";
+
+        if ($this->getTranslator()) {
+            $lib   = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain());
+            $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain());
+        }
+
+        $classes = implode(' ', $this->classes);
 
-        return $out;
+        return sprintf($this->template, $classes, $href, $title, $lib);
     }
 
     /**
-     * 
      * @return string
+     * @deprecated Utiliser {@see render()}
      */
     protected function createConnectionLink()
     {
@@ -42,11 +106,11 @@ class UserConnection extends UserAbstract
 
         $urlHelper = $this->getView()->plugin('url');
 
-        $template = '<a class="navbar-link user-connection" href="%s" title="%s">%s</a>';
+        $template = '<a class="btn btn-lg btn-outline-primary navbar-link user-connection" href="%s" title="%s">%s</a>';
         if (!$identity) {
             $href  = $urlHelper('zfcuser/login');
             $lib   = "Connexion";
-            $title = "Affiche le formulaire d'authentification";
+            $title = "Cliquez pour vous authentifier";
         }
         else {
             $href  = $urlHelper('zfcuser/logout');
diff --git a/src/UnicaenAuth/View/Helper/UserCurrent.php b/src/UnicaenAuth/View/Helper/UserCurrent.php
index d086f7c380968b90473c11b4e76730c95b02adec..3186e5ae840cfd165839aaab2e3b32e938a7f375 100644
--- a/src/UnicaenAuth/View/Helper/UserCurrent.php
+++ b/src/UnicaenAuth/View/Helper/UserCurrent.php
@@ -2,11 +2,14 @@
 namespace UnicaenAuth\View\Helper;
 
 /**
- * Aide de vue affichant toutes les infos concernant l'utilisateur courant.
- * C'est à dire :
- *  - "Aucun" + lien de connexion OU BIEN nom de l'utilisateur connecté + lien de déconnexion
- *  - profil de l'utilisateur connecté
- *  - infos administratives sur l'utilisateur
+ * Aide de vue affichant toutes les infos concernant l'utilisateur connecté.
+ * C'est à dire le nom de l'utilisateur connecté & son rôle courant.
+ *
+ * Lorsqu'on clique sur le nom, s'affiche un popover
+ * présentant les rôles sélectionnables, des infos administratives, le formulaire d'usurpation (si habilité)
+ * et le lien de déconnexion.
+ *
+ * Si aucun utilisateur n'est connecté, cette aide de vue renvoit ''.
  *
  * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
  */
@@ -37,65 +40,74 @@ class UserCurrent extends UserAbstract
      */
     public function __toString(): string
     {
-        $id = 'user-current-info';
-
-        $userStatusHelper = $this->getView()->plugin('userStatus'); /* @var $userStatusHelper UserStatus */
-        $status = $userStatusHelper(false);
+        if (! $this->getIdentity()) {
+            return '';
+        }
 
+        //
+        // Sous la forme d'un lien :
+        //
+        // - Nom de l'utilisateur connecté, le cas échéant.
+        /* @var $userStatusHelper UserStatus */
+        $userStatusHelper = $this->view->plugin('userStatus');
+        $nom = $userStatusHelper(false);
+        // - Rôle courant.
+        $role = '';
         $userProfileSelectable = true;
-        
-        if ($this->getIdentity()) {
-            if ($userProfileSelectable) {
-		        $role = $this->getUserContext()->getSelectedIdentityRole();
-                // cas où aucun rôle n'est sélectionné : on affiche le 1er rôle sélectionnable ou sinon "user"
-		        if ($role === null) {
-		            $selectableRoles = $this->getUserContext()->getSelectableIdentityRoles();
-                    $role = current($selectableRoles) ?: $this->getUserContext()->getIdentityRole('user');
-                }
-                $status .= sprintf(", <small class='role-libelle'>%s</small>", !method_exists($role, '__toString') ? $role->getRoleId() : $role);
-            }
-        
-            $userProfileHelper = $this->getView()->plugin('userProfile'); /* @var $userProfileHelper UserProfile */
-            $userProfileHelper->setUserProfileSelectable($userProfileSelectable);
-            
-            $userInfoHelper = $this->getView()->plugin('userInfo'); /* @var $userInfoHelper UserInfo */
-            
-            $content = $userProfileHelper . $userInfoHelper($this->getAffectationFineSiDispo());
-        }
-        else {
-            $content = _("Aucun");
-            if ($this->getTranslator()) {
-                $content = $this->getTranslator()->translate($content, $this->getTranslatorTextDomain());
+        if ($userProfileSelectable) {
+            $role = $this->getUserContext()->getSelectedIdentityRole();
+            // cas où aucun rôle n'est sélectionné : on affiche le 1er rôle sélectionnable ou sinon "user"
+            if ($role === null) {
+                $selectableRoles = $this->getUserContext()->getSelectableIdentityRoles();
+                $role = current($selectableRoles) ?: $this->getUserContext()->getIdentityRole('user');
             }
+            $role = sprintf(
+                "<br/><small class='role-libelle'>%s</small>",
+                !method_exists($role, '__toString') ? $role->getRoleId() : $role
+            );
         }
 
-        $content = htmlspecialchars(preg_replace('/\r\n|\n|\r/', '', $content));
+        //
+        // Dans un popover :
+        //
+        // - Rôles sélectionnables.
+        /* @var \UnicaenAuth\View\Helper\UserProfile $userProfileHelper */
+        $userProfileHelper = $this->view->plugin('userProfile');
+        $userProfileHelper->setUserProfileSelectable($userProfileSelectable);
+        $roles = (string) $userProfileHelper;
+        // - Infos administratives.
+        /* @var \UnicaenAuth\View\Helper\UserInfo $userInfoHelper */
+        $userInfoHelper = $this->view->plugin('userInfo');
+        $infos = (string) $userInfoHelper($this->getAffectationFineSiDispo());
+        // - Usurpation d'identité.
+        /* @var \UnicaenAuth\View\Helper\UserUsurpationHelper $userUsurpationHelper */
+        $userUsurpationHelper = $this->view->plugin('userUsurpation');
+        $usurpation = (string) $userUsurpationHelper;
+        // - Lien de déconnexion.
+        /** @var \UnicaenAuth\View\Helper\UserConnection $userConnectionHelper */
+        $userConnectionHelper = $this->getView()->plugin('userConnection');
+        $deconnexion = $userConnectionHelper->addClass('btn btn-lg btn-outline-success')->renderDisconnection();
 
-        $title = _("Utilisateur connecté à l'application");
-        if ($this->getTranslator()) {
-            $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain());
-        }
+        $linkText = $nom . $role;
+        $popoverContent = htmlspecialchars(preg_replace('/\r\n|\n|\r/', '',
+            $roles .
+            $infos .
+            $usurpation .
+            '<hr>' .
+            '<div class="text-center">' . $deconnexion . '</div>'
+        ));
 
-        $out = <<<EOS
-<a class="navbar-link" 
-   id="$id" 
-   title="$title" 
-   data-placement="bottom" 
-   data-toggle="popover" 
-   data-html="true" 
-   data-content="$content" 
-   href="#">$status<span class="caret"></span></a>
-EOS;
-        $out .= PHP_EOL;
-        
-        $js = <<<EOS
-$(function() {
-    $("#$id").popover({ html: true, sanitize: false, container: '#navbar' });
-});
+        return <<<EOS
+<a class="navbar-link dropdown-toggle"
+   id="user-current-info" 
+   data-bs-placement="bottom" 
+   data-bs-toggle="popover" 
+   data-bs-container="#navbar" 
+   data-bs-html="true" 
+   data-bs-sanitize="false" 
+   data-bs-content="$popoverContent" 
+   href="#">$linkText<span class="caret"></span></a>
 EOS;
-        $this->getView()->plugin('inlineScript')->offsetSetScript(1000, $js);
-        
-        return $out;
     }
 
     /**
diff --git a/src/UnicaenAuth/View/Helper/UserInfo.php b/src/UnicaenAuth/View/Helper/UserInfo.php
index 89f31adf8761802e7f45a474a3445a6871a7b3c6..36fe3f4088b488c3085cbea5fd1512c1f6fe2bb9 100644
--- a/src/UnicaenAuth/View/Helper/UserInfo.php
+++ b/src/UnicaenAuth/View/Helper/UserInfo.php
@@ -96,17 +96,14 @@ class UserInfo extends UserAbstract
             }
         }
         else {
+            $template = "<strong>Informations administratives :</strong> <br>%s";
             $aucuneAffDispo = _("Aucune information disponible.");
             if ($this->getTranslator()) {
                 $aucuneAffDispo = $this->getTranslator()->translate($aucuneAffDispo, $this->getTranslatorTextDomain());
             }
-            $out .= $aucuneAffDispo;
+            $out .= sprintf($template, $aucuneAffDispo);
         }
 
-        // formulaire d'usurpation d'identité
-        $userUsurpationHelper = $this->view->plugin('userUsurpation'); /* @var $userUsurpationHelper \UnicaenAuth\View\Helper\UserUsurpationHelper */
-        $out .= $userUsurpationHelper();
-
         return $out;
     }
 
diff --git a/src/UnicaenAuth/View/Helper/UserProfile.php b/src/UnicaenAuth/View/Helper/UserProfile.php
index 56393d96790e722794f1a22afc06d62bf93f3e37..f0cb706c3574894f717cdc8f333bba6b7d91bce6 100644
--- a/src/UnicaenAuth/View/Helper/UserProfile.php
+++ b/src/UnicaenAuth/View/Helper/UserProfile.php
@@ -36,7 +36,7 @@ class UserProfile extends UserAbstract
      */
     public function render()
     {
-        $title   = _("Profil utilisateur");
+        $title   = _("Rôle utilisateur");
         $unknown = _("Inconnu");
         $none    = _("Aucun");
 
diff --git a/src/UnicaenAuth/View/Helper/UserProfileSelect.php b/src/UnicaenAuth/View/Helper/UserProfileSelect.php
index 2c06d826a89e1b15d9292776cab0bbe5ad7a131c..d1f3d526bf35af195e3def7a2b78554e396ad29a 100644
--- a/src/UnicaenAuth/View/Helper/UserProfileSelect.php
+++ b/src/UnicaenAuth/View/Helper/UserProfileSelect.php
@@ -2,6 +2,7 @@
 namespace UnicaenAuth\View\Helper;
 
 use Laminas\Permissions\Acl\Role\RoleInterface;
+use Laminas\View\Helper\HeadScript;
 
 /**
  * Aide de vue permettant à l'utilisateur de sélectionner son profil courant parmi
@@ -79,18 +80,15 @@ class UserProfileSelect extends UserAbstract
         $url = $this->getView()->url('utilisateur/default', ['action' => 'selectionner-profil']);
         $redirectUrl = $this->getView()->url($this->redirectRoute ?: 'home');
 
-        $html .= <<<EOS
-<script>
-    $(function() {
-        $("input.$inputClass").change(function() { submitProfile(); }).tooltip({ delay: 500, placement: 'left' });
-    });
-    function submitProfile()
-    {
+        $js = <<<EOS
+$(function() {
+    $("body").on("change", "input.$inputClass", function() {
         $("body *").css('cursor', 'wait');
         $.post("$url", $(".$formClass").serializeArray(), function() { $(location).attr('href', "$redirectUrl"); });
-    }
-</script>
+    });
+});
 EOS;
+        $this->view->inlineScript(HeadScript::SCRIPT, $js);
 
         return $html;
     }
diff --git a/src/UnicaenAuth/View/Helper/UserStatus.php b/src/UnicaenAuth/View/Helper/UserStatus.php
index f5b4af30c4d6e4457b1a9cccbbc7602eeca1b87c..583e204542dfdb6790118788bd5b97ca93a8c10a 100644
--- a/src/UnicaenAuth/View/Helper/UserStatus.php
+++ b/src/UnicaenAuth/View/Helper/UserStatus.php
@@ -26,8 +26,6 @@ class UserStatus extends UserAbstract
     protected $usurpationEnCours = false;
 
     /**
-     * Retourne l'instance de ce view helper.
-     *
      * @param boolean $displayConnectionLink Inclure ou pas le lien de connexion/déconnexion ?
      * @return self
      */
@@ -40,18 +38,21 @@ class UserStatus extends UserAbstract
     }
 
     /**
-     * Retourne le code HTML généré par cette aide de vue.
-     *
      * @return string
      */
     public function __toString(): string
     {
         $parts = [];
 
-        $parts[] = $this->createStatusContainer();
+        // Nom de l'utilisateur connecté, le cas échéant.
+        if (($identity = $this->getIdentity())) {
+            $parts[] = $this->createStatusContainer();
+        }
 
-        if ($this->getDisplayConnectionLink()) {
-            $userConnectionHelper = $this->getView()->plugin('userConnection'); /* @var $userConnectionHelper UserConnection */
+        // Lien de connexion ou déconnexion, si demandé.
+        if ($this->displayConnectionLink) {
+            /* @var $userConnectionHelper UserConnection */
+            $userConnectionHelper = $this->getView()->plugin('userConnection');
             $parts[] = (string) $userConnectionHelper;
         }
 
@@ -66,35 +67,29 @@ class UserStatus extends UserAbstract
      */
     protected function createStatusContainer(): string
     {
-        if (($identity = $this->getIdentity())) {
-            if (method_exists($identity, '__toString')) {
-                $name = (string) $identity;
-            }
-            elseif (method_exists($identity, 'getDisplayName')) {
-                $name = $identity->getDisplayName();
-            }
-            elseif (method_exists($identity, 'getUsername')) {
-                $name = $identity->getUsername();
-            }
-            elseif (method_exists($identity, 'getId')) {
-                $name = $identity->getId();
-            }
-            else {
-                $name = sprintf('<span title="Erreur: identité inattendue (%s)">???</span>',
-                        is_object($identity) ? get_class($identity) : gettype($identity));
-            }
+        $identity = $this->getIdentity();
+
+        if (method_exists($identity, '__toString')) {
+            $name = (string) $identity;
+        }
+        elseif (method_exists($identity, 'getDisplayName')) {
+            $name = $identity->getDisplayName();
+        }
+        elseif (method_exists($identity, 'getUsername')) {
+            $name = $identity->getUsername();
+        }
+        elseif (method_exists($identity, 'getId')) {
+            $name = $identity->getId();
         }
         else {
-            $name = _("Vous n'êtes pas connecté(e)");
-            if ($this->getTranslator()) {
-                $name = $this->getTranslator()->translate($name, $this->getTranslatorTextDomain());
-            }
+            $name = sprintf('<span title="Erreur: identité inattendue (%s)">???</span>',
+                    is_object($identity) ? get_class($identity) : gettype($identity));
         }
 
         $classUser = $this->usurpationEnCours ? 'fa-theater-masks' : 'fa-user';
 
         return <<<EOS
-<span class="fa $classUser"></span> <span id="user-status-name"><strong>$name</strong></span>
+<span id="user-status-icon" class="fa $classUser"></span> <span id="user-status-name"><strong>$name</strong></span>
 EOS;
     }
 
diff --git a/src/UnicaenAuth/View/Helper/UserUsurpationHelper.php b/src/UnicaenAuth/View/Helper/UserUsurpationHelper.php
index 48e71fd2a08399350ad942505a102aaf735fa670..caed33f990d4e6e9b3b513260d1b81cbe9e0fcee 100644
--- a/src/UnicaenAuth/View/Helper/UserUsurpationHelper.php
+++ b/src/UnicaenAuth/View/Helper/UserUsurpationHelper.php
@@ -11,6 +11,7 @@ use Laminas\Form\Element\Text;
 use Laminas\Form\Form;
 use Laminas\Form\View\Helper\Form as FormHelper;
 use Laminas\Form\View\Helper\FormElement;
+use Laminas\View\Helper\HeadScript;
 use Laminas\View\Renderer\PhpRenderer;
 
 /**
@@ -137,34 +138,38 @@ class UserUsurpationHelper extends UserAbstract
         $identity = $form->get('identity');
         $submit = $form->get('submit');
 
+        $identity->setAttribute('class', $identity->getAttribute('class') . ' form-control');
+
         /** @var FormHelper $formHelper */
         $formHelper = $this->view->plugin('form');
-        /** @var FormControlGroup $formControlGroupHelper */
-        $formControlGroupHelper = $this->view->plugin('formControlGroup');
+        /** @var FormElement $formElementHelper */
+        $formElementHelper = $this->view->plugin('formElement');
 
         $html = '';
         $html .= $formHelper->openTag($form);
         $html .= "<div><strong>Usurpation d'identité :</strong></div>";
-        $html .= $formControlGroupHelper->__invoke($identity);
-        $html .= $formControlGroupHelper->__invoke($submit);
+        $html .= '<div class="row justify-content-start">';
+        $html .= '<div class="col-9 pe-1">' . $formElementHelper->__invoke($identity) . '</div>' . PHP_EOL;
+        $html .= '<div class="col-3 ps-0">' . $formElementHelper->__invoke($submit) . '</div>' . PHP_EOL;
+        $html .= '</div>';
         $html .= $formHelper->closeTag();
 
         $formId = $form->getAttribute('id');
 
-        $html .= <<<EOS
-<script>
-    var form = $("#$formId").submit(function() {
-        $("body *").css('cursor', 'wait');
-    });
-    var input = form.find(".user-usurpation-input").on('input', function() {
-        updateUsurpationSubmit();
-    });
-    function updateUsurpationSubmit() {
-        form.find(".user-usurpation-submit").prop("disabled", input.val().length === 0);
-    }
-    updateUsurpationSubmit();
-</script>
+        $js = <<<EOS
+$(function() {
+    // le bouton 'Usurper' est interdit si le champ de saisie est vide 
+    $("#$formId .user-usurpation-submit").attr("disabled", true);
+    $("body")
+        .on("input", "#$formId .user-usurpation-input", function() {
+            $(".user-usurpation-submit").prop("disabled", $(this).val().length == 0);
+        })
+        .on("submit", "#$formId", function() {
+            $("body *").css('cursor', 'wait');
+        });
+});
 EOS;
+        $this->view->inlineScript(HeadScript::SCRIPT, $js);
 
         return $html;
     }
@@ -209,6 +214,7 @@ EOS;
         $submit = new Submit('submit');
         $submit->setValue("Usurper");
         $submit->setAttributes([
+            'disabled' => !$this->asButton,
             'class' => 'user-usurpation-submit btn btn-danger',
         ]);
 
diff --git a/src/UnicaenAuth/View/Helper/partial/connect.phtml b/src/UnicaenAuth/View/Helper/partial/connect.phtml
index 136c6a3abbe0fe9e005b85e7c9895e6f28fef9c6..c02c42c46253fcea96f76fd8b563242322856b9f 100644
--- a/src/UnicaenAuth/View/Helper/partial/connect.phtml
+++ b/src/UnicaenAuth/View/Helper/partial/connect.phtml
@@ -28,10 +28,10 @@ use Laminas\Form\Form;
 
 <?php if ($messages = $this->flashMessenger('zfcuser-login-form')): ?>
 <?php foreach ($messages as $message): ?>
-<div class="messenger alert alert-danger ">
-    <button type="button" class="close" title="Fermer cette alerte" data-dismiss="alert">×</button>
-    <span class="glyphicon glyphicon-warning-sign"></span>
+<div class="messenger alert alert-danger alert-dismissible ">
+    <span class="icon icon-avertissement"></span>
         <?php echo $message ?> <br>
+    <button type="button" class="btn-close" title="Fermer cette alerte" data-bs-dismiss="alert"></button>
 </div>
 <?php endforeach ?>
 <?php endif ?>
diff --git a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in-translated.phtml b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in-translated.phtml
index 14ae2ef23b455454a42e2bd0022ce44826cad756..c752fb54bb61b73f4ee70abaf6acc69afb7ecf4a 100644
--- a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in-translated.phtml
+++ b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in-translated.phtml
@@ -1,7 +1,7 @@
 <a class="navbar-link" 
    id="user-current-info" 
    title="Auth user" 
-   data-placement="bottom" 
-   data-toggle="popover" 
-   data-content="User Profile Helper MarkupUser Info Helper Markup" 
+   data-bs-placement="bottom"
+   data-bs-toggle="popover"
+   data-bs-content="User Profile Helper MarkupUser Info Helper Markup"
    href="#">User Status Helper Markup</a>
diff --git a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in.phtml b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in.phtml
index 55a49900a137652012f3e59c6818bfacc8e3eee9..f9f9342a11786717c504ee445f4c99154de45825 100644
--- a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in.phtml
+++ b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-in.phtml
@@ -1,7 +1,7 @@
 <a class="navbar-link" 
    id="user-current-info" 
    title="Utilisateur connecté à l'application" 
-   data-placement="bottom" 
-   data-toggle="popover" 
-   data-content="User Profile Helper MarkupUser Info Helper Markup" 
+   data-bs-placement="bottom"
+   data-bs-toggle="popover"
+   data-bs-content="User Profile Helper MarkupUser Info Helper Markup"
    href="#">User Status Helper Markup</a>
diff --git a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out-translated.phtml b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out-translated.phtml
index 09fd022dd9caa4b29a1c941d3c4a5ca5aa815695..5df1c9263d196420d060fda4f0b92ce2d20cbf63 100644
--- a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out-translated.phtml
+++ b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out-translated.phtml
@@ -1,7 +1,7 @@
 <a class="navbar-link" 
    id="user-current-info" 
    title="Auth user" 
-   data-placement="bottom" 
-   data-toggle="popover" 
-   data-content="None" 
+   data-bs-placement="bottom"
+   data-bs-toggle="popover"
+   data-bs-content="None"
    href="#">User Status Helper Markup</a>
diff --git a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out.phtml b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out.phtml
index 8e5a62d442e7a74679e8eb7def62a497fd413060..2a4258b043969fb3ac240bf419e68f4ab0429f6b 100644
--- a/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out.phtml
+++ b/tests/UnicaenAuthTest/View/Helper/_files/expected/user_current/logged-out.phtml
@@ -1,7 +1,7 @@
 <a class="navbar-link" 
    id="user-current-info" 
    title="Utilisateur connecté à l'application" 
-   data-placement="bottom" 
-   data-toggle="popover" 
-   data-content="Aucun" 
+   data-bs-placement="bottom"
+   data-bs-toggle="popover"
+   data-bs-content="Aucun"
    href="#">User Status Helper Markup</a>
diff --git a/view/unicaen-auth/auth/login-tabs.phtml b/view/unicaen-auth/auth/login-tabs.phtml
index 597f32015c33e3596603db5ae1fe2079a13e4b0c..52b4be4fca93461a8a4a53163d73aba3c037b211 100644
--- a/view/unicaen-auth/auth/login-tabs.phtml
+++ b/view/unicaen-auth/auth/login-tabs.phtml
@@ -19,7 +19,7 @@ use Laminas\Form\Form;
 
 $form->prepare();
 $form->setAttributes([
-    'class' => 'form-horizontal',
+    //'class' => 'form-horizontal', // .form-horizontal n'existe plus dans boostrap 4
     'role' => 'form',
 ]);
 
@@ -45,9 +45,9 @@ $activeHelper = null;
             $activeClass = '';
         }
         ?>
-        <li role="presentation" class="<?php echo $activeClass ?>">
+        <li role="presentation" class="nav-item">
             <?php $query = $redirect ? ['redirect' => $redirect] : [] ?>
-            <a href="<?php echo $this->url('zfcuser/login', ['type' => $key], ['query' => $query]) ?>"><?php echo $helper->getTitle() ?></a>
+            <a class="nav-link <?php echo $activeClass ?>" href="<?php echo $this->url('zfcuser/login', ['type' => $key], ['query' => $query]) ?>"><?php echo $helper->getTitle() ?></a>
         </li>
     <?php endforeach ?>
 </ul>
diff --git a/view/unicaen-auth/auth/login.phtml b/view/unicaen-auth/auth/login.phtml
index 77387c442c5b2c12777aa4a658c2b5b976aba0bf..e9a2d42d25e6f0889694cabee29fa6a3fad80d52 100644
--- a/view/unicaen-auth/auth/login.phtml
+++ b/view/unicaen-auth/auth/login.phtml
@@ -31,8 +31,10 @@ $this->headTitle("Connexion") ?>
 
 <!-- Création d'un compte local (si autorisée) -->
 <?php if ($enableRegistration) : ?>
-<div id="div-connexion" class="panel panel-primary">
+<div id="div-connexion" class="card">
+    <div class="card-body">
     <?php echo $this->translate("Not registered?"); ?> <a href="<?php echo $this->url('zfcuser/register') . ($this->redirect ? '?redirect=' . $this->redirect : '') ?>"><?php echo $this->translate("Sign up!"); ?></a>
+    </div>
 </div>
 <?php endif; ?>
 
diff --git a/view/unicaen-auth/auth/request-password-reset-form.phtml b/view/unicaen-auth/auth/request-password-reset-form.phtml
index 5cd1df19356d5d5471d1d6f1622b0589f947b0b7..f47534827c817ecfc5fd2f623e5875b01b8fbb26 100644
--- a/view/unicaen-auth/auth/request-password-reset-form.phtml
+++ b/view/unicaen-auth/auth/request-password-reset-form.phtml
@@ -30,7 +30,7 @@ use Laminas\Form\Form;
         echo $this->formInput($email);
         echo $this->formElementErrors($email, ['class' => 'text-danger']);
         ?>
-        <span class="help-block">Un lien à cliquer vous sera envoyé à cette adresse électronique.</span>
+        <span class="form-text">Un lien à cliquer vous sera envoyé à cette adresse électronique.</span>
     </p>
 
     <?php echo $this->formInput($form->get('csrf')); ?>
diff --git a/view/unicaen-auth/droits/partial/tbl-link.phtml b/view/unicaen-auth/droits/partial/tbl-link.phtml
index 799d42ec488d1aa5765543d0b6828ebf6caec4a0..08ff59240c87c3e123cefa17b71d3b84b36bcf1e 100644
--- a/view/unicaen-auth/droits/partial/tbl-link.phtml
+++ b/view/unicaen-auth/droits/partial/tbl-link.phtml
@@ -14,7 +14,7 @@ $canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::DROIT_PRIVILEG
         <a href="javascript:void(0)" data-action="refuser"
         title="Privilège '<?php echo $privilege->getCategorie() ?> > '<?php echo $privilege ?>' accordé au rôle '<?php echo $role ?>'. Cliquez pour le retirer.">
     <?php endif; ?>
-    <span class="glyphicon glyphicon-ok text-success"></span>
+    <span class="icon iconly icon-oui text-success"></span>
     <?php if ($canEdit): ?>
         </a>
     <?php endif; ?>
@@ -25,7 +25,7 @@ $canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::DROIT_PRIVILEG
         <a href="javascript:void(0)" data-action="accorder"
         title="Privilège '<?php echo $privilege->getCategorie() ?> > <?php echo $privilege ?>' refusé au rôle '<?php echo $role ?>'. Cliquez pour l'accorder.">
     <?php endif; ?>
-    <span class="glyphicon glyphicon-remove text-danger refuse"></span>
+    <span class="icon iconly icon-non text-danger refuse"></span>
     <?php if ($canEdit): ?>
         </a>
     <?php endif; ?>
diff --git a/view/unicaen-auth/droits/privileges.phtml b/view/unicaen-auth/droits/privileges.phtml
index 8ce8e3ec1786b06180d441b15e77a29a045addf6..0db6305dfd7d4fe404869ba14e2e7a18b011951a 100644
--- a/view/unicaen-auth/droits/privileges.phtml
+++ b/view/unicaen-auth/droits/privileges.phtml
@@ -6,7 +6,7 @@
 ?>
 <h1 class="page-header">Gestion des privilèges</h1>
 
-<table class="droits-tbl table table-hover table-bordered table-condensed table-extra-condensed table-header-rotated" data-modifier-url="<?php echo $this->url('droits/privileges/modifier'); ?>">
+<table class="droits-tbl table table-hover table-bordered table-sm table-extra-condensed table-header-rotated" data-modifier-url="<?php echo $this->url('droits/privileges/modifier'); ?>">
 <thead>
     <tr>
         <th class="separator"></th>
diff --git a/view/unicaen-auth/droits/roles.phtml b/view/unicaen-auth/droits/roles.phtml
index e511f9da1d00f72509fa9557fc780906a85032c3..bc2d109a7099afe39adb5173ddcb2af523dad60f 100644
--- a/view/unicaen-auth/droits/roles.phtml
+++ b/view/unicaen-auth/droits/roles.phtml
@@ -9,7 +9,7 @@ $canEdit = $this->isAllowed('privilege/'.Privileges::DROIT_ROLE_EDITION);
 $ajoutUrl = $this->url( 'droits/roles/edition' );
 
 ?>
-<table class="table table-condensed table-bordered">
+<table class="table table-sm table-bordered">
     <tr>
         <th>Nom</th>
         <th>Parent</th>
@@ -28,8 +28,8 @@ $ajoutUrl = $this->url( 'droits/roles/edition' );
         <td><?php echo $role->getAccessibleExterieur() ? 'Oui' : 'Non'; ?></td>
         <?php if ($canEdit): ?>
         <td style="width:1%;white-space: nowrap;text-align: center">
-            <a href="<?php echo $editionUrl; ?>" class="ajax-modal" data-event="role-edition"><span class="glyphicon glyphicon-edit"></span></a>
-            <a href="<?php echo $suppressionUrl; ?>" class="ajax-modal" data-event="role-suppression"><span class="glyphicon glyphicon-remove"></span></a>
+            <a href="<?php echo $editionUrl; ?>" class="ajax-modal" data-event="role-edition"><span class="icon iconly icon-modifier"></span></a>
+            <a href="<?php echo $suppressionUrl; ?>" class="ajax-modal" data-event="role-suppression"><span class="icon iconly icon-supprimer"></span></a>
         </td>
         <?php endif; ?>
     </tr>