diff --git a/application/modules/admin/controllers/ModulesController.php b/application/modules/admin/controllers/ModulesController.php
index 9d48c274efc5737b890f5fb992b18bcc1665cfce..b86bc9f4495c1cb8a09f6ac5d78824d6ef8612f6 100644
--- a/application/modules/admin/controllers/ModulesController.php
+++ b/application/modules/admin/controllers/ModulesController.php
@@ -541,12 +541,10 @@ class Admin_ModulesController extends ZendAfi_Controller_Action {
 
 
   public function applyToAction() {
-    $module = new Class_Profil_ModuleDefinition($this->_getParam('type_module'),
-                                                $this->_getParam('action1'),
-                                                $this->_getParam('action2'));
+    $module = $this->_getProfileModuleDefinition();
 
     $this->view->titre = $this->_('Étendre le paramétrage');
-    $this->view->form = $form = $module->getApplyToForm($this->view->url);
+    $this->view->form = $form = $module->getApplyToForm($this->view->url());
 
     if ($this->_request->isPost()
         && $form->isValid($this->_request->getPost())) {
@@ -556,4 +554,17 @@ class Admin_ModulesController extends ZendAfi_Controller_Action {
       $this->render->renderScript('modules/_retour.phtml');
     }
   }
+
+
+  protected function _getProfileModuleDefinition() {
+    if (!$id = $this->_getParam('id'))
+      return new Class_Profil_ModuleDefinition($this->_getParam('type_module'),
+                                        $this->_getParam('action1'),
+                                        $this->_getParam('action2'));
+
+    $id = explode('_', $id);
+    return new Class_Profil_ModuleDefinition((isset($id[0]) ? $id[0] : ''),
+                                             (isset($id[1]) ? $id[1] : ''),
+                                             (isset($id[2]) ? $id[2] : ''));
+  }
 }
\ No newline at end of file
diff --git a/library/Class/Calendar.php b/library/Class/Calendar.php
index cc66a1a5a4be1998fe1172b453be65d0016c6751..37e460e15fcc8003e26af24b453b873c43b16a86 100644
--- a/library/Class/Calendar.php
+++ b/library/Class/Calendar.php
@@ -243,6 +243,12 @@ class Class_Calendar {
   }
 
 
+  public function setSize($size) {
+    $this->preferences['size'] = $size;
+    return $this;
+  }
+
+
   public function getAdminSelectedCategories() {
     if (isset($this->admin_selected_categories))
       return $this->admin_selected_categories;
diff --git a/library/Class/Systeme/ModulesAccueil/Action/AdvancedSearch.php b/library/Class/Systeme/ModulesAccueil/Action/AdvancedSearch.php
new file mode 100644
index 0000000000000000000000000000000000000000..6dceaeb75d761a1383245c0ec8c02baa407dd872
--- /dev/null
+++ b/library/Class/Systeme/ModulesAccueil/Action/AdvancedSearch.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright (c) 2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class Class_Systeme_ModulesAccueil_Action_AdvancedSearch extends Class_Systeme_ModulesAccueil_Action {
+
+  public function __construct() {
+    parent::__construct();
+    $this->_form = 'ZendAfi_Form_Configuration_Widget_Action_AdvancedSearch';
+  }
+}
\ No newline at end of file
diff --git a/library/Class/Systeme/Widget/Action/AdvancedSearch.php b/library/Class/Systeme/Widget/Action/AdvancedSearch.php
new file mode 100644
index 0000000000000000000000000000000000000000..44849c29afd3eed4cf95cce5f904c97968e3a248
--- /dev/null
+++ b/library/Class/Systeme/Widget/Action/AdvancedSearch.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Class_Systeme_Widget_Action_AdvancedSearch extends Class_Systeme_Widget_Action {
+  public function getResourcesDefinition() {
+    return new Class_Systeme_ModulesAccueil_Action_AdvancedSearch;
+  }
+
+
+  public function _getTitle() {
+    return $this->_('Configuration de la page de recherche avancée');
+  }
+}
\ No newline at end of file
diff --git a/library/Class/Systeme/Widget/ActionLoader.php b/library/Class/Systeme/Widget/ActionLoader.php
index 608d47f04d60cb2e356cdb7a12d6cf72c3a859f9..016fc2ffdb87d95df53c9e61fbab8495999c0d86 100644
--- a/library/Class/Systeme/Widget/ActionLoader.php
+++ b/library/Class/Systeme/Widget/ActionLoader.php
@@ -23,6 +23,7 @@
 class Class_Systeme_Widget_ActionLoader {
   public function find($id) {
     $actions = $this->_getActions();
+
     if (!isset($actions[$id]))
       return (new Class_Systeme_Widget_Action)->setId($id);
 
@@ -36,6 +37,7 @@ class Class_Systeme_Widget_ActionLoader {
 
     $actions = ['recherche_resultat_simple' => 'Class_Systeme_Widget_Action_SearchResult',
                 'recherche_viewnotice' => 'Class_Systeme_Widget_Action_Record',
+                'recherche_avancee' => 'Class_Systeme_Widget_Action_AdvancedSearch',
                 'abonne_fiche' => 'Class_Systeme_Widget_Action_User',
                 'author_view' => 'Class_Systeme_Widget_Action_Author',
                 'bib_en-lire-plus' => 'Class_Systeme_Widget_Action_Library'];
diff --git a/library/Class/Template/Loader.php b/library/Class/Template/Loader.php
index 2f98ef23d2f05f2d68dcf66bc7160005bf86de7c..2dc58834205b74203143429d5782c93ecac41dc9 100644
--- a/library/Class/Template/Loader.php
+++ b/library/Class/Template/Loader.php
@@ -27,9 +27,10 @@ class Class_Template_Loader {
   public function getTemplates() {
     return [new Historic_Template,
             new Intonation_Template,
+            new Muscle_Template,
             new MyBibApp_Template,
+            new Polygone_Template,
             new TerreDuMilieu_Template,
-            new Muscle_Template
     ];
   }
 
diff --git a/library/ZendAfi/Controller/Plugin/DefineURLs.php b/library/ZendAfi/Controller/Plugin/DefineURLs.php
index 812b5ea6fd42a1d030e2b40e7d50bdcfe1f01049..f6534b2fc786e2971758c37cfa307189309e1171 100644
--- a/library/ZendAfi/Controller/Plugin/DefineURLs.php
+++ b/library/ZendAfi/Controller/Plugin/DefineURLs.php
@@ -66,8 +66,7 @@ class ZendAfi_Controller_Plugin_DefineURLs extends Zend_Controller_Plugin_Abstra
     }
 
     $detector = new ZendAfi_Controller_Plugin_DefineURLs_ProfileDetector();
-    Class_Profil::setCurrentProfil($detector->detectFrom($request));
-    $profil = Class_Profil::getCurrentProfil();
+    $profil = Class_Profil::setCurrentProfil($detector->detectFrom($request));
 
     Class_Template::setCurrentFrom($request->getParam('id_profil', $request->getParam('profile_id', $profil->getId())));
 
@@ -241,7 +240,7 @@ class ZendAfi_Controller_Plugin_DefineURLs_ProfileDetector {
     }
 
     if ($request->getModuleName() !== ZendAfi_Controller_Plugin_DefineURLs::PHONE
-        && ($profil = Class_Profil::find((int)$session->id_profil)))
+        && ($profil = Class_Profil::find((int) $session->id_profil)))
       return $profil;
 
     if ($this->shouldSelectTelephone($request)
diff --git a/library/ZendAfi/Form/Configuration/Widget/Action/AdvancedSearch.php b/library/ZendAfi/Form/Configuration/Widget/Action/AdvancedSearch.php
new file mode 100644
index 0000000000000000000000000000000000000000..58986c799fa1339e38098de59f3874814ea2e0a8
--- /dev/null
+++ b/library/ZendAfi/Form/Configuration/Widget/Action/AdvancedSearch.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class ZendAfi_Form_Configuration_Widget_Action_AdvancedSearch extends ZendAfi_Form_Configuration_Widget_Action {
+  public function init() {
+    parent::init();
+    if (Class_AdminVar::isCustomSearchFormEnabled())
+      $this->addElement('sortableConnectLists',
+                        'forms',
+                        ['label' => $this->_('Formulaires à afficher'),
+                         'displayInline' => true,
+                         'selectedLabel' => $this->_('Affichés'),
+                         'availableLabel' => $this->_('Disponibles'),
+                         'multiOptions' => Class_SearchForm::getMultiOptions()]);
+    }
+
+
+  public function initDisplayGroups() {
+    $this->addDisplayGroup(['forms'],
+                           'custom_forms',
+                           ['Legend' => $this->_('Formulaires personnalisés')]);
+    parent::initDisplayGroups();
+  }
+}
\ No newline at end of file
diff --git a/library/ZendAfi/Form/Configuration/Widget/Action/Record.php b/library/ZendAfi/Form/Configuration/Widget/Action/Record.php
index 2d2182fc17c397f99183267db5dd1610784e32b1..2e8678ce1dec654e8925551036972c357d3a68f8 100644
--- a/library/ZendAfi/Form/Configuration/Widget/Action/Record.php
+++ b/library/ZendAfi/Form/Configuration/Widget/Action/Record.php
@@ -21,6 +21,25 @@
 
 
 class ZendAfi_Form_Configuration_Widget_Action_Record extends ZendAfi_Form_Configuration_Widget_Action_Tabs {
+
+
+  public function init() {
+    parent::init();
+    $this
+      ->addElement('userfile',
+                   Class_Notice_Xsl::KEY,
+                   ['label' => $this->_('Fichier XSL'),
+                    'allowEmpty' => true,
+                    'validators' => [(new Zend_Validate_Regex('/^.*\.xsl$/i'))
+                                     ->setMessage($this->_('Le fichier doit être de type "xsl"'))]]);
+  }
+
+
+  public function initDisplayGroups() {
+    $this->addToDisplaySettingsGroup([Class_Notice_Xsl::KEY]);
+    parent::initDisplayGroups();
+  }
+
   protected function _getRichContentInstance() {
     return (new Intonation_Library_View_Wrapper_Record_RichContent)
       ->setView(new Class_Entity)
diff --git a/library/ZendAfi/Form/Configuration/Widget/Action/SearchResult.php b/library/ZendAfi/Form/Configuration/Widget/Action/SearchResult.php
index c7b87d34cd629946ec021fd6be70619e06e003e1..19b47f427aac2f9eddfd17b82326d35cb7dc474a 100644
--- a/library/ZendAfi/Form/Configuration/Widget/Action/SearchResult.php
+++ b/library/ZendAfi/Form/Configuration/Widget/Action/SearchResult.php
@@ -41,7 +41,14 @@ class ZendAfi_Form_Configuration_Widget_Action_SearchResult extends ZendAfi_Form
       ->addElement('codeList',
                    'facettes_codes',
                    ['label' => $this->_('Facettes à afficher'),
-                    'field' => 'facettes']);
+                    'field' => 'facettes'])
+
+      ->addElement('userfile',
+                   Class_Notice_Xsl::KEY,
+                   ['label' => $this->_('Fichier XSL'),
+                    'allowEmpty' => true,
+                    'validators' => [(new Zend_Validate_Regex('/^.*\.xsl$/i'))
+                                     ->setMessage($this->_('Le fichier doit être de type "xsl"'))]]);
   }
 
 
@@ -51,7 +58,9 @@ class ZendAfi_Form_Configuration_Widget_Action_SearchResult extends ZendAfi_Form
                          'facettes_nombre',
                          'facettes_codes'],
                         'facettes',
-                        ['legend' => $this->_('Facettes')]);
+                        ['legend' => $this->_('Facettes')])
+
+      ->addToDisplaySettingsGroup([Class_Notice_Xsl::KEY]);
 
     parent::initDisplayGroups();
     Class_Template::current()->customActionForm($this);
diff --git a/library/templates/Intonation/Assets/css/intonation.css b/library/templates/Intonation/Assets/css/intonation.css
index 1a50278ca453d45cea942ae023c4d0898379cd0b..d5aaf6fb5198e3784476a462a6c51a01735b1353 100644
--- a/library/templates/Intonation/Assets/css/intonation.css
+++ b/library/templates/Intonation/Assets/css/intonation.css
@@ -417,6 +417,11 @@ label[data-name=note] ~ div label.multi-element-label + br {
     font-size: 1.5em;
 }
 
+.jumbotron .nav-link div {
+    font-size: 11px;
+    max-width: 100px;
+}
+
 .modal_image {
     position: fixed;
     width: 100%;
@@ -544,6 +549,11 @@ dl.row {
     display: none !important;
 }
 
+.card-footer > a.card-link:first-child:last-child .button_text,
+.card_action:first-child:last-child .button_text {
+    display: inline !important;
+}
+
 .dropdown-menu .button_text {
     display: inline-block !important;
 }
@@ -669,11 +679,6 @@ dl.row {
     color: var(--front-text);
 }
 
-.card-footer > a.card-link:first-child:last-child .button_text,
-.card_action:first-child:last-child .button_text {
-    display: inline-block !important;
-}
-
 @media (min-width: 576px) {
     .auto_col .card-columns {
 	-webkit-column-count: 2;
@@ -729,4 +734,8 @@ dl.row {
 
 .card-img-overlay .text-left {
     text-align: center !important;
+}
+
+.menu_admin_front a[class*="deactivate"][style*="inline"] {
+    display: block !important;
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Assets/js/masonry.js b/library/templates/Intonation/Assets/js/masonry.js
index bdca467ceec7aa672e6f103ce56f9b40f6bd5faf..81884b49c33f5425eaebe1288c59e52a3a1a383f 100644
--- a/library/templates/Intonation/Assets/js/masonry.js
+++ b/library/templates/Intonation/Assets/js/masonry.js
@@ -1,37 +1,43 @@
 (function ( $ ) {
   $.fn.masonry = function () {
     var html = $(this);
+    var all_items = initAllItems();
 
-    var allItems = $(html).find('.masonry-brick');
-      for(var i=0; i < allItems.length; i++) {
-	imagesLoaded( allItems[i], function(instance) {
-	  var item = instance.elements[0];
-	  resizeMasonryItem(item);
-	} );
-      }
-
-    var masonryEvents = ['load', 'resize'];
-    masonryEvents.forEach( function(event) {
+    var masonry_events = ['load', 'resize'];
+    masonry_events.forEach( function(event) {
       window.addEventListener(event, resizeAllMasonryItems);
-    } );
-
+    });
 
-    function resizeMasonryItem(item){
-      var grid = html.get(0),
-	  rowGap = parseInt(window.getComputedStyle(grid).getPropertyValue('grid-row-gap')),
+    var resizeMasonryItem = function(item) {
+      var grid = html.find('.masonry')[0];
+      
+      var rowGap = parseInt(window.getComputedStyle(grid).getPropertyValue('grid-row-gap')),
 	  rowHeight = parseInt(window.getComputedStyle(grid).getPropertyValue('grid-auto-rows'));
 
-      var rowSpan = Math.ceil((item.querySelector('.masonry-content').getBoundingClientRect().height+rowGap)/(rowHeight+rowGap));
+      var rowSpan = Math.ceil((item.querySelector('.masonry-content').getBoundingClientRect().height + rowGap)/(rowHeight + rowGap));
 
-      item.style.gridRowEnd = 'span '+rowSpan;
+      item.style.gridRowEnd = 'span ' + rowSpan;
       item.style.visibility = 'visible';
     }
 
 
-    function resizeAllMasonryItems(){
-      for(var i=0;i>allItems.length;i++){
+    var resizeAllMasonryItems = function() {
+      if ( ! allItems.length)
+	allItems = initAllItems();
+      
+      for(var i=0; i > allItems.length; i++){
 	resizeMasonryItem(allItems[i]);
       }
     }
+
+
+    function initAllItems() {
+      var items = $(html).find('.masonry-brick').each(function() {
+	imagesLoaded( $(this), function(instance) {
+	  var item = instance.elements[0];
+	  resizeMasonryItem(item);
+	} );
+      });
+    }
   };
 } (jQuery));
diff --git a/library/templates/Intonation/Library/Settings.php b/library/templates/Intonation/Library/Settings.php
index e227002fdb812968da0007ea8777a919f2eecfb9..7a7d69b9177f286375a3ce36f2ed507af8b366a2 100644
--- a/library/templates/Intonation/Library/Settings.php
+++ b/library/templates/Intonation/Library/Settings.php
@@ -104,7 +104,7 @@ class Intonation_Library_Settings extends Intonation_System_Abstract {
                                                   'img class img-thumbnail' => '',
                                                   'dl' => 'row',
                                                   'dt' => 'col-12 col-sm-3',
-                                                  'dd' => 'col-12 col-sm-9',
+                                                  'dd' => 'col-12 col-sm-9 d-flex flex-wrap align-content-start',
                                                   'dt class user_info' => 'col-12 col-sm-6',
                                                   'dd class user_info' => 'col-12 col-sm-6',
                                                   'a' => 'text-secondary',
diff --git a/library/templates/Intonation/Library/View/Wrapper/Hold.php b/library/templates/Intonation/Library/View/Wrapper/Hold.php
index 10ef4685fedca087a0f4e4d83823f23d480c0d47..05a0e4301f5ff02c6ef4f5b90b16ba5c63df2276 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Hold.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Hold.php
@@ -170,11 +170,22 @@ class Intonation_Library_View_Wrapper_Hold extends Intonation_Library_View_Wrapp
     if (!$this->_model->getNoticeOPAC())
       return null;
 
+    $badges = [
+               ((new Intonation_Library_Badge)
+                ->setTag('span')
+                ->setClass('secondary')
+                ->setImage(Class_Template::current()->getIco($this->_view,
+                                                             'library',
+                                                             'library'))
+                ->setText($this->_model->getBibliotheque())
+                ->setTitle($this->_('Bibliothèque de l\'emprunt: %s', $this->_model->getBibliotheque())))
+    ];
+
     $wrapper = (new Intonation_Library_View_Wrapper_Record)
       ->setView($this->_view)
       ->setModel($this->_model->getNoticeOPAC());
 
-    return $wrapper->getBadges();
+    return $this->_view->renderBadges($badges) . $wrapper->getBadges();
   }
 
 
diff --git a/library/templates/Intonation/Library/View/Wrapper/Item.php b/library/templates/Intonation/Library/View/Wrapper/Item.php
index 4696146ebaf5b8312f507060b68da181ba50e7c2..5f6cd047fe6330b3a0fa447291be4287d0205101 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Item.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Item.php
@@ -80,9 +80,13 @@ class Intonation_Library_View_Wrapper_Item extends Intonation_Library_View_Wrapp
       ? $this->_('Réserver un exemplaire du document: %s', $this->_model->getTitrePrincipal())
       : $this->_('Réservation non disponible, l\'exemplaire est %s.', strtolower(strip_tags($secondary_title)));
 
+    $text = $hold_link
+      ? $this->_('Réserver')
+      : $this->_('Non réservable');
+
     return new Intonation_Library_Link(['Url' => $hold_link,
                                         'Class' => $hold_link ? '' : 'text-black-50',
-                                        'Text' => $secondary_title,
+                                        'Text' => $text,
                                         'Title' => $title,
                                         'Popup' => true]);
   }
diff --git a/library/templates/Intonation/Library/View/Wrapper/Loan.php b/library/templates/Intonation/Library/View/Wrapper/Loan.php
index 29285f18b861648ebde50c9fcad9b7c89c31308c..613240c5af774e5d7f4d0579f023c37c02efcf33 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Loan.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Loan.php
@@ -134,6 +134,15 @@ class Intonation_Library_View_Wrapper_Loan extends Intonation_Library_View_Wrapp
                 ->setText($return_date)
                 ->setTitle($this->_('Date de retour : %s', $return_date))),
 
+               ((new Intonation_Library_Badge)
+                ->setTag('span')
+                ->setClass('secondary')
+                ->setImage(Class_Template::current()->getIco($this->_view,
+                                                             'library',
+                                                             'library'))
+                ->setText($this->_model->getBibliotheque())
+                ->setTitle($this->_('Bibliothèque de l\'emprunt: %s', $this->_model->getBibliotheque()))),
+
                ((new Intonation_Library_Badge)
                 ->setTag('span')
                 ->setClass('info')
diff --git a/library/templates/Intonation/Library/View/Wrapper/Record.php b/library/templates/Intonation/Library/View/Wrapper/Record.php
index 64687285ad1d8db523708a1f21835ecd70501fd4..ca2be7e213ff112b317c38c724e19ea182a43352 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Record.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Record.php
@@ -78,8 +78,13 @@ class Intonation_Library_View_Wrapper_Record extends Intonation_Library_View_Wra
 
 
   public function getDescription() {
-    return $this->getBadges()
-      . $this->_view->truncate($this->_model->getResume());
+    $xsl = (new Class_Notice_Xsl($this->_model, Class_Profil::getCurrentProfil()))
+      ->beSearchResult();
+
+    return $xsl->isEnabled()
+      ? $this->_view->Notice_Xsl($xsl)
+      : ($this->getBadges()
+         . $this->_view->truncate($this->_model->getResume()));
   }
 
 
@@ -199,6 +204,19 @@ class Intonation_Library_View_Wrapper_Record extends Intonation_Library_View_Wra
                     ->setTitle($facet->getTitle())
                     ->setUrl($facet->getUrlForLink()));
 
+    if ( $this->_model->hasTome()) {
+      $serie = $this->_model->getClefChapeau() . '-' . $this->_model->getTypeDoc();
+
+      $label = Class_Codification::getLibelleForSerie($this->_model);
+      $badges [] = (new Intonation_Library_Badge)
+        ->setTag('a')
+        ->setUrl($this->_view->url((new Class_CriteresRecherche)->getNewUrlCriteresSerie($serie), null, true))
+        ->setClass('white')
+        ->setText($label)
+        ->setTitle($this->_view->_('Lancer une recherche pour %s', lcfirst($label)));
+    }
+
+
     return $this->_view->renderBadges($badges);
   }
 
@@ -241,10 +259,18 @@ class Intonation_Library_View_Wrapper_Record extends Intonation_Library_View_Wra
     if (!$matches = array_filter($matches))
       return $badges;
 
+    $labels = [];
     foreach ($matches as $match) {
       if (!$match)
         continue;
 
+      $label = $match->getLibrary()->getLabel();
+
+      if (in_array($label, $labels))
+        continue;
+
+      $labels [] = $label;
+
       $badges [] = ((new Intonation_Library_Badge)
                     ->setTag('a')
                     ->setUrl($this->_view->url(['controller' => 'recherche',
@@ -255,8 +281,8 @@ class Intonation_Library_View_Wrapper_Record extends Intonation_Library_View_Wra
                     ->setImage(Class_Template::current()->getIco($this->_view,
                                                                  'library',
                                                                  'library'))
-                    ->setText($match->getLibrary()->getLabel())
-                    ->setTitle($this->_('Affiner le résultat avec le site %s', $match->getLibrary()->getLabel())));
+                    ->setText($label)
+                    ->setTitle($this->_('Affiner le résultat avec le site %s', $label)));
     }
 
     return $badges;
diff --git a/library/templates/Intonation/Library/View/Wrapper/Record/RichContent/Details.php b/library/templates/Intonation/Library/View/Wrapper/Record/RichContent/Details.php
index 4ba6a60caffebff36bf8fb3e40ec895e94ac2470..863ccd56db0a0d2079b3696a0ee770934bdc707a 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Record/RichContent/Details.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Record/RichContent/Details.php
@@ -31,6 +31,10 @@ class Intonation_Library_View_Wrapper_Record_RichContent_Details extends Intonat
     if ($this->_content)
       return $this->_content;
 
+    $xsl = (new Class_Notice_Xsl($this->_model, Class_Profil::getCurrentProfil()));
+    if ($xsl->isEnabled())
+      return $this->_content = $this->_view->Notice_Xsl($xsl);
+
     return $this->_content = $this->_model->isPeriodique()
       ? $this->_view->Notice_Articles($this->_model)
       : $this->_view->Notice_Entete($this->_model, ['entete' => Class_Codification::CHAMPS]);
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Agenda/View.php b/library/templates/Intonation/Library/Widget/Carousel/Agenda/View.php
index 5cf50c5be06c5b9ce8c75d5c3fde227c849162e2..679abd71f77d1b12bc26de0189ed7e26e175e1a1 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Agenda/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Agenda/View.php
@@ -49,11 +49,6 @@ class Intonation_Library_Widget_Carousel_Agenda_View extends Intonation_Library_
   }
 
 
-  protected function _getLinkToAllParams() {
-    return [];
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir tous les événements de la boite %s dans une liste', $this->titre);
   }
@@ -86,8 +81,8 @@ class Intonation_Library_Widget_Carousel_Agenda_View extends Intonation_Library_
 
   public function getLinkToAllContent() {
     $this->view->titre = $this->_settings->getTitre();
-
     $this->_initCalendar();
+    $this->_calendar->setSize(100);
     return $this->view->calendarLinkToAll($this->_calendar, $this->_settings);
   }
 
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Article/View.php b/library/templates/Intonation/Library/Widget/Carousel/Article/View.php
index e25104e4a840af2f722af88c8f85cdfbb84fa771..1937379e3857ef075e08e2515f159ffb0eb156a5 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Article/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Article/View.php
@@ -22,13 +22,10 @@
 
 class Intonation_Library_Widget_Carousel_Article_View extends Intonation_Library_Widget_Carousel_View {
 
-  protected $_all_articles = [];
-
-
   protected function _findElements() {
     $loader = Class_Article::getLoader();
+    $this->preferences['size'] = 100;
     $articles_to_show = $loader->getArticlesByPreferences($this->preferences);
-    $this->_all_articles = $loader->getAllArticles();
     return $articles_to_show;
   }
 
@@ -38,21 +35,6 @@ class Intonation_Library_Widget_Carousel_Article_View extends Intonation_Library
   }
 
 
-  protected function _getLinkToAllParams() {
-    $articles_ids = implode('-',
-                            array_map(function($article)
-                                      {
-                                        return $article->getId();
-                                      }, $this->_all_articles));
-
-    return ['module' => 'opac',
-            'controller' => 'cms',
-            'action' => 'list',
-            'title' => $this->view->escape($this->titre),
-            'articles' => $articles_ids];
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir tous les articles de la boite "%s" dans une liste', $this->titre);
   }
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Author/View.php b/library/templates/Intonation/Library/Widget/Carousel/Author/View.php
index 13c17fa955c648286bfaaba9465eb824568e213b..06a09e6d3ba3f3385b9336b4996aa0d3738e0446 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Author/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Author/View.php
@@ -33,11 +33,6 @@ class Intonation_Library_Widget_Carousel_Author_View extends Intonation_Library_
   }
 
 
-  protected function _getLinkToAllParams() {
-    return '';
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir tous les auteurs de la boite %s dans une liste', $this->titre);
   }
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Domain/View.php b/library/templates/Intonation/Library/Widget/Carousel/Domain/View.php
index ef9f3b658a8a0242b2a5b3dbe031ce5d2a3b0b2b..ee13e79744f591ad05dfd61ebe674133c7e1d787 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Domain/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Domain/View.php
@@ -40,11 +40,6 @@ class Intonation_Library_Widget_Carousel_Domain_View extends Intonation_Library_
   }
 
 
-  protected function _getLinkToAllParams() {
-    return [];
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir tous les domaines de la boite %s dans une liste', $this->titre);
   }
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Library/View.php b/library/templates/Intonation/Library/Widget/Carousel/Library/View.php
index f753cdf686e0021676aeabc7f9789fb256ee8912..d9452cd26024fe710dfc674214e34c7c435d0db3 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Library/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Library/View.php
@@ -46,11 +46,6 @@ class Intonation_Library_Widget_Carousel_Library_View extends Intonation_Library
   }
 
 
-  protected function _getLinkToAllParams() {
-    return '';
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir toutes les bibliothèques de la boite %s dans une liste', $this->titre);
   }
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Newsletter/View.php b/library/templates/Intonation/Library/Widget/Carousel/Newsletter/View.php
index 3edfd97f1f7b81345a0c17c16ff89770035715ff..4b5b2b065fac9640f2ab13aec83778e995efba08 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Newsletter/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Newsletter/View.php
@@ -34,11 +34,6 @@ class Intonation_Library_Widget_Carousel_Newsletter_View extends Intonation_Libr
   }
 
 
-  protected function _getLinkToAllParams() {
-    return '';
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir toutes les lettres d\'informations de la boite %s dans une liste', $this->titre);
   }
diff --git a/library/templates/Intonation/Library/Widget/Carousel/ReviewsByRecord/View.php b/library/templates/Intonation/Library/Widget/Carousel/ReviewsByRecord/View.php
index 066d08b5a444a6b3747b0b8f6dda2597b4c1e35a..6ac258e1afd981ace243f181c9f2aecf75ed670f 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/ReviewsByRecord/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/ReviewsByRecord/View.php
@@ -41,23 +41,6 @@ class Intonation_Library_Widget_Carousel_ReviewsByRecord_View extends Intonation
   }
 
 
-  protected function _getLinkToAllParams() {
-    $reviews_ids = [];
-
-    foreach ($this->_all_reviews as $review)
-      $reviews_ids [] = $review->getId();
-
-    $reviews_ids = implode('-', $reviews_ids);
-
-    return ['module' => 'opac',
-            'controller' => 'blog',
-            'action' => 'list',
-            'title' => $this->view->escape($this->titre),
-            'records_reviews_ids' => $reviews_ids,
-            'order' => $this->_settings->getOrder()];
-  }
-
-
   protected function _getLinkToAllTitle() {
     return $this->_('Voir tous les avis de la boite "%s" dans une liste', $this->titre);
   }
diff --git a/library/templates/Intonation/Library/Widget/Carousel/View.php b/library/templates/Intonation/Library/Widget/Carousel/View.php
index 106ded36de674f0d0b27472d7b215d35f62955c7..d91928692792f9fa9d919b4fc071db6c6d49d2e8 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/View.php
@@ -22,6 +22,9 @@
 
 abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Helper_Accueil_Base {
 
+  protected $_register_for_head_scripts = [];
+
+
   public function getHtml() {
     $this->titre = $this->_settings->getTitre();
     $this->contenu = $this->_getHTML();
@@ -30,6 +33,14 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
   }
 
 
+  protected function _renderHeadScriptsOn($script_loader) {
+    foreach($this->_register_for_head_scripts as $registered)
+      $registered->renderHeadScriptsOn($script_loader);
+
+    return parent::_renderHeadScriptsOn($script_loader);
+  }
+
+
   public function getFooter() {
     $rss = $this->_settings->getRss()
       ? $this->_getTagRss()
@@ -138,8 +149,11 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
   protected function _renderLayout($layout, $elements, $content_callback) {
     $elements = new Storm_Collection($elements);
 
-    if (Intonation_Library_Widget_Carousel_Definition::WALL == $layout)
-      return $this->view->renderWall($elements, $content_callback);
+    if (Intonation_Library_Widget_Carousel_Definition::WALL == $layout) {
+      $renderer = (new Intonation_View_RenderWall)->setView($this->view);
+      $this->_register_for_head_scripts [] = $renderer;
+      return $renderer->renderWall($elements, $content_callback);
+    }
 
     if (Intonation_Library_Widget_Carousel_Definition::CAROUSEL == $layout)
       return $this->view->renderCarousel($elements, $content_callback);
diff --git a/library/templates/Intonation/Library/Widget/Nav/View.php b/library/templates/Intonation/Library/Widget/Nav/View.php
index b67805e4e21df020866fb0491a2823aaf6c3664f..826b96c28514287a0941e3ebba5053994fe8817a 100644
--- a/library/templates/Intonation/Library/Widget/Nav/View.php
+++ b/library/templates/Intonation/Library/Widget/Nav/View.php
@@ -97,8 +97,8 @@ class Intonation_Library_Widget_Nav_View extends Zendafi_View_Helper_Accueil_Bas
 
 
   protected function _renderLogo($params) {
-    $thumb = ($src = $params['picto'])
-      ? $this->view->tagImg($src)
+    $thumb = (isset($params['picto']) && $params['picto'])
+      ? $this->_renderPicto($params)
       : $this->_tag('span', '', ['class' => 'glyphicon glyphicon-globe']);
 
     return $this->_tag('span',
diff --git a/library/templates/Intonation/Library/Widget/Search/View.php b/library/templates/Intonation/Library/Widget/Search/View.php
index 41cee016c8a7b2a745e4d8f02dc09e2fb31820e0..e275ac2275eed6586e470cc53e3a61e2409cae2f 100644
--- a/library/templates/Intonation/Library/Widget/Search/View.php
+++ b/library/templates/Intonation/Library/Widget/Search/View.php
@@ -178,7 +178,7 @@ abstract class IntonationSearchRenderAbstract {
       ->addElement('button',
                    uniqid() . 'search_submit',
                    ['content' => $this->_renderPicto($this->_settings->getSearchButton()),
-                    'title' => $this>_('Rechercher'),
+                    'title' => $this->_('Rechercher'),
                     'type' => 'submit',
                     'escape' => false,
                     'onclick' => '$(this).parents(\'form\').submit()',
diff --git a/library/templates/Intonation/View/CardifyOnlyDescription.php b/library/templates/Intonation/View/CardifyOnlyDescription.php
index 46b6037f77c9e31f0617ec80f7438d1ac4357c02..f5eec79900d65a0961348aa1edd93e0ac71950a7 100644
--- a/library/templates/Intonation/View/CardifyOnlyDescription.php
+++ b/library/templates/Intonation/View/CardifyOnlyDescription.php
@@ -52,10 +52,14 @@ class Intonation_View_CardifyOnlyDescription extends Intonation_View_CardHelper
     foreach($element->getActions() as $action)
       $links [] = $this->view->tagAction($action);
 
+    $hide_text_button_class = ( 2 >= count($links))
+      ? ''
+      : 'button_text_d_none';
+
     if (!empty($links))
       $html [] = $this->_tag('div',
                              implode($links),
-                             ['class' => 'card-footer d-flex flex-row justify-content-between button_text_d_none']);
+                             ['class' => 'card-footer d-flex flex-row justify-content-between  ' . $hide_text_button_class]);
 
     return $this->_tag('div',
                        $img . implode($html),
diff --git a/library/templates/Intonation/View/Jumbotron.php b/library/templates/Intonation/View/Jumbotron.php
index 04108f036f80ce72a1b670dcad2cf02bc538615e..2c2a2e7e83faf2a66b3d232767b28e356f386d56 100644
--- a/library/templates/Intonation/View/Jumbotron.php
+++ b/library/templates/Intonation/View/Jumbotron.php
@@ -157,10 +157,10 @@ class Intonation_View_Jumbotron extends ZendAfi_View_Helper_BaseHelper {
       $this->_tag('li',
                   $this->view->tagAnchor(array_merge($item->getNavUrl(),
                                                      ['id' => $id]),
-                                         Class_Template::current()->getIco($this->view, $item->getDBNavIco()). $this->view->div(['class' => 'button_text d-none'], $item->getDBTitle()),
+                                         Class_Template::current()->getIco($this->view, $item->getDBNavIco()). $this->view->div(['class' => 'button_text d-none d-xl-block text-truncate'], $item->getDBTitle()),
                                          $params),
                   ['class' => 'nav-item']);
-      }
+  }
 
 
   protected function _renderContent() {
diff --git a/library/templates/Intonation/View/RenderRecord/RenderItems.php b/library/templates/Intonation/View/RenderRecord/RenderItems.php
index deaf3d8b45af4f071e495d3d7762ac1643d02a9d..6e283015d07cbb4388d729e6f4259c854d96a02d 100644
--- a/library/templates/Intonation/View/RenderRecord/RenderItems.php
+++ b/library/templates/Intonation/View/RenderRecord/RenderItems.php
@@ -37,14 +37,14 @@ class Intonation_View_RenderRecord_RenderItems extends ZendAfi_View_Helper_BaseH
 
     $html = [];
     if ($map = $this->view->osmMap($elements))
-      $html [] = $this->view->div(['class' => 'col-12 mb-3'],
+      $html [] = $this->view->div(['class' => 'col-12 mb-3 items_map'],
                                   $map);
 
-    $html [] = $this->view->div(['class' => 'col-12'],
+    $html [] = $this->view->div(['class' => 'col-12 items_wall'],
                                 $this->_getHtmlItems($items));
 
     if ($same_work) {
-      $html [] = $this->view->div(['class' => 'col-12'],
+      $html [] = $this->view->div(['class' => 'col-12 same_work_items'],
                                   $this->view->tag('h3', $this->_('Exemplaires de la même œuvre')));
       $html [] = $this->view->div(['class' => 'col-12'],
                                   $this->_getHtmlItems($same_work));
diff --git a/library/templates/Intonation/View/RenderWall.php b/library/templates/Intonation/View/RenderWall.php
index d5dcdfabfa8dd2731b8646bef0df118d7d96c2f4..bad8b1d23ee348177963b56758e4cac280285f64 100644
--- a/library/templates/Intonation/View/RenderWall.php
+++ b/library/templates/Intonation/View/RenderWall.php
@@ -21,13 +21,14 @@
 
 
 class Intonation_View_RenderWall extends ZendAfi_View_Helper_BaseHelper {
+
+  protected $_masonry_id;
+
+
   public function renderWall($collection, $callback) {
-    $id = uniqid();
+    $this->_masonry_id = uniqid();
 
-    Class_ScriptLoader::getInstance()
-      ->addScripts([Class_Url::absolute('/library/templates/Intonation/Assets/js/masonry.js')])
-      ->addScripts([Class_Url::absolute('/library/templates/Intonation/Assets/js/imagesloaded4.1.4.min.js')])
-      ->addJQueryReady(sprintf('$("#%s").masonry();', $id));
+    $this->renderHeadScriptsOn(Class_ScriptLoader::getInstance());
 
     $html = array_filter($collection
                          ->injectInto([], function($html, $element) use ($callback)
@@ -38,10 +39,19 @@ class Intonation_View_RenderWall extends ZendAfi_View_Helper_BaseHelper {
                                         return $html;
                                       }));
 
-
     return $this->_tag('div',
                        implode($html),
                        ['class' => 'masonry',
-                        'id' => $id]);
+                        'id' => $this->_masonry_id]);
+  }
+
+
+  public function renderHeadScriptsOn($script_loader) {
+    $script_loader
+      ->addScripts([Class_Url::absolute('/library/templates/Intonation/Assets/js/masonry.js')])
+      ->addScripts([Class_Url::absolute('/library/templates/Intonation/Assets/js/imagesloaded4.1.4.min.js')])
+      ->addJQueryReady(sprintf('$("#%s").parent().masonry();', $this->_masonry_id));
+
+    return $this;
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/TagAction.php b/library/templates/Intonation/View/TagAction.php
index 8bdd9c73b6c352ee295840bed2e1e21a044fc502..3417b0a48af57b98bd19523b2e0e47457833f67a 100644
--- a/library/templates/Intonation/View/TagAction.php
+++ b/library/templates/Intonation/View/TagAction.php
@@ -81,11 +81,11 @@ class Intonation_View_TagAction extends ZendAfi_View_Helper_BaseHelper {
       return '';
 
     if ($action->getNoButtonText())
-      return $this->_tag('div', $text, ['class' => ' d-inline text-left']);
+      return $this->_tag('div', $text, ['class' => 'd-inline text-left']);
 
     if (!$img)
-      return $this->_tag('div', $text, ['class' => ' d-inline button_text text-left']);
+      return $this->_tag('div', $text, ['class' => 'd-inline button_text text-left']);
 
-    return $this->_tag('div', $text, ['class' => 'd-none d-sm-inline text-left button_text']);
+    return $this->_tag('div', $text, ['class' => 'd-none d-md-inline text-left button_text']);
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/User/Informations.php b/library/templates/Intonation/View/User/Informations.php
index 552902a36d8b3904406ad2a35cdf63f78d58a729..a06c2a1ec0e7f184bfb4ad0697c9325e23537d04 100644
--- a/library/templates/Intonation/View/User/Informations.php
+++ b/library/templates/Intonation/View/User/Informations.php
@@ -34,7 +34,7 @@ class Intonation_View_User_Informations extends ZendAfi_View_Helper_BaseHelper {
             $this->_('Date de naissance') => (new DateTime($user->getNaissance()))->format($this->_('d / m / Y')),
 
             $this->_('Numéro de carte') => $user->getIdabon(),
-            $this->_('Bibilothèque') => $this->_getLibrary($user),
+            $this->_('Bibliothèque') => $this->_getLibrary($user),
 
             $this->_('Courriel') => $user->getMail(),
             $this->_('Numéro de téléphone') => $user->getTelephone(),
diff --git a/library/templates/Muscle/Assets/css/muscle.css b/library/templates/Muscle/Assets/css/muscle.css
index 8e83c17548d91c98d5eabea03ef326dba5a04ab3..83697caefb2a874f34f7fdd2df969a4546f9c90b 100644
--- a/library/templates/Muscle/Assets/css/muscle.css
+++ b/library/templates/Muscle/Assets/css/muscle.css
@@ -55,12 +55,12 @@ header {
 }
 
 .widget.justify-content-end * {
-    justify-content: end;
+    justify-content: flex-end;
     text-align: right;
 }
 
 .widget.justify-content-start * {
-    justify-content: start;
+    justify-content: flex-start;
     text-align: left;
 }
 
diff --git a/library/templates/Muscle/Library/ProfilePatcher.php b/library/templates/Muscle/Library/ProfilePatcher.php
index a69f7ee121c0502fadc920fdc8429432f5023f30..8f5b2d0b4f25d7be47e39fcb2e0efee3911c76f7 100644
--- a/library/templates/Muscle/Library/ProfilePatcher.php
+++ b/library/templates/Muscle/Library/ProfilePatcher.php
@@ -126,7 +126,6 @@ class Muscle_Library_ProfilePatcher extends Intonation_Library_ProfilePatcher {
                  'menus' => [
                              ['type_menu' => 'URL',
                               'libelle' => $this->_('Comment accéder à mon compte'),
-                              'use_profil' => $this->_help_menu,
                               'picto' => 'class fas fa-id-card',
                               'url' => ''],
 
diff --git a/library/templates/Polygone/Assets/css/polygone.css b/library/templates/Polygone/Assets/css/polygone.css
new file mode 100644
index 0000000000000000000000000000000000000000..3d61fb45feb2d152f5a42a65f8dc334e8881be07
--- /dev/null
+++ b/library/templates/Polygone/Assets/css/polygone.css
@@ -0,0 +1,450 @@
+@import url('https://fonts.googleapis.com/css?family=Titillium+Web:300,400,700,900|Ubuntu+Condensed|Ubuntu:300,400,500,700&display=swap');
+
+:root {
+}
+
+body {
+    font-family: 'Ubuntu';
+    font-size: 16px;
+    background: white;
+    color: #010202;
+    font-weight: 300;
+}
+
+#site_web_wrapper {
+    background-image: url('../images/body.png');
+    background-repeat: repeat-y;
+    background-position: top right;
+    background-color: transparent;
+}
+
+.ui-widget *:not(i) {
+    font-family: 'Roboto';
+    font-size: 16px;
+}
+
+.widget.login .dropdown-toggle,
+.nav nav .nav-link,
+.widget-header,
+h1,
+h2,
+h3 {
+    font-size: 2em;
+    font-weight: bold;
+}
+
+header {
+    background: url(../images/banner.png);
+    background-position: top right;
+    background-repeat: no-repeat;
+    background-size: contain;
+    background-color: #ededed;
+}
+
+.widget.justify-content-end * {
+    justify-content: flex-end;
+    text-align: right;
+}
+
+.widget.justify-content-start * {
+    justify-content: flex-start;
+    text-align: left;
+}
+
+.widget.justify-content-center * {
+    justify-content: center;
+}
+
+.login .dropdown {
+    display: flex;
+}
+
+.menu_buttons .button_text {
+    display: none !important;
+}
+
+.menu_buttons .nav-link,
+.menu_buttons .nav-link:hover {
+
+}
+
+.login .dropdown-toggle,
+.login .dropdown-menu {
+}
+
+.ui-state-active,
+.btn:active,
+a:active,
+.btn:focus,
+a:focus,
+.btn:hover,
+a:hover {
+    opacity: 0.8;
+    text-decoration: underline;
+}
+
+.btn-sm,
+col-form-label-sm,
+.form-control-sm {
+    font-size: 1em;
+}
+
+.rech_simple.widget form div {
+    padding: 0;
+    margin: 0;
+}
+
+.rech_simple.widget input,
+.rech_simple.widget button {
+    line-height: 1em;
+    vertical-align: middle;
+    margin: 0;
+    padding: 5px;
+    height: 40px;
+    min-width: 50px;
+    font-size: 1.5em;
+}
+
+.rech_simple .dropdown-menu {
+    left: -33% !important;
+}
+
+.rech_simple.widget button[type='submit'] {
+}
+
+.rech_simple.widget ::placeholder {
+}
+
+.widget.card,
+.widget-header,
+.breadcrumb,
+nav {
+}
+
+.nav nav .nav-link {
+    font-size: 1.8em;
+    border-right: 1px solid var(--polygone-black) !important;
+    line-height: 0.8em;
+}
+
+nav .nav-item:last-child .nav-link {
+    border-right: 0px !important;
+}
+
+.widget.nav {
+    margin-top: 4em;
+}
+
+.widget.nav .navbar-toggler {
+    margin-top: -4em;
+}
+
+#site_web_wrapper {
+    box-shadow: var(--polygone-grey) 0px 0px 5px;
+}
+
+body,
+#site_web_wrapper {
+}
+
+footer {
+    font-size: 0.875em;
+}
+
+footer .nav-link {
+    border-right: 1px solid var(--polygone-red) !important;
+    line-height: 0.8em;
+    text-align: center;
+}
+
+.nav-item:last-child .nav-link {
+    border-right-width: 0 !important;
+}
+
+.ui-autocomplete,
+.ui-autocomplete *,
+.ui-autocomplete *:hover {
+    border: none !important;
+}
+
+.widget.login {
+    padding: 0;
+}
+
+.widget.login * {
+}
+
+.widget.login input {
+}
+
+.widget.login form * {
+    text-align: left;
+}
+
+.widget.login .text-secondary {
+}
+
+.widget.login .dropdown-toggle,
+.widget.login .dropdown-toggle:after {
+    font-size: 20px;
+    margin-right: 0;
+    color: white;
+    background: #223a7e;
+}
+
+.widget.login .dropdown-toggle {
+    padding-right: 1em;
+}
+
+.widget.login .dropdown-menu {
+    position: absolute;
+    right: 0;
+    left: auto;
+}
+
+header .card-body {
+    padding: 0;
+}
+
+.widget.login a {
+
+}
+
+.widget.login #login {
+    position: absolute;
+    bottom: 4em;
+    left: 0.875em;
+}
+
+.widget.login a {
+    font-weight: bold;
+}
+
+.widget.login a[href*="/auth/lostpass"] {
+    display: block;
+    margin-top: 4em;
+}
+
+.widget.login form {
+    max-width: 200px;
+}
+
+.widget-footer a.btn-secondary {
+}
+
+.widget-footer {
+    text-align: right;
+}
+
+.badge-group .badge {
+}
+
+.badge-group a.badge {
+}
+
+a,
+a:hover {
+}
+
+a.text-primary,
+a.text-primary:hover {
+}
+
+.carousel-item .card-footer {
+    margin: 0 1rem;
+}
+
+.widget > .card-footer,
+.card-footer {
+}
+
+.masonry-content > .card > .card-footer {
+    padding: 5px;
+}
+
+.list-group-item.active,
+.nav-tabs,
+.border-primary {
+}
+
+.nav-tabs .nav-item {
+    border-bottom: 1px solid transparent;
+}
+
+.card-footer {
+    border-top: none;
+}
+
+.no_badges .badge-group,
+.no_badget .badge {
+    display: none;
+}
+
+.no_card_footer .card-footer {
+    display: none !important;
+}
+
+.polygone_widget {
+    background-image: url('../images/widget_bg.png');
+    background-repeat: no-repeat;
+    background-position: top left;
+    background-color: transparent;
+}
+
+.widget > .card-footer, .card-footer {
+    background: none;
+}
+
+footer {
+    background-image: url('../images/footer_corner.png');
+    background-repeat: no-repeat;
+    background-position: bottom right;
+    background-color: #31ade4;
+}
+
+.card-header {
+    background: transparent;
+}
+
+.polygone_big_menu_buttons .nav-item {
+    width: 33.33%;
+}
+
+.polygone_big_menu_buttons .nav-link {
+    position: relative;
+    padding: 0 !important;
+}
+
+.polygone_big_menu_buttons .nav-item + .nav-item .nav-link {
+    margin-left: 10px;
+}
+
+.polygone_big_menu_buttons .nav-link div {
+    display: block !important;
+    background: var(--widget-shadow);
+    padding: 1em 0em;
+    text-align: center !important;
+    color: white;
+    font-weight: bold;
+    text-transform: uppercase;
+    position: absolute;
+    width: 100%;
+    bottom: 0;
+    left: 0;
+}
+
+.polygone_big_menu_buttons .navbar {
+    padding: 0;
+}
+
+.polygone_big_menu_buttons .nav-link img {
+    width: 100%;
+    height: auto;
+}
+
+a,
+a:hover,
+a:focus,
+a:visited {
+    color: #223a7e;
+}
+
+[class*="-primary"],
+[class*="-primary"]:hover,
+[class*="-primary"]:focus,
+[class*="-primary"]:visited,
+[class*="-secondary"],
+[class*="-secondary"]:hover,
+[class*="-secondary"]:focus,
+[class*="-secondary"]:visited,
+[class*="-info"],
+[class*="-info"]:hover,
+[class*="-info"]:focus,
+[class*="-info"]:visited{
+    color: #223a7e !important;
+    background-color: transparent !important;
+}
+
+.scroll_search {
+    position: fixed;
+    top: 0;
+    right: 0;
+    left: 0;
+    margin: auto;
+    background: #1884c7;
+    color: #fff;
+    display: none;
+    z-index: 3;
+    text-align: center;
+    opacity: 0.9;
+}
+
+.scroll_search .dropdown-menu {
+    background: #1884c7;
+}
+
+.scroll_search * {
+    background-color: transparent;
+}
+
+.scroll_search .expressionRecherche {
+    background: white;
+}
+
+.scroll_search form {
+    width: 40%;
+    display: inline-block;
+}
+
+.navbar {
+    padding: 0;
+}
+
+.flying_widget .navbar-collapse.collapsing,
+.flying_widget .navbar-collapse.collapse,
+.flying_widget a {
+    background-color: #1884c7;
+    text-transform: uppercase;
+}
+
+
+.flying_widget .navbar-collapse.collapsing,
+.flying_widget .navbar-collapse.collapse {
+    padding: 2em 0.5em;
+    height: 30000px;
+    overflow:visible;
+}
+
+
+.flying_widget .navbar-collapse {
+    height: 30000px;
+    background-color: #1884c7;
+}
+
+.flying_widget .navbar.navbar-collapse {
+    display: block;
+    padding: 0;
+}
+
+.flying_widget .navbar-brand {
+    display: inline-block;
+}
+
+.flying_widget .navbar-header {
+    padding: 1em;
+    padding-top: 150px;
+}
+
+.flying_widget * {
+    transition-delay: unset;
+    transition-duration: unset;
+}
+
+.flying_widget {
+    display: block;
+    min-width: 8.33%;
+}
+
+.z-index-11 {
+    z-index: 11;
+}
\ No newline at end of file
diff --git a/library/templates/Polygone/Assets/images/banner.png b/library/templates/Polygone/Assets/images/banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e88125a057e34099e7f3ab90f75ce054697e029
Binary files /dev/null and b/library/templates/Polygone/Assets/images/banner.png differ
diff --git a/library/templates/Polygone/Assets/images/body.png b/library/templates/Polygone/Assets/images/body.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf130aa2f56d3670aac9b548c7766b646d86c186
Binary files /dev/null and b/library/templates/Polygone/Assets/images/body.png differ
diff --git a/library/templates/Polygone/Assets/images/footer_corner.png b/library/templates/Polygone/Assets/images/footer_corner.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc30c66f5b2316ebe4cad8a5d3e99696b592c76d
Binary files /dev/null and b/library/templates/Polygone/Assets/images/footer_corner.png differ
diff --git a/library/templates/Polygone/Assets/images/logo.png b/library/templates/Polygone/Assets/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..b88661c6d77bb775c85abb75b8dcbaa9f198f4ee
Binary files /dev/null and b/library/templates/Polygone/Assets/images/logo.png differ
diff --git a/library/templates/Polygone/Assets/images/logo_footer.png b/library/templates/Polygone/Assets/images/logo_footer.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c9e99be0341955a209cd0585c35613a4b0177c6
Binary files /dev/null and b/library/templates/Polygone/Assets/images/logo_footer.png differ
diff --git a/library/templates/Polygone/Assets/images/s_exercer.jpg b/library/templates/Polygone/Assets/images/s_exercer.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..498e1ac1a5c750b2243b5a5cffe580e577702a30
Binary files /dev/null and b/library/templates/Polygone/Assets/images/s_exercer.jpg differ
diff --git a/library/templates/Polygone/Assets/images/se_divertir.jpg b/library/templates/Polygone/Assets/images/se_divertir.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..dc8837111bf0fc366c609623d5a00ea24a20d677
Binary files /dev/null and b/library/templates/Polygone/Assets/images/se_divertir.jpg differ
diff --git a/library/templates/Polygone/Assets/images/se_documenter.jpg b/library/templates/Polygone/Assets/images/se_documenter.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..beb4a0ddca6c1f4cc8ecf1849d9deafb0d3888b1
Binary files /dev/null and b/library/templates/Polygone/Assets/images/se_documenter.jpg differ
diff --git a/library/templates/Polygone/Assets/images/widget_bg.png b/library/templates/Polygone/Assets/images/widget_bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..dde54a152ad1ea1f1f03287c5aa4eaa37fd08ea6
Binary files /dev/null and b/library/templates/Polygone/Assets/images/widget_bg.png differ
diff --git a/library/templates/Polygone/Assets/js/scroll_search.js b/library/templates/Polygone/Assets/js/scroll_search.js
new file mode 100644
index 0000000000000000000000000000000000000000..648afb2dc90d8c73d7780fb5e4409ba4cb1d9c86
--- /dev/null
+++ b/library/templates/Polygone/Assets/js/scroll_search.js
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2018, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ */
+
+(function ( $ ) {
+  $.fn.scroll_search = function () {
+    var search_widget = $(this);
+
+    var visible = function(element) {
+      var rect = element.getBoundingClientRect(),
+    	  top = rect.top,
+    	  height = rect.height;
+
+      return top + height > 0;
+    };
+
+    var update = function() {
+      return visible($('.rech_simple.main_title')[0])
+        ? search_widget.hide()
+    	: search_widget.show();
+    }
+
+    $(window).on('scroll', update);
+    
+    update();
+  }
+} (jQuery));
diff --git a/library/templates/Polygone/Library/FormCustomizer.php b/library/templates/Polygone/Library/FormCustomizer.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cf0b30114c13673e2b7f001adf8ec9994feb1de
--- /dev/null
+++ b/library/templates/Polygone/Library/FormCustomizer.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_Library_FormCustomizer extends Intonation_Library_FormCustomizer {
+  public function getTemplateForm($form) {
+    return (new Polygone_Library_FormCustomizer_Template($this->_template, $form))->getForm();
+  }
+}
diff --git a/library/templates/Polygone/Library/FormCustomizer/Template.php b/library/templates/Polygone/Library/FormCustomizer/Template.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc004fffc77e9c29abff24bd1e13da2dd74e45f2
--- /dev/null
+++ b/library/templates/Polygone/Library/FormCustomizer/Template.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_Library_FormCustomizer_Template extends Intonation_Library_FormCustomizer_Template {
+  public function getForm() {
+    parent::getForm();
+
+    $this->_form
+      ->addElement('checkbox',
+                   $this->_template->withNameSpace('polygone_css'),
+                   ['label' => $this->_('polygone.css'),
+                    'order' => 3]);
+
+    $this->_addToTemplateGroup(['polygone_css']);
+
+    return $this;
+  }
+}
diff --git a/library/templates/Polygone/Library/ProfilePatcher.php b/library/templates/Polygone/Library/ProfilePatcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..901c3b017b8c0301a737e1eb36977d9ada9b1135
--- /dev/null
+++ b/library/templates/Polygone/Library/ProfilePatcher.php
@@ -0,0 +1,523 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_Library_ProfilePatcher extends Intonation_Library_ProfilePatcher {
+
+  protected
+    $_main_menu,
+    $_widget_menu,
+    $_help_menu,
+    $_social_network_top_menu,
+    $_credits_menu,
+    $_legal_mentions,
+    $_flying_menu,
+    $_themes_menu;
+
+
+  protected function _upgradeProfile() {
+    parent::_upgradeProfile();
+
+    $this->_profile
+      ->setAccessLevel(-1)
+      ->setLibelle($this->_('Accueil Polygone'));
+
+    Class_AdminVar::set('MENU_BOITE', 1);
+
+    return $this;
+  }
+
+
+  protected function _upgradeSections() {
+    $section_header = ((new Class_Systeme_Widget_Section_Header)
+                       ->setProfileId($this->_profile_id)
+                       ->load());
+
+    $section_header
+      ->setNewDatas(['boite' => ['no_border_radius'],
+                     $this->_template->withNameSpace('width_xsmall') => 11,
+                     $this->_template->withNameSpace('width_large') => 8,
+                     $this->_template->withNameSpace('width_xlarge') => 6,
+                     $this->_template->withNameSpace('offset_xsmall') => 1,
+                     $this->_template->withNameSpace('offset_large') => 2,
+                     $this->_template->withNameSpace('offset_xlarge') => 3])
+      ->updateProfile();
+
+    Class_Profil::clearCache();
+
+    $section_main = ((new Class_Systeme_Widget_Section_Main)
+                     ->setProfileId($this->_profile_id)
+                     ->load());
+
+    $section_main
+      ->setNewDatas(['boite' => ['no_border_radius'],
+                     $this->_template->withNameSpace('width_xsmall') => 11,
+                     $this->_template->withNameSpace('width_large') => 8,
+                     $this->_template->withNameSpace('width_xlarge') => 6,
+                     $this->_template->withNameSpace('offset_xsmall') => 1,
+                     $this->_template->withNameSpace('offset_large') => 2,
+                     $this->_template->withNameSpace('offset_xlarge') => 3])
+      ->updateProfile();
+
+    Class_Profil::clearCache();
+
+    $section_footer = ((new Class_Systeme_Widget_Section_Footer)
+                       ->setProfileId($this->_profile_id)
+                       ->load());
+
+    $section_footer
+      ->setNewDatas(['boite' => ['no_border_radius'],
+                     $this->_template->withNameSpace('width_xsmall') => 11,
+                     $this->_template->withNameSpace('width_large') => 8,
+                     $this->_template->withNameSpace('width_xlarge') => 6,
+                     $this->_template->withNameSpace('offset_xsmall') => 1,
+                     $this->_template->withNameSpace('offset_large') => 2,
+                     $this->_template->withNameSpace('offset_xlarge') => 3])
+      ->updateProfile();
+
+    Class_Profil::clearCache();
+
+    $this->_profile = Class_Profil::find($this->_profile_id);
+
+    return $this;
+  }
+
+
+  protected function _upgradeMenus() {
+    $this->_main_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Menu principal'),
+                 'picto' => '',
+                 'menus' => [
+                             ['type_menu' => 'ACCUEIL',
+                              'picto' => 'class fas fa-home',
+                              'libelle' => $this->_('Accueil'),
+                              'use_profil' => $this->_profile_id]
+                 ]
+                 ]);
+
+    $this->_help_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Menu aide'),
+                 'picto' => '',
+                 'menus' => [
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Comment accéder à mon compte'),
+                              'picto' => 'class fas fa-user-circle',
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Comprendre l\'accessibilité du portail'),
+                              'picto' => 'class fab fa-accessible-icon',
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'picto' => 'class fas fa-question-circle',
+                              'libelle' => $this->_('Besoin d\'aide ?'),
+                              'url' => ''],
+                 ]
+                 ]);
+
+    $this->_social_network_top_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Menu réseaux sociaux haut de page'),
+                 'picto' => '',
+                 'menus' => [
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Facebook'),
+                              'url' => '',
+                              'picto' => 'class fab fa-facebook-f'],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Youtube'),
+                              'url' => '',
+                              'picto' => 'class fab fa-youtube'],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Twitter'),
+                              'url' => '',
+                              'picto' => 'class fab fa-twitter'],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Instagram'),
+                              'url' => '',
+                              'picto' => 'class fab fa-instagram'],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('SoundCloud'),
+                              'url' => '',
+                              'picto' => 'class fab fa-soundcloud'],
+
+                 ]
+                 ]);
+
+    $this->_widget_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Menu boites'),
+                 'picto' => '',
+                 'menus' => [['type_menu' => 'MODULE_ACCUEIL_LIBRARY',
+                              'type_module' => 'LIBRARY',
+                              'libelle' => $this->_('Boites'),
+                              'preferences' => ['titre' => $this->_('Accès'),
+                                                'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'justify-content-end', 'd-inline-block', 'no_badges', 'no_card_footer'],
+                                                'rendering' => 'card-description',
+                                                'layout' => 'horizontal_list',
+                                                'osm_map' => 0,
+                                                'size' => 1,
+                                                'link_to_all' => 0,
+                                                $this->_template->withNameSpace('width_xsmall') => 12,
+                                                $this->_template->withNameSpace('show_header') => 0,
+                                                $this->_template->withNameSpace('show_content') => 0,
+                                                $this->_template->withNameSpace('show_footer') => 0]],
+
+                             ['type_menu' => 'MODULE_ACCUEIL_LOGIN',
+                              'type_module' => 'LOGIN',
+                              'libelle' => $this->_('Connexion'),
+                              'preferences' => ['titre' => $this->_('Connexion'),
+                                                'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'no_background', 'justify-content-end', 'd-inline-block'],
+                                                'titre_connecte' => $this->_('Mon compte'),
+                                                'message_connecte' => '',
+                                                'identifiant' => $this->_('Identifiant'),
+                                                'identifiant_exemple' => $this->_('N° de carte'),
+                                                'mot_de_passe' => $this->_('Mot de passe'),
+                                                'mot_de_passe_exemple' => $this->_('Année de naissance'),
+                                                'lien_connexion' => $this->_('Se connecter'),
+                                                'lien_deconnection' => $this->_('Se déconnecter'),
+                                                'lien_mot_de_passe_oublie' => $this->_('Mot de passe oublié'),
+                                                'lien_compte' => $this->_('Mon compte'),
+                                                'lien_creer_compte' => $this->_('S\'enregistrer'),
+                                                $this->_template->withNameSpace('form_style') => 'toggle',
+                                                $this->_template->withNameSpace('width_xsmall') => 12,
+                                                $this->_template->withNameSpace('show_header') => 0,
+                                                $this->_template->withNameSpace('show_content') => 0,
+                                                $this->_template->withNameSpace('show_footer') => 0]]
+                 ]]);
+
+    $this->_credits_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Plan du site'),
+                 'picto' => '',
+                 'menus' => [
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Plan du site'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Ma médiathèque c\'est quoi ?'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Qu\'est ce qu\'on y fait ?'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Mais au fait, c\'est où ?'),
+                              'url' => ''],
+                 ]
+                 ]);
+
+    $this->_legal_mentions = $this->_profile->addMenu(['libelle' => $this->_('Mentions légales'),
+                                                       'picto' => '',
+                                                       'menus' => [
+                                                                   ['type_menu' => 'URL',
+                                                                    'libelle' => $this->_('Mentions légales'),
+                                                                    'url' => '']]]);
+
+    $this->_flying_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Menu'),
+                 'picto' => '',
+                 'menus' => [
+                             ['type_menu' => 'ACCUEIL',
+                              'libelle' => $this->_('Accueil'),
+                              'picto' => Class_Url::absolute('/library/templates/Polygone/Assets/images/logo_footer.png'),
+                              'use_profil' => $this->_profile_id],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Ma médiathèque c\'est quoi ?'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Qu\'est ce qu\'on y fait ?'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Mais au fait, c\'est où ?'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Programme'),
+                              'url' => ''],
+                 ]
+                 ]);
+
+    $this->_themes_menu = $this->_profile
+      ->addMenu(['libelle' => $this->_('Menu des thèmes'),
+                 'picto' => '',
+                 'menus' => [
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('Se documenter'),
+                              'picto' => Class_Url::absolute('/library/templates/Polygone/Assets/images/se_documenter.jpg'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'libelle' => $this->_('S\'exercer'),
+                              'picto' => Class_Url::absolute('/library/templates/Polygone/Assets/images/s_exercer.jpg'),
+                              'url' => ''],
+
+                             ['type_menu' => 'URL',
+                              'picto' => Class_Url::absolute('/library/templates/Polygone/Assets/images/se_divertir.jpg'),
+                              'libelle' => $this->_('Se divertir'),
+                              'url' => ''],
+                 ]
+                 ]);
+
+    $this->_profile->save();
+
+    return $this;
+  }
+
+
+  protected function _upgradeWidgets() {
+    $this
+      ->_removeWidgets()
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Menu volant'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'flying_widget', 'position_fixed_top_left', 'z_index_11'],
+                    'layout' => 'vertical',
+                    'menu' => $this->_profile_id . '-' . $this->_flying_menu,
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_ALWAYS,
+                    $this->_template->withNameSpace('width_xsmall') => 6,
+                    $this->_template->withNameSpace('width_medium') => 4,
+                    $this->_template->withNameSpace('width_large') => 3,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Menu réseau sociaux haut'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'justify-content-start', 'menu_buttons'],
+                    'menu' => $this->_profile_id . '-' . $this->_social_network_top_menu,
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 6,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Menu d\'aide haut'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'justify-content-end', 'menu_buttons'],
+                    'menu' => $this->_profile_id . '-' . $this->_help_menu,
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 6,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Image_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Logo du réseau'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'no_background', 'justify-content-center'],
+                    'image' => Class_Url::absolute('/library/templates/Polygone/Assets/images/logo.png'),
+                    'link' => '',
+                    $this->_template->withNameSpace('width_xsmall') => 6,
+                    $this->_template->withNameSpace('width_medium') => 3,
+                    $this->_template->withNameSpace('offset_xsmall') => 2,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Menu boite'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'justify-content-end'],
+                    'menu' => $this->_profile_id . '-' . $this->_widget_menu,
+                    'layout' => 'vertical',
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('width_medium') => 7,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Nav_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Menu réseau sociaux haut'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'menu_buttons', 'justify-content-center'],
+                    'menu' => $this->_profile_id . '-' . $this->_main_menu,
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 2,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Search_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['boite' => ['no_border', 'no_border_radius', 'no_shadow', 'no_background', 'main_title'],
+                    'search_button' => 'class fas fa-search',
+                    'titre' => $this->_('Le polygone'),
+                    'placeholder' => $this->_('Trouver un document'),
+                    'type_doc' => '',
+                    $this->_template->withNameSpace('form_style') => 'inline',
+                    $this->_template->withNameSpace('width_xsmall') => 8,
+                    $this->_template->withNameSpace('show_header') => 1,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Search_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['boite' => ['no_border', 'no_border_radius', 'no_shadow', 'justify-content-center', 'scroll_search'],
+                    'search_button' => 'class fas fa-search',
+                    'titre' => $this->_('Le polygone'),
+                    'placeholder' => $this->_('Trouver un document'),
+                    'type_doc' => '',
+                    $this->_template->withNameSpace('form_style') => 'inline',
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Breadcrumb_Definition::CODE,
+                   Class_Profil::DIV_BANNIERE,
+                   ['titre' => $this->_('Fil d\'ariane'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'justify-content-start', 'pl-2'],
+                    'root' => '',
+                    'show_profile' => 1,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_MAIN,
+                   ['titre' => $this->_('Menu des thèmes'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'polygone_big_menu_buttons'],
+                    'menu' => $this->_profile_id . '-' . $this->_themes_menu,
+                    'layout' => 'horizontal',
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Carousel_Agenda_Definition::CODE,
+                   Class_Profil::DIV_MAIN,
+                   ['titre' => $this->_('Actualités'),
+                    'boite' => ['no_background', 'no_border', 'no_border_radius', 'no_shadow'],
+                    'rendering' => 'card-overlay',
+                    'layout' => 'carousel',
+                    'size' => 3,
+                    'order' => 'EventDebut',
+                    'enabled_filters' => '',
+                    'link_to_all' => 0,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('show_header') => 1,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Carousel_Agenda_Definition::CODE,
+                   Class_Profil::DIV_MAIN,
+                   ['titre' => $this->_('Prochains événements'),
+                    'boite' => ['no_background', 'no_border', 'no_border_radius', 'no_shadow'],
+                    'rendering' => 'card',
+                    'layout' => 'multiple_carousel',
+                    'size' => 3,
+                    'order' => 'EventDebut',
+                    'enabled_filters' => '',
+                    'link_to_all' => 1,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('show_header') => 1,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 1])
+
+      ->_addWidget(Intonation_Library_Widget_Carousel_Record_Definition::CODE,
+                   Class_Profil::DIV_MAIN,
+                   ['titre' => $this->_('Nouveautés'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow', 'polygone_widget'],
+                    'rendering' => 'card-overlay',
+                    'layout' => 'horizontal_list',
+                    'size' => 5,
+                    'link_to_all' => 1,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('show_header') => 1,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 1])
+
+      ->_addWidget(Intonation_Library_Widget_Carousel_Library_Definition::CODE,
+                   Class_Profil::DIV_FOOTER,
+                   ['titre' => $this->_('Accès'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow'],
+                    'rendering' => 'card-description',
+                    'layout' => 'horizontal_list',
+                    'osm_map' => 0,
+                    'size' => 1,
+                    'link_to_all' => 0,
+                    $this->_template->withNameSpace('width_xsmall') => 12,
+                    $this->_template->withNameSpace('width_medium') => 6,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_FOOTER,
+                   ['titre' => $this->_('Menu plan du site'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow'],
+                    'layout' => 'vertical',
+                    'menu' => $this->_profile_id . '-' . $this->_credits_menu,
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 6,
+                    $this->_template->withNameSpace('width_medium') => 3,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Menu_Definition::CODE,
+                   Class_Profil::DIV_FOOTER,
+                   ['titre' => $this->_('Menu mentions légales'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow'],
+                    'layout' => 'vertical',
+                    'menu' => $this->_profile_id . '-' . $this->_legal_mentions,
+                    $this->_template->withNameSpace('expand_breakpoint') => Intonation_Library_Constants::RESPONSIVE_MODE_XSMALL,
+                    $this->_template->withNameSpace('width_xsmall') => 6,
+                    $this->_template->withNameSpace('width_medium') => 3,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addWidget(Intonation_Library_Widget_Image_Definition::CODE,
+                   Class_Profil::DIV_FOOTER,
+                   ['titre' => $this->_('Logo du réseau'),
+                    'boite' => ['no_border', 'no_border_radius', 'no_shadow'],
+                    'image' => Class_Url::absolute('/library/templates/Polygone/Assets/images/logo_footer.png'),
+                    'link' => '',
+                    $this->_template->withNameSpace('width_xsmall') => 2,
+                    $this->_template->withNameSpace('show_header') => 0,
+                    $this->_template->withNameSpace('show_content') => 0,
+                    $this->_template->withNameSpace('show_footer') => 0])
+
+      ->_addScrollDownWidget()
+      ->_addScrollTopWidget()
+      ->_addAdminWidget()
+      ->_addAccessibilityWidget()
+      ->_addNotificationWidget();
+
+    return $this;
+  }
+}
\ No newline at end of file
diff --git a/library/templates/Polygone/Library/Settings.php b/library/templates/Polygone/Library/Settings.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d4afa8ef2c82ba1ab3bc92bcac7d0c3425f8c60
--- /dev/null
+++ b/library/templates/Polygone/Library/Settings.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_Library_Settings extends Intonation_Library_Settings {
+  protected function _getDefaultSettings() {
+    $settings = parent::_getDefaultSettings();
+    $settings[$this->_template->withNameSpace('polygone_css')] = 1;
+
+    $custom_css_classes = $settings[$this->_template->withNameSpace('custom_css_class')];
+
+    $custom_css_classes = ['position_fixed_bottom',
+                           'position_fixed_bottom_left',
+                           'position_fixed_bottom_right',
+                           'position_fixed_top',
+                           'position_fixed_top_left',
+                           'position_fixed_top_right',
+                           'position_fixed_mid_left',
+                           'position_fixed_mid_right',
+                           'pt-3',
+                           'pt-5',
+                           'pb-3',
+                           'pl-2',
+                           'pl-md-3',
+                           'pr-md-3',
+                           'no_background',
+                           'no_border',
+                           'no_border_radius',
+                           'no_shadow',
+                           'm-auto',
+                           'ml-auto',
+                           'mr-auto',
+                           'align-items-center',
+                           'auto_col',
+                           'justify-content-start',
+                           'justify-content-end',
+                           'justify-content-center',
+                           'menu_buttons',
+                           'polygone_big_menu_buttons',
+                           'polygone_widget',
+                           'no_card_footer',
+                           'no_badges',
+                           'scroll_search',
+                           'flying_widget',
+                           'z-index-11'];
+
+    $settings[$this->_template->withNameSpace('custom_css_class')] = $custom_css_classes;
+
+    $hydrating_mapping = $settings[$this->_template->withNameSpace('hydrating_mapping')];
+
+    $hydrating_mapping['a class nav-link'] = '';
+    $hydrating_mapping['div class navbar-header'] = '';
+    $hydrating_mapping['div class navbar-collapse'] = '';
+    $hydrating_mapping['div id site_web_wrapper'] = 'container';
+    $hydrating_mapping['div id site_web_content_wrapper'] = 'row no-gutters';
+
+    $settings[$this->_template->withNameSpace('hydrating_mapping')] = $hydrating_mapping;
+    return $settings;
+  }
+}
diff --git a/library/templates/Polygone/Template.php b/library/templates/Polygone/Template.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd9ac4e65adaa9da50f626002b59a98ce8099c0f
--- /dev/null
+++ b/library/templates/Polygone/Template.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_Template extends Intonation_Template {
+
+  const ID = 'POLYGONE';
+
+
+  public function __construct() {
+    $this->setId(static::ID)
+         ->setTitle($this->_('Polygone'))
+         ->setSettings(new Polygone_Library_Settings($this))
+         ->setPatcher(new Polygone_Library_ProfilePatcher($this));
+  }
+
+
+  public function getProfile() {
+    if ($this->_profile)
+      return $this->_profile;
+
+    if ($this->_profile = Class_Profil::findFirstBy(['template' => $this->getId()]))
+      return $this->_profile;
+
+    $this->createFrom(Class_Profil::getPortail());
+
+    return $this->_profile = Class_Profil::getCurrentProfil();
+  }
+
+
+  public function renderOpac($view) {
+    return (new Polygone_View_Opac($this, $view))->render();
+  }
+
+
+  public function renderSubModal($view) {
+    return (new Polygone_View_SubModal($this, $view))->render();
+  }
+
+
+  public function customTemplateForm($form) {
+    $helper = new Polygone_Library_FormCustomizer($this);
+    return $helper->getTemplateForm($form);
+  }
+}
diff --git a/library/templates/Polygone/View/Opac.php b/library/templates/Polygone/View/Opac.php
new file mode 100644
index 0000000000000000000000000000000000000000..29fae39bf826503f8cae0bf9e36c912a30b6680c
--- /dev/null
+++ b/library/templates/Polygone/View/Opac.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_View_Opac extends Intonation_View_Opac {
+  protected function _headContent() {
+    Class_ScriptLoader::getInstance()
+      ->addStyleSheet(Class_Url::absolute('/library/templates/Polygone/Assets/css/polygone.css'))
+      ->addScript(Class_Url::absolute('/library/templates/Polygone/Assets/js/scroll_search.js'))
+      ->addJQueryReady('$(".scroll_search").scroll_search();');
+
+    return parent::_headContent();
+  }
+}
diff --git a/library/templates/Polygone/View/SubModal.php b/library/templates/Polygone/View/SubModal.php
new file mode 100644
index 0000000000000000000000000000000000000000..82d4f01d0ee27e020138097a95cff24b519f1996
--- /dev/null
+++ b/library/templates/Polygone/View/SubModal.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Polygone_View_SubModal extends Intonation_View_SubModal {
+  protected function _headContent() {
+    Class_ScriptLoader::getInstance()
+      ->addStyleSheet(Class_Url::absolute('/library/templates/Polygone/Assets/css/polygone.css'));
+    return parent::_headContent();
+  }
+}
diff --git a/library/templates/TerreDuMilieu/Assets/css/terredumilieu.css b/library/templates/TerreDuMilieu/Assets/css/terredumilieu.css
index bf79f9fe020a5830ab44c1c1f29a03fc6829734d..5bb0048f1bbdfbd7b3c9dd784750448c0ff18b74 100644
--- a/library/templates/TerreDuMilieu/Assets/css/terredumilieu.css
+++ b/library/templates/TerreDuMilieu/Assets/css/terredumilieu.css
@@ -295,6 +295,7 @@ nav .nav-link {
     text-align: center;
     background-color: var(--tdm-main-background);
     transform: translate3d(0px, 45px, 0px) !important;
+    box-shadow: 0 5px 5px var(--tdm-link-color);
 }
 
 .widget.login .dropdown-menu.show > * {
@@ -318,6 +319,7 @@ nav .nav-link {
     z-index: 2;
     background-position: top center;
     padding-bottom: 45px;
+    min-width: 120px;
 }
 
 .widget.login .btn.dropdown-toggle:after {
diff --git a/public/opac/java/scroll/scroll.js b/public/opac/java/scroll/scroll.js
index 5fc69bea3579e0eefa5d0c2a55a06cc50e553699..6278351bea5408ad36afd2c07e60d8affaf08510 100644
--- a/public/opac/java/scroll/scroll.js
+++ b/public/opac/java/scroll/scroll.js
@@ -30,7 +30,7 @@
       }, 1000);
     });
 
-    $(window).scroll(function() {
+    $(window).on('scroll', function() {
       anchor.show();
     });
   }
diff --git a/public/opac/js/renderFilters/ajaxifyFilters.js b/public/opac/js/renderFilters/ajaxifyFilters.js
index 3c597d595fd791e282c861fac59b6ceb43d5835e..7b121b9e777903396d7a95f2256019329fdf7e90 100644
--- a/public/opac/js/renderFilters/ajaxifyFilters.js
+++ b/public/opac/js/renderFilters/ajaxifyFilters.js
@@ -47,6 +47,9 @@
       if ('onLoadComplete' in options)
         options.onLoadComplete(widget);
 
+      if (undefined != $.fn.masonry)
+	widget.masonry();
+      
       initializePopups();
       setupAnchorsTarget();
       widget.ajaxifyFilters(options);
diff --git a/tests/scenarios/Templates/MuscleTemplateTest.php b/tests/scenarios/Templates/MuscleTemplateTest.php
index 255655c827fcf71da504eb4eeb5d7d57fd06dde5..e646b043756134fc82261cdf2288590b254c65f0 100644
--- a/tests/scenarios/Templates/MuscleTemplateTest.php
+++ b/tests/scenarios/Templates/MuscleTemplateTest.php
@@ -20,7 +20,7 @@
  */
 
 
-abstract class MuscleTemplateTestCase extends AbstractControllerTestCase {
+abstract class MuscleTemplateTestCase extends Admin_AbstractControllerTestCase {
   protected $_storm_default_to_volatile = true;
 
   public function setUp() {
@@ -32,8 +32,7 @@ abstract class MuscleTemplateTestCase extends AbstractControllerTestCase {
                               ['id' => 23]);
 
     (new Muscle_Template)->tryOn($profile);
-    (new Class_Profil_Promoter())->promote($profile);
-
+    (new Class_Profil_Promoter)->promote($profile);
   }
 
 
@@ -159,4 +158,16 @@ class MuscleTemplateEditTemplateTest extends Admin_AbstractControllerTestCase {
   public function customCssShouldContainsClassMenuButtons() {
     $this->assertContains('"menu_buttons"', $this->_response->getBody());
   }
+}
+
+
+
+
+class MuscleTemplateOpacAdvancedSearchTest extends MuscleTemplateTestCase {
+
+  /** @test */
+  public function advancedSearchSettingsShouldContainsCustomForm() {
+    $this->dispatch('/admin/widget/edit-action/id/recherche_avancee/id_profil/24');
+    $this->assertXPath('//input[@id="forms"]');
+  }
 }
\ No newline at end of file
diff --git a/tests/scenarios/Templates/PolygoneTemplateTest.php b/tests/scenarios/Templates/PolygoneTemplateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ffedb44cdda12550f3cf3c0718c2086b79cf9b9
--- /dev/null
+++ b/tests/scenarios/Templates/PolygoneTemplateTest.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * Copyright (c) 2012-2019, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+abstract class PolygoneTemplateTestCase extends Admin_AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true;
+
+  public function setUp() {
+    parent::setUp();
+    Class_Systeme_ModulesAccueil::reset();
+    Class_AdminVar::set('TEMPLATING', 1);
+
+    $profile = $this->fixture('Class_Profil',
+                              ['id' => 23]);
+
+    (new Polygone_Template)->tryOn($profile);
+    (new Class_Profil_Promoter)->promote($profile);
+  }
+
+
+  public function tearDown() {
+    parent::tearDown();
+    Class_Systeme_ModulesAccueil::reset();
+  }
+}
+
+
+
+
+class PolygoneTemplateAdminTemplateIndexDispatchTest extends PolygoneTemplateTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    $this->dispatch('/admin/template/index');
+  }
+
+
+  /** @test */
+  public function editPolygoneUrlShouldBeDisplay() {
+    $this->assertXPath('//table//a[contains(@href,"/admin/template/edit/template/POLYGONE")]');
+  }
+}
+
+
+
+class PolygoneTemplateProfilePatcherTest extends PolygoneTemplateTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    $this->dispatch('/opac/index/index');
+  }
+
+
+  public function widgetsClasses() {
+    return [
+            ['login'],
+            ['accessibility'],
+            ['rech_simple'],
+            ['admin_tools'],
+            ['scroll'],
+            ['library']
+    ];
+  }
+
+
+  /**
+   * @dataProvider widgetsClasses
+   * @test */
+  public function indexShouldContainsWidgets($widget_class) {
+    $this->assertXPath(sprintf('//div[contains(@class, "widget")][contains(@class, "%s")]',
+                               $widget_class));
+  }
+
+
+  /** @test */
+  public function editTemplatePolygoneShouldBePresent() {
+    $this->assertXPathContentContains('//a[contains(@href, "admin/template/edit/template/POLYGONE")]', 'Configuration du template');
+  }
+}
+
+
+
+class PolygoneTemplateOpacIndexWithUserAgentTest extends PolygoneTemplateTestCase {
+  public function setUp() {
+    parent::setUp();
+    ZendAfi_Auth::getInstance()->clearIdentity();
+    $this->dispatch('/opac/index/index');
+  }
+
+
+  /** @test */
+  public function pageTitleShouldBeTestChartePolygone() {
+    $this->assertXPathContentContains('//head/title', 'Polygone');
+  }
+
+
+  /** @test */
+  public function pageShouldLoadPolygoneCss() {
+    $this->assertXPath('//head/link[contains(@href, "/templates/Polygone/Assets/css/polygone.css")]');
+  }
+
+
+  /** @test */
+  public function pageShouldBeHtml5Valid() {
+    $this->assertHTML5();
+  }
+
+
+  /** @test */
+  public function pageShouldBeAccessible() {
+    $this->assertAccessible($this->_response->getBody());
+  }
+}
+
+
+
+class PolygoneTemplateEditTemplateTest extends Admin_AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true;
+
+  public function setUp() {
+    parent::setUp();
+
+    Class_AdminVar::set('TEMPLATING', 1);
+
+    $settings = $this->fixture('Class_Template_Settings',
+                               ['id' => 456,
+                                'template' => 'POLYGONE']);
+
+    $this->dispatch('/admin/template/edit/template/polygone');
+  }
+
+
+  /** @test */
+  public function checkboxPolygoneCssShouldBeChecked() {
+    $this->assertXPath('//form//input[@type="checkbox"][@name="PolygonePolygoneCss"][@checked]');
+  }
+
+
+  /** @test */
+  public function customCssShouldContainsClassMenuButtons() {
+    $this->assertContains('"menu_buttons"', $this->_response->getBody());
+  }
+}
+
+
+
+
+class PolygoneTemplateOpacAdvancedSearchTest extends PolygoneTemplateTestCase {
+
+  /** @test */
+  public function advancedSearchSettingsShouldContainsCustomForm() {
+    $this->dispatch('/admin/widget/edit-action/id/recherche_avancee/id_profil/24');
+    $this->assertXPath('//input[@id="forms"]');
+  }
+}
\ No newline at end of file
diff --git a/tests/scenarios/Templates/TemplatesTest.php b/tests/scenarios/Templates/TemplatesTest.php
index f921d8b43ee08ed5961af0dd63721f01c20c917a..f6f1b53492d3fecf4fd65a735722be53d562ac90 100644
--- a/tests/scenarios/Templates/TemplatesTest.php
+++ b/tests/scenarios/Templates/TemplatesTest.php
@@ -2901,7 +2901,13 @@ class TemplatesDispatchIntonationSearchListFormatWallTest extends TemplatesInton
 
   /** @test */
   public function suggestionsShouldBeDisplay() {
-    $this->assertXPathContentContains('//b', 'Suggestions', $this->_response->getBody());
+    $this->assertXPathContentContains('//b', 'Suggestions');
+  }
+
+
+  /** @test */
+  public function masonryShouldBeLoaded() {
+    $this->assertXPath('//head/script[contains(@src, "/masonry.js")]');
   }
 }
 
diff --git a/tests/scenarios/Templates/TerreDuMilieuTemplateTest.php b/tests/scenarios/Templates/TerreDuMilieuTemplateTest.php
index a71b9ff93bbf6461fac0b6daabbf3b63e0467c76..9d10aff82e587d7160f4022ea1e7ee28bc023590 100644
--- a/tests/scenarios/Templates/TerreDuMilieuTemplateTest.php
+++ b/tests/scenarios/Templates/TerreDuMilieuTemplateTest.php
@@ -171,4 +171,101 @@ class TerreDuMilieuTemplateEditTemplateTest extends Admin_AbstractControllerTest
   public function customCssShouldContainsClassTdmWidget() {
     $this->assertContains('"tdm_widget"', $this->_response->getBody());
   }
+}
+
+
+
+class TerreDuMilieuTemplateXSLTTest extends TerreDuMilieuTemplateTestCase {
+  public function setUp() {
+    parent::setUp();
+
+    Storm_Cache::beVolatile();
+    (new Storm_Cache)->clean();
+    Class_MoteurRecherche::resetInstance();
+
+    Zend_Registry::set('sql', $this->mock()
+                       ->whenCalled('fetchAll')
+                       ->answers([[5], ['T1']]));
+
+    $disk = $this->mock()
+                 ->whenCalled('directoryAt')
+                 ->answers(null)
+
+                 ->whenCalled('fileAt')
+                 ->answers((new Class_FileManager)
+                           ->setRealpath('tests/scenarios/Xsl/search_result.xsl'));
+
+    Class_FileManager::setFileSystem($disk);
+
+    $php_command = $this->mock()
+                        ->whenCalled('extension_loaded')
+                        ->answers(true)
+
+                        ->whenCalled('unlink')
+                        ->answers(true)
+
+                        ->whenCalled('libxml_use_internal_errors')
+                        ->answers(true)
+
+                        ->whenCalled('libxml_get_errors')
+                        ->answers([]);
+
+    Class_Notice_Xsl::setPhpCommand($php_command);
+
+    $dom_document = $this->mock()
+                         ->whenCalled('load')
+                         ->answers(true);
+
+    Class_Notice_Xsl::setDomDocument($dom_document);
+
+    $xslt_processor = $this->mock()
+                           ->whenCalled('importStylesheet')
+                           ->answers(true)
+
+                           ->whenCalled('transformToXml')
+                           ->answers('<li><strong>Numéro de notice Koha : </strong>2774</li><br><li>');
+
+    Class_Notice_Xsl::setXSLTProcessor($xslt_processor);
+
+    $profile = Class_Profil::getCurrentProfil();
+
+    $profile->setCfgModulesPreferences(['xslt' => '/tests/scenarios/Xsl/search_result.xsl'],
+                                       'recherche',
+                                       'resultat',
+                                       'simple');
+
+    $profile->setCfgModulesPreferences(['xslt' => '/tests/scenarios/Xsl/record_description.xsl'],
+                                       'recherche',
+                                       'viewnotice',
+                                       Class_TypeDoc::PERIODIQUE);
+    $this->fixture('Class_Notice',
+                   ['id' => 5,
+                    'type_doc' => 1,
+                    'unimarc' => "01185nam0 2200217   450 0010005000000100031000050350016000360900009000520990038000611000041000991010008001402000036001482100013001842150011001973300660002083330010008686760006008787000028008848010026009129020029009382774  a2-84563-280-0d19,90 Euros  aALOES355754  a2774  c2017-12-11d2018-03-16tLIVREx12  a20171211              frey50          afre  aSeras-tu là ?fGuillaume Musso  cXOd2012  a301 p.  aUn seul geste aurait suffi pour tout changer. Qui n'a jamais rêvé de revenir à cet instant décisif où le bonheur était possible ? San Francisco. Elliott, médecin passionné, ne s'est jamais consolé de la disparition d'Ilena, la femme qu'il aimait, morte il y a trente ans. Un jour, par une circonstance extraordinaire, il est ramené en arrière et rencontre le jeune homme qu'il était, trente ans plus tôt. Il est revenu à l'instant décisif où un geste de lui peut sauver Ilena. Et modifier l'implacable destin qui a figé son sort à jamais. Un stupéfiant face-à-face, Une histoire d'amour bouleversante, Un suspense à couper le souffle.  aAG 14  aR  aMussobGuillaume960415  aFRbCALUIREc20060516  981440aroman francophone"]);
+  }
+
+
+  /** @test */
+  public function searchResultShouldLoadTerreDuMilieuCss() {
+    $this->dispatch('/opac/recherche/simple');
+    $this->assertXPath('//head/link[contains(@href, "/templates/TerreDuMilieu/Assets/css/terredumilieu.css")]');
+  }
+
+
+  /** @test */
+  public function searchResultDisplayMarcWithXslt() {
+    $this->dispatch('/opac/recherche/simple');
+    $this->assertContains('<strong>Numéro de notice Koha : </strong>2774</li><br><li>', $this->_response->getBody());
+  }
+
+
+  /** @test */
+  public function recordDetailshouldDisplayMarcWithXslt() {
+    Class_Notice::find(5)
+      ->setTypeDoc(Class_TypeDoc::PERIODIQUE)
+      ->assertSave();
+
+    $this->dispatch('/opac/record/description/id/5');
+    $this->assertContains('<strong>Numéro de notice Koha : </strong>2774</li><br><li>', $this->_response->getBody());
+  }
 }
\ No newline at end of file