diff --git a/src/app/resource/controllers/ExportController.php b/src/app/resource/controllers/ExportController.php
index 2b91e6e228d100d1e8cf48ea9b763d2cff338c95..cb79443789c0027908d8b5872d716e6209c3c704 100644
--- a/src/app/resource/controllers/ExportController.php
+++ b/src/app/resource/controllers/ExportController.php
@@ -317,6 +317,7 @@ class ExportController
             $content = [];
             foreach ($aArgs['data'] as $value) {
                 if (empty($value['value'])) {
+                    $content[] = '';
                     continue;
                 }
                 if ($value['isFunction']) {
diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index d39585e5d7922a8ec1c5da5fbb392d61631d639a..be48cec20fa4e0373948544239eeac07b692d710 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -77,6 +77,15 @@ class ResController
             return $response->withStatus(500)->withJson(['errors' => '[ResController create] ' . $resId['errors']]);
         }
 
+        HistoryController::add([
+            'tableName' => 'res_letterbox',
+            'recordId'  => $resId,
+            'eventType' => 'ADD',
+            'info'      => _DOC_ADDED,
+            'moduleId'  => 'res',
+            'eventId'   => 'resadd',
+        ]);
+
         return $response->withJson(['resId' => $resId]);
     }
 
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 3eceb38d854f88c345c46aece0d839b52fe60553..9d9bd2b2d00b5a4e229f4f3bd8f4a67692294b35 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -78,33 +78,6 @@ class UserController
             $usersIds[] = $value['user_id'];
         }
 
-        $listModels = ListTemplateModel::get(['select' => ['item_id'], 'where' => ['item_id in (?)', 'object_type = ?', 'item_mode = ?'], 'data' => [$usersIds, 'entity_id', 'dest']]);
-        $listInstances = ListInstanceModel::get(['select' => ['item_id'], 'where' => ['item_id in (?)', 'item_mode = ?'], 'data' => [$usersIds, 'dest'], 'groupBy' => ['item_id']]);
-
-        $usersListModels = [];
-        foreach ($listModels as $value) {
-            $usersListModels[] = $value['item_id'];
-        }
-
-        $usersListInstances = [];
-        foreach ($listInstances as $value) {
-            $usersListInstances[] = $value['item_id'];
-        }
-
-        foreach ($users as $key => $value) {
-            if (in_array($value['user_id'], $usersListModels)) {
-                $users[$key]['inDiffListDest'] = true;
-            } else {
-                $users[$key]['inDiffListDest'] = false;
-            }
-
-            if (in_array($value['user_id'], $usersListInstances)) {
-                $users[$key]['isResDestUser'] = true;
-            } else {
-                $users[$key]['isResDestUser'] = false;
-            }
-        }
-
         $quota = [];
         $userQuota = ParameterModel::getById(['id' => 'user_quota', 'select' => ['param_value_int']]);
         if (!empty($userQuota['param_value_int'])) {
@@ -169,8 +142,13 @@ class UserController
 
         if (!empty($existingUser) && $existingUser['status'] == 'DEL') {
             UserModel::updateStatus(['id' => $existingUser['id'], 'status' => 'OK']);
-            $data['enabled'] = 'Y';
-            UserModel::update(['id' => $existingUser['id'], 'user' => $data]);
+            UserModel::update([
+                'set'   => [
+                    'enabled'   => 'Y'
+                ],
+                'where' => ['id = ?'],
+                'data'  => [$existingUser['id']]
+            ]);
 
             return $response->withJson(['user' => $existingUser]);
         } elseif (!empty($existingUser)) {
@@ -217,8 +195,7 @@ class UserController
 
         $data = $request->getParams();
 
-        $check = Validator::stringType()->notEmpty()->validate($data['user_id']);
-        $check = $check && Validator::stringType()->notEmpty()->validate($data['firstname']);
+        $check = Validator::stringType()->notEmpty()->validate($data['firstname']);
         $check = $check && Validator::stringType()->notEmpty()->validate($data['lastname']);
         $check = $check && (empty($data['mail']) || filter_var($data['mail'], FILTER_VALIDATE_EMAIL));
         $check = $check && (empty($data['phone']) || preg_match("/\+?((|\ |\.|\(|\)|\-)?(\d)*)*\d$/", $data['phone']));
@@ -226,15 +203,32 @@ class UserController
             return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
         }
 
-        $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['enabled']]);
+        $set = [
+            'firstname' => $data['firstname'],
+            'lastname'  => $data['lastname'],
+            'mail'      => $data['mail'],
+            'phone'     => $data['phone'],
+            'initials'  => $data['initials'],
+            'loginmode' => empty($data['loginmode']) ? 'standard' : $data['loginmode'],
+        ];
+        if (!empty($data['enabled']) && $data['enabled'] == 'Y') {
+            $set['enabled'] = 'Y';
+        }
 
-        UserModel::update(['id' => $aArgs['id'], 'user' => $data]);
+        UserModel::update([
+            'set'   => $set,
+            'where' => ['id = ?'],
+            'data'  => [$aArgs['id']]
+        ]);
 
         $userQuota = ParameterModel::getById(['id' => 'user_quota', 'select' => ['param_value_int']]);
-        if (!empty($userQuota['param_value_int']) && $user['enabled'] == 'N' && $data['enabled'] == 'Y') {
-            $activeUser = UserModel::get(['select' => ['count(1)'], 'where' => ['enabled = ?', 'status = ?', 'user_id <> ?'], 'data' => ['Y', 'OK','superadmin']]);
-            if ($activeUser[0]['count'] > $userQuota['param_value_int']) {
-                NotificationsEventsController::fillEventStack(['eventId' => 'user_quota', 'tableName' => 'users', 'recordId' => 'quota_exceed', 'userId' => 'superadmin', 'info' => _QUOTA_EXCEEDED]);
+        if (!empty($userQuota['param_value_int'])) {
+            $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['enabled']]);
+            if ($user['enabled'] == 'N' && $data['enabled'] == 'Y') {
+                $activeUser = UserModel::get(['select' => ['count(1)'], 'where' => ['enabled = ?', 'status = ?', 'user_id != ?'], 'data' => ['Y', 'OK', 'superadmin']]);
+                if ($activeUser[0]['count'] > $userQuota['param_value_int']) {
+                    NotificationsEventsController::fillEventStack(['eventId' => 'user_quota', 'tableName' => 'users', 'recordId' => 'quota_exceed', 'userId' => 'superadmin', 'info' => _QUOTA_EXCEEDED]);
+                }
             }
         }
 
@@ -243,10 +237,10 @@ class UserController
             'recordId'     => $GLOBALS['userId'],
             'eventType'    => 'UP',
             'eventId'      => 'userModification',
-            'info'         => _USER_UPDATED . " {$data['user_id']}"
+            'info'         => _USER_UPDATED . " {$data['firstname']} {$data['lastname']}"
         ]);
 
-        return $response->withJson(['success' => 'success']);
+        return $response->withStatus(204);
     }
 
     public function isDeletable(Request $request, Response $response, array $aArgs)
@@ -320,6 +314,65 @@ class UserController
         return $response->withJson(['isDeletable' => true, 'listTemplates' => $listTemplates, 'listInstances' => $listInstances]);
     }
 
+    public function suspend(Request $request, Response $response, array $aArgs)
+    {
+        $error = $this->hasUsersRights(['id' => $aArgs['id'], 'delete' => true, 'himself' => true]);
+        if (!empty($error['error'])) {
+            return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]);
+        }
+
+        $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['firstname', 'lastname', 'user_id']]);
+
+        $listInstances = ListInstanceModel::get([
+            'select'    => [1],
+            'where'     => ['item_id = ?', 'difflist_type = ?', 'item_type = ?', 'item_mode = ?'],
+            'data'      => [$user['user_id'], 'entity_id', 'user_id', 'dest']
+        ]);
+        if (!empty($listInstances)) {
+            return $response->withStatus(403)->withJson(['errors' => 'User is still present in listInstances']);
+        }
+
+        $listTemplates = ListTemplateModel::get([
+            'select'    => [1],
+            'where'     => ['item_id = ?', 'object_type = ?', 'item_type = ?', 'item_mode = ?'],
+            'data'      => [$user['user_id'], 'entity_id', 'user_id', 'dest']
+        ]);
+        if (!empty($listTemplates)) {
+            return $response->withStatus(403)->withJson(['errors' => 'User is still present in listTemplates']);
+        }
+
+        ListInstanceModel::delete([
+            'where' => ['item_id = ?', 'difflist_type = ?', 'item_type = ?'],
+            'data'  => [$user['user_id'], 'entity_id', 'user_id']
+        ]);
+        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']]
+        ]);
+
+        UserModel::update([
+            'set'   => [
+                'enabled'   => 'N'
+            ],
+            'where' => ['id = ?'],
+            'data'  => [$aArgs['id']]
+        ]);
+
+        HistoryController::add([
+            'tableName'    => 'users',
+            'recordId'     => $GLOBALS['userId'],
+            'eventType'    => 'DEL',
+            'eventId'      => 'userSuppression',
+            'info'         => _USER_SUSPENDED . " {$user['firstname']} {$user['lastname']}"
+        ]);
+
+        return $response->withStatus(204);
+    }
+
     public function delete(Request $request, Response $response, array $aArgs)
     {
         $error = $this->hasUsersRights(['id' => $aArgs['id'], 'delete' => true, 'himself' => true]);
@@ -370,7 +423,7 @@ class UserController
             'info'         => _USER_DELETED . " {$user['firstname']} {$user['lastname']}"
         ]);
 
-        return $response->withJson(['success' => 'success']);
+        return $response->withStatus(204);
     }
 
     public function getProfile(Request $request, Response $response)
@@ -397,7 +450,7 @@ class UserController
 
     public function updateProfile(Request $request, Response $response)
     {
-        $user = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id', 'enabled']]);
+        $user = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
 
         $data = $request->getParams();
 
@@ -408,9 +461,18 @@ class UserController
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
         }
-        $data['enabled'] = $user['enabled'];
 
-        UserModel::update(['id' => $user['id'], 'user' => $data]);
+        UserModel::update([
+            'set'   => [
+                'firstname' => $data['firstname'],
+                'lastname'  => $data['lastname'],
+                'mail'      => $data['mail'],
+                'phone'     => $data['phone'],
+                'initials'  => $data['initials']
+            ],
+            'where' => ['id = ?'],
+            'data'  => [$user['id']]
+        ]);
 
         return $response->withJson(['success' => 'success']);
     }
@@ -478,10 +540,11 @@ class UserController
                 return $response->withStatus(400)->withJson(['errors' => 'User not found']);
             }
 
-            $check = RedirectBasketModel::get([ 'select' => [1],
-                                                'where'  => [ 'actual_user_id = ?', 'owner_user_id = ?', 'basket_id = ?', 'group_id = ?' ],
-                                                'data'   => [ $value['actual_user_id'], $aArgs['id'], $value['basket_id'], $value['group_id'] ]
-                                            ]);
+            $check = RedirectBasketModel::get([
+                'select' => [1],
+                'where'  => ['actual_user_id = ?', 'owner_user_id = ?', 'basket_id = ?', 'group_id = ?'],
+                'data'   => [$value['actual_user_id'], $aArgs['id'], $value['basket_id'], $value['group_id']]
+            ]);
             if (!empty($check)) {
                 DatabaseModel::rollbackTransaction();
                 return $response->withStatus(400)->withJson(['errors' => 'Redirection already exist']);
diff --git a/src/app/user/models/UserModelAbstract.php b/src/app/user/models/UserModelAbstract.php
index bbe92ca6be8066b8450c2568fd4a491f37850466..79eb53f9ed056b9ceaa6502906fd5a84f407fd99 100755
--- a/src/app/user/models/UserModelAbstract.php
+++ b/src/app/user/models/UserModelAbstract.php
@@ -88,25 +88,14 @@ abstract class UserModelAbstract
 
     public static function update(array $aArgs)
     {
-        ValidatorModel::notEmpty($aArgs, ['id', 'user']);
-        ValidatorModel::notEmpty($aArgs['user'], ['firstname', 'lastname']);
-        ValidatorModel::intVal($aArgs, ['id']);
-        ValidatorModel::stringType($aArgs['user'], ['firstname', 'lastname', 'mail', 'initials', 'thumbprint', 'phone', 'enabled', 'loginmode']);
+        ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
 
         DatabaseModel::update([
-            'table'     => 'users',
-            'set'       => [
-                'firstname'     => $aArgs['user']['firstname'],
-                'lastname'      => $aArgs['user']['lastname'],
-                'mail'          => $aArgs['user']['mail'],
-                'phone'         => $aArgs['user']['phone'],
-                'initials'      => $aArgs['user']['initials'],
-                'enabled'       => $aArgs['user']['enabled'],
-                'thumbprint'    => $aArgs['user']['thumbprint'],
-                'loginmode'     => empty($aArgs['user']['loginmode']) ? 'standard' : $aArgs['user']['loginmode'],
-            ],
-            'where'     => ['id = ?'],
-            'data'      => [$aArgs['id']]
+            'table' => 'users',
+            'set'   => $aArgs['set'],
+            'where' => $aArgs['where'],
+            'data'  => $aArgs['data']
         ]);
 
         return true;
diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php
index 385f2bb553a30919e791cb37d3c0435242c0d69e..2afc27a87c6781f026a96c87df3576e987ef8beb 100755
--- a/src/core/lang/lang-en.php
+++ b/src/core/lang/lang-en.php
@@ -91,6 +91,7 @@ define('_UPDATE_STATUS', 'Status update');
 define('_USER_ID_ALREADY_EXISTS', 'The user id already exists');
 define('_USER_CREATED', 'User added');
 define('_USER_UPDATED', 'User updated');
+define('_USER_SUSPENDED', 'User suspended');
 define('_USER_DELETED', 'User deleted');
 define('_USER_GROUP_CREATION', 'Group added for user');
 define('_USER_GROUP_MODIFICATION', 'Group updated for user');
diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php
index 0616193db163ade71ef7b72fc1459534b6239441..1cea9bab0182fff63cce94ae88286fbb0e01a074 100755
--- a/src/core/lang/lang-fr.php
+++ b/src/core/lang/lang-fr.php
@@ -91,6 +91,7 @@ define('_UPDATE_STATUS', 'Modification du statut');
 define('_USER_ID_ALREADY_EXISTS', 'L\'identifiant utilisateur existe déjà');
 define('_USER_CREATED', 'Utilisateur ajouté');
 define('_USER_UPDATED', 'Utilisateur modifié');
+define('_USER_SUSPENDED', 'Utilisateur suspendu');
 define('_USER_DELETED', 'Utilisateur supprimé');
 define('_USER_GROUP_CREATION', 'Groupe ajouté pour utilisateur');
 define('_USER_GROUP_MODIFICATION', 'Groupe modifié pour utilisateur');
diff --git a/src/core/lang/lang-nl.php b/src/core/lang/lang-nl.php
index 2be9be43468385d2626897e9bd30e26420706331..53513cf6d783b775d1d15b8a26238759f6c2e5a6 100644
--- a/src/core/lang/lang-nl.php
+++ b/src/core/lang/lang-nl.php
@@ -74,6 +74,7 @@ define('_UPDATE_STATUS', 'Wijziging van status');
 define('_USER_ID_ALREADY_EXISTS', 'De gebruikersnaam van de gebruiker bestaat reeds');
 define('_USER_CREATED', 'Toegevoegde gebruiker');
 define('_USER_UPDATED', 'Gewijzigde gebruiker');
+define('_USER_SUSPENDED', 'Utilisateur suspendu TO TRANSLATE');
 define('_USER_DELETED', 'Verwijderde gebruiker');
 define('_USER_GROUP_CREATION', 'Toegevoegde groep voor gebruiker');
 define('_USER_GROUP_MODIFICATION', 'Gewijzigde groep voor gebruiker');