diff --git a/apps/maarch_entreprise/class/class_list_show_Abstract.php b/apps/maarch_entreprise/class/class_list_show_Abstract.php
index 1a369e02330339fbdf3e619c448aeecf320fe6fd..2b247c36364b461d9e1eb427f078dd37bbc1cff2 100755
--- a/apps/maarch_entreprise/class/class_list_show_Abstract.php
+++ b/apps/maarch_entreprise/class/class_list_show_Abstract.php
@@ -1127,34 +1127,7 @@ class list_show_Abstract extends functions
                                         $path_ban = preg_replace('/(&(?!amp;))/', '&', $path_ban);
                                         $item_mode = null;
                                         if ($_REQUEST['page'] == 'users_management_controler') {
-                                            //var_dump($result[$theline][0][$key]);
-                                            $db = new Database();
-                                            $stmt = $db->query("select item_id, item_mode, entity_id, entity_label from  listmodels, entities where item_id = ? and item_mode = 'dest' and listmodels.object_id = entities.entity_id", array($result[$theline][0][$key]));
-                                            $entity_label = array();
-                                            while ($res = $stmt->fetchObject()) {
-                                                $item_mode = null;
-                                                $item_mode = $res->item_mode;
-                                                $entity_label[] = addslashes($res->entity_label);
-                                            }
-                                            if ($item_mode == 'dest') {
-                                                ?>
-                                        <a href="<?php echo $path_ban.$param_comp; ?>" class="actionList" onclick="alert('<?php echo _THE_USER_JS.$admin_id._PLEASE_CHECK_LISTDIFF;
-                                                if (count($entity_label) == 1) {
-                                                    echo $entity_label[0];
-                                                } else {
-                                                    for ($i = 0; $i < count($entity_label); ++$i) {
-                                                        echo $entity_label[$i];
-                                                        if ($i < count($entity_label) - 1) {
-                                                            echo _AND;
-                                                        }
-                                                    }
-                                                }
-
-                                                echo ' .'; ?>');"><i class="fa fa-pause fa-2x" title="<?php echo _SUSPEND; ?>"></i></a>
-
-
-                                        <?php
-                                            } else {
+                                        } else {
                                                 ?>
                                         <a href="<?php echo $path_ban.$param_comp; ?>" class="actionList" onclick="return(confirm('<?php echo _REALLY_SUSPEND.' ';
                                                 if (isset($page_name) && $page_name == 'users') {
diff --git a/migration/19.12/1912-postScript.sql b/migration/19.12/1912-postScript.sql
index 4de50d0f6c0944ca432428a5111568b00116a22f..527ff3fbbc69be2167ddfa7c5b54b24ebda2980a 100644
--- a/migration/19.12/1912-postScript.sql
+++ b/migration/19.12/1912-postScript.sql
@@ -56,6 +56,8 @@ ALTER TABLE priorities DROP COLUMN IF EXISTS default_priority;
 
 DROP TABLE IF EXISTS doctypes_indexes;
 
+DROP TABLE IF EXISTS listmodels;
+
 ALTER TABLE res_letterbox DROP COLUMN IF EXISTS custom_t1;
 ALTER TABLE res_letterbox DROP COLUMN IF EXISTS custom_t2;
 ALTER TABLE res_letterbox DROP COLUMN IF EXISTS custom_t3;
diff --git a/migration/19.12/1912.sql b/migration/19.12/1912.sql
index 70160614c07890450c795bb31d066108211f1e25..f8149032943c1a849dadd55aed4d4404d8bf55a0 100644
--- a/migration/19.12/1912.sql
+++ b/migration/19.12/1912.sql
@@ -553,6 +553,32 @@ UPDATE listmodels SET title = object_id WHERE title IS NULL;
 UPDATE baskets SET basket_clause = REGEXP_REPLACE(basket_clause, 'coll_id(\s*)=(\s*)''letterbox_coll''(\s*)AND', '', 'gmi') WHERE basket_id in ('CopyMailBasket', 'DdeAvisBasket');
 UPDATE baskets SET basket_clause = REGEXP_REPLACE(basket_clause, 'coll_id(\s*)=(\s*)''letterbox_coll''(\s*)and', '', 'gmi') WHERE basket_id in ('CopyMailBasket', 'DdeAvisBasket');
 
+/* ListTemplates */
+DROP TABLE IF EXISTS list_templates;
+CREATE TABLE list_templates
+(
+    id SERIAL NOT NULL,
+    title text NOT NULL,
+    description text,
+    type CHARACTER VARYING(32) NOT NULL,
+    entity_id INTEGER,
+    CONSTRAINT list_templates_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
+
+DROP TABLE IF EXISTS list_templates_items;
+CREATE TABLE list_templates_items
+(
+    id SERIAL NOT NULL,
+    list_template_id INTEGER NOT NULL,
+    item_id INTEGER NOT NULL,
+    item_type CHARACTER VARYING(32) NOT NULL,
+    item_mode CHARACTER VARYING(64) NOT NULL,
+    sequence INTEGER NOT NULL,
+    CONSTRAINT list_templates_items_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
+
 
 /* REFACTORING MODIFICATION */
 ALTER TABLE notif_email_stack ALTER COLUMN attachments TYPE text;
diff --git a/migration/19.12/migrate.sh b/migration/19.12/migrate.sh
index 3d720e9319921b149d09e795f7c462576cfc71b0..1d82adc5576a5046270a479853ed1fc070f73596 100755
--- a/migration/19.12/migrate.sh
+++ b/migration/19.12/migrate.sh
@@ -10,6 +10,7 @@ php ./migrateFolders.php
 php ./migrateFullText.php
 php ./migrateRedirectKeywords.php
 php ./migrateIndexing.php
+php ./migrateListTemplates.php
 php ./migrateServicesEntities.php
 php ./migrateMenuEntities.php
 php ./removeProcessModes.php
diff --git a/migration/19.12/migrateListTemplates.php b/migration/19.12/migrateListTemplates.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9b59ec7f6fbc6ef3b1681ee5d28b210b991f584
--- /dev/null
+++ b/migration/19.12/migrateListTemplates.php
@@ -0,0 +1,96 @@
+<?php
+
+require '../../vendor/autoload.php';
+
+chdir('../..');
+
+$customs =  scandir('custom');
+foreach ($customs as $custom) {
+    if ($custom == 'custom.xml' || $custom == '.' || $custom == '..') {
+        continue;
+    }
+
+    $migrated = 0;
+
+    \SrcCore\models\DatabasePDO::reset();
+    new \SrcCore\models\DatabasePDO(['customId' => $custom]);
+
+    $listModels = \SrcCore\models\DatabaseModel::select([
+        'select'    => ['*'],
+        'table'     => ['listmodels'],
+        'order_by'  => ['sequence', 'id']
+    ]);
+
+    $formattedListModels = [];
+    foreach ($listModels as $listModel) {
+        $formattedId = $listModel['object_id'].$listModel['object_type'];
+        if (empty($formattedListModels[$formattedId])) {
+            $formattedListModels[$formattedId] = [
+                'object_id'     => $listModel['object_id'],
+                'object_type'   => $listModel['object_type'],
+                'title'         => $listModel['title'],
+                'description'   => $listModel['description'],
+                'items'         => [$listModel]
+            ];
+        } else {
+            $formattedListModels[$formattedId]['items'][] = $listModel;
+        }
+    }
+
+    foreach ($formattedListModels as $value) {
+        $entityId = null;
+        if (strpos($value['object_id'], 'VISA_CIRCUIT_') === false && strpos($value['object_id'], 'AVIS_CIRCUIT_') === false) {
+            $entity = \Entity\models\EntityModel::getByEntityId(['entityId' => $value['object_id'], 'select' => ['id']]);
+            $entityId = $entity['id'];
+        }
+
+        $type = $value['object_type'] == 'entity_id' ? 'diffusionList' : ($value['object_type'] == 'VISA_CIRCUIT' ? 'visaCircuit' : 'opinionCircuit');
+        if (!empty($value['title'])) {
+            $title = $value['title'];
+        } elseif (!empty($value['description'])) {
+            $title = $value['description'];
+        } else {
+            $title = $value['object_id'];
+        }
+        if (!empty($value['title'])) {
+            $title = $value['title'];
+        } elseif (!empty($value['description'])) {
+            $title = $value['description'];
+        } else {
+            $title = $value['object_id'];
+        }
+
+        $listTemplateId = \Entity\models\ListTemplateModel::create([
+            'title'         => $title,
+            'description'   => $value['description'],
+            'type'          => $type,
+            'entity_id'     => $entityId
+        ]);
+
+        foreach ($value['items'] as $key => $item) {
+            if (empty($item['item_id'])) {
+                continue;
+            }
+            if ($item['item_type'] == 'user_id') {
+                $itemId = \User\models\UserModel::getByLogin(['login' => $item['item_id'], 'select' => ['id']]);
+            } else {
+                $itemId = \Entity\models\EntityModel::getByEntityId(['entityId' => $item['item_id'], 'select' => ['id']]);
+            }
+            if (empty($itemId['id'])) {
+                continue;
+            }
+
+            \Entity\models\ListTemplateItemModel::create([
+                'list_template_id'  => $listTemplateId,
+                'item_id'           => $itemId['id'],
+                'item_type'         => $item['item_type'] == 'user_id' ? 'user' : 'entity',
+                'item_mode'         => $item['item_mode'],
+                'sequence'          => $key
+            ]);
+        }
+
+        ++$migrated;
+    }
+
+    printf("Migration List templates (CUSTOM {$custom}) : " . $migrated . " modèles de listes trouvé(s) et migré(s).\n");
+}
diff --git a/modules/avis/class/avis_controler_Abstract.php b/modules/avis/class/avis_controler_Abstract.php
index 1f3cf5ba997cc5ba8c2b6cde0c233fa1c6778274..272d86a6d91831bca80236beffd9fdb387b64f22 100755
--- a/modules/avis/class/avis_controler_Abstract.php
+++ b/modules/avis/class/avis_controler_Abstract.php
@@ -79,15 +79,9 @@ abstract class avis_controler_Abstract
             $str .= '$j("#avisUserList").chosen({width: "250px", disable_search_threshold: 10});';
             $str .= '</script>';
 
-            include_once 'modules/entities/class/class_manage_listdiff.php';
-            $diff_list = new diffusion_list();
-            $listModels = $diff_list->select_listmodels($typeList);
 
             $str .= ' <select data-placeholder="'._ADD_AVIS_MODEL.'" name="modelList" id="modelList" onchange="loadAvisModelUsers();">';
             $str .= '<option value=""></option>';
-            foreach ($listModels as $lm) {
-                $str .= '<option value="'.$lm['object_id'].'">'.$lm['title'].'</option>';
-            }
             $str .= '</select>';
 
             $str .= '<script>';
@@ -253,15 +247,6 @@ abstract class avis_controler_Abstract
 
     public function saveModelWorkflow($id_list, $workflow, $typeList, $title)
     {
-        require_once 'modules/entities/class/class_manage_listdiff.php';
-        $diff_list = new diffusion_list();
-
-        $diff_list->save_listmodel(
-                $workflow,
-            $typeList,
-            $id_list,
-            $title
-        );
     }
 
     public function saveWorkflow($res_id, $coll_id, $workflow, $typeList)
diff --git a/modules/avis/load_listmodel_avis.php b/modules/avis/load_listmodel_avis.php
deleted file mode 100755
index d354c9ec77b82746bf580a9991439232b44d9320..0000000000000000000000000000000000000000
--- a/modules/avis/load_listmodel_avis.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
-* File : load_listmodel_avis.php
-*
-* Script called by an ajax object load list avis during
-* avis workflow
-*
-* @package  maarch
-* @version 1
-* @since 01/2016
-* @license GPL v3
-* @author  Alex Orluc  <dev@maarch.org>
-*/
-require_once 'modules/entities/class/class_manage_listdiff.php';
-require_once "modules" . DIRECTORY_SEPARATOR . "avis" . DIRECTORY_SEPARATOR
-			. "class" . DIRECTORY_SEPARATOR
-			. "avis_controler.php";
-
-
-	$db = new Database();
-	$core = new core_tools();
-	$core->load_lang();
-	$diffList = new diffusion_list();
-
-	$objectType = $_REQUEST['objectType'];
-	$objectId = $_REQUEST['objectId'];
-	$origin = 'avis';
-
-	// Get listmodel_parameters
-	$_SESSION[$origin]['difflist_type'] = $diffList->get_difflist_type($objectType);
-
-	if ($objectId <> '') {
-		$_SESSION[$origin]['difflist_object']['object_id'] = $objectId;
-		if ($objectType == 'entity_id') {
-			$stmt = $db->query("select entity_label from entities where entity_id = ?",array($objectId));
-			$res = $stmt->fetchObject();
-			if ($res->entity_label <> '') {
-				$_SESSION[$origin]['difflist_object']['object_label'] = $res->entity_label;
-			}
-		}
-	}
-
-	// Fill session with listmodel
-	$_SESSION[$origin]['diff_list'] = $diffList->get_listmodel($objectType, $objectId);
-	$_SESSION[$origin]['diff_list']['difflist_type'] = $_SESSION[$origin]['diff_list']['object_type'];
-	$roles = $diffList->list_difflist_roles();
-	$circuit = $_SESSION[$origin]['diff_list'];
-	if (!isset($circuit['avis']['users'])){
-		echo "{status : 1, error_txt : 'Modèle inexistant'}";
-		exit();
-	}
-	if ( $circuit['object_type'] == 'AVIS_CIRCUIT'){
-		$id_tab="tab_avisSetWorkflow";
-		$id_form="form_avisSetWorkflow";
-	}
-
-	$content = "";
-
-	$content .= '<thead><tr>';
-	$content .= '<th style="width:40%;" align="left" valign="bottom"><span>Avis</span></th>';
-	$content .= '<th style="width:5%;"></th>';
-	$content .= '<th style="width:5%;"></th>';
-	$content .= '<th style="width:5%;"></th>';
-	$content .= '<th style="width:5%;"></th>';
-	$content .= '<th style="width:45%;" align="left" valign="bottom"><span>Consigne</span></th>';
-	$content .= '<th style="width:0;display:none" align="left" valign="bottom"></th>';
-	$content .= '<th style="width:0;display:none" align="center" valign="bottom"></th>';
-
-	$content .= '</tr></thead>';
-	$content .= '<tbody>';
-	$color = "";
-	$avis = new avis_controler();
-	if (isset($circuit['avis']['users'])){
-		foreach($circuit['avis']['users'] as $seq=>$step){
-			if($color == ' class="col"') {
-				$color = '';
-			} else {
-				$color = ' class="col"';
-			}
-
-			$content .= '<tr ' . $color . '>';
-			$content .= '<td>';
-
-			$content .= '<span id="avis_rank_' . $seq . '"> <span class="nbResZero" style="font-weight:bold;opacity:0.5;">'. ($seq + 1) .'</span> </span>';
-			$content .= '<select id="avis_'.$seq.'" name="avis_'.$seq.'" >';
-			$content .= '<option value="" >Sélectionnez un utilisateur</option>';
-			
-			$tab_userentities = $avis->getEntityAvis();
-			$tab_users = $avis->getUsersAvis();
-
-			/** Order by parent entity **/
-			foreach ($tab_userentities as $key => $value) {
-				$content .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">';
-				foreach($tab_users as $user){
-					if($tab_userentities[$key]['entity_id'] == $user['entity_id']){
-						$selected = " ";
-						if ($user['id'] == $step['user_id'])
-							$selected = " selected";
-						$content .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].', '.$user['firstname'].'</option>';
-					}
-					
-				}
-				$content .= '</optgroup>';
-			}
-			$content .= "</select>";
-			$content .= "<span id=\"lastAvis_" . $seq . "\">";
-			$content .= "</span></td>";
-
-			$up = ' style="visibility:visible"';
-			$down = ' style="visibility:visible"';
-			if ($seq == count ($circuit['avis']['users'])-1){
-				$add = ' style="visibility:visible"';
-				$down = ' style="visibility:hidden"';
-			} else {
-				$add = ' style="visibility:hidden"';
-			}
-			if ($seq == 0)
-				$up = ' style="visibility:hidden"';
-
-			$content .= '<td><a href="javascript://"  '.$down.' id="avis_down_'.$seq.'" name="avis_down_'.$seq.'" onclick="deplacerLigneAvis(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex+2,\''.$id_tab.'\')" ><i class="fa fa-arrow-down fa-2x"></i></a></td>';
-			$content .= '<td><a href="javascript://"   '.$up.' id="avis_up_'.$seq.'" name="avis_up_'.$seq.'" onclick="deplacerLigneAvis(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex-1,\''.$id_tab.'\')" ><i class="fa fa-arrow-up fa-2x"></i></a></td>';
-			$content .= '<td><a href="javascript://" onclick="delRowAvis(this.parentNode.parentNode.rowIndex,\''.$id_tab.'\')" id="avis_suppr_'.$j.'" name="avis_suppr_'.$j.'" style="visibility:visible;" ><i class="fa fa-user-times fa-2x"></i></a></td>';
-			$content .= '<td><a href="javascript://" '.$add.'  id="avis_add_'.$seq.'" name="avis_add_'.$seq.'" onclick="addRowAvis(\''.$id_tab.'\')" ><i class="fa fa-user-plus fa-2x"></i></a></td>';
-			$content .= '<td><input type="text" id="avis_consigne_'.$seq.'" name="avis_consigne_'.$seq.'" value="'.$step['process_comment'].'" onmouseover="setTitle(this);" style="width:95%;"/></td>';
-			$content .= '<td style="display:none"><input type="hidden" value="'.$step['process_date'].'" id="avis_date_'.$seq.'" name="avis_date_'.$seq.'"/></td>';
-			$content .= '<td style="display:none"><input type="checkbox" style="visibility:hidden" id="avis_isSign_'.$seq.'" name="avis_isSign_'.$seq.'" /></td>';
-			$content .= '<td><i class="fa fa-plus fa-lg" title="Nouvel utilisateur ajouté"></i></td>';
-			$content .= "</tr>";
-		}
-	}
-
-	$content .= '</tbody>';
-
-	echo "{status : 0, div_content : '" . addslashes($content.'<br>') . "'}";
-	exit();
diff --git a/modules/avis/load_listmodel_avis_popup.php b/modules/avis/load_listmodel_avis_popup.php
deleted file mode 100755
index d38a483e46d04bb371e060238ab3b3d318590fbf..0000000000000000000000000000000000000000
--- a/modules/avis/load_listmodel_avis_popup.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-/**
-* File : load_listmodel_avis.php.
-*
-* Script called by an ajax object load list avis during
-* avis workflow
-*
-* @version 1
-*
-* @since 01/2016
-*
-* @license GPL v3
-* @author  Alex Orluc  <dev@maarch.org>
-*/
-require_once 'modules/entities/class/class_manage_listdiff.php';
-require_once 'modules'.DIRECTORY_SEPARATOR.'avis'.DIRECTORY_SEPARATOR
-            .'class'.DIRECTORY_SEPARATOR
-            .'avis_controler.php';
-
-    $db = new Database();
-    $core = new core_tools();
-    $core->load_lang();
-    $diffList = new diffusion_list();
-
-    $objectType = $_REQUEST['objectType'];
-    $objectId = $_REQUEST['objectId'];
-    $origin = 'avis';
-
-    // Get listmodel_parameters
-    $_SESSION[$origin]['difflist_type'] = $diffList->get_difflist_type($objectType);
-
-    if ($objectId != '') {
-        $_SESSION[$origin]['difflist_object']['object_id'] = $objectId;
-        if ($objectType == 'entity_id') {
-            $stmt = $db->query('select entity_label from entities where entity_id = ?', array($objectId));
-            $res = $stmt->fetchObject();
-            if ($res->entity_label != '') {
-                $_SESSION[$origin]['difflist_object']['object_label'] = $res->entity_label;
-            }
-        }
-    }
-
-    // Fill session with listmodel
-    $_SESSION[$origin]['diff_list'] = $diffList->get_listmodel($objectType, $objectId);
-    $_SESSION[$origin]['diff_list']['difflist_type'] = $_SESSION[$origin]['diff_list']['object_type'];
-    $roles = $diffList->list_difflist_roles();
-    $circuit = $_SESSION[$origin]['diff_list'];
-    if (!isset($circuit['avis']['users'])) {
-        echo "{status : 1, error_txt : 'Modèle inexistant'}";
-        exit();
-    }
-    if ($circuit['object_type'] == 'AVIS_CIRCUIT') {
-        $id_tab = 'tab_avisSetWorkflowPopup';
-        $id_form = 'form_avisSetWorkflowPopup';
-    }
-
-    $content = '';
-
-    $content .= '<thead><tr>';
-    $content .= '<th style="width:40%;" align="left" valign="bottom"><span>Avis</span></th>';
-    $content .= '<th style="width:5%;"></th>';
-    $content .= '<th style="width:5%;"></th>';
-    $content .= '<th style="width:5%;"></th>';
-    $content .= '<th style="width:5%;"></th>';
-    $content .= '<th style="width:45%;" align="left" valign="bottom"><span>Consigne</span></th>';
-    $content .= '<th style="width:0;display:none" align="left" valign="bottom"></th>';
-    $content .= '<th style="width:0;display:none" align="center" valign="bottom"></th>';
-
-    $content .= '</tr></thead>';
-    $content .= '<tbody>';
-    $color = '';
-    $avis = new avis_controler();
-    if (isset($circuit['avis']['users'])) {
-        foreach ($circuit['avis']['users'] as $seq => $step) {
-            if ($color == ' class="col"') {
-                $color = '';
-            } else {
-                $color = ' class="col"';
-            }
-
-            $content .= '<tr '.$color.'>';
-            $content .= '<td>';
-
-            $content .= '<span id="avisPopup_rank_'.$seq.'"> <span class="nbResZero" style="font-weight:bold;opacity:0.5;">'.($seq + 1).'</span> </span>';
-            $content .= '<select id="avisPopup_'.$seq.'" name="avisPopup_'.$seq.'" >';
-            $content .= '<option value="" >Sélectionnez un utilisateur</option>';
-
-            $tab_userentities = $avis->getEntityAvis();
-            $tab_users = $avis->getUsersAvis();
-
-            /* Order by parent entity **/
-            foreach ($tab_userentities as $key => $value) {
-                $content .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">';
-                foreach ($tab_users as $user) {
-                    if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) {
-                        $selected = ' ';
-                        if ($user['id'] == $step['user_id']) {
-                            $selected = ' selected';
-                        }
-                        $content .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].', '.$user['firstname'].'</option>';
-                    }
-                }
-                $content .= '</optgroup>';
-            }
-            $content .= '</select>';
-            $content .= '<span id="lastAvisPopup_'.$seq.'">';
-            if (empty($circuit['sign']['users']) && $seq == count($circuit['avis']['users']) - 1) {
-                $content .= ' <i title="'._LAST_AVIS.'" style="color : #F99830" class="fa fa-certificate fa-lg fa-fw"></i>';
-            }
-            $content .= '</span></td>';
-
-            $up = ' style="visibility:visible"';
-            $down = ' style="visibility:visible"';
-            if ($seq == count($circuit['avis']['users']) - 1) {
-                $add = ' style="visibility:visible"';
-                $down = ' style="visibility:hidden"';
-            } else {
-                $add = ' style="visibility:hidden"';
-            }
-            if ($seq == 0) {
-                $up = ' style="visibility:hidden"';
-            }
-
-            $content .= '<td><a href="javascript://"  '.$down.' id="avisPopup_down_'.$seq.'" name="avisPopup_down_'.$seq.'" onclick="deplacerLigneAvisPopup(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex+2,\''.$id_tab.'\')" ><i class="fa fa-arrow-down fa-2x"></i></a></td>';
-            $content .= '<td><a href="javascript://"   '.$up.' id="avisPopup_up_'.$seq.'" name="avisPopup_up_'.$seq.'" onclick="deplacerLigneAvisPopup(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex-1,\''.$id_tab.'\')" ><i class="fa fa-arrow-up fa-2x"></i></a></td>';
-            $content .= '<td><a href="javascript://" onclick="delRowAvisPopup(this.parentNode.parentNode.rowIndex,\''.$id_tab.'\')" id="avisPopup_suppr_'.$j.'" name="avisPopup_suppr_'.$j.'" style="visibility:visible;" ><i class="fa fa-user-times fa-2x"></i></a></td>';
-            $content .= '<td><a href="javascript://" '.$add.'  id="avisPopup_add_'.$seq.'" name="avisPopup_add_'.$seq.'" onclick="addRowAvisPopup(\''.$id_tab.'\')" ><i class="fa fa-user-plus fa-2x"></i></a></td>';
-            $content .= '<td><input type="text" id="avisPopup_consigne_'.$seq.'" name="avisPopup_consigne_'.$seq.'" value="'.$step['process_comment'].'" onmouseover="setTitle(this);" style="width:95%;"/></td>';
-            $content .= '<td style="display:none"><input type="hidden" value="'.$step['process_date'].'" id="avisPopup_date_'.$seq.'" name="avisPopup_date_'.$seq.'"/></td>';
-            $content .= '<td style="display:none"><input type="checkbox" style="visibility:hidden" id="avisPopup_isSign_'.$seq.'" name="avisPopup_isSign_'.$seq.'" /></td>';
-            $content .= '<td><i class="fa fa-plus fa-lg" title="Nouvel utilisateur ajouté"></i></td>';
-            $content .= '</tr>';
-        }
-    }
-
-    $content .= '</tbody>';
-
-    echo "{status : 0, div_content : '".addslashes($content.'<br>')."'}";
-    exit();
diff --git a/modules/avis/load_listmodel_avis_users.php b/modules/avis/load_listmodel_avis_users.php
deleted file mode 100755
index 2e998683a4634dc5ea1b275d4533cf4e1e4df307..0000000000000000000000000000000000000000
--- a/modules/avis/load_listmodel_avis_users.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/*
- * Copyright Maarch since 2008 under licence GPLv3.
- * See LICENCE.txt file at the root folder for more details.
- * This file is part of Maarch software.
- * 
- */
-
-/*
- * @brief load_listmodel_avis_users
- * @author dev@maarch.org
- * @ingroup avis
- * 
- */
-require_once 'modules/entities/class/class_manage_listdiff.php';
-require_once "modules" . DIRECTORY_SEPARATOR . "avis" . DIRECTORY_SEPARATOR
-        . "class" . DIRECTORY_SEPARATOR
-        . "avis_controler.php";
-
-
-$db = new Database();
-$core = new core_tools();
-$core->load_lang();
-$diffList = new diffusion_list();
-
-$objectType = $_REQUEST['objectType'];
-$objectId = $_REQUEST['objectId'];
-$origin = 'avis';
-
-// Get listmodel_parameters
-$contentListModel = $diffList->get_listmodel($objectType, $objectId);
-
-if (!$contentListModel['avis']['users']) {
-    $contentListModel['avis']['users'] = array();
-}
-
-$userList = $contentListModel['avis']['users'];
-
-$userList = json_encode($userList);
-
-
-echo "{\"status\" : 0, \"result\" :" . $userList . "}";
-exit();
diff --git a/modules/avis/xml/IVS/requests_definitions.xml b/modules/avis/xml/IVS/requests_definitions.xml
index a23ecd8a60c45ea6c387adcf9c9dd9ae5c3d6e4a..0948a5b1de7d2abc413eb74e458e645dc8f1d3e7 100755
--- a/modules/avis/xml/IVS/requests_definitions.xml
+++ b/modules/avis/xml/IVS/requests_definitions.xml
@@ -12,14 +12,6 @@
       <parameter name="module" value="avis"/>
       <parameter name="page" value="resetAvisWF"/> 
     </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="load_listmodel_Avis" >
-        <parameter name="page" value="load_listmodel_Avis"/>
-        <parameter name="module" value="Avis"/>
-    </requestDefinition>
-    <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="load_listmodel_Avis" >
-        <parameter name="page" value="load_listmodel_Avis"/>
-        <parameter name="module" value="Avis"/>
-    </requestDefinition>
     <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="getAvisModelByTitle" >
       <parameter name="display" value="true"/>
       <parameter name="module" value="avis"/>
@@ -54,4 +46,4 @@
         <parameter name="module" value="Avis"/>
     </requestDefinition>
 </requestDefinitions>
-</inputValidation>
\ No newline at end of file
+</inputValidation>
diff --git a/modules/entities/admin_listmodel.php b/modules/entities/admin_listmodel.php
deleted file mode 100755
index 74deedbbaf07bf678d09ce7a971dad80996cf462..0000000000000000000000000000000000000000
--- a/modules/entities/admin_listmodel.php
+++ /dev/null
@@ -1,341 +0,0 @@
-<?php
-/**
-* Copyright Maarch since 2008 under licence GPLv3.
-* See LICENCE.txt file at the root folder for more details.
-* This file is part of Maarch software.
-
-* @brief   admin_listmodel
-* @author  dev <dev@maarch.org>
-* @ingroup entities
-*/
-
-require_once 'modules/entities/class/class_manage_listdiff.php';
-require_once 'core/class/usergroups_controler.php';
-$core_tools = new core_tools();
-
-$admin = new core_tools();
-$admin->test_admin('admin_listmodels', 'entities');
- /****************Management of the location bar  ************/
-$init = false;
-if (isset($_REQUEST['reinit']) && $_REQUEST['reinit'] == "true") {
-    $init = true;
-}
-$level = "";
-if (isset($_REQUEST['level']) &&($_REQUEST['level'] == 2 || $_REQUEST['level'] == 3 || $_REQUEST['level'] == 4 || $_REQUEST['level'] == 1)) {
-    $level = $_REQUEST['level'];
-}
-$page_path = $_SESSION['config']['businessappurl'].'index.php?page=amdin_listmodel&module=entities';
-$page_label = _ADMIN_LISTMODEL;
-$page_id = "amdin_listmodel";
-$admin->manage_location_bar($page_path, $page_label, $page_id, $init, $level);
-
-$difflist = new diffusion_list();
-
-//all roles available
-$roles = $difflist->list_difflist_roles();
-
-//list difflist_types
-$difflistTypes = $difflist->list_difflist_types();
-
-$mode = $_REQUEST['mode'];
-
-$objectType = trim(strtok($_REQUEST['id'], '|'));
-$objectId = strtok('|');
-
-//Load listmodel into session  
-if (!isset($_SESSION['m_admin']['entity']['listmodel'])) {
-    //Listmodel to be loaded (up action on list or reload in add mode)
-    $_SESSION['m_admin']['entity']['difflist_type'] = $difflist->get_difflist_type($objectType);
-    
-    $_SESSION['m_admin']['entity']['listmodel'] = $difflist->get_listmodel($objectType, $objectId);
-
-    $title =  $_SESSION['m_admin']['entity']['listmodel']['title'];
-    $description =  $_SESSION['m_admin']['entity']['listmodel']['description'];
-} else {
-    //list already loaded and managed (reload after update of list)
-    $objectType = $_SESSION['m_admin']['entity']['listmodel']['object_type'];
-    $objectId = $_SESSION['m_admin']['entity']['listmodel']['object_id'];
-    $title = $_SESSION['m_admin']['entity']['listmodel']['title'];
-    $description =  $_SESSION['m_admin']['entity']['listmodel']['description'];
-}
-?>
-
-<script type="text/javascript">
-/**
- *  [OnChange ObjectType / onLoad]
- */
-function listmodel_setObjectType() 
-{
-    var objectType = $('objectType').value;
-    var objectType_info = $('objectType_info');
-    new Ajax.Request(
-        'index.php?display=true&module=entities&page=admin_listmodel_setObjectType',
-        {
-            method:'post',
-            parameters: 
-            { 
-                objectType : objectType
-            },
-            onSuccess: function(answer){
-                objectType_info.innerHTML = answer.responseText;
-                objectType_info.style.display = 'block';
-            }
-        }
-    );
-}
-
-function listmodel_setObjectId(objectId) 
-{
-    var mode = $('mode').value;
-    
-    var objectType = $('objectType').value;
-    var objectId_input = $('objectId_input');
-
-    new Ajax.Request(
-        'index.php?display=true&module=entities&page=admin_listmodel_setObjectId',
-        {
-            method:'post',
-            parameters: 
-            { 
-                mode : mode,
-                objectType : objectType,
-                objectId : objectId
-            },
-            onSuccess: function(answer){
-                objectId_input.innerHTML = answer.responseText;
-                objectId_input.style.display = 'block';
-                if(objectId != ''){
-                   new Chosen($('objectId'),{width: "300px", disable_search_threshold: 10, search_contains: true});
-                }
-            }
-        }
-    );
-
-}
-
-function listmodel_validate() {
-    // Control input values
-    var main_error = $('main_error'); 
-       
-    var mode = $('mode').value; 
-    var objectType = $('objectType').value; 
-    var objectId = $('objectId').value; 
-    var title = $('title').value;
-    var description = $('description').value; 
-    
-    main_error.innerHTML = "";
-    
-    new Ajax.Request(
-        'index.php?display=true&module=entities&page=admin_listmodel_validateHeader',
-        {
-            method:'post',
-            asynchronous:false,
-            parameters: 
-            { 
-                mode : mode,
-                objectType : objectType,
-                objectId : objectId,
-                title : title,
-                description : description 
-            },
-            onSuccess: function(answer) {
-                if(answer.responseText) {
-                    main_error.innerHTML += answer.responseText;
-                    this.valid = false;
-                    main_error.style.display = 'table-cell';
-                    Element.hide.delay(10, 'main_error');
-                } else {
-                    this.valid = true;
-                }
-            }
-        }
-    ); 
-    return this.valid;
-}
-
-function listmodel_save()
-{
-    var mode = $('mode').value;  
-    var objectType = $('objectType').value; 
-    var objectId = $('objectId').value;
-    var title = $('title').value; 
-    var description = $('description').value; 
-    
-    
-    // Validate form
-    var valid = listmodel_validate();
-    if(valid == false)
-        return;
-    
-    // Check if type/id already used
-    new Ajax.Request(
-        'index.php?display=true&module=entities&page=admin_listmodel_save',
-        {
-            method:'post',
-            parameters: 
-            { 
-                mode : mode,
-                objectType : objectType,
-                objectId : objectId,
-                title : title,
-                description : description
-            },
-            onSuccess: function(answer){
-                if(answer.responseText)
-                    main_error.innerHTML = answer.responseText;
-                else {
-                    goTo('index.php?module=entities&page=admin_listmodels');
-                }
-            }
-        }
-    ); 
-}
-
-function listmodel_del(
-    objectType,
-    objectId
-) {    
-    new Ajax.Request(
-        'index.php?display=true&module=entities&page=admin_listmodel_save',
-        {
-            method:'post',
-            parameters: 
-            { 
-                mode : 'del',
-                objectType : objectType,
-                objectId : objectId,
-            },
-            onSuccess: function(answer){
-                if(answer.responseText)
-                    main_error.innerHTML = answer.responseText;
-                else {
-                    goTo('index.php?module=entities&page=admin_listmodels');
-                }
-            }
-        }
-    ); 
-
-}
-</script>
-
-<?php
-$frm = '';
-if ($mode != 'del') {
-    //TITLE
-    $frm .= '<h1><i class="fa fa-share-alt-square fa-2x"></i> '._ADMIN_LISTMODEL;
-    if ($objectType) {
-        $frm .= ' : '.$difflistTypes[$objectType];
-    }
-    if ($objectId) {
-        $frm .= ' '.$objectId;
-    }
-    $frm .= '</h1>';
-
-    $frm .= '<br/>';
-
-    //RIGHT BOX
-    $frm .= '<div id="listmodel_box" class="block" style="height:550px;">';
-    $frm .= '<h2 class="tit">'._LINKED_DIFF_LIST.'</h2>';
-    $difflist = $_SESSION['m_admin']['entity']['listmodel'];
-    echo $frm;
-    include_once 'modules/entities/difflist_display.php';
-    $frm = '<p class="buttons" style="text-align:center;margin-top:5px;">';
-    $frm .= '<input type="button" class="button" value="'._MODIFY_LIST.'"';
-    $frm .= '</p>';
-    $frm .= '</div>';
-
-    //LEFT BOX
-    $frm .= '<div class="block" style="float:left;width:65%;height:550px;">';
-    $frm .= '<table style="margin:auto;">';
-    $frm .= '<tr height="20px;">';
-    $frm .= '<td>';
-    $frm .= '<input type="hidden" id="mode" value="'.$_REQUEST['mode'].'" />';
-    $frm .= '</td>';
-    $frm .= '</tr>';
-    $frm .= '<tr>';
-    $frm .= '<td width="33%">';
-    $frm .= '<label for="objectType" >'._OBJECT_TYPE.' : </label>';
-    $frm .= '</td>';
-    $frm .= '<td>';
-    $frm .= '<select name="objectType" id="objectType" onChange="listmodel_setObjectType();listmodel_setObjectId();" style="width:300px;"';
-    if ($mode == 'up') {
-        $frm .= ' disabled="true" ';
-    }
-    $frm .= '>';
-    $frm .= '<option value="" >'._SELECT_OBJECT_TYPE.'</option>';
-    foreach ($difflistTypes as $difflistTypeId => $difflistTypeLabel) {
-        $frm .= '<option value="'.$difflistTypeId.'"';
-        if ($objectType == $difflistTypeId) {
-            $frm .= ' selected="true" ';
-        }
-        $frm .= '>';
-        $frm .= $difflistTypeLabel;
-        $frm .= '</option>';
-    }
-    $frm .= '</select>';
-    $frm .= '<script type="text/javascript">new Chosen($(\'objectType\'),{width: "300px", disable_search_threshold: 10, search_contains: true});</script>';
-    $frm .= '</td>';
-    $frm .= '</tr>';
-    $frm .= '<tr>';
-    $frm .= '<td>';
-    $frm .= '<label for="objectId" >'._ID.' : </label>';
-    $frm .= '</td>';
-    $frm .= '<td>';
-    $frm .= '<div id="objectId_input">';
-    if ($mode == 'up') {
-        $frm .= ' <input type="text" id="objectId" disabled="true" value="'.$objectId.'" />';
-    } else {
-        $frm .= '<script type="text/javascript">';
-        $frm .= 'listmodel_setObjectId(\''.$objectId.'\');';
-        $frm .= '</script>';
-    }
-    $frm .= '</div>';
-    $frm .= '</td>';
-    $frm .= '</tr>';
-    $frm .= '<tr>';
-    $frm .= '<td>';
-    $frm .= '<label for="title" >'._TITLE.' : </label>';
-    $frm .= '</td>';
-    $frm .= '<td>';
-    $frm .= '<textarea id="title" style="width:294px;">'.$title.'</textarea>';
-    $frm .= '</td>';
-    $frm .= '</tr>';
-    $frm .= '<tr>';
-    $frm .= '<td>';
-    $frm .= '<label for="description"  >'._DESCRIPTION.' : </label>';
-    $frm .= '</td>';
-    $frm .= '<td>';
-    $frm .= '<textarea id="description" style="width:294px;">'.$description.'</textarea>';
-    $frm .= '</td>';
-    $frm .= '</tr>';
-    $frm .= '<tr>';
-    $frm .= '<td>';
-    $frm .= '<label for="objectType_info" >'._DIFFLIST_TYPE_ROLES.' : </label>';
-    $frm .= '</td>';
-    $frm .= '<td>';
-    $frm .= '<span id="objectType_info">'.trim($_SESSION['m_admin']['entity']['difflist_type']->difflist_type_roles).'</span>';
-    $frm .= '</td>';
-    $frm .= '</tr>';
-    $frm .= '</table>';
-    $frm .= '<br/>';
-    $frm .= '<br/>';
-    $frm .= '<p class="buttons" style="text-align:center;">';
-    if ($objectType && $objectId) {
-        $frm .= '<input type="button" onclick="listmodel_save();" class="button" value="'._SAVE_LISTMODEL.'" />';
-    }
-    $frm .= ' <input type="button" onclick="goTo(\'index.php?module=entities&page=admin_listmodels\');" class="button" value="'._CANCEL.'" />';
-    $frm .= '</p>';
-    $frm .= '</div>';
-    $frm .= '</div>';
-
-    $frm .= '<div class="clearfix"></div>';
-}
-
-//DEL => REDIRECT TO AJAX SAVE
-if ($_REQUEST['mode'] == 'del') {
-    $frm .= '<script type="text/javascript">';
-    $frm .= 'listmodel_del(\''.$objectType.'\',\''.$objectId.'\');';
-    $frm .= '</script>';
-}
-    
-echo $frm;
diff --git a/modules/entities/admin_listmodel_save.php b/modules/entities/admin_listmodel_save.php
deleted file mode 100755
index 48e5d5902a2d57b122e6c4f6634aa5ebf140d708..0000000000000000000000000000000000000000
--- a/modules/entities/admin_listmodel_save.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
-* Copyright Maarch since 2008 under licence GPLv3.
-* See LICENCE.txt file at the root folder for more details.
-* This file is part of Maarch software.
-
-* @brief   admin_listmodel_save
-* @author  dev <dev@maarch.org>
-* @ingroup entities
-*/
-
-//AJAX save listmodel from admin_listmodel
-require_once "modules/entities/class/class_manage_listdiff.php";
-$difflist = new diffusion_list();
-
-switch($_REQUEST['mode']) {
-case 'up':
-    $difflist->save_listmodel(
-        $_SESSION['m_admin']['entity']['listmodel'], 
-        $objectType = $_REQUEST['objectType'],
-        $objectId = $_REQUEST['objectId'],
-        $title = $_REQUEST['title'],
-        $description = $_REQUEST['description']
-    );
-    $_SESSION['info'] = _ADMIN_LISTMODEL.' '._UPDATED;
-    break;
-case 'add':
-    $difflist->save_listmodel(
-        $_SESSION['m_admin']['entity']['listmodel'], 
-        $objectType = $_REQUEST['objectType'],
-        $objectId = $_REQUEST['objectId'],
-        $title = $_REQUEST['title'],
-        $description = $_REQUEST['description']
-    );
-    $_SESSION['info'] = _ADMIN_LISTMODEL.' '._ADDED;
-    break;
-    
-case 'del':
-    $difflist->delete_listmodel(
-        $objectType = $_REQUEST['objectType'],
-        $objectId = $_REQUEST['objectId']
-    );
-    $_SESSION['info'] = _ADMIN_LISTMODEL.' '._DELETED;
-    break;
-}
\ No newline at end of file
diff --git a/modules/entities/admin_listmodel_setObjectId.php b/modules/entities/admin_listmodel_setObjectId.php
deleted file mode 100755
index f1733056ff831da4a6b9eebdb94bc8c0df53b9f0..0000000000000000000000000000000000000000
--- a/modules/entities/admin_listmodel_setObjectId.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-# AJAX script to list objects to be linked with list model
-
-function asSelect(
-    $items,
-    $objectId = false
-) {
-    $return = "<select id='objectId' style='width:300px;'>";
-    
-    foreach($items as $id => $label) {
-        $return .= "<option value='".$id."'";
-        if($id == $objectId) $return .= " selected='true' ";
-        $return .= ">";
-            if($id) $return .=  $id . ' ';
-            $return .= $label;
-            
-        $return .= "</option>";
-    }
-    $return .= "</select>";
-    return $return;
-}
-
-require_once 'core/class/class_core_tools.php';
-$core = new core_tools();
-$core->load_lang();
-
-require_once 'modules/entities/class/class_manage_listdiff.php';
-$difflist = new diffusion_list();
-
-$mode = $_REQUEST['mode'];
-$objectType = $_REQUEST['objectType'];
-$objectId = $_REQUEST['objectId'];
-
-if(!$objectType) {
-    echo ""; 
-    return;
-}
-
-switch($objectType) {
-case 'entity_id':   
-    require_once 'modules/entities/class/class_manage_entities.php';
-    $ent = new entity();
-    $entity_ids = $ent->get_all_entities_id_user();
-    $entities = array();
-    for($i=0, $l=count($entity_ids);
-        $i<$l;
-        $i++
-    ) {
-        $entity_id = substr($entity_ids[$i], 1, -1);
-        $existinglist = 
-            $difflist->get_listmodel(
-                'entity_id',
-                $entity_id
-            );
-        if(!$existinglist) {
-            $entities[$entity_id] = $ent->getentitylabel($entity_id); 
-        }
-    }
-    if(count($entities) > 0)
-        echo asSelect($entities, $objectId);
-    else {   
-        echo asSelect(array("" => _ALL_OBJECTS_ARE_LINKED));
-    }    
-    break;
-case 'VISA_CIRCUIT':   
-    require_once 'modules/entities/class/class_manage_entities.php';
-    $ent = new entity();
-    $entity_ids = $ent->get_all_entities_id_user();
-    $entities = array();
-    for($i=0, $l=count($entity_ids);
-        $i<$l;
-        $i++
-    ) {
-        $entity_id = substr($entity_ids[$i], 1, -1);
-        $existinglist = 
-            $difflist->get_listmodel(
-                'VISA_CIRCUIT',
-                $entity_id
-            );
-        if(!$existinglist) {
-            $entities[$entity_id] = $ent->getentitylabel($entity_id); 
-        }
-    }
-    if(count($entities) > 0)
-        echo asSelect($entities, $objectId);
-    else {   
-        echo asSelect(array("" => _ALL_OBJECTS_ARE_LINKED));
-    }    
-    break;
-
-case 'AVIS_CIRCUIT':   
-    require_once 'modules/entities/class/class_manage_entities.php';
-    $ent = new entity();
-    $entity_ids = $ent->get_all_entities_id_user();
-    $entities = array();
-    for($i=0, $l=count($entity_ids);
-        $i<$l;
-        $i++
-    ) {
-        $entity_id = substr($entity_ids[$i], 1, -1);
-        $existinglist = 
-            $difflist->get_listmodel(
-                'VISA_CIRCUIT',
-                $entity_id
-            );
-        if(!$existinglist) {
-            $entities[$entity_id] = $ent->getentitylabel($entity_id); 
-        }
-    }
-    if(count($entities) > 0)
-        echo asSelect($entities, $objectId);
-    else {   
-        echo asSelect(array("" => _ALL_OBJECTS_ARE_LINKED));
-    }    
-    break;
-     
-case 'type_id':
-    require_once 'core/class/class_db_pdo.php';
-    require_once 'core/core_tables.php';
-    $db = new Database();
-    $stmt = $db->query("SELECT type_id, description FROM  " . DOCTYPES_TABLE);
-    while($doctype = $stmt->fetchObject()) {
-        $type_id = $doctype->type_id;
-        $existinglist = 
-            $difflist->get_listmodel(
-                'type_id',
-                $type_id
-            );
-        if(!$existinglist) {
-            $doctypes[$type_id] = $doctype->description; 
-        }
-    }
-    if(count($doctypes) > 0)
-        echo asSelect($doctypes, $objectId);
-    else    
-        echo asSelect(array("" => _ALL_OBJECTS_ARE_LINKED));
-    
-    break;
-    
-case 'user_defined_id':
-default:
-    if(!$objectId) 
-        $objectId = $objectType . '_' . strtoupper(base_convert(date('U'), 10, 36));
-    echo "<input type='text' id='objectId' style='width:300px;' value='$objectId' />";
-    break;
-}
-
diff --git a/modules/entities/admin_listmodel_setObjectType.php b/modules/entities/admin_listmodel_setObjectType.php
deleted file mode 100755
index 3052c5bbbe56f957c38aa74e82aef220f2559ef2..0000000000000000000000000000000000000000
--- a/modules/entities/admin_listmodel_setObjectType.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-# AJAX script to load objectType/difflist_type onto session
-
-require_once 'modules/entities/class/class_manage_listdiff.php';
-$difflist = new diffusion_list();
-
-$objectType = $_REQUEST['objectType'];
-
-$_SESSION['m_admin']['entity']['difflist_type'] = $difflist->get_difflist_type($objectType);
-
-echo str_replace(' ', ', ', trim($_SESSION['m_admin']['entity']['difflist_type']->difflist_type_roles));
diff --git a/modules/entities/admin_listmodel_validateHeader.php b/modules/entities/admin_listmodel_validateHeader.php
deleted file mode 100755
index 122759ae62d0e5379a29ca6c7bda883502307cff..0000000000000000000000000000000000000000
--- a/modules/entities/admin_listmodel_validateHeader.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-# AJAX Script to validate listmodel header values
-# and load into session if needed
-
-require_once 'core/class/class_core_tools.php';
-$core = new core_tools();
-$core->load_lang();
-
-require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php");
-require_once("modules/entities/entities_tables.php");
-
-$db = new Database();
-
-$mode = $_REQUEST['mode'];
-$objectType = $_REQUEST['objectType'];
-$objectId = $_REQUEST['objectId'];
-$description = $_REQUEST['description'];
-$title = $_REQUEST['title'];
-
-//print_r($description); exit;
-
-$return = "";
-
-if($objectId == '' || $objectType == '')
-    $return .= _SELECT_OBJECT_TYPE_AND_ID . "<br/>";
-    
-if($title == '')
-    $return .= _ENTER_TITLE . "<br/>";
-    
-if($mode == 'add' && $objectId && $objectType && $collId) {
-    $stmt = $db->query(
-        "select count(1) as nb from " . ENT_LISTMODELS
-        . " where object_type = ?"
-        . " and object_id = ?",array($objectType,$objectId)
-    );
-    $res = $stmt->fetchObject();
-    if($res->nb > 0)
-        $return .= _LISTMODEL_ID_ALREADY_USED . "<br/>";
-}
-
-# Load header into session
-$_SESSION['m_admin']['entity']['listmodel']['object_type'] = $objectType;
-$_SESSION['m_admin']['entity']['listmodel']['object_id'] = $objectId;
-$_SESSION['m_admin']['entity']['listmodel']['description'] = $description;
-$_SESSION['m_admin']['entity']['listmodel']['title'] = $title;
-# Return messages
-echo $return;
\ No newline at end of file
diff --git a/modules/entities/admin_listmodels.php b/modules/entities/admin_listmodels.php
deleted file mode 100755
index a22ac75374a16225be3ded18c273e257284808e0..0000000000000000000000000000000000000000
--- a/modules/entities/admin_listmodels.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-/**
-* Copyright Maarch since 2008 under licence GPLv3.
-* See LICENCE.txt file at the root folder for more details.
-* This file is part of Maarch software.
-
-* @brief   admin_listmodels
-* @author  dev <dev@maarch.org>
-* @ingroup entities
-*/
-
-$admin = new core_tools();
-$admin->test_admin('admin_listmodels', 'entities');
-$_SESSION['m_admin']= array();
-/****************Management of the location bar  ************/
-$init = false;
-if (isset($_REQUEST['reinit']) && $_REQUEST['reinit'] == "true") {
-    $init = true;
-}
-$level = "";
-if (isset($_REQUEST['level']) && ($_REQUEST['level'] == 2 || $_REQUEST['level'] == 3 || $_REQUEST['level'] == 4 || $_REQUEST['level'] == 1)) {
-    $level = $_REQUEST['level'];
-}
-$page_path = $_SESSION['config']['businessappurl'].'index.php?page=admin_listmodels&module=entities';
-$page_label = _LISTMODELS;
-$page_id = "admin_listmodels";
-$admin->manage_location_bar($page_path, $page_label, $page_id, $init, $level);
-/***********************************************************/
-
-require_once "apps".DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'].DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_list_show.php";
-require_once "core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php";
-require_once 'modules'.DIRECTORY_SEPARATOR.'entities'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_manage_entities.php';
-require_once 'modules/entities/class/class_manage_listdiff.php';
-require_once "modules/entities/entities_tables.php";
-
-$ent = new entity();
-$func = new functions();
-$request = new request;
-
-$listdiff = new diffusion_list();
-$roles = $listdiff->list_difflist_roles();
-$difflist_types = $listdiff->list_difflist_types();
-
-$what = '';
-$where = '';
-
-$list = new list_show();
-$arrayPDO = array();
-
-if (isset($_REQUEST['what']) && !empty($_REQUEST['what'])) {
-    $what = $func->protect_string_db($_REQUEST['what']);
-    $where = " (lower(object_id) like lower(?) or lower(description) like lower(?)) and ";
-    $arrayPDO = array_merge($arrayPDO, array("%".$what."%", "%".$what."%"));
-}
-
-if ($_SESSION['user']['UserId'] != 'superadmin') {
-    $my_tab_entities_id = $ent->get_all_entities_id_user($_SESSION['user']['entities']);
-    if (count($my_tab_entities_id)>0) {
-        //we need all entities that are managed by connected user
-        $where.= '('.ENT_LISTMODELS.'.object_id in ('.join(',', $my_tab_entities_id).') OR '.ENT_LISTMODELS.'.object_id LIKE \'VISA_%\' OR '.ENT_LISTMODELS.'.object_id LIKE \'AVIS_%\') and';
-    }
-}
-
-$order = 'asc';
-if (isset($_REQUEST['order']) && !empty($_REQUEST['order'])) {
-
-    $order = trim($_REQUEST['order']);
-}
-$field = 'object_id';
-if (isset($_REQUEST['order_field']) && !empty($_REQUEST['order_field'])) {
-    $field = trim($_REQUEST['order_field']);
-}
-
-$orderstr = $list->define_order($order, $field);
-
-$select[ENT_LISTMODELS] = array();
-array_push($select[ENT_LISTMODELS], "object_type || '|' || object_id as list_id", 'object_type', 'object_id', 'title', 'description');
-
-$where .= ' 1=1 group by object_type, object_id, title, description';
-// var_dump($select);
-// var_dump($where);
-$tab = $request->PDOselect($select, $where, $arrayPDO, $orderstr, $_SESSION['config']['databasetype']);
-
-for ($i=0;$i<count($tab);$i++) {
-
-    for ($j=0;$j<count($tab[$i]);$j++) {
-
-        foreach (array_keys($tab[$i][$j]) as $value) {
-
-            if ($tab[$i][$j][$value]=="list_id") {
-
-                $tab[$i][$j]['value']=$request->show_string($tab[$i][$j]['value']);
-                $tab[$i][$j]["list_id"]=$tab[$i][$j]['value'];
-                $tab[$i][$j]["label"]=_ID;
-                $tab[$i][$j]["size"]="25";
-                $tab[$i][$j]["label_align"]="left";
-                $tab[$i][$j]["align"]="left";
-                $tab[$i][$j]["order"]=$tab[$i][$j][$value];
-                $tab[$i][$j]["valign"]="bottom";
-                $tab[$i][$j]["show"]=false;
-            }
-            
-            if ($tab[$i][$j][$value]=="object_type") {
-
-                $objectType = $tab[$i][$j]['value'];
-                $tab[$i][$j]['value'] = $difflist_types[$objectType];
-                $tab[$i][$j]["label"]= _OBJECT_TYPE;
-                $tab[$i][$j]["size"]="18";
-                $tab[$i][$j]["label_align"]="left";
-                $tab[$i][$j]["align"]="left";
-                $tab[$i][$j]["order"]=$tab[$i][$j][$value];
-                $tab[$i][$j]["valign"]="bottom";
-                $tab[$i][$j]["show"]=true;
-            }
-            
-            if ($tab[$i][$j][$value]=="object_id") {
-
-                $tab[$i][$j]["object_id"]=$tab[$i][$j]['value'];
-                $tab[$i][$j]["label"]= _ID;
-                $tab[$i][$j]["size"]="18";
-                $tab[$i][$j]["label_align"]="left";
-                $tab[$i][$j]["align"]="left";
-                $tab[$i][$j]["order"]=$tab[$i][$j][$value];
-                $tab[$i][$j]["valign"]="bottom";
-                $tab[$i][$j]["show"]=true;
-            }
-            
-            if ($tab[$i][$j][$value]=="title") {
-                $tab[$i][$j]['value']=$request->show_string($tab[$i][$j]['value']);
-                $tab[$i][$j]["title"]=$tab[$i][$j]['value'];
-                $tab[$i][$j]["label"]=_TITLE;
-                $tab[$i][$j]["size"]="30";
-                $tab[$i][$j]["label_align"]="left";
-                $tab[$i][$j]["align"]="left";
-                $tab[$i][$j]["order"]=$tab[$i][$j][$value];
-                $tab[$i][$j]["valign"]="bottom";
-                $tab[$i][$j]["show"]=true;
-            }
-
-            if ($tab[$i][$j][$value]=="description") {
-
-                $tab[$i][$j]['value']=$request->show_string($tab[$i][$j]['value']);
-                $tab[$i][$j]["description"]=$tab[$i][$j]['value'];
-                $tab[$i][$j]["label"]=_DESCRIPTION;
-                $tab[$i][$j]["size"]="20";
-                $tab[$i][$j]["label_align"]="left";
-                $tab[$i][$j]["align"]="left";
-                $tab[$i][$j]["order"]=$tab[$i][$j][$value];
-                $tab[$i][$j]["valign"]="bottom";
-                $tab[$i][$j]["show"]=true;
-            }
-
-        }
-    }
-}
-
-$page_name = "admin_listmodels";
-$page_name_up = "admin_listmodel&mode=up";
-$page_name_add = "admin_listmodel&mode=add";
-$page_name_del = "admin_listmodel&mode=del";
-$label_add = _ADD_LISTMODEL;
-$_SESSION['m_admin']['init'] = true;
-
-$title = _LISTMODELS." : ".$i." "._LISTMODEL;
-//$autoCompletionArray = false;//array();
-$autoCompletionArray = array();
-$autoCompletionArray["list_script_url"] = $_SESSION['config']['businessappurl'].'index.php?display=true&module=entities&page=listmodels_list_by_label';
-$autoCompletionArray["number_to_begin"] = 1;
-
-$list->admin_list($tab, $i, $title, 'list_id','admin_listmodels','entities', 'list_id', true, $page_name_up, $page_name_val, $page_name_ban, $page_name_del, $page_name_add, $label_add, false, false, _ALL_LISTMODELS, _LISTMODEL, "share-alt-square", true, true, false, true, "", true, $autoCompletionArray, false, true);
-?>
diff --git a/modules/entities/class/class_manage_entities_Abstract.php b/modules/entities/class/class_manage_entities_Abstract.php
index 05defd428731658a803d6348cf77d8f1ce0ab07b..ebde6cbfcb98b8f7e5edbd132ca32dfecea91dab 100755
--- a/modules/entities/class/class_manage_entities_Abstract.php
+++ b/modules/entities/class/class_manage_entities_Abstract.php
@@ -1416,11 +1416,6 @@ abstract class entity_Abstract extends functions
                     $element_found = true;
                     $nb_listinstances = $stmt->rowCount();
                 }
-                $stmt = $db->query("select object_id from ".$_SESSION['tablename']['ent_listmodels']." where object_id = ?",array($s_id));
-                if($stmt->rowCount() > 0)
-                {
-                    $nb_listmodels = $stmt->rowCount();
-                }
             }
         }
         if($element_found)
@@ -1452,7 +1447,6 @@ abstract class entity_Abstract extends functions
                     {
                         echo "<br> - ".$nb_redirect_baskets." "._BASKET_REDIRECTIONS_OCCURS_LINKED_TO;
                         echo "<br> - ".$nb_listinstances." "._LISTISTANCES_OCCURS_LINKED_TO;
-                        echo "<br> - ".$nb_listmodels." "._LISTMODELS_OCCURS_LINKED_TO;
                     }
                     if($admin->is_module_loaded('templates'))
                     {
diff --git a/modules/entities/class/class_manage_listdiff_Abstract.php b/modules/entities/class/class_manage_listdiff_Abstract.php
index 123a1df5c539d13eedf903f7a60bf3af02dcb495..09534cad6bcf1aab45f45e48ff070d34b2e96e3f 100755
--- a/modules/entities/class/class_manage_listdiff_Abstract.php
+++ b/modules/entities/class/class_manage_listdiff_Abstract.php
@@ -15,290 +15,6 @@ require_once 'core/core_tables.php';
 
 abstract class diffusion_list_Abstract extends functions
 {
-    //**************************************************************************
-    // LISTMODELS
-    // Administration and use of diffusion list templates
-    //**************************************************************************
-    public function select_listmodels(
-        $objectType = 'entity_id'
-    ) {
-        $listmodels = array();
-        $db = new Database();
-
-        $query =
-            'SELECT distinct object_type, object_id, description, title'
-            .' FROM '.ENT_LISTMODELS
-            .' WHERE object_type = ?'
-            .' GROUP BY object_type, object_id, description, title  '
-            .' ORDER BY object_type ASC, object_id ASC';
-
-        $stmt = $db->query($query, array($objectType));
-
-        while ($listmodel = $stmt->fetch(PDO::FETCH_ASSOC)) {
-            if ($listmodel['title'] == '') {
-                $listmodel['title'] = $listmodel['object_id'];
-            }
-
-            $listmodels[] = $listmodel;
-        }
-
-        return $listmodels;
-    }
-
-    /**
-     * Gets the diffusion list model for a given entity.
-     *
-     * @param string $entityId Entity identifier
-     * @param array  $collId   Collection identifier ('letterbox_coll' by default)
-     *
-     * @return array $listmodel['dest] : Data of the dest_user
-     *               ['user_id'] : identifier of the dest_user
-     *               ['lastname'] : Lastname of the dest_user
-     *               ['firstname'] : firstname of the dest_user
-     *               ['entity_id'] : entity identifier of the dest_user
-     *               ['entity_label'] : entity label of the dest_user
-     *               ['copy'] : Data of the copies
-     *               ['users'][$i] : Users in copy data
-     *               ['user_id'] : identifier of the user in copy
-     *               ['lastname'] : Lastname of the user in copy
-     *               ['firstname'] : firstname of the user in copy
-     *               ['entity_id'] : entity identifier of the user in copy
-     *               ['entity_label'] : entity label of the user in copy
-     *               ['entities'][$i] : Entities in copy data
-     *               ['entity_id'] : entity identifier of the entity in copy
-     *               ['entity_label'] : entity label of the entity in copy
-     */
-    public function get_listmodel(
-        $objectType = 'entity_id',
-        $objectId
-    ) {
-        $objectId = $objectId;
-        $objectType = $objectType;
-
-        $db = new Database();
-        $roles = $this->list_difflist_roles();
-        $listmodel = array();
-
-        if (empty($objectId) || empty($objectType)) {
-            return $listmodel;
-        }
-
-        // Load header
-        $query =
-            'SELECT distinct object_type, object_id,  description, title'
-            .' FROM '.ENT_LISTMODELS
-            .' WHERE object_type = ?'
-                .'and object_id = ?'
-            .' GROUP BY object_type, object_id,  description, title';
-        $stmt = $db->query($query, array($objectType, $objectId));
-
-        $listmodel = $stmt->fetch(PDO::FETCH_ASSOC);
-
-        // Load list
-        foreach ($roles as $role_id => $role_label) {
-            if ($role_id == 'copy') {
-                $item_mode = 'cc';
-            } else {
-                $item_mode = $role_id;
-            }
-            // Users
-            $stmt = $db->query(
-                'SELECT l.item_id, l.item_mode, u.firstname, u.lastname, e.entity_id, e.entity_label, l.process_comment '
-                .' FROM '.ENT_LISTMODELS.' l '
-                    .' JOIN '.USERS_TABLE.' u ON l.item_id = u.user_id '
-                    .' JOIN '.ENT_USERS_ENTITIES.' ue ON u.user_id = ue.user_id '
-                    .' JOIN '.ENT_ENTITIES.' e ON ue.entity_id = e.entity_id'
-                .' WHERE '
-                    ."ue.primary_entity = 'Y' "
-                    .'and l.item_mode = ? '
-                    ."and l.item_type = 'user_id' "
-                    .'and l.object_type = ? '
-                    .'and l.object_id = ? '
-                    ."and u.status != 'SPD' "
-                    ."and u.status != 'DEL' "
-                .'ORDER BY l.sequence',
-                array($item_mode, $objectType, $objectId)
-            );
-            while ($user = $stmt->fetchObject()) {
-                if (!isset($listmodel[$role_id])) {
-                    $listmodel[$role_id] = array();
-                }
-                if (!isset($listmodel[$role_id]['users'])) {
-                    $listmodel[$role_id]['users'] = array();
-                }
-
-                if ($user->process_comment === null) {
-                    $user->process_comment = '';
-                }
-
-                if ($user->item_mode == 'sign') {
-                    $user->requested_signature = true;
-                } else {
-                    $user->requested_signature = false;
-                }
-
-                array_push(
-                    $listmodel[$role_id]['users'],
-                    array(
-                        'user_id' => functions::show_string($user->item_id),
-                        'lastname' => functions::show_string($user->lastname),
-                        'firstname' => functions::show_string($user->firstname),
-                        'entity_id' => functions::show_string($user->entity_id),
-                        'entity_label' => functions::show_string($user->entity_label),
-                        'process_comment' => $user->process_comment,
-                        'requested_signature' => $user->requested_signature,
-                    )
-                );
-            }
-
-            // Entities
-            $stmt = $db->query(
-                'SELECT l.item_id, e.entity_label, l.item_mode '
-                .'FROM '.ENT_LISTMODELS.' l '
-                    .'JOIN '.ENT_ENTITIES.' e ON l.item_id = e.entity_id '
-                .'WHERE '
-                    .' l.item_mode = ? '
-                    ."and l.item_type = 'entity_id' "
-                    .'and l.object_type = ? '
-                    .'and l.object_id = ? '
-                .'ORDER BY l.sequence ',
-                array($item_mode, $objectType, $objectId)
-            );
-
-            while ($entity = $stmt->fetchObject()) {
-                if (!isset($listmodel[$role_id])) {
-                    $listmodel[$role_id] = array();
-                }
-                if (!isset($listmodel[$role_id]['entities'])) {
-                    $listmodel[$role_id]['entities'] = array();
-                }
-
-                array_push(
-                    $listmodel[$role_id]['entities'],
-                    array(
-                        'entity_id' => functions::show_string($entity->item_id),
-                        'entity_label' => functions::show_string($entity->entity_label),
-                    )
-                );
-            }
-        }
-
-        return $listmodel;
-    }
-
-    public function save_listmodel(
-        $diffList,
-        $objectType = 'entity_id',
-        $objectId,
-        $title = false,
-        $description = false
-    ) {
-        $db = new Database();
-        $roles = $this->list_difflist_roles();
-
-        require_once 'core/class/class_history.php';
-        $hist = new history();
-
-        //echo "bug"; print_r($description); exit;
-
-        $objectType = trim($objectType);
-        $objectId = trim($objectId);
-        $title = trim($title);
-        $description = trim($description);
-
-        // Delete all and replace full list
-        //**********************************************************************
-        $stmt = $db->query(
-            'delete from '.ENT_LISTMODELS
-            .' where '
-                .'object_type = ? '
-                .'and object_id = ? ',
-            array($objectType, $objectId)
-        );
-        foreach ($roles as $role_id => $role_label) {
-            if ($role_id == 'copy') {
-                $item_mode = 'cc';
-            } else {
-                $item_mode = $role_id;
-            }
-
-            // users
-            //**********************************************************************
-            $l = 0;
-            if (!empty($diffList[$role_id]['users']) && is_array($diffList[$role_id]['users'])) {
-                $l = count($diffList[$role_id]['users']);
-            }
-            for ($i = 0;
-                $i < $l;
-                ++$i
-            ) {
-                $user = $diffList[$role_id]['users'][$i];
-                //print_r($description); exit;
-                $stmt = $db->query(
-                    'insert into '.ENT_LISTMODELS
-                        .' (object_id, object_type, sequence, item_id, item_type, item_mode, description, title, process_comment ) '
-                    .' values ('
-                        .'? , '
-                        .'?, ?, '
-                        .'?, '
-                        ."'user_id', "
-                        .'?, '
-                        .'?,'
-                        .'?,'
-                        .'?,'
-                        .'?'
-                    .')',
-                    array($objectId, $objectType, $i, $user['user_id'], $item_mode, $description, $title, $user['process_comment'])
-                );
-            }
-            // Entities
-            //**********************************************************************
-            $l = 0;
-            if (!empty($diffList[$role_id]['entities']) && is_array($diffList[$role_id]['entities'])) {
-                $l = count($diffList[$role_id]['entities']);
-            }
-            for ($i = 0; $i < $l; ++$i) {
-                $entity = $diffList[$role_id]['entities'][$i];
-                //print_r($description); exit;
-                $stmt = $db->query(
-                    'insert into '.ENT_LISTMODELS
-                        .' (object_id, object_type, sequence, item_id, item_type, item_mode, description, title ) '
-                    .' values ('
-                        .'? , '
-                        .'?, ?, '
-                        .'?, '
-                        ."'entity_id', "
-                        .'?, '
-                        .'?, '
-                        .'?,'
-                        .'?'
-                    .')',
-                    array($objectId, $objectType, $i, $entity['entity_id'], $item_mode, $description, $title)
-                );
-            }
-        }
-    }
-
-    public function delete_listmodel(
-        $objectType = 'entity_id',
-        $objectId
-    ) {
-        $db = new Database();
-
-        $objectType = trim($objectType);
-        $objectId = trim($objectId);
-
-        // Delete all and replace full list
-        //**********************************************************************
-        $stmt = $db->query(
-            'delete from '.ENT_LISTMODELS
-            .' where '
-                .'object_type = ? '
-                .'and object_id = ? ',
-            array($objectType, $objectId)
-        );
-    }
-
     //**************************************************************************
     // LISTINSTANCE
     // Management of diffusion lists for documents and folders
diff --git a/modules/entities/class/class_modules_tools_Abstract.php b/modules/entities/class/class_modules_tools_Abstract.php
index 4bb69cce13dbc4ed3e97c8fd57df5d00c43bcfd3..7da89663306f72d85999b79536e20de47e0966f8 100755
--- a/modules/entities/class/class_modules_tools_Abstract.php
+++ b/modules/entities/class/class_modules_tools_Abstract.php
@@ -65,8 +65,6 @@ abstract class entities_Abstract extends functions
                 (string) $tablename->ent_entities;
             $_SESSION['tablename']['ent_users_entities'] =
                 (string) $tablename->ent_users_entities;
-            $_SESSION['tablename']['ent_listmodels'] =
-                (string) $tablename->ent_listmodels;
             $_SESSION['tablename']['ent_listinstance'] =
                    (string) $tablename->ent_listinstance;
             $_SESSION['tablename']['ent_groupbasket_redirect'] =
diff --git a/modules/entities/entities_tables.php b/modules/entities/entities_tables.php
index 2cb22ecd17f4006b0a99944bd822f978df2ba696..e0bb50e95dd6b9adb987040a324f7e64a24dc2e5 100755
--- a/modules/entities/entities_tables.php
+++ b/modules/entities/entities_tables.php
@@ -35,9 +35,6 @@ if (! defined('ENT_ENTITIES')) {
 if (! defined('ENT_USERS_ENTITIES')) {
     define('ENT_USERS_ENTITIES', 'users_entities');
 }
-if (! defined('ENT_LISTMODELS')) {
-    define('ENT_LISTMODELS', 'listmodels');
-}
 if (! defined('ENT_LISTINSTANCE')) {
     define('ENT_LISTINSTANCE', 'listinstance');
 }
diff --git a/modules/entities/js/functions.js b/modules/entities/js/functions.js
index 62d93f1dda332a03d53682d6fe2efa27355b504e..0f3e842b1aac9f0792c76b9d5926e0591e26426d 100755
--- a/modules/entities/js/functions.js
+++ b/modules/entities/js/functions.js
@@ -94,36 +94,6 @@ function change_entity(
     }
 }
 
-// Load list of listmodels to fill select list (index, validate)
-// >>> type of list (entity_id, type_id, custom list type)
-// >>> type of element to fill (select or list)
-// >>> id of element to fill
-function select_listmodels(
-	objectType, 
-	returnElementType, 
-	returnElementId
-) {
-        console.log('appel select_listmodels');
-
-	new Ajax.Request(
-		'index.php?display=true&module=entities&page=select_listmodels',
-        {
-            method:'post',
-            parameters: { 
-				objectType : objectType,
-				returnElementType : returnElementType
-            },
-            onSuccess: function(answer)
-				{
-					var returnElement = $(returnElementId);
-					if(returnElement != null && returnElement.nodeName.toUpperCase() == returnElementType.toUpperCase()) {
-						returnElement.innerHTML += answer.responseText;
-					}
-				}
-        }
-	);
-}
-
 // Load listmodel to session[origin]
 // >>> type of list (entity_id, type_id, custom list type)
 // >>> id of list (entity_id, type_id, custom id)
@@ -425,4 +395,4 @@ function moveToDest(user_id,role_id,origin) {
         }
 
      });
-}
\ No newline at end of file
+}
diff --git a/modules/entities/listmodels_list_by_label.php b/modules/entities/listmodels_list_by_label.php
deleted file mode 100755
index 966bc3cf94bd528f2c7864f99d11ab0077abaf78..0000000000000000000000000000000000000000
--- a/modules/entities/listmodels_list_by_label.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
-* File : entities_list_by_label.php
-*
-* List of entities for autocompletion
-*
-* @package  Maarch Framework 3.0
-* @version 3
-* @since 10/2005
-* @license GPL
-* @author Cédric Ndoumba <dev@maarch.org>
-*/
-
-require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php");
-require_once('modules'.DIRECTORY_SEPARATOR.'entities'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_manage_entities.php');
-require_once("modules/entities/entities_tables.php");
-$ent = new entity();
-$db = new Database();
-
-$select = "select distinct(description) from ".ENT_LISTMODELS;
-$where = " where (lower(description) like lower(?) ";
-$where .= " or lower(object_id) like lower(?)) ";
-
-if($_SESSION['user']['UserId'] != 'superadmin')
-{
-    $my_tab_entities_id = $ent->get_all_entities_id_user($_SESSION['user']['entities']);
-    if (count($my_tab_entities_id)>0)
-    {
-        $where.= ' and object_id in ('.join(',', $my_tab_entities_id).')';
-    }
-}
-
-$sql = $select.$where." order by description";
-//var_dump($sql);
-$stmt = $db->query($sql,array("%".$_REQUEST['what']."%","%".$_REQUEST['what']."%"));
-$listModels = array();
-while($line = $stmt->fetchObject())
-{
-    array_push($listModels, $line->description);
-}
-
-echo "<ul>\n";
-$authViewList = 0;
-foreach($listModels as $description)
-{
-    if($authViewList >= 10)
-    {
-        $flagAuthView = true;
-    }
-    // if(stripos($entity, $_REQUEST['what']) === 0)
-    // {
-        echo "<li>".$description."</li>\n";
-        if(isset($flagAuthView) && $flagAuthView)
-        {
-            echo "<li>...</li>\n";
-            break;
-        }
-        $authViewList++;
-    // }
-}
-echo "</ul>";
diff --git a/modules/entities/load_listinstance.php b/modules/entities/load_listinstance.php
index fce5a00627638e0e10e6844fa8b355da1064212f..1d675de9a874768685762ed068ae8d9f8a7ac4dc 100755
--- a/modules/entities/load_listinstance.php
+++ b/modules/entities/load_listinstance.php
@@ -74,11 +74,6 @@ $objectId   = $_REQUEST['objectId'];
 // Get listmodel_parameters
 $_SESSION[$origin]['difflist_type'] = $diffList->get_difflist_type($objectType);
 
-if ($_REQUEST['load_from_model'] == 'true') {
-    $_SESSION[$origin]['diff_list'] = $diffList->get_listmodel($objectType, $objectId);
-    $_SESSION[$origin]['diff_list']['difflist_type'] = $_SESSION[$origin]['diff_list']['object_type'];
-}
-
 if ($objectId <> '') {
     $_SESSION[$origin]['difflist_object']['object_id'] = $objectId;
     if ($objectType == 'entity_id') {
diff --git a/modules/entities/load_listmodel.php b/modules/entities/load_listmodel.php
deleted file mode 100755
index abf0068cd54ef04c6edd83e48a90aa709061ccdf..0000000000000000000000000000000000000000
--- a/modules/entities/load_listmodel.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/**
-* File : change_doctype.php
-*
-* Script called by an ajax object to process the document type change during
-* indexing (index_mlb.php)
-*
-* @package  maarch
-* @version 1
-* @since 10/2005
-* @license GPL v3
-* @author  Cyril Vazquez  <dev@maarch.org>
-*/
-require_once 'modules/entities/class/class_manage_listdiff.php';
-
-$db = new Database();
-$core = new core_tools();
-$core->load_lang();
-$diffList = new diffusion_list();
-
-$objectType = $_REQUEST['objectType'];
-$objectId   = $_REQUEST['objectId'];
-$origin     = $_REQUEST['origin'];
-$category   = $_REQUEST['category'];
-
-// Get listmodel_parameters
-$_SESSION[$origin]['difflist_type'] = $diffList->get_difflist_type($objectType);
-
-if ($objectId <> '') {
-    $_SESSION[$origin]['difflist_object']['object_id'] = $objectId;
-    if ($objectType == 'entity_id') {
-        $query = "SELECT entity_label FROM entities WHERE entity_id = ?";
-        $stmt = $db->query($query, array($objectId));
-        $res = $stmt->fetchObject();
-        if ($res->entity_label <> '') {
-            $_SESSION[$origin]['difflist_object']['object_label'] = $res->entity_label;
-        }
-    }
-}
-
-// Fill session with listmodel
-$_SESSION[$origin]['diff_list'] = $diffList->get_listmodel($objectType, $objectId);
-//Permet de bloquer la liste diffusion avec celle de l'utilisateur qui enregistre le courrier.
-if ($category == 'outgoing' && $origin == 'indexing' && $objectId == $_SESSION['user']['primaryentity']['id']) {
-    $_SESSION[$origin]['diff_list']['dest']['users'] = array();
-
-    //Get the right primary entity
-    $primaryEntityId = $_SESSION['user']['primaryentity']['id'];
-    foreach ($_SESSION['user']['entities'] as $entity) {
-        if ($entity['ENTITY_ID']==$primaryEntityId) {
-            $primaryEntityLabel = $entity['ENTITY_LABEL'];
-        }
-    }
-
-    $diffListOutgoing = array(
-        'user_id'         => $_SESSION['user']['UserId'],
-        'lastname'        => $_SESSION['user']['LastName'],
-        'firstname'       => $_SESSION['user']['FirstName'],
-        'entity_id'       => $primaryEntityId,
-        'entity_label'    => $primaryEntityLabel,
-        'visible'         => 'Y',
-        'process_comment' => ''
-    );
-
-    $_SESSION[$origin]['diff_list']['dest']['users'][]=$diffListOutgoing;
-    $_SESSION[$origin]['diff_list']['copy'] = array();
-}
-
-$_SESSION[$origin]['diff_list']['difflist_type'] = $_SESSION[$origin]['diff_list']['object_type'];
-$roles = $diffList->list_difflist_roles();
-$difflist = $_SESSION[$origin]['diff_list'];
-
-$content = '';
-if (! $onlyCC) {
-    if (isset($_SESSION['validStep']) && $_SESSION['validStep'] == 'ok') {
-        $content .= "";
-    }
-}
-
-# Get content from buffer of difflist_display 
-ob_start();
-require_once 'modules/entities/difflist_display.php';
-$content .= str_replace(array("\r", "\n", "\t"), array("", "", ""), ob_get_contents());
-ob_end_clean();
-
-$labelButton = _UPDATE_LIST_DIFF;
-$arg = '&mode=up';
-
-if (!$core->test_service('edit_recipient_outside_process', 'entities', false) && $origin == 'indexing') {
-    $onlyCC = true;
-}
-
-if ($onlyCC) {
-    $arg .= '&only_cc';
-}
-$content_standard = '<center><b>' . _DIFF_LIST . '</b> | ';
-$content_standard .= '<span class="button" >';
-$content_standard .= '<small><input type="button" style="margin-top:0px;" class="button" title="'.$labelButton.'" value="'.$labelButton.'" '
-         . 'onclick="window.open(\''
-         . $_SESSION['config']['businessappurl'] . 'index.php?display=true'
-         . '&module=entities&page=manage_listinstance&cat='.$category.'&origin=' . $origin . $arg
-         . '\', \'\', \'scrollbars=yes,menubar=no,toolbar=no,status=no,'
-         . 'resizable=yes,width=1280,height=800,location=no\');"/></small>';
-$content_standard .= '</span></center>';
-
-echo "{status : 0, div_content : '" . addslashes($content_standard . $content . '<br>')
-    . "', div_content_action : '" . addslashes($content) . "'}";
-exit();
diff --git a/modules/entities/select_listmodels.php b/modules/entities/select_listmodels.php
deleted file mode 100755
index 94fc2250cc44dcb3d631de1f7822aa38b1ec140b..0000000000000000000000000000000000000000
--- a/modules/entities/select_listmodels.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-// AJAX 
-// Loads a list of listmodels onto a html structure
-// >>> difflist_type : type of list (listmodels.object_type)
-// >>> return type : type of list to return [select | ul]
-require_once 'modules/entities/class/class_manage_listdiff.php';
-$difflist = new diffusion_list();
-
-$objectType = $_REQUEST['objectType'];
-$returnElementType = $_REQUEST['returnElementType'];
-
-$listmodels = $difflist->select_listmodels($objectType);
-$l = count($listmodels);
-
-$return = "";
-
-switch($returnElementType) {
-case 'select':
-    for($i=0; $i<$l; $i++) {
-        $listmodel = $listmodels[$i];
-        $return .= "<option value='".functions::xecho($listmodel['object_id'])."' >"
-            . functions::xecho($listmodel['description']) ."</option>";
-    }
-    break;
-    
-case 'list':
-    for($i=0; $i<$l; $i++) {
-        $listmodel = $listmodels[$i];
-        $return .= "<li id='" . functions::xecho($listmodel['object_id']) 
-            ."'>" . functions::xecho($listmodel['description']) . "</li>";
-    }
-    break;
-}
-
-echo $return;
diff --git a/modules/entities/xml/IVS/requests_definitions.xml b/modules/entities/xml/IVS/requests_definitions.xml
index ae8333a232fddf311b78eb0f22c2316ea77aee89..00c717cfcdddf145c1b11b1a1a8e1d434ba07031 100755
--- a/modules/entities/xml/IVS/requests_definitions.xml
+++ b/modules/entities/xml/IVS/requests_definitions.xml
@@ -14,11 +14,6 @@
 		<parameter name="display" value="true"/>
 		<parameter name="module" value="entities"/>
     </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="select_listmodels" >
-		<parameter name="page" value="select_listmodels"/>
-		<parameter name="display" value="true"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
     <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="save_list_diff" >
 		<parameter name="page" value="save_list_diff"/>
 		<parameter name="display" value="true"/>
@@ -86,47 +81,6 @@
 		<parameter name="page" value="admin_difflist_type_validate"/>
 		<parameter name="module" value="entities"/>
     </requestDefinition>
-    <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodels" >
-		<parameter name="page" value="admin_listmodels"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel" >
-		<parameter name="page" value="admin_listmodel"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel" >
-		<parameter name="page" value="admin_listmodel"/>
-		<parameter name="display" value="true"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel_setObjectId">
-		<parameter name="page" value="admin_listmodel_setObjectId"/>
-		<parameter name="display" value="true"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel_validateHeader">
-		<parameter name="page" value="admin_listmodel_validateHeader"/>
-		<parameter name="display" value="true"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel_save">
-		<parameter name="page" value="admin_listmodel_save"/>
-		<parameter name="display" value="true"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel_save">
-		<parameter name="page" value="admin_listmodel_save"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel_setObjectType">
-		<parameter name="page" value="admin_listmodel_setObjectType"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
-    <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="admin_listmodel_setObjectType">
-		<parameter name="page" value="admin_listmodel_setObjectType"/>
-		<parameter name="display" value="true"/>
-		<parameter name="module" value="entities"/>
-    </requestDefinition>
     <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="check_user_entities">
 		<parameter name="page" value="check_user_entities"/>
 		<parameter name="module" value="entities"/>
diff --git a/modules/entities/xml/IVS/validation_rules.xml b/modules/entities/xml/IVS/validation_rules.xml
index 8f478edc6bfe8c88653a5cf42d279b4081dd3844..f4c89e9ac591d7d24c581ab7afd084180a305451 100755
--- a/modules/entities/xml/IVS/validation_rules.xml
+++ b/modules/entities/xml/IVS/validation_rules.xml
@@ -11,11 +11,6 @@
 		<parameter name="module" type="identifier" />
 		<parameter name="entities" type="ajax_ids" />
     </validationRule>
-    <validationRule name="select_listmodels" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-		<parameter name="objectType" type="string" />
-		<parameter name="returnElementType" type="string" />
-    </validationRule>
     <validationRule name="save_list_diff" extends="standardForm" mode="error">
 		<parameter name="module" type="identifier" />
 		<parameter name="mode" type="entities_table_list" />
@@ -86,44 +81,6 @@
 		<parameter name="allow_entities" type="string" />
 		<parameter name="mode" type="mode" />
     </validationRule>
-    <validationRule name="admin_listmodels" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-    </validationRule>
-    <validationRule name="admin_listmodel" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-		<parameter name="id" type="string" />
-		<parameter name="mode" type="mode" />
-    </validationRule>
-    <validationRule name="admin_listmodel_setObjectId" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-		<parameter name="objectId" type="string" />
-		<parameter name="objectType" type="string" />
-		<parameter name="mode" type="mode" />
-    </validationRule>
-    <validationRule name="admin_listmodel_validateHeader" extends="standardForm" mode="error">
-		<parameter name="description" type="string" />
-		<parameter name="objectId" type="string" />
-		<parameter name="objectType" type="string" />
-		<parameter name="title" type="string" />
-    </validationRule>
-    <validationRule name="admin_listmodel_save" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-		<parameter name="objectId" type="string" />
-		<parameter name="objectType" type="string" />
-		<parameter name="description" type="string" />
-		<parameter name="title" type="string" />
-    </validationRule>
-    <validationRule name="admin_listmodel_setObjectType" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-		<parameter name="objectType" type="identifier" />
-    </validationRule>
-    <validationRule name="load_listmodel" extends="standardForm" mode="error">
-		<parameter name="module" type="identifier" />
-		<parameter name="objectType" type="string" />
-		<parameter name="objectId" type="string" />
-		<parameter name="category" type="string" />
-		<parameter name="origin" type="identifier" />
-    </validationRule>
     <validationRule name="check_user_entities" extends="standardForm" mode="error">
 		<parameter name="module" type="identifier" />
 		<parameter name="form_values" type="string" />
diff --git a/modules/entities/xml/config.xml b/modules/entities/xml/config.xml
index e357c4b19c476a33c66097a388d0f3f067cf4286..e766dfeeb9a02630d918957478ad1d2281adfdfe 100755
--- a/modules/entities/xml/config.xml
+++ b/modules/entities/xml/config.xml
@@ -9,7 +9,6 @@
 	<TABLENAME>
 		<ent_entities>entities</ent_entities>
 		<ent_users_entities>users_entities</ent_users_entities>
-		<ent_listmodels>listmodels</ent_listmodels>
 		<ent_listinstance>listinstance</ent_listinstance>
 		<ent_groupbasket_redirect>groupbasket_redirect</ent_groupbasket_redirect>
 	</TABLENAME>
@@ -20,4 +19,4 @@
 		<entityval>true</entityval>
 		<entityban>true</entityban>
 	</HISTORY>
-</root>
\ No newline at end of file
+</root>
diff --git a/modules/visa/class/class_modules_tools_Abstract.php b/modules/visa/class/class_modules_tools_Abstract.php
index b4ed9ad244c57675f05c0fab1a0a085a823aff30..a090da200a277165a9c9bc818e563f36b2ed9371 100755
--- a/modules/visa/class/class_modules_tools_Abstract.php
+++ b/modules/visa/class/class_modules_tools_Abstract.php
@@ -149,15 +149,6 @@ abstract class visa_Abstract extends Database
 
     public function saveModelWorkflow($id_list, $workflow, $typeList, $title)
     {
-        require_once 'modules/entities/class/class_manage_listdiff.php';
-        $diff_list = new diffusion_list();
-
-        $diff_list->save_listmodel(
-            $workflow,
-            $typeList,
-            $id_list,
-            $title
-        );
     }
 
     protected function getWorkflowsNumberByTitle($title)
@@ -402,15 +393,8 @@ abstract class visa_Abstract extends Database
             $str .= ' $j("#visaUserList").chosen({width: "250px", disable_search_threshold: 10});';
             $str .= '</script>';
 
-            require_once 'modules/entities/class/class_manage_listdiff.php';
-            $diff_list = new diffusion_list();
-            $listModels = $diff_list->select_listmodels($typeList);
-
             $str .= ' <select data-placeholder="'._ADD_VISA_MODEL.'" name="modelList" id="modelList" onchange="loadVisaModelUsers();">';
             $str .= '<option value=""></option>';
-            foreach ($listModels as $lm) {
-                $str .= '<option value="'.$lm['object_id'].'">'.$lm['title'].'</option>';
-            }
             $str .= '</select>';
 
             $str .= '<script>';
diff --git a/modules/visa/load_listmodel_visa.php b/modules/visa/load_listmodel_visa.php
index 13f09a56adcc451d6795179ea8914f60ccde80d9..4fe6c6a5bebc1505df97a0f0271a5b0970cfa5e3 100755
--- a/modules/visa/load_listmodel_visa.php
+++ b/modules/visa/load_listmodel_visa.php
@@ -40,9 +40,6 @@ require_once 'modules'.DIRECTORY_SEPARATOR.'visa'.DIRECTORY_SEPARATOR
         }
     }
 
-    // Fill session with listmodel
-    $_SESSION[$origin]['diff_list'] = $diffList->get_listmodel($objectType, $objectId);
-    $_SESSION[$origin]['diff_list']['difflist_type'] = $_SESSION[$origin]['diff_list']['object_type'];
     $roles = $diffList->list_difflist_roles();
     $circuit = $_SESSION[$origin]['diff_list'];
     if (!isset($circuit['visa']['users']) && !isset($circuit['sign']['users'])) {
diff --git a/modules/visa/redirect_visa_entity.php b/modules/visa/redirect_visa_entity.php
index c8793932654197dfca21c386af8589f5e6760c7c..db69f7fc8420f11830e60f3aa768bd66d9f8d13c 100755
--- a/modules/visa/redirect_visa_entity.php
+++ b/modules/visa/redirect_visa_entity.php
@@ -11,12 +11,7 @@ function manage_empty_error($arr_id, $history, $id_action, $label_action, $statu
 
     $stmt = $db->query('SELECT initiator FROM res_letterbox WHERE res_id = ?', [$res_id]);
     $resInitiator = $stmt->fetch();
-    $stmt = $db->query("SELECT item_id, item_type FROM listmodels WHERE object_id = ? and item_mode = 'dest'", [$resInitiator['initiator']]);
-    $resListModel = $stmt->fetch();
-    if (!empty($resListModel)) {
-        $db->query("UPDATE listinstance SET item_id = ?, item_type = ? WHERE res_id = ? AND item_mode = 'dest'", [$resListModel['item_id'], $resListModel['item_type'], $res_id]);
-        $db->query("UPDATE res_letterbox SET dest_user = ?, destination = ? WHERE res_id = ?", [$resListModel['item_id'], $resInitiator['initiator'], $res_id]);
-    }
+    $resListModel = [];
 
     $stmt = $db->query("SELECT entity_label FROM entities WHERE entity_id = ?", [$resInitiator['initiator']]);
     $resEntity = $stmt->fetch();
diff --git a/sql/structure.sql b/sql/structure.sql
index 6137cae0d11acafb737d7111f1e7005bf9a495de..07c46f625e9162d0232cc7d8fe6a459148eb7708 100755
--- a/sql/structure.sql
+++ b/sql/structure.sql
@@ -427,22 +427,6 @@ CREATE TABLE listinstance
 )
 WITH (OIDS=FALSE);
 
-CREATE TABLE listmodels
-(
-  id serial NOT NULL,
-  object_id character varying(50) NOT NULL,
-  object_type character varying(255) NOT NULL,
-  "sequence" bigint NOT NULL,
-  item_id character varying(128) NOT NULL,
-  item_type character varying(255) NOT NULL,
-  item_mode character varying(50) NOT NULL,
-  title character varying(255),
-  description character varying(255),
-  process_comment character varying(255),
-  visible character varying(1) NOT NULL DEFAULT 'Y'::bpchar
-)
-WITH (OIDS=FALSE);
-
 CREATE TABLE difflist_types 
 (
   difflist_type_id character varying(50) NOT NULL,
@@ -1455,6 +1439,29 @@ CREATE TABLE contacts_custom_fields_list
 )
 WITH (OIDS=FALSE);
 
+CREATE TABLE list_templates
+(
+    id SERIAL NOT NULL,
+    title text NOT NULL,
+    description text,
+    type CHARACTER VARYING(32) NOT NULL,
+    entity_id INTEGER,
+    CONSTRAINT list_templates_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
+
+CREATE TABLE list_templates_items
+(
+    id SERIAL NOT NULL,
+    list_template_id INTEGER NOT NULL,
+    item_id INTEGER NOT NULL,
+    item_type CHARACTER VARYING(32) NOT NULL,
+    item_mode CHARACTER VARYING(64) NOT NULL,
+    sequence INTEGER NOT NULL,
+    CONSTRAINT list_templates_items_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
+
 /* users followed resources */
 CREATE TABLE users_followed_resources
 (
diff --git a/src/app/contact/controllers/ContactController.php b/src/app/contact/controllers/ContactController.php
index 2bc62f43d70a64deee57fc6257bb820783beb467..b5a8d8f369cc5d20ed863163445697688a7f2904 100755
--- a/src/app/contact/controllers/ContactController.php
+++ b/src/app/contact/controllers/ContactController.php
@@ -951,7 +951,7 @@ class ContactController
             if (strpos($mandatoryParameter['identifier'], 'contactCustomField_') !== false) {
                 $customId = explode('_', $mandatoryParameter['identifier'])[1];
                 if (empty($body['customFields'][$customId])) {
-                    return ['errors' => "Body {$body['customFields'][$customId]} is mandatory"];
+                    return ['errors' => "Body customFields[{$customId}] is mandatory"];
                 }
             } else {
                 if (empty($body[$mandatoryParameter['identifier']])) {
diff --git a/src/app/entity/controllers/EntityController.php b/src/app/entity/controllers/EntityController.php
index 9c46e96ff824e284b089174cb4d3a97c7ee11d2c..bca2211b0349de8304ce1905757338f04971559b 100755
--- a/src/app/entity/controllers/EntityController.php
+++ b/src/app/entity/controllers/EntityController.php
@@ -17,6 +17,7 @@ namespace Entity\controllers;
 use Basket\models\GroupBasketRedirectModel;
 use Entity\models\EntityModel;
 use Entity\models\ListInstanceModel;
+use Entity\models\ListTemplateItemModel;
 use Entity\models\ListTemplateModel;
 use Group\controllers\PrivilegeController;
 use Group\models\GroupModel;
@@ -89,59 +90,59 @@ class EntityController
                 $entity['roles'][$key]['id'] = 'cc';
             }
         }
-        //Diffusion list
+
+        //List Templates
         $listTemplates = ListTemplateModel::get([
-            'select'    => ['id', 'object_type', 'item_id', 'item_type', 'item_mode', 'title', 'description', 'sequence'],
-            'where'     => ['object_id = ?'],
-            'data'      => [$aArgs['id']]
+            'select'    => ['id', 'title', 'description', 'type'],
+            'where'     => ['entity_id = ?'],
+            'data'      => [$entity['id']]
         ]);
 
         $entity['listTemplate'] = [];
         foreach ($rolesForService as $role) {
             $role == 'copy' ? $entity['listTemplate']['cc'] = [] : $entity['listTemplate'][$role] = [];
         }
-        $entity['visaTemplate'] = [];
+        $entity['visaCircuit'] = [];
+        $entity['opinionCircuit'] = [];
         foreach ($listTemplates as $listTemplate) {
-            if ($listTemplate['object_type'] == 'entity_id' && !empty($listTemplate['item_id'])) {
-                $entity['listTemplate']['id'] = $listTemplate['id'];
-                if ($listTemplate['item_type'] == 'user_id') {
-                    $statusUser = UserModel::getByLogin(['select' => ['status', 'firstname', 'lastname'], 'login' => $listTemplate['item_id']]);
-                    if ($statusUser['status'] != 'DEL') {
-                        $entity['listTemplate'][$listTemplate['item_mode']][] = [
-                            'item_type'             => $listTemplate['item_type'],
-                            'item_id'               => $listTemplate['item_id'],
-                            'sequence'              => $listTemplate['sequence'],
-                            'title'                 => $listTemplate['title'],
-                            'description'           => $listTemplate['description'],
-                            'labelToDisplay'        => $statusUser['firstname']. ' ' .$statusUser['lastname'],
-                            'descriptionToDisplay'  => UserModel::getPrimaryEntityByUserId(['userId' => $listTemplate['item_id']])['entity_label']
+            $listTemplateItems = ListTemplateItemModel::get(['select' => ['*'], 'where' => ['list_template_id = ?'], 'data' => [$listTemplate['id']]]);
+
+            if ($listTemplate['type'] == 'diffusionList') {
+                $entity['listTemplate'] = $listTemplate;
+                $entity['listTemplate']['items'] = [];
+                foreach ($listTemplateItems as $listTemplateItem) {
+                    if ($listTemplateItem['item_type'] == 'user') {
+                        $entity['listTemplate']['items'][$listTemplateItem['item_mode']][] = [
+                            'id'                    => $listTemplateItem['item_id'],
+                            'type'                  => $listTemplateItem['item_type'],
+                            'sequence'              => $listTemplateItem['sequence'],
+                            'labelToDisplay'        => UserModel::getLabelledUserById(['id' => $listTemplateItem['item_id']]),
+                            'descriptionToDisplay'  => UserModel::getPrimaryEntityById(['id' => $listTemplateItem['item_id'], 'select' => ['entities.entity_label']])['entity_label']
+                        ];
+                    } elseif ($listTemplateItem['item_type'] == 'entity') {
+                        $entity['listTemplate']['items'][$listTemplateItem['item_mode']][] = [
+                            'id'                    => $listTemplateItem['item_id'],
+                            'type'                  => $listTemplateItem['item_type'],
+                            'sequence'              => $listTemplateItem['sequence'],
+                            'labelToDisplay'        => EntityModel::getById(['id' => $listTemplateItem['item_id'], 'select' => ['entity_label']])['entity_label'],
+                            'descriptionToDisplay'  => ''
                         ];
                     }
-                } elseif ($listTemplate['item_type'] == 'entity_id') {
-                    $entity['listTemplate'][$listTemplate['item_mode']][] = [
-                        'item_type'             => $listTemplate['item_type'],
-                        'item_id'               => $listTemplate['item_id'],
-                        'sequence'              => $listTemplate['sequence'],
-                        'title'                 => $listTemplate['title'],
-                        'description'           => $listTemplate['description'],
-                        'labelToDisplay'        => EntityModel::getByEntityId(['entityId' => $listTemplate['item_id'], 'select' => ['entity_label']])['entity_label'],
-                        'descriptionToDisplay'  => ''
+                }
+            } else {
+                $entity[$listTemplate['type']] = $listTemplate;
+                $entity[$listTemplate['type']]['items'] = [];
+                foreach ($listTemplateItems as $listTemplateItem) {
+                    $entity[$listTemplate['type']]['items'][] = [
+                        'id'                    => $listTemplateItem['item_id'],
+                        'type'                  => $listTemplateItem['item_type'],
+                        'mode'                  => $listTemplateItem['item_mode'],
+                        'sequence'              => $listTemplateItem['sequence'],
+                        'idToDisplay'           => UserModel::getLabelledUserById(['id' => $listTemplateItem['item_id']]),
+                        'descriptionToDisplay'  => UserModel::getPrimaryEntityById(['id' => $listTemplateItem['item_id'], 'select' => ['entities.entity_label']])['entity_label']
                     ];
                 }
             }
-            if ($listTemplate['object_type'] == 'VISA_CIRCUIT' && !empty($listTemplate['item_id'])) {
-                $entity['visaTemplate'][] = [
-                    'id'                    => $listTemplate['id'],
-                    'item_type'             => $listTemplate['item_type'],
-                    'item_id'               => $listTemplate['item_id'],
-                    'item_mode'             => $listTemplate['item_mode'],
-                    'sequence'              => $listTemplate['sequence'],
-                    'title'                 => $listTemplate['title'],
-                    'description'           => $listTemplate['description'],
-                    'idToDisplay'           => UserModel::getLabelledUserById(['login' => $listTemplate['item_id']]),
-                    'descriptionToDisplay'  => UserModel::getPrimaryEntityByUserId(['userId' => $listTemplate['item_id']])['entity_label']
-                ];
-            }
         }
 
         $entity['templates'] = TemplateModel::getByEntity([
diff --git a/src/app/entity/controllers/ListTemplateController.php b/src/app/entity/controllers/ListTemplateController.php
index f99b2b7864d3a93b0470b6f3156acaa75ed6806f..e6db8450861e49f2241623821e258837d46d2001 100755
--- a/src/app/entity/controllers/ListTemplateController.php
+++ b/src/app/entity/controllers/ListTemplateController.php
@@ -15,6 +15,7 @@
 namespace Entity\controllers;
 
 use Entity\models\EntityModel;
+use Entity\models\ListTemplateItemModel;
 use Entity\models\ListTemplateModel;
 use Group\controllers\PrivilegeController;
 use History\controllers\HistoryController;
@@ -32,54 +33,47 @@ class ListTemplateController
 {
     public function get(Request $request, Response $response)
     {
-        $rawListTemplates = ListTemplateModel::get(['select' => ['id', 'object_id', 'object_type', 'title', 'description']]);
-
-        $listTemplates = [];
-        $tmpTemplates = [];
-        foreach ($rawListTemplates as $rawListTemplate) {
-            if (empty($tmpTemplates[$rawListTemplate['object_type']][$rawListTemplate['object_id']])) {
-                $listTemplates[] = $rawListTemplate;
-                $tmpTemplates[$rawListTemplate['object_type']][$rawListTemplate['object_id']] = 1;
-            }
-        }
+        $listTemplates = ListTemplateModel::get(['select' => ['id', 'type', 'entity_id as "entityId"', 'title', 'description']]);
 
         return $response->withJson(['listTemplates' => $listTemplates]);
     }
 
-    public function getById(Request $request, Response $response, array $aArgs)
+    public function getById(Request $request, Response $response, array $args)
     {
-        $listTemplates = ListTemplateModel::getById(['id' => $aArgs['id']]);
-        if (empty($listTemplates)) {
+        $listTemplate = ListTemplateModel::getById(['id' => $args['id'], 'select' => ['title', 'description', 'type', 'entity_id']]);
+        if (empty($listTemplate)) {
             return $response->withStatus(400)->withJson(['errors' => 'List template not found']);
         }
 
-        foreach ($listTemplates as $key => $value) {
-            if ($value['item_type'] == 'entity_id') {
-                $listTemplates[$key]['idToDisplay'] = entitymodel::getByEntityId(['entityId' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
-                $listTemplates[$key]['descriptionToDisplay'] = '';
+        $listTemplateItems = ListTemplateItemModel::get(['select' => ['*'], 'where' => ['list_template_id = ?'], 'data' => [$args['id']]]);
+        foreach ($listTemplateItems as $key => $value) {
+            if ($value['item_type'] == 'entity') {
+                $listTemplateItems[$key]['idToDisplay'] = EntityModel::getById(['id' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
+                $listTemplateItems[$key]['descriptionToDisplay'] = '';
             } else {
-                $listTemplates[$key]['idToDisplay'] = UserModel::getLabelledUserById(['login' => $value['item_id']]);
-                $listTemplates[$key]['descriptionToDisplay'] = UserModel::getPrimaryEntityByUserId(['userId' => $value['item_id']])['entity_label'];
+                $listTemplateItems[$key]['idToDisplay'] = UserModel::getLabelledUserById(['id' => $value['item_id']]);
+                $listTemplateItems[$key]['descriptionToDisplay'] = UserModel::getPrimaryEntityById(['id' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
             }
         }
 
         $roles = EntityModel::getRoles();
-        $listTemplateTypes = ListTemplateModel::getTypes(['select' => ['difflist_type_roles'], 'where' => ['difflist_type_id = ?'], 'data' => [$listTemplates[0]['object_type']]]);
+        $difflistType = $listTemplate['type'] == 'diffusionList' ? 'entity_id' : $listTemplate['type'] == 'visaCircuit' ? 'VISA_CIRCUIT' : 'AVIS_CIRCUIT';
+        $listTemplateTypes = ListTemplateModel::getTypes(['select' => ['difflist_type_roles'], 'where' => ['difflist_type_id = ?'], 'data' => [$difflistType]]);
         $rolesForService = empty($listTemplateTypes[0]['difflist_type_roles']) ? [] : explode(' ', $listTemplateTypes[0]['difflist_type_roles']);
         foreach ($roles as $key => $role) {
             if (!in_array($role['id'], $rolesForService)) {
                 unset($roles[$key]);
             } elseif ($role['id'] == 'copy') {
-                $entity['roles'][$key]['id'] = 'cc';
+                $roles[$key]['id'] = 'cc';
             }
         }
 
         $listTemplate = [
-            'object_id'     => $listTemplates[0]['object_id'],
-            'object_type'   => $listTemplates[0]['object_type'],
-            'title'         => $listTemplates[0]['title'],
-            'description'   => $listTemplates[0]['description'],
-            'diffusionList' => $listTemplates,
+            'title'         => $listTemplate['title'],
+            'description'   => $listTemplate['description'],
+            'type'          => $listTemplate['type'],
+            'entityId'      => $listTemplate['entity_id'],
+            'items'         => $listTemplateItems,
             'roles'         => array_values($roles)
         ];
 
@@ -88,64 +82,64 @@ class ListTemplateController
 
     public function create(Request $request, Response $response)
     {
-        $data = $request->getParams();
+        $body = $request->getParsedBody();
 
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'manage_entities', 'userId' => $GLOBALS['id']]) && !strstr($data['object_id'], 'VISA_CIRCUIT_') && !strstr($data['object_id'], 'AVIS_CIRCUIT_')) {
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'manage_entities', 'userId' => $GLOBALS['id']]) && !empty($body['entityId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_listmodels', 'userId' => $GLOBALS['id']]) && (strstr($data['object_id'], 'VISA_CIRCUIT_') || strstr($data['object_id'], 'AVIS_CIRCUIT_'))) {
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_listmodels', 'userId' => $GLOBALS['id']]) && empty($body['entityId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
-        $allowedObjectTypes = ['entity_id', 'VISA_CIRCUIT', 'AVIS_CIRCUIT'];
-        $check = Validator::stringType()->notEmpty()->validate($data['object_type']) && in_array($data['object_type'], $allowedObjectTypes);
-        $check = $check && (Validator::stringType()->notEmpty()->validate($data['object_id']) || $data['object_type'] != 'entity_id');
-        $check = $check && Validator::arrayType()->notEmpty()->validate($data['items']);
-        $check = $check && (Validator::stringType()->notEmpty()->validate($data['title']) || Validator::stringType()->notEmpty()->validate($data['description']));
+        $allowedTypes = ['diffusionList', 'visaCircuit', 'opinionCircuit'];
+        $check = Validator::stringType()->notEmpty()->validate($body['type']) && in_array($body['type'], $allowedTypes);
+        $check = $check && Validator::arrayType()->notEmpty()->validate($body['items']);
+        $check = $check && (Validator::stringType()->notEmpty()->validate($body['title']) || Validator::stringType()->notEmpty()->validate($body['description']));
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
         }
 
-        if (!empty($data['object_id']) && $data['object_type'] != 'AVIS_CIRCUIT') {
-            $listTemplate = ListTemplateModel::get(['select' => [1], 'where' => ['object_id = ?', 'object_type = ?'], 'data' => [$data['object_id'], $data['object_type']]]);
+        if (!empty($body['entityId'])) {
+            $listTemplate = ListTemplateModel::get(['select' => [1], 'where' => ['entity_id = ?', 'type = ?'], 'data' => [$body['entityId'], $body['type']]]);
             if (!empty($listTemplate)) {
                 return $response->withStatus(400)->withJson(['errors' => 'Entity is already linked to this type of template']);
             }
-            $aEntities = EntityModel::getAllowedEntitiesByUserId(['userId' => $GLOBALS['userId']]);
-            foreach ($aEntities as $aEntity) {
-                if ($aEntity['entity_id'] == $data['object_id'] && $aEntity['allowed'] == false) {
+            $entities = EntityModel::getAllowedEntitiesByUserId(['userId' => $GLOBALS['userId']]);
+            foreach ($entities as $entity) {
+                if ($entity['serialId'] == $body['entityId'] && $entity['allowed'] == false) {
                     return $response->withStatus(403)->withJson(['errors' => 'Entity out of perimeter']);
                 }
             }
-        } else {
-            $data['object_id'] = $data['object_type'] . '_' . CoreConfigModel::uniqueId();
         }
 
-        $checkItems = ListTemplateController::checkItems(['items' => $data['items']]);
-        if (!empty($checkItems['errors'])) {
-            return $response->withStatus(400)->withJson(['errors' => $checkItems['errors']]);
+        $control = ListTemplateController::controlItems(['items' => $body['items']]);
+        if (!empty($control['errors'])) {
+            return $response->withStatus(400)->withJson(['errors' => $control['errors']]);
         }
 
-        $listTemplateId = null;
-        foreach ($data['items'] as $item) {
-            $listTemplateId = ListTemplateModel::create([
-                'object_id'     => $data['object_id'],
-                'object_type'   => $data['object_type'],
-                'title'         => $data['title'],
-                'description'   => $data['description'],
-                'sequence'      => $item['sequence'],
-                'item_id'       => $item['item_id'],
-                'item_type'     => $item['item_type'],
-                'item_mode'     => $item['item_mode'],
+        $listTemplateId = ListTemplateModel::create([
+            'title'         => $body['title'] ?? $body['description'],
+            'description'   => $body['description'] ?? null,
+            'type'          => $body['type'],
+            'entity_id'     => $body['entityId'] ?? null
+        ]);
+
+        foreach ($body['items'] as $key => $item) {
+            ListTemplateItemModel::create([
+                'list_template_id'  => $listTemplateId,
+                'item_id'           => $item['id'],
+                'item_type'         => $item['type'],
+                'item_mode'         => $item['mode'],
+                'sequence'          => $key,
             ]);
         }
 
         HistoryController::add([
-            'tableName' => 'listmodels',
-            'recordId'  => $data['object_id'],
+            'tableName' => 'list_templates',
+            'recordId'  => $listTemplateId,
             'eventType' => 'ADD',
-            'info'      => _LIST_TEMPLATE_CREATION . " : {$data['title']} {$data['description']}",
+            'info'      => _LIST_TEMPLATE_CREATION . " : {$body['title']} {$body['description']}",
             'moduleId'  => 'listTemplate',
             'eventId'   => 'listTemplateCreation',
         ]);
@@ -153,111 +147,110 @@ class ListTemplateController
         return $response->withJson(['id' => $listTemplateId]);
     }
 
-    public function update(Request $request, Response $response, array $aArgs)
+    public function update(Request $request, Response $response, array $args)
     {
-        $data = $request->getParams();
-        $check = Validator::arrayType()->notEmpty()->validate($data['items']);
-        $check = $check && (Validator::stringType()->notEmpty()->validate($data['title']) || Validator::stringType()->notEmpty()->validate($data['description']));
+        $body = $request->getParsedBody();
+
+        $check = Validator::arrayType()->notEmpty()->validate($body['items']);
+        $check = $check && Validator::stringType()->notEmpty()->validate($body['title']);
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
         }
 
-        $listTemplates = ListTemplateModel::getById(['id' => $aArgs['id'], 'select' => ['object_id', 'object_type']]);
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'manage_entities', 'userId' => $GLOBALS['id']]) && !strstr($listTemplates[0]['object_id'], 'VISA_CIRCUIT_') && !strstr($listTemplates[0]['object_id'], 'AVIS_CIRCUIT_')) {
+        $listTemplate = ListTemplateModel::getById(['id' => $args['id'], 'select' => ['entity_id', 'type']]);
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'manage_entities', 'userId' => $GLOBALS['id']]) && !empty($listTemplate['entityId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_listmodels', 'userId' => $GLOBALS['id']]) && (strstr($listTemplates[0]['object_id'], 'VISA_CIRCUIT_') || strstr($listTemplates[0]['object_id'], 'AVIS_CIRCUIT_'))) {
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_listmodels', 'userId' => $GLOBALS['id']]) && empty($listTemplate['entityId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
-        if (empty($listTemplates)) {
+        if (empty($listTemplate)) {
             return $response->withStatus(400)->withJson(['errors' => 'List template not found']);
         }
 
-        if (!strstr($listTemplates[0]['object_id'], 'VISA_CIRCUIT_') && !strstr($listTemplates[0]['object_id'], 'AVIS_CIRCUIT_')) {
-            $aEntities = EntityModel::getAllowedEntitiesByUserId(['userId' => $GLOBALS['userId']]);
-            foreach ($aEntities as $aEntity) {
-                if ($aEntity['entity_id'] == $listTemplates[0]['object_id'] && $aEntity['allowed'] == false) {
+        if (!empty($listTemplate['entityId'])) {
+            $entities = EntityModel::getAllowedEntitiesByUserId(['userId' => $GLOBALS['userId']]);
+            foreach ($entities as $entity) {
+                if ($entity['serialId'] == $listTemplate['entityId'] && $entity['allowed'] == false) {
                     return $response->withStatus(403)->withJson(['errors' => 'Entity out of perimeter']);
                 }
             }
         }
 
-        $checkItems = ListTemplateController::checkItems(['items' => $data['items']]);
-        if (!empty($checkItems['errors'])) {
-            return $response->withStatus(400)->withJson(['errors' => $checkItems['errors']]);
+        $control = ListTemplateController::controlItems(['items' => $body['items']]);
+        if (!empty($control['errors'])) {
+            return $response->withStatus(400)->withJson(['errors' => $control['errors']]);
         }
 
-        ListTemplateModel::delete([
-            'where' => ['object_id = ?', 'object_type = ?'],
-            'data'  => [$listTemplates[0]['object_id'], $listTemplates[0]['object_type']]
+        ListTemplateModel::update([
+            'set'   => ['title' => $body['title'], 'description' => $body['description'] ?? null],
+            'where' => ['id = ?'],
+            'data'  => [$args['id']]
         ]);
 
-        $listTemplateId = null;
-        foreach ($data['items'] as $item) {
-            $listTemplateId = ListTemplateModel::create([
-                'object_id'     => $listTemplates[0]['object_id'],
-                'object_type'   => $listTemplates[0]['object_type'],
-                'title'         => $data['title'],
-                'description'   => $data['description'],
-                'sequence'      => $item['sequence'],
-                'item_id'       => $item['item_id'],
-                'item_type'     => $item['item_type'],
-                'item_mode'     => $item['item_mode'],
+        ListTemplateItemModel::delete(['where' => ['list_template_id = ?'], 'data' => [$args['id']]]);
+        foreach ($body['items'] as $key => $item) {
+            ListTemplateItemModel::create([
+                'list_template_id'  => $args['id'],
+                'item_id'           => $item['id'],
+                'item_type'         => $item['type'],
+                'item_mode'         => $item['mode'],
+                'sequence'          => $key,
             ]);
         }
 
         HistoryController::add([
-            'tableName' => 'listmodels',
-            'recordId'  => $listTemplates[0]['object_id'],
+            'tableName' => 'list_templates',
+            'recordId'  => $args['id'],
             'eventType' => 'UP',
-            'info'      => _LIST_TEMPLATE_MODIFICATION . " : {$data['title']} {$data['description']}",
+            'info'      => _LIST_TEMPLATE_MODIFICATION . " : {$body['title']} {$body['description']}",
             'moduleId'  => 'listTemplate',
             'eventId'   => 'listTemplateModification',
         ]);
 
-        return $response->withJson(['id' => $listTemplateId]);
+        return $response->withStatus(204);
     }
 
-    public function delete(Request $request, Response $response, array $aArgs)
+    public function delete(Request $request, Response $response, array $args)
     {
-        $listTemplates = ListTemplateModel::getById(['id' => $aArgs['id'], 'select' => ['object_id', 'object_type']]);
-        
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'manage_entities', 'userId' => $GLOBALS['id']]) && !strstr($listTemplates[0]['object_id'], 'VISA_CIRCUIT_') && !strstr($listTemplates[0]['object_id'], 'AVIS_CIRCUIT_')) {
+        $listTemplate = ListTemplateModel::getById(['id' => $args['id'], 'select' => ['entity_id', 'type', 'title']]);
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'manage_entities', 'userId' => $GLOBALS['id']]) && !empty($listTemplate['entityId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_listmodels', 'userId' => $GLOBALS['id']]) && (strstr($listTemplates[0]['object_id'], 'VISA_CIRCUIT_') || strstr($listTemplates[0]['object_id'], 'AVIS_CIRCUIT_'))) {
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_listmodels', 'userId' => $GLOBALS['id']]) && empty($listTemplate['entityId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
-
-        if (empty($listTemplates)) {
+        if (empty($listTemplate)) {
             return $response->withStatus(400)->withJson(['errors' => 'List template not found']);
         }
 
-        if (!strstr($listTemplates[0]['object_id'], 'VISA_CIRCUIT_') && !strstr($listTemplates[0]['object_id'], 'AVIS_CIRCUIT_')) {
-            $aEntities = EntityModel::getAllowedEntitiesByUserId(['userId' => $GLOBALS['userId']]);
-            foreach ($aEntities as $aEntity) {
-                if ($aEntity['entity_id'] == $listTemplates[0]['object_id'] && $aEntity['allowed'] == false) {
+        if (!empty($listTemplate['entityId'])) {
+            $entities = EntityModel::getAllowedEntitiesByUserId(['userId' => $GLOBALS['userId']]);
+            foreach ($entities as $entity) {
+                if ($entity['serialId'] == $listTemplate['entityId'] && $entity['allowed'] == false) {
                     return $response->withStatus(403)->withJson(['errors' => 'Entity out of perimeter']);
                 }
             }
         }
 
         ListTemplateModel::delete([
-            'where' => ['object_id = ?', 'object_type = ?'],
-            'data'  => [$listTemplates[0]['object_id'], $listTemplates[0]['object_type']]
+            'where' => ['id = ?'],
+            'data'  => [$args['id']]
         ]);
+        ListTemplateItemModel::delete(['where' => ['list_template_id = ?'], 'data' => [$args['id']]]);
+
         HistoryController::add([
-            'tableName' => 'listmodels',
-            'recordId'  => $listTemplates[0]['object_id'],
+            'tableName' => 'list_templates',
+            'recordId'  => $args['id'],
             'eventType' => 'DEL',
-            'info'      => _LIST_TEMPLATE_SUPPRESSION . " : {$listTemplates[0]['object_id']} {$listTemplates[0]['object_type']}",
+            'info'      => _LIST_TEMPLATE_SUPPRESSION . " : {$listTemplate['title']}",
             'moduleId'  => 'listTemplate',
             'eventId'   => 'listTemplateSuppression',
         ]);
 
-        return $response->withJson(['success' => 'success']);
+        return $response->withStatus(204);
     }
 
     public function getByEntityId(Request $request, Response $response, array $args)
@@ -267,26 +260,63 @@ class ListTemplateController
             return $response->withStatus(400)->withJson(['errors' => 'Entity does not exist']);
         }
 
-        $listTemplates = ListTemplateModel::get(['select' => ['*'], 'where' => ['object_id = ?'], 'data' => [$entity['entity_id']]]);
+        $queryParams = $request->getQueryParams();
 
-        foreach ($listTemplates as $key => $value) {
-            if ($value['item_id'] == '') {
-                unset($listTemplates[$key]);
-                continue;
-            }
-            if ($value['item_type'] == 'entity_id') {
-                $listTemplates[$key]['labelToDisplay'] = Entitymodel::getByEntityId(['entityId' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
-                $listTemplates[$key]['descriptionToDisplay'] = '';
+        $where = ['entity_id = ?'];
+        $data = [$args['entityId']];
+        if (!empty($queryParams['type'])) {
+            if (in_array($queryParams['type'], ['visaCircuit', 'opinionCircuit'])) {
+                $where[] = 'type = ?';
+                $data[] = $queryParams['type'];
             } else {
-                $listTemplates[$key]['labelToDisplay'] = UserModel::getLabelledUserById(['login' => $value['item_id']]);
-                $listTemplates[$key]['descriptionToDisplay'] = UserModel::getPrimaryEntityByUserId(['userId' => $value['item_id']])['entity_label'];
+                $where[] = 'type = ?';
+                $data[] = 'diffusionList';
+            }
+        }
 
-                $userInfos = UserModel::getByLowerLogin(['login' => $value['item_id'], 'select' => ['id']]);
-                $listTemplates[$key]['userId'] = $userInfos['id'];
+        $listTemplates = ListTemplateModel::get(['select' => ['*'], 'where' => $where, 'data' => $data]);
+        foreach ($listTemplates as $key => $listTemplate) {
+            $listTemplateItems = ListTemplateItemModel::get(['select' => ['*'], 'where' => ['list_template_id = ?'], 'data' => [$listTemplate['id']]]);
+            foreach ($listTemplateItems as $itemKey => $value) {
+                if ($value['item_type'] == 'entity') {
+                    $listTemplateItems[$itemKey]['labelToDisplay'] = Entitymodel::getById(['id' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
+                    $listTemplateItems[$itemKey]['descriptionToDisplay'] = '';
+                } else {
+                    $user = UserModel::getById(['id' => $value['item_id'], 'select' => ['firstname', 'lastname', 'external_id']]);
+                    $listTemplateItems[$itemKey]['labelToDisplay'] = "{$user['firstname']} {$user['lastname']}";
+                    $listTemplateItems[$itemKey]['descriptionToDisplay'] = UserModel::getPrimaryEntityById(['id' => $value['item_id'], 'select' => ['entity_label']])['entity_label'];
+
+                    $externalId = json_decode($user['external_id'], true);
+                    if (!empty($queryParams['maarchParapheur']) && !empty($externalId['maarchParapheur'])) {
+                        $loadedXml = CoreConfigModel::getXmlLoaded(['path' => 'modules/visa/xml/remoteSignatoryBooks.xml']);
+                        if ($loadedXml->signatoryBookEnabled == 'maarchParapheur') {
+                            foreach ($loadedXml->signatoryBook as $signatoryBook) {
+                                if ($signatoryBook->id == "maarchParapheur") {
+                                    $url      = $signatoryBook->url;
+                                    $userId   = $signatoryBook->userId;
+                                    $password = $signatoryBook->password;
+                                    break;
+                                }
+                            }
+                            $curlResponse = CurlModel::execSimple([
+                                'url'           => rtrim($url, '/') . '/rest/users/' . $externalId['maarchParapheur'],
+                                'basicAuth'     => ['user' => $userId, 'password' => $password],
+                                'headers'       => ['content-type:application/json'],
+                                'method'        => 'GET'
+                            ]);
+                            if (!empty($curlResponse['response']['user'])) {
+                                $listTemplateItems[$itemKey]['externalId']['maarchParapheur'] = $externalId['maarchParapheur'];
+                            }
+                        }
+                    }
+
+                }
             }
+
+            $listTemplates[$key]['items'] = $listTemplateItems;
         }
 
-        return $response->withJson(['listTemplate' => $listTemplates]);
+        return $response->withJson(['listTemplates' => $listTemplates]);
     }
 
     public function getByEntityIdWithMaarchParapheur(Request $request, Response $response, array $args)
@@ -296,6 +326,8 @@ class ListTemplateController
             return $response->withStatus(400)->withJson(['errors' => 'Entity does not exist']);
         }
 
+        $queryParams = $request->getQueryParams();
+
         $listTemplates = ListTemplateModel::get(['select' => ['*'], 'where' => ['object_id = ?'], 'data' => [$entity['entity_id']]]);
 
         foreach ($listTemplates as $key => $value) {
@@ -336,7 +368,7 @@ class ListTemplateController
         return $response->withJson(['listTemplate' => $listTemplates]);
     }
 
-    public function updateByUserWithEntityDest(Request $request, Response $response)
+    public function updateByUserWithEntityDest(Request $request, Response $response, array $args)
     {
         if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_users', 'userId' => $GLOBALS['id']])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
@@ -346,23 +378,27 @@ class ListTemplateController
 
         DatabaseModel::beginTransaction();
 
+        $allEntityIds = array_column($data['redirectListModels'], 'entity_id');
+        $templates = ListTemplateModel::get(['select' => ['id'], 'where' => ['type = ?', 'entity_id in (?)'], 'data' => ['diffusionList', $allEntityIds]]);
+        $templates = array_column($templates, 'id');
         foreach ($data['redirectListModels'] as $listModel) {
-            $user = UserModel::getByLogin(['login' => $listModel['redirectUserId']]);
-            if (empty($user) || $user['status'] != "OK") {
+            $redirectUser = UserModel::getByLogin(['login' => $listModel['redirectUserId'], 'select' => ['status', 'id']]);
+            if (empty($redirectUser) || $redirectUser['status'] != "OK") {
                 DatabaseModel::rollbackTransaction();
                 return $response->withStatus(400)->withJson(['errors' => 'User not found or not active']);
             }
 
-            ListTemplateModel::update([
-                'set'   => ['item_id' => $listModel['redirectUserId']],
-                'where' => ['item_id = ?', 'object_id = ?', 'object_type = ?', 'item_mode = ?'],
-                'data'  => [$data['user_id'], $listModel['object_id'], 'entity_id', 'dest']
+            ListTemplateItemModel::update([
+                'set'   => ['item_id' => $redirectUser['id']],
+                'where' => ['item_id = ?', 'item_type = ?', 'item_mode = ?', 'list_template_id in (?)'],
+                'data'  => [$args['itemId'], 'user', 'dest', $templates]
             ]);
         }
 
+        ListTemplateModel::deleteNoItemsOnes();
         DatabaseModel::commitTransaction();
 
-        return $response->withJson(['success' => 'success']);
+        return $response->withStatus(204);
     }
 
     public function getTypeRoles(Request $request, Response $response, array $aArgs)
@@ -392,9 +428,10 @@ class ListTemplateController
             }
 
             $roles[$key]['usedIn'] = [];
-            $listTemplates = ListTemplateModel::get(['select' => ['object_id'], 'where' => ['object_type = ?', 'item_mode = ?'], 'data' => [$aArgs['typeId'], $roles[$key]['id']]]);
+            $type = $aArgs['typeId'] == 'entity_id' ? 'diffusionList' : ($aArgs['typeId'] == 'VISA_CIRCUIT' ? 'visaCircuit' : 'opinionCircuit');
+            $listTemplates = ListTemplateModel::getWithItems(['select' => ['DISTINCT entity_id'], 'where' => ['type = ?', 'item_mode = ?', 'entity_id is not null'], 'data' => [$type, $roles[$key]['id']]]);
             foreach ($listTemplates as $listTemplate) {
-                $entity = Entitymodel::getByEntityId(['select' => ['short_label'], 'entityId' => $listTemplate['object_id']]);
+                $entity = Entitymodel::getById(['select' => ['short_label'], 'id' => $listTemplate['entity_id']]);
                 $roles[$key]['usedIn'][] = $entity['short_label'];
             }
         }
@@ -434,16 +471,31 @@ class ListTemplateController
             'where' => ['difflist_type_id = ?'],
             'data'  => [$aArgs['typeId']]
         ]);
+
+        $listTemplates = ListTemplateModel::get([
+            'select'    => ['id'],
+            'where'     => ['type = ?'],
+            'data'      => ['diffusionList']
+        ]);
+        $listTemplates = array_column($listTemplates, 'id');
+
         if (empty($roles)) {
-            ListTemplateModel::delete([
-                'where' => ['object_type = ?'],
-                'data'  => [$aArgs['typeId']]
-            ]);
+            if (!empty($listTemplates)) {
+                ListTemplateModel::delete([
+                    'where' => ['type = ?'],
+                    'data'  => ['diffusionList']
+                ]);
+                ListTemplateItemModel::delete([
+                    'where' => ['list_template_id in (?)'],
+                    'data'  => [$listTemplates]
+                ]);
+            }
         } else {
-            ListTemplateModel::delete([
-                'where' => ['object_type = ?', 'item_mode not in (?)'],
-                'data'  => [$aArgs['typeId'], explode(' ', str_replace('copy', 'cc', $roles))]
+            ListTemplateItemModel::delete([
+                'where' => ['list_template_id in (?)', 'item_mode not in (?)'],
+                'data'  => [$listTemplates, explode(' ', str_replace('copy', 'cc', $roles))]
             ]);
+            ListTemplateModel::deleteNoItemsOnes();
         }
 
         return $response->withJson(['success' => 'success']);
@@ -513,51 +565,44 @@ class ListTemplateController
             return $response->withStatus(400)->withJson(['errors' => 'Query params circuit is empty']);
         }
 
-        $circuit = $queryParams['circuit'] == 'opinion' ? 'AVIS_CIRCUIT' : 'VISA_CIRCUIT';
+        $circuit = $queryParams['circuit'] == 'opinion' ? 'opinionCircuit' : 'visaCircuit';
         $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['destination']]);
 
-        $where = ['object_type = ?'];
+        $where = ['type = ?'];
         $data = [$circuit];
         if (!empty($resource['destination'])) {
-            $where[] = '(object_id = ? OR object_id like ?)';
-            $data[] = $resource['destination'];
-            $data[] = "{$circuit}_%";
-            $orderBy = ["object_id='{$resource['destination']}' DESC", 'title'];
+            $entity = EntityModel::getByEntityId(['entityId' => $resource['destination'], 'select' => ['id']]);
+            $where[] = '(entity_id is null OR entity_id = ?)';
+            $data[] = $entity['id'];
+            $orderBy = ["entity_id='{$entity['id']}' DESC", 'title'];
         } else {
-            $where[] = 'object_id like ?';
-            $data[] = "{$circuit}_%";
+            $where[] = 'entity_id is null';
             $orderBy = ['title'];
         }
 
-        $circuits = [];
-        $listTemplates = ListTemplateModel::get(['select' => ['*'], 'where' => $where, 'data' => $data, 'orderBy' => $orderBy]);
-        foreach ($listTemplates as $value) {
-            $circuits[$value['object_id']] = ['id' => $value['id'], 'title' => $value['title']];
-        }
-
-        $circuits = array_values($circuits);
+        $circuits = ListTemplateModel::get(['select' => ['*'], 'where' => $where, 'data' => $data, 'orderBy' => $orderBy]);
 
         return $response->withJson(['circuits' => $circuits]);
     }
 
-    private static function checkItems(array $aArgs)
+    private static function controlItems(array $args)
     {
-        ValidatorModel::notEmpty($aArgs, ['items']);
-        ValidatorModel::arrayType($aArgs, ['items']);
+        ValidatorModel::notEmpty($args, ['items']);
+        ValidatorModel::arrayType($args, ['items']);
 
         $destFound = false;
-        foreach ($aArgs['items'] as $item) {
+        foreach ($args['items'] as $item) {
             if ($destFound && $item['item_mode'] == 'dest') {
                 return ['errors' => 'More than one dest not allowed'];
             }
-            if (empty($item['item_id'])) {
-                return ['errors' => 'Item_id is empty'];
+            if (empty($item['id'])) {
+                return ['errors' => 'id is empty'];
             }
-            if (empty($item['item_type'])) {
-                return ['errors' => 'Item_type is empty'];
+            if (empty($item['type'])) {
+                return ['errors' => 'type is empty'];
             }
-            if (empty($item['item_mode'])) {
-                return ['errors' => 'Item_mode is empty'];
+            if (empty($item['mode'])) {
+                return ['errors' => 'mode is empty'];
             }
             if ($item['item_mode'] == 'dest') {
                 $destFound = true;
diff --git a/src/app/entity/models/ListTemplateItemModel.php b/src/app/entity/models/ListTemplateItemModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e630278ce2fd8525273f21800ab2726dc99133f
--- /dev/null
+++ b/src/app/entity/models/ListTemplateItemModel.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * Copyright Maarch since 2008 under licence GPLv3.
+ * See LICENCE.txt file at the root folder for more details.
+ * This file is part of Maarch software.
+ *
+ */
+
+/**
+ * @brief List Template Model
+ * @author dev@maarch.org
+ */
+
+namespace Entity\models;
+
+use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
+
+class ListTemplateItemModel
+{
+    public static function get(array $args = [])
+    {
+        ValidatorModel::arrayType($args, ['select', 'where', 'data']);
+
+        $items = DatabaseModel::select([
+            'select'    => $args['select'] ?? [1],
+            'table'     => ['list_templates_items'],
+            'where'     => $args['where'] ?? [],
+            'data'      => $args['data'] ?? [],
+            'order_by'  => $args['orderBy'] ?? []
+        ]);
+
+        return $items;
+    }
+
+    public static function create(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['list_template_id', 'item_id', 'item_type', 'item_mode']);
+        ValidatorModel::stringType($args, ['item_type', 'item_mode']);
+        ValidatorModel::intVal($args, ['list_template_id', 'item_id', 'sequence']);
+
+        DatabaseModel::insert([
+            'table'         => 'list_templates_items',
+            'columnsValues' => [
+                'list_template_id'  => $args['list_template_id'],
+                'item_id'           => $args['item_id'],
+                'item_type'         => $args['item_type'],
+                'item_mode'         => $args['item_mode'],
+                'sequence'          => $args['sequence']
+            ]
+        ]);
+
+        return true;
+    }
+
+    public static function update(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($args, ['set', 'where', 'data']);
+
+        DatabaseModel::update([
+            'table' => 'list_templates_items',
+            'set'   => $args['set'],
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+
+    public static function delete(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['where', 'data']);
+        ValidatorModel::arrayType($args, ['where', 'data']);
+
+        DatabaseModel::delete([
+            'table' => 'list_templates_items',
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+}
diff --git a/src/app/entity/models/ListTemplateModel.php b/src/app/entity/models/ListTemplateModel.php
index dfae0e2356980e3722faea6102fc11c5dd1a6609..8892336e2d25c80311f4e6524de451c4a4966c45 100755
--- a/src/app/entity/models/ListTemplateModel.php
+++ b/src/app/entity/models/ListTemplateModel.php
@@ -14,6 +14,149 @@
 
 namespace Entity\models;
 
-class ListTemplateModel extends ListTemplateModelAbstract
+use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
+
+class ListTemplateModel
 {
+    public static function get(array $args = [])
+    {
+        ValidatorModel::arrayType($args, ['select', 'where', 'data']);
+
+        $listTemplates = DatabaseModel::select([
+            'select'    => $args['select'] ?? [1],
+            'table'     => ['list_templates'],
+            'where'     => $args['where'] ?? [],
+            'data'      => $args['data'] ?? [],
+            'order_by'  => $args['orderBy'] ?? []
+        ]);
+
+        return $listTemplates;
+    }
+
+    public static function getById(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['id']);
+        ValidatorModel::intVal($args, ['id']);
+        ValidatorModel::arrayType($args, ['select']);
+
+        $listTemplate = DatabaseModel::select([
+            'select'    => $args['select'] ?? [1],
+            'table'     => ['list_templates'],
+            'where'     => ['id = ?'],
+            'data'      => [$args['id']]
+        ]);
+
+        if (empty($listTemplate[0])) {
+            return [];
+        }
+
+        return $listTemplate[0];
+    }
+
+    public static function create(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['title', 'type']);
+        ValidatorModel::stringType($args, ['title', 'type', 'description']);
+        ValidatorModel::intVal($args, ['entity_id']);
+
+        $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'list_templates_id_seq']);
+
+        DatabaseModel::insert([
+            'table'         => 'list_templates',
+            'columnsValues' => [
+                'id'            => $nextSequenceId,
+                'title'         => $args['title'],
+                'description'   => $args['description'] ?? null,
+                'type'          => $args['type'],
+                'entity_id'     => $args['entity_id'] ?? null
+            ]
+        ]);
+
+        return $nextSequenceId;
+    }
+
+    public static function update(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($args, ['set', 'where', 'data']);
+
+        DatabaseModel::update([
+            'table' => 'list_templates',
+            'set'   => $args['set'],
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+
+    public static function delete(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['where', 'data']);
+        ValidatorModel::arrayType($args, ['where', 'data']);
+
+        DatabaseModel::delete([
+            'table' => 'list_templates',
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+
+    public static function deleteNoItemsOnes()
+    {
+        DatabaseModel::delete([
+            'table' => 'list_templates',
+            'where' => ['id not in (select DISTINCT(list_template_id) FROM list_templates_items)']
+        ]);
+
+        return true;
+    }
+
+    public static function getWithItems(array $args = [])
+    {
+        ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']);
+
+        $listTemplates = DatabaseModel::select([
+            'select'    => empty($args['select']) ? ['*'] : $args['select'],
+            'table'     => ['list_templates', 'list_templates_items'],
+            'left_join' => ['list_templates.id = list_templates_items.list_template_id'],
+            'where'     => empty($args['where']) ? [] : $args['where'],
+            'data'      => empty($args['data']) ? [] : $args['data'],
+            'order_by'  => empty($args['orderBy']) ? [] : $args['orderBy']
+        ]);
+
+        return $listTemplates;
+    }
+
+    public static function getTypes(array $aArgs = [])
+    {
+        ValidatorModel::arrayType($aArgs, ['select', 'where', 'data']);
+
+        $aListTemplatesTypes = DatabaseModel::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => ['difflist_types'],
+            'where'     => $aArgs['where'],
+            'data'      => $aArgs['data']
+        ]);
+
+        return $aListTemplatesTypes;
+    }
+
+    public static function updateTypes(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
+
+        DatabaseModel::update([
+            'table' => 'difflist_types',
+            'set'   => $aArgs['set'],
+            'where' => $aArgs['where'],
+            'data'  => $aArgs['data']
+        ]);
+
+        return true;
+    }
 }
diff --git a/src/app/entity/models/ListTemplateModelAbstract.php b/src/app/entity/models/ListTemplateModelAbstract.php
deleted file mode 100755
index 17ea6fd0aa2fe0092c177fec08ed95239dc7b7cf..0000000000000000000000000000000000000000
--- a/src/app/entity/models/ListTemplateModelAbstract.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-
-/**
- * Copyright Maarch since 2008 under licence GPLv3.
- * See LICENCE.txt file at the root folder for more details.
- * This file is part of Maarch software.
- *
- */
-
-/**
- * @brief List Template Model Abstract
- * @author dev@maarch.org
- */
-
-namespace Entity\models;
-
-use SrcCore\models\ValidatorModel;
-use SrcCore\models\DatabaseModel;
-
-abstract class ListTemplateModelAbstract
-{
-    public static function get(array $args = [])
-    {
-        ValidatorModel::arrayType($args, ['select', 'where', 'data']);
-
-        $aListTemplates = DatabaseModel::select([
-            'select'    => empty($args['select']) ? ['*'] : $args['select'],
-            'table'     => ['listmodels'],
-            'where'     => $args['where'],
-            'data'      => $args['data'],
-            'order_by'  => empty($args['orderBy']) ? [] : $args['orderBy']
-        ]);
-
-        return $aListTemplates;
-    }
-
-    public static function getById(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id']);
-        ValidatorModel::intVal($aArgs, ['id']);
-        ValidatorModel::arrayType($aArgs, ['select']);
-
-        $basicTemplate = DatabaseModel::select([
-            'select'    => ['object_id', 'object_type'],
-            'table'     => ['listmodels'],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
-        ]);
-        if (empty($basicTemplate)) {
-            return [];
-        }
-
-        $aListTemplates = DatabaseModel::select([
-            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['listmodels'],
-            'where'     => ['object_id = ?', 'object_type = ?'],
-            'data'      => [$basicTemplate[0]['object_id'], $basicTemplate[0]['object_type']]
-        ]);
-
-        return $aListTemplates;
-    }
-
-    public static function create(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['object_id', 'object_type', 'item_id', 'item_type', 'item_mode']);
-        ValidatorModel::stringType($aArgs, ['object_id', 'object_type', 'item_id', 'item_type', 'title', 'description']);
-        ValidatorModel::intVal($aArgs, ['sequence']);
-
-        $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'listmodels_id_seq']);
-
-        DatabaseModel::insert([
-            'table'         => 'listmodels',
-            'columnsValues' => [
-                'id'            => $nextSequenceId,
-                'object_id'     => $aArgs['object_id'],
-                'object_type'   => $aArgs['object_type'],
-                'sequence'      => $aArgs['sequence'],
-                'item_id'       => $aArgs['item_id'],
-                'item_type'     => $aArgs['item_type'],
-                'item_mode'     => $aArgs['item_mode'],
-                'title'         => $aArgs['title'],
-                'description'   => $aArgs['description'],
-                'visible'       => 'Y'
-            ]
-        ]);
-
-        return $nextSequenceId;
-    }
-
-    public static function update(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
-        ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
-
-        DatabaseModel::update([
-            'table' => 'listmodels',
-            'set'   => $aArgs['set'],
-            'where' => $aArgs['where'],
-            'data'  => $aArgs['data']
-        ]);
-
-        return true;
-    }
-
-    public static function delete(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['where', 'data']);
-        ValidatorModel::arrayType($aArgs, ['where', 'data']);
-
-        DatabaseModel::delete([
-            'table' => 'listmodels',
-            'where' => $aArgs['where'],
-            'data'  => $aArgs['data']
-        ]);
-
-        return true;
-    }
-
-    public static function getTypes(array $aArgs = [])
-    {
-        ValidatorModel::arrayType($aArgs, ['select', 'where', 'data']);
-
-        $aListTemplatesTypes = DatabaseModel::select([
-            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['difflist_types'],
-            'where'     => $aArgs['where'],
-            'data'      => $aArgs['data']
-        ]);
-
-        return $aListTemplatesTypes;
-    }
-
-    public static function updateTypes(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
-        ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
-
-        DatabaseModel::update([
-            'table' => 'difflist_types',
-            'set'   => $aArgs['set'],
-            'where' => $aArgs['where'],
-            'data'  => $aArgs['data']
-        ]);
-
-        return true;
-    }
-}
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 8220ac1b3e4a68376c1ae733b600ef2c7928e058..5cb111acffa45f9eb846c2774c8e62078c152173 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -23,6 +23,7 @@ use Docserver\models\DocserverModel;
 use Email\controllers\EmailController;
 use Entity\models\EntityModel;
 use Entity\models\ListInstanceModel;
+use Entity\models\ListTemplateItemModel;
 use Entity\models\ListTemplateModel;
 use Firebase\JWT\JWT;
 use Group\controllers\PrivilegeController;
@@ -322,14 +323,18 @@ class UserController
         }
 
         $listTemplateEntities = [];
-        $listTemplates = ListTemplateModel::get([
-            'select'    => ['object_id', 'title'],
-            'where'     => ['item_id = ?', 'object_type = ?', 'item_mode = ?', 'item_type = ?'],
-            'data'      => [$user['user_id'], 'entity_id', 'dest', 'user_id']
+        $listTemplates = ListTemplateModel::getWithItems([
+            'select'    => ['entity_id', 'title'],
+            'where'     => ['item_id = ?', 'type = ?', 'item_mode = ?', 'item_type = ?', 'entity_id is not null'],
+            'data'      => [$aArgs['id'], 'diffusionList', 'dest', 'user']
         ]);
         $allEntities = EntityModel::getAllEntitiesByUserId(['userId' => $GLOBALS['userId']]);
+        if (!empty($allEntities)) {
+            $allEntities = EntityModel::get(['select' => ['id'], 'where' => ['entity_id in (?)'], 'data' => [$allEntities]]);
+            $allEntities = array_column($allEntities, 'id');
+        }
         foreach ($listTemplates as $listTemplate) {
-            if (!in_array($listTemplate['object_id'], $allEntities)) {
+            if (!in_array($listTemplate['entity_id'], $allEntities)) {
                 $isListTemplateDeletable = false;
             }
             $listTemplateEntities[] = $listTemplate['object_id'];
@@ -383,10 +388,10 @@ class UserController
             return $response->withStatus(403)->withJson(['errors' => 'User is still present in listInstances']);
         }
 
-        $listTemplates = ListTemplateModel::get([
+        $listTemplates = ListTemplateModel::getWithItems([
             'select'    => [1],
-            'where'     => ['item_id = ?', 'object_type = ?', 'item_type = ?', 'item_mode = ?'],
-            'data'      => [$user['user_id'], 'entity_id', 'user_id', 'dest']
+            'where'     => ['item_id = ?', 'type = ?', 'item_mode = ?', 'item_type = ?', 'entity_id is not null'],
+            'data'      => [$aArgs['id'], 'diffusionList', 'dest', 'user']
         ]);
         if (!empty($listTemplates)) {
             return $response->withStatus(403)->withJson(['errors' => 'User is still present in listTemplates']);
@@ -396,10 +401,6 @@ class UserController
             'where' => ['item_id = ?', 'difflist_type = ?', 'item_type = ?', 'item_mode != ?'],
             'data'  => [$user['user_id'], 'entity_id', 'user_id', 'dest']
         ]);
-        ListTemplateModel::delete([
-            'where' => ['item_id = ?', 'object_type = ?', 'item_type = ?'],
-            'data'  => [$user['user_id'], 'entity_id', 'user_id']
-        ]);
         RedirectBasketModel::delete([
             'where' => ['owner_user_id = ? OR actual_user_id = ?'],
             'data'  => [$aArgs['id'], $aArgs['id']]
@@ -438,10 +439,10 @@ class UserController
             return $response->withStatus(403)->withJson(['errors' => 'User is still present in listInstances']);
         }
 
-        $listTemplates = ListTemplateModel::get([
+        $listTemplates = ListTemplateModel::getWithItems([
             'select'    => [1],
-            'where'     => ['item_id = ?', 'object_type = ?', 'item_type = ?', 'item_mode = ?'],
-            'data'      => [$user['user_id'], 'entity_id', 'user_id', 'dest']
+            'where'     => ['item_id = ?', 'type = ?', 'item_mode = ?', 'item_type = ?', 'entity_id is not null'],
+            'data'      => [$aArgs['id'], 'diffusionList', 'dest', 'user']
         ]);
         if (!empty($listTemplates)) {
             return $response->withStatus(403)->withJson(['errors' => 'User is still present in listTemplates']);
@@ -451,10 +452,11 @@ class UserController
             'where' => ['item_id = ?', 'difflist_type = ?', 'item_type = ?', 'item_mode != ?'],
             'data'  => [$user['user_id'], 'entity_id', 'user_id', 'dest']
         ]);
-        ListTemplateModel::delete([
-            'where' => ['item_id = ?', 'object_type = ?', 'item_type = ?'],
-            'data'  => [$user['user_id'], 'entity_id', 'user_id']
+        ListTemplateItemModel::delete([
+            'where' => ['item_id = ?', 'item_type = ?'],
+            'data'  => [$aArgs['id'], 'user']
         ]);
+        ListTemplateModel::deleteNoItemsOnes();
         RedirectBasketModel::delete([
             'where' => ['owner_user_id = ? OR actual_user_id = ?'],
             'data'  => [$aArgs['id'], $aArgs['id']]
@@ -1381,21 +1383,21 @@ class UserController
         ]);
     }
 
-    public function isEntityDeletable(Request $request, Response $response, array $aArgs)
+    public function isEntityDeletable(Request $request, Response $response, array $args)
     {
-        $error = $this->hasUsersRights(['id' => $aArgs['id']]);
+        $error = $this->hasUsersRights(['id' => $args['id']]);
         if (!empty($error['error'])) {
             return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]);
         }
-        if (empty(entitymodel::getByEntityId(['entityId' => $aArgs['entityId']]))) {
-            return $response->withStatus(400)->withJson(['errors' => 'Entity not found']);
+        $entity = EntityModel::getByEntityId(['entityId' => $args['entityId'], 'select' => ['id']]);
+        if (empty($entity)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Entity does not exist']);
         }
 
-        $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]);
-
-        $listInstances = ListInstanceModel::getWithConfidentiality(['select' => [1], 'entityId' => $aArgs['entityId'], 'userId' => $user['user_id']]);
+        $user = UserModel::getById(['id' => $args['id'], 'select' => ['user_id']]);
+        $listInstances = ListInstanceModel::getWithConfidentiality(['select' => [1], 'entityId' => $args['entityId'], 'userId' => $user['user_id']]);
 
-        $listTemplates = ListTemplateModel::get(['select' => [1], 'where' => ['object_id = ?', 'item_type = ?', 'item_id = ?'], 'data' => [$aArgs['entityId'], 'user_id', $user['user_id']]]);
+        $listTemplates = ListTemplateModel::getWithItems(['select' => [1], 'where' => ['entity_id = ?', 'item_type = ?', 'item_id = ?'], 'data' => [$entity['id'], 'user', $args['id']]]);
 
         return $response->withJson(['hasConfidentialityInstances' => !empty($listInstances), 'hasListTemplates' => !empty($listTemplates)]);
     }
diff --git a/src/core/controllers/AutoCompleteController.php b/src/core/controllers/AutoCompleteController.php
index b2c822f67d8ab308e294ccd3f870d2cb06fabcc1..690ab7a7100680d99f1267fb8c7bed204aef4034 100755
--- a/src/core/controllers/AutoCompleteController.php
+++ b/src/core/controllers/AutoCompleteController.php
@@ -426,7 +426,7 @@ class AutoCompleteController
         ]);
 
         $users = DatabaseModel::select([
-            'select'    => ['DISTINCT users.user_id', 'users.firstname', 'users.lastname'],
+            'select'    => ['DISTINCT users.id', 'users.firstname', 'users.lastname'],
             'table'     => ['users, usergroup_content, usergroups, usergroups_services'],
             'where'     => $requestData['where'],
             'data'      => $requestData['data'],
@@ -438,7 +438,7 @@ class AutoCompleteController
         foreach ($users as $value) {
             $data[] = [
                 'type'          => 'user',
-                'id'            => $value['user_id'],
+                'id'            => $value['id'],
                 'idToDisplay'   => "{$value['firstname']} {$value['lastname']}",
                 'otherInfo'     => ''
             ];
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
index 06b638569996017821eac4a83d67204b8a515c57..e14c8646473f9f5fb055e75daf33ed36f6002009 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
@@ -15,16 +15,12 @@
                     <mat-tab label="{{lang.informations}}">
                         <form class="form-horizontal" #diffusionModelForm="ngForm">
                             <mat-form-field *ngIf="creationMode">
-                                <mat-select id="object_type" name="object_type" placeholder="{{lang.diffusionType}}" [(ngModel)]="diffusionModel.object_type" [disabled]="!creationMode">
+                                <mat-select id="type" name="type" placeholder="{{lang.diffusionType}}" [(ngModel)]="diffusionModel.type" [disabled]="!creationMode">
                                     <mat-option *ngFor="let itemType of this.itemTypeList" [value]="itemType.id">
                                         {{ itemType.label }}
                                     </mat-option>
                                 </mat-select>
                             </mat-form-field>                                   
-                            <mat-form-field *ngIf="!creationMode">
-                                <input matInput  name="object_id" placeholder="{{lang.id}}" title="{{lang.id}}" [(ngModel)]="diffusionModel.object_id"
-                                    disabled maxlength="50" required>
-                            </mat-form-field>
                             <mat-form-field>
                                 <input matInput name="title" title="{{lang.label}}" placeholder="{{lang.label}}" [(ngModel)]="diffusionModel.title" maxlength="255"
                                     required>
@@ -34,7 +30,7 @@
                                     matTextareaAutosize matAutosizeMinRows="1" matAutosizeMaxRows="5" maxlength="255"></textarea>
                             </mat-form-field>
                             <div class="col-md-12 text-center" style="padding:10px;">
-                                <button mat-raised-button (click)="saveDiffListVisa()" [disabled]="!diffusionModelForm.form.valid || diffusionModel.diffusionList.length == 0" color="primary">{{lang.save}}</button>
+                                <button mat-raised-button (click)="saveDiffListVisa()" [disabled]="!diffusionModelForm.form.valid || diffusionModel.items.length == 0" color="primary">{{lang.save}}</button>
                                 <button mat-raised-button color="default" (click)="loadDiffList()" [disabled]="!this.listDiffModified || creationMode">{{lang.cancel}}</button>
                             </div>
                         </form>
@@ -51,10 +47,10 @@
                         <mat-tab label="{{lang.diffusionList}}">
                                 <div class="row" style="margin:0px;" id="visaCircuitContent">
                                     <div class="col-md-12">
-                                        <plugin-autocomplete [labelPlaceholder]="lang.addUser" [labelList]="lang.availableUsers" [routeDatas]="diffusionModel.object_type == 'VISA_CIRCUIT' ? ['/rest/autocomplete/users/circuit'] : ['/rest/autocomplete/users/circuit?circuit=avis']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
+                                        <plugin-autocomplete [labelPlaceholder]="lang.addUser" [labelList]="lang.availableUsers" [routeDatas]="diffusionModel.type == 'visaCircuit' ? ['/rest/autocomplete/users/circuit'] : ['/rest/autocomplete/users/circuit?circuit=avis']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
                                         <mat-list>
-                                            <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="diffusionModel.diffusionList">
-                                                <mat-list-item disableRipple="true" *ngFor="let template of diffusionModel.diffusionList; let i = index" title="{{lang.move}}"
+                                            <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="diffusionModel.items">
+                                                <mat-list-item disableRipple="true" *ngFor="let template of diffusionModel.items; let i = index" title="{{lang.move}}"
                                                     dnd-sortable [sortableIndex]="i" (onDropSuccess)="updateDiffListVisa(template)">
                                                     <mat-icon color="primary" [class]="template.item_mode == 'sign' ? 'fa fa-certificate' : 'fa fa-user'" mat-list-icon></mat-icon>
                                                     <p mat-line>{{template.idToDisplay}}
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
index fe491a5a43a86630cdbe4bc72e6624c614426886..cd0caf596d4913b868dd3f106e090c293333415b 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
@@ -55,9 +55,9 @@ export class DiffusionModelAdministrationComponent implements OnInit {
                 
                 this.creationMode = true;
                 this.loading = false;
-                this.itemTypeList =[{"id":"VISA_CIRCUIT", "label": this.lang.visaWorkflow},{"id":"AVIS_CIRCUIT", "label": this.lang.avis}]
-                this.diffusionModel.object_type = 'VISA_CIRCUIT';
-                this.diffusionModel.diffusionList = [];
+                this.itemTypeList =[{"id":"visaCircuit", "label": this.lang.visaWorkflow},{"id":"opinionCircuit", "label": this.lang.avis}];
+                this.diffusionModel.type = 'opinionCircuit';
+                this.diffusionModel.items = [];
             } else {
                 window['MainHeaderComponent'].setSnav(this.sidenavLeft);
                 window['MainHeaderComponent'].setSnavRight(this.sidenavRight);
@@ -67,9 +67,7 @@ export class DiffusionModelAdministrationComponent implements OnInit {
                 .subscribe((data: any) => {
                         this.diffusionModel = data['listTemplate'];
                         this.headerService.setHeader(this.lang.diffusionModelModification, this.diffusionModel.title);
-                        if (this.diffusionModel.diffusionList[0]) {
-                            this.idCircuit = this.diffusionModel.diffusionList[0].id;
-                        }
+                        this.idCircuit = params['id'];
                         this.loading = false;
 
                     }, () => {
@@ -84,7 +82,7 @@ export class DiffusionModelAdministrationComponent implements OnInit {
         var item_mode = '';
         var item_mode2 = '';
 
-        if (this.diffusionModel.object_type == 'AVIS_CIRCUIT') {
+        if (this.diffusionModel.type == 'opinionCircuit') {
             item_mode = 'avis';
             item_mode2 = 'avis';
         } else {
@@ -92,32 +90,31 @@ export class DiffusionModelAdministrationComponent implements OnInit {
             item_mode2 = 'visa';
         }
         var newElemListModel = {
-            "id": '',
-            "item_type": 'user_id',
-            "item_mode": item_mode,
-            "item_id": element.id,
-            "sequence": this.diffusionModel.diffusionList.length,
+            "type": 'user',
+            "mode": item_mode,
+            "id": element.id,
+            "sequence": this.diffusionModel.items.length,
             "idToDisplay": element.idToDisplay,
             "descriptionToDisplay": element.descriptionToDisplay
         };
 
-        this.diffusionModel.diffusionList.push(newElemListModel);
-        if (this.diffusionModel.diffusionList.length > 1) {
-            this.diffusionModel.diffusionList[this.diffusionModel.diffusionList.length-2].item_mode = item_mode2;
+        this.diffusionModel.items.push(newElemListModel);
+        if (this.diffusionModel.items.length > 1) {
+            this.diffusionModel.items[this.diffusionModel.items.length-2].item_mode = item_mode2;
         }
     }
 
     updateDiffListVisa(template: any): any {
         this.listDiffModified = true;
-        this.diffusionModel.diffusionList.forEach((listModel: any, i: number) => {
+        this.diffusionModel.items.forEach((listModel: any, i: number) => {
             listModel.sequence = i;
-            if (this.diffusionModel.object_type == 'AVIS_CIRCUIT') {
-                listModel.item_mode = "avis";
+            if (this.diffusionModel.type == 'opinionCircuit') {
+                listModel.mode = "avis";
             } else {
-                if (i == (this.diffusionModel.diffusionList.length - 1)) {
-                    listModel.item_mode = "sign";
+                if (i == (this.diffusionModel.items.length - 1)) {
+                    listModel.mode = "sign";
                 } else {
-                    listModel.item_mode = "visa";
+                    listModel.mode = "visa";
                 }
             }
         });
@@ -125,18 +122,18 @@ export class DiffusionModelAdministrationComponent implements OnInit {
 
     removeDiffListVisa(template: any, i: number): any {
         this.listDiffModified = true;
-        this.diffusionModel.diffusionList.splice(i, 1);
+        this.diffusionModel.items.splice(i, 1);
 
-        if (this.diffusionModel.diffusionList.length > 0) {
-            this.diffusionModel.diffusionList.forEach((listModel: any, i: number) => {
+        if (this.diffusionModel.items.length > 0) {
+            this.diffusionModel.items.forEach((listModel: any, i: number) => {
                 listModel.sequence = i;
-                if (this.diffusionModel.object_type == 'AVIS_CIRCUIT') {
-                    listModel.item_mode = "avis";
+                if (this.diffusionModel.type == 'opinionCircuit') {
+                    listModel.mode = "avis";
                 } else {
-                    if (i == (this.diffusionModel.diffusionList.length - 1)) {
-                        listModel.item_mode = "sign";
+                    if (i == (this.diffusionModel.items.length - 1)) {
+                        listModel.mode = "sign";
                     } else {
-                        listModel.item_mode = "visa";
+                        listModel.mode = "visa";
                     }
                 }
             });
@@ -147,9 +144,6 @@ export class DiffusionModelAdministrationComponent implements OnInit {
         this.http.get("../../rest/listTemplates/" + this.idCircuit)
             .subscribe((data: any) => {
                 this.diffusionModel = data['listTemplate'];
-                if (this.diffusionModel.diffusionList[0]) {
-                    this.idCircuit = this.diffusionModel.diffusionList[0].id;
-                }
                 this.loading = false;
                 this.listDiffModified = false;
 
@@ -161,33 +155,30 @@ export class DiffusionModelAdministrationComponent implements OnInit {
     saveDiffListVisa() {
         this.listDiffModified = false;
         var newDiffList = {
-            "object_id": this.diffusionModel.object_id,
-            "object_type": this.diffusionModel.object_type,
+            "type": this.diffusionModel.type,
             "title": this.diffusionModel.title,
             "description": this.diffusionModel.description,
             "items": Array()
         };
         if (this.idCircuit == null) {
-            this.diffusionModel.diffusionList.forEach((listModel: any, i: number) => {
+            this.diffusionModel.items.forEach((listModel: any, i: number) => {
                 listModel.sequence = i;
-                if (this.diffusionModel.object_type == 'AVIS_CIRCUIT') {
-                    listModel.item_mode = "avis";
+                if (this.diffusionModel.type == 'opinionCircuit') {
+                    listModel.mode = "avis";
                 } else {
-                    if (i == (this.diffusionModel.diffusionList.length - 1)) {
-                        listModel.item_mode = "sign";
+                    if (i == (this.diffusionModel.items.length - 1)) {
+                        listModel.mode = "sign";
                     } else {
-                        listModel.item_mode = "visa";
+                        listModel.mode = "visa";
                     }
                 }
                 newDiffList.items.push({
                     "id": listModel.id,
-                    "item_id": listModel.item_id,
-                    "item_type": "user_id",
-                    "item_mode": listModel.item_mode,
+                    "type": "user",
+                    "mode": listModel.mode,
                     "sequence": listModel.sequence
                 });
             });
-            newDiffList.object_id = newDiffList.object_type + '_' + (Math.random()+ +new Date).toString(36).replace('.','').toUpperCase();
             this.http.post("../../rest/listTemplates", newDiffList)
                 .subscribe((data: any) => {
                     this.idCircuit = data.id;
@@ -196,30 +187,28 @@ export class DiffusionModelAdministrationComponent implements OnInit {
                 }, (err) => {
                     this.notify.error(err.error.errors);
                 });
-        } else if (this.diffusionModel.diffusionList.length > 0) {
-            this.diffusionModel.diffusionList.forEach((listModel: any, i: number) => {
+        } else if (this.diffusionModel.items.length > 0) {
+            this.diffusionModel.items.forEach((listModel: any, i: number) => {
                 listModel.sequence = i;
                 
-                if (this.diffusionModel.object_type == 'AVIS_CIRCUIT') {
-                    listModel.item_mode = "avis";
+                if (this.diffusionModel.type == 'opinionCircuit') {
+                    listModel.mode = "avis";
                 } else {
-                    if (i == (this.diffusionModel.diffusionList.length - 1)) {
-                        listModel.item_mode = "sign";
+                    if (i == (this.diffusionModel.items.length - 1)) {
+                        listModel.mode = "sign";
                     } else {
-                        listModel.item_mode = "visa";
+                        listModel.mode = "visa";
                     }
                 }
                 newDiffList.items.push({
                     "id": listModel.id,
-                    "item_id": listModel.item_id,
-                    "item_type": "user_id",
-                    "item_mode": listModel.item_mode,
+                    "type": "user",
+                    "mode": listModel.mode,
                     "sequence": listModel.sequence
                 });
             });
             this.http.put("../../rest/listTemplates/" + this.idCircuit, newDiffList)
-                .subscribe((data: any) => {
-                    this.idCircuit = data.id;
+                .subscribe(() => {
                     this.notify.success(this.lang.diffusionModelUpdated);
                 }, (err) => {
                     this.notify.error(err.error.errors);
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.html b/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.html
index f775e7045a6ddcb6e00095ad367d457cf888ef9f..a6ae8e8424a7eac54d0c2faf5a412370bf896901 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.html
+++ b/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.html
@@ -45,7 +45,7 @@
                     <ng-container matColumnDef="object_type">
                         <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:2;">{{lang.type}}</mat-header-cell>
                         <mat-cell *matCellDef="let element" style="flex:2;" >
-                        {{element.object_type}} </mat-cell>
+                        {{element.type}} </mat-cell>
                     </ng-container>
                     <ng-container matColumnDef="actions">
                         <mat-header-cell *matHeaderCellDef style="flex:1;"></mat-header-cell>
@@ -65,4 +65,4 @@
             position='end' [opened]="appService.getViewMode() ? false : false">
         </mat-sidenav>
     </mat-sidenav-container>
-</div>
\ No newline at end of file
+</div>
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.ts b/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.ts
index 1f8346949ba5e3018aed029a0ec4c6f95d117814..0ab532935946cdb7cf99fde0ac7b9939a80b7b72 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.ts
+++ b/src/frontend/app/administration/diffusionModel/diffusionModels-administration.component.ts
@@ -62,7 +62,7 @@ export class DiffusionModelsAdministrationComponent implements OnInit {
         this.http.get("../../rest/listTemplates")
             .subscribe((data: any) => {
                 data['listTemplates'].forEach((template: any) => {
-                    if (template.object_id.indexOf('VISA_CIRCUIT_') != -1 || template.object_id.indexOf('AVIS_CIRCUIT_') != -1) {
+                    if ((template.type.indexOf('visaCircuit') != -1 || template.type.indexOf('opinionCircuit') != -1) && template.entityId == null) {
                         this.listTemplates.push(template);
                     }
                 });
diff --git a/src/frontend/app/administration/entity/entities-administration.component.html b/src/frontend/app/administration/entity/entities-administration.component.html
index 346d09f5c65b88fc6b6d808d1dc33a8c44e7116f..3f8b5fe68ce16672f3aa4a2b59a53d1475f73757 100755
--- a/src/frontend/app/administration/entity/entities-administration.component.html
+++ b/src/frontend/app/administration/entity/entities-administration.component.html
@@ -218,12 +218,12 @@
                                 <mat-list *ngIf="currentEntity.entity_id">
                                     <span *ngFor="let role of listTemplateRoles; let i = index">
                                         <h3 *ngIf="role.available" mat-subheader style="font-weight:bold;" color="primary">{{role.label}}</h3>
-                                        <span *ngIf="role.available" dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.listTemplate[role.id]">
+                                        <span *ngIf="role.available && currentEntity.listTemplate.items" dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.listTemplate.items[role.id]">
                                             <div style="min-height:30px;">
-                                                <mat-list-item class="roleDiffList" disableRipple="true" *ngFor="let template of currentEntity.listTemplate[role.id]; let i = index"
+                                                <mat-list-item class="roleDiffList" disableRipple="true" *ngFor="let template of currentEntity.listTemplate.items[role.id]; let i = index"
                                                     dnd-sortable (onDropSuccess)="updateDiffList(template,role.id)" [sortableIndex]="i"
-                                                    [dragEnabled]="role.id != 'dest' && template.item_type != 'entity_id'">
-                                                    <mat-icon color="primary" mat-list-icon [class]="template.item_type == 'entity_id' ? 'fa fa-sitemap' : 'fa fa-user'" [title]="role.id != 'dest' && template.item_type != 'entity_id' ? lang.move : lang.noMove"></mat-icon>
+                                                    [dragEnabled]="role.id != 'dest' && template.type != 'entity'">
+                                                    <mat-icon color="primary" mat-list-icon [class]="template.type == 'entity' ? 'fa fa-sitemap' : 'fa fa-user'" [title]="role.id != 'dest' && template.type != 'entity' ? lang.move : lang.noMove"></mat-icon>
                                                     <p mat-line>{{template.labelToDisplay}}
                                                         <small style="opacity:0.5;">{{template.descriptionToDisplay}}</small>
                                                     </p>
@@ -238,7 +238,7 @@
                             </div>
                             <div class="form-group" *ngIf="currentEntity.entity_id">
                                 <div class="col-md-12 text-center" style="padding:10px;">
-                                    <button mat-raised-button color="primary" (click)="saveDiffList()" [disabled]="!this.listDiffModified || (currentEntity.listTemplate.dest.length == 0 && currentEntity.listTemplate.cc.length > 0)">{{lang.save}}</button>
+                                    <button mat-raised-button color="primary" (click)="saveDiffList()" [disabled]="!this.listDiffModified || (currentEntity.listTemplate.items.dest.length == 0 && currentEntity.listTemplate.items.cc.length > 0)">{{lang.save}}</button>
                                     <button mat-raised-button color="default" (click)="loadEntity(this.currentEntity.entity_id)" [disabled]="!this.listDiffModified">{{lang.cancel}}</button>
                                 </div>
                             </div>
@@ -247,12 +247,12 @@
                     <mat-tab label="{{lang.visaWorkflow}}" *ngIf="!creationMode">
                         <div class="row" style="margin:0px;" id="visaCircuitContent">
                             <div class="col-md-12">
-                                <plugin-autocomplete [labelPlaceholder]="lang.addVisaSignUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/circuit']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
-                                <mat-list>
-                                    <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.visaTemplate">
-                                        <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.visaTemplate; let i = index" title="{{lang.move}}"
+                                <plugin-autocomplete [labelPlaceholder]="lang.addVisaSignUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/circuit?circuit=visa']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
+                                <mat-list *ngIf="currentEntity.visaCircuit">
+                                    <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.visaCircuit.items">
+                                        <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.visaCircuit.items; let i = index" title="{{lang.move}}"
                                             dnd-sortable [sortableIndex]="i" (onDropSuccess)="updateDiffListVisa(template)">
-                                            <mat-icon color="primary" [class]="template.item_mode == 'visa' ? 'fa fa-user' : 'fa fa-certificate'" mat-list-icon></mat-icon>
+                                            <mat-icon color="primary" [class]="template.mode == 'visa' ? 'fa fa-user' : 'fa fa-certificate'" mat-list-icon></mat-icon>
                                             <p mat-line>{{template.idToDisplay}}
                                                 <small style="opacity:0.5;">{{template.descriptionToDisplay}}</small>
                                             </p>
@@ -265,8 +265,35 @@
                             </div>
                             <div class="form-group" *ngIf="currentEntity.entity_id">
                                 <div class="col-md-12 text-center" style="padding:10px;">
-                                    <button mat-raised-button color="primary" (click)="saveDiffListVisa()" [disabled]="!this.listDiffModified || (currentEntity.listTemplate.dest.length == 0 && currentEntity.listTemplate.cc.length > 0)">{{lang.save}}</button>
-                                    <button mat-raised-button color="default" (click)="loadEntity(this.currentEntity.entity_id)" [disabled]="!this.listDiffModified">{{lang.cancel}}</button>
+                                    <button mat-raised-button color="primary" (click)="saveDiffListVisa()" [disabled]="!this.visaCircuitModified">{{lang.save}}</button>
+                                    <button mat-raised-button color="default" (click)="loadEntity(this.currentEntity.entity_id)" [disabled]="!this.visaCircuitModified">{{lang.cancel}}</button>
+                                </div>
+                            </div>
+                        </div>
+                    </mat-tab>
+                    <mat-tab label="{{lang.avis}}" *ngIf="!creationMode">
+                        <div class="row" style="margin:0px;" id="opinionCircuitContent">
+                            <div class="col-md-12">
+                                <plugin-autocomplete [labelPlaceholder]="lang.addVisaSignUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/circuit?circuit=opinion']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelOpinion($event)"></plugin-autocomplete>
+                                <mat-list *ngIf="currentEntity.opinionCircuit">
+                                    <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.opinionCircuit.items">
+                                        <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.opinionCircuit.items; let i = index" title="{{lang.move}}"
+                                            dnd-sortable [sortableIndex]="i">
+                                            <mat-icon color="primary" [class]="'fa fa-user'" mat-list-icon></mat-icon>
+                                            <p mat-line>{{template.idToDisplay}}
+                                                <small style="opacity:0.5;">{{template.descriptionToDisplay}}</small>
+                                            </p>
+                                            <button matTooltip="{{lang.delete}}" mat-icon-button color="warn" (click)="removeDiffListOpinion(template,i)">
+                                                <mat-icon class="fa fa-times"></mat-icon>
+                                            </button>
+                                        </mat-list-item>
+                                    </span>
+                                </mat-list>
+                            </div>
+                            <div class="form-group" *ngIf="currentEntity.entity_id">
+                                <div class="col-md-12 text-center" style="padding:10px;">
+                                    <button mat-raised-button color="primary" (click)="saveDiffListOpinion()" [disabled]="!this.opinionCircuitModified">{{lang.save}}</button>
+                                    <button mat-raised-button color="default" (click)="loadEntity(this.currentEntity.entity_id)" [disabled]="!this.opinionCircuitModified">{{lang.cancel}}</button>
                                 </div>
                             </div>
                         </div>
diff --git a/src/frontend/app/administration/entity/entities-administration.component.ts b/src/frontend/app/administration/entity/entities-administration.component.ts
index 70cae27ed82cdca51c5076b4f0a1a2d87da49754..9a9aeccdd4f708abb2b0e45ff2133c007120acf2 100755
--- a/src/frontend/app/administration/entity/entities-administration.component.ts
+++ b/src/frontend/app/administration/entity/entities-administration.component.ts
@@ -38,7 +38,10 @@ export class EntitiesAdministrationComponent implements OnInit {
     newEntity                       : boolean   = false;
     creationMode                    : boolean   = false;
     listDiffModified                : boolean   = false;
-    idCircuitVisa                   : number;
+    visaCircuitModified             : boolean   = false;
+    opinionCircuitModified          : boolean   = false;
+    idVisaCircuit                   : number;
+    idOpinionCircuit                : number;
     config                          : any       = {};
 
     dataSourceUsers             = new MatTableDataSource(this.currentEntity.users);
@@ -191,13 +194,20 @@ export class EntitiesAdministrationComponent implements OnInit {
 
     loadEntity(entity_id: any) {
         this.listDiffModified = false;
+        this.visaCircuitModified = false;
+        this.opinionCircuitModified = false;
         this.http.get("../../rest/entities/" + entity_id + '/details')
             .subscribe((data: any) => {
                 this.currentEntity = data['entity'];
-                if (this.currentEntity.visaTemplate[0]) {
-                    this.idCircuitVisa = this.currentEntity.visaTemplate[0].id;
+                if (this.currentEntity.visaCircuit) {
+                    this.idVisaCircuit = this.currentEntity.visaCircuit.id;
                 } else {
-                    this.idCircuitVisa = null;
+                    this.idVisaCircuit = null;
+                }
+                if (this.currentEntity.opinionCircuit) {
+                    this.idOpinionCircuit = this.currentEntity.opinionCircuit.id;
+                } else {
+                    this.idOpinionCircuit = null;
                 }
                 this.dataSourceUsers = new MatTableDataSource(this.currentEntity.users);
                 this.dataSourceUsers.paginator = this.paginatorUsers;
@@ -207,6 +217,14 @@ export class EntitiesAdministrationComponent implements OnInit {
                 this.dataSourceTemplates.paginator = this.paginatorTemplates;
                 this.dataSourceTemplates.sort = this.sortTemplates;
 
+                if (!this.currentEntity.listTemplate.items) {
+                    this.currentEntity.listTemplate.items = [];
+                }
+                this.listTemplateRoles.forEach((role: any) => {
+                    if (role.available && !this.currentEntity.listTemplate.items[role.id]) {
+                        this.currentEntity.listTemplate.items[role.id] = [];
+                    }
+                });
             }, (err) => {
                 this.notify.error(err.error.errors);
             });
@@ -217,11 +235,15 @@ export class EntitiesAdministrationComponent implements OnInit {
         var inListModel = false;
         var newElemListModel: any = {};
 
+        if (!this.currentEntity.listTemplate.items) {
+            this.currentEntity.listTemplate.items = [];
+        }
+
         this.listTemplateRoles.forEach((role: any) => {
             if (role.available == true) {
-                if (this.currentEntity.listTemplate[role.id]) {
-                    this.currentEntity.listTemplate[role.id].forEach((listModel: any) => {
-                        if (listModel.item_id == element.id) {
+                if (this.currentEntity.listTemplate.items[role.id]) {
+                    this.currentEntity.listTemplate.items[role.id].forEach((listModel: any) => {
+                        if (listModel.id == element.id) {
                             inListModel = true;
                         }
                     });
@@ -229,54 +251,70 @@ export class EntitiesAdministrationComponent implements OnInit {
             }
         });
         if (!inListModel) {
-            if (this.currentEntity.listTemplate.dest.length == 0 && element.type == 'user') {
+            if (!this.currentEntity.listTemplate.items.dest) {
+                this.currentEntity.listTemplate.items.dest = [];
+            }
+            if (this.currentEntity.listTemplate.items.dest.length == 0 && element.type == 'user') {
                 newElemListModel = {
-                    "item_type": "user_id",
-                    "item_id": element.id,
+                    "id": element.serialId,
+                    "type": "user",
+                    "mode": "dest",
                     "labelToDisplay": element.idToDisplay,
-                    "descriptionToDisplay": element.otherInfo,
-                    "item_mode": "dest",
-                    "sequence": 0
+                    "descriptionToDisplay": element.otherInfo
                 };
-                this.currentEntity.listTemplate.dest.unshift(newElemListModel);
+                this.currentEntity.listTemplate.items.dest.unshift(newElemListModel);
 
             } else {
-                var itemType = '';
-                if (element.type == 'user') {
-                    itemType = 'user_id';
-                } else {
-                    itemType = 'entity_id';
+                if (!this.currentEntity.listTemplate.items.cc) {
+                    this.currentEntity.listTemplate.items.cc = [];
                 }
+                const itemType = element.type == 'user' ? 'user' : 'entity';
 
                 newElemListModel = {
-                    "item_type": itemType,
-                    "item_id": element.id,
+                    "id": element.serialId,
+                    "type": itemType,
+                    "mode": "cc",
                     "labelToDisplay": element.idToDisplay,
-                    "descriptionToDisplay": element.otherInfo,
-                    "item_mode": "cc",
-                    "sequence": 0
+                    "descriptionToDisplay": element.otherInfo
                 };
-                this.currentEntity.listTemplate.cc.unshift(newElemListModel);
+                this.currentEntity.listTemplate.items.cc.unshift(newElemListModel);
             }
         }
     }
 
     addElemListModelVisa(element: any) {
-        this.listDiffModified = true;
+        this.visaCircuitModified = true;
+        let newElemListModel = {
+            "id": element.id,
+            "type": 'user',
+            "mode": "sign",
+            "idToDisplay": element.idToDisplay,
+            "descriptionToDisplay": element.otherInfo
+        };
+
+        if (!this.currentEntity.visaCircuit.items) {
+            this.currentEntity.visaCircuit.items = [];
+        }
+        this.currentEntity.visaCircuit.items.push(newElemListModel);
+        if (this.currentEntity.visaCircuit.items.length > 1) {
+            this.currentEntity.visaCircuit.items[this.currentEntity.visaCircuit.items.length-2].mode = 'visa';
+        }
+    }
+
+    addElemListModelOpinion(element: any) {
+        this.opinionCircuitModified = true;
         let newElemListModel = {
-            "id": '',
-            "item_type": 'user_id',
-            "item_mode": "sign",
-            "item_id": element.id,
-            "sequence": this.currentEntity.visaTemplate.length,
+            "id": element.id,
+            "type": 'user',
+            "mode": "avis",
             "idToDisplay": element.idToDisplay,
             "descriptionToDisplay": element.otherInfo
         };
 
-        this.currentEntity.visaTemplate.push(newElemListModel);
-        if (this.currentEntity.visaTemplate.length > 1) {
-            this.currentEntity.visaTemplate[this.currentEntity.visaTemplate.length-2].item_mode = 'visa';
+        if (!this.currentEntity.opinionCircuit.items) {
+            this.currentEntity.opinionCircuit.items = [];
         }
+        this.currentEntity.opinionCircuit.items.push(newElemListModel);
     }
 
     saveEntity() {
@@ -375,10 +413,10 @@ export class EntitiesAdministrationComponent implements OnInit {
                         });
                     }
 
-                    if (this.idCircuitVisa) {
-                        this.http.delete("../../rest/listTemplates/" + this.idCircuitVisa)
+                    if (this.idVisaCircuit) {
+                        this.http.delete("../../rest/listTemplates/" + this.idVisaCircuit)
                             .subscribe(() => {
-                                this.idCircuitVisa = null;
+                                this.idVisaCircuit = null;
                             }, (err) => {
                                 this.notify.error(err.error.errors);
                             });
@@ -421,10 +459,10 @@ export class EntitiesAdministrationComponent implements OnInit {
                     });
                 }
 
-                if (this.idCircuitVisa) {
-                    this.http.delete("../../rest/listTemplates/" + this.idCircuitVisa)
+                if (this.idVisaCircuit) {
+                    this.http.delete("../../rest/listTemplates/" + this.idVisaCircuit)
                         .subscribe(() => {
-                            this.idCircuitVisa = null;
+                            this.idVisaCircuit = null;
                         }, (err) => {
                             this.notify.error(err.error.errors);
                         });
@@ -484,35 +522,34 @@ export class EntitiesAdministrationComponent implements OnInit {
 
     updateDiffList(template: any, role: any): any {
         this.listDiffModified = true;
-        if (role == 'dest' && this.currentEntity.listTemplate.dest.length > 0) {
-            this.currentEntity.listTemplate.dest.forEach((listModel: any) => {
-                if (listModel.item_id != template.item_id) {
-                    this.currentEntity.listTemplate.cc.push(listModel);
+        if (role == 'dest' && this.currentEntity.listTemplate.items.dest.length > 0) {
+            this.currentEntity.listTemplate.items.dest.forEach((listModel: any) => {
+                if (listModel.id != template.id) {
+                    this.currentEntity.listTemplate.items.cc.push(listModel);
                 }
             });
-            this.currentEntity.listTemplate.dest = [template];
+            this.currentEntity.listTemplate.items.dest = [template];
         }
     }
 
     saveDiffList() {
         this.listDiffModified = false;
         var newDiffList = {
-            "object_id": this.currentEntity.entity_id,
-            "object_type": "entity_id",
             "title": this.currentEntity.entity_id,
             "description": this.currentEntity.entity_id,
+            "type": "diffusionList",
+            "entityId": this.currentEntity.id,
             "items": Array()
         };
 
         this.listTemplateRoles.forEach((role: any) => {
             if (role.available == true) {
-                if (this.currentEntity.listTemplate[role.id]) {
-                    this.currentEntity.listTemplate[role.id].forEach((listModel: any) => {
+                if (this.currentEntity.listTemplate.items[role.id]) {
+                    this.currentEntity.listTemplate.items[role.id].forEach((listModel: any) => {
                         newDiffList.items.push({
-                            "item_id": listModel.item_id,
-                            "item_type": listModel.item_type,
-                            "item_mode": role.id,
-                            "sequence": listModel.sequence
+                            "id": listModel.id,
+                            "type": listModel.type,
+                            "mode": role.id
                         })
                     });
                 }
@@ -535,8 +572,7 @@ export class EntitiesAdministrationComponent implements OnInit {
                 });
         } else if (this.currentEntity.listTemplate.id) {
             this.http.put("../../rest/listTemplates/" + this.currentEntity.listTemplate.id, newDiffList)
-                .subscribe((data: any) => {
-                    this.currentEntity.listTemplate.id = data.id;
+                .subscribe(() => {
                     this.http.get("../../rest/listTemplates/types/entity_id/roles")
                         .subscribe((data: any) => {
                             this.listTemplateRoles = data['roles'];
@@ -565,76 +601,63 @@ export class EntitiesAdministrationComponent implements OnInit {
     }
 
     updateDiffListVisa(template: any): any {
-        this.listDiffModified = true;
-        this.currentEntity.visaTemplate.forEach((listModel: any, i: number) => {
+        this.visaCircuitModified = true;
+        this.currentEntity.visaCircuit.items.forEach((listModel: any, i: number) => {
             listModel.sequence = i;
-            if (i == (this.currentEntity.visaTemplate.length - 1)) {
-                listModel.item_mode = "sign";
+            if (i == (this.currentEntity.visaCircuit.items.length - 1)) {
+                listModel.mode = "sign";
             } else {
-                listModel.item_mode = "visa";
+                listModel.mode = "visa";
             }
         });
     }
 
     saveDiffListVisa() {
-        this.listDiffModified = false;
-        var newDiffList = {
-            "object_id": this.currentEntity.entity_id,
-            "object_type": "VISA_CIRCUIT",
+        this.visaCircuitModified = false;
+        const newDiffList = {
             "title": this.currentEntity.entity_id,
             "description": this.currentEntity.entity_id,
+            "type": "visaCircuit",
+            "entityId": this.currentEntity.id,
             "items": Array()
         };
-        if (this.idCircuitVisa == null) {
-            this.currentEntity.visaTemplate.forEach((listModel: any, i: number) => {
+        if (this.idVisaCircuit == null) {
+            this.currentEntity.visaCircuit.items.forEach((listModel: any, i: number) => {
                 listModel.sequence = i;
-                if (i == (this.currentEntity.visaTemplate.length - 1)) {
-                    listModel.item_mode = "sign";
+                if (i == (this.currentEntity.visaCircuit.items.length - 1)) {
+                    listModel.mode = "sign";
                 } else {
-                    listModel.item_mode = "visa";
+                    listModel.mode = "visa";
                 }
-                newDiffList.items.push({
-                    "id": listModel.id,
-                    "item_id": listModel.item_id,
-                    "item_type": "user_id",
-                    "item_mode": listModel.item_mode,
-                    "sequence": listModel.sequence
-                });
+                newDiffList.items.push(listModel);
             });
             this.http.post("../../rest/listTemplates", newDiffList)
                 .subscribe((data: any) => {
-                    this.idCircuitVisa = data.id;
+                    this.idVisaCircuit = data.id;
                     this.notify.success(this.lang.diffusionModelUpdated);
                 }, (err) => {
                     this.notify.error(err.error.errors);
                 });
-        } else if (this.currentEntity.visaTemplate.length > 0) {
-            this.currentEntity.visaTemplate.forEach((listModel: any, i: number) => {
+        } else if (this.currentEntity.visaCircuit.items.length > 0) {
+            this.currentEntity.visaCircuit.items.forEach((listModel: any, i: number) => {
                 listModel.sequence = i;
-                if (i == (this.currentEntity.visaTemplate.length - 1)) {
-                    listModel.item_mode = "sign";
+                if (i == (this.currentEntity.visaCircuit.items.length - 1)) {
+                    listModel.mode = "sign";
                 } else {
-                    listModel.item_mode = "visa";
+                    listModel.mode = "visa";
                 }
-                newDiffList.items.push({
-                    "id": listModel.id,
-                    "item_id": listModel.item_id,
-                    "item_type": "user_id",
-                    "item_mode": listModel.item_mode,
-                    "sequence": listModel.sequence
-                });
+                newDiffList.items.push(listModel);
             });
-            this.http.put("../../rest/listTemplates/" + this.idCircuitVisa, newDiffList)
-                .subscribe((data: any) => {
-                    this.idCircuitVisa = data.id;
+            this.http.put("../../rest/listTemplates/" + this.idVisaCircuit, newDiffList)
+                .subscribe(() => {
                     this.notify.success(this.lang.diffusionModelUpdated);
                 }, (err) => {
                     this.notify.error(err.error.errors);
                 });
         } else {
-            this.http.delete("../../rest/listTemplates/" + this.idCircuitVisa)
+            this.http.delete("../../rest/listTemplates/" + this.idVisaCircuit)
             .subscribe(() => {
-                this.idCircuitVisa = null;
+                this.idVisaCircuit = null;
                 this.notify.success(this.lang.diffusionModelDeleted);
             }, (err) => {
                 this.notify.error(err.error.errors);
@@ -642,27 +665,69 @@ export class EntitiesAdministrationComponent implements OnInit {
         }
     }
 
+    saveDiffListOpinion() {
+        this.opinionCircuitModified = false;
+        const newDiffList = {
+            "title": this.currentEntity.entity_id,
+            "description": this.currentEntity.entity_id,
+            "type": "opinionCircuit",
+            "entityId": this.currentEntity.id,
+            "items": Array()
+        };
+        if (this.idOpinionCircuit == null) {
+            newDiffList.items = this.currentEntity.opinionCircuit.items;
+            this.http.post("../../rest/listTemplates", newDiffList)
+                .subscribe((data: any) => {
+                    this.idOpinionCircuit = data.id;
+                    this.notify.success(this.lang.diffusionModelUpdated);
+                }, (err) => {
+                    this.notify.error(err.error.errors);
+                });
+        } else if (this.currentEntity.opinionCircuit.items.length > 0) {
+            newDiffList.items = this.currentEntity.opinionCircuit.items;
+            this.http.put("../../rest/listTemplates/" + this.idOpinionCircuit, newDiffList)
+                .subscribe(() => {
+                    this.notify.success(this.lang.diffusionModelUpdated);
+                }, (err) => {
+                    this.notify.error(err.error.errors);
+                });
+        } else {
+            this.http.delete("../../rest/listTemplates/" + this.idOpinionCircuit)
+                .subscribe(() => {
+                    this.idOpinionCircuit = null;
+                    this.notify.success(this.lang.diffusionModelDeleted);
+                }, (err) => {
+                    this.notify.error(err.error.errors);
+                });
+        }
+    }
+
     removeDiffList(i: number, role: string): any {
         this.listDiffModified = true;
-        this.currentEntity.listTemplate[role].splice(i, 1);
+        this.currentEntity.listTemplate.items[role].splice(i, 1);
     }
 
     removeDiffListVisa(template: any, i: number): any {
-        this.listDiffModified = true;
-        this.currentEntity.visaTemplate.splice(i, 1);
+        this.visaCircuitModified = true;
+        this.currentEntity.visaCircuit.items.splice(i, 1);
 
-        if (this.currentEntity.visaTemplate.length > 0) {
-            this.currentEntity.visaTemplate.forEach((listModel: any, i: number) => {
+        if (this.currentEntity.visaCircuit.items.length > 0) {
+            this.currentEntity.visaCircuit.items.forEach((listModel: any, i: number) => {
                 listModel.sequence = i;
-                if (i == (this.currentEntity.visaTemplate.length - 1)) {
-                    listModel.item_mode = "sign";
+                if (i == (this.currentEntity.visaCircuit.items.length - 1)) {
+                    listModel.mode = "sign";
                 } else {
-                    listModel.item_mode = "visa";
+                    listModel.mode = "visa";
                 }
             });
         }
     }
 
+    removeDiffListOpinion(template: any, i: number): any {
+        this.opinionCircuitModified = true;
+        this.currentEntity.opinionCircuit.items.splice(i, 1);
+    }
+
     toggleRole(role: any) {
         if (role.usedIn.length > 0) {
             this.config = { data: { msg: this.lang.confirmAction, warn: this.lang.roleUsedInTemplateInfo + " : <b>" + role.usedIn.join(', ') + '</b><br/>' + this.lang.roleUsedInTemplateInfo2 } };
@@ -674,7 +739,7 @@ export class EntitiesAdministrationComponent implements OnInit {
                         .subscribe(() => {
                             role.usedIn = [];
                             if (this.currentEntity.listTemplate) {
-                                this.currentEntity.listTemplate[role.id] = [];
+                                this.currentEntity.listTemplate.items[role.id] = [];
                             }
                             this.notify.success(this.lang.listTemplatesRolesUpdated);
                         }, (err) => {
@@ -687,7 +752,7 @@ export class EntitiesAdministrationComponent implements OnInit {
             this.http.put("../../rest/listTemplates/types/entity_id/roles", { "roles": this.listTemplateRoles })
                 .subscribe(() => {
                     if (this.currentEntity.listTemplate) {
-                        this.currentEntity.listTemplate[role.id] = [];
+                        this.currentEntity.listTemplate.items[role.id] = [];
                         this.http.get("../../rest/listTemplates/types/entity_id/roles")
                             .subscribe((data: any) => {
                                 this.listTemplateRoles = data['roles'];
diff --git a/src/frontend/app/administration/user/users-administration.component.ts b/src/frontend/app/administration/user/users-administration.component.ts
index 0e303b1bdbd9b6fef89e2b91c4aeda552d229137..557946e2e4c00f14e6eea27ac40bf00ad2c1dc07 100755
--- a/src/frontend/app/administration/user/users-administration.component.ts
+++ b/src/frontend/app/administration/user/users-administration.component.ts
@@ -121,7 +121,7 @@ export class UsersAdministrationComponent implements OnInit {
                 if (response && response.hasOwnProperty('errors')) {
                     this.notify.error(response.errors);
                 } else {
-                    user.isDeletable = response.isDeletable
+                    user.isDeletable = response.isDeletable;
 
                     if (response.isDeletable) {
                         this.config = {
@@ -173,122 +173,109 @@ export class UsersAdministrationComponent implements OnInit {
                             if (user.inDiffListDest && user.isResDestUser) { //user is inDiffListDest and isResDestUser
 
                                 //update listModels
-                                this.http.put('../../rest/listTemplates/entityDest/itemId/' + user.user_id, user)
-                                    .subscribe((data: any) => {
-                                        if (data.errors) {
-                                            this.notify.error(data.errors);
-                                        } else {
-
-                                            //update listInstances
-                                            this.http.put('../../rest/listinstances', user.redirectListInstances)
-                                                .subscribe((data: any) => {
-                                                    if (data != null && data.errors) {
-                                                        this.notify.error(data.errors);
-                                                    } else {
-
-                                                        //delete user
-                                                        if (user.mode == 'delete') {
-                                                            this.http.delete('../../rest/users/' + user.id)
-                                                                .subscribe(() => {
-                                                                    for (let i in this.data) {
-                                                                        if (this.data[i].id == user.id) {
-                                                                            this.data.splice(Number(i), 1);
-                                                                        }
+                                this.http.put('../../rest/listTemplates/entityDest/itemId/' + user.id, user)
+                                    .subscribe(() => {
+                                        this.http.put('../../rest/listinstances', user.redirectListInstances)
+                                            .subscribe((data: any) => {
+                                                if (data != null && data.errors) {
+                                                    this.notify.error(data.errors);
+                                                } else {
+
+                                                    //delete user
+                                                    if (user.mode == 'delete') {
+                                                        this.http.delete('../../rest/users/' + user.id)
+                                                            .subscribe(() => {
+                                                                for (let i in this.data) {
+                                                                    if (this.data[i].id == user.id) {
+                                                                        this.data.splice(Number(i), 1);
                                                                     }
-                                                                    this.dataSource = new MatTableDataSource(this.data);
-                                                                    this.dataSource.paginator = this.paginator;
-                                                                    this.dataSource.sort = this.sort;
-
-                                                                    if (this.quota.userQuota && user.status != 'SPD') {
-                                                                        this.quota.actives--;
-                                                                    } else if (this.quota.userQuota && user.status == 'SPD') {
-                                                                        this.quota.inactives--;
-                                                                    }
-
-                                                                    this.notify.success(this.lang.userDeleted + ' « ' + user.user_id + ' »');
-
-                                                                    //end delete user
-                                                                }, (err) => {
-                                                                    this.notify.error(err.error.errors);
-                                                                });
-                                                            //suspend user
-                                                        } else if (user.mode == 'suspend') {
-                                                            this.http.put('../../rest/users/' + user.id + '/suspend', user)
-                                                                .subscribe(() => {
-                                                                    user.status = 'SPD';
-                                                                    this.notify.success(this.lang.userSuspended);
-                                                                    if (this.quota.userQuota) {
-                                                                        this.quota.inactives++;
-                                                                        this.quota.actives--;
-                                                                    }
-
-                                                                }, (err) => {
-                                                                    user.status = 'OK';
-                                                                    this.notify.error(err.error.errors);
-                                                                });
-                                                        }
+                                                                }
+                                                                this.dataSource = new MatTableDataSource(this.data);
+                                                                this.dataSource.paginator = this.paginator;
+                                                                this.dataSource.sort = this.sort;
+
+                                                                if (this.quota.userQuota && user.status != 'SPD') {
+                                                                    this.quota.actives--;
+                                                                } else if (this.quota.userQuota && user.status == 'SPD') {
+                                                                    this.quota.inactives--;
+                                                                }
+
+                                                                this.notify.success(this.lang.userDeleted + ' « ' + user.user_id + ' »');
+
+                                                                //end delete user
+                                                            }, (err) => {
+                                                                this.notify.error(err.error.errors);
+                                                            });
+                                                        //suspend user
+                                                    } else if (user.mode == 'suspend') {
+                                                        this.http.put('../../rest/users/' + user.id + '/suspend', user)
+                                                            .subscribe(() => {
+                                                                user.status = 'SPD';
+                                                                this.notify.success(this.lang.userSuspended);
+                                                                if (this.quota.userQuota) {
+                                                                    this.quota.inactives++;
+                                                                    this.quota.actives--;
+                                                                }
+
+                                                            }, (err) => {
+                                                                user.status = 'OK';
+                                                                this.notify.error(err.error.errors);
+                                                            });
                                                     }
-                                                    //end update listInstances
-                                                }, (err) => {
-                                                    this.notify.error(err.error.errors);
-                                                });
-                                        }
-                                        //end update listModels
+                                                }
+                                                //end update listInstances
+                                            }, (err) => {
+                                                this.notify.error(err.error.errors);
+                                            });
                                     }, (err) => {
                                         this.notify.error(err.error.errors);
                                     });
 
                             } else if (user.inDiffListDest && !user.isResDestUser) { //user is inDiffListDest
                                 //update listModels
-                                this.http.put('../../rest/listTemplates/entityDest/itemId/' + user.user_id, user)
-                                    .subscribe((data: any) => {
-                                        if (data.errors) {
-                                            this.notify.error(data.errors);
-                                        } else {
-
-                                            //delete user
-                                            if (user.mode == 'delete') {
-                                                this.http.delete('../../rest/users/' + user.id)
-                                                    .subscribe(() => {
-                                                        for (let i in this.data) {
-                                                            if (this.data[i].id == user.id) {
-                                                                this.data.splice(Number(i), 1);
-                                                            }
-                                                        }
-                                                        this.dataSource = new MatTableDataSource(this.data);
-                                                        this.dataSource.paginator = this.paginator;
-                                                        this.dataSource.sort = this.sort;
-
-                                                        if (this.quota.userQuota && user.status == 'OK') {
-                                                            this.quota.actives--;
-                                                        } else if (this.quota.userQuota && user.status == 'SPD') {
-                                                            this.quota.inactives--;
+                                this.http.put('../../rest/listTemplates/entityDest/itemId/' + user.id, user)
+                                    .subscribe(() => {
+                                        //delete user
+                                        if (user.mode == 'delete') {
+                                            this.http.delete('../../rest/users/' + user.id)
+                                                .subscribe(() => {
+                                                    for (let i in this.data) {
+                                                        if (this.data[i].id == user.id) {
+                                                            this.data.splice(Number(i), 1);
                                                         }
+                                                    }
+                                                    this.dataSource = new MatTableDataSource(this.data);
+                                                    this.dataSource.paginator = this.paginator;
+                                                    this.dataSource.sort = this.sort;
+
+                                                    if (this.quota.userQuota && user.status == 'OK') {
+                                                        this.quota.actives--;
+                                                    } else if (this.quota.userQuota && user.status == 'SPD') {
+                                                        this.quota.inactives--;
+                                                    }
 
-                                                        this.notify.success(this.lang.userDeleted + ' « ' + user.user_id + ' »');
+                                                    this.notify.success(this.lang.userDeleted + ' « ' + user.user_id + ' »');
 
-                                                        //end delete user
-                                                    }, (err) => {
-                                                        this.notify.error(err.error.errors);
-                                                    });
-                                                //suspend user
-                                            } else if (user.mode == 'suspend') {
-                                                this.http.put('../../rest/users/' + user.id + '/suspend', user)
-                                                    .subscribe(() => {
-                                                        user.status = 'SPD';
-                                                        this.notify.success(this.lang.userSuspended);
-                                                        if (this.quota.userQuota) {
-                                                            this.quota.inactives++;
-                                                            this.quota.actives--;
-                                                        }
+                                                    //end delete user
+                                                }, (err) => {
+                                                    this.notify.error(err.error.errors);
+                                                });
+                                            //suspend user
+                                        } else if (user.mode == 'suspend') {
+                                            this.http.put('../../rest/users/' + user.id + '/suspend', user)
+                                                .subscribe(() => {
+                                                    user.status = 'SPD';
+                                                    this.notify.success(this.lang.userSuspended);
+                                                    if (this.quota.userQuota) {
+                                                        this.quota.inactives++;
+                                                        this.quota.actives--;
+                                                    }
 
-                                                    }, (err) => {
-                                                        user.status = 'OK';
-                                                        this.notify.error(err.error.errors);
-                                                    });
-                                            }
+                                                }, (err) => {
+                                                    user.status = 'OK';
+                                                    this.notify.error(err.error.errors);
+                                                });
                                         }
-                                        //end update listModels
                                     }, (err) => {
                                         this.notify.error(err.error.errors);
                                     });
diff --git a/src/frontend/app/diffusions/diffusions-list.component.ts b/src/frontend/app/diffusions/diffusions-list.component.ts
index 511bfbd258cac2065c081541dffb275693b59f41..78b674c74a20cbd5d106c4f84ea46d6e8beccd3a 100644
--- a/src/frontend/app/diffusions/diffusions-list.component.ts
+++ b/src/frontend/app/diffusions/diffusions-list.component.ts
@@ -134,7 +134,7 @@ export class DiffusionsListComponent implements OnInit {
             arrayRoutes.push(this.http.get('../../rest/roles?context=' + this.target));
         }
 
-        arrayRoutes.push(this.http.get('../../rest/listTemplates/entities/' + entityId));
+        arrayRoutes.push(this.http.get('../../rest/listTemplates/entities/' + entityId + '?type=diffusionList'));
 
         if (this.resId !== null) {
             arrayRoutes.push(this.http.get('../../rest/resources/' + this.resId + '/listInstance'));
@@ -177,13 +177,15 @@ export class DiffusionsListComponent implements OnInit {
                 }
             }),
             tap((data: any) => {
-                data.listTemplate.forEach((element: any) => {
-                    if (element.item_mode == 'cc') {
-                        this.diffList['copy'].items.push(element);
-                    } else if (element.object_type != 'VISA_CIRCUIT') {
-                        this.diffList[element.item_mode].items.push(element);
-                    }
-                });
+                if (data.listTemplates[0]) {
+                    data.listTemplates[0].items.forEach((element: any) => {
+                        if (element.item_mode == 'cc') {
+                            this.diffList['copy'].items.push(element);
+                        } else {
+                            this.diffList[element.item_mode].items.push(element);
+                        }
+                    });
+                }
             }),
             tap((data: any) => {
                 if (data.listInstance !== undefined) {
@@ -297,7 +299,7 @@ export class DiffusionsListComponent implements OnInit {
                 resId: this.resId,
                 listInstances: this.getCurrentListinstance()
             }
-        ]
+        ];
         this.http.put('../../rest/listinstances', listInstance).pipe(
             tap((data: any) => {
                 if (data && data.errors != null) {
@@ -546,4 +548,4 @@ export class DiffusionsListComponent implements OnInit {
             return false;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts
index d77621146f8715b4af220ae6528d22c2410fc9d4..46a63a15b9613710a02a7c2b503ca089ea48a00d 100644
--- a/src/frontend/app/visa/visa-workflow.component.ts
+++ b/src/frontend/app/visa/visa-workflow.component.ts
@@ -48,17 +48,15 @@ export class VisaWorkflowComponent implements OnInit {
 
         this.visaWorkflow.items = [];
 
-        let route = this.linkedToMaarchParapheur === true ? `../../rest/listTemplates/entities/${entityId}/maarchParapheur` : `../../rest/listTemplates/entities/${entityId}`;
+        let route = this.linkedToMaarchParapheur === true ? `../../rest/listTemplates/entities/${entityId}?type=visaCircuit&maarchParapheur=true` : `../../rest/listTemplates/entities/${entityId}?type=visaCircuit`;
         
         this.http.get(route)
             .subscribe((data: any) => {
-                data.listTemplate.forEach((element: any) => {
-                    if (element.object_type === 'VISA_CIRCUIT') {
-                        element.requested_signature = (element.item_mode === 'visa' ? false : true);
-                        this.visaWorkflow.items.push(element);
-                    }
-                });
+                if (data.listTemplates[0]) {
+                    this.visaWorkflow.items = data.listTemplates[0].items;
+                }
                 this.visaWorkflow.items.forEach((element: any) => {
+                    element.requested_signature = element.item_mode !== 'visa';
                     if (element.externalId.maarchParapheur !== undefined) {
                         this.http.get("../../rest/maarchParapheur/user/" + element.externalId.maarchParapheur + "/picture")
                             .subscribe((data: any) => {
@@ -119,7 +117,7 @@ export class VisaWorkflowComponent implements OnInit {
             'labelToDisplay': userRest.idToDisplay,
             'requested_signature': false,
             'picture': ''
-        }
+        };
         this.visaWorkflow.items.push(user);
         this.http.get("../../rest/maarchParapheur/user/" + user.externalId.maarchParapheur + "/picture")
             .subscribe((data: any) => {