diff --git a/README.md b/README.md
index 571bddb6317162d760d1d2e1f79e7ced8c7c7331..b1c3e4fe6c388e4cae81be8d1243b463e693b7ef 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,6 @@ It requires the following CPAN distributions:
 * CGI
 * Config-Tiny
 * DateTime
-* HTTP-AcceptLanguage
 * List-MoreUtils
 * Log-Any
 * Rose-DB-Object
diff --git a/lib/AccountManager/App.pm b/lib/AccountManager/App.pm
index 984a199187f36bbfb36f5b52e026d33187cc0af0..07e0de4d548cb6989769c14e5a5c5572e269465f 100644
--- a/lib/AccountManager/App.pm
+++ b/lib/AccountManager/App.pm
@@ -6,7 +6,6 @@ use warnings;
 use CGI;
 use DateTime;
 use English qw(-no_match_vars);
-use HTTP::AcceptLanguage;
 use Log::Any::Adapter;
 use List::MoreUtils qw(uniq);
 use Template;
@@ -19,6 +18,7 @@ use AccountManager::Metadata;
 use AccountManager::Service;
 use AccountManager::Token;
 use AccountManager::Tools;
+use AccountManager::L10N;
 
 # Format de type URL HTTP ou URN
 my $entity_id_pattern = qr{
@@ -61,6 +61,7 @@ sub new {
     }
 
     $self->{logger} = Log::Any->get_logger();
+    $self->{lh}     = AccountManager::L10N->get_handle();
 
     $self->{cgi} = CGI->new();
 
@@ -175,14 +176,13 @@ sub respond {
         support_email => $self->{configuration}->{app}->{support_email},
         version       => $version,
     };
-
-    my $lang = HTTP::AcceptLanguage->new($ENV{HTTP_ACCEPT_LANGUAGE})->match(qw/en fr/) || 'en';
+    $in{data}->{lh} = $self->{lh};
 
     ## Parse template
     my $tt2 = Template->new({
         ENCODING     => 'utf8',
         PRE_CHOMP    => CHOMP_ONE,
-        INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/web/$lang"
+        INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/web"
     });
 
     $self->{logger}->debug("Responding with outer template '$in{template}' and inner template '$in{data}->{content}'");
@@ -479,12 +479,10 @@ sub req_complete_challenge {
         );
     };
 
-    my $lang = HTTP::AcceptLanguage->new($ENV{HTTP_ACCEPT_LANGUAGE})->match(qw/en fr/) || 'en';
-
     my $tt2 = Template->new({
         ENCODING     => 'utf8',
         PRE_CHOMP    => CHOMP_ONE,
-        INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/mail/$lang"
+        INCLUDE_PATH => $self->{configuration}->{setup}->{templates_dir} . "/mail"
     });
     my $template = 'send_authentication_token.tt2.eml';
     my $data = {
@@ -498,6 +496,7 @@ sub req_complete_challenge {
         to        => $recipient,
         entityid  => $self->{in}->{entityid},
         token     => $token->token(),
+        lh         => $self->{lh},
     };
 
     binmode($handle, ":utf8");
@@ -508,7 +507,7 @@ sub req_complete_challenge {
             template => 'index-nobanner.tt2.html',
             data     => {
                 content => 'errors.tt2.html',
-                errors  => [ "mail_notification_error" ]
+                errors  => [ "mail_notification_failure" ]
             }
         );
     }
@@ -672,7 +671,7 @@ sub req_create_accounts {
             template => 'index.tt2.html',
             data     => {
                 content => 'errors.tt2.html',
-                errors  => [ "accounts_creation_failed" ]
+                errors  => [ "accounts_creation_failure" ]
             }
         );
     }
diff --git a/lib/AccountManager/L10N.pm b/lib/AccountManager/L10N.pm
new file mode 100644
index 0000000000000000000000000000000000000000..515c038545977d603e837dc509faa3c57dd0f0ec
--- /dev/null
+++ b/lib/AccountManager/L10N.pm
@@ -0,0 +1,8 @@
+package AccountManager::L10N;
+
+use strict;
+use warnings;
+
+use base 'Locale::Maketext';
+
+1;
diff --git a/lib/AccountManager/L10N/en.pm b/lib/AccountManager/L10N/en.pm
new file mode 100644
index 0000000000000000000000000000000000000000..83b4932e7928230a7cd3e387bb2b41305c386b33
--- /dev/null
+++ b/lib/AccountManager/L10N/en.pm
@@ -0,0 +1,12 @@
+package AccountManager::L10N::en;
+
+use strict;
+use warnings;
+
+use base 'AccountManager::L10N';
+
+our %Lexicon = (
+    '_AUTO' => 1,
+);
+
+1;
diff --git a/lib/AccountManager/L10N/fr.pm b/lib/AccountManager/L10N/fr.pm
new file mode 100644
index 0000000000000000000000000000000000000000..14789ff6472edbdf99f7bc463446b190380e83f4
--- /dev/null
+++ b/lib/AccountManager/L10N/fr.pm
@@ -0,0 +1,75 @@
+package AccountManager::L10N::fr;
+
+use strict;
+use warnings;
+use utf8;
+
+use base 'AccountManager::L10N';
+
+our %Lexicon = (
+    '_AUTO' => 1,
+
+    "Objective" => "Objectif",
+    "eduGAIN Access Check allows administrators of a Service Provider (SP) registered in <a href=\"[_1]\">eduGAIN</a> federation to create test accounts with different profiles to validate the behaviour and test federated login." => "eduGAIN Access Check permet aux administrateurs d'un fournisseur de service (Service Provider) enregistré dans la fédération <a href=\"[_1]\">eduGAIN</a> de créer des comptes de test avec différents profils, afin de tester l'authentification fédérée et de valider le comportement du service.",
+    "The test accounts can only be used to access own services." => "Ces comptes de test ne peuvent être utilisés qu'avec ce service.",
+    "More information" => "Plus d'information",
+    "Functionning" => "Fonctionnement",
+    "Get started" => "Commencer",
+    "To start testing your own services, start by selecting one your are administrator for." => "Pour commencer à tester vos propres services, commencez par en sélectionner un dont vous êtes l'administrateur.",
+    "Error:" => "Erreur:",
+    "unknown action" => "action inconnue",
+    "internal error" => "erreur interne",
+    "the validation token you provided is incorrect or it has already been used" => "le code de validation fourni est incorrect, ou a déjà été utilisé",
+    "the validation token you provided cannot be used for this service provider ([_1])" =>  "le code de validation fourni n'est pas utilisable pour ce fournisseur de service ([_1])",
+    "mail notification failure" => "échec de notification par mail",
+    "test accounts creation failure" => "échec de création des comptes",
+    "missing parameter '[_1]'" => "paramètre manquant '[_1]'",
+    "You can report the issue to the administrators" => "Vous pouvez informer les administrateurs du problème",
+    "Select your service" => "Sélectionnez votre service",
+    "Please select the service that you want to test in the list below." => "Veuillez sélectionner le service que vous désirez tester dans la liste ci-dessous.",
+    "You must be an administrator of that service to continue afterwards."=> "Vous devez être administrateur de ce service pour continuer ensuite.",
+    "Type the name or entityID of service to test:" => "Entrez le nom ou l'identifiant (entityID) du service à tester:",
+    "Only Service Providers included in eduGAIN metadata are included in the list." => "Seuls les fournisseurs de service (Service Provider) inclus dans les métadonnées de la fédération eduGAIN sont inclus dans la liste/",
+    "Select your email address" => "Sélectionnez votre adresse e-mail",
+    "Complete email challenge" => "Validez le challenge e-mail",
+    "Test accounts" => "Comptes de test",
+    "Before you can create test accounts at this Identity Provider, we need to ensure you are a legitimate administrator of '[_1]'." => "Avant de pouvoir créer des comptes de test sur ce fournisseur d'identité, nous devons nous assurer que vous êtes un administateur légitime de '[_1]'",
+    "Select the email address where an email challenge can be sent to validate your identity:" => "Sélectionner l'adresse e-mail où envoyer un message pour valider votre identité:",
+    "Those email addresses have been extracted from your service metadata." => "Ces addresses e-mail ont été extraites des métadonnées pour votre service.",
+    "No ContactPerson element could be found in your service metadata, therefore we are unable to provide test accounts for this service." => "Aucun élément ContactPerson n'a pu être trouvées das les métadonnées de votre fournisseur de service, c'est pourquoi nous sommes incapable de fournir des comptes de test pour ce service.",
+    "Please contact your federation administrators to add needed information to the metadata." => "Veuillez contacter les administrateurs de votre fédération pour ajouter les informations nécessaires aux métadonnées.",
+    "An email challenge including a validation token has been emailed to you at [_1]." => "Un message incluant un code de validation vous a été envoyé à [_1].",
+    "Please copy and paste the validation token in the form below to proof that you are administrator of this service." => "Veuillez recopier ce code dans le formulaire ci-dessous pour prouver que vous êtes l'administatreur de ce service.",
+    "<strong>Success:</strong> your identity as administrator of the Service Provider with entityID <strong>[_1]</strong> has been validated!" => "<strong>Succès:</strong> votre identité comme administrateur du service <strong>[_1]</strong> a été validée!",
+    "Test accounts created" => "Comptes de test créés",
+    "You can now use these test accounts to login at your federated service." => "Vous pouvez maintenant utiliser ces comptes pour vous identifier sur votre service fédéré.",
+    "To do so, select <strong>[_1]</strong> when choosing an identity provider." => "Pour le faire, sélectionnez <strong>[_1]</strong> lors du choix du founisseur d'identité à utiliser.",
+    "Download in CSV format" => "Télécharger au format CSV",
+    "Account profile: [_1]" => "Profil d'utilisateur: [_1]",
+    "user name:" => "nom d'utilisateur:",
+    "password:" => "mot de passe:",
+    "comment:" => "commentaire:",
+    "show details" => "montrer les détails",
+    "List of user attributes" => "Liste des attributs utilisateur",
+    "Below is the list of user attributes associated to this test account." => "Voici la liste des attributs utilisateur associés à ce compte de test.",
+    "After a successfull authentication process these attributes are transmited via the SAML protocol from eduGAIN Access Check Identity Provider to your Service Provider." => "Ces attributs sont transmis via le protocole SAML, après une authentification réussie, du fournisseur d'identité eduGAIN Access Check à votre service.",
+    "value dynamically generated by the SP" => "valeur générée dynamiquement par le SP",
+    "If you need a customized test account with additional user attributes, you should contact <a href=\"mailto:[_1]\">[_1]</a>." => "Si vous avez besoin d'un compte de test avec eds attributs utilisateurs supplémentaires, vous devriez contacter <a href=\"mailto:[_1]\">[_1]</a>.",
+    "(1) eduPersonAffiliation and eduPersonScoppedAffilisation attributes are assigned quite differently from federation to federation." => "(1) les attributs eduPersonAffiliation et eduPersonScoppedAffilisation sont valorisés différement d'une fédération à une autre.",
+    "<a href=\"[_1]\">This usage comparison of eduPersonAffiliation accross different countries</a> discusses these differences." => "<a href=\"[_1]\">Cette comparaison des usages de l'attribut eduPersonAffiliation dans plusieurs pays</a> discute de ces différences.",
+    "Therefore its values should be handled with great care." => "C'est pourquoi ces valeurs doivent être traitées avec prudence.",
+    "Note that these test accounts will automatically expire in [_1] days and that they can only be used to test federated login to your eduGAIN-enabled Service Provider with entityID <strong>[_2]</strong>." => "Veuillez noter que ces comptes de test expirent automatiquement dans [_1] jours, et qu'ils ne peuvent être utilisés que pour tester l'authentification fédérée sur le service <strong>[_2]</strong>.",
+    "Thank you for using the eduGAIN Access Check" => "Merci d'avoir utilisé eduGain Access Check",
+    "Type the name or entityID of service to test:" => "Entrez le nom ou l'identifiant (entityID) du service à tester:",
+    "Please provide the validation token here:" => "Veuillez fournir le code de validation:",
+    "Test accounts request" => "Demande de comptes de test",
+    "This is an email challenge automatically sent to you by eduGAIN Access Check." => "Ceci est un message envoyé automatiquement par l'application eduGAIN Access Check.",
+    "Somebody with IP address [_1] has requested to create test accounts for eduGAIN Service Provider with entityID [_2]." => "Quelqu'un avec l'adresse IP [_1] a demandé la création de comptes de test pour le service [_2].",
+    "The address [_1] is mentioned in the eduGAIN metadata as a contact for this Service Provider." => "L'addresse [_1] est mentionnée dans les métadonnées de la fédération eduGAIN comme contact pour ce service.",
+    "To complete the creation of test accounts, paste the following validation token in the eduGAIN Access Check web form." => "Pour terminer la création de ces comptes de test, recopiez le code de validation suivant dans l'application eduGAIN Access Check.",
+    "Validation token:" => "Code de validation:",
+    "If the creation of test accounts was not initiated by you or a fellow administrator for the above Service Provider, please forward this email and contact [_1] to inform them about a potential abuse of the eduGAIN Access Check service." => "Si la création de comptes de test n'a pas été demandée par vous ou un autre administrateur du service mentionné plus haut, merci de transmettre ce message à [_1] afin d'informer d'une utilisation inappropriée de l'application eduGAIN Access Check.",
+    "Best Regards" => "Cordialement",
+);
+
+1;
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 14126a55dc8b5b27a55e0a436efee872f5edba64..ff9df00abc6d16ffced585818338ea28bc1e7a73 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -11,6 +11,9 @@ nobase_modules_DATA = \
 	AccountManager/Account.pm \
 	AccountManager/Account/Manager.pm \
 	AccountManager/Tools.pm \
+	AccountManager/L10N.pm \
+	AccountManager/L10N/en.pm \
+	AccountManager/L10N/fr.pm \
 	AccountManager/App.pm
 
 EXTRA_DIST = $(nobase_modules_DATA)
diff --git a/templates/Makefile.am b/templates/Makefile.am
index 577e05907c8575953a7dcaa981e04df9588eb426..e1a743a469308dc2e58b5e18ebb9ef1467e85d74 100644
--- a/templates/Makefile.am
+++ b/templates/Makefile.am
@@ -1,22 +1,13 @@
 nobase_templates_DATA = \
 	accounts/accounts.php.tt2 \
-	mail/en/send_authentication_token.tt2.eml \
-	mail/fr/send_authentication_token.tt2.eml \
-	web/en/errors.tt2.html \
-	web/en/home.tt2.html \
-	web/en/index.tt2.html \
-	web/en/index-nobanner.tt2.html \
-	web/en/select_sp.tt2.html \
-	web/en/select_email.tt2.html \
-	web/en/complete_challenge.tt2.html \
-	web/en/create_accounts.tt2.html \
-	web/fr/errors.tt2.html \
-	web/fr/home.tt2.html \
-	web/fr/index.tt2.html \
-	web/fr/index-nobanner.tt2.html \
-	web/fr/select_sp.tt2.html \
-	web/fr/select_email.tt2.html \
-	web/fr/complete_challenge.tt2.html \
-	web/fr/create_accounts.tt2.html
+	mail/send_authentication_token.tt2.eml \
+	web/errors.tt2.html \
+	web/home.tt2.html \
+	web/index.tt2.html \
+	web/index-nobanner.tt2.html \
+	web/select_sp.tt2.html \
+	web/select_email.tt2.html \
+	web/complete_challenge.tt2.html \
+	web/create_accounts.tt2.html
 
 EXTRA_DIST = $(nobase_templates_DATA)
diff --git a/templates/mail/en/send_authentication_token.tt2.eml b/templates/mail/en/send_authentication_token.tt2.eml
deleted file mode 100644
index a6861b35c046acd0b6ec3c1b8340dcf4788bf3c6..0000000000000000000000000000000000000000
--- a/templates/mail/en/send_authentication_token.tt2.eml
+++ /dev/null
@@ -1,18 +0,0 @@
-From: eduGAIN Access Check <[% from %]>
-To: [% to %]
-Subject: eduGAIN Access Check - Test accounts request
-Content-type: text/plain; charset=UTF-8; format=flowed
-
-This is an email challenge automatically sent to you by eduGAIN Access Check. Somebody with IP address [% sourceip %] has requested to create test accounts for eduGAIN Service Provider with entityID [% entityid %].
-The address [% to %] is mentioned in the eduGAIN metadata as a contact for this Service Provider.
-
-To complete the creation of test accounts, paste the following validation token in the eduGAIN Access Check web form.
-
-Validation token:  [% token %]
-
-eduGAIN Access Check: [% app.url %]
-
-If the creation of test accounts was not initiated by you or a fellow administrator for the above Service Provider, please forward this email and contact [% app.support_email %] to inform them about a potential abuse of the eduGAIN Access Check service.
-
-Best Regards
-eduGAIN Access Check Bot
diff --git a/templates/mail/fr/send_authentication_token.tt2.eml b/templates/mail/fr/send_authentication_token.tt2.eml
deleted file mode 100644
index 5f83ded5a449bb6ce9e971b1ca5c845be98789e3..0000000000000000000000000000000000000000
--- a/templates/mail/fr/send_authentication_token.tt2.eml
+++ /dev/null
@@ -1,26 +0,0 @@
-From: eduGAIN Access Check <[% from %]>
-To: [% to %]
-Subject: eduGAIN Access Check - Demande de comptes de test
-Content-type: text/plain; charset=UTF-8; format=flowed
-
-Ceci est un message envoyé automatiquement par l'application eduGAIN
-Access Check.  Quelqu'un avec l'adresse IP [% sourceip %] a demandé la
-création de comptes de test pour le service [% entityid %].  L'addresse
-[% to %] est mentionnée dans les métadonnées de la fédération eduGAIN
-comme contact pour ce service.
-
-Pour terminer la création de ces comptes de test, recopiez le code de
-validation suivant dans l'application eduGAIN Access Check.
-
-Code de validation:  [% token %]
-
-eduGAIN Access Check: [% app.url %]
-
-Si la création de comptes de test n'a pas été demandée par vous ou un
-autre administrateur du service mentionné plus haut, merci de
-transmettre ce message à [% app.support_email %] afin d'informer
-d'une utilisation inappropriée de l'application eduGAIN Access
-Check.
-
-Cordialement
-eduGAIN Access Check Bot
diff --git a/templates/mail/send_authentication_token.tt2.eml b/templates/mail/send_authentication_token.tt2.eml
new file mode 100644
index 0000000000000000000000000000000000000000..ca4dbac096ece25ba33342fb0fdc34cfccfb231d
--- /dev/null
+++ b/templates/mail/send_authentication_token.tt2.eml
@@ -0,0 +1,19 @@
+From: eduGAIN Access Check <[% from %]>
+To: [% to %]
+Subject: eduGAIN Access Check - [% lh.maketex("Test accounts request") %]
+Content-type: text/plain; charset=UTF-8; format=flowed
+
+[% lh.maketex("This is an email challenge automatically sent to you by eduGAIN Access Check.") %]
+[% lh.maketex("Somebody with IP address [_1] has requested to create test accounts for eduGAIN Service Provider with entityID [_2].", sourceip, entityid) %]
+[% lh.maketex("The address [_1] is mentioned in the eduGAIN metadata as a contact for this Service Provider.", to) %]
+
+[% lh.maketex("To complete the creation of test accounts, paste the following validation token in the eduGAIN Access Check web form.") %]
+
+[% lh.maketex("Validation token:") %]  [% token %]
+
+eduGAIN Access Check: [% app.url %]
+
+[% lh.maketex("If the creation of test accounts was not initiated by you or a fellow administrator for the above Service Provider, please forward this email and contact [_1] to inform them about a potential abuse of the eduGAIN Access Check service.", app.support_email) %]
+
+[% lh.maketex("Best Regards") %]
+eduGAIN Access Check Bot
diff --git a/templates/web/complete_challenge.tt2.html b/templates/web/complete_challenge.tt2.html
new file mode 100644
index 0000000000000000000000000000000000000000..256faaba62896680663348a3328d53f9456d1428
--- /dev/null
+++ b/templates/web/complete_challenge.tt2.html
@@ -0,0 +1,13 @@
+<h2>[% lh.maketext("Complete email challenge") %]</h2>
+<p>
+    [% lh.maketext("An email challenge including a validation token has been emailed to you at [_1].") %]
+    [% lh.maketext("Please copy and paste the validation token in the form below to proof that you are administrator of this service.") %]
+</p>
+
+<fieldset>
+    <label for="token">[% lh.maketext("Please provide the validation token here:") %]</label>
+    <input name="token" value="" id="token" type="text" class="required error"/>
+    <input type="hidden" name="entityid" value="[% entityid %]" id="entityid"/>
+    <input type="hidden" name="email" value="[% email %]" id="email"/>
+</fieldset>
+
diff --git a/templates/web/create_accounts.tt2.html b/templates/web/create_accounts.tt2.html
new file mode 100644
index 0000000000000000000000000000000000000000..9166655d0e47128af9f6bc5bd520b3445d4f9ec1
--- /dev/null
+++ b/templates/web/create_accounts.tt2.html
@@ -0,0 +1,93 @@
+<div class="grid-x align-center">
+    <div class="cell shrink">
+        <div class="callout success">
+            [% lh.maketext("<strong>Success:</strong> your identity as administrator of the Service Provider with entityID <strong>[_1]</strong> has been validated!", entityid) %]
+        </div>
+    </div>
+</div>
+
+<h3>[% lh.maketext("Test accounts created") %]</h3>
+<p>
+    [% lh.maketext("You can now use these test accounts to login at your federated service.") %]
+    [% lh.maketext("To do so, select <strong>[_1]</strong> when choosing an identity provider.", idp_displayname) %]
+</p>
+
+<p><a class="button" href="[% conf.app_url %]?action=download_accounts&entityid=[% entityid %]&token=[% token %]&key=[% key %]">[% lh.maketext("Download in CSV format") %]</a></p>
+
+<div class="accounts">
+    [% FOREACH account IN accounts %]
+    <div class="account">
+        <table>
+            <caption>[% lh.maketext("Account profile: [_1]", account.profile()) %]</caption>
+            <tr>
+                <td><strong>[% lh.maketext("user name:") %]</strong></td>
+                <td>user[% account.id() %]</td>
+            </tr>
+            <tr>
+                <td><strong>[% lh.maketext("password:") %]</strong></td>
+                <td>[% account.password() %]</td>
+            </tr>
+            <tr>
+                <td colspan="2">
+                    <strong>[% lh.maketext("comment:") %]</strong>
+                    <div class="comment">[% account.comment() %]</div>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2" class="text-center" >
+                    <button data-open="account_details_[% account.id() %]" class="button show_account_details" id="show_account_details_[% account.id() %]">[% lh.maketext("show details") %]</button>
+                </td>
+            </tr>
+        </table>
+    </div>
+    <div class="reveal" data-reveal id="account_details_[% account.id() %]">
+        <button class="close-button" data-close aria-label="Close modal" type="button">
+            <span aria-hidden="true">&times;</span>
+        </button>
+        <h3>[% lh.maketext("List of user attributes") %]</h3>
+        <p>
+            lh.maketext("Below is the list of user attributes associated to this test account.") %]
+            lh.maketext("After a successfull authentication process these attributes are transmited via the SAML protocol from eduGAIN Access Check Identity Provider to your Service Provider.") %]
+        </p>
+        <div>
+            <table>
+                <caption>[% lh.maketext("List of user attributes") %]</caption>
+    [% FOREACH attribute IN [ 'cn', 'displayName', 'givenName', 'sn', 'mail', 'schacHomeOrganization', 'schacHomeOrganizationType', 'eduPersonPrincipalName' ] %]
+                <tr>
+                    <th>[% attribute %]</th><td>[% account.$attribute() %]</td>
+                </tr>
+    [% END %]
+    [% FOREACH attribute IN [ 'eduPersonAffiliation', 'eduPersonScopedAffiliation' ] %]
+                <tr>
+                    <th>[% attribute %]</th><td>[% account.$attribute().join(', ') %]</td>
+                </tr>
+    [% END %]
+                <tr>
+                    <th>eduPersonTargetedID:</th><td><i>[% lh.maketext("value dynamically generated by the SP") %]</i></td>
+                </tr>
+            </table>
+        </div>
+
+        <div class="callout info">[% lh.maketext("If you need a customized test account with additional user attributes, you should contact <a href=\"mailto:[_1]\">[_1]</a>.", app.support_email) %]</div>
+        <div>
+            [% lh.maketext("(1) eduPersonAffiliation and eduPersonScoppedAffilisation attributes are assigned quite differently from federation to federation.") %]
+            [% lh.maketext("<a href=\"[_1]\">This usage comparison of eduPersonAffiliation accross different countries</a> discusses these differences.", "http://tnc2010.terena.org/files/ePSA%20comparison%20v0%2006.ppt") %]
+            [% lh.maketext("Therefore its values should be handled with great care.") %]
+        </div>
+    </div>
+    [% END %]
+</div>
+
+<div class="grid-x align-center">
+    <div class="cell shrink">
+        <div class="callout warning">
+            <p>[% lh.maketext("Note that these test accounts will automatically expire in [_1] days and that they can only be used to test federated login to your eduGAIN-enabled Service Provider with entityID <strong>[_2]</strong>.", accounts_validity_period, entityid) %]</p>
+        </div>
+    </div>
+</div>
+
+<div class="grid-x align-center">
+    <div class="cell shrink">
+        <strong>[% lh.maketext("Thank you for using the eduGAIN Access Check") %]</strong>
+    </div>
+</div>
diff --git a/templates/web/en/complete_challenge.tt2.html b/templates/web/en/complete_challenge.tt2.html
deleted file mode 100644
index 155695204f0a53b75455ff23db8ee29b95e9dd3b..0000000000000000000000000000000000000000
--- a/templates/web/en/complete_challenge.tt2.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<h2>Complete email challenge</h2>
-<p>An email challenge including a validation token has been emailed to you at
-[% email %]. Please copy and paste the validation token in the form below to
-proof that you are administrator of this service.</p>
-
-<fieldset>
-    <label for="token">Please provide the validation token here:</label>
-    <input name="token" value="" id="token" type="text" class="required error"/>
-    <input type="hidden" name="entityid" value="[% entityid %]" id="entityid"/>
-    <input type="hidden" name="email" value="[% email %]" id="email"/>
-</fieldset>
-
diff --git a/templates/web/en/create_accounts.tt2.html b/templates/web/en/create_accounts.tt2.html
deleted file mode 100644
index 82c73df9e9001137760dee33e6ebbb12ecda900a..0000000000000000000000000000000000000000
--- a/templates/web/en/create_accounts.tt2.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<div class="grid-x align-center">
-    <div class="cell shrink">
-        <div class="callout success">
-            <strong>Success:</strong> Your identity as administrator of the Service Provider with entityID <strong>[% entityid %]</strong> could successfully be validated!
-        </div>
-    </div>
-</div>
-
-<h3>Test accounts created</h3>
-<p>You can now use these test accounts to login at your federated service. To
-do so, select <strong>[% idp_displayname %]</strong> when choosing an identity
-provider.</p>
-
-<p><a class="button" href="[% conf.app_url %]?action=download_accounts&entityid=[% entityid %]&token=[% token %]&key=[% key %]">Download in CSV format</a></p>
-
-<div class="accounts">
-    [% FOREACH account IN accounts %]
-    <div class="account">
-        <table>
-            <caption>Account profile: [% account.profile() %]</caption>
-            <tr>
-                <td><strong>user name:</strong></td>
-                <td>user[% account.id() %]</td>
-            </tr>
-            <tr>
-                <td><strong>user password:</strong></td>
-                <td>[% account.password() %]</td>
-            </tr>
-            <tr>
-                <td colspan="2">
-                    <strong>comment:</strong>
-                    <div class="comment">[% account.comment() %]</div>
-                </td>
-            </tr>
-            <tr>
-                <td colspan="2" class="text-center" >
-                    <button data-open="account_details_[% account.id() %]" class="button show_account_details" id="show_account_details_[% account.id() %]">show details</button>
-                </td>
-            </tr>
-        </table>
-    </div>
-    <div class="reveal" data-reveal id="account_details_[% account.id() %]">
-        <button class="close-button" data-close aria-label="Close modal" type="button">
-            <span aria-hidden="true">&times;</span>
-        </button>
-        <h3>List of user attributes associated</h3>
-        <p>Below is the list of user attributes associated to this test account. After a successfull authentication process these attributes are transmited
-        via the SAML protocol from eduGAIN Access Check Identity Provider to your Service Provider.</p>
-        <div>
-            <table>
-                <caption>List of user attributes</caption>
-    [% FOREACH attribute IN [ 'cn', 'displayName', 'givenName', 'sn', 'mail', 'schacHomeOrganization', 'schacHomeOrganizationType', 'eduPersonPrincipalName' ] %]
-                <tr>
-                    <th>[% attribute %]</th><td>[% account.$attribute() %]</td>
-                </tr>
-    [% END %]
-    [% FOREACH attribute IN [ 'eduPersonAffiliation', 'eduPersonScopedAffiliation' ] %]
-                <tr>
-                    <th>[% attribute %]</th><td>[% account.$attribute().join(', ') %]</td>
-                </tr>
-    [% END %]
-                <tr>
-                    <th>eduPersonTargetedID:</th><td><i>value dynamically generated by the SP</i></td>
-                </tr>
-            </table>
-        </div>
-
-        <div class="callout info">If you need a customized test account with additional user attributes, you should contact <a href="mailto:[% app.support_email %]">[% app.support_email %]</a>.</div>
-        <div>(1) eduPersonAffiliation and eduPersonScoppedAffilisation attributes are assigned quite differently from federation to federation. <a href="http://tnc2010.terena.org/files/ePSA%20comparison%20v0%2006.ppt">This usage comparison of eduPersonAffiliation accross different countries</a> discusses these differences. Therefore its values should be handled with great care.</div>
-    </div>
-    [% END %]
-</div>
-
-<div class="grid-x align-center">
-    <div class="cell shrink">
-        <div class="callout warning">
-    <p>Note that these test accounts will automatically expire in [% accounts_validity_period %] days and that they can only be used to test federated login to your eduGAIN-enabled Service Provider with entityID <strong>[% entityid %]</strong>.</p>
-        </div>
-    </div>
-</div>
-
-<div class="grid-x align-center">
-    <div class="cell shrink">
-        <strong>Thank you for using the eduGAIN Access Check</strong>
-    </div>
-</div>
diff --git a/templates/web/en/errors.tt2.html b/templates/web/en/errors.tt2.html
deleted file mode 100644
index ae7b069e8fb17d681ac959ae6f35bbe5950690d7..0000000000000000000000000000000000000000
--- a/templates/web/en/errors.tt2.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<div class="ui-widget">
-    [% FOREACH err IN errors %]
-
-    <p class="ui-state-error ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
-        Error:
-
-        [% IF err == 'unknown_action' %]
-        unknown action
-
-        [% ELSIF err == 'internal' %]
-        internal error; administrators of the federation registry have been notified.
-
-        [% ELSIF err == 'wrong_token' %]
-        the validation token you provided is incorrect or it has already been used
-
-        [% ELSIF err == 'wrong_token_for_sp' %]
-        the validation token you provided cannot be used to obtain test accounts for this service provider ([% entityid %])
-
-        [% ELSIF err == 'accounts_creation_failed' %]
-        failed to create your test accounts
-
-        [% ELSIF (matches = err.match('missing_(\w+)')) %]
-        missing parameter '[% matches.0 %]'
-
-        [% ELSE %]
-        [% err %]
-
-        [% END %]
-    </p>
-    <br/>
-    [% END %]
-
-    You can report the issue to the administrators (<a href="mailto:[% app.support_email %]">[% app.support_email %]</a>).
-</div>
diff --git a/templates/web/en/home.tt2.html b/templates/web/en/home.tt2.html
deleted file mode 100644
index e966eec1d0bb6c349f9e0325408ee6b24847524d..0000000000000000000000000000000000000000
--- a/templates/web/en/home.tt2.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<h2>Objective</h2>
-<p>eduGAIN Access Check allows administrators of a Service Provider (SP)
-registered in <a
-href="http://www.geant.net/service/eduGAIN/Pages/home.aspx">eduGAIN</a>
-federation to create test accounts with different profiles to validate the
-behaviour and test federated login. The test accounts can only be used to
-access own services.</p>
-<p><a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Access+Check">More information</a></p>
-
-<h2>Functionning</h2>
-<img class="float-center" alt="eduGAIN Access Check" src="images/edugain_test_idp_basics.png" height="50%" width="50%"/>
-
-<h2>Getting started</h2>
-<p>To start testing your own services, start by selecting one your are administrator for.</p>
-<p class="text-center"><a href="[% app.url %]?action=select_sp" class="button">Get started</a></p>
-
diff --git a/templates/web/en/select_email.tt2.html b/templates/web/en/select_email.tt2.html
deleted file mode 100644
index 38baa39375d61723e96f6d53437f00bb3f595fc7..0000000000000000000000000000000000000000
--- a/templates/web/en/select_email.tt2.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<h2>Select your email address</h2>
-<p>Before you can create test accounts at this Identity Provider, we need to ensure you are a legitimate administrator of "[% provider.displayname %]".</p>
-
-<fieldset class="scrollable">
-[% IF provider.contacts.defined %]
-    <label for="entityid">Select the email address where an email challenge can be sent to validate your identity:</label>
-    <br>
-    <div class="radio_inline">
-    [% FOREACH email IN provider.contacts.sort %]
-        <input name="email" value="[% email %]" type="radio" class="required"/><label for="email">[% email %]</label><br/>
-    [% END %]
-        <input type="hidden" name="entityid" value="[% provider.entityid %]" id="entityid"/>
-    </div>
-    <p>Those email addresses have been extracted from your service metadata.</p>
-
-[% ELSE %]
-    <p>No ContactPerson element could be found in your service metadata, therefore
-    we are unable to provide test accounts for this service. Please
-    contact your federation administrators to add needed
-    information to the metadata.</p>
-[% END %]
-</fieldset>
-
-<script type="text/javascript">
-    $(function() {
-       $('label[for="email"]').on('click', function() {
-          var input = $(this).prev();
-          input.val([input.attr('value')]);
-       });
-    });
-</script>
diff --git a/templates/web/errors.tt2.html b/templates/web/errors.tt2.html
new file mode 100644
index 0000000000000000000000000000000000000000..59dfc88fb40cc5c9b171a3057529b72d45e917ac
--- /dev/null
+++ b/templates/web/errors.tt2.html
@@ -0,0 +1,38 @@
+<div class="ui-widget">
+    [% FOREACH err IN errors %]
+
+    <p class="ui-state-error ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
+        [% lh.maketext("Error:") %]
+
+        [% IF err == 'unknown_action' %]
+        [% lh.maketext("unknown action") %]
+
+        [% ELSIF err == 'internal' %]
+        [% lh.maketext("internal error") %]
+
+        [% ELSIF err == 'mail_notification_failure' %]
+        [% lh.maketext("mail notification failure") %]
+
+        [% ELSIF err == 'accounts_creation_failure' %]
+        [% lh.maketext("test accounts creation failure") %]
+
+        [% ELSIF err == 'wrong_token' %]
+        [% lh.maketext("the validation token you provided is incorrect or it has already been used") %]
+
+        [% ELSIF err == 'wrong_token_for_sp' %]
+        [% lh.maketext("the validation token you provided cannot be used for this service provider ([_1])", entityid) %]
+
+
+        [% ELSIF (matches = err.match('missing_(\w+)')) %]
+        [% lh.maketext("missing parameter '[_1]'", matches.0) %]
+
+        [% ELSE %]
+        [% err %]
+
+        [% END %]
+    </p>
+    <br/>
+    [% END %]
+
+    [% lh.maketext("You can report the issue to the administrators") %] (<a href="mailto:[% app.support_email %]">[% app.support_email %]</a>).
+</div>
diff --git a/templates/web/fr/complete_challenge.tt2.html b/templates/web/fr/complete_challenge.tt2.html
deleted file mode 100644
index 445089b5062fc2675ef1992500124635cfb5fe10..0000000000000000000000000000000000000000
--- a/templates/web/fr/complete_challenge.tt2.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<h2>Validez le challenge e-mail</h2>
-<p>Un message incluant un code de validation vous a été envoyé à [% email %]. Veuillez recopier ce code dans le formulaire ci-dessous pour prouver que vous êtes l'administatreur de ce service.</p>
-
-<fieldset>
-    <label for="token">Veuillez fournir le code de validation:</label>
-    <input name="token" value="" id="token" type="text" class="required error"/>
-    <input type="hidden" name="entityid" value="[% entityid %]" id="entityid"/>
-    <input type="hidden" name="email" value="[% email %]" id="email"/>
-</fieldset>
-
diff --git a/templates/web/fr/errors.tt2.html b/templates/web/fr/errors.tt2.html
deleted file mode 100644
index f23521f6341613101df9467a08ebe0c1f94ec366..0000000000000000000000000000000000000000
--- a/templates/web/fr/errors.tt2.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<div class="ui-widget">
-    [% FOREACH err IN errors %]
-    <p class="ui-state-error ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
-        Error:
-
-        [% IF err == 'unknown_action' %]
-        unknown action
-
-        [% ELSIF err == 'internal' %]
-        internal error; administrators of the federation registry have been notified.
-
-        [% ELSIF err == 'wrong_token' %]
-        the validation token you provided is incorrect or it has already been used
-
-        [% ELSIF err == 'wrong_token_for_sp' %]
-        the validation token you provided cannot be used to obtain test accounts for this service provider ([% entityid %])
-
-        [% ELSIF err == 'accounts_creation_failed' %]
-        failed to create your test accounts
-
-        [% ELSIF (matches = err.match('missing_(\w+)')) %]
-        missing parameter '[% matches.0 %]'
-
-        [% ELSE %]
-        [% err %]
-
-        [% END %]
-    </p>
-    <br/>
-    [% END %]
-
-    You can report the issue to the administrators (<a href="mailto:[% app.support_email %]">[% app.support_email %]</a>).
-</div>
diff --git a/templates/web/fr/home.tt2.html b/templates/web/fr/home.tt2.html
deleted file mode 100644
index 906bee1ae609a7256a30b9066eeb64d85d885dc5..0000000000000000000000000000000000000000
--- a/templates/web/fr/home.tt2.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<h2>Objectif</h2>
-<p>eduGAIN Access Check permet aux administrateurs d'un fournisseur de service
-(Service Provider) enregistré dans la fédération <a
-href="http://www.geant.net/service/eduGAIN/Pages/home.aspx">eduGAIN</a> de
-créer des comptes de test avec différents profils, afin de tester
-l'authentification fédérée et de valider le comportement du service. Ces
-comptes de test ne peuvent être utilisés qu'avec ce service.</p>
-<p><a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Access+Check">Plus d'information</a></p>
-
-<h2>Fonctionnement</h2>
-<img class="float-center" alt="eduGAIN Access Check" src="images/edugain_test_idp_basics.png" height="50%" width="50%"/>
-
-<h2>Commencer</h2>
-<p>Pour commencer à tester vos propres services, commencez par en sélectionner un dont vous êtes l'administrateur.</p>
-<p class="text-center"><a href="[% app.url %]?action=select_sp" class="button">Commencer</a></p>
-
diff --git a/templates/web/fr/select_email.tt2.html b/templates/web/fr/select_email.tt2.html
deleted file mode 100644
index 60aa40b5a739e733457aa78acc0d100b07996be9..0000000000000000000000000000000000000000
--- a/templates/web/fr/select_email.tt2.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<h2>Sélectionnez votre adresse e-mail</h2>
-<p>Avant de pouvoir créer des comptes de test sur ce fournisseur d'identité, nous devons nous assurer que vous êtes un administateur légitime de "[% provider.displayname %]".</p>
-
-<fieldset class="scrollable">
-[% IF provider.contacts.defined %]
-    <label for="entityid">Sélectionner l'adresse e-mail où envoyer un message pour valider votre identité:</label>
-    <br>
-    <div class="radio_inline">
-    [% FOREACH email IN provider.contacts.sort %]
-        <input name="email" value="[% email %]" type="radio" class="required"/><label for="email">[% email %]</label><br/>
-    [% END %]
-        <input type="hidden" name="entityid" value="[% provider.entityid %]" id="entityid"/>
-    </div>
-    <p>Ces addresses e-mail ont été extraites des métadonnées pour votre service.</p>
-
-[% ELSE %]
-    <p>Aucun élément ContactPerson n'a pu être trouvées das les métadonnées de
-    votre fournisseur de service, c'est pourquoi nous sommes incapable de
-    fournir des comptes de test pour ce service. Veuillez contacter les
-    administrateurs de votre fédération pour ajouter les informations
-    nécessaires aux métadonnées.</p>
-[% END %]
-</fieldset>
-
-<script type="text/javascript">
-    $(function() {
-       $('label[for="email"]').on('click', function() {
-          var input = $(this).prev();
-          input.val([input.attr('value')]);
-       });
-    });
-</script>
diff --git a/templates/web/fr/select_sp.tt2.html b/templates/web/fr/select_sp.tt2.html
deleted file mode 100644
index 4b643f4338a0a56064b611b66b747d8d5dd5aa98..0000000000000000000000000000000000000000
--- a/templates/web/fr/select_sp.tt2.html
+++ /dev/null
@@ -1,134 +0,0 @@
-  <script type="text/javascript">
-
-jQuery(document).ready(function($){
-
-    var form = $("#create-account-form").show();
-
-        form.steps({
-        headerTag: "h3",
-        bodyTag: "fieldset",
-        stepsOrientation: "vertical",
-        transitionEffect: "slideLeft",
-        labels: {
-            next: "Suivant",
-            previous: "Précédent",
-        },
-        onStepChanging: function (event, currentIndex, newIndex)
-        {
-
-            // Trigger loading of the 'select_sp' with the selected SP entityid as parameter
-            // Result gets included in the next tab
-            if (currentIndex === 0 && newIndex === 1)
-            {
-                form.steps("remove", 1);
-                form.steps("insert", 1, {
-                    title: "Sélectionnez votre adresse e-mail",
-                    contentMode: "async",
-                    contentUrl: "[% app.url %]?action=select_email&entityid="+
-                        encodeURIComponent($('#entityid').val())
-                });
-            }
-
-            // Trigger loading of the 'generate_token' with the selected SP entityid as parameter
-            // Result gets included in the next tab
-            if (currentIndex === 1 && newIndex === 2)
-            {
-                form.steps("remove", 2);
-                form.steps("insert", 2, {
-                    title: "Validez le challenge e-mail",
-                    contentMode: "async",
-                    contentUrl: "[% app.url %]?action=complete_challenge&entityid="+
-                        encodeURIComponent($('#entityid').val())+"&email="+encodeURIComponent($("input:checked[name='email']").val())
-                });
-            }
-
-            // Trigger loading of the 'validate_token' with the list of test accounts created
-            // Result gets included in the next tab
-            if (currentIndex === 2 && newIndex === 3)
-            {
-                window.location="[% app.url %]?action=create_accounts&entityid="+
-                    encodeURIComponent($('#entityid').val())+"&token="+encodeURIComponent($('#token').val()) +
-                    "&email="+encodeURIComponent($('#email').val());
-             }
-
-            // Allways allow previous action even if the current form is not valid!
-            if (currentIndex > newIndex)
-            {
-              return true;
-            }
-            // Needed in some cases if the user went back (clean up)
-            if (currentIndex < newIndex)
-            {
-                // To remove error styles
-                form.find(".body:eq(" + newIndex + ") label.error").remove();
-                form.find(".body:eq(" + newIndex + ") .error").removeClass("error");
-            }
-            form.validate().settings.ignore = ":disabled,:hidden";
-            return form.valid();
-
-         },
-        onStepChanged: function (event, currentIndex, priorIndex)
-        {
-        },
-        onFinishing: function (event, currentIndex)
-        {
-            form.validate().settings.ignore = ":disabled";
-            return form.valid();
-        },
-        onFinished: function (event, currentIndex)
-        {
-            alert("Submitted!");
-        }
-    });
-
-    form.validate({
-        errorPlacement: function errorPlacement(error, element) { element.before(error); },
-    });
-
-});
-
-$(function() {
-    $( "#entityid" ).combobox();
-    $( "#toggle" ).click(function() {
-        $( "#combobox" ).toggle();
-    });
-});
-
-</script>
-
-
-<form id ="create-account-form"
-      action="[% env.SCRIPT_NAME %]"
-      method="POST">
-
-    <h3>Sélectionnez votre service</h3>
-    <fieldset>
-        <h2>Sélectionnez votre service</h2>
-        <p>Veuillez sélectionner le service que vous désirez tester dans la
-        liste ci-dessous. Vous devez être administrateur de ce service pour
-        continuer ensuite.</p>
-
-        <label for="entityid">Entrez le nom ou l'identifiant (entityID) du service à tester:</label>
-        <br>
-        <select id="entityid" name="entityid" class="required">
-            <option value=""></option>
-            [% FOREACH entity IN metadata.sort('display_name') %]
-            <option value="[% entity.entityid %]">[% IF entity.display_name %][% entity.display_name %] [% END %]([% entity.entityid %])</option>
-            [% END %]
-        </select>
-        <p>Seuls les fournisseurs de service (Service Provider) inclus dans les métadonnées de la fédération eduGAIN sont inclus dans la liste</p>
-    </fieldset>
-
-    <h3>Sélectionnez votre adresse e-mail</h3>
-    <fieldset>
-        <div data-mode="async" data-url="/rest/service/0"></div>
-    </fieldset>
-
-    <h3>Validez le challenge e-mail</h3>
-    <fieldset></fieldset>
-
-    <h3>Comptes de test</h3>
-    <fieldset></fieldset>
-
-
-</form>
diff --git a/templates/web/home.tt2.html b/templates/web/home.tt2.html
new file mode 100644
index 0000000000000000000000000000000000000000..d8a1ae131822f7a5b18af3aa8cb7791acff109ed
--- /dev/null
+++ b/templates/web/home.tt2.html
@@ -0,0 +1,19 @@
+<h2>[% lh.maketext("Objective") %]</h2>
+<p>
+[%
+    lh.maketext(
+    "eduGAIN Access Check allows administrators of a Service Provider (SP) registered in <a href=\"[_1]\">eduGAIN</a> federation to create test accounts with different profiles to validate the behaviour and test federated login.",
+    "http://www.geant.net/service/eduGAIN/Pages/home.aspx"
+    )
+%]
+[% lh.maketext("The test accounts can only be used to access own services.") %]
+</p>
+<p><a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Access+Check">[% lh.maketext("More information") %]</a></p>
+
+<h2>[% lh.maketext("Functionning") %]</h2>
+<img class="float-center" alt="eduGAIN Access Check" src="images/edugain_test_idp_basics.png" height="50%" width="50%"/>
+
+<h2>[% lh.maketext("Get started") %]</h2>
+<p>[% lh.maketext("To start testing your own services, start by selecting one your are administrator for.") %]</p>
+<p class="text-center"><a href="[% app.url %]?action=select_sp" class="button">[% lh.maketext("Get started") %]</a></p>
+
diff --git a/templates/web/en/index-nobanner.tt2.html b/templates/web/index-nobanner.tt2.html
similarity index 100%
rename from templates/web/en/index-nobanner.tt2.html
rename to templates/web/index-nobanner.tt2.html
diff --git a/templates/web/en/index.tt2.html b/templates/web/index.tt2.html
similarity index 100%
rename from templates/web/en/index.tt2.html
rename to templates/web/index.tt2.html
diff --git a/templates/web/select_email.tt2.html b/templates/web/select_email.tt2.html
new file mode 100644
index 0000000000000000000000000000000000000000..8a87e6adb581546c401bc019bc19dccfea08f499
--- /dev/null
+++ b/templates/web/select_email.tt2.html
@@ -0,0 +1,31 @@
+<h2>[% lh.maketext("Select your email address") %]</h2>
+<p>[% lh.maketext("Before you can create test accounts at this Identity Provider, we need to ensure you are a legitimate administrator of '[_1]'.", provider.displayname) %]</p>
+
+<fieldset class="scrollable">
+[% IF provider.contacts.defined %]
+    <label for="entityid">[% lh.maketext("Select the email address where an email challenge can be sent to validate your identity:") %]</label>
+    <br>
+    <div class="radio_inline">
+    [% FOREACH email IN provider.contacts.sort %]
+        <input name="email" value="[% email %]" type="radio" class="required"/><label for="email">[% email %]</label><br/>
+    [% END %]
+        <input type="hidden" name="entityid" value="[% provider.entityid %]" id="entityid"/>
+    </div>
+    <p>[% lh.maketext("Those email addresses have been extracted from your service metadata.") %]</p>
+
+[% ELSE %]
+    <p>
+    [% lh.maketext("No ContactPerson element could be found in your service metadata, therefore we are unable to provide test accounts for this service.") %]
+    [% lh.maketext("Please contact your federation administrators to add needed information to the metadata.") %]
+    </p>
+[% END %]
+</fieldset>
+
+<script type="text/javascript">
+    $(function() {
+       $('label[for="email"]').on('click', function() {
+          var input = $(this).prev();
+          input.val([input.attr('value')]);
+       });
+    });
+</script>
diff --git a/templates/web/en/select_sp.tt2.html b/templates/web/select_sp.tt2.html
similarity index 81%
rename from templates/web/en/select_sp.tt2.html
rename to templates/web/select_sp.tt2.html
index 01d41ccfb76557c2ebf77ff9ede0114506e2a4dd..3be067605799048b79b95567a9af73fb89c28b85 100644
--- a/templates/web/en/select_sp.tt2.html
+++ b/templates/web/select_sp.tt2.html
@@ -18,7 +18,7 @@ jQuery(document).ready(function($){
             {
                 form.steps("remove", 1);
                 form.steps("insert", 1, {
-                    title: "Select your email address",
+                    title: "[% lh.maketext("Select your email address") %]",
                     contentMode: "async",
                     contentUrl: "[% app.url %]?action=select_email&entityid="+
                         encodeURIComponent($('#entityid').val())
@@ -31,7 +31,7 @@ jQuery(document).ready(function($){
             {
                 form.steps("remove", 2);
                 form.steps("insert", 2, {
-                    title: "Complete email challenge",
+                    title: "[% lh.maketext("Complete email challenge") %]",
                     contentMode: "async",
                     contentUrl: "[% app.url %]?action=complete_challenge&entityid="+
                         encodeURIComponent($('#entityid').val())+"&email="+encodeURIComponent($("input:checked[name='email']").val())
@@ -97,14 +97,15 @@ $(function() {
       action="[% env.SCRIPT_NAME %]"
       method="POST">
 
-    <h3>Select your service</h3>
+    <h3>[% lh.maketext("Select your service") %]</h3>
     <fieldset>
-        <h2>Select your service</h2>
-        <p>Please select the service that you want to test in the list
-        below. You must be an administrator of that service to
-        continue afterwards.</p>
+        <h2>[% lh.maketext("Select your service") %]</h2>
+        <p>
+            [% lh.maketext("Please select the service that you want to test in the list below.") %]
+            [% lh.maketext("You must be an administrator of that service to continue afterwards.") %]
+        </p>
 
-        <label for="entityid">Type the name or entityID of service to test:</label>
+        <label for="entityid">[% lh.maketext("Type the name or entityID of service to test:") %]</label>
         <br>
         <select id="entityid" name="entityid" class="required">
             <option value=""></option>
@@ -112,18 +113,18 @@ $(function() {
             <option value="[% entity.entityid %]">[% IF entity.display_name %][% entity.display_name %] [% END %]([% entity.entityid %])</option>
             [% END %]
         </select>
-        <p>Only Service Providers included in eduGAIN metadata are included in the list.</p>
+        <p>[% lh.maketext("Only Service Providers included in eduGAIN metadata are included in the list.") %]</p>
     </fieldset>
 
-    <h3>Select your email address</h3>
+    <h3>[% lh.maketext("Select your email address") %]</h3>
     <fieldset>
         <div data-mode="async" data-url="/rest/service/0"></div>
     </fieldset>
 
-    <h3>Complete email challenge</h3>
+    <h3>[% lh.maketext("Complete email challenge") %]</h3>
     <fieldset></fieldset>
 
-    <h3>Test accounts</h3>
+    <h3>[% lh.maketext("Test accounts") %]</h3>
     <fieldset></fieldset>
 
 </form>