diff --git a/src/module_vmap/module/javascript/app/vmap/tools/insert.js b/src/module_vmap/module/javascript/app/vmap/tools/insert.js
index 3e2a40ce1ede6f7d9f266c25b9d54b077e6eb669..b4b7e11aabe4ec7145ccb781d40db4ae9276cd5f 100644
--- a/src/module_vmap/module/javascript/app/vmap/tools/insert.js
+++ b/src/module_vmap/module/javascript/app/vmap/tools/insert.js
@@ -1528,14 +1528,24 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getFormDat
     var oFormData_ = new FormData();
 
     for (var key in oValues) {
+
+        var bIsMultipleFiles = false;
+        if (goog.isObject(oValues[key])) {
+            if (goog.isDefAndNotNull(oValues[key].length)) {
+                bIsMultipleFiles = true
+            }
+        }
+
         // Fichier ?
-        if (goog.isDefAndNotNull(oValues[key])) {
-            if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
-                oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
-                oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
-            } else {
-                oFormData_.append(key, oValues[key]);
+        if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
+            oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
+            oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
+        } else if (bIsMultipleFiles) {
+            for (var i = 0; i < oValues[key].length; i++) {
+                oFormData_.append(key + '[]', oValues[key][i]);
             }
+        } else {
+            oFormData_.append(key, oValues[key]);
         }
     }
 
diff --git a/src/module_vmap/module/javascript/app/vmap/tools/select/select.js b/src/module_vmap/module/javascript/app/vmap/tools/select/select.js
index 40e7600350320c0c3a9d0e026ba2554433e1bdad..6438fce7e678a9d6e390b184d5a9bd03cc69a6e0 100755
--- a/src/module_vmap/module/javascript/app/vmap/tools/select/select.js
+++ b/src/module_vmap/module/javascript/app/vmap/tools/select/select.js
@@ -1650,10 +1650,22 @@ nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormDataFro
     var oFormData_ = new FormData();
 
     for (var key in oValues) {
+
+        var bIsMultipleFiles = false;
+        if (goog.isObject(oValues[key])) {
+            if (goog.isDefAndNotNull(oValues[key].length)) {
+                bIsMultipleFiles = true
+            }
+        }
+
         // Fichier ?
         if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
             oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
             oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
+        } else if (bIsMultipleFiles) {
+            for (var i = 0; i < oValues[key].length; i++) {
+                oFormData_.append(key + '[]', oValues[key][i]);
+            }
         } else {
             oFormData_.append(key, oValues[key]);
         }
diff --git a/src/module_vmap/web_service/ws/Querys.class.inc b/src/module_vmap/web_service/ws/Querys.class.inc
index 3aed39da27e23ba5bbe1615d9fa027c6127d5f48..da9788fb5969e4db206760b1971e165d81d4fd2b 100644
--- a/src/module_vmap/web_service/ws/Querys.class.inc
+++ b/src/module_vmap/web_service/ws/Querys.class.inc
@@ -15,8 +15,9 @@ require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 require_once 'Query.class.inc';
 require_once 'BusinessObject.class.inc';
-require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
-require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc');
+require_once (dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+require_once (dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc');
+require_once (dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/files/Files_manager.class.inc');
 require_once 'vmlib/logUtil.inc';
 
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/Vm.class.inc';
@@ -51,6 +52,8 @@ class Querys extends Vmap {
         $this->aProperties = $properties;
         $this->aValues['getGroup'] = false;
         $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        error_log('$_FILES: '. print_r($_FILES, true));
     }
 
     /**
@@ -841,7 +844,15 @@ class Querys extends Vmap {
 
                         foreach ($aLigne['bo_' . $type] as $key => $value) {
                             if (is_dir($sDataDir . "/" . $key)) {
-                                $aLigne['bo_' . $type][$key] = $sDataUrl . "/" . $key . "/" . $value . "?d=" . $date->getTimestamp();
+                                $aFiles = explode('|', $value);
+                                if (count($aFiles) > 1) {
+                                    $aLigne['bo_' . $type][$key] = [];
+                                    for ($i=0; $i < count($aFiles); $i++) {
+                                        array_push($aLigne['bo_' . $type][$key], $sDataUrl . "/" . $key . "/" . $aFiles[$i] . "?d=" . $date->getTimestamp());
+                                    }
+                                } else {
+                                    $aLigne['bo_' . $type][$key] = $sDataUrl . "/" . $key . "/" . $value . "?d=" . $date->getTimestamp();
+                                }
                             }
                         }
                     }
@@ -1429,32 +1440,18 @@ class Querys extends Vmap {
 
         $this->aValues['my_vitis_id'] = $this->aValues[$bo_id_field];
 
-        // Définit si il a des fichiers a uploader
-        $bUploadFiles = false;
-        foreach ($this->aValues as $key => $value) {
-            if (strrpos($key, '_file')) {
-                $sName = substr($key, 0, strrpos($key, '_file'));
-                if (isset($this->aValues[$sName . '_name'])) {
-                    $bUploadFiles = true;
-                }
-            }
-        }
-
         // Fichiers à uploader ?
-        if ($bUploadFiles) {
-            // Création du dossier contenneur si il n'existe pas
-            $sDirPath = $this->createElementFilesFolder($sBusinessObjectId, $this->aValues['my_vitis_id']);
-            if (!is_dir($sDirPath)) {
-                $oError = new VitisError(1, "Unable to acces to the business object direrctory :" . $sDirPath);
-                $aXmlRacineAttribute['status'] = 0;
-                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-                return $sMessage;
+        if (!empty($_FILES) && !empty($this->aValues['my_vitis_id'])) {
+
+            // Écriture du fichier
+            $oFileManager = new Files_manager($this->aProperties);
+            foreach ($_FILES as $sName => $aFile) {
+                $aUploadReturn = $oFileManager->uploadInWsDataDir('vitis', $sBusinessObjectId, $this->aValues['my_vitis_id'], $sName, 'documents');
+                $this->aValues[$sName] = $aUploadReturn['field_value'];
             }
-            // Mise en place des fichiers
-            $this->aValues = $this->extractFilesFromValues($this->aValues, $sDirPath);
-        }
 
-        $aReturn = $this->genericPut($bo_schema, $bo_table, $bo_id_field);
+            $aReturn = $this->genericPut($bo_schema, $bo_table, $bo_id_field);
+        }
 
         // Lance l'évènement webSocket
         if (!empty($bo_event)) {
@@ -1467,37 +1464,51 @@ class Querys extends Vmap {
         return $aReturn['sMessage'];
     }
 
-    /**
-     * Extract the files from aValues and modify the paths
-     * @param array $aValues
-     * @param string $sDirPath
-     * @param string $sFilePrefix
-     * @return array Parsed $aValues
-     */
-    function extractFilesFromValues($aValues, $sDirPath) {
+    function extractFile($aValues, $sName, $oFile, $sDirPath) {
 
-        foreach ($aValues as $key => $value) {
-            if (strrpos($key, '_file')) {
+        if (!empty($sName) && !empty($oFile['name']) && !empty($oFile['file'])) {
 
-                $sName = substr($key, 0, strrpos($key, '_file'));
-                $sFileName = $aValues[$sName . '_name'];
+            // Crée le dossier si besoin
+            $sDirColumnPath = $sDirPath . '/' . $sName;
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
 
-                if (!empty($sFileName)) {
+            // Cŕee le fichier sur le serveur
+            $fp = fopen($sDirColumnPath . '/' . $oFile['name'], "w");
+            fwrite($fp, $oFile['file']);
+            fclose($fp);
 
-                    $sDirColumnPath = $sDirPath . '/' . $sName;
-                    if (!is_dir($sDirColumnPath)) {
-                        mkdir($sDirColumnPath, 0777, true);
-                    }
+            // Mise en place pour la base de données
+            if (empty($aValues[$sName])) {
+                $aValues[$sName] = $oFile['name'];
+            } else {
+                $aValues[$sName] .= '|' . $oFile['name'];
+            }
+
+            if (!empty($aValues[$sName . '_file'])) {
+                unset($aValues[$sName . '_file']);
+            }
+            if (!empty($aValues[$sName . '_name'])) {
+                unset($aValues[$sName . '_name']);
+            }
+        }
 
-                    // Cŕee le fichier sur le serveur
-                    $fp = fopen($sDirColumnPath . '/' . $sFileName, "w");
-                    fwrite($fp, $value);
-                    fclose($fp);
+        return $aValues;
+    }
+
+    function extractFiles($aValues, $sDirPath) {
 
-                    // Mise en place pour la base de données
-                    $aValues[$sName] = $aValues[$sName . '_name'];
-                    unset($aValues[$sName . '_file']);
-                    unset($aValues[$sName . '_name']);
+        foreach ($_FILES as $key => $value) {
+
+            if (!empty($value['file'])) {
+                $aValues = $this->extractFile($aValues, $key, $value, $sDirPath);
+            }
+            if (!empty($value[0])) {
+                for ($i=0; $i < count($value); $i++) {
+                    if (!empty($value[$i]['file'])) {
+                        $aValues = $this->extractFile($aValues, $key, $value[$i], $sDirPath);
+                    }
                 }
             }
         }
@@ -1612,27 +1623,13 @@ class Querys extends Vmap {
         // Fichiers à uploader ?
         if (!empty($_FILES) && !empty($this->aValues['my_vitis_id'])) {
 
-            // Création du dossier contenneur
-            $sDirPath = $this->createElementFilesFolder($sBusinessObjectId, $this->aValues['my_vitis_id']);
-            if (!is_dir($sDirPath)) {
-                $oError = new VitisError(1, "Unable to acces to the business object direrctory :" . $sDirPath);
-                $aXmlRacineAttribute['status'] = 0;
-                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-                return $sMessage;
-            }
             // Écriture du fichier
+            $oFileManager = new Files_manager($this->aProperties);
             foreach ($_FILES as $sName => $aFile) {
-
-                $sDirColumnPath = $sDirPath . '/' . $sName;
-                if (!is_dir($sDirColumnPath)) {
-                    mkdir($sDirColumnPath, 0777, true);
-                }
-
-                $this->aValues[$sName] = $aFile['name'];
-
-                // Écrit le fichier dans son enplacement
-                uploadFile($sName, "", $sDirColumnPath . "/" . $aFile['name'], $aFile['size'] + 1);
+                $aUploadReturn = $oFileManager->uploadInWsDataDir('vitis', $sBusinessObjectId, $this->aValues['my_vitis_id'], $sName, 'documents');
+                $this->aValues[$sName] = $aUploadReturn['field_value'];
             }
+
             $this->genericPut($bo_schema, $bo_table, $bo_id_field);
         }