diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index c8e75814ede69da35c09fe4da69580b8e9916627..03e23dea59ae524aaeb28c1dea783ac132dbc3b9 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -24,6 +24,8 @@ import { DialogSaveSessionComponent } from "./components/dialog-save-session/dia
 import { QuicknavComponent } from "./components/quicknav/quicknav.component";
 import { NotificationsService } from "./services/notifications.service";
 
+import { decodeHtml } from './util';
+
 import { HotkeysService, Hotkey } from "angular2-hotkeys";
 
 import { MatomoInjector, MatomoTracker } from "ngx-matomo";
@@ -266,13 +268,6 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     }
   }
 
-  /** clodo trick @see https://www.julesgaston.fr/encoder-decoder-entites-html-entities-javascript/ */
-  public static decodeHTMLEntities(text: string): string {
-    const textArea = document.createElement("textarea");
-    textArea.innerHTML = text;
-    return textArea.value;
-  }
-
   /**
    * Triggered at app startup.
    * Preferences are loaded by app setup service
@@ -336,11 +331,11 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
   }
 
   public getCalculatorLabel(t: CalculatorType) {
-    return AppComponent.decodeHTMLEntities(this.formulaireService.getLocalisedTitleFromCalculatorType(t));
+    return decodeHtml(this.formulaireService.getLocalisedTitleFromCalculatorType(t));
   }
 
   public getFullCalculatorTitle(calc: { title: string, type: CalculatorType, active?: boolean }): string {
-    return AppComponent.decodeHTMLEntities(calc.title + " (" + this.getCalculatorLabel(calc.type) + ")");
+    return decodeHtml(calc.title + " (" + this.getCalculatorLabel(calc.type) + ")");
   }
 
   public get calculators() {
diff --git a/src/app/components/generic-select/generic-select.component.html b/src/app/components/generic-select/generic-select.component.html
index 8c352a2cf8faf42c6463cce2654b4da28875c99d..7ce468d11bc4299dcdf02bf5de6c6f5de1a2a222 100644
--- a/src/app/components/generic-select/generic-select.component.html
+++ b/src/app/components/generic-select/generic-select.component.html
@@ -1,7 +1,7 @@
 <mat-form-field>
     <mat-select [id]="selectId" [placeholder]="label" [(value)]="selectedValue" [multiple]="isMultiple" [disabled]="isDisabled">
         <mat-select-trigger *ngIf="isMultiple">
-          {{ selectedValue && selectedValue[0] ? selectedValue[0].label : '' }}
+          {{ selectedValue && selectedValue[0] ? entryLabel(selectedValue[0]) : '' }}
           <span *ngIf="selectedValue?.length > 1" class="multiple-selection-label">
             (+ {{ selectedValue.length - 1 }} {{ selectedValue?.length === 2 ? uitextAndOther : uitextAndOthers }})
           </span>
diff --git a/src/app/components/select-field-line/select-field-line.component.ts b/src/app/components/select-field-line/select-field-line.component.ts
index 09d05640b3de387eec4256829e46a986488179fd..b438c0256a1cbb02c0ae95cdf675dff11bd4cc71 100644
--- a/src/app/components/select-field-line/select-field-line.component.ts
+++ b/src/app/components/select-field-line/select-field-line.component.ts
@@ -5,6 +5,7 @@ import { SelectEntry } from "../../formulaire/elements/select-entry";
 import { I18nService } from "../../services/internationalisation.service";
 import { ApplicationSetupService } from "../../services/app-setup.service";
 import { SelectFieldCustom } from "../../formulaire/elements/select-field-custom";
+import { decodeHtml } from "../../util";
 
 @Component({
     selector: "select-field-line",
@@ -46,7 +47,7 @@ export class SelectFieldLineComponent implements OnInit {
     }
 
     protected entryLabel(entry: SelectEntry): string {
-        return entry.label;
+        return decodeHtml(entry.label);
     }
 
     public get selectedValue(): SelectEntry | SelectEntry[] {
diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index 67b16fa79146da163c47a048203c82101ce17d83..d61eb29a49eebbd8cb3f9e5cd78932e82fc5e0d7 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -120,7 +120,7 @@ export class I18nService extends Observable implements Observer {
                 if (msg[textKey] === undefined) {
                     return `*** message not found: ${textKey} ***`;
                 }
-                return msg[textKey];
+                return decodeHtml(msg[textKey]);
             } else {
                 if (! this._Messages) {
                     return `*** messages not loaded: ${this._currentLanguage} ***`;
@@ -128,7 +128,7 @@ export class I18nService extends Observable implements Observer {
                 if (this._Messages[textKey] === undefined) {
                     return `*** message not found: ${textKey} ***`;
                 }
-                return this._Messages[textKey];
+                return decodeHtml(this._Messages[textKey]);
             }
         } else {
             const messages = msg || this._Messages;
@@ -140,10 +140,10 @@ export class I18nService extends Observable implements Observer {
                 if (this._fallbackMessages[textKey] === undefined) {
                     return `*** message not found: ${textKey} ***`;
                 } else {
-                    return this._fallbackMessages[textKey];
+                    return decodeHtml(this._fallbackMessages[textKey]);
                 }
             } else {
-                return messages[textKey];
+                return decodeHtml(messages[textKey]);
             }
         }
     }
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 997307f7c5c67c9b1c6a92535d5a95120c194471..c386ef22b688e109f35a94e4806c62852f7bb7c5 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -473,7 +473,7 @@
     "INFO_REMOUSRESULTS_TIRANT": "Tirant d'eau (m)",
     "INFO_REMOUSRESULTS_TIRANTCRITIQUE": "Tirant d'eau critique",
     "INFO_REMOUSRESULTS_TIRANTNORMAL": "Tirant d'eau normal",
-    "INFO_REPORT_BUG_BODY": "Ceci est un rapport d'erreur.\n\nMerci de décrire rapidement ci-dessous le problème rencontré, et les étapes qui vous y ont mené&nbsp;:\n\n\n\n\n--- État de la session en cours - ne pas modifier le texte ci-dessous ---\n--------------------------------------------------------------------------------------------\n\n",
+    "INFO_REPORT_BUG_BODY": "Ceci est un rapport d'erreur.\n\nMerci de décrire rapidement ci-dessous le problème rencontré, et les étapes qui vous y ont mené:\n\n\n\n\n--- État de la session en cours - ne pas modifier le texte ci-dessous ---\n--------------------------------------------------------------------------------------------\n\n",
     "INFO_REPORT_BUG_SUBJECT": "Rapport d'erreur",
     "INFO_REQUIRES": "dépend de",
     "INFO_RESULTS_EXPORT_AS_SPREADSHEET": "Exporter en XLSX",
@@ -525,7 +525,7 @@
     "INFO_THEME_VERIFICATION_TITRE": "Vérification de passes",
     "INFO_TITREJOURNAL": "Journal de calcul",
     "INFO_TITREJOURNAL_GLOBAL": "Synthèse du journal de calcul",
-    "INFO_WELCOME_CONTENT": "<p>Le logiciel Cassiopée a été développé par le pôle R&D écohydraulique regroupant l'<a href=\"https&nbsp;://ofb.gouv.fr\" target=\"_blank\">OFB</a> (Office Français de la Biodiversité) et l’<a href=\"https&nbsp;://www.imft.fr\" target=\"_blank\">IMFT</a> (Institut de mécanique des fluides de Toulouse) et par l'<a href=\"http&nbsp;://g-eau.fr\" target=\"_blank\">UMR G-EAU</a> (UMR Gestion de l'Eau, Acteurs, Usages).</p><p>Il regroupe des outils d'aide à la conception des dispositifs de franchissement piscicoles pour la montaison et la dévalaison ainsi que des outils de calcul hydraulique utiles pour l'ingénierie en environnement et agriculture.</p><p>Pour plus d'informations, consulter les <a href=\"assets/docs/fr/mentions_legales.html\" target=\"_blank\">mentions légales</a> et la <a href=\"assets/docs/fr/index.html\" target=\"_blank\">documentation</a>.</p>",
+    "INFO_WELCOME_CONTENT": "<p>Le logiciel Cassiopée a été développé par le pôle R&D écohydraulique regroupant l'<a href=\"https://ofb.gouv.fr\" target=\"_blank\">OFB</a> (Office Français de la Biodiversité) et l’<a href=\"https://www.imft.fr\" target=\"_blank\">IMFT</a> (Institut de mécanique des fluides de Toulouse) et par l'<a href=\"http://g-eau.fr\" target=\"_blank\">UMR G-EAU</a> (UMR Gestion de l'Eau, Acteurs, Usages).</p><p>Il regroupe des outils d'aide à la conception des dispositifs de franchissement piscicoles pour la montaison et la dévalaison ainsi que des outils de calcul hydraulique utiles pour l'ingénierie en environnement et agriculture.</p><p>Pour plus d'informations, consulter les <a href=\"assets/docs/fr/mentions_legales.html\" target=\"_blank\">mentions légales</a> et la <a href=\"assets/docs/fr/index.html\" target=\"_blank\">documentation</a>.</p>",
     "INFO_WELCOME_SUBTITLE": "Modules de calcul d'hydraulique",
     "INFO_EXAMPLE_LABEL_CHANNEL_FLOW": "Débit d'un chenal avec ouvrages",
     "INFO_EXAMPLE_LABEL_PAB_COMPLETE": "Passe à bassins type",