diff --git a/library/Class/TableDescription.php b/library/Class/TableDescription.php
index 7f1cba7eed44a7bc5598efd5aceffd62cd826dfe..bc86453b0235046fedd723a42af0a16a04391f3b 100644
--- a/library/Class/TableDescription.php
+++ b/library/Class/TableDescription.php
@@ -21,12 +21,20 @@
 
 
 class Class_TableDescription {
+  use Trait_Translator;
+
+  const
+    SORT_NONE = 'sortNone',
+    SORT_CLIENT = 'sortClient',
+    SORT_SERVER = 'sortServer'
+    ;
 
   protected
     $_columns,
     $_id,
     $_pager = false,
-    $_sorter = true;
+    $_sorter = self::SORT_CLIENT,
+    $_order;
 
 
   public function __construct($id) {
@@ -51,14 +59,35 @@ class Class_TableDescription {
   }
 
 
+  public function setSorterNone() {
+    return $this->setSorter(static::SORT_NONE);
+  }
+
+
+  public function setSorterServer() {
+    return $this->setSorter(static::SORT_SERVER);
+  }
+
+
   public function setSorter($sorter) {
     $this->_sorter = $sorter;
     return $this;
   }
 
 
-  public function getSorter() {
-    return $this->_sorter;
+  public function isSorterClient() {
+    return static::SORT_CLIENT == $this->_sorter;
+  }
+
+
+  public function isSorterServer() {
+    return static::SORT_SERVER == $this->_sorter;
+  }
+
+
+  public function setOrder($order) {
+    $this->_order = $order;
+    return $this;
   }
 
 
@@ -87,7 +116,8 @@ class Class_TableDescription {
 
     $description = array_merge(['attribute' => '',
                                 'callback' => null,
-                                'options' => ''],
+                                'options' => '',
+                                'sort_attribute' => ''],
                                $description);
     $this
       ->_columns
@@ -100,17 +130,14 @@ class Class_TableDescription {
 
   public function newColumn($label, $description) {
     return $description['callback']
-      ? new Class_TableDescription_ColumnForCallback($label,
-                                                     $description['attribute'],
-                                                     $description['callback'])
-      : new Class_TableDescription_ColumnForAttribute($label,
-                                                      $description['attribute']);
+      ? new Class_TableDescription_ColumnForCallback($label, $description, $this)
+      : new Class_TableDescription_ColumnForAttribute($label, $description, $this);
   }
 
 
   public function getActionColumn() {
     if (!isset($this->_actions)) {
-      $this->_actions = (new Class_TableDescription_ColumnForActions())
+      $this->_actions = (new Class_TableDescription_ColumnForActions($this->_('Actions'), [], $this))
         ->setOptions(['data-sorter' => 'false',
                       'class' => 'actions',
                       'style' => 'min-width: 80px']);
@@ -127,9 +154,28 @@ class Class_TableDescription {
     return $this;
   }
 
+
   public function numberOfColumns() {
     return $this->_columns->count();
   }
+
+
+  public function withOrder($label, $attribute) {
+    $parts = explode(' ', $this->_order);
+    $order = $attribute;
+    if (($attribute == $parts[0]) && (!isset($parts[1])))
+      $order .= ' desc';
+
+    $data_order = ($attribute == $parts[0])
+      ? str_replace(' ', '_', 'order_' . $order)
+      : '';
+
+    return function($view) use($order, $label, $data_order) {
+      return $view->tagAnchor(['order' => $order, 'page' => null],
+                              $label,
+                              ['data-order' => $data_order]);
+    };
+  }
 }
 
 
@@ -172,11 +218,13 @@ class Class_TableDescription_Columns {
 abstract class Class_TableDescription_ColumnAbstract {
   protected
     $_label,
+    $_table_description,
     $_options = [];
 
 
-  public function __construct($label) {
+  public function __construct($label, $description, $table_description) {
     $this->_label = $label;
+    $this->_table_description = $table_description;
   }
 
 
@@ -206,52 +254,60 @@ abstract class Class_TableDescription_ColumnAbstract {
 
 
 
-
-class Class_TableDescription_ColumnForCallback extends Class_TableDescription_ColumnAbstract {
+class Class_TableDescription_ColumnForAttribute extends Class_TableDescription_ColumnAbstract {
   protected
-    $_callback,
-    $_attribute;
+    $_attribute,
+    $_sort_attribute;
 
-  public function __construct($label, $attribute, $callback) {
-    parent::__construct($label);
-    $this->_attribute = $attribute;
-    $this->_callback = $callback;
+  public function __construct($label, $description, $table_description) {
+    parent::__construct($label, $description, $table_description);
+    $this->_attribute = $description['attribute'];
+    $this->_sort_attribute = $description['sort_attribute']
+      ? $description['sort_attribute']
+      : $this->_attribute;
+  }
+
+
+  public function getLabel() {
+    return $this->_table_description->isSorterServer()
+      ? $this->_table_description->withOrder(parent::getLabel(), $this->_sort_attribute)
+      : parent::getLabel();
   }
 
 
   public function renderModelOn($model, $canvas) {
-    return $canvas->renderContent(call_user_func($this->_callback,
-                                                 $model,
-                                                 $this->_attribute));
+    return $canvas->renderContent($model->callGetterByAttributeName($this->_attribute));
   }
 }
 
 
 
-class Class_TableDescription_ColumnForAttribute extends Class_TableDescription_ColumnAbstract {
-  protected $_attribute;
+class Class_TableDescription_ColumnForCallback extends Class_TableDescription_ColumnForAttribute {
+  protected
+    $_callback;
 
-  public function __construct($label, $attribute) {
-    parent::__construct($label);
-    $this->_attribute = $attribute;
+  public function __construct($label, $description, $table_description) {
+    parent::__construct($label, $description, $table_description);
+    $this->_callback = $description['callback'];
   }
 
 
   public function renderModelOn($model, $canvas) {
-    return $canvas->renderContent($model->callGetterByAttributeName($this->_attribute));
+    return $canvas->renderContent(call_user_func($this->_callback,
+                                                 $model,
+                                                 $this->_attribute));
   }
 }
 
 
 
-
 class Class_TableDescription_ColumnForActions extends Class_TableDescription_ColumnAbstract {
   use Trait_Translator;
 
   protected $_actions;
 
-  public function __construct() {
-    parent::__construct($this->_('Actions'));
+  public function __construct($label, $description, $table_description) {
+    parent::__construct($label, $description, $table_description);
     $this->_actions = new Storm_Collection();
   }
 
diff --git a/library/ZendAfi/Controller/Action/Helper/AbstractListViewMode.php b/library/ZendAfi/Controller/Action/Helper/AbstractListViewMode.php
index b6f495d42d46ae5550a89762fd96da6066b49622..55eb4afe4aaa34df22514edce4e3122d4acfd480 100644
--- a/library/ZendAfi/Controller/Action/Helper/AbstractListViewMode.php
+++ b/library/ZendAfi/Controller/Action/Helper/AbstractListViewMode.php
@@ -23,6 +23,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   use Trait_Translator;
 
   protected
+    $_view,
     $_params,
     $_items_paginator,
     $_breadcrumb,
@@ -32,6 +33,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
 
   public function init() {
     parent::init();
+    $this->_view = $this->getActionController()->view;
     $this->_form_settings = (new Class_Entity())
       ->setPlaceHolder($this->_('titre du document'))
       ->setSearchText($this->_('Filtrer'))
@@ -39,17 +41,81 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function render($view, $callback) {
-    return $view->tagModelTable($this->getItems(),
-                                $this->getItemsCols($view),
-                                $this->getItemsAttribs(),
-                                [function($model) use ($view)
-                                 {
-                                   return $view->renderPluginsActions($model);
-                                 }],
-                                $this->getItemsId(),
-                                $this->getItemsGroupBy(),
-                                $this->isSearching() ? [$this->getItemsLabelAttrib() => $callback] : [], $this->enabledPager(), $this->enabledSorter());
+  public function getCategoriesDescription() {
+    if ($this->isSearching())
+      return;
+
+    $labelWithCount = function($model, $attrib) {
+      return $this->_renderCategory($model, $attrib);
+    };
+
+    $description = (new Class_TableDescription('categories_' . get_class($this->getModel())));
+    return $this->_describeCategoriesIn($description)
+                ->addRowAction(function($model)
+                               {
+                                 return $this->_view->renderPluginsActions($model);
+                               });
+  }
+
+
+  abstract protected function _describeCategoriesIn($description);
+
+
+  protected function _renderCategory($model, $attrib) {
+    $url = $this->_view->url($this->renderCategoryUrlParams($model), null, true);
+
+    $label = Class_Admin_Skin::current()->renderActionIconOn('category', $this->_view)
+      . $model->$attrib;
+
+    $count = '';
+
+    if ($this->isCountEnabled())
+      $label .= ' (' . ($count = $this->countItemsInTreeFrom($model)) . ')';
+
+    return $this->_view->tagAnchor($url, $label, ['data-count' => $count]);
+  }
+
+
+  public function getItemsDescription() {
+    if (!$this->getModel() && !$this->isSearching())
+      return;
+
+    $description = new Class_TableDescription(get_class($this->getModel()));
+
+    return $this
+      ->_describeItemsIn($description)
+      ->addRowAction(function($model)
+                     {
+                       return $this->_view->renderPluginsActions($model);
+                     })
+      ->setOrder($this->getOrder());
+  }
+
+
+  abstract protected function _describeItemsIn($description);
+
+
+  protected function _renderItem($model, $attrib) {
+    if (!$this->isSearching())
+      return $model->$attrib;
+
+    return $this->_view->tag('span', $model->$attrib)
+      . $this->_view->tag('p',
+                          $this->_getBreadcrumbHtmlFor($this->getBreadcrumbFor($this->getCategoryFor($model))),
+                          ['style' => 'font-size:0.9em;']);
+  }
+
+
+  protected function _getBreadcrumbHtmlFor($breadcrumb) {
+    $breadcrumb_html = [];
+
+    foreach($breadcrumb as $loc) {
+      $breadcrumb_html[] =  $this->_view->tagAnchor($this->_view->url($loc['url'], null, true),
+                                                   $loc['label'],
+                                                   $loc['options']);
+    }
+
+    return implode(' > ',$breadcrumb_html);
   }
 
 
@@ -73,22 +139,22 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getBaseUrl() {
+  protected function getBaseUrl() {
     return [];
   }
 
 
-  public function getSearchUrl() {
+  protected function getSearchUrl() {
     return $this->getBaseUrl() + ['title_search' => ''];
   }
 
 
-  public function getBreadcrumbUrl() {
+  protected function getBreadcrumbUrl() {
     return $this->getBaseUrl();
   }
 
 
-  public function getParamKey() {
+  protected function getParamKey() {
     return 'id';
   }
 
@@ -100,7 +166,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getUrlParams($model) {
+  protected function getUrlParams($model) {
     return array_merge($this->getStartParams(),
                        $this->getBaseUrl(),
                        [$this->getParamKey() => $model->getId()]);
@@ -113,7 +179,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getStartKey() {
+  protected function getStartKey() {
     return 'start_cat';
   }
 
@@ -133,7 +199,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getItems() {
+  protected function getItems() {
     return [];
   }
 
@@ -159,17 +225,17 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getCountSearchResult() {
+  protected function getCountSearchResult() {
     return 0;
   }
 
 
-  public function getSearchColumns() {
+  protected function getSearchColumns() {
     return ['titre'];
   }
 
 
-  public function getSearchParams() {
+  protected function getSearchParams() {
     $search_param = Zend_Db_Table::getDefaultAdapter()->quote('%' . $this->getSearch() . '%');
     $columns = $this->getSearchColumns();
 
@@ -182,7 +248,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getBreadcrumb() {
+  protected function getBreadcrumb() {
     return $this->isSearching()
       ? []
       : $this->getBreadcrumbFor($this->getModel(), [], $this->getStartKey());
@@ -195,7 +261,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
    * @param $start_key string
    * @return array
    */
-  public function getBreadcrumbFor($model, $breadcrumb=[], $start_key='') {
+  protected function getBreadcrumbFor($model, $breadcrumb=[], $start_key='') {
     if (!$model)
       return $breadcrumb;
 
@@ -223,17 +289,17 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getStrategyLabel() {
+  protected function getStrategyLabel() {
     return '';
   }
 
 
-  public function countItemsFor($model) {
+  protected function countItemsFor($model) {
     return 0;
   }
 
 
-  public function countRecursiveItemsFor($model) {
+  protected function countRecursiveItemsFor($model) {
     return 0;
   }
 
@@ -253,27 +319,27 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getItemsId() {
+  protected function getItemsId() {
     return '';
   }
 
 
-  public function getItemsAttribs() {
+  protected function getItemsAttribs() {
     return [$this->getItemsLabelAttrib()];
   }
 
 
-  public function getItemsLabelAttrib() {
+  protected function getItemsLabelAttrib() {
     return 'titre';
   }
 
 
-  public function getItemsGroupBy() {
+  protected function getItemsGroupBy() {
     return null;
   }
 
 
-  public function getCategoryFor($model) {
+  protected function getCategoryFor($model) {
     return $model->getCategorie();
   }
 
@@ -283,34 +349,34 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getParams() {
+  protected function getParams() {
     return $this->_params;
   }
 
 
-  public function getParam($name, $default = null) {
+  protected function getParam($name, $default = null) {
     return (array_key_exists($name, $this->_params) && $this->_params[$name])
       ? $this->_params[$name]
       : $default;
   }
 
 
-  public function getPage() {
+  protected function getPage() {
     return $this->getParam('page');
   }
 
 
-  public function getSearch() {
+  protected function getSearch() {
     return $this->getSearchValue();
   }
 
 
-  public function getModelId() {
+  protected function getModelId() {
     return ($model = $this->getModel()) ? $model->getId() : 0;
   }
 
 
-  public function getSearchValue() {
+  protected function getSearchValue() {
     return $this->getParam('search_value');
   }
 
@@ -326,7 +392,7 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getRequestParam($key, $default = null) {
+  protected function getRequestParam($key, $default = null) {
     return $this->getRequest()->getParam($key, $default);
   }
 
@@ -356,12 +422,12 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
   }
 
 
-  public function getItemsCols($view) {
+  protected function getItemsCols($view) {
     return [''];
   }
 
 
-  public function getOrder() {
+  protected function getOrder() {
     return $this->getParam('order', 'titre');
   }
 
@@ -376,22 +442,4 @@ abstract class ZendAfi_Controller_Action_Helper_AbstractListViewMode extends Zen
                     'value' => $this->getSearch()])
       ->addUniqDisplayGroup('list_search_group');
   }
-
-
-  protected function _withOrder($view, $attribute, $label) {
-    $order = $this->getOrder();
-    $order_param = $attribute;
-
-    if((0 === strpos($order, $attribute)) && (false === strpos($order, 'desc')))
-      $order_param .= ' desc';
-
-    $data_order = (false === strpos($order, $attribute))
-      ? ''
-      : str_replace(' ', '_', 'order_' . $order_param);
-
-    $url = ['order' => $order_param,
-            'page' => null];
-
-    return $view->tagAnchor($url, $label, ['data-order' => $data_order]);
-  }
 }
\ No newline at end of file
diff --git a/library/ZendAfi/Controller/Action/Helper/ArticleListViewMode.php b/library/ZendAfi/Controller/Action/Helper/ArticleListViewMode.php
index a135e409373a18162f864d479cb5db99668a8e23..4837deff627c5659cbd59f75cf103f606ba9daf7 100644
--- a/library/ZendAfi/Controller/Action/Helper/ArticleListViewMode.php
+++ b/library/ZendAfi/Controller/Action/Helper/ArticleListViewMode.php
@@ -62,7 +62,7 @@ class ZendAfi_Controller_Action_Helper_ArticleListViewMode extends ZendAfi_Contr
     foreach($actions as $action)
       $description->addRowAction($action);
 
-    $description->setSorter(false);
+    $description->setSorterNone();
 
     return $view->renderTable($description,
                               (new Class_TableDescription_Models($this->getItems()))->groupBy($this->getItemsGroupBy()));
diff --git a/library/ZendAfi/Controller/Action/Helper/ThesauriListViewMode.php b/library/ZendAfi/Controller/Action/Helper/ThesauriListViewMode.php
index b86bb6f62535e0fd8deafc38292f9cccac253c2e..b898f27eae242182af277f901b5635a1a529c492 100644
--- a/library/ZendAfi/Controller/Action/Helper/ThesauriListViewMode.php
+++ b/library/ZendAfi/Controller/Action/Helper/ThesauriListViewMode.php
@@ -21,8 +21,6 @@
 
 
 class ZendAfi_Controller_Action_Helper_ThesauriListViewMode extends ZendAfi_Controller_Action_Helper_AbstractListViewMode {
-
-
   public function thesauriListViewMode($params) {
     $this->_params = $params;
     return $this;
@@ -34,6 +32,35 @@ class ZendAfi_Controller_Action_Helper_ThesauriListViewMode extends ZendAfi_Cont
   }
 
 
+  protected function _describeCategoriesIn($description) {
+    return $description
+      ->addColumn($this->_('Thesaurus'), ['attribute' => 'libelle',
+                                          'callback' => function($model, $attrib)
+                                          {
+                                            return $this->_renderCategory($model, $attrib);
+                                          }])
+      ->addColumn($this->_('Libellé facette'), 'libelle_facette')
+      ->addColumn($this->_('Code facette'), 'facette_index')
+      ->addColumn($this->_('Règle'), 'rules_label');
+  }
+
+
+  protected function _describeItemsIn($description) {
+    return $description
+      ->addColumn($this->_('Thesaurus'), ['attribute' => 'libelle',
+                                          'callback' => function($model, $attrib)
+                                          {
+                                            return $this->_renderItem($model, $attrib);
+                                          }])
+      ->addColumn($this->_('Libellé facette'), 'libelle_facette')
+      ->addColumn($this->_('Code facette'), ['attribute' => 'facette_index',
+                                             'sort_attribute' => 'id_thesaurus'])
+      ->addColumn($this->_('Règle'), 'rules_label')
+      ->setSorterServer()
+      ;
+  }
+
+
   protected function enabledSorter() {
     return false;
   }
@@ -97,6 +124,11 @@ class ZendAfi_Controller_Action_Helper_ThesauriListViewMode extends ZendAfi_Cont
   }
 
 
+  protected function getCategoryFor($model) {
+    return $model->getParent();
+  }
+
+
   public function countItemsFor($model) {
     return count($model->getChildrenItems());
   }
@@ -109,53 +141,6 @@ class ZendAfi_Controller_Action_Helper_ThesauriListViewMode extends ZendAfi_Cont
   }
 
 
-  public function getItemsCols($view) {
-    $order = $this->getOrder();
-    $anchor_wrapper = function($key, $label) use ($view, $order) {
-      $order_param = $key;
-      if((0 === strpos($order, $key)) && (false === strpos($order, 'desc')))
-        $order_param .= ' desc';
-
-      $data_order = (false === strpos($order, $key))
-      ? ''
-      : str_replace(' ', '_', 'order_' . $order_param);
-
-      $url = ['order' => $order_param,
-              'page' => null];
-
-      return  $view->tagAnchor($url, $label, ['data-order' => $data_order]);
-    };
-
-    $cols = [$anchor_wrapper('libelle', $this->_('Thesaurus')),
-             $anchor_wrapper('libelle_facette', $this->_('Libellé facette')),
-             $anchor_wrapper('id_thesaurus', $this->_('Code facette')),
-             $anchor_wrapper('rules_label', $this->_('Règle'))];
-
-    return $cols;
-  }
-
-
-  public function getCategoriesCols() {
-    return [$this->_('Thesaurus'),
-            $this->_('Libellé facette'),
-            $this->_('Code facette'),
-            $this->_('Règle')];
-  }
-
-
-  public function getItemsAttribs() {
-    return $this->getCategoriesAttribs();
-  }
-
-
-  public function getCategoriesAttribs() {
-    return ['libelle',
-            'libelle_facette',
-            'facette_index',
-            'rules_label'];
-  }
-
-
   public function getSearchColumns() {
     return ['libelle',
             'libelle_facette',
diff --git a/library/ZendAfi/View/Helper/Admin/ListViewMode.php b/library/ZendAfi/View/Helper/Admin/ListViewMode.php
index cb4c0f4e87fabede754ff8cc7faa987a5a57ab9a..4e382830918a6d567da83ec600891d1e42def813 100644
--- a/library/ZendAfi/View/Helper/Admin/ListViewMode.php
+++ b/library/ZendAfi/View/Helper/Admin/ListViewMode.php
@@ -67,54 +67,18 @@ class ZendAfi_View_Helper_Admin_ListViewMode extends ZendAfi_View_Helper_BaseHel
 
 
   protected function getCategoriesHTML() {
-    if ($this->_list->isSearching())
+    if(!$description = $this->_list->getCategoriesDescription())
       return '';
 
-    $labelWithCount = function($model, $attrib) {
-      return $this->_renderCategory($model, $attrib);
-    };
-
-    return $this->view
-      ->tagModelTable($this->_list->getCategories(),
-                      $this->_list->getCategoriesCols(),
-                      $this->_list->getCategoriesAttribs(),
-                      [function($model)
-                       {
-                         return $this->view->renderPluginsActions($model);
-                        }],
-                      $this->_list->getCategoriesId(),
-                      $this->_list->getCategoriesGroupBy(),
-                      [$this->_list->getCategoriesLabelAttrib() => $labelWithCount]);
-  }
-
-
-  protected function _renderCategory($model, $attrib) {
-    $url = $this->view->url($this->_list->renderCategoryUrlParams($model),
-                            null, true);
-
-    $label = Class_Admin_Skin::current()->renderActionIconOn('category', $this->view)
-      . $model->$attrib;
-
-    $count = '';
-    if ($this->_list->isCountEnabled())
-      $label .= ' (' . ($count = $this->_list->countItemsInTreeFrom($model)) . ')';
-
-    return $this->view->tagAnchor($url, $label, ['data-count' => $count]);
+    return $this->view->renderTable($description, $this->_list->getCategories());
   }
 
 
   protected function getItemsHTML() {
-    if (!$this->_list->getModel() && !$this->_list->isSearching())
+    if (!$description = $this->_list->getItemsDescription())
       return '';
 
-    $labelWithBreadcrumb = function($model, $attrib) {
-      return $this->_tag('span', $model->$attrib)
-      . $this->_tag('p',
-                    $this->getBreadcrumbHTMLFor($this->_list->getBreadcrumbFor($this->_list->getCategoryFor($model))),
-                    ['style' => 'font-size:0.9em;']);
-    };
-
-    return $this->_list->render($this->view, $labelWithBreadcrumb);
+    return $this->view->renderTable($description, $this->_list->getItems());
   }
 
 
diff --git a/library/ZendAfi/View/Helper/Admin/SearchUsers.php b/library/ZendAfi/View/Helper/Admin/SearchUsers.php
index da4eda01d3a207e06ca3ae3136e1e2dc53d18546..cf82bc4be687f5f72478e7bd8197092ad1da9ca0 100644
--- a/library/ZendAfi/View/Helper/Admin/SearchUsers.php
+++ b/library/ZendAfi/View/Helper/Admin/SearchUsers.php
@@ -72,7 +72,7 @@ class ZendAfi_View_Helper_Admin_SearchUsers extends ZendAfi_View_Helper_BaseHelp
     $description = $this
       ->_addColumnsTo(new Class_TableDescription('users_table'))
       ->addRowAction($this->actions)
-      ->setSorter(false);
+      ->setSorterNone();
 
     return $this->view->renderTable($description,
                                     (new Class_TableDescription_Models($this->users)));
diff --git a/library/ZendAfi/View/Helper/RenderModelActions.php b/library/ZendAfi/View/Helper/RenderModelActions.php
index 747af8e56bbd5a7666c41eb56b00295dd3ece618..424511789e2c345f9f4338bdfc382fa2a66d92a9 100644
--- a/library/ZendAfi/View/Helper/RenderModelActions.php
+++ b/library/ZendAfi/View/Helper/RenderModelActions.php
@@ -32,4 +32,3 @@ class ZendAfi_View_Helper_RenderModelActions extends ZendAfi_View_Helper_BaseHel
     return $this->_tag('div', $html, ['class' => 'actions']);
   }
 }
-?>
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/RenderTable.php b/library/ZendAfi/View/Helper/RenderTable.php
index c5c37a5f3b50ae4a506ccb81a12b9f8b8e59c5bb..39310338f06df3a007b1e44313142b2a151f3dbf 100644
--- a/library/ZendAfi/View/Helper/RenderTable.php
+++ b/library/ZendAfi/View/Helper/RenderTable.php
@@ -41,7 +41,7 @@ class ZendAfi_View_Helper_RenderTable extends ZendAfi_View_Helper_BaseHelper {
 
     $classes = 'models';
 
-    if($description->getSorter()) {
+    if($description->isSorterClient()) {
       $classes .= ' tablesorter';
       Class_ScriptLoader::getInstance()->loadTableSorter($description->getPager());
     }
@@ -122,8 +122,10 @@ class ZendAfi_View_Helper_RenderTable_Header extends ZendAfi_View_Helper_BaseHel
 
 
   public function _renderColumn($column) {
+    $label = $column->getLabel();
+
     return $this->_tag('th',
-                       $column->getLabel(),
+                       is_callable($label) ? $label($this->view) : $label,
                        $column->getOptions() ? $column->getOptions() : null);
   }
 }
@@ -206,6 +208,4 @@ class ZendAfi_View_Helper_RenderTable_Cell extends ZendAfi_View_Helper_BaseHelpe
   public function renderModelAction($model, $description) {
     $this->renderContent($this->view->renderModelAction($model, $description));
   }
-}
-
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/TagModelTable.php b/library/ZendAfi/View/Helper/TagModelTable.php
index 58281612b862b732e9628e51ca2ec87f626f8907..9df85bf6fbdd23b7f574241cb1b93990ed0e6eb2 100644
--- a/library/ZendAfi/View/Helper/TagModelTable.php
+++ b/library/ZendAfi/View/Helper/TagModelTable.php
@@ -51,12 +51,12 @@ class ZendAfi_View_Helper_TagModelTable extends ZendAfi_View_Helper_BaseHelper {
     foreach($actions as $action)
       $description->addRowAction($action);
 
-    $description
-      ->setSorter($sorter)
-      ->setPager($pager);
+    $description->setPager($pager);
+
+    if (!$sorter)
+      $description->setSorterNone();
 
     return $this->view->renderTable($description,
                                     (new Class_TableDescription_Models($models))->groupBy($group_by));
   }
 }
-?>
diff --git a/tests/scenarios/Thesauri/ThesauriTest.php b/tests/scenarios/Thesauri/ThesauriTest.php
index 036416c56b3e17ea328082fb353fa9f362fa575c..194b5d0da792009f5736aafe66816a1054f7cbe1 100644
--- a/tests/scenarios/Thesauri/ThesauriTest.php
+++ b/tests/scenarios/Thesauri/ThesauriTest.php
@@ -21,29 +21,32 @@
 
 
 abstract class ThesauriTestCase extends Admin_AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
+  protected
+    $_storm_default_to_volatile = true,
+    $_sifi,
+    $_docu;
 
   public function setUp() {
     parent::setUp();
 
     Class_AdminVar::set('THESAURI_BROWSER', 1);
 
-    $this->fixture('Class_CodifThesaurus',
-                   ['id' => 3,
-                    'libelle' => 'Document',
-                    'libelle_facette' => 'Document',
-                    'id_thesaurus' => 'DOCU',
-                    'id_origine' => null,
-                    'code' => 'DOCU',
-                    'rules' => '{"label":" 99$t "}']);
-
-    $this->fixture('Class_CodifThesaurus',
-                   ['id' => 4,
-                    'libelle' => 'SIFI',
-                    'libelle_facette' => 'Science fiction',
-                    'id_thesaurus' => 'DOCU0001',
-                    'id_origine' => null,
-                    'code' => 'DOCU']);
+    $this->_docu = $this->fixture('Class_CodifThesaurus',
+                                  ['id' => 3,
+                                   'libelle' => 'Document',
+                                   'libelle_facette' => 'Document',
+                                   'id_thesaurus' => 'DOCU',
+                                   'id_origine' => null,
+                                   'code' => 'DOCU',
+                                   'rules' => '{"label":" 99$t "}']);
+
+    $this->_sifi = $this->fixture('Class_CodifThesaurus',
+                                  ['id' => 4,
+                                   'libelle' => 'SIFI',
+                                   'libelle_facette' => 'Science fiction',
+                                   'id_thesaurus' => 'DOCU0001',
+                                   'id_origine' => null,
+                                   'code' => 'DOCU']);
   }
 }
 
@@ -138,19 +141,51 @@ class ThesauriIndexChildrenTest extends ThesauriTestCase {
 
 
 class ThesauriIndexChildrenSearchTest extends ThesauriTestCase {
-
   public function setUp() {
     parent::setUp();
     $_SERVER['HTTP_REFERER'] = 'http://test.org/admin/thesauri/index';
-    $this->postDispatch('/admin/thesauri/index',
-                        ['title_search' => 'Docu']);
   }
 
 
   /** @test */
   public function searchShouldRedirect() {
+    $this->postDispatch('/admin/thesauri/index',
+                        ['title_search' => 'Docu']);
     $this->assertRedirectTo('/admin/thesauri/index/title_search/Docu/page/1/order/libelle');
   }
+
+
+  /** @test */
+  public function redirectedShouldDisplayResult() {
+    $this->onLoaderOfModel('Class_CodifThesaurus')
+         ->whenCalled('root')->answers(new Class_CodifThesaurus())
+
+         ->whenCalled('findAllBy')
+         ->with(['where' => "(libelle like '%Docu%') or (libelle_facette like '%Docu%') or (code like '%Docu%') or (id_thesaurus like '%Docu%') or (rules like '%Docu%')",
+                 'order' => "libelle",
+                 'limitPage' => ["1", 25]])
+         ->answers([$this->_sifi])
+
+         ->whenCalled('countBy')
+         ->with(['where' => "(libelle like '%Docu%') or (libelle_facette like '%Docu%') or (code like '%Docu%') or (id_thesaurus like '%Docu%') or (rules like '%Docu%')",
+                 'order' => "libelle",
+                ])
+         ->answers(1)
+
+         ->whenCalled('findParent')->with('DOCU0001')
+         ->answers($this->_docu)
+
+         ->whenCalled('findParent')->with('DOCU')
+         ->answers(null)
+
+         ->beStrict();
+
+    $this->dispatch('/admin/thesauri/index/title_search/Docu/page/1/order/libelle', true);
+
+    $this->assertXPathContentContains('//span', 'SIFI');
+    $this->assertXPathContentContains('//a[contains(@href, "/admin/thesauri/index/parent_id/3")]',
+                                      'Document');
+  }
 }