diff --git a/application/modules/opac/controllers/AbonneController.php b/application/modules/opac/controllers/AbonneController.php
index 8cc54cb25e4452e73b1a685dc1b5af3736c14d4c..8fba91dc39357369fc06e2b37271e98251c2fe53 100644
--- a/application/modules/opac/controllers/AbonneController.php
+++ b/application/modules/opac/controllers/AbonneController.php
@@ -147,9 +147,6 @@ class AbonneController extends ZendAfi_Controller_Action {
   }
 
 
-
-
-
   public function viewavisAction(){
     $this->_forward('viewauteur', 'blog', 'opac', ['id' => $this->_user->getId()]);
   }
@@ -1355,7 +1352,7 @@ class AbonneController extends ZendAfi_Controller_Action {
       return $this->_forward('popup-login', 'auth', 'opac');
 
     if(!$this->_request->isPost())
-      return $this->_redirectToReferer();
+      return $this->_redirectClose($this->_getReferer());
 
     $form = new ZendAfi_Form_Review;
 
@@ -1379,7 +1376,7 @@ class AbonneController extends ZendAfi_Controller_Action {
       $rating->setModerationNOK();
 
     if (!$form->isValidModelAndArray($rating, $post))
-      return $this->_redirectToReferer();
+      return $this->_redirectClose($this->_getReferer());
 
     if (!$rating->save())
       return false;
@@ -1388,7 +1385,37 @@ class AbonneController extends ZendAfi_Controller_Action {
                                     $this->_getPost('note'),
                                     5));
 
-    return $this->_redirectToReferer();
+    return $this->_redirectClose($this->_getReferer());
+  }
+
+
+  public function editReviewAction() {
+    if (!$review = Class_AvisNotice::find($this->_getParam('id', null)))
+      return $this->_redirectClose($this->_getReferer());
+
+    $this->view->titre = $this->_('Modifier l\'avis');
+
+    $this->view->review = $review;
+  }
+
+
+  public function deleteReviewAction() {
+    if (!$review = Class_AvisNotice::find($this->_getParam('id', null)))
+      return $this->_redirectClose($this->_getReferer());
+
+    $this->view->titre = $this->_('Supprimer l\'avis');
+
+    $this->view->review = $review;
+
+    if ($this->_getParam('redirect'))
+      return $this->_redirectClose($this->_getReferer());
+
+    if ($this->_getParam('delete')) {
+      $review->delete();
+      $this->_helper->notify($this->_('L\'avis a bien été supprimé'),
+                             ['status' => 'delete']);
+      return $this->_redirectClose($this->_getReferer());
+    }
   }
 
 
diff --git a/application/modules/opac/views/scripts/abonne/delete-review.phtml b/application/modules/opac/views/scripts/abonne/delete-review.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..94887ae42f88e374a7baa3037572bd75421769f6
--- /dev/null
+++ b/application/modules/opac/views/scripts/abonne/delete-review.phtml
@@ -0,0 +1,22 @@
+<?php
+$wrapper = (new Intonation_Library_View_Wrapper_Review)
+                                ->setModel($this->review)
+                                ->setView($this);
+$html = [$this->div(['class' => 'col-10 p-2 m-2 text-left'],
+                    $this->cardifyFullDescription($wrapper)),
+
+         $this->div(['class' => 'col-10'],
+                    $this->tag('h3',
+                               $this->_('Supprimer l\'avis'),
+                               ['class' => 'pt-2 mx-2 border-top border-danger'])),
+
+         $this->div(['class' => 'col-10'],
+                    $this->div(['class' => 'm-2 p-2 btn-group text-white'],
+                               $this->tagAnchor(['redirect' => '1'],
+                                                $this->_('Non'),
+                                                ['class' => 'btn btn-info'])
+                               . $this->tagAnchor(['delete' => '1'],
+                                                $this->_('Oui'),
+                                                ['class' => 'btn btn-danger'])))];
+
+echo $this->grid(implode($html), [], ['class' => 'justify-content-center']);
diff --git a/application/modules/opac/views/scripts/abonne/edit-review.phtml b/application/modules/opac/views/scripts/abonne/edit-review.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..66a71f1546898c9bb4b3bd9f3e15f4ba3f6ce4b5
--- /dev/null
+++ b/application/modules/opac/views/scripts/abonne/edit-review.phtml
@@ -0,0 +1,3 @@
+<?php
+echo $this->div(['class' => 'p-3 m-3'],
+                $this->renderReviewForm($this->review));
diff --git a/library/Class/AvisNotice.php b/library/Class/AvisNotice.php
index 028b6ddd9e6f880ccbaaa68cd138e7ba93d6f0aa..2f7820332623152e0b5d46cff82ee6a3ef4e5a80 100644
--- a/library/Class/AvisNotice.php
+++ b/library/Class/AvisNotice.php
@@ -518,4 +518,12 @@ class Class_AvisNotice  extends Storm_Model_Abstract {
   public function getHumanDate() {
     return Class_Date::humanDate($this->getDateAvis(), 'd MMMM yyyy HH:mm');
   }
+
+
+  public function isMine() {
+    if (!$user = Class_Users::getIdentity())
+      return false;
+
+    return  $user == $this->getUser();
+  }
 }
\ No newline at end of file
diff --git a/library/Class/ScriptLoader.php b/library/Class/ScriptLoader.php
index 210bdb7e02fcf237aa2538903d12746896a2bd63..b9968a0b3da9cd6496c4f069aca0eed7d0d856c7 100644
--- a/library/Class/ScriptLoader.php
+++ b/library/Class/ScriptLoader.php
@@ -842,6 +842,17 @@ class Class_ScriptLoader {
   }
 
 
+  public function addSearchInputToContainer($container, $input, $toggle_selectors) {
+    $options = json_encode(['input' => $input,
+                            'fixed_display' => $toggle_selectors]);
+
+    $jquery = sprintf('$("%s").search_input(%s);', $container, $options);
+
+    return $this->addOPACPluginScript('search_input/search_input.js')
+                ->addJQueryReady($jquery);
+  }
+
+
   public function formToTabs($node) {
     return $this->addOPACPluginScript('form_to_tabs/form_to_tabs.js')
                 ->addJQueryReady(sprintf('$("%s").form_to_tabs();',
diff --git a/library/Class/User/BookmarkedSearch.php b/library/Class/User/BookmarkedSearch.php
index 7ac98d8e5db8ac1d5778ee5cf323fd85f6a6e539..84f25e6729b288785140be30fae07cf05db3a00b 100644
--- a/library/Class/User/BookmarkedSearch.php
+++ b/library/Class/User/BookmarkedSearch.php
@@ -46,26 +46,70 @@ class Class_User_BookmarkedSearch extends Storm_Model_Abstract {
                                   'notified' => 0,
                                   'creation_date' => '',
                                   'criterias' => '',
-                                  'id_user' => '']
-    ;
+                                  'id_user' => ''],
+
+    $_search_result = null,
+    $_records = [];
 
 
   public function getUnserializedCriterias() {
-    if(!$criterias = unserialize($this->getCriterias()))
+    $criterias = $this->getCriterias();
+
+    if (is_object($criterias))
+      return $criterias
+        ->unsetParam('tri')
+        ->unsetParam('page')
+        ->unsetParam('liste_format')
+        ->unsetParam('page_size');
+
+    if(!$criterias = unserialize($criterias))
       return null;
-    return $criterias->unsetParam('page');
+
+    if (is_object($criterias))
+      return $criterias
+        ->unsetParam('tri')
+        ->unsetParam('page')
+        ->unsetParam('liste_format')
+        ->unsetParam('page_size');
+
+    return null;
   }
 
 
   public function getCriteriasUrl() {
     if (!$criterias = $this->getUnserializedCriterias())
-      return '/recherche/simple';
+      return ['controller'=>'recherche',
+              'action' => 'simple'];
+
     return $criterias->getUrlCriteresWithFacettes();
   }
 
 
   public function belongsTo($user) {
-    return $this->getIdUser() == $user->getId();
+    if ($this->getIdUser() == $user->getId())
+      return true;
+
+    return $this->getExistingFor($user) ? true : false;
+  }
+
+
+  public function getExistingFor($user) {
+    foreach($user->getBookmarkedSearches() as $search)
+      if ($search->getCriteriasUrl() == $this->getCriteriasUrl())
+        return $search;
+
+    return null;
+  }
+
+
+  public function getExistingIdFor($user) {
+    if (!$user)
+      return null;
+
+    if (!$search = $this->getExistingFor($user))
+      return null;
+
+    return $search->getId();
   }
 
 
@@ -89,6 +133,27 @@ class Class_User_BookmarkedSearch extends Storm_Model_Abstract {
   }
 
 
+  public function getSearchResult() {
+    if ($this->_search_result)
+      return $this->_search_result;
+
+    if (!$criterias = $this->getUnserializedCriterias())
+      return new Class_MoteurRecherche_Result;
+
+    return $this->_search_result =
+      Class_MoteurRecherche::getInstance()
+      ->lancerRecherche($criterias);
+  }
+
+
+  public function getRecords() {
+    if ($this->_records)
+      return $this->_records;
+
+    return $this->_records = $this->getSearchResult()->fetchRecords();
+  }
+
+
   public function beforeSave() {
     if ($this->isNew())
       $this->setCreationDate($this->getCurrentDateTime());
diff --git a/library/ZendAfi/Controller/Action/Helper/FlashMessenger/Notification.php b/library/ZendAfi/Controller/Action/Helper/FlashMessenger/Notification.php
index ab170e885b87e27580c2979a16e933eaed941bd4..f03a329b5fd8b58c1ef8e005bc465feb0e6c2c88 100644
--- a/library/ZendAfi/Controller/Action/Helper/FlashMessenger/Notification.php
+++ b/library/ZendAfi/Controller/Action/Helper/FlashMessenger/Notification.php
@@ -56,6 +56,4 @@ class ZendAfi_Controller_Action_Helper_FlashMessenger_Notification {
   public function getActions() {
     return $this->hasActions() ? $this->_params[self::ACTIONS] : [];
   }
-}
-
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/library/ZendAfi/Controller/Plugin/Manager/BookmarkedSearches.php b/library/ZendAfi/Controller/Plugin/Manager/BookmarkedSearches.php
index 2da94758d30df04aa827204850310e5da934e2fe..54dc32ec9604a7dfc1f6b18bcb40f3ff9e59d346 100644
--- a/library/ZendAfi/Controller/Plugin/Manager/BookmarkedSearches.php
+++ b/library/ZendAfi/Controller/Plugin/Manager/BookmarkedSearches.php
@@ -39,9 +39,13 @@ class ZendAfi_Controller_Plugin_Manager_BookmarkedSearches extends ZendAfi_Contr
 
 
   protected function _getCriterias() {
-    if (!$searches = (new Class_SearchHistory())->getHistory())
-      return null;
+    $criteria = (new Class_CriteresRecherche)
+      ->setParams($this->_request->getParams());
 
+    if (!empty($criteria->getCriteres()))
+      return serialize($criteria);
+
+    $searches = (new Class_SearchHistory())->getHistory();
     return array_pop($searches);
   }
 
@@ -64,7 +68,7 @@ class ZendAfi_Controller_Plugin_Manager_BookmarkedSearches extends ZendAfi_Contr
 
 
   protected function _redirectToIndex() {
-    return $this->_redirectClose('abonne/settings');
+    return $this->_redirectClose($this->_getReferer());
   }
 
 
diff --git a/library/ZendAfi/View/Helper/Div.php b/library/ZendAfi/View/Helper/Div.php
index f265670499b81813b71519d787babb77a80b90a9..756c4b3869301b8696af1bae9138d7065f31fc82 100644
--- a/library/ZendAfi/View/Helper/Div.php
+++ b/library/ZendAfi/View/Helper/Div.php
@@ -21,7 +21,7 @@
 
 
 class ZendAfi_View_Helper_Div extends ZendAfi_View_Helper_BaseHelper {
-  public function div($attributes = [], $content = []) {
+  public function div($attributes = [], $content = '') {
     return $this->_tag('div',
                        $content,
                        $attributes);
diff --git a/library/ZendAfi/View/Helper/Notice/Articles.php b/library/ZendAfi/View/Helper/Notice/Articles.php
index 3038003fa7814c83e88e0e8eabcbfb436ee59999..68765c1c51a021b769459b31840b6628b999f011 100644
--- a/library/ZendAfi/View/Helper/Notice/Articles.php
+++ b/library/ZendAfi/View/Helper/Notice/Articles.php
@@ -24,6 +24,6 @@ class ZendAfi_View_Helper_Notice_Articles extends ZendAfi_View_Helper_BaseHelper
   public function Notice_Articles($record) {
     $articles = $record->getArticlesPeriodique($record->getId());
     $notice_html = new Class_NoticeHtml();
-    return $this->_sendResponseWithScripts($notice_html->getArticlesPeriodique($periodiques));
+    return $notice_html->getArticlesPeriodique($periodiques);
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Assets/css/intonation.css b/library/templates/Intonation/Assets/css/intonation.css
index 8b9225300e482e6c2b7eb193c895a47b8b5c6829..c3c70e14d8bf1fd7915fad2909728fa847677b5c 100644
--- a/library/templates/Intonation/Assets/css/intonation.css
+++ b/library/templates/Intonation/Assets/css/intonation.css
@@ -444,4 +444,8 @@ header.col {
 
 .opac .bouton.back {
     display: none;
+}
+
+.card .card-columns {
+    column-gap: 0.05rem;
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/Settings.php b/library/templates/Intonation/Library/Settings.php
index 48a95f9b440d4c2f8cd7bce6ba2bd0cd0ccc450e..e1adff9f0cf46bcd4d54394dd889644ea2385447 100644
--- a/library/templates/Intonation/Library/Settings.php
+++ b/library/templates/Intonation/Library/Settings.php
@@ -74,12 +74,12 @@ class Intonation_Library_Settings extends Intonation_System_Abstract {
                                                   'div class boutons' => 'row justify-content-around my-3',
                                                   'label' => 'col-12 col-sm-5 col-form-label col-form-label-sm pr-1',
                                                   'label class multi-element-label' => 'col-form-label col-form-label-sm',
-                                                  'input' => 'mb-2 form-control form-control-sm',
+                                                  'input' => 'mb-2 form-control',
                                                   'input data-spambots true' => '',
                                                   'input type checkbox' => 'form-check-input form-check-input-sm mr-1',
                                                   'input type submit' => 'btn btn-sm btn-primary',
-                                                  'textarea' => 'form-control form-control-sm',
-                                                  'select' => 'form-control form-control-sm custom-select',
+                                                  'textarea' => 'form-control',
+                                                  'select' => 'form-control form-control custom-select',
                                                   'button' => 'btn btn-secondary',
                                                   'button class btn' => '',
                                                   'button class accessibility' => 'btn btn-light',
@@ -106,7 +106,9 @@ class Intonation_Library_Settings extends Intonation_System_Abstract {
                                                   'a class list-group-item' => '',
                                                   'a class account-loans' => 'btn btn-sm list-group-item-info',
                                                   'ul' => 'list-unstyled',
+                                                  'div class _notify' => 'alert-warning',
                                                   'div class success_notify' => 'alert-success',
+                                                  'div class delete_notify' => 'alert-danger',
                                                   'form class indent-form' => 'px-4 py-1',
                                                   'div class card_article' => 'col-12 mb-3',
                                                   'h1 class content_title' => 'p-3 m-1',
@@ -145,8 +147,12 @@ class Intonation_Library_Settings extends Intonation_System_Abstract {
                                                   'date-edition' => 'class fas fa-file-signature',
                                                   'settings' => 'class fas fa-user-cog',
                                                   'selection' => 'class fas fa-heart',
+                                                  'no-selection' => 'class far fa-heart',
                                                   'subscription' => 'class fas fa-euro-sign',
                                                   'card-number' => 'class fas fa-barcode',
+                                                  'read-document' => 'class far fa-arrow-alt-circle-right',
+                                                  'read-review' => 'class far fa-comment-dots',
+
                           ],
 
                           'icons_map_utils' => ['image_place_holder' => '/library/templates/Intonation/Assets/images/image_place_holder.png',
diff --git a/library/templates/Intonation/Library/View/Wrapper/Abstract.php b/library/templates/Intonation/Library/View/Wrapper/Abstract.php
index 86aacd9c9a44994b1d31276021fc5e7ee17d0737..715ecef735144ccc8e33998201324c3c3529e52a 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Abstract.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Abstract.php
@@ -65,9 +65,20 @@ abstract class Intonation_Library_View_Wrapper_Abstract {
   }
 
 
+  public function getContentForJSSearch() {
+    return $this->_view->dNone(implode(' ', [$this->getMainTitle(),
+                                             $this->getSecondaryTitle(),
+                                             $this->getDescription(),
+                                             $this->getBadges(),
+                                             '%s']));
+  }
+
+
   abstract public function getMainTitle();
   abstract public function getMainLink();
 
+  abstract public function getEmbedMedia();
+  abstract public function getHtmlPicture();
   abstract public function getPicture();
   abstract public function getPictureAction();
 
diff --git a/library/templates/Intonation/Library/View/Wrapper/Article.php b/library/templates/Intonation/Library/View/Wrapper/Article.php
index 3328db74667f749adb481b08ce0eb6aa3891caca..0af9bb71f81ec1ac5a2b54d1e530f71643c2a7c4 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Article.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Article.php
@@ -78,7 +78,7 @@ class Intonation_Library_View_Wrapper_Article extends Intonation_Library_View_Wr
 
 
   public function getDescriptionTitle() {
-    return $this->_('Résumé de l\'article "%s"', $this->getTitle());
+    return $this->_('Résumé de l\'article "%s"', $this->_model->getTitre());
   }
 
 
@@ -103,4 +103,14 @@ class Intonation_Library_View_Wrapper_Article extends Intonation_Library_View_Wr
   public function getActions() {
     return [];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/View/Wrapper/Hold.php b/library/templates/Intonation/Library/View/Wrapper/Hold.php
index bf74f910a8624bd85264f277f394a0e6d937ae00..8f4f46d92ba9af961ab4688b5016a88d06476ca0 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Hold.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Hold.php
@@ -86,7 +86,7 @@ class Intonation_Library_View_Wrapper_Hold extends Intonation_Library_View_Wrapp
 
   public function getMainLink() {
     if (!$this->_model->getNoticeOPAC())
-      return '';
+      return null;
 
     $wrapper = (new Intonation_Library_View_Wrapper_Record)
       ->setView($this->_view)
@@ -95,7 +95,7 @@ class Intonation_Library_View_Wrapper_Hold extends Intonation_Library_View_Wrapp
     return $wrapper->getMainLink();
 
     if (!$this->_model->isRenewable())
-      return '';
+      return null;
 
     return new Intonation_Library_Link(['Url' => $this->_view->url(['controller' => 'abonne',
                                                                     'action' => 'prolongerPret',
@@ -169,4 +169,14 @@ class Intonation_Library_View_Wrapper_Hold extends Intonation_Library_View_Wrapp
   public function getActions() {
     return [];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
diff --git a/library/templates/Intonation/Library/View/Wrapper/Item.php b/library/templates/Intonation/Library/View/Wrapper/Item.php
index c44c757fad662bb9647e68bec79025dbd3213b2c..44d4b62e64dff18993bc08a51e048f1cb24098fb 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Item.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Item.php
@@ -147,4 +147,14 @@ class Intonation_Library_View_Wrapper_Item extends Intonation_Library_View_Wrapp
   public function getActions() {
     return [];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
diff --git a/library/templates/Intonation/Library/View/Wrapper/Loan.php b/library/templates/Intonation/Library/View/Wrapper/Loan.php
index ba56697fca7bcc4ed53a2165b956dbc0a0a43efd..cf4e1e48dd8b701bba6846c15dc321faad11a83a 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Loan.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Loan.php
@@ -45,7 +45,7 @@ class Intonation_Library_View_Wrapper_Loan extends Intonation_Library_View_Wrapp
       ->setView($this->_view)
       ->setModel($this->_model->getNoticeOPAC());
 
-    return $wrapper->getAuthor();
+    return $wrapper->getSecondaryTitle();
   }
 
 
@@ -74,7 +74,8 @@ class Intonation_Library_View_Wrapper_Loan extends Intonation_Library_View_Wrapp
       ->setView($this->_view)
       ->setModel($this->_model->getNoticeOPAC());
 
-    return $wrapper->getDescription();
+    return $this->getBadges()
+      . $wrapper->getDescription();
   }
 
 
@@ -85,7 +86,7 @@ class Intonation_Library_View_Wrapper_Loan extends Intonation_Library_View_Wrapp
 
   public function getMainLink() {
     if (!$this->_model->getNoticeOPAC())
-      return '';
+      return null;
 
     $wrapper = (new Intonation_Library_View_Wrapper_Record)
       ->setView($this->_view)
@@ -144,14 +145,48 @@ class Intonation_Library_View_Wrapper_Loan extends Intonation_Library_View_Wrapp
 
 
   public function getBadges() {
-    if (!$this->_model->getNoticeOPAC())
-      return null;
-
-    $wrapper = (new Intonation_Library_View_Wrapper_Record)
-      ->setView($this->_view)
-      ->setModel($this->_model->getNoticeOPAC());
-
-    return $wrapper->getBadges();
+    $issue_date = $this->_model->getIssueDate();
+    $return_date = $this->_model->getDateRetour();
+
+    $badges = [
+               ['tag' => 'span',
+                'class' => 'info',
+                'text' => Class_Template::current()->getIco($this->_view,
+                                                            'loan',
+                                                            'library')
+                . $issue_date,
+                'title' => $this->_('Date d\'emprunt : %s', $issue_date)],
+
+               ['tag' => 'span',
+                'class' => ($this->_model->isLate()
+                            ? 'danger'
+                            : 'success'),
+                'text' => Class_Template::current()->getIco($this->_view,
+                                                            'return-date',
+                                                            'library')
+                . $return_date,
+                'title' => $this->_('Date de retour : %s', $return_date)],
+
+               ['tag' => 'span',
+                'class' => 'info',
+                'text' => ($this->_model->getOnHold()
+                           ? (Class_Template::current()->getIco($this->_view,
+                                                                'thumbtack',
+                                                                'library')
+                              . $this->_('Réservé'))
+                           : ''),
+                'title' => $this->_('Exemplaire réservé')],
+
+               ['tag' => 'span',
+                'class' => 'info',
+                'text' => ($this->_model->getRenewals()
+                           ? (Class_Template::current()->getIco($this->_view,
+                                                                'available',
+                                                                'library')
+                              . $this->_('Déjà prolongé')) : ''),
+                'title' => $this->_('Exemplaire déjà prolongé')]];
+
+    return $this->_view->renderBadges($badges);
   }
 
 
@@ -166,4 +201,14 @@ class Intonation_Library_View_Wrapper_Loan extends Intonation_Library_View_Wrapp
                                          'Title' => $this->_('Prolonger l\'emprunt %s',
                                                              $this->_model->getTitre())])];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
diff --git a/library/templates/Intonation/Library/View/Wrapper/Newsletter.php b/library/templates/Intonation/Library/View/Wrapper/Newsletter.php
index d6ef4eddf84e18f272077f496d9dfce176e9fe6d..a33135456dcfd0ef5df148e3022b0caf3570873e 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Newsletter.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Newsletter.php
@@ -27,6 +27,27 @@ class Intonation_Library_View_Wrapper_Newsletter extends Intonation_Library_View
 
 
   public function getMainLink() {
+    $params = $this->_model->hasRecipient(Class_Users::getIdentity())
+      ? ['Url' => $this->_view->url(['controller' => 'abonne',
+                                     'action' => 'unsubscribe-newsletter',
+                                     'id' => $this->_model->getId()]),
+         'Text' => $this->_view->_("Me désinscrire"),
+         'Title' => $this->_view->_("Me désinscrire à la lettre d'information %s", $this->_model->getTitre()),
+         'Image' => Class_Template::current()->getIco($this->_view,
+                                                      'selection',
+                                                      'library'),
+         'Popup' => true]
+      : ['Url' => $this->_view->url(['controller' => 'abonne',
+                                     'action' => 'subscribe-newsletter',
+                                     'id' => $this->_model->getId()]),
+         'Text' => $this->_view->_("M'inscrire"),
+         'Title' => $this->_view->_("M'inscrire à la lettre d'information %s", $this->_model->getTitre()),
+         'Image' => Class_Template::current()->getIco($this->_view,
+                                                      'no-selection',
+                                                      'library'),
+         'Popup' => true];
+
+    return new Intonation_Library_Link($params);
   }
 
 
@@ -52,6 +73,7 @@ class Intonation_Library_View_Wrapper_Newsletter extends Intonation_Library_View
 
 
   public function getActions() {
+    return [];
   }
 
 
@@ -75,4 +97,14 @@ class Intonation_Library_View_Wrapper_Newsletter extends Intonation_Library_View
 
   public function getDocTypeLabel() {
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
diff --git a/library/templates/Intonation/Library/View/Wrapper/Record.php b/library/templates/Intonation/Library/View/Wrapper/Record.php
index 18a826a9ff4778ef123503089882963c18bc84c8..ea5c5e69cd0a32db519515b55be6b5d690642c2f 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Record.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Record.php
@@ -107,4 +107,14 @@ class Intonation_Library_View_Wrapper_Record extends Intonation_Library_View_Wra
   public function getActions() {
     return [];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/View/Wrapper/RecordToRate.php b/library/templates/Intonation/Library/View/Wrapper/RecordToRate.php
index 88e4ab78de2870c3fc3e6f538f2d08fe8a29cdcd..c20e3631fec8c7931bfc244ceea6fa7ee2b7082b 100644
--- a/library/templates/Intonation/Library/View/Wrapper/RecordToRate.php
+++ b/library/templates/Intonation/Library/View/Wrapper/RecordToRate.php
@@ -21,7 +21,7 @@
 
 
 class Intonation_Library_View_Wrapper_RecordToRate extends Intonation_Library_View_Wrapper_Record {
-  public function getActions() {
+  public function getDescription() {
     $me = Class_Users::getIdentity();
     $mine = ($mine = $me->getFirstAvisByIdNotice($this->_model->getId()))
       ? $mine
@@ -36,10 +36,23 @@ class Intonation_Library_View_Wrapper_RecordToRate extends Intonation_Library_Vi
     $form = ZendAfi_Form_Review::newWith($mine->toArray())
       ->setAction($this->_view->url($params, null, true));
 
-    return [$this->_view->div(['class' => 'col-12'],
-                       $this->_view->tag('h3', $this->_('Votre avis'), ['class' => 'card-title'])
-                       . $this->_view->div(['class' => 'card'],
-                                     $this->_view->div(['class' => 'card-body'],
-                                                 $this->_view->renderForm($form))))];
+    $form->getElement('entete')->setValue($this->_model->getTitrePrincipal(' '));
+
+    return parent::getDescription()
+      . $this->_view->grid($this->_view->div(['class' => 'col-12 py-3 my-3'],
+                                             $this->_view->tag('h3', $this->_('Donnez votre avis'), ['class' => 'card-title'])
+                                             . $this->_view->div(['class' => 'card'],
+                                                                 $this->_view->div(['class' => 'card-body'],
+                                                                                   $this->_view->renderForm($form)))));
+  }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/View/Wrapper/Review.php b/library/templates/Intonation/Library/View/Wrapper/Review.php
index 50353c09f1edd33e9a16ba21bba62803974933dd..898737be0f295231ca513b49589dc7814e1f8434 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Review.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Review.php
@@ -39,7 +39,9 @@ class Intonation_Library_View_Wrapper_Review extends Intonation_Library_View_Wra
 
 
   public function getSecondaryTitle() {
-    return $this->_model->getAuthorName();
+    return $this->_model->isMine()
+      ? $this->_('Vous')
+      : $this->_model->getAuthorName();
   }
 
 
@@ -61,6 +63,10 @@ class Intonation_Library_View_Wrapper_Review extends Intonation_Library_View_Wra
                                                                       'id' => $this->_model->getId()],
                                                                      null,
                                                                      true),
+                                          'Image' => Class_Template::current()->getIco($this->_view,
+                                                                                       'read-review',
+                                                                                       'library'),
+
                                           'Text' => $this->_('Lire l\'avis'),
                                           'Title' => $this->_getMainLinkTitle(),
                                           'Popup' => true]);
@@ -122,9 +128,54 @@ class Intonation_Library_View_Wrapper_Review extends Intonation_Library_View_Wra
     if (!$record = $this->_model->getFirstNotice())
       return [];
 
-    return [$this->_view->tagAnchor($record->getAbsoluteUrl(),
-                                    $this->_('Voir le document'),
-                                    ['title' => $this->_('Voir le document %s',
-                                                         $record->getTitrePrincipal(' '))])];
+    $actions = [new Intonation_Library_Link(['Url' => $record->getAbsoluteUrl(),
+                                             'Image' => Class_Template::current()->getIco($this->_view,
+                                                                                          'read-document',
+                                                                                          'library'),
+                                             'Text' => $this->_('Voir le document'),
+                                             'Title' => $this->_('Voir le document %s',
+                                                                 $record->getTitrePrincipal(' '))])];
+    if (!$this->_model->isMine())
+      return $actions;
+
+    $actions [] = new Intonation_Library_Link(['Url' => $this->_view->url(['controller' => 'abonne',
+                                                                           'action' => 'edit-review',
+                                                                           'id' => $this->_model->getId()]),
+                                               'Image' => Class_Template::current()->getIco($this->_view,
+                                                                                            'edit',
+                                                                                            'utils'),
+                                               'Text' => $this->_('Modifier'),
+                                               'Title' => $this->_('Modifier l\'avis %s',
+                                                                   $this->_model->getEntete()),
+                                               'Popup' => true]);
+
+    $actions [] = new Intonation_Library_Link(['Url' => $this->_view->url(['controller' => 'abonne',
+                                                                           'action' => 'delete-review',
+                                                                           'id' => $this->_model->getId()]),
+                                               'Image' => Class_Template::current()->getIco($this->_view,
+                                                                                            'delete',
+                                                                                            'utils'),
+                                               'Text' => $this->_('Supprimer'),
+                                               'Title' => $this->_('Supprimer l\'avis %s',
+                                                                   $this->_model->getEntete()),
+                                               'Popup' => true]);
+
+    return $actions;
+  }
+
+
+  public function getContentForJSSearch() {
+    return sprintf(parent::getContentForJSSearch(),
+                   $this->_('%d/5 note étoile avis',$this->_model->getNote()));
+  }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/View/Wrapper/ReviewsByRecord.php b/library/templates/Intonation/Library/View/Wrapper/ReviewsByRecord.php
index 2302bb3aef1f7c01187f2fee1469529abc07c885..0e60765019282e061462b4c98326bd6b0b4df7c7 100644
--- a/library/templates/Intonation/Library/View/Wrapper/ReviewsByRecord.php
+++ b/library/templates/Intonation/Library/View/Wrapper/ReviewsByRecord.php
@@ -125,6 +125,16 @@ class Intonation_Library_View_Wrapper_ReviewsByRecord extends Intonation_Library
 
 
   public function getActions() {
+    return [];
+  }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
     return '';
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/View/Wrapper/Search.php b/library/templates/Intonation/Library/View/Wrapper/Search.php
index 37a89425e2db4b1907655ec374d5b9081a919bdb..fab468cd18870f70016e6ada99be580c6c707d43 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Search.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Search.php
@@ -28,7 +28,7 @@ class Intonation_Library_View_Wrapper_Search extends Intonation_Library_View_Wra
 
 
   public function getSecondaryTitle() {
-    return $this->_model->getUser()->getLoginOrFullName();
+    return '';
   }
 
 
@@ -43,17 +43,52 @@ class Intonation_Library_View_Wrapper_Search extends Intonation_Library_View_Wra
 
 
   public function getMainLink() {
-    return null;
+    $id = $this->_model->getExistingIdFor(Class_Users::getIdentity());
+    $can_follow = !$id;
+    return new Intonation_Library_Link(['Url' => $this->_view->url(array_merge($this->_model->getCriteriasUrl(),
+                                                                               ['controller' => 'bookmarked-searches',
+                                                                                'action' => $can_follow ? 'add' : 'delete',
+                                                                                'label' => $this->getMainTitle(),
+                                                                                'id' => $id])),
+                                        'Image' => Class_Template::current()->getIco($this->_view,
+                                                                                     ($can_follow
+                                                                                      ? 'no-selection'
+                                                                                      : 'selection'),
+                                                                                     'library'),
+                                        'Text' => ($can_follow
+                                                   ? $this->_('Suivre')
+                                                   : $this->_('Suivie')),
+                                        'Title' => ($can_follow
+                                                    ? $this->_('Suivre cette recherche')
+                                                    : $this->_('Ne plus suivre cette recherche.')),
+                                        'Tag' => 'button',
+                                        'Attribs' => ['data-popup' => true,
+                                                      'class' => 'btn btn-primary text-white']]);
   }
 
 
-  protected  function _getMainLinkTitle() {
+  public function getPicture() {
     return '';
   }
 
 
-  public function getPicture() {
-    return '';
+  public function getHtmlPicture() {
+    $records = $this->_model->getRecords();
+
+    if (!$records = array_slice($records, 0, 9))
+      return '';
+
+    return
+      $this->_view->renderWall(new Storm_Collection($records),
+                               function($record)
+                               {
+                                 return
+                                   $this->_view
+                                   ->cardifyWithOverlay(
+                                                        (new Intonation_Library_View_Wrapper_Record)
+                                                        ->setModel($record)
+                                                        ->setView($this->_view));
+                               });
   }
 
 
@@ -62,13 +97,21 @@ class Intonation_Library_View_Wrapper_Search extends Intonation_Library_View_Wra
   }
 
 
-  public function getDescription() {
+  public function getEmbedMedia() {
     return '';
   }
 
 
+  public function getDescription() {
+    return
+      $this->getBadges()
+      . BR
+      . $this->_view->Search_Criterias($this->_model->getUnserializedCriterias());
+  }
+
+
   public function getDescriptionTitle() {
-    return '';
+    return $this->_('Détail des critères de recherche');
   }
 
 
@@ -83,11 +126,27 @@ class Intonation_Library_View_Wrapper_Search extends Intonation_Library_View_Wra
 
 
   public function getBadges() {
-    return '';
+    $result = $this->_model->getSearchResult();
+
+    $badges = [['tag' => 'span',
+                'class' => 'info',
+                'text' => $this->_('Nombre de résultats : %s',
+                                   $this->_view->tag('span',
+                                                     $result->getRecordsCount(),
+                                                     ['class' => 'badge badge-light'])),
+                'title' => $this->_('Le nombre de résultats pour la recherche %s', $this->getMainTitle())]];
+    return $this->_view->renderBadges($badges);
   }
 
 
   public function getActions() {
-    return [];
+    return [new Intonation_Library_Link(['Url' => $this->_view->url($this->_model->getCriteriasUrl()),
+                                         'Text' => $this->_('Voir'),
+                                         'Title' => $this->_('Voir le résultat de recherche'),
+                                         'Tag' => 'button',
+                                         'Image' => Class_Template::current()->getIco($this->_view,
+                                                                                      'search_more',
+                                                                                      'library'),
+                                         'Attribs' => ['class' => 'btn btn-primary text-white']])];
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/View/Wrapper/Selection.php b/library/templates/Intonation/Library/View/Wrapper/Selection.php
index 33385756dfc0fd96b68591112984cfe8898fdaf0..de2b2b86926637ab6ec632f8d399b29cc42dc7c0 100644
--- a/library/templates/Intonation/Library/View/Wrapper/Selection.php
+++ b/library/templates/Intonation/Library/View/Wrapper/Selection.php
@@ -53,7 +53,6 @@ class Intonation_Library_View_Wrapper_Selection extends Intonation_Library_View_
 
 
   public function getMainLink() {
-    return '';
   }
 
 
@@ -85,4 +84,14 @@ class Intonation_Library_View_Wrapper_Selection extends Intonation_Library_View_
   public function getActions() {
     return [];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
diff --git a/library/templates/Intonation/Library/View/Wrapper/User.php b/library/templates/Intonation/Library/View/Wrapper/User.php
index 94cac3364996d748fd348a19bbd21ba46602aecd..377cd559f5d8601484d3a38365fcd159ff5ead32 100644
--- a/library/templates/Intonation/Library/View/Wrapper/User.php
+++ b/library/templates/Intonation/Library/View/Wrapper/User.php
@@ -102,4 +102,14 @@ class Intonation_Library_View_Wrapper_User extends Intonation_Library_View_Wrapp
                                          'Text' => $this->_('Modifier'),
                                          'Title' => $this->_('Modifier les informations de mon compte')])];
   }
+
+
+  public function getEmbedMedia() {
+    return '';
+  }
+
+
+  public function getHtmlPicture() {
+    return '';
+  }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Definition.php b/library/templates/Intonation/Library/Widget/Carousel/Definition.php
index 8dee4bf7704c5307ce45a99bfe4b59bf0bd2190e..55131e17969e49938ec48063403627fdc8ca804a 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Definition.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Definition.php
@@ -25,10 +25,13 @@ class Intonation_Library_Widget_Carousel_Definition extends Class_Systeme_Module
   const
     WALL = 'wall',
     CAROUSEL = 'carousel',
+    LISTING = 'list',
+    LISTING_WITH_OPTIONS = 'list_with_options',
     MULTIPLE_CAROUSEL = 'multiple_carousel',
 
     CARD_OVERLAY = 'card-overlay',
     CARD_DESCRIPTION = 'card-description',
+    HORIZONTAL_CARD = 'card-horizontal',
     CARD = 'card';
 
 
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Form.php b/library/templates/Intonation/Library/Widget/Carousel/Form.php
index eb6c25038addc636ae96ff74c2ca01256fa90a8f..eb88e03243d097ef4a95b5b2ab10406db618c004 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Form.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Form.php
@@ -94,6 +94,8 @@ class Intonation_Library_Widget_Carousel_Form extends ZendAfi_Form_Configuration
   public function getLayouts() {
     return [Intonation_Library_Widget_Carousel_Definition::CAROUSEL => $this->_('Carousel'),
             Intonation_Library_Widget_Carousel_Definition::MULTIPLE_CAROUSEL => $this->_('Carousel à colonnes'),
+            Intonation_Library_Widget_Carousel_Definition::LISTING => $this->_('Liste'),
+            Intonation_Library_Widget_Carousel_Definition::LISTING_WITH_OPTIONS => $this->_('Liste a interactions'),
             Intonation_Library_Widget_Carousel_Definition::WALL => $this->_('Mur')];
   }
 
@@ -101,6 +103,7 @@ class Intonation_Library_Widget_Carousel_Form extends ZendAfi_Form_Configuration
   public function getRenderings() {
     return [Intonation_Library_Widget_Carousel_Definition::CARD_OVERLAY => $this->_('Média'),
             Intonation_Library_Widget_Carousel_Definition::CARD => $this->_('Média suivi par une description'),
+            Intonation_Library_Widget_Carousel_Definition::HORIZONTAL_CARD => $this->_('Média suivi par une description horizontal'),
             Intonation_Library_Widget_Carousel_Definition::CARD_DESCRIPTION => $this->_('Uniquement une description')];
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/Library/Widget/Carousel/View.php b/library/templates/Intonation/Library/Widget/Carousel/View.php
index ede118c705ad4f6939a386caab2d595815b03fd7..9a95fae846932c54a15df1462da08ac947761a17 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/View.php
@@ -133,6 +133,12 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
     if (Intonation_Library_Widget_Carousel_Definition::CAROUSEL == $layout)
       return $this->view->renderCarousel($elements, $content_callback);
 
+    if (Intonation_Library_Widget_Carousel_Definition::LISTING == $layout)
+      return $this->view->renderList($elements, $content_callback);
+
+    if (Intonation_Library_Widget_Carousel_Definition::LISTING_WITH_OPTIONS == $layout)
+      return $this->view->renderTruncateList($elements, $content_callback);
+
     return $this->view->renderMultipleCarousel($elements, $content_callback);
   }
 
@@ -156,6 +162,12 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
           return $this->view->cardifyOnlyDescription($element);
         };
 
+    if ($this->_settings->getRendering() == Intonation_Library_Widget_Carousel_Definition::HORIZONTAL_CARD)
+      return function ($element)
+        {
+          return $this->view->cardifyHorizontal($element);
+        };
+
     return function() {return '';};
   }
 
diff --git a/library/templates/Intonation/Library/Widget/Notify/View.php b/library/templates/Intonation/Library/Widget/Notify/View.php
index 415b6606b76ad93590347862ccf8851472c27f1c..c1e962a5a1a12d501e8630d085a6588236d57ec2 100644
--- a/library/templates/Intonation/Library/Widget/Notify/View.php
+++ b/library/templates/Intonation/Library/Widget/Notify/View.php
@@ -58,7 +58,7 @@ $("#%1$s .alert").on("closed.bs.alert", function() {
                                                                                        'title' => $this->_('Masquer la notification'),
                                                                                        'aria-label' => $this->_('Masquer la notification')])),
                                                    ['role' => 'alert',
-                                                    'class' => 'alert alert-dismissible ' .$alert->getStatus() . '_notify']);
+                                                    'class' => 'alert alert-dismissible ' . $alert->getStatus() . '_notify']);
                             return $html;
                           });
 
diff --git a/library/templates/Intonation/View/Abonne/FollowASearch.php b/library/templates/Intonation/View/Abonne/FollowASearch.php
index f3a0bad2890c21b62029f3336ac8731e330d9506..f20024d231e07e3907eda7ff11c534bcb0857dc5 100644
--- a/library/templates/Intonation/View/Abonne/FollowASearch.php
+++ b/library/templates/Intonation/View/Abonne/FollowASearch.php
@@ -24,19 +24,49 @@ class Intonation_View_Abonne_FollowASearch extends ZendAfi_View_Helper_BaseHelpe
   public function abonne_FollowASearch($user) {
     $this->view->titre = $this->_('Suivre une recherche');
 
-    $params = ['expressionRecherche' => 'Jean De Brunhoff',
-               'multifacets' => 'T1',
-               'tri' => 'annee desc'];
+    $callback = function($search) {
+      return $this->view->cardify($search);
+    };
 
-    $engine = Class_MoteurRecherche::getInstance();
+    return
+      $this->view->grid(  $this->_div(['class' => 'col-12'],
+                                      $this->_tag('h1', $this->view->titre))
+                        . $this->_div(['class' => 'col-12'],
+                                      $this->_tag('p', $this->_('Suivez une recherche pour être informé dès qu\'une nouveauté est ajoutée.')))
+                        . $this->_div(['class' => 'col-12'],
+                                      $this->view->renderList($this->_getSearches($user), $callback)));
+  }
 
-    $criteria = (new Class_CriteresRecherche())
-      ->setParams($params);
 
-    $search = $engine->lancerRecherche($criteria);
+  protected function _getSearches($user) {
+    $params = [['label' => $this->_('Les livres de Jean De Brunhoff'),
+                'criteria' => ['rech_auteurs' => 'Jean De Brunhoff',
+                               'multifacets' => 'T1',
+                               'no_extension' => '1',
+                               'tri' => 'annee desc']],
 
-    return
-      $this->_tag('h1', $this->view->titre)
-      . $this->view->Search_Result($search);
+               ['label' => $this->_('Les CD de Daft Punk'),
+                'criteria' => ['rech_auteurs' => 'Daft Punk',
+                               'multifacets' => 'T3',
+                               'no_extension' => '1',
+                               'tri' => 'annee desc']],
+
+               ['label' => $this->_('Les revues Science et Vie Junior'),
+                'criteria' => ['rech_titres' => 'science et vie junior',
+                               'multifacets' => 'T2',
+                               'no_extension' => '1',
+                               'tri' => 'annee desc']],
+    ];
+
+    $searches = [];
+    foreach ($params as $param)
+      $searches [] =
+      (new Intonation_Library_View_Wrapper_Search)
+      ->setModel((new Class_User_BookmarkedSearch)
+                 ->setLabel($param['label'])
+                 ->setCriterias((new Class_CriteresRecherche)->setParams($param['criteria'])))
+      ->setView($this->view);
+
+    return new Storm_Collection($searches);
   }
 }
diff --git a/library/templates/Intonation/View/Abonne/Holds.php b/library/templates/Intonation/View/Abonne/Holds.php
index 16acc7ad0835a1ae355e0fc9892aa371e79ccb23..c412502edb3007c1e9da2035fd74dde760e4caf8 100644
--- a/library/templates/Intonation/View/Abonne/Holds.php
+++ b/library/templates/Intonation/View/Abonne/Holds.php
@@ -36,6 +36,6 @@ class Intonation_View_Abonne_Holds extends ZendAfi_View_Helper_BaseHelper {
       return $this->view->cardifyHorizontal($wrapped);
     };
 
-    return $this->view->renderList(new Storm_Collection($holds), $callback);
+    return $this->view->renderTruncateList(new Storm_Collection($holds), $callback);
   }
 }
diff --git a/library/templates/Intonation/View/Abonne/LoansList.php b/library/templates/Intonation/View/Abonne/LoansList.php
index 0fdf1e48e2e053d730617c3c8c8138c9c044fb60..930a5aef60d093be459ab18086959809ea3a4ca5 100644
--- a/library/templates/Intonation/View/Abonne/LoansList.php
+++ b/library/templates/Intonation/View/Abonne/LoansList.php
@@ -107,6 +107,6 @@ class Intonation_View_Abonne_LoansList extends ZendAfi_View_Helper_BaseHelper {
       return $this->view->cardifyHorizontal($wrapped);
     };
 
-    return $this->view->renderList(new Storm_Collection($loans), $callback);
+    return $this->view->renderTruncateList(new Storm_Collection($loans), $callback);
   }
 }
diff --git a/library/templates/Intonation/View/Abonne/RateRecords.php b/library/templates/Intonation/View/Abonne/RateRecords.php
index 82b356bc8dabef9fdde66073223f091c9cce9707..2d3b6473de54790b2ff754943957f5ffa6defbdc 100644
--- a/library/templates/Intonation/View/Abonne/RateRecords.php
+++ b/library/templates/Intonation/View/Abonne/RateRecords.php
@@ -25,12 +25,19 @@ class Intonation_View_Abonne_RateRecords extends ZendAfi_View_Helper_BaseHelper
     $this->view->titre = $this->_('Donner des avis');
 
     $cards = new Class_User_Cards($user);
-    $loans = $cards->getLoans();
+    $loans = $cards->getLoans()->getArrayCopy();
+    $loans = array_merge($loans, $user->getLoansHistory()->getArrayCopy());
     $records_to_rate = [];
 
     foreach ($loans as $loan)
       $records_to_rate [] = $loan->getNoticeOPAC();
 
+    if (empty($records_to_rate))
+      $records_to_rate = Class_Notice::findAllBy(['limit' => 10,
+                                                  'order' => 'date_maj']);
+
+    $records_to_rate = $this->_removeRated($records_to_rate, $user);
+
     $records_to_rate = array_map(function($loan)
                                  {
                                    return (new Intonation_Library_View_Wrapper_RecordToRate)
@@ -44,6 +51,17 @@ class Intonation_View_Abonne_RateRecords extends ZendAfi_View_Helper_BaseHelper
 
     return
       $this->_tag('h1', $this->view->titre)
-      . $this->view->renderList(new Storm_Collection($records_to_rate), $callback);
+      . $this->view->renderCarousel(new Storm_Collection($records_to_rate), $callback);
+  }
+
+
+  protected function _removeRated($records, $user) {
+    $unrated_records = [];
+    foreach ($records as $record)
+      if (!Class_AvisNotice::findFirstBy(['id_user' => $user->getId(),
+                                          'clef_oeuvre' => $record->getClefOeuvre()]))
+          $unrated_records [] = $record;
+
+    return $unrated_records;
   }
 }
diff --git a/library/templates/Intonation/View/BookmarkedSearches.php b/library/templates/Intonation/View/BookmarkedSearches.php
index f2652afc714474845315594c96b2813becc8ffc8..f31e666392e875536559acae9fab9ecdbe580c97 100644
--- a/library/templates/Intonation/View/BookmarkedSearches.php
+++ b/library/templates/Intonation/View/BookmarkedSearches.php
@@ -31,7 +31,7 @@ class Intonation_View_BookmarkedSearches extends ZendAfi_View_Helper_BaseHelper
                             }, $searches);
 
     $callback = function($wrapped) {
-      return $this->view->cardifyOnlyDescription($wrapped);
+      return $this->view->cardifyHorizontal($wrapped);
     };
 
     $html = $this->_tag('h3', $this->_('Mes recherches suivies'));
@@ -46,6 +46,6 @@ class Intonation_View_BookmarkedSearches extends ZendAfi_View_Helper_BaseHelper
 
     return
       $html
-      . $this->view->renderList(new Storm_Collection($searches), $callback);
+      . $this->view->renderTruncateList(new Storm_Collection($searches), $callback);
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/Cardify.php b/library/templates/Intonation/View/Cardify.php
index df7fda1d1031d0a98bad39233e1dd09c517ea6cf..3f8aabca2e68e8d5ce3b8e07e75a3c932079eff4 100644
--- a/library/templates/Intonation/View/Cardify.php
+++ b/library/templates/Intonation/View/Cardify.php
@@ -22,8 +22,7 @@
 
 class Intonation_View_Cardify extends ZendAfi_View_Helper_BaseHelper {
   public function cardify($element) {
-    $img = $this->view->tagImg($element->getPicture(),
-                               ['class' => 'card-img-top']);
+    $img = $this->view->tagMedia($element, ['class' => 'card-img-top']);
 
     if ($link = $element->getMainLink())
       $img = $this->view->tagAnchor($link->getUrl(),
diff --git a/library/templates/Intonation/View/CardifyFullDescription.php b/library/templates/Intonation/View/CardifyFullDescription.php
index 001ab83d1f02d834500bb8fd5d4a9a2bb51a5eac..28f48c9dc5750ffb7605f5116d41c12a760e8623 100644
--- a/library/templates/Intonation/View/CardifyFullDescription.php
+++ b/library/templates/Intonation/View/CardifyFullDescription.php
@@ -23,7 +23,7 @@
 class Intonation_View_CardifyFullDescription extends ZendAfi_View_Helper_BaseHelper {
 
   public function cardifyFullDescription($element) {
-    $content = [];
+    $content = [$element->getContentForJSSearch()];
 
     if ($title = $element->getMainTitle())
       $content [] = $title = $this->_tag('h5',
@@ -49,6 +49,7 @@ class Intonation_View_CardifyFullDescription extends ZendAfi_View_Helper_BaseHel
                              implode($content),
                              ['class' => 'card-body']);
 
-    return implode($html);
+    return $this->view->div(['class' => 'card'],
+                             implode($html));
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/CardifyHorizontal.php b/library/templates/Intonation/View/CardifyHorizontal.php
index bba6e47afa6a371cc0e40b1a2b70ab44746f6640..0ee78a75254678a2f7b2e408e870c1e17ea87a88 100644
--- a/library/templates/Intonation/View/CardifyHorizontal.php
+++ b/library/templates/Intonation/View/CardifyHorizontal.php
@@ -22,16 +22,12 @@
 
 class Intonation_View_CardifyHorizontal extends ZendAfi_View_Helper_BaseHelper {
   public function cardifyHorizontal($element) {
-    $img = $this->view->tagImg($element->getPicture(),
-                               ['class' => 'img-thumbnail']);
+    $img = $this->view->tagMedia($element, ['class' => 'img-thumbnail']);
 
-    if ($link = $element->getMainLink())
-      $img = $this->view->tagAnchor($link->getUrl(),
-                                    $img,
-                                    ['title' => $link->getTitle(),
-                                     'data-popup' => $link->getPopup()]);
+    if ($img_link = $element->getPictureAction())
+      $img = $this->view->tagAction($img_link->setText($img));
 
-        $content = [];
+    $content = [$element->getContentForJSSearch()];
 
     if ($title = $element->getMainTitle())
       $content [] = $title = $this->_tag('h5',
@@ -53,27 +49,23 @@ class Intonation_View_CardifyHorizontal extends ZendAfi_View_Helper_BaseHelper {
                                  'class' => 'card-text']);
 
     $links = [];
-    if ($link)
-      $links [] = $this->view->tagAnchor($link->getUrl(),
-                                        $link->getText(),
-                                        ['title' => $link->getTitle(),
-                                         'data-popup' => $link->getPopup(),
-                                         'class' => 'card-link ' . $link->getClasses()]);
+    if ($link = $element->getMainLink())
+      $links [] = $this->view->tagAction($link);
 
-    $actions = ($actions = $element->getActions())
-      ? $this->view->div(['class' => 'col-12 p-3'],
-                         implode($actions))
-      : '';
+    foreach($element->getActions() as $action)
+      $links [] = is_string($action)
+        ? $action
+      : $this->view->tagAction($action);
 
     return $this->_tag('div',
                        $this->view->grid($this->view->div(['class' => 'col-3 p-3'],
                                                           $img)
 
-                                         . $this->view->div(['class' => 'col p-3'],
-                                                            implode($content)
-                                                            . implode($links))
+                                         . $this->view->div(['class' => 'col col-sm-6 py-3'],
+                                                            implode($content))
 
-                                         . $actions),
+                                         . $this->view->div(['class' => 'col-12 col-sm-3 p-3'],
+                                                            implode(BR.BR, $links))),
                        ['class' => 'card no_overflow']);
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/CardifyOnlyDescription.php b/library/templates/Intonation/View/CardifyOnlyDescription.php
index 9119e4e171e9bed13449911eb90a194ce9ccefd8..5d72c4842cf2d486a06ab1516437c1cd14588fcf 100644
--- a/library/templates/Intonation/View/CardifyOnlyDescription.php
+++ b/library/templates/Intonation/View/CardifyOnlyDescription.php
@@ -23,7 +23,7 @@
 class Intonation_View_CardifyOnlyDescription extends ZendAfi_View_Helper_BaseHelper {
 
   public function cardifyOnlyDescription($element, $img = '') {
-    $content = [];
+    $content = [$element->getContentForJSSearch()];
 
     if ($title = $element->getMainTitle())
       $content [] = $title = $this->_tag('h5',
@@ -46,11 +46,12 @@ class Intonation_View_CardifyOnlyDescription extends ZendAfi_View_Helper_BaseHel
 
     $links = [];
     if ($link = $element->getMainLink())
-      $links [] = $this->view->tagAnchor($link->getUrl(),
-                                         $link->getText(),
-                                         ['title' => $link->getTitle(),
-                                          'data-popup' => $link->getPopup(),
-                                          'class' => 'card-link ' . $link->getClasses()]);
+      $links [] = $this->view->tagAction($link);
+
+    foreach($element->getActions() as $action)
+      $links [] = is_string($action)
+      ? $action
+      : $this->view->tagAction($action);
 
     $html = [];
 
diff --git a/library/templates/Intonation/View/CardifyWithOverlay.php b/library/templates/Intonation/View/CardifyWithOverlay.php
index 3340d570501495b79ead31b8bd43e12324df3c0a..4677eaad29a28805d9fb99e3376468a35585a714 100644
--- a/library/templates/Intonation/View/CardifyWithOverlay.php
+++ b/library/templates/Intonation/View/CardifyWithOverlay.php
@@ -33,9 +33,12 @@ class Intonation_View_CardifyWithOverlay extends ZendAfi_View_Helper_BaseHelper
 
     $info = $this->_tag('h3', $title);
 
-    $content = [$title = $this->_tag('h3',
-                                     $title,
-                                     ['class' => 'card-title'])];
+    $title = $this->_tag('h3',
+                         $title,
+                         ['class' => 'card-title']);
+
+    $content = [$element->getContentForJSSearch(),
+                $title];
 
     if ($author_name = $element->getSecondaryTitle())
       $content [] = $this->_tag('h4',
@@ -61,8 +64,7 @@ class Intonation_View_CardifyWithOverlay extends ZendAfi_View_Helper_BaseHelper
                            $link,
                            ['class' => 'card-block card-img-overlay rounded text-center']);
 
-    $img = $this->view->tagImg($element->getPicture(),
-                               ['class' => 'text-center img_as_background text-muted']);
+    $img = $this->view->tagMedia($element, ['class' => 'text-center img_as_background text-muted']);
 
     return $img . $overlay;
   }
diff --git a/library/templates/Intonation/View/DNone.php b/library/templates/Intonation/View/DNone.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1d7a89263376718353e1885d99181052876cd76
--- /dev/null
+++ b/library/templates/Intonation/View/DNone.php
@@ -0,0 +1,35 @@
+<?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 Intonation_View_DNone extends ZendAfi_View_Helper_BaseHelper {
+  public function dNone($html) {
+    $text = preg_replace('/(<(script|style|link)\b[^>]*>).*?(<\/\2>)/is', "", $html);
+
+    $text = str_replace( '<', ' <', $text);
+
+    $text = strip_tags(html_entity_decode($text));
+
+    $text = preg_replace('/(\t|\n|\v|\f|\r| |\xC2\x85|\xc2\xa0|\xe1\xa0\x8e|\xe2\x80[\x80-\x8D]|\xe2\x80\xa8|\xe2\x80\xa9|\xe2\x80\xaF|\xe2\x81\x9f|\xe2\x81\xa0|\xe3\x80\x80|\xef\xbb\xbf)+/', ' ', $text);
+
+    return $this->view->div(['class' => 'hidde_content'], $text);
+  }
+}
diff --git a/library/templates/Intonation/View/Facettes.php b/library/templates/Intonation/View/Facettes.php
index d2d4404a271f1b3ea4c56c6e4f84a47813a51c26..a0035d0742aed22a9cb2fa4bdcf6ea634dc481d8 100644
--- a/library/templates/Intonation/View/Facettes.php
+++ b/library/templates/Intonation/View/Facettes.php
@@ -30,7 +30,7 @@ class Intonation_View_Facettes extends ZendAfi_View_Helper_BaseHelper {
 
   public function facettes($facets, $preferences, $criteres)  {
     if (!$facets)
-      return;
+      return '';
 
     $this->_criteres = $criteres;
     $this->_preferences = $preferences;
diff --git a/library/templates/Intonation/View/Jumbotron.php b/library/templates/Intonation/View/Jumbotron.php
index 8fe12ddb5d34a1614cffb85d2bcd9716b4c034c6..77adae937d578a3043c5e499ba5120507ca342b2 100644
--- a/library/templates/Intonation/View/Jumbotron.php
+++ b/library/templates/Intonation/View/Jumbotron.php
@@ -194,7 +194,9 @@ class Intonation_View_Jumbotron extends ZendAfi_View_Helper_BaseHelper {
 
     return
       $this->_div(['class' => $classes],
-                  $this->_tag('h2', $element->getTitle())
+                  $this->_tag('h2',
+                              Class_Template::current()->getIco($this->view, $element->getNavIco(), 'library')
+                              . $element->getTitle())
                   . $element->getContent());
   }
 }
diff --git a/library/templates/Intonation/View/Notice/Exemplaires.php b/library/templates/Intonation/View/Notice/Exemplaires.php
index d64484cea72807dfcefbb936a782af607eb2f9ff..94d9e6f061bea2b86780630840ea73b65e590c1c 100644
--- a/library/templates/Intonation/View/Notice/Exemplaires.php
+++ b/library/templates/Intonation/View/Notice/Exemplaires.php
@@ -43,6 +43,6 @@ class Intonation_View_Notice_Exemplaires extends ZendAfi_View_Helper_BaseHelper
                              ->setModel($element);
                          }, $exemplaires);
 
-    return $this->view->renderList(new Storm_Collection($elements), $callback);
+    return $this->view->renderTruncateList(new Storm_Collection($elements), $callback);
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/Notice/Reviews.php b/library/templates/Intonation/View/Notice/Reviews.php
index 452aac43c8eb80bb301a5784ddd52cfdb8957fb0..59bafa4681bad6e39f366250df8bdf985c800401 100644
--- a/library/templates/Intonation/View/Notice/Reviews.php
+++ b/library/templates/Intonation/View/Notice/Reviews.php
@@ -48,15 +48,13 @@ class Intonation_View_Notice_Reviews extends ZendAfi_View_Helper_BaseHelper {
                           }, $elements);
 
     $callback = function ($element) {
-      return $this->_tag('div',
-                         $this->view->cardifyFullDescription($element),
-                         ['class' => 'card']);
+      return $this->view->cardifyFullDescription($element);
     };
 
     return
       $this->_div(['class' => 'col-12'],
                   $this->_tag('h3', $title)
-                  . $this->view->renderList(new Storm_Collection($elements), $callback));
+                  . $this->view->renderTruncateList(new Storm_Collection($elements), $callback));
   }
 
 
@@ -74,23 +72,13 @@ class Intonation_View_Notice_Reviews extends ZendAfi_View_Helper_BaseHelper {
     if (!$me = Class_Users::getIdentity())
       return '';
 
-    $mine = ($mine = $me->getFirstAvisByIdNotice($this->_record->getId()))
-      ? $mine
-      : new Class_AvisNotice;
-
-    $params =  ['controller' => 'abonne',
-                'action' => 'review',
-                'record_id' => $this->_record->getId(),
-                'record_key' => $this->_record->getClefOeuvre(),
-                'id' => $mine->getId()];
-
-    $form = ZendAfi_Form_Review::newWith($mine->toArray())
-      ->setAction($this->view->url($params,null,true));
+    if ($me->getFirstAvisByIdNotice($this->_record->getId()))
+      return '';
 
     return $this->_div(['class' => 'col-12'],
-                       $this->_tag('h3', $this->_('Votre avis'), ['class' => 'card-title'])
+                       $this->_tag('h3', $this->_('Donnez votre avis'), ['class' => 'card-title'])
                        . $this->_div(['class' => 'card'],
                                      $this->_div(['class' => 'card-body'],
-                                                 $this->view->renderForm($form))));
+                                                 $this->view->renderReviewForm(new Class_AvisNotice))));
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/Paniers.php b/library/templates/Intonation/View/Paniers.php
index 5daf37fbd3b397e549b93588cbee6d24255d21b2..d9cd3b80335a97acbe0a6831f68a6c1c93951d0f 100644
--- a/library/templates/Intonation/View/Paniers.php
+++ b/library/templates/Intonation/View/Paniers.php
@@ -27,16 +27,15 @@ class Intonation_View_Paniers extends ZendAfi_View_Helper_BaseHelper {
       ? $this->view->tagAnchor($this->view->url(['controller' => 'panier',
                                                  'action' => 'domain'], null ,true),
                                $this->_('Voir les sélections rangées dans les domaines'),
-                               ['class' => 'btn btn-sm btn-primary text-white',
+                               ['class' => 'mr-3',
                                 'title' => $this->_('Voir les sélections rangés dans les domaines')]) .
       $this->view->tagAnchor($this->view->url(['controller' => 'panier',
                                                'action' => 'pro'], null ,true),
                              $this->_('Voir les sélections des professionnels'),
-                             ['class' => 'btn btn-sm btn-primary text-white',
-                              'title' => $this->_('Voir les sélections des professionnels')])
+                             ['title' => $this->_('Voir les sélections des professionnels')])
       : '';
 
-    $html [] = $this->view->div(['class' => 'btn-group'],
+    $html [] = $this->view->div([],
                                 $paniers_pro) . BR;
 
 
@@ -44,7 +43,7 @@ class Intonation_View_Paniers extends ZendAfi_View_Helper_BaseHelper {
                                                         'action' => 'add'], null ,true),
                                       $this->_('Créer une nouvelle sélection'),
                                       ['data-popup' => 'true',
-                                       'class' => 'btn btn-sm btn-success text-white my-3',
+                                       'class' => 'my-3',
                                        'title' => $this->_('Créer une nouvelle sélection')]);
 
     $html [] = $this->view->user_Selections($paniers);
diff --git a/library/templates/Intonation/View/RenderRecordReviews.php b/library/templates/Intonation/View/RenderRecordReviews.php
index 4a2b2d20cda02e9481234cf7f34d8c480d0e3ae3..65c8e2abe9b29dc487818d092465a34878999953 100644
--- a/library/templates/Intonation/View/RenderRecordReviews.php
+++ b/library/templates/Intonation/View/RenderRecordReviews.php
@@ -34,7 +34,7 @@ class Intonation_View_RenderRecordReviews extends ZendAfi_View_Helper_BaseHelper
 
 
   protected function _getHtml($record_reviews) {
-    return $this->view->renderList(new Storm_Collection($record_reviews), function($element)
+    return $this->view->renderTruncateList(new Storm_Collection($record_reviews), function($element)
                             {
                               return $this->view->renderRecordReview($element);
                             });
diff --git a/library/templates/Intonation/View/RenderReviewForm.php b/library/templates/Intonation/View/RenderReviewForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..cba2b0edaf5ad1d27f4833e8d8b38d67c1cd8e1e
--- /dev/null
+++ b/library/templates/Intonation/View/RenderReviewForm.php
@@ -0,0 +1,40 @@
+<?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 Intonation_View_RenderReviewForm extends ZendAfi_View_Helper_BaseHelper {
+  public function renderReviewForm($review) {
+    if (!$record = $review->getFirstNotice())
+      return '';
+
+    $params =  ['controller' => 'abonne',
+                'action' => 'review',
+                'record_id' => $record->getId(),
+                'record_key' => $record->getClefOeuvre(),
+                'id' => $review->getId()];
+
+    $form = ZendAfi_Form_Review::newWith($review->toArray())
+      ->setAction($this->view->url($params,null,true));
+
+    $form->getElement('entete')->setValue($record->getTitrePrincipal(' '));
+    return $this->view->renderForm($form);
+  }
+}
diff --git a/library/templates/Intonation/View/RenderTrailers.php b/library/templates/Intonation/View/RenderTrailers.php
index 1f0599834cf74eb82a46230fcaf3510fa326f83a..ae22f1a454b1a5cbfd36e9084163b71ea86965af 100644
--- a/library/templates/Intonation/View/RenderTrailers.php
+++ b/library/templates/Intonation/View/RenderTrailers.php
@@ -29,7 +29,7 @@ class Intonation_View_RenderTrailers extends ZendAfi_View_Helper_BaseHelper {
 
     foreach ($trailers as $trailer)
       $html [] = $this->view->renderEmbed($trailer->getSource(),
-                                          $trailes->getUrl());
+                                          $trailer->getUrl());
 
     return implode($html);
   }
diff --git a/library/templates/Intonation/View/RenderTruncateList.php b/library/templates/Intonation/View/RenderTruncateList.php
index e2cb9ff94856f8309c7393871158412c017d8015..6d78ae3bfd1091452b05e651f81626eaf1fcc518 100644
--- a/library/templates/Intonation/View/RenderTruncateList.php
+++ b/library/templates/Intonation/View/RenderTruncateList.php
@@ -23,18 +23,24 @@
 class Intonation_View_RenderTruncateList extends ZendAfi_View_Helper_BaseHelper {
 
   public function renderTruncateList($collection, $callback) {
+    $size = $collection->count();
+
+    if (3 >= $size)
+      return $this->view->renderList($collection, $callback);
+
     $html = $collection
       ->injectInto('', function($html, $element) use ($callback)
     {
       return $html . $this->_tag('div',
                                  $callback($element),
-                                 ['class' => 'd-none list-group-item bg-transparent border-0 px-0']);
+                                 ['style' => 'display: none',
+                                  'class' => 'list-group-item bg-transparent border-0 px-0']);
     });
 
     $id = uniqid();
 
     return
-      $this->_renderToolsIn($id, $collection->count())
+      $this->_renderToolsIn($id, $size)
       . $this->_tag('div',
                     $html,
                     ['id' => $id,
@@ -43,23 +49,26 @@ class Intonation_View_RenderTruncateList extends ZendAfi_View_Helper_BaseHelper
 
 
   protected function _renderToolsIn($container_id, $size) {
-    $id = uniqid();
+    $input_id = 'input_' . $container_id;
+
+    Class_ScriptLoader::getInstance()->addSearchInputToContainer('#' . $container_id,
+                                                                 '#' . $input_id,
+                                                                 '#' . $container_id . ' div.card *');
 
-    $size_html = $this->_tag('div',
-                             $this->_tag( 'span' ,
-                                         $this->_( '%d éléments' , $size),
-                                         ['class' => 'btn']),
-                             ['class' => 'col-6 col-sm-3 selector_widget']);
+    $id = uniqid();
 
     Class_ScriptLoader::getInstance()
       ->addJQueryReady("var container = $('#" . $container_id . "');"
-                       . "container.children().slice(0,3).removeClass('d-none');");
+                       . "container.children().slice(0,3).show();"
+                       . "$('#" . $input_id . "').attr('onkeypress', 'retun event.keyCode != 13;');");
 
     $onchange =
       "var container = $('#" . $container_id . "');"
-      . "container.children().addClass('d-none');"
+      . "container.children().hide();"
       . "var value=$('#" . $id . "').val();"
-      . "container.children().slice(0, value).removeClass('d-none');";
+      . "container.children().not('.search_input_not_found').slice(0, value).show();";
+
+    $multi_options = $this->_getTruncateOptions($size);
 
     $form = new ZendAfi_Form;
 
@@ -67,18 +76,50 @@ class Intonation_View_RenderTruncateList extends ZendAfi_View_Helper_BaseHelper
       ->addElement('select',
                    $id,
                    ['label' => '',
+                    'title' => $this->_('Limiter le nombre d\'éléments à afficher'),
                     'onchange' => $onchange,
-                    'multiOptions' => ['3' => $this->_('3'),
-                                       '10' => $this->_('10'),
-                                       '10000' => $this->_('Tout')]])
+                    'multiOptions' => $multi_options])
+
+      ->addElement('text',
+                   $input_id,
+                   ['label' => '',
+                    'placeholder' => $this->_('Filtrer avec un nom, un mot, une date'),
+                    'title' => $this->_('Filtrer la liste avec des noms, des mots, des dates'),
+                    'onkeyup' => $onchange])
 
       ->addElement('submit',
                    md5($id),
                    ['class' => 'd-none']);
 
-    return $this->view->grid($size_html
+    return $this->view->grid($this->_tag('div',
+                                         $this->_tag( 'span' ,
+                                                     $this->_('%d éléments' , $size),
+                                                     ['class' => 'btn']),
+                                         ['class' => 'col-11 col-sm-3'])
+
                              . $this->_tag('div',
                                            $this->view->renderInlineForm($form),
-                                           ['class' => 'col-3 selector_widget']));
+                                           ['class' => 'col-11 col-sm-8']),
+                             ['class' => 'container']);
+  }
+
+
+  protected function _getTruncateOptions($size) {
+    if ($size > 100)
+      return ['3' => $this->_('3'),
+              '10' => $this->_('10'),
+              '50' => $this->_('50'),
+              '10000' => $this->_('Tout')];
+
+    if ($size > 10)
+      return ['3' => $this->_('3'),
+              '10' => $this->_('10'),
+              '10000' => $this->_('Tout')];
+
+    if ($size > 3)
+      return ['3' => $this->_('3'),
+              '10000' => $this->_('Tout')];
+
+    return ['10000' => $this->_('Tout')];
   }
 }
\ No newline at end of file
diff --git a/library/templates/Intonation/View/Search/Result.php b/library/templates/Intonation/View/Search/Result.php
index 9c4a7f093ff7ac2e56541a8fb4e6f4e3e0f9f560..f1ebbfcc1f9c130cc66ed7591980910cd5f0c35c 100644
--- a/library/templates/Intonation/View/Search/Result.php
+++ b/library/templates/Intonation/View/Search/Result.php
@@ -81,17 +81,13 @@ class Intonation_View_Search_Result extends ZendAfi_View_Helper_BaseHelper {
   protected function _renderTools($search, $criteria) {
     $wall_active = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR == $search->getCriteresRecherche()->getFormat();
 
-    $tools = [$this->view->button(new Class_Entity(['Url' => $this->view->url(['controller' => 'recherche',
-                                                                               'action' => 'simple',
-                                                                               'liste_format' => Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR]),
+    $tools = [$this->view->button(new Class_Entity(['Url' => $this->view->url(['liste_format' => Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR]),
                                                     'Image' => Class_Template::current()->getIco($this->view, 'wall', 'utils'),
                                                     'Text' => $this->_('Mur'),
                                                     'Title' => $this->_('Afficher le résultat de recherche en mode mur'),
                                                     'Attribs' => ['class' => 'list_format' . ($wall_active ? ' active' : '')]])),
 
-              $this->view->button(new Class_Entity(['Url' => $this->view->url(['controller' => 'recherche',
-                                                                               'action' => 'simple',
-                                                                               'liste_format' => Class_Systeme_ModulesAppli::LISTE_FORMAT_LIST]),
+              $this->view->button(new Class_Entity(['Url' => $this->view->url(['liste_format' => Class_Systeme_ModulesAppli::LISTE_FORMAT_LIST]),
                                                     'Image' => Class_Template::current()->getIco($this->view, 'list', 'utils'),
                                                     'Text' => $this->_('Liste'),
                                                                                                         'Title' => $this->_('Afficher le résultat de recherche en mode liste'),
@@ -104,13 +100,15 @@ class Intonation_View_Search_Result extends ZendAfi_View_Helper_BaseHelper {
     $tools = array_merge($tools,
                          $this->_pager($search, $criteria));
 
-    $tools [] = $this->view->button(new Class_Entity(['Url' => $this->view->url(['controller' => 'bookmarked-searches',
-                                                                                 'action' => 'add']),
-                                                      'Image' => Class_Template::current()->getIco($this->view, 'selection', 'library'),
-                                                      'Text' => $this->_('Suivre'),
-                                                      'Title' => $this->_('Suivre cette recherche'),
-                                                      'Attribs' => ['data-popup' => true,
-                                                                    'class' => 'btn btn-primary ml-n3']]));
+    $bookmarked_search = (new Class_User_BookmarkedSearch)
+      ->setLabel($this->view->titre)
+      ->setCriterias($criteria);
+
+    $search_wrapper = (new Intonation_Library_View_Wrapper_Search)
+      ->setModel($bookmarked_search)
+      ->setView($this->view);
+
+    $tools [] = $this->view->tagAction($search_wrapper->getMainLink());
 
     $tools = array_map(function($tool)
                        {
diff --git a/library/templates/Intonation/View/TagAction.php b/library/templates/Intonation/View/TagAction.php
new file mode 100644
index 0000000000000000000000000000000000000000..abaf619b9ab7f21825f2176bf34af09bd092b24d
--- /dev/null
+++ b/library/templates/Intonation/View/TagAction.php
@@ -0,0 +1,43 @@
+<?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 Intonation_View_TagAction extends ZendAfi_View_Helper_BaseHelper {
+  public function tagAction($action) {
+    $attribs = ($attribs = $action->getAttribs())
+      ? $attribs
+      : [];
+
+    $img = ($img = $action->getImage())
+      ? $img
+      : '';
+
+    if ('button' == $action->getTag())
+      return $this->view->button($action);
+
+    return $this->view->tagAnchor($action->getUrl(),
+                                  $img . $action->getText(),
+                                  array_merge(['title' => $action->getTitle(),
+                                              'data-popup' => $action->getPopup(),
+                                              'class' => 'card-link ' . $action->getClasses()],
+                                              $attribs));
+  }
+}
diff --git a/library/templates/Intonation/View/TagMedia.php b/library/templates/Intonation/View/TagMedia.php
new file mode 100644
index 0000000000000000000000000000000000000000..779d5416279cfa934638d0b825d10d0f0352cc55
--- /dev/null
+++ b/library/templates/Intonation/View/TagMedia.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 Intonation_View_TagMedia extends ZendAfi_View_Helper_BaseHelper {
+  public function tagMedia($instance, $attribs = null) {
+    if ($embed = $instance->getEmbedMedia())
+      return $this->_div($attribs,
+                         $this->view->renderEmbed($embed->getSource(),
+                                                  $embed->getUrl()));
+
+    if ($html = $instance->getHtmlPicture())
+      return $this->_div($attribs,
+                         $html);
+
+    return $this->_div($attribs,
+                       $this->view->tagImg($instance->getPicture()));
+  }
+}
diff --git a/library/templates/Intonation/View/User/Selections.php b/library/templates/Intonation/View/User/Selections.php
index 950ea1372967469e5313f9414961b26b7a683229..426b432958bf4cac3a8de7d08c8f40f693aa7ff4 100644
--- a/library/templates/Intonation/View/User/Selections.php
+++ b/library/templates/Intonation/View/User/Selections.php
@@ -33,6 +33,6 @@ class Intonation_View_User_Selections extends ZendAfi_View_Helper_BaseHelper {
       return $this->view->cardifyOnlyDescription($wrapped);
     };
 
-    return $this->view->renderList(new Storm_Collection($selections), $callback);
+    return $this->view->renderTruncateList(new Storm_Collection($selections), $callback);
   }
 }
diff --git a/public/opac/java/search_input/search_input.js b/public/opac/java/search_input/search_input.js
index 3bec72fb4c23d680e64a883127417d9505ed5ea6..0b4664bfac2ef93f05bfc40727d27751d00ca143 100644
--- a/public/opac/java/search_input/search_input.js
+++ b/public/opac/java/search_input/search_input.js
@@ -22,17 +22,17 @@
   $.fn.search_input = function(options) {
     if ($('head').find('link[href*="search_input.css"]').length < 1) {
       $('head').append('<link media="screen" href="' 
-		                   + baseUrl + '/public/opac/java/search_input/search_input.css" rel="stylesheet" type="text/css"></link>');
+		       + baseUrl + '/public/opac/java/search_input/search_input.css" rel="stylesheet" type="text/css"></link>');
     }
 
-    var default_option_id = 'default_search_input_id';
+    var default_input_id = 'default_search_input_id';
     var default_input_label = 'Rechercher';
     var default_fixed_display = '.search_input, .search_input *';
 
     if(undefined == options)
       options = {id : default_input_id,
-		             label : default_input_label,
-		             fixed_display : ''};
+		 label : default_input_label,
+		 fixed_display : ''};
 
     if(undefined == options.id)
       options.id = default_input_id;
@@ -52,11 +52,11 @@
     var onSearchInputChange = function(searchText) {
       
       var resetAll = function() {
-	      html.find('*').removeClass(not_found_class);
+	html.find('*').removeClass(not_found_class);
       }
       
       if (searchText == "" || searchText == '*') {
-	      return resetAll();
+	return resetAll();
       }
 
       var accentsTidy = function(s){
@@ -75,9 +75,9 @@
       };
       
       var highlightItems = function(elements) {
-	      resetAll();
-	      html.find('*').not(elements).not(default_fixed_display + options.fixed_display).addClass(not_found_class);
-	      html.find(elements).parentsUntil(html).removeClass(not_found_class).show();
+	resetAll();
+	html.find('*').not(elements).not(default_fixed_display + options.fixed_display).addClass(not_found_class);
+	html.find(elements).parentsUntil(html).removeClass(not_found_class).show();
       }
 
       searchText = accentsTidy(searchText);
@@ -87,35 +87,37 @@
       var reg_exps = [];
 
       $.each(searchText, function(index, term) {
-	      var reg = new RegExp('\\b' + term, 'gi');
-	      reg_exps.push(reg);
+	var reg = new RegExp('\\b' + term, 'gi');
+	reg_exps.push(reg);
       });
 
       var matches = html.find('*').contents().filter(function() {
-	      if(this.nodeType != 3)
-	        return false;
+	if(this.nodeType != 3)
+	  return false;
 
-	      for(var index in reg_exps)
+	for(var index in reg_exps)
       	  if(!reg_exps[index].test(accentsTidy(this.nodeValue)))
-	          return false;
+	    return false;
 
-	      return true;
+	return true;
       });
 
       highlightItems(matches);
     };
 
-
-    var search_input = html.prepend("<div class='search_input'>" +
-				                            "<form>" + 
-				                            "<label for='" + options.id + "'>" + options.label + "</label>" +
-				                            "<input type='text' name='search_input' id='" + options.id +"'></input>" +
-				                            "</form>" +
-				                            "</div>")
-        .find('input')
-        .keyup(function(event){
-	        onSearchInputChange($(this).val());
-        })
-        .end();
+    var search_input = (undefined == options.input)
+	? html.prepend("<div class='search_input'>" +
+		       "<form>" + 
+		       "<label for='" + options.id + "'>" + options.label + "</label>" +
+		       "<input type='text' name='search_input' id='" + options.id +"'></input>" +
+		       "</form>" +
+		       "</div>").find('input')
+	: $(options.input);
+
+    search_input
+      .keyup(function(event){
+	onSearchInputChange($(this).val());
+      })
+      .end();
   }
 } (jQuery));
diff --git a/tests/scenarios/Templates/TemplatesTest.php b/tests/scenarios/Templates/TemplatesTest.php
index af50123e70bf55a7134bdc07260af1a7a7b5c288..5ca7e1f77b4e23468889789f75d90702fe0a9afb 100644
--- a/tests/scenarios/Templates/TemplatesTest.php
+++ b/tests/scenarios/Templates/TemplatesTest.php
@@ -1028,7 +1028,7 @@ class TemplatesIntonationHydratingtest extends ModelTestCase {
 
             [['element' => 'select',
               'attribs' => []],
-             'form-control form-control-sm custom-select'],
+             'form-control form-control custom-select'],
 
             [['element' => 'button',
               'attribs' => ['class' => 'btn search-button']],
@@ -2300,6 +2300,77 @@ class TemplatesRecordReviewsActionTest extends TemplatesIntonationTestCase {
 
 
 
+class TemplatesRecordEditReviewsActionTest extends TemplatesIntonationTestCase {
+  protected $_storm_default_to_volatile = true;
+
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->fixture('Class_AvisNotice',
+                   ['id' => 2,
+                    'id_notice' => 2,
+                    'clef_oeuvre' => 'PSYKO',
+                    'note' => '4',
+                    'entete' => 'Le Roi',
+                    'avis' => 'Le Roi des cons sur son throne']);
+
+    $this->fixture('Class_Notice',
+                   ['id' => 2,
+                    'clef_oeuvre' => 'PSYKO',
+                   ]);
+
+
+    $this->dispatch('/abonne/edit-review/id/2/id_profil/72');
+  }
+
+
+  /** @test */
+  public function leRoiNoteShouldBe4() {
+    $this->assertXPathContentContains('//div', '4');
+  }
+}
+
+
+
+class TemplatesRecordDeleteReviewsActionTest extends TemplatesIntonationTestCase {
+  protected $_storm_default_to_volatile = true;
+
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->fixture('Class_AvisNotice',
+                   ['id' => 2,
+                    'id_notice' => 2,
+                    'clef_oeuvre' => 'PSYKO',
+                    'note' => '4',
+                    'entete' => 'Le Roi',
+                    'avis' => 'Le Roi des cons sur son throne']);
+
+    $this->fixture('Class_Notice',
+                   ['id' => 2,
+                    'clef_oeuvre' => 'PSYKO',
+                   ]);
+ }
+
+
+  /** @test */
+  public function leRoiNoteShouldBe4() {
+    $this->dispatch('/abonne/delete-review/id/2/id_profil/72');
+    $this->assertXPathContentContains('//div', '4');
+  }
+
+
+  /** @test */
+  public function leRoiShouldHaveBeenDelete() {
+    $this->dispatch('/abonne/delete-review/id/2/id_profil/72/delete/1');
+    $this->assertNull(Class_AvisNotice::find(2));
+  }
+}
+
+
+
 class TemplatesDispatchRecordDescriptionTest extends TemplatesIntonationTestCase {
 
   /** @test */
diff --git a/tests/scenarios/bookmarks/SearchTest.php b/tests/scenarios/bookmarks/SearchTest.php
index edcb3f03cc16c071c744a3eaa074d66ae93cc854..431c26b4c7ee38ccbaf80e10b631d7eed80fbf07 100644
--- a/tests/scenarios/bookmarks/SearchTest.php
+++ b/tests/scenarios/bookmarks/SearchTest.php
@@ -310,8 +310,8 @@ class Bookmarks_SearchDeleteBookmarkedSearchTest extends Bookmarks_SearchWithSes
 
 
   /** @test */
-  public function shouldRedirectToAbonneSettings() {
-    $this->assertRedirectTo('/abonne/settings');
+  public function shouldRedirectToReferer() {
+    $this->assertRedirectTo('/');
   }
 }
 
@@ -390,9 +390,9 @@ class Bookmarks_SearchAuthorizedActionTest extends Bookmarks_SearchWithSessionAb
 
 
   /** @test */
-  public function dispatchEditActionShouldRedirectToAbonneSettings() {
+  public function dispatchEditActionShouldRedirectToReferer() {
       $this->dispatch('/opac/bookmarked-searches/edit/id/5', true);
-      $this->assertRedirectTo('/abonne/settings');
+      $this->assertRedirectTo('/');
   }
 
 
@@ -404,9 +404,9 @@ class Bookmarks_SearchAuthorizedActionTest extends Bookmarks_SearchWithSessionAb
 
 
   /** @test */
-  public function dispatchDeleteActionShouldRedirectToAbonneSettings() {
+  public function dispatchDeleteActionShouldRedirectToReferer() {
       $this->dispatch('/opac/bookmarked-searches/delete/id/5', true);
-      $this->assertRedirectTo('/abonne/settings');
+      $this->assertRedirectTo('/');
       $this->assertNotNull(Class_User_BookmarkedSearch::find(5));
       $this->assertFlashMessengerContentContains('Vous n\'avez pas la permission');
   }