diff --git a/t/app.t b/t/app.t
index 13c840df70d703947220bc218cda2be5b8cebc1d..967a39ed3102a09d2fa0e604e88d86f64171c2a5 100755
--- a/t/app.t
+++ b/t/app.t
@@ -170,7 +170,7 @@ named_subtest "index page" => sub {
     $t->get_ok('/')
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check')
-      ->text_is('a[href=/select_entity]'  => 'Get started', 'get started button');
+      ->text_is('a[href=/select/entity]'  => 'Get started', 'get started button');
 
     my $res = $t->tx()->res();
     html_ok($res) or diag_file($res, $test_dir);
@@ -179,7 +179,7 @@ named_subtest "index page" => sub {
 named_subtest "SP selection page" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/select_entity')
+    $t->get_ok('/select/entity')
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->element_exists('select[id=all][name=all]', 'SP selection widget');
@@ -191,7 +191,7 @@ named_subtest "SP selection page" => sub {
 named_subtest "email selection page, missing entityid" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/select_email')
+    $t->get_ok('/select/email')
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+missing parameter 'entityid'/, 'expected error message');
@@ -203,7 +203,7 @@ named_subtest "email selection page, missing entityid" => sub {
 named_subtest "email selection page, invalid entityid" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/select_email' => form => {entityid => 'foo'})
+    $t->get_ok('/select/email' => form => {entityid => 'foo'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+invalid parameter 'entityid'/, 'expected error message');
@@ -215,7 +215,7 @@ named_subtest "email selection page, invalid entityid" => sub {
 named_subtest "email selection page, valid entityid" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/select_email' => form => {entityid => 'https://sp.renater.fr/'})
+    $t->get_ok('/select/email' => form => {entityid => 'https://sp.renater.fr/'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->element_exists('input[name=email][value=contact1@renater.fr]', 'email selection widget');
@@ -227,7 +227,7 @@ named_subtest "email selection page, valid entityid" => sub {
 named_subtest "challenge sending page, missing CSRF token" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/send_challenge')
+    $t->get_ok('/challenge/send')
       ->status_is(403)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+missing CSRF token/, 'expected error message');
@@ -242,7 +242,7 @@ named_subtest "challenge sending page, missing entityid" => sub {
     # neutralize CSRF token check, as we short-circuit the form
     $t->app()->hook(before_dispatch => sub { $_[0]->session(csrf_token => 'foo') });
 
-    $t->get_ok('/send_challenge' => form => {token => 'foo'})
+    $t->get_ok('/challenge/send' => form => {token => 'foo'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+missing parameter 'entityid'/, 'expected error message');
@@ -257,7 +257,7 @@ named_subtest "challenge sending page, invalid entityid" => sub {
     # neutralize CSRF token check, as we short-circuit the form
     $t->app()->hook(before_dispatch => sub { $_[0]->session(csrf_token => 'foo') });
 
-    $t->get_ok('/send_challenge' => form => {token => 'foo', entityid => 'foo'})
+    $t->get_ok('/challenge/send' => form => {token => 'foo', entityid => 'foo'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+invalid parameter 'entityid'/, 'expected error message');
@@ -272,7 +272,7 @@ named_subtest "challenge sending page, valid entityid, missing email" => sub {
     # neutralize CSRF token check, as we short-circuit the form
     $t->app()->hook(before_dispatch => sub { $_[0]->session(csrf_token => 'foo') });
 
-    $t->get_ok('/send_challenge' => form => {token => 'foo', entityid => 'https://sp.renater.fr/'})
+    $t->get_ok('/challenge/send' => form => {token => 'foo', entityid => 'https://sp.renater.fr/'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+missing parameter 'email'/, 'expected error message');
@@ -287,7 +287,7 @@ named_subtest "challenge sending page, valid entityid, invalid email" => sub {
     # neutralize CSRF token check, as we short-circuit the form
     $t->app()->hook(before_dispatch => sub { $_[0]->session(csrf_token => 'foo') });
 
-    $t->get_ok('/send_challenge' => form => {token => 'foo', entityid => 'https://sp.renater.fr/', email => 'foo'})
+    $t->get_ok('/challenge/send' => form => {token => 'foo', entityid => 'https://sp.renater.fr/', email => 'foo'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+invalid parameter 'email'/, 'expected error message');
@@ -299,7 +299,7 @@ named_subtest "challenge sending page, valid entityid, invalid email" => sub {
 named_subtest "challenge validation page, missing entityid" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/validate_challenge')
+    $t->get_ok('/challenge/validate')
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+missing parameter 'entityid'/, 'expected error message');
@@ -311,7 +311,7 @@ named_subtest "challenge validation page, missing entityid" => sub {
 named_subtest "challenge validation page, invalid entityid" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/validate_challenge' => form => {entityid => 'foo'})
+    $t->get_ok('/challenge/validate' => form => {entityid => 'foo'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+invalid parameter 'entityid'/, 'expected error message');
@@ -323,7 +323,7 @@ named_subtest "challenge validation page, invalid entityid" => sub {
 named_subtest "challenge validation page, valid entityid, missing email" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/validate_challenge' => form => {entityid => 'https://sp.renater.fr/'})
+    $t->get_ok('/challenge/validate' => form => {entityid => 'https://sp.renater.fr/'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+missing parameter 'email'/, 'expected error message');
@@ -335,7 +335,7 @@ named_subtest "challenge validation page, valid entityid, missing email" => sub
 named_subtest "challenge validation page, valid entityid, invalid email" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/validate_challenge' => form => {entityid => 'https://sp.renater.fr/', email => 'foo'})
+    $t->get_ok('/challenge/validate' => form => {entityid => 'https://sp.renater.fr/', email => 'foo'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->content_like(qr/Error:[\n\s]+invalid parameter 'email'/, 'expected error message');
@@ -347,7 +347,7 @@ named_subtest "challenge validation page, valid entityid, invalid email" => sub
 named_subtest "challenge validation page, valid entityid, valid email" => sub {
     my $t = get_test_object(test => $_[0]);
 
-    $t->get_ok('/validate_challenge' => form => {entityid => 'https://sp.renater.fr/', email => 'contact1@renater.fr'})
+    $t->get_ok('/challenge/validate' => form => {entityid => 'https://sp.renater.fr/', email => 'contact1@renater.fr'})
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check', 'expected title')
       ->text_is('div.content h2'  => 'Complete email challenge', 'expected form title');
@@ -362,7 +362,7 @@ named_subtest "index page, french version" => sub {
     $t->get_ok('/')
       ->status_is(200)
       ->text_is('html head title' => 'eduGAIN Access Check')
-      ->text_is('html body a[href=/select_entity]'  => 'Commencer', 'get started button');
+      ->text_is('html body a[href=/select/entity]'  => 'Commencer', 'get started button');
 
     my $res = $t->tx()->res();
     html_ok($res) or diag_file($res, $test_dir);
diff --git a/templates/web/edugain/index.html.tt2 b/templates/web/edugain/index.html.tt2
index cc025e620b6179f5b785f877c139ce810c4ab00b..0ef63ab0cf452c6db0949a5f0c8727d6a2408569 100644
--- a/templates/web/edugain/index.html.tt2
+++ b/templates/web/edugain/index.html.tt2
@@ -5,20 +5,20 @@
         <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
         <meta charset="utf-8"/>
 
-        <link type="image/png" rel="icon" href="images/favicon.png"/>
+        <link type="image/png" rel="icon" href="/images/favicon.png"/>
 
-        <link type="text/css" rel="stylesheet" href="font-awesome/css/font-awesome.min.css" />
-        <link type="text/css" rel="stylesheet" href="foundation/css/foundation.min.css"/>
-        <link type="text/css" rel="stylesheet" href="jquery-ui-1.12.1/jquery-ui.min.css"/>
-        <link type="text/css" rel="stylesheet" href="css/style.css"/>
-        <link type="text/css" rel="stylesheet" href="css/edugain.css" />
-        <link type="text/css" rel="stylesheet" href="css/edugain-menu-master.css" />
-        <link type="text/css" rel="stylesheet" href="css/edugain-menu-min-600.css" media="(min-width: 800px)" />
-        <link type="text/css" rel="stylesheet" href="css/edugain-min-800.css" media="(min-width: 800px)" />
+        <link type="text/css" rel="stylesheet" href="/font-awesome/css/font-awesome.min.css" />
+        <link type="text/css" rel="stylesheet" href="/foundation/css/foundation.min.css"/>
+        <link type="text/css" rel="stylesheet" href="/jquery-ui-1.12.1/jquery-ui.min.css"/>
+        <link type="text/css" rel="stylesheet" href="/css/style.css"/>
+        <link type="text/css" rel="stylesheet" href="/css/edugain.css" />
+        <link type="text/css" rel="stylesheet" href="/css/edugain-menu-master.css" />
+        <link type="text/css" rel="stylesheet" href="/css/edugain-menu-min-600.css" media="(min-width: 800px)" />
+        <link type="text/css" rel="stylesheet" href="/css/edugain-min-800.css" media="(min-width: 800px)" />
 
-        <script src="jquery-3.3.1.min.js"></script>
-        <script src="jquery-ui-1.12.1/jquery-ui.min.js"></script>
-        <script src="jquery-validation-1.17.0.min.js"></script>
+        <script src="/jquery-3.3.1.min.js"></script>
+        <script src="/jquery-ui-1.12.1/jquery-ui.min.js"></script>
+        <script src="/jquery-validation-1.17.0.min.js"></script>
 
         <title>[% app.name %]</title>
     </head>
@@ -26,33 +26,33 @@
     <body>
        <header>
             <div id="geant_logo_t" class="small-6 medium-4 columns text-left">
-                <img  src="images/geant_logo1.png">
+                <img  src="/images/geant_logo1.png">
             </div>
             <div  id="edugain_logo" class="small-6 medium-4 medium-offset-4 columns text-right">
-                <img src="images/edugain_logo1.png">
+                <img src="/images/edugain_logo1.png">
             </div>
         </header>
         <nav class="main-nav">
             <div class="central-section">
-                <div id="nav_icon" class="nav-icon"><a id="nav_icon_toggle" href="javascript:void(0);"><img src="images/menu-icon.gif" /></a></div>
+                <div id="nav_icon" class="nav-icon"><a id="nav_icon_toggle" href="javascript:void(0);"><img src="/images/menu-icon.gif" /></a></div>
                 <!-- menu goes here -->
 
                 <div id="core_nav_section" class="et-menu-holder">
                     <ul id="core_nav" class="et-menu et-left">
-                        <li class="et-first-option no-children"><a href="[% c.url_for('home') %]" title="Home"><img style="width: 16px; height: 15px; position: relative; top: 3px" src="images/home_logo.png" alt="Home icon" /></a></li>
+                        <li class="et-first-option no-children"><a href="[% c.url_for('home') %]" title="Home"><img style="width: 16px; height: 15px; position: relative; top: 3px" src="/images/home_logo.png" alt="Home icon" /></a></li>
                         <li class="et-option et-has-children">
                             <span>Language</span>
                             <ul class="et-submenu">
                                 <li class="et-submenu-option">
                                     <a [% IF l10n.language_tag() == "en" %]class="nocursor"[% ELSE %]href="[% c.url_with().query(lang => 'en') | html %]"[% END %] data-lang="en" title="English">
-                                        <img src="images/en.png" />
+                                        <img src="/images/en.png" />
                                         <span>English</span>
                                         [% IF l10n.language_tag() == "en" %]<span class="fa fa-check"></span>[% END %]
                                     </a>
                                 </li>
                                 <li class="et-submenu-option">
                                     <a [% IF l10n.language_tag() == "fr" %]class="nocursor"[% ELSE %]href="[% c.url_with().query(lang => 'fr') | html %]"[% END %] data-lang="fr" title="Français">
-                                        <img src="images/fr.png" />
+                                        <img src="/images/fr.png" />
                                         <span>Français</span>
                                         [% IF l10n.language_tag() == "fr" %]<span class="fa fa-check"></span>[% END %]
                                     </a>
@@ -79,7 +79,7 @@
             <p class="text-center">[% app.name %] [% app.version %] - <a href="mailto:[% app.support_email %]">[% c.loc("contact us") %]</a></p>
             <div class="central-section">
                 <div class="col-1-1">
-                    <img src="images/footer_logo_padded.jpg" style="width: 111px; height:26px;" />
+                    <img src="/images/footer_logo_padded.jpg" style="width: 111px; height:26px;" />
                 </div>
 
                 <div class="col-1-2">
diff --git a/templates/web/renater/index.html.tt2 b/templates/web/renater/index.html.tt2
index 312720ec3b1f65bc99d39af72c1edeaccc085954..cb14be960d7f2568e20ef1bf9fac5c30008bdd04 100644
--- a/templates/web/renater/index.html.tt2
+++ b/templates/web/renater/index.html.tt2
@@ -4,23 +4,23 @@
         <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
         <meta charset="utf-8">
 
-        <link type="image/png" rel="icon" href="images/favicon-federation.png" />
+        <link type="image/png" rel="icon" href="/images/favicon-federation.png" />
 
-        <link type="text/css" rel="stylesheet" href="font-awesome/css/font-awesome.min.css" />
-        <link type="text/css" rel="stylesheet" href="foundation/css/foundation.min.css">
-        <link type="text/css" rel="stylesheet" href="jquery-ui-1.12.1/jquery-ui.min.css" />
-        <link type="text/css" rel="stylesheet" href="css/style.css" />
-        <link type="text/css" rel="stylesheet" href="css/renater.css" />
-        <link type="text/css" rel="stylesheet" href="css/renater-header.css" />
-        <link type="text/css" rel="stylesheet" href="css/renater-footer.css" />
-        <link type="text/css" rel="stylesheet" href="css/renater-fonts.css" />
+        <link type="text/css" rel="stylesheet" href="/font-awesome/css/font-awesome.min.css" />
+        <link type="text/css" rel="stylesheet" href="/foundation/css/foundation.min.css">
+        <link type="text/css" rel="stylesheet" href="/jquery-ui-1.12.1/jquery-ui.min.css" />
+        <link type="text/css" rel="stylesheet" href="/css/style.css" />
+        <link type="text/css" rel="stylesheet" href="/css/renater.css" />
+        <link type="text/css" rel="stylesheet" href="/css/renater-header.css" />
+        <link type="text/css" rel="stylesheet" href="/css/renater-footer.css" />
+        <link type="text/css" rel="stylesheet" href="/css/renater-fonts.css" />
 
-        <script src="jquery-3.3.1.min.js"></script>
-        <script src="jquery-ui-1.12.1/jquery-ui.min.js"></script>
-        <script src="jquery-validation-1.17.0.min.js"></script>
-        <script src="foundation/js/vendor/what-input.js"></script>
-        <script src="foundation/js/vendor/foundation.min.js"></script>
-        <script src="js/startup.js"></script>
+        <script src="/jquery-3.3.1.min.js"></script>
+        <script src="/jquery-ui-1.12.1/jquery-ui.min.js"></script>
+        <script src="/jquery-validation-1.17.0.min.js"></script>
+        <script src="/foundation/js/vendor/what-input.js"></script>
+        <script src="/foundation/js/vendor/foundation.min.js"></script>
+        <script src="/js/startup.js"></script>
 
         <title>[% app.name %]</title>
     </head>
@@ -32,7 +32,7 @@
                 <div class="title-bar-title top-bar-right"></div>
                 <div class="top-bar-left">
                     <a href="[% c.url_for('home') %]" title="Accueil">
-                        <img src="images/logo-federation.svg" alt="Logo Fédération" data-options="disable_for_touch:true">
+                        <img src="/images/logo-federation.svg" alt="Logo Fédération" data-options="disable_for_touch:true">
                     </a>
                 </div>
             </div>
@@ -41,7 +41,7 @@
                     <ul class="menu" data-dropdown-menu>
                         <li class="menu-text hide-for-small-only">
                             <a href="[% c.url_for('home') %]" title="Accueil">
-                                <img src="images/logo-federation.svg" alt="Logo Fédération" data-options="disable_for_touch:true">
+                                <img src="/images/logo-federation.svg" alt="Logo Fédération" data-options="disable_for_touch:true">
                             </a>
                         </li>
                     </ul>
@@ -50,26 +50,26 @@
                     <ul class="menu icon-top" data-back-button="<li class='js-drilldown-back'><a tabindex='0'>Back</a></li>" data-responsive-menu="drilldown medium-dropdown">
                         <li>
                             <a href="[% c.url_for('home') %]" title="Accueil" data-tooltip class="left">
-                                <img class="hide-for-small-only home_img" src="images/home.svg" alt="Accueil" data-options="disable_for_touch:true"/>
+                                <img class="hide-for-small-only home_img" src="/images/home.svg" alt="Accueil" data-options="disable_for_touch:true"/>
                                 <span class="show-for-small-only">Accueil</span>
                             </a>
                         </li>
                         <li class="has-submenu" data-action="select_language">
                             <a href="#" title="[% c.loc("Language") %]">
-                                <img class="lang_img" src="images/lang.svg" alt="[% c.loc("Language") %]" data-options="disable_for_touch:true"/>
+                                <img class="lang_img" src="/images/lang.svg" alt="[% c.loc("Language") %]" data-options="disable_for_touch:true"/>
                                 <span class="show-for-small-only">[% c.loc("Language") %]</span>
                             </a>
                             <ul class="submenu vertical" data-submenu>
                                 <li>
                                     <a [% IF l10n.language_tag() == "en" %]class="nocursor"[% ELSE %]href="[% c.url_with().query(lang => 'en') | html %]"[% END %] data-lang="en" title="English">
-                                        <img src="images/en.png" />
+                                        <img src="/images/en.png" />
                                         <span>English</span>
                                         [% IF l10n.language_tag() == "en" %]<span class="fa fa-check"></span>[% END %]
                                     </a>
                                 </li>
                                 <li>
                                     <a [% IF l10n.language_tag() == "fr" %]class="nocursor"[% ELSE %]href="[% c.url_with().query(lang => 'fr') | html %]"[% END %] data-lang="fr" title="Français">
-                                        <img src="images/fr.png" />
+                                        <img src="/images/fr.png" />
                                         <span>Français</span>
                                         [% IF l10n.language_tag() == "fr" %]<span class="fa fa-check"></span>[% END %]
                                     </a>
@@ -96,14 +96,14 @@
         <footer>
             <article class="hide-for-small-only">
                 <p class="row">
-                    <span class="small-1 columns  text-left"><img src="images/logo_renater_blanc.png"/></span>
+                    <span class="small-1 columns  text-left"><img src="/images/logo_renater_blanc.png"/></span>
                     <span class="small-5 columns text-left">Réseau National de télécommunications <br/>pour la Technologie l’Enseignement et la Recherche.</span>
                     <span class="small-5 columns text-right">
                         <a href="https://www.facebook.com/gip.renater" target="_blank">
-                            <img src="images/facebook.svg" alt="Facebook" data-options="disable_for_touch:true"/>
+                            <img src="/images/facebook.svg" alt="Facebook" data-options="disable_for_touch:true"/>
                         </a>
                         <a href="https://twitter.com/RENATERnews" target="_blank">
-                            <img src="images/twitter.svg" alt="Twitter" data-options="disable_for_touch:true"/>
+                            <img src="/images/twitter.svg" alt="Twitter" data-options="disable_for_touch:true"/>
                         </a>
                     </span>
                 </p>