diff --git a/apps/maarch_entreprise/Views/users-administration.component.html b/apps/maarch_entreprise/Views/users-administration.component.html
index 6cb67314451b7251dc4e231b2f4f2d4dce623661..e5220d643412e4f693b11d12b6e791519b150760 100644
--- a/apps/maarch_entreprise/Views/users-administration.component.html
+++ b/apps/maarch_entreprise/Views/users-administration.component.html
@@ -47,16 +47,24 @@
                     <td>{{user.mail}}</td>
                     <td style="text-align:right;">
                         <div class="btn-group" role="group" aria-label="...">
-                            <button routerLink="/administration/user/{{user.user_id}}" type="button" class="btn btn-default" title="{{lang.edit}}">
+                            <button routerLink="/administration/users/{{user.user_id}}" type="button" class="btn btn-default" title="{{lang.edit}}">
                                 <a><i style="cursor:pointer" class="fa fa-edit"></i></a>
                             </button>
-                            <button type="button" class="btn btn-default" title="{{lang.suspend}}" *ngIf="user.enabled == 'Y'" (click)="suspendUser(user)">
-                                <a><i style="cursor:pointer;color: #f0ad4e"class="fa fa-pause"></i></a>
+
+                            <button *ngIf="user.enabled == 'Y' && user.inDiffListDest == 'Y'" data-toggle="modal" data-target="#changeDiffListDest" type="button" class="btn btn-default" title="{{lang.suspend}}" (click)="suspendUser(user)">
+                                <a><i style="cursor:pointer;color:#f0ad4e;" class="fa fa-pause"></i></a>
+                            </button>
+                            <button *ngIf="user.enabled == 'Y' && user.inDiffListDest == 'N'" type="button" class="btn btn-default" title="{{lang.suspend}}" (click)="suspendUser(user)">
+                                <a><i style="cursor:pointer;color:#f0ad4e;" class="fa fa-pause"></i></a>
                             </button>
-                            <button type="button" class="btn btn-default" title="{{lang.reactivate}}" *ngIf="user.enabled == 'N'" (click)="activateUser(user)">
-                                <a><i style="cursor:pointer;color: #5cb85c" class="fa fa-check"></i></a>
+
+                            <button *ngIf="user.enabled == 'N'" type="button" class="btn btn-default" title="{{lang.authorize}}" (click)="activateUser(user)">
+                                <a><i style="cursor:pointer;color:#5cb85c;" class="fa fa-check"></i></a>
+                            </button>
+                            <button *ngIf="user.inDiffListDest == 'Y'" type="button" class="btn btn-default" title="{{lang.delete}}" data-toggle="modal" data-target="#changeDiffListDest" (click)="deleteUser(user)">
+                                <a><i style="cursor:pointer;color: #D9534F" class="fa fa-trash"></i></a>
                             </button>
-                            <button type="button" class="btn btn-default" title="{{lang.delete}}" (click)="deleteUser(user.user_id)">
+                            <button *ngIf="user.inDiffListDest == 'N'" type="button" class="btn btn-default" title="{{lang.delete}}" (click)="deleteUser(user)">
                                 <a><i style="cursor:pointer;color: #D9534F" class="fa fa-trash"></i></a>
                             </button>
                         </div>
@@ -67,3 +75,35 @@
     </div>
 </div>
 
+<div class="modal fade" id="changeDiffListDest" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="myModalLabel">Changement de destinataire des modèles de liste de diffusion</h4>
+            </div>
+            <form (ngSubmit)="onSubmit()" #changeDiffListDestForm="ngForm">
+                <div class="modal-body">
+                    <div class="alert alert-warning" role="alert">
+                        <b>{{this.userDestRedirect.firstname}} {{this.userDestRedirect.lastname}}</b> est en <b>destinataire</b> des modèles liste de difffusion suivante, veuillez choisir un utilisateur de <b>remplacement</b> :
+                    </div>
+                    <div *ngFor="let userDestRedirectModel of userDestRedirectModels" id="{{userDestRedirectModel.object_id}}" class="form-group">
+                        <div class="input-group input-group-sm">
+                            <span class="input-group-addon" id="sizing-addon1"><i class="fa fa-share-alt-square"></i> {{userDestRedirectModel.object_id}} - {{userDestRedirectModel.description}}</span>
+                            <div class="form-group typeahead__container" style="margin-bottom:0px;">
+                                <div class="typeahead__field">
+                                    <input name="redirectDest_{{userDestRedirectModel.object_id}}" [(ngModel)]="userDestRedirectModel.redirectUserId"  type="text" class="form-control redirectDest" placeholder="Utilisateur" autocomplete="off" aria-describedby="sizing-addon1" required>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    
+                </div>
+                <div class="modal-footer">
+                    <button *ngIf="userDestRedirect.mode == 'del'" type="button" class="btn btn-danger" (click)="deleteUserModal(userDestRedirect)" [disabled]="!changeDiffListDestForm.form.valid">{{lang.delete}} {{lang.user}}</button>
+                    <button *ngIf="userDestRedirect.mode == 'up'" type="button" class="btn btn-warning" (click)="suspendUserModal(userDestRedirect)" [disabled]="!changeDiffListDestForm.form.valid">{{lang.suspend}} {{lang.user}}</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
diff --git a/apps/maarch_entreprise/css/users-administration.component.css b/apps/maarch_entreprise/css/users-administration.component.css
index 1e9030fb12316e3059d9dc5d09249d78bd2d5c48..10b1126c69a30a635fd83cd0698b5cd91f856609 100644
--- a/apps/maarch_entreprise/css/users-administration.component.css
+++ b/apps/maarch_entreprise/css/users-administration.component.css
@@ -16,4 +16,33 @@
 nav{
     margin-top:10px !important;
     margin-bottom: 0px !important;
+}
+
+.modal-content{
+    background-color: #009DC5 !important;
+}
+.modal-header h4{
+    color: white !important;
+
+}
+
+.modal-body{
+    background-color: white;
+    padding:10px;
+    max-height: 70vh;
+    overflow: auto;
+
+}
+
+.modal-body .list-group li{
+    /*border-color: #009DC5 !important;*/
+    font-weight: bold;
+}
+
+.modal-footer{
+    background:white;
+}
+
+button:disabled{
+    opacity:0.3 !important;
 }
\ No newline at end of file
diff --git a/apps/maarch_entreprise/js/angular/app/users-administration.component.js b/apps/maarch_entreprise/js/angular/app/users-administration.component.js
index aa4aeb79303cbe0651d8d976f273a689573182cc..8d08cc90884cfc08ab056d1cbbe377f9214fee84 100644
--- a/apps/maarch_entreprise/js/angular/app/users-administration.component.js
+++ b/apps/maarch_entreprise/js/angular/app/users-administration.component.js
@@ -16,6 +16,8 @@ var UsersAdministrationComponent = (function () {
     function UsersAdministrationComponent(http) {
         this.http = http;
         this.users = [];
+        this.userDestRedirect = {};
+        this.userDestRedirectModels = [];
         this.lang = {};
         this.resultInfo = "";
         this.loading = false;
@@ -62,18 +64,76 @@ var UsersAdministrationComponent = (function () {
             }, 0);
             _this.loading = false;
         }, function (err) {
+            console.log(err);
             location.href = "index.php";
         });
     };
     UsersAdministrationComponent.prototype.suspendUser = function (user) {
+        var _this = this;
+        if (user.inDiffListDest == 'Y') {
+            user.mode = 'up';
+            this.userDestRedirect = user;
+            this.http.get(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id')
+                .map(function (res) { return res.json(); })
+                .subscribe(function (data) {
+                _this.userDestRedirectModels = data.listModels;
+                setTimeout(function () {
+                    $j(".redirectDest").typeahead({
+                        order: "asc",
+                        display: "formattedUser",
+                        templateValue: "{{user_id}}",
+                        source: {
+                            ajax: {
+                                type: "GET",
+                                dataType: "json",
+                                url: _this.coreUrl + "rest/users/autocompleter/exclude/" + user.user_id,
+                            }
+                        }
+                    });
+                }, 0);
+            }, function (err) {
+                console.log(err);
+                location.href = "index.php";
+            });
+        }
+        else {
+            var r = confirm(this.lang.suspendMsg + ' ?');
+            if (r) {
+                user.enabled = 'N';
+                this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user)
+                    .map(function (res) { return res.json(); })
+                    .subscribe(function (data) {
+                    if (data.errors) {
+                        user.enabled = 'Y';
+                        _this.resultInfo = data.errors;
+                        $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                            $j("#resultInfo").slideUp(500);
+                        });
+                    }
+                    else {
+                        _this.resultInfo = data.success;
+                        $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                            $j("#resultInfo").slideUp(500);
+                        });
+                    }
+                });
+            }
+        }
+    };
+    UsersAdministrationComponent.prototype.suspendUserModal = function (user) {
         var _this = this;
         var r = confirm(this.lang.suspendMsg + ' ?');
         if (r) {
             user.enabled = 'N';
-            this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user)
+            user.redirectListModels = this.userDestRedirectModels;
+            //first, update listModels
+            this.http.put(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id', user)
                 .map(function (res) { return res.json(); })
                 .subscribe(function (data) {
                 if (data.errors) {
+                    user.enabled = 'Y';
                     _this.resultInfo = data.errors;
                     $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
                     $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
@@ -81,12 +141,41 @@ var UsersAdministrationComponent = (function () {
                     });
                 }
                 else {
-                    _this.resultInfo = data.success;
-                    $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
-                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
-                        $j("#resultInfo").slideUp(500);
+                    //then suspend user
+                    _this.http.put(_this.coreUrl + 'rest/users/' + user.user_id, user)
+                        .map(function (res) { return res.json(); })
+                        .subscribe(function (data) {
+                        if (data.errors) {
+                            user.enabled = 'Y';
+                            _this.resultInfo = data.errors;
+                            $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        }
+                        else {
+                            user.inDiffListDest = 'N';
+                            $j('#changeDiffListDest').modal('hide');
+                            _this.resultInfo = data.success;
+                            $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        }
+                    }, function (err) {
+                        _this.resultInfo = JSON.parse(err._body).errors;
+                        $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                            $j("#resultInfo").slideUp(500);
+                        });
                     });
                 }
+            }, function (err) {
+                _this.resultInfo = JSON.parse(err._body).errors;
+                $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                    $j("#resultInfo").slideUp(500);
+                });
             });
         }
     };
@@ -95,10 +184,11 @@ var UsersAdministrationComponent = (function () {
         var r = confirm(this.lang.authorizeMsg + ' ?');
         if (r) {
             user.enabled = 'Y';
-            this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user)
+            this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user)
                 .map(function (res) { return res.json(); })
                 .subscribe(function (data) {
                 if (data.errors) {
+                    user.enabled = 'N';
                     _this.resultInfo = data.errors;
                     $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
                     $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
@@ -112,14 +202,81 @@ var UsersAdministrationComponent = (function () {
                         $j("#resultInfo").slideUp(500);
                     });
                 }
+            }, function (err) {
+                _this.resultInfo = JSON.parse(err._body).errors;
+                $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                    $j("#resultInfo").slideUp(500);
+                });
+            });
+        }
+    };
+    UsersAdministrationComponent.prototype.deleteUser = function (user) {
+        var _this = this;
+        if (user.inDiffListDest == 'Y') {
+            user.mode = 'del';
+            this.userDestRedirect = user;
+            this.http.get(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id')
+                .map(function (res) { return res.json(); })
+                .subscribe(function (data) {
+                _this.userDestRedirectModels = data.listModels;
+                setTimeout(function () {
+                    $j(".redirectDest").typeahead({
+                        order: "asc",
+                        source: {
+                            ajax: {
+                                type: "GET",
+                                dataType: "json",
+                                url: _this.coreUrl + "rest/users/autocompleter/exclude/" + user.user_id,
+                            }
+                        }
+                    });
+                });
+            }, function (err) {
+                _this.resultInfo = JSON.parse(err._body).errors;
+                $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                    $j("#resultInfo").slideUp(500);
+                });
             });
         }
+        else {
+            var r = confirm(this.lang.deleteMsg + ' ?');
+            if (r) {
+                this.http.delete(this.coreUrl + 'rest/users/' + user.user_id, user)
+                    .map(function (res) { return res.json(); })
+                    .subscribe(function (data) {
+                    if (data.errors) {
+                        _this.resultInfo = data.errors;
+                        $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                            $j("#resultInfo").slideUp(500);
+                        });
+                    }
+                    else {
+                        for (var i = 0; i < _this.users.length; i++) {
+                            if (_this.users[i].user_id == user.user_id) {
+                                _this.users.splice(i, 1);
+                            }
+                        }
+                        _this.table.row($j("#" + user.user_id)).remove().draw();
+                        _this.resultInfo = data.success;
+                        $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                            $j("#resultInfo").slideUp(500);
+                        });
+                    }
+                });
+            }
+        }
     };
-    UsersAdministrationComponent.prototype.deleteUser = function (id) {
+    UsersAdministrationComponent.prototype.deleteUserModal = function (user) {
         var _this = this;
         var r = confirm(this.lang.deleteMsg + ' ?');
         if (r) {
-            this.http.delete(this.coreUrl + 'rest/user/' + id)
+            user.redirectListModels = this.userDestRedirectModels;
+            //first, update listModels
+            this.http.put(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id', user)
                 .map(function (res) { return res.json(); })
                 .subscribe(function (data) {
                 if (data.errors) {
@@ -130,18 +287,40 @@ var UsersAdministrationComponent = (function () {
                     });
                 }
                 else {
-                    for (var i = 0; i < _this.users.length; i++) {
-                        if (_this.users[i].user_id == id) {
-                            _this.users.splice(i, 1);
+                    //then delete user
+                    _this.http.delete(_this.coreUrl + 'rest/users/' + user.user_id)
+                        .map(function (res) { return res.json(); })
+                        .subscribe(function (data) {
+                        if (data.errors) {
+                            _this.resultInfo = data.errors;
+                            $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        }
+                        else {
+                            user.inDiffListDest = 'N';
+                            $j('#changeDiffListDest').modal('hide');
+                            for (var i = 0; i < _this.users.length; i++) {
+                                if (_this.users[i].user_id == user.user_id) {
+                                    _this.users.splice(i, 1);
+                                }
+                            }
+                            _this.table.row($j("#" + user.user_id)).remove().draw();
+                            _this.resultInfo = data.success;
+                            $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                                $j("#resultInfo").slideUp(500);
+                            });
                         }
-                    }
-                    _this.table.row($j("#" + id)).remove().draw();
-                    _this.resultInfo = data.success;
-                    $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
-                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
-                        $j("#resultInfo").slideUp(500);
                     });
                 }
+            }, function (err) {
+                _this.resultInfo = JSON.parse(err._body).errors;
+                $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () {
+                    $j("#resultInfo").slideUp(500);
+                });
             });
         }
     };
diff --git a/apps/maarch_entreprise/js/angular/app/users-administration.component.ts b/apps/maarch_entreprise/js/angular/app/users-administration.component.ts
index dba6242704732f7f250b3af4ef2d3ba2c646507d..0f68d03b3b76d0f8e4d4c3fd35ac5ee608e7896a 100644
--- a/apps/maarch_entreprise/js/angular/app/users-administration.component.ts
+++ b/apps/maarch_entreprise/js/angular/app/users-administration.component.ts
@@ -16,6 +16,9 @@ export class UsersAdministrationComponent implements OnInit {
     coreUrl                     : string;
 
     users                       : any[]     = [];
+    userDestRedirect            : any       = {};
+    userDestRedirectModels      : any[]     = [];
+
     lang                        : any       = {};
     table                       : any
 
@@ -67,38 +70,127 @@ export class UsersAdministrationComponent implements OnInit {
                     $j('dataTables_filter input').addClass('form-control');
                     $j(".datatablesLeft").css({"float":"left"});
                     $j(".datatablesCenter").css({"text-align":"center"});
-                    $j(".datatablesRight").css({"float":"right"});                    
+                    $j(".datatablesRight").css({"float":"right"});      
+
                 }, 0);
 
                 this.loading = false;
             }, (err) => {
+                console.log(err);
                 location.href = "index.php";
             });
     }
 
     suspendUser(user: any) {
+        if(user.inDiffListDest == 'Y') {
+            user.mode = 'up';
+            this.userDestRedirect = user;
+            this.http.get(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id')
+            .map(res => res.json())
+            .subscribe((data) => {
+                this.userDestRedirectModels = data.listModels;
+                setTimeout(() => {
+                    $j(".redirectDest").typeahead({
+                        order: "asc",
+                        display: "formattedUser",
+                        templateValue: "{{user_id}}",
+                        source: {
+                            ajax: {
+                                type: "GET",
+                                dataType: "json",
+                                url: this.coreUrl + "rest/users/autocompleter/exclude/"+user.user_id,
+                            }
+                        }
+                    });
+                }, 0);
+                
+            }, (err) => {
+                console.log(err);
+                location.href = "index.php";
+            });
+
+        }else{
+            let r = confirm(this.lang.suspendMsg+' ?');
+
+            if (r) {
+                user.enabled = 'N';
+                this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user)
+                    .map(res => res.json())
+                    .subscribe((data) => {
+                        if (data.errors) {
+                            user.enabled = 'Y';
+                            this.resultInfo = data.errors;
+                            $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        } else {
+                            this.resultInfo = data.success;
+                            $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        }
+                    });
+            }
+        }
+    }
+
+    suspendUserModal(user: any) {
         let r = confirm(this.lang.suspendMsg+' ?');
 
         if (r) {
             user.enabled = 'N';
-            this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user)
+            user.redirectListModels = this.userDestRedirectModels;
+            //first, update listModels
+            this.http.put(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id', user)
                 .map(res => res.json())
                 .subscribe((data) => {
                     if (data.errors) {
+                        user.enabled = 'Y';
                         this.resultInfo = data.errors;
                         $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
                         $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
                             $j("#resultInfo").slideUp(500);
                         });
                     } else {
-                        this.resultInfo = data.success;
-                        $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
-                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
-                            $j("#resultInfo").slideUp(500);
-                        });
+                        //then suspend user
+                        this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user)
+                            .map(res => res.json())
+                            .subscribe((data) => {
+                                if (data.errors) {
+                                    user.enabled = 'Y';
+                                    this.resultInfo = data.errors;
+                                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                        $j("#resultInfo").slideUp(500);
+                                    });
+                                } else {
+                                    user.inDiffListDest = 'N';
+                                    $j('#changeDiffListDest').modal('hide');
+                                    this.resultInfo = data.success;
+                                    $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                        $j("#resultInfo").slideUp(500);
+                                    });
+                                }
+                            }, (err) => {
+                                    this.resultInfo = JSON.parse(err._body).errors;
+                                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                    $j("#resultInfo").slideUp(500);
+                                });
+                            });
                     }
+                }, (err) => {
+                    this.resultInfo = JSON.parse(err._body).errors;
+                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                    $j("#resultInfo").slideUp(500);
                 });
+            });
         }
+    
     }
 
     activateUser(user: any) {
@@ -106,10 +198,11 @@ export class UsersAdministrationComponent implements OnInit {
 
         if (r) {
             user.enabled = 'Y';
-            this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user)
+            this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user)
                 .map(res => res.json())
                 .subscribe((data) => {
                     if (data.errors) {
+                        user.enabled = 'N';
                         this.resultInfo = data.errors;
                         $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
                         $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
@@ -122,15 +215,85 @@ export class UsersAdministrationComponent implements OnInit {
                             $j("#resultInfo").slideUp(500);
                         });
                     }
+                }, (err) => {
+                    this.resultInfo = JSON.parse(err._body).errors;
+                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                    $j("#resultInfo").slideUp(500);
+                });
+            });
+        }
+    }
+
+    deleteUser(user: any) {
+
+        if(user.inDiffListDest == 'Y') {
+            user.mode = 'del';
+            this.userDestRedirect = user;
+            this.http.get(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id')
+            .map(res => res.json())
+            .subscribe((data) => {
+                this.userDestRedirectModels = data.listModels;
+
+                setTimeout(() => {
+                    $j(".redirectDest").typeahead({
+                        order: "asc",
+                        source: {
+                            ajax: {
+                                type: "GET",
+                                dataType: "json",
+                                url: this.coreUrl + "rest/users/autocompleter/exclude/"+user.user_id,
+                            }
+                        }
+                    });
+                }); 
+                
+            }, (err) => {
+                    this.resultInfo = JSON.parse(err._body).errors;
+                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                    $j("#resultInfo").slideUp(500);
                 });
+            });
+
+        }else{
+            let r = confirm(this.lang.deleteMsg+' ?');
+
+            if (r) {
+                this.http.delete(this.coreUrl + 'rest/users/' + user.user_id, user)
+                    .map(res => res.json())
+                    .subscribe((data) => {
+                        if (data.errors) {
+                            this.resultInfo = data.errors;
+                            $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        } else {
+                            for (var i = 0;i<this.users.length;i++) {
+                                if(this.users[i].user_id == user.user_id){
+                                    this.users.splice(i,1);
+                                }
+                            }
+                            this.table.row($j("#"+user.user_id)).remove().draw();
+                            this.resultInfo = data.success;
+                            $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                            $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                $j("#resultInfo").slideUp(500);
+                            });
+                        }
+                    });
+            }
         }
     }
+    deleteUserModal(user: any) {
 
-    deleteUser(id: string) {
         let r = confirm(this.lang.deleteMsg+' ?');
 
         if (r) {
-            this.http.delete(this.coreUrl + 'rest/user/' + id)
+            user.redirectListModels = this.userDestRedirectModels;
+            //first, update listModels
+            this.http.put(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id', user)
                 .map(res => res.json())
                 .subscribe((data) => {
                     if (data.errors) {
@@ -140,19 +303,42 @@ export class UsersAdministrationComponent implements OnInit {
                             $j("#resultInfo").slideUp(500);
                         });
                     } else {
-                        for(var i = 0;i<this.users.length;i++){
-                            if(this.users[i].user_id == id){
-                                this.users.splice(i,1);
-                            }
-                        }
-                        this.table.row($j("#"+id)).remove().draw();
-                        this.resultInfo = data.success;
-                        $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
-                        $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
-                            $j("#resultInfo").slideUp(500);
-                        });
+                        //then delete user
+                        this.http.delete(this.coreUrl + 'rest/users/' + user.user_id)
+                            .map(res => res.json())
+                            .subscribe((data) => {
+                                if (data.errors) {
+                                    this.resultInfo = data.errors;
+                                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                        $j("#resultInfo").slideUp(500);
+                                    });
+                                } else {
+                                    user.inDiffListDest = 'N';
+                                    $j('#changeDiffListDest').modal('hide');
+                                    for (var i = 0;i<this.users.length;i++) {
+                                        if(this.users[i].user_id == user.user_id){
+                                            this.users.splice(i,1);
+                                        }
+                                    }
+                                    this.table.row($j("#"+user.user_id)).remove().draw();
+
+                                    this.resultInfo = data.success;
+                                    $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible');
+                                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                                        $j("#resultInfo").slideUp(500);
+                                    });
+                                }
+                            });
                     }
+                }, (err) => {
+                    this.resultInfo = JSON.parse(err._body).errors;
+                    $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible');
+                    $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){
+                    $j("#resultInfo").slideUp(500);
                 });
+            });
         }
+    
     }
 }
diff --git a/apps/maarch_entreprise/lang/fr.php b/apps/maarch_entreprise/lang/fr.php
index d861c65ae068273c3b8ee30737b6ce4795e8e0ec..d73660aa0aa0cd48a9620837f046927b63dbc773 100755
--- a/apps/maarch_entreprise/lang/fr.php
+++ b/apps/maarch_entreprise/lang/fr.php
@@ -204,7 +204,8 @@ if (!defined("_REALLY_DELETE")) define("_REALLY_DELETE", "Voulez-vous vraiment s
 if (!defined("_REALLY_CONTINUE")) define("_REALLY_CONTINUE", "Voulez-vous vraiment continuer ");
 if (!defined("_DEFINITIVE_ACTION")) define("_DEFINITIVE_ACTION", "Cette action est définitive");
 if (!defined("_AND")) define("_AND", " et ");
-if (!defined("_PLEASE_CHECK_LISTDIFF")) define("_PLEASE_CHECK_LISTDIFF", " est dans une ou des listes de diffusion. Veuillez le remplacer dans la ou les listes de ");
+//if (!defined("_PLEASE_CHECK_LISTDIFF")) define("_PLEASE_CHECK_LISTDIFF", " est dans une ou des listes de diffusion. Veuillez le remplacer dans la ou les listes de ");
+if (!defined("_PLEASE_CHECK_LISTDIFF")) define("_PLEASE_CHECK_LISTDIFF", "L'utilisateur est présent en tant que destinataire d'un ou plusieurs modèle(s) de liste de diffusion, veuillez le remplacer par un autre utilisateur.");
 if (!defined("_THE_USER_JS")) define("_THE_USER_JS", "L\'utilisateur ");
 
 
diff --git a/core/Controllers/UserController.php b/core/Controllers/UserController.php
index dd8c2e6eb64619bb5b0867dc587f6d5933bfa954..54c4ad6e91b5b478b4392babb05864f208c9a0f3 100644
--- a/core/Controllers/UserController.php
+++ b/core/Controllers/UserController.php
@@ -24,6 +24,7 @@ use Psr\Http\Message\RequestInterface;
 use Psr\Http\Message\ResponseInterface;
 use Respect\Validation\Validator;
 use Core\Models\UserModel;
+use Entities\Models\ListModelsModel;
 
 include_once 'core/class/docservers_controler.php';
 include_once 'core/class/class_history.php';
@@ -102,6 +103,49 @@ class UserController
 
         return $response->withJson(['success' => _DELETED_USER]);
     }
+    
+    public function suspendUser(RequestInterface $request, ResponseInterface $response, $aArgs)
+    {
+        if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $_SESSION['user']['UserId'], 'location' => 'apps', 'type' => 'admin'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
+        }
+        if ($_SESSION['user']['UserId'] != 'superadmin') {
+            $entities = EntitiesModel::getAllEntitiesByUserId(['userId' => $_SESSION['user']['UserId']]);
+            $users = UserModel::getByEntities([
+                'select'    => ['users.user_id'],
+                'entities'  => $entities
+            ]);
+            $allowed = false;
+            foreach ($users as $value) {
+                if ($value['user_id'] == $aArgs['userId']) {
+                    $allowed = true;
+                }
+            }
+            if (!$allowed) {
+                return $response->withStatus(403)->withJson(['errors' => 'UserId out of perimeter']);
+            }
+        } else {
+            $user = UserModel::getById(['userId' => $aArgs['userId']]);
+            if (empty($user)) {
+                return $response->withStatus(400)->withJson(['errors' => 'User not found']);
+            }
+        }
+        $data = $request->getParams();
+        if (!$this->checkNeededParameters(['data' => $data, 'needed' => ['firstname', 'lastname']])
+            || (!empty($data['mail']) && !filter_var($data['mail'], FILTER_VALIDATE_EMAIL))
+            || (!empty($data['phone']) && !preg_match("/^(?:0|\+\d\d\s?)[1-9]([\.\-\s]?\d\d){4}$/", $data['phone']))) {
+            return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
+        }
+
+        //update user
+        $r = UserModel::update(['userId' => $aArgs['userId'], 'user' => $data]);
+
+        if (!$r) {
+            return $response->withStatus(500)->withJson(['errors' => 'User Update Error']);
+        }
+
+        return $response->withJson(['success' => _USER_UPDATED]);
+    }
 
     public function updateProfile(RequestInterface $request, ResponseInterface $response)
     {
@@ -408,6 +452,22 @@ class UserController
         return $response->withJson($users);
     }
 
+    public function getUsersForAutocompletionWithExclusion(RequestInterface $request, ResponseInterface $response, $aArgs)
+    {
+        $excludeUsers = ['superadmin',$aArgs['userId']];
+        $users = UserModel::get([
+            'select'    => ['user_id', 'firstname', 'lastname'],
+            'where'     => ['enabled = ?', 'status != ?', 'user_id not in (?)'],
+            'data'      => ['Y', 'DEL', $excludeUsers]
+        ]);
+
+        foreach ($users as $key => $value) {
+            $users[$key]['formattedUser'] = "{$value['firstname']} {$value['lastname']} ({$value['user_id']})";
+        }
+
+        return $response->withJson($users);
+    }
+
     public function getUsersForAdministration(RequestInterface $request, ResponseInterface $response)
     {
         if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $_SESSION['user']['UserId'], 'location' => 'apps', 'type' => 'admin'])) {
@@ -426,6 +486,28 @@ class UserController
                 'entities'  => $entities
             ]);
         }
+
+        $usersId = [];
+        foreach ($users as $value) {
+            $usersId[] = $value['user_id'];
+        }
+
+        $listModels = ListModelsModel::getDiffListByUsersId(['select' => 'item_id', 'users_id' => $usersId, 'object_type' => 'entity_id', 'item_mode' => 'dest']); 
+        
+        $usersListModels = [];
+        foreach ($listModels as $value) {
+            $usersListModels[] = $value['item_id'];
+        }
+        
+        foreach ($users as $key => $value) {
+
+            if (in_array($value['user_id'], $usersListModels)) {
+                $users[$key]['inDiffListDest'] = 'Y';
+            } else {
+                $users[$key]['inDiffListDest'] = 'N';
+            }
+        }
+
         $return['lang'] = LangModel::getUsersForAdministrationLang();
         $return['users'] = $users;        
         return $response->withJson($return);
diff --git a/core/Models/LangModelAbstract.php b/core/Models/LangModelAbstract.php
index e54e8dd0eaa5f7e4911a171c032ea7e981bda432..4a8e7cc5dd15151dcfd1da45b8d06d9e67e4b86c 100644
--- a/core/Models/LangModelAbstract.php
+++ b/core/Models/LangModelAbstract.php
@@ -189,6 +189,7 @@ class LangModelAbstract
             'absent'                => _MISSING,
             'edit'                  => _MODIFY,
             'suspend'               => _SUSPEND,
+            'authorize'             => _AUTHORIZE,
             'delete'                => _DELETE,
             'users'                 => _USERS,
             'admin'                 => _ADMIN,
@@ -200,7 +201,9 @@ class LangModelAbstract
             'search'                => _SEARCH,
             'deleteMsg'             => _REALLY_DELETE,
             'suspendMsg'            => _REALLY_SUSPEND,
-            'authorizeMsg'          => _REALLY_AUTHORIZE
+            'authorizeMsg'          => _REALLY_AUTHORIZE,
+            'checkListDiffMsg'      => _PLEASE_CHECK_LISTDIFF,
+            'user'                  => _USER
         ];
 
         return $aLang;
diff --git a/modules/entities/Controllers/ListModelsController.php b/modules/entities/Controllers/ListModelsController.php
new file mode 100644
index 0000000000000000000000000000000000000000..c78e693eaf5d77b97da14f289e7635f052ec27b9
--- /dev/null
+++ b/modules/entities/Controllers/ListModelsController.php
@@ -0,0 +1,53 @@
+<?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 Resource Controller
+* @author dev@maarch.org
+* @ingroup core
+*/
+
+namespace Entities\Controllers;
+
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Respect\Validation\Validator;
+use Entities\Models\ListModelsModel;
+use Core\Models\UserModel;
+
+
+class ListModelsController
+{
+
+    public function getListModelsDiffListDestByUserId(RequestInterface $request, ResponseInterface $response, $aArgs)
+    {
+        $return['listModels'] = ListModelsModel::getDiffListByUserId(['select' => ['object_id','description'], 'itemId' => $aArgs['itemId'],'objectType' => $aArgs['objectType'],'itemMode' => $aArgs['itemMode']]);
+
+        return $response->withJson($return);
+    }
+
+    public function updateListModelsDiffListDestByUserId(RequestInterface $request, ResponseInterface $response, $aArgs)
+    {
+        $data = $request->getParams();
+
+        foreach ($data['redirectListModels'] as $listModel) {
+            $user = UserModel::getById(['userId' => $listModel['redirectUserId']]);
+            $userId = $listModel['redirectUserId'];
+            if (empty($user)) {
+                return $response->withStatus(404)->withJson(['errors' => "User « $userId » not found"]);
+            }
+
+            $r = ListModelsModel::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']]);
+            if (!$r) {
+                return $response->withStatus(500)->withJson(['errors' => 'ListModels Update Error']);
+            }
+        }
+        return $response->withJson(['success' => 'ListModels Updated']);
+    }
+}
diff --git a/modules/entities/Models/ListModelsModel.php b/modules/entities/Models/ListModelsModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..69cc1d054263328850e73b89c888be5bf007ed27
--- /dev/null
+++ b/modules/entities/Models/ListModelsModel.php
@@ -0,0 +1,17 @@
+<?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   ListModelsModel
+* @author  dev <dev@maarch.org>
+* @ingroup core
+*/
+
+namespace Entities\Models;
+
+class ListModelsModel extends ListModelsModelAbstract
+{
+    // Do your stuff in this class
+}
diff --git a/modules/entities/Models/ListModelsModelAbstract.php b/modules/entities/Models/ListModelsModelAbstract.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3505bc0ba2a201c5cae11b286403ca2e0b14bd7
--- /dev/null
+++ b/modules/entities/Models/ListModelsModelAbstract.php
@@ -0,0 +1,71 @@
+<?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   ListModelsModelAbstract
+* @author  dev <dev@maarch.org>
+* @ingroup core
+*/
+
+namespace Entities\Models;
+
+require_once 'apps/maarch_entreprise/services/Table.php';
+
+class ListModelsModelAbstract extends \Apps_Table_Service
+{
+    public static function update(array $aArgs = [])
+    {
+        static::checkRequired($aArgs, ['set', 'where', 'data']);
+        static::checkArray($aArgs, ['set', 'where', 'data']);
+
+        $aReturn = parent::update([
+            'table'     => 'listmodels',
+            'set'       => $aArgs['set'],
+            'where'     => $aArgs['where'],
+            'data'      => $aArgs['data']
+        ]);
+        return $aReturn;
+    }
+
+    public static function getDiffListByUsersId(array $aArgs = [])
+    {
+        static::checkRequired($aArgs, ['users_id']);
+        static::checkRequired($aArgs, ['object_type']);
+        static::checkRequired($aArgs, ['item_mode']);
+
+        static::checkArray($aArgs, ['users_id']);
+        static::checkString($aArgs, ['object_type']);
+        static::checkString($aArgs, ['item_mode']);
+
+        $aReturn = static::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => ['listmodels'],
+            'where'     => ['item_id in (?)', 'object_type = ?', 'item_mode = ?'],
+            'data'      => [$aArgs['users_id'], $aArgs['object_type'], $aArgs['item_mode']],
+        ]);
+
+        return $aReturn;
+    }
+
+    public static function getDiffListByUserId(array $aArgs = [])
+    {
+        static::checkRequired($aArgs, ['itemId']);
+        static::checkRequired($aArgs, ['objectType']);
+        static::checkRequired($aArgs, ['itemMode']);
+
+        static::checkString($aArgs, ['itemId']);
+        static::checkString($aArgs, ['objectType']);
+        static::checkString($aArgs, ['itemMode']);
+
+        $aReturn = static::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => ['listmodels'],
+            'where'     => ['item_id = ?', 'object_type = ?', 'item_mode = ?'],
+            'data'      => [$aArgs['itemId'], $aArgs['objectType'], $aArgs['itemMode']],
+        ]);
+
+        return $aReturn;
+    }
+}
diff --git a/rest/index.php b/rest/index.php
index 5f969f272d101289518713945548760529f50bab..a91c109e65b95bcf45a1de9a35aa7d41b4fedde8 100644
--- a/rest/index.php
+++ b/rest/index.php
@@ -125,6 +125,10 @@ $app->get('/attachments', \Attachments\Controllers\AttachmentsController::class
 $app->get('/attachments/{id}', \Attachments\Controllers\AttachmentsController::class . ':getById');
 $app->post('/attachments', \Attachments\Controllers\AttachmentsController::class . ':create');
 
+//ListModels
+$app->get('/listModels/itemId/{itemId}/itemMode/{itemMode}/objectType/{objectType}', \Entities\Controllers\ListModelsController::class . ':getListModelsDiffListDestByUserId');
+$app->put('/listModels/itemId/{itemId}/itemMode/{itemMode}/objectType/{objectType}', \Entities\Controllers\ListModelsController::class . ':updateListModelsDiffListDestByUserId');
+
 //Visa
 $app->get('/{basketId}/signatureBook/resList', \Visa\Controllers\VisaController::class . ':getResList');
 $app->get('/{basketId}/signatureBook/resList/details', \Visa\Controllers\VisaController::class . ':getDetailledResList');
@@ -144,10 +148,11 @@ $app->post('/resExt', \Core\Controllers\ResExtController::class . ':create');
 
 //Users
 $app->get('/users/autocompleter', \Core\Controllers\UserController::class . ':getUsersForAutocompletion');
+$app->get('/users/autocompleter/exclude/{userId}', \Core\Controllers\UserController::class . ':getUsersForAutocompletionWithExclusion');
 $app->get('/users/profile', \Core\Controllers\UserController::class . ':getCurrentUserInfos');
 $app->put('/users/profile', \Core\Controllers\UserController::class . ':updateProfile');
 $app->put('/users/{userId}', \Core\Controllers\UserController::class . ':update');
-$app->delete('/user/{userId}', \Core\Controllers\UserController::class . ':delete');
+$app->delete('/users/{userId}', \Core\Controllers\UserController::class . ':delete');
 $app->post('/users/{userId}/groups/{groupId}', \Core\Controllers\UserController::class . ':addGroup');
 $app->put('/users/{userId}/groups/{groupId}', \Core\Controllers\UserController::class . ':updateGroup');
 $app->delete('/users/{userId}/groups/{groupId}', \Core\Controllers\UserController::class . ':deleteGroup');