diff --git a/src/app/versionUpdate/controllers/VersionUpdateController.php b/src/app/versionUpdate/controllers/VersionUpdateController.php
index 167979391214a523b61da6ba5cc5f50e033e247b..1dd8310165140f347575910622de949e44f50fc6 100755
--- a/src/app/versionUpdate/controllers/VersionUpdateController.php
+++ b/src/app/versionUpdate/controllers/VersionUpdateController.php
@@ -14,15 +14,19 @@
 
 namespace VersionUpdate\controllers;
 
+use Docserver\models\DocserverModel;
 use Gitlab\Client;
 use Group\controllers\PrivilegeController;
 use Slim\Http\Request;
 use Slim\Http\Response;
 use SrcCore\models\CoreConfigModel;
 use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
 
 class VersionUpdateController
 {
+    const BACKUP_TABLES = ['usergroups_services', 'groupbasket'];
+
     public function get(Request $request, Response $response)
     {
         if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_update_control', 'userId' => $GLOBALS['id']])) {
@@ -153,7 +157,6 @@ class VersionUpdateController
 
         $output = [];
         exec('git status --porcelain --untracked-files=no 2>&1', $output);
-
         if (!empty($output)) {
             return $response->withStatus(400)->withJson(['errors' => 'Some files are modified. Can not update application', 'lang' => 'canNotUpdateApplication']);
         }
@@ -164,16 +167,17 @@ class VersionUpdateController
         $sqlFiles = [];
         while ($currentVersionTag <= (int)$minorVersions[2]) {
             if (is_file("migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql")) {
+                if (!is_readable("migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql")) {
+                    return $response->withStatus(400)->withJson(['errors' => "File migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql is not readable"]);
+                }
                 $sqlFiles[] = "migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql";
             }
             $currentVersionTag++;
         }
 
-        if (!empty($sqlFiles)) {
-            foreach ($sqlFiles as $sqlFile) {
-                $fileContent = file_get_contents($sqlFile);
-                DatabaseModel::exec($fileContent);
-            }
+        $control = VersionUpdateController::executeSQLUpdate(['sqlFiles' => $sqlFiles]);
+        if (!empty($control['errors'])) {
+            return $response->withStatus(400)->withJson(['errors' => $control['errors']]);
         }
 
         $output = [];
@@ -181,12 +185,53 @@ class VersionUpdateController
         exec("git checkout {$minorVersion} 2>&1", $output, $returnCode);
 
         $log = "Application update from {$currentVersion} to {$minorVersion}\nCheckout response {$returnCode} => " . implode(' ', $output) . "\n";
-        file_put_contents('updateVersion.log', $log, FILE_APPEND);
+        file_put_contents("{$control['directoryPath']}/updateVersion.log", $log, FILE_APPEND);
 
         if ($returnCode != 0) {
-            return $response->withStatus(400)->withJson(['errors' => 'Application update failed. Please check updateVersion.log at root application']);
+            return $response->withStatus(400)->withJson(['errors' => "Application update failed. Please check updateVersion.log at {$control['directoryPath']}"]);
         }
 
         return $response->withStatus(204);
     }
+
+    private static function executeSQLUpdate(array $args)
+    {
+        ValidatorModel::arrayType($args, ['sqlFiles']);
+
+        $docserver = DocserverModel::getCurrentDocserver(['typeId' => 'DOC', 'collId' => 'letterbox_coll', 'select' => ['path_template']]);
+        $directoryPath = explode('/', rtrim($docserver['path_template'], '/'));
+        array_pop($directoryPath);
+        $directoryPath = implode('/', $directoryPath);
+
+        if (!is_dir($directoryPath . '/migration')) {
+            if (!is_writable($directoryPath)) {
+                return ['errors' => 'Directory path is not writable : ' . $directoryPath];
+            }
+            mkdir($directoryPath . '/migration', 0755, true);
+        } elseif (!is_writable($directoryPath . '/migration')) {
+            return ['errors' => 'Directory path is not writable : ' . $directoryPath . '/migration'];
+        }
+
+        if (!empty($args['sqlFiles'])) {
+            $config = CoreConfigModel::getJsonLoaded(['path' => 'apps/maarch_entreprise/xml/config.json']);
+
+            $actualTime = date("dmY-His");
+            $tablesToSave = '';
+            foreach (self::BACKUP_TABLES as $table) {
+                $tablesToSave .= ' -t ' . $table;
+            }
+
+            $execReturn = exec("pg_dump -d \"{$config['database'][0]['name']}\" {$tablesToSave} -a > \"{$directoryPath}/migration/backupDB_maarchcourrier_{$actualTime}.sql\"", $output, $intReturn);
+            if (!empty($execReturn)) {
+                return ['errors' => 'Pg dump failed : ' . $execReturn];
+            }
+
+            foreach ($args['sqlFiles'] as $sqlFile) {
+                $fileContent = file_get_contents($sqlFile);
+                DatabaseModel::exec($fileContent);
+            }
+        }
+
+        return ['directoryPath' => "{$directoryPath}/migration"];
+    }
 }