diff --git a/.gitignore b/.gitignore
index d8b5d9919508b3efbd1b1fdc1d91adb22b53876d..3197de7543d416ed1e6766c8e001ac9d61972146 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,6 @@
-client
-vas
+vas/
+client/
 conf/closure
 conf/node_modules/
 conf/properties.json
-src/closure/conf/depswriter/
-src/vitis/vas/log/
-src/vitis/vas/public/
-src/vitis/vas/server/
-src/vitis/vas/ws_data/
-src/vitis/vas/tmp/
-src/vitis/client/modules/
-! src/vitis/client/modules/vitis/
-src/vitis/vas/rest/ws/*
-! src/vitis/vas/rest/ws/vitis/
-src/vitis/vas/sql/*
-! src/vitis/vas/sql/sqlQueries.xml
+src/closure/
diff --git a/conf/properties.json b/conf/properties.json
new file mode 100644
index 0000000000000000000000000000000000000000..57a2e1354b12a276f527c018ea22dc106e3392d6
--- /dev/null
+++ b/conf/properties.json
@@ -0,0 +1,19 @@
+{
+    "services_alias": "rest[ENV]",
+    "web_server_name": "https://[hostname]:[PORT]/",
+    "vmap_folder": "modules/vmap",
+    "proxy_url": "https://[hostname]:[PORT]/proxy[ENV]/proxy.php",
+    "version": "[VERSION]",
+    "build": "[BUILD]",
+    "status": "unstable",
+    "month_year": "[MONTH_YEAR]",
+    "application": "vmap",
+    "environment": "[ENV]",
+    "mobile_interface": "true",
+    "mobile_interface_min_width": "1280",
+    "geolocation": "true",
+    "documentation": [{
+            "name": "Documentation vMap",
+            "url": "https://vmap.readthedocs.io/fr/latest/"
+        }]
+}
diff --git a/install.bat b/install.bat
new file mode 100644
index 0000000000000000000000000000000000000000..d3123bf3fd1bea62aa71042192d9505b4fea7982
--- /dev/null
+++ b/install.bat
@@ -0,0 +1,18 @@
+@echo off
+title Install Vitis App
+echo Install Vitis App
+
+cd utils
+call init_tree.bat
+call copy_hooks.bat
+
+cd ../client/conf
+call npm install grunt --save
+call npm install grunt-cli
+call npm install grunt-closure-tools --save
+call npm install google-closure-compiler@20160911.0.0 --save
+call npm install google-closure-library@20160911.0.0 --save
+call grunt
+
+cd ..
+pause
diff --git a/install.sh b/install.sh
index a085f0343734169c70293c3e281b3018fcb4e022..c67e39752717c3a5b10cb3d1b20c7e1d4304784b 100755
--- a/install.sh
+++ b/install.sh
@@ -21,5 +21,5 @@ else
     npm install grunt-closure-tools --save
     npm install google-closure-compiler@20160911.0.0 --save
     npm install google-closure-library@20160911.0.0 --save
-    grunt --dev
+    grunt -dev
 fi
diff --git a/pull.sh b/pull_subtrees.sh
similarity index 100%
rename from pull.sh
rename to pull_subtrees.sh
diff --git a/src/module_vmap/module/css/mobile.less b/src/module_vmap/module/css/mobile.less
index a281bf0695a6f93a48f1e91b70ac5e9f288d6716..fd900b75f297d667806837678592ecc6c66f8f34 100755
--- a/src/module_vmap/module/css/mobile.less
+++ b/src/module_vmap/module/css/mobile.less
@@ -276,3 +276,14 @@ app-map > div {
 #select-bo-select{
     max-width: 23vw;
 }
+
+.basic-tools-dropdown-select-getFeatureInfo-content{
+    display: block;
+    top: 0px !important;
+    height: 100%;
+    padding: 0px !important;
+    margin: 0px !important;
+    right: 0px !important;
+    width: 100% !important;
+    min-width: auto;
+}
diff --git a/src/module_vmap/module/javascript/app/modules/Cadastre/cadastre.js b/src/module_vmap/module/javascript/app/modules/Cadastre/cadastre.js
index 91a57bf08b978aba916e302d0bbed6393037e661..eaed9561ddf04f859db73cc3d68093fbb45210e4 100644
--- a/src/module_vmap/module/javascript/app/modules/Cadastre/cadastre.js
+++ b/src/module_vmap/module/javascript/app/modules/Cadastre/cadastre.js
@@ -274,7 +274,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController = function
             sString = oVmap.checkLink(sString);
         }else{
             sString = oVmap.parseLink(sString, 'link');
-        }        
+        }
         return $sce.trustAsHtml(sString);
     };
 };
@@ -926,7 +926,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
             }
             tmp = Date.now();
             setTimeout(function () {
-                var aSelected = $(parcelleTable).bootstrapTable('getAllSelections');
+                var aSelected = $(parcelleTable).bootstrapTable('getSelections');
                 this_['tablesSelection'][parcelleTable] = aSelected;
             });
         };
@@ -986,7 +986,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheetByTable = function (parcelleTable) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayParcelleDescriptiveSheetByTable');
 
-    var selectedParcelles = $(parcelleTable).bootstrapTable('getAllSelections');
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
 
     if (selectedParcelles.length !== 1) {
         $.notify('Veuillez sélectionner une unique parcelle', 'info');
@@ -1128,7 +1128,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheetByTable = function (parcelleTable) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayUrbanismeSheetByTable');
 
-    var selectedParcelles = $(parcelleTable).bootstrapTable('getAllSelections');
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
 
     if (selectedParcelles.length !== 1) {
         $.notify('Veuillez sélectionner une unique parcelle', 'info');
@@ -1482,7 +1482,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetParcelle = function (parcelleTable) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetTiers');
 
-    var selectedParcelles = $(parcelleTable).bootstrapTable('getAllSelections');
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
 
     if (selectedParcelles.length !== 1) {
         $.notify('Veuillez sélectionner une unique parcelle', 'info');
@@ -1508,7 +1508,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetStandard = function (compteTable) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetStandard');
 
-    var selectedComptes = $(compteTable).bootstrapTable('getAllSelections');
+    var selectedComptes = $(compteTable).bootstrapTable('getSelections');
 
     if (selectedComptes.length !== 1) {
         $.notify('Veuillez sélectionner un unique compte', 'info');
@@ -1535,7 +1535,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetTiers = function (compteTable) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayReleveDeProprieteSheetTiers');
 
-    var selectedComptes = $(compteTable).bootstrapTable('getAllSelections');
+    var selectedComptes = $(compteTable).bootstrapTable('getSelections');
 
     if (selectedComptes.length !== 1) {
         $.notify('Veuillez sélectionner un unique compte', 'info');
@@ -1583,7 +1583,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayRapportParcelle = function (parcelleTable, rapportType, bOpenWindow) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.displayRapportParcelle');
 
-    var selectedParcelles = $(parcelleTable).bootstrapTable('getAllSelections');
+    var selectedParcelles = $(parcelleTable).bootstrapTable('getSelections');
 
     bOpenWindow = goog.isDef(bOpenWindow) ? bOpenWindow : true;
 
@@ -2084,7 +2084,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
  */
 nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromTable = function (path, param, tableId, tabCode, callBack) {
     oVmap.log('nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.addSelectionFromTable');
-    var tableSelections = $(tableId).bootstrapTable('getAllSelections');
+    var tableSelections = $(tableId).bootstrapTable('getSelections');
     if (this['cadastreAPI_'] === "cadastre") {
         var paramField = param;
     } else {
@@ -2235,7 +2235,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     tableParam = goog.isDef(tableParam) ? tableParam : param;
 
     var cadastreController = this;
-    var tableSelections = $(tableId).bootstrapTable('getAllSelections');
+    var tableSelections = $(tableId).bootstrapTable('getSelections');
     var url = oVmap['properties']['api_url'] + '/' + path;
 
     var loadHttp = function () {
@@ -2628,7 +2628,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 
             var data = response['data']['data'];
 
-            // Ajoute le type de voie 
+            // Ajoute le type de voie
             for (var i = 0; i < data.length; i++) {
                 if (goog.isDefAndNotNull(data[i]['L_NATURE_VOIE'])) {
                     data[i]['NOM_VOIE'] = data[i]['L_NATURE_VOIE'] + ' ' + data[i]['DVOILIB'];
@@ -2925,7 +2925,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
             $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
             $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
                 $(parcelleTableId).bootstrapTable('removeAll');
-                cadastreController.getBaseParcellesByProprietaireOnTable(row['ID_COM'], $(tableId).bootstrapTable('getAllSelections'), parcelleTableId);
+                cadastreController.getBaseParcellesByProprietaireOnTable(row['ID_COM'], $(tableId).bootstrapTable('getSelections'), parcelleTableId);
             });
             // Si une seule ligne est proposée, alors on la sélectionne
             if (data.length === 1) {
@@ -3212,7 +3212,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
                 $(invariantsTableId).bootstrapTable('removeAll');
                 $(parcellesTableId).bootstrapTable('removeAll');
 
-                cadastreController.getBatiBaseInvariantsOnTable($(tableId).bootstrapTable('getAllSelections'), invariantsTableId, parcellesTableId);
+                cadastreController.getBatiBaseInvariantsOnTable($(tableId).bootstrapTable('getSelections'), invariantsTableId, parcellesTableId);
             });
 
             // Si une seule ligne est proposée, alors on la sélectionne
@@ -3305,7 +3305,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
                 $(tableId).off('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table');
                 $(tableId).on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {
                     $(parcellesTableId).bootstrapTable('removeAll');
-                    cadastreController.getBatiBaseParcellesOnTable($(tableId).bootstrapTable('getAllSelections'), parcellesTableId);
+                    cadastreController.getBatiBaseParcellesOnTable($(tableId).bootstrapTable('getSelections'), parcellesTableId);
                 });
 
                 // Si une seule ligne est proposée, alors on la sélectionne
@@ -3500,7 +3500,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos de la section
-    if ($(tableSection).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableSection).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_section');
 
         // Crée l'onglet correspondant
@@ -3550,7 +3550,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos du lieu dit
-    if ($(tableLieuDit).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableLieuDit).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_lieu_dit');
 
         // Crée l'onglet correspondant
@@ -3615,7 +3615,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos de la Parcelle
-    if ($(tableParcelle).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableParcelle).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_parcelle');
 
         // Crée l'onglet correspondant
@@ -3668,7 +3668,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos de la Voie
-    if ($(tableVoie).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableVoie).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_voie');
 
         // Crée l'onglet correspondant
@@ -3703,7 +3703,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
         this.addSelectionFromSelect(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', selectAdresse, 'veremes_cadastre_parcelle');
 
         // Si on choisit de voir toutes les géométries
-    } else if ($(tableVoie).bootstrapTable('getAllSelections').length > 0 && this['aAdresses'].length > 0) {
+    } else if ($(tableVoie).bootstrapTable('getSelections').length > 0 && this['aAdresses'].length > 0) {
         this.aFormList_.push('veremes_cadastre_parcelle');
 
         // Crée l'onglet correspondant
@@ -3730,7 +3730,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
 
     if ($(selectAdresse).val() !== "")
         this.localiseFromSelect(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', selectAdresse);
-    else if ($(tableVoie).bootstrapTable('getAllSelections').length > 0) {
+    else if ($(tableVoie).bootstrapTable('getSelections').length > 0) {
         this.localiseFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', this['aAdresses'], 'ID_PAR');
     }
 };
@@ -3775,7 +3775,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos du propriétaire
-    if ($(tableProprietaires).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableProprietaires).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_proprietaire');
 
         // Crée l'onglet correspondant
@@ -3783,13 +3783,13 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
             oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_proprietaire', tabName: 'Propriétaire', actions: ['delete']});
 
         // Ajoute les infos
-        var proprietaire = $(tableProprietaires).bootstrapTable('getAllSelections')[0];
+        var proprietaire = $(tableProprietaires).bootstrapTable('getSelections')[0];
         this.addSelectionFrom2Values(oVmap["properties"]["cadastre"]["api"] + '/proprietaires', 'DDENOM', proprietaire['DDENOM'], 'ID_COM', proprietaire['ID_COM'], 'veremes_cadastre_proprietaire');
 
     }
 
     // Ajoute les infos du compte
-    if ($(tableComptes).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableComptes).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_compte');
 
         // Crée l'onglet correspondant
@@ -3797,7 +3797,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
             oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_compte', tabName: 'Compte', actions: ['delete']});
 
         // Ajoute les infos
-        var aComptes = $(tableComptes).bootstrapTable('getAllSelections');
+        var aComptes = $(tableComptes).bootstrapTable('getSelections');
         if (this['cadastreAPI_'] === "cadastre") {
             var id_com = 'ID_COM';
             var dnupro = 'DNUPRO';
@@ -3829,7 +3829,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos de la parcelle
-    if ($(tableParcelles).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableParcelles).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_parcelle');
 
         // Crée l'onglet correspondant
@@ -3837,7 +3837,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
             oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_parcelle', tabName: 'Parcelle', actions: ['zoom', 'delete']});
 
         // Ajoute les infos
-        var aParcelles = $(tableParcelles).bootstrapTable('getAllSelections');
+        var aParcelles = $(tableParcelles).bootstrapTable('getSelections');
         this.addSelectionFromArray(oVmap["properties"]["cadastre"]["api"] + '/parcelles', 'id_par', aParcelles, 'ID_PAR', 'veremes_cadastre_parcelle');
     }
 
@@ -3897,7 +3897,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos du propriétaire
-    if ($(tableProprietaires).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableProprietaires).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_proprietaire');
 
         // Crée l'onglet correspondant
@@ -3905,19 +3905,19 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
             oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_proprietaire', tabName: 'Propriétaire', actions: ['delete']});
 
         // Ajoute les infos
-        var proprietaire = $(tableProprietaires).bootstrapTable('getAllSelections')[0];
+        var proprietaire = $(tableProprietaires).bootstrapTable('getSelections')[0];
         this.addSelectionFrom2Values(oVmap["properties"]["cadastre"]["api"] + '/proprietaires', ddenomF, proprietaire['DDENOM'], id_comF, proprietaire['ID_COM'], 'veremes_cadastre_proprietaire');
     }
 
     // Ajoute les infos du compte
-    if ($(tableComptes).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableComptes).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_compte');
 
         // Crée l'onglet correspondant
         if (oVmap.getToolsManager().getInfoContainer().getTabByCode('veremes_cadastre_compte') === undefined)
             oVmap.getToolsManager().getInfoContainer().addTab({tabCode: 'veremes_cadastre_compte', tabName: 'Compte', actions: ['delete']});
 
-        var aComptes = $(tableComptes).bootstrapTable('getAllSelections');
+        var aComptes = $(tableComptes).bootstrapTable('getSelections');
         if (this['cadastreAPI_'] === "cadastre") {
             var id_com = 'ID_COM';
             var dnupro = 'DNUPRO';
@@ -3951,7 +3951,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos de l'invariant
-    if ($(tableInvariants).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableInvariants).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_invariant');
 
         // Crée l'onglet correspondant
@@ -3963,7 +3963,7 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController.prototype.
     }
 
     // Ajoute les infos de la parcelle
-    if ($(tableParcelles).bootstrapTable('getAllSelections').length > 0) {
+    if ($(tableParcelles).bootstrapTable('getSelections').length > 0) {
         this.aFormList_.push('veremes_cadastre_parcelle');
 
         // Crée l'onglet correspondant
diff --git a/src/module_vmap/module/javascript/app/vmap/tools/print.js b/src/module_vmap/module/javascript/app/vmap/tools/print.js
index 342c526f9fc29d74118bafb824bad036e118c50d..8c779787a04216d8ac5ca2ec60d40e2b2bd29a12 100644
--- a/src/module_vmap/module/javascript/app/vmap/tools/print.js
+++ b/src/module_vmap/module/javascript/app/vmap/tools/print.js
@@ -558,7 +558,6 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     today = dd + '/' + mm + '/' + yyyy;
 
     // Valeurs par défaut
-    var resolutionCoeff = goog.isDefAndNotNull(opt_options.resolutionCoeff) ? opt_options.resolutionCoeff : 1;
     var templateId = opt_options.templateId;
     var printStyleId = opt_options.printStyleId;
 
@@ -573,51 +572,6 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     oPrintScope['date'] = goog.isDefAndNotNull(oPrintScope['date']) ? oPrintScope['date'] : today;
     var sScope = JSON.stringify(oPrintScope);
 
-    // Set mapId/mapJson
-    var sMapId;
-    var sMapJSON;
-    if (goog.isDefAndNotNull(opt_options.mapId)) {
-        sMapId = opt_options.mapId;
-    } else {
-        sMapJSON = oVmap.getMapManager().getJSONLayersTree();
-    }
-
-    // set EWKTFeatures
-    var aFeatures = goog.isDefAndNotNull(opt_options.features) ? opt_options.features : [];
-    var sEWKTFeatures = '';
-    for (var i = 0; i < aFeatures.length; i++) {
-        if (i > 0)
-            sEWKTFeatures += '|';
-        sEWKTFeatures += oVmap.getEWKTFromGeom(aFeatures[i].getGeometry());
-    }
-
-    // set extent
-    var aExtent = goog.isDefAndNotNull(opt_options.extent) ? opt_options.extent : [];
-    var sExtent = '';
-    var aOverviewExtent = [
-        aExtent[0] - (aExtent[2] - aExtent[0]),
-        aExtent[1] - (aExtent[3] - aExtent[1]),
-        aExtent[2] + (aExtent[2] - aExtent[0]),
-        aExtent[3] + (aExtent[3] - aExtent[1])
-    ];
-    var sOverviewExtent = '';
-    for (var i = 0; i < aExtent.length; i++) {
-        if (i > 0) {
-            sExtent += '|';
-            sOverviewExtent += '|';
-        }
-        sExtent += aExtent[i];
-        sOverviewExtent += aOverviewExtent[i];
-    }
-
-    // Features zoom
-    var sFeaturesZoom = 100;
-    if (goog.isDefAndNotNull(opt_options.featuresZoom)) {
-        sFeaturesZoom = opt_options.featuresZoom;
-    } else if (goog.isDefAndNotNull(oVmap['properties']['print']['features_zoom'])) {
-        sFeaturesZoom = oVmap['properties']['print']['features_zoom'];
-    }
-
     // Ouvre la fenêtre d'impression
     var printWindow = window.open("", '_blank', 'height=400,width=600');
 
@@ -664,46 +618,17 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
             template.innerHTML = response['data']['data'][0]['definition'];
 
             var mapImageSize = this_.getTemplateTargetSize(template, '#map_image');
-            var overviezSize = this_.getTemplateTargetSize(template, '#map_overview');
-
-            if (goog.isDefAndNotNull(mapImageSize)) {
-                var oMapDef = {
-                    'map_id': sMapId,
-                    'map_json': sMapJSON,
-                    'image_size': (mapImageSize[0] * resolutionCoeff) + '|' + (mapImageSize[1] * resolutionCoeff),
-                    'resolution_coeff': resolutionCoeff,
-                    'extent': sExtent,
-                    'features': sEWKTFeatures,
-                    'features_zoom': sFeaturesZoom
-                };
-            }
-
-            if (goog.isDefAndNotNull(overviezSize)) {
-                var oOverviewDef = {
-                    'map_id': sMapId,
-                    'map_json': sMapJSON,
-                    'image_size': (overviezSize[0] * resolutionCoeff) + '|' + (overviezSize[1] * resolutionCoeff),
-                    'resolution_coeff': resolutionCoeff,
-                    'extent': sOverviewExtent,
-                    'features': sEWKTFeatures,
-                    'features_zoom': 400
-                };
-            }
-
-            var oMapsJson = [];
-            if (goog.isDefAndNotNull(oMapDef)) {
-                oMapsJson.push({
-                    'target': '#map_image',
-                    'map_definition': oMapDef
-                });
-            }
-            if (goog.isDefAndNotNull(oOverviewDef)) {
-                oMapsJson.push({
-                    'target': '#map_overview',
-                    'map_definition': oOverviewDef
-                });
-            }
-            var mapsJson = JSON.stringify(oMapsJson);
+            var overviewSize = this_.getTemplateTargetSize(template, '#map_overview');
+
+            var mapsJson = this_.getMapsJsonDef({
+                mapId: opt_options.mapId,
+                resolutionCoeff: opt_options.resolutionCoeff,
+                extent: opt_options.extent,
+                features: opt_options.features,
+                featuresZoom: opt_options.featuresZoom,
+                mapImageSize: mapImageSize,
+                overviewSize: overviewSize
+            })
 
             // Récupère les infos de l'utilisateur
             this_.getUserInfos_().then(function (oUserInfos) {
@@ -773,6 +698,99 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     return 1;
 };
 
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef = function (opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef');
+
+    // Resolution
+    var resolutionCoeff = goog.isDefAndNotNull(opt_options.resolutionCoeff) ? opt_options.resolutionCoeff : 1;
+
+    // mapId/mapJson
+    var sMapId;
+    var sMapJSON;
+    if (goog.isDefAndNotNull(opt_options.mapId)) {
+        sMapId = opt_options.mapId;
+    } else {
+        sMapJSON = oVmap.getMapManager().getJSONLayersTree();
+    }
+
+    // Extent
+    var aExtent = goog.isDefAndNotNull(opt_options.extent) ? opt_options.extent : [];
+    var sExtent = '';
+    var aOverviewExtent = [
+        aExtent[0] - (aExtent[2] - aExtent[0]),
+        aExtent[1] - (aExtent[3] - aExtent[1]),
+        aExtent[2] + (aExtent[2] - aExtent[0]),
+        aExtent[3] + (aExtent[3] - aExtent[1])
+    ];
+    var sOverviewExtent = '';
+    for (var i = 0; i < aExtent.length; i++) {
+        if (i > 0) {
+            sExtent += '|';
+            sOverviewExtent += '|';
+        }
+        sExtent += aExtent[i];
+        sOverviewExtent += aOverviewExtent[i];
+    }
+
+    // Features
+    var aFeatures = goog.isDefAndNotNull(opt_options.features) ? opt_options.features : [];
+    var sEWKTFeatures = '';
+    for (var i = 0; i < aFeatures.length; i++) {
+        if (i > 0)
+            sEWKTFeatures += '|';
+        sEWKTFeatures += oVmap.getEWKTFromGeom(aFeatures[i].getGeometry());
+    }
+
+    var sFeaturesZoom = 100;
+    if (goog.isDefAndNotNull(opt_options.featuresZoom)) {
+        sFeaturesZoom = opt_options.featuresZoom;
+    } else if (goog.isDefAndNotNull(oVmap['properties']['print']['features_zoom'])) {
+        sFeaturesZoom = oVmap['properties']['print']['features_zoom'];
+    }
+
+    if (goog.isDefAndNotNull(opt_options.mapImageSize)) {
+        var oMapDef = {
+            'map_id': sMapId,
+            'map_json': sMapJSON,
+            'image_size': (opt_options.mapImageSize[0] * resolutionCoeff) + '|' + (opt_options.mapImageSize[1] * resolutionCoeff),
+            'resolution_coeff': resolutionCoeff,
+            'extent': sExtent,
+            'features': sEWKTFeatures,
+            'features_zoom': sFeaturesZoom
+        };
+    }
+
+    if (goog.isDefAndNotNull(opt_options.overviewSize)) {
+        var oOverviewDef = {
+            'map_id': sMapId,
+            'map_json': sMapJSON,
+            'image_size': (opt_options.overviewSize[0] * resolutionCoeff) + '|' + (opt_options.overviewSize[1] * resolutionCoeff),
+            'resolution_coeff': resolutionCoeff,
+            'extent': sOverviewExtent,
+            'features': sEWKTFeatures,
+            'features_zoom': 400
+        };
+    }
+
+    var oMapsJson = [];
+    if (goog.isDefAndNotNull(oMapDef)) {
+        oMapsJson.push({
+            'target': '#map_image',
+            'map_definition': oMapDef
+        });
+    }
+    if (goog.isDefAndNotNull(oOverviewDef)) {
+        oMapsJson.push({
+            'target': '#map_overview',
+            'map_definition': oOverviewDef
+        });
+    }
+
+    var mapsJson = JSON.stringify(oMapsJson);
+
+    return mapsJson;
+}
+
 /**
  * Get the size of a target in a template
  * @param {string} template
diff --git a/src/module_vmap/module/javascript/vitis/script_module.js b/src/module_vmap/module/javascript/vitis/script_module.js
index f14e1f323236a857733612f3f3c22a24fa55164c..00d7bea38f0f130a3f1f55460702749cb216fc1f 100644
--- a/src/module_vmap/module/javascript/vitis/script_module.js
+++ b/src/module_vmap/module/javascript/vitis/script_module.js
@@ -915,7 +915,9 @@ vitisApp.on('appMainDrtvLoaded', function () {
         }
 
         this['getCapabilities'](serviceUrl, {
-            'version': serviceVersion
+            'version': serviceVersion,
+            'service_login': envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]['service_login'],
+            'service_password': envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]['service_password']
         }).then(function (oResult) {
             if (goog.isDefAndNotNull(oResult)) {
                 if (goog.isDefAndNotNull(oResult['json'])) {
@@ -1098,6 +1100,12 @@ vitisApp.on('appMainDrtvLoaded', function () {
                 if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['service_type_version'])) {
                     envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_type_version"] = scope['oServices'][sServiceId]['service_type_version'];
                 }
+                if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['service_login'])) {
+                    envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_login"] = scope['oServices'][sServiceId]['service_login'];
+                }
+                if (goog.isDefAndNotNull(scope['oServices'][sServiceId]['service_password'])) {
+                    envSrvc["oFormValues"][envSrvc['sFormDefinitionName']]["service_password"] = scope['oServices'][sServiceId]['service_password'];
+                }
             }
         } else {
             sServiceType = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']]['service_type_id'];
@@ -2497,11 +2505,15 @@ vitisApp.on('appMainDrtvLoaded', function () {
 
         $translate(["BTN_ADD_LAYERS_VMAP_MAP_LAYER"]).then(function (oTranslations) {
             var sServiceUrl = envSrvc["oFormValues"][sParentFormDefinitionName]["service_url"];
+            var sServiceLogin = envSrvc["oFormValues"][sParentFormDefinitionName]["service_login"];
+            var sServicePassword = envSrvc["oFormValues"][sParentFormDefinitionName]["service_password"];
             var sVersion = envSrvc["oFormValues"][sParentFormDefinitionName]["service_type_version"];
             sServiceUrl = sServiceUrl.replace("[token]", sha256(sessionSrvc["token"]));
             sServiceUrl = sServiceUrl.replace("[ms_cgi_url]", propertiesSrvc["ms_cgi_url"]);
             this_['showLayerModalWindow']({
                 'service_url': sServiceUrl,
+                'service_login': sServiceLogin,
+                'service_password': sServicePassword,
                 'service_version': sVersion,
                 'buttons': [{
                         "label": oTranslations["BTN_ADD_LAYERS_VMAP_MAP_LAYER"],
@@ -2874,7 +2886,9 @@ vitisApp.on('appMainDrtvLoaded', function () {
         } else if (goog.isDefAndNotNull(sServiceUrl)) {
             // Calques du service wms.
             scope.$root['getCapabilities'](sServiceUrl, {
-                'version': opt_options['service_version']
+                'version': opt_options['service_version'],
+                'service_login': opt_options['service_login'],
+                'service_password': opt_options['service_password']
             }).then(function (oGetCapabilities) {
                 oCapabilities = oGetCapabilities;
                 if (goog.isDefAndNotNull(oCapabilities)) {
@@ -2906,6 +2920,9 @@ vitisApp.on('appMainDrtvLoaded', function () {
             "showErrorMessage": true,
             "version": "1.3.0"
         };
+        var oHeaders = {
+            "charset": "charset=utf-8"
+        };
         if (typeof (oOptions) == "undefined")
             oOptions = oDefaultOptions;
         else {
@@ -2918,6 +2935,11 @@ vitisApp.on('appMainDrtvLoaded', function () {
         if (!goog.isDefAndNotNull(oOptions['showErrorMessage'])) {
             oOptions['showErrorMessage'] = true;
         }
+        if (goog.isDefAndNotNull(oOptions['service_login']) && goog.isDefAndNotNull(oOptions['service_password'])) {
+            if (oOptions['service_login'].length > 0 && oOptions['service_password'].length > 0) {
+                oHeaders['Authorization'] = "Basic " + btoa(oOptions['service_login'] + ":" + oOptions['service_password']);
+            }
+        }
         // Création de l'url vers le service.
         if (sServiceUrl.indexOf("?") === -1)
             sServiceUrl += "?";
@@ -2941,6 +2963,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
                 "method": "GET",
                 "url": propertiesSrvc['proxy_url'],
                 "params": {"url": sServiceUrl},
+                'headers': oHeaders,
                 "scope": scope,
                 "responseType": "text",
                 "success": function (response) {
diff --git a/src/module_vmap/module/template/tools/print.html b/src/module_vmap/module/template/tools/print.html
index 92421e58d937a6c2116346ef30a024b87037e46d..0a1fd62b4dcf92147ce7b543f37d661637c5f70c 100644
--- a/src/module_vmap/module/template/tools/print.html
+++ b/src/module_vmap/module/template/tools/print.html
@@ -45,8 +45,8 @@
             <option value="100">1:100</option>
         </select>
 
-        <div class="hidden print-form-label">Résolution</div>
-        <select id="select-print-resolution" class="hidden form-control minus" ng-model="ctrl.dpi">
+        <div class="print-form-label">Résolution</div>
+        <select id="select-print-resolution" class="form-control minus" ng-model="ctrl.dpi">
             <option value="1">72 dpi</option>
             <option value="2" ng-show="ctrl.resolution <= 4">144 dpi</option>
             <option value="4" ng-show="ctrl.resolution <= 2">288 dpi</option>
diff --git a/src/module_vmap/storage/veremes_demo_dessin/forms/custom.json b/src/module_vmap/storage/veremes_demo_dessin/forms/custom.json
new file mode 100755
index 0000000000000000000000000000000000000000..40d59f8f0d8349d47d4f0f3d4a9b5170d17f78f1
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/forms/custom.json
@@ -0,0 +1,629 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "Dessin",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": true,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "draw_id",
+            "label": "draw_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "draw_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "description",
+            "label": "description",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "description_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_size",
+            "label": "text_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_size_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "geom_size",
+            "label": "geom_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "geom_size_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "contour_color",
+            "label": "Couleur de contour",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "contour_color_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "background_color",
+            "label": "Couleur de fond",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "background_color_6_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "color_label",
+            "label": "couleur du texte",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "color_label_7_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "label",
+            "label": "label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "label_8_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "graph",
+            "label": "graph",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "graph_9_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "area",
+            "label": "area",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_10_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "area_label",
+            "label": "area_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_label_11_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "perimeter",
+            "label": "perimeter",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_12_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "perimeter_label",
+            "label": "perimeter_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_label_13_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_label",
+            "label": "text_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_label_14_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "theme",
+            "label": "theme",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "theme_15_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "comments",
+            "label": "comments",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "comments_16_1"
+          }
+        ]
+      }
+    ]
+},
+"search": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": false,
+  "rows": []
+},
+"insert": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2206"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2207"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1",
+          "default_value": true
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2218"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2219"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1",
+          "default_value": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1",
+          "default_value": 10,
+          "required": true
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1",
+          "default_value": 15,
+          "required": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1",
+          "default_value": "0 0 0",
+          "required": true
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"update": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "label",
+          "name": "draw_id",
+          "label": "Id",
+          "id": "id_dessin_1_1",
+          "nb_cols": 12
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2044"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2045"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1"
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2056"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2057"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1"
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1"
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"datasources": {}
+}
diff --git a/src/module_vmap/storage/veremes_demo_dessin/forms/default.json b/src/module_vmap/storage/veremes_demo_dessin/forms/default.json
new file mode 100755
index 0000000000000000000000000000000000000000..40d59f8f0d8349d47d4f0f3d4a9b5170d17f78f1
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/forms/default.json
@@ -0,0 +1,629 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "Dessin",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": true,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "draw_id",
+            "label": "draw_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "draw_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "description",
+            "label": "description",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "description_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_size",
+            "label": "text_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_size_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "geom_size",
+            "label": "geom_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "geom_size_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "contour_color",
+            "label": "Couleur de contour",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "contour_color_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "background_color",
+            "label": "Couleur de fond",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "background_color_6_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "color_label",
+            "label": "couleur du texte",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "color_label_7_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "label",
+            "label": "label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "label_8_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "graph",
+            "label": "graph",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "graph_9_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "area",
+            "label": "area",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_10_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "area_label",
+            "label": "area_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_label_11_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "perimeter",
+            "label": "perimeter",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_12_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "perimeter_label",
+            "label": "perimeter_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_label_13_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_label",
+            "label": "text_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_label_14_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "theme",
+            "label": "theme",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "theme_15_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "comments",
+            "label": "comments",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "comments_16_1"
+          }
+        ]
+      }
+    ]
+},
+"search": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": false,
+  "rows": []
+},
+"insert": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2206"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2207"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1",
+          "default_value": true
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2218"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2219"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1",
+          "default_value": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1",
+          "default_value": 10,
+          "required": true
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1",
+          "default_value": 15,
+          "required": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1",
+          "default_value": "0 0 0",
+          "required": true
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"update": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "label",
+          "name": "draw_id",
+          "label": "Id",
+          "id": "id_dessin_1_1",
+          "nb_cols": 12
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2044"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2045"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1"
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2056"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2057"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1"
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1"
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"datasources": {}
+}
diff --git a/src/module_vmap/storage/veremes_demo_dessin/forms/published.json b/src/module_vmap/storage/veremes_demo_dessin/forms/published.json
new file mode 100755
index 0000000000000000000000000000000000000000..40d59f8f0d8349d47d4f0f3d4a9b5170d17f78f1
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/forms/published.json
@@ -0,0 +1,629 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "Dessin",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": true,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "draw_id",
+            "label": "draw_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "draw_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "description",
+            "label": "description",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "description_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_size",
+            "label": "text_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_size_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "geom_size",
+            "label": "geom_size",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "geom_size_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "contour_color",
+            "label": "Couleur de contour",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "contour_color_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "background_color",
+            "label": "Couleur de fond",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "background_color_6_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "color_label",
+            "label": "couleur du texte",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "color_label_7_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "label",
+            "label": "label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "label_8_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "graph",
+            "label": "graph",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "graph_9_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "area",
+            "label": "area",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_10_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "area_label",
+            "label": "area_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "area_label_11_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "perimeter",
+            "label": "perimeter",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_12_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "options": {
+              "choices": [
+                {
+                  "label": "oui",
+                  "value": true
+                },
+                {
+                  "label": "non",
+                  "value": false
+                }
+              ]
+            },
+            "name": "perimeter_label",
+            "label": "perimeter_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "perimeter_label_13_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "text_label",
+            "label": "text_label",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "text_label_14_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "theme",
+            "label": "theme",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "theme_15_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "comments",
+            "label": "comments",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "comments_16_1"
+          }
+        ]
+      }
+    ]
+},
+"search": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": false,
+  "rows": []
+},
+"insert": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2206"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2207"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1",
+          "default_value": true
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2218"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2219"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1",
+          "default_value": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1",
+          "default_value": 10,
+          "required": true
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1",
+          "default_value": 15,
+          "required": true
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1",
+          "default_value": "0 0 0",
+          "required": true
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1",
+          "default_value": "0 0 0",
+          "required": true
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"update": {
+  "name": "custom-form",
+  "title": "Dessin",
+  "input_size": "xxs",
+  "nb_cols": 12,
+  "javascript": true,
+  "rows": [
+    {
+      "fields": [
+        {
+          "type": "label",
+          "name": "draw_id",
+          "label": "Id",
+          "id": "id_dessin_1_1",
+          "nb_cols": 12
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "text_label",
+          "label": "Texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 12,
+          "id": "label_text_14_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "text",
+          "name": "theme",
+          "label": "Thème / Projet",
+          "required": false,
+          "nb_cols": 12,
+          "id": "theme_15_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "textarea",
+          "name": "comments",
+          "label": "Commentaires",
+          "required": false,
+          "nb_cols": 6,
+          "id": "comments_16_1",
+          "size": 4
+        },
+        {
+          "type": "textarea",
+          "name": "description",
+          "label": "Etiquette",
+          "required": false,
+          "nb_cols": 6,
+          "id": "description_2_1",
+          "size": 4
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2044"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2045"
+              }
+            ]
+          },
+          "name": "label",
+          "label": "Afficher le texte",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "label_8_1"
+        },
+        {
+          "type": "radio",
+          "options": {
+            "choices": [
+              {
+                "label": "Oui",
+                "value": true,
+                "$$hashKey": "object:2056"
+              },
+              {
+                "label": "Non",
+                "value": false,
+                "$$hashKey": "object:2057"
+              }
+            ]
+          },
+          "name": "graph",
+          "label": "Afficher la partie graph",
+          "disabled": false,
+          "required": false,
+          "nb_cols": 6,
+          "id": "graphique_9_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "integer",
+          "name": "text_size",
+          "label": "Taille du texte",
+          "nb_cols": 6,
+          "id": "taille_text_3_1"
+        },
+        {
+          "type": "integer",
+          "name": "geom_size",
+          "label": "Épaisseur/taille",
+          "nb_cols": 6,
+          "id": "taille_geom_4_1"
+        }
+      ]
+    },
+    {
+      "fields": [
+        {
+          "type": "color_picker",
+          "name": "background_color_rgba",
+          "label": "Couleur de fond",
+          "nb_cols": 4,
+          "id": "couleur_fond_6_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "contour_color_rgba",
+          "label": "Couleur de contour",
+          "nb_cols": 4,
+          "id": "couleur_contour_5_1"
+        },
+        {
+          "type": "color_picker",
+          "name": "color_label_rgba",
+          "label": "couleur du texte",
+          "nb_cols": 4,
+          "id": "couleur_label_7_1"
+        }
+      ]
+    }, {
+      "fields": [
+        {
+          "type": "hidden",
+          "name": "background_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "contour_color",
+          "nb_cols": 12
+        },{
+          "type": "hidden",
+          "name": "color_label",
+          "nb_cols": 12
+        }
+      ]
+    }
+  ]
+},
+"datasources": {}
+}
diff --git a/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/custom.js b/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/custom.js
new file mode 100755
index 0000000000000000000000000000000000000000..de066e6fbd1e478806f3a70d18c66444d6624d81
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/custom.js
@@ -0,0 +1,109 @@
+/* global angular, goog */
+// CUSTOM
+//bloque les delete du destructeur à éviter
+//'use strict';
+
+/***********************************************************************************
+ vmap_dessin Javascript
+ ***********************************************************************************/
+
+var oFormRequired = {
+    "sUrl": "",
+    "scope_": {},
+    "toDestructor": []
+};
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire si dans la structure json javascript vaut "true"
+ * @param {type} scope
+ * @param {type} s_url
+ * @returns {undefined}
+ */
+var constructor_form = function (scope, s_url) {
+    //////////////////////////////////////////////////////////
+    //Ne pas toucher
+    console.log("constructor_form");
+
+    oFormRequired.sUrl = s_url;
+    oFormRequired.scope_ = scope;
+        
+    var parseColorFromRGBA = function (rgba) {
+        if (isRGBA(rgba)) {
+            var matchColors = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
+            var match = matchColors.exec(rgba);
+            var color = match[1] + ' ' + match[2] + ' ' + match[3];
+        } else {
+            color = rgba;
+        }
+        return color;
+    };
+
+    var parseColorToRGBA = function (color) {
+        if (isRGBA(color))
+            var rgba = color;
+        else
+            var rgba = 'rgba(' + color.replace(/ /g, ',') + ',1)';
+        return rgba;
+    };
+
+    var isRGBA = function (color) {
+        if (color.substring(0, 4) === 'rgba')
+            return true;
+        else
+            return false;
+    };
+
+    var beforeEvent = function (sMode) {
+        console.log('beforeEvent !!!')
+        scope['oFormValues'][sMode]['background_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['background_color_rgba']);
+        scope['oFormValues'][sMode]['contour_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['contour_color_rgba']);
+        scope['oFormValues'][sMode]['color_label'] = parseColorFromRGBA(scope['oFormValues'][sMode]['color_label_rgba']);
+    };
+    
+    if (angular.isDefined(scope['oFormValues']['update'])) {
+        scope['oFormValues']['update']['background_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['background_color']);
+        scope['oFormValues']['update']['contour_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['contour_color']);
+        scope['oFormValues']['update']['color_label_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['color_label']);
+    }
+
+    // Ajoute BeforeEvent
+    scope['oFormDefinition']['update']['beforeEvent'] = function () {
+        beforeEvent('update');
+    };
+    scope['oFormDefinition']['insert']['beforeEvent'] = function () {
+        beforeEvent('insert');
+    };
+
+    //////////////////////////////////////////////////////////
+    // Ajouter vos Elément à détruire (variable, function, watcher) à oFormRequired.toDestructor
+};
+
+
+
+/**
+ * destructor_form
+ * Fonction appelé quand on quitte le formulaire nettoie toute les fonctions pour les rendres inutilisable en dehors du formulaire
+ * @returns {undefined}
+ */
+var destructor_form = function () {
+
+    for (var i = 0; i < oFormRequired.toDestructor.length; i++) {
+        oFormRequired.toDestructor[i] = undefined;
+        delete oFormRequired.toDestructor[i];
+    }
+
+    //supprimer la balise script du js pour pouvoir le recharger si on reviens sur le formulaire plus tard
+    angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove();
+
+    oFormRequired = undefined;
+    delete oFormRequired;
+
+    constructor_form = undefined;
+    delete constructor_form;
+    destructor_form = undefined;
+    delete destructor_form;
+};
+
+/**********************************************************************************/
+
+
diff --git a/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/default.js b/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/default.js
new file mode 100755
index 0000000000000000000000000000000000000000..de066e6fbd1e478806f3a70d18c66444d6624d81
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/default.js
@@ -0,0 +1,109 @@
+/* global angular, goog */
+// CUSTOM
+//bloque les delete du destructeur à éviter
+//'use strict';
+
+/***********************************************************************************
+ vmap_dessin Javascript
+ ***********************************************************************************/
+
+var oFormRequired = {
+    "sUrl": "",
+    "scope_": {},
+    "toDestructor": []
+};
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire si dans la structure json javascript vaut "true"
+ * @param {type} scope
+ * @param {type} s_url
+ * @returns {undefined}
+ */
+var constructor_form = function (scope, s_url) {
+    //////////////////////////////////////////////////////////
+    //Ne pas toucher
+    console.log("constructor_form");
+
+    oFormRequired.sUrl = s_url;
+    oFormRequired.scope_ = scope;
+        
+    var parseColorFromRGBA = function (rgba) {
+        if (isRGBA(rgba)) {
+            var matchColors = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
+            var match = matchColors.exec(rgba);
+            var color = match[1] + ' ' + match[2] + ' ' + match[3];
+        } else {
+            color = rgba;
+        }
+        return color;
+    };
+
+    var parseColorToRGBA = function (color) {
+        if (isRGBA(color))
+            var rgba = color;
+        else
+            var rgba = 'rgba(' + color.replace(/ /g, ',') + ',1)';
+        return rgba;
+    };
+
+    var isRGBA = function (color) {
+        if (color.substring(0, 4) === 'rgba')
+            return true;
+        else
+            return false;
+    };
+
+    var beforeEvent = function (sMode) {
+        console.log('beforeEvent !!!')
+        scope['oFormValues'][sMode]['background_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['background_color_rgba']);
+        scope['oFormValues'][sMode]['contour_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['contour_color_rgba']);
+        scope['oFormValues'][sMode]['color_label'] = parseColorFromRGBA(scope['oFormValues'][sMode]['color_label_rgba']);
+    };
+    
+    if (angular.isDefined(scope['oFormValues']['update'])) {
+        scope['oFormValues']['update']['background_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['background_color']);
+        scope['oFormValues']['update']['contour_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['contour_color']);
+        scope['oFormValues']['update']['color_label_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['color_label']);
+    }
+
+    // Ajoute BeforeEvent
+    scope['oFormDefinition']['update']['beforeEvent'] = function () {
+        beforeEvent('update');
+    };
+    scope['oFormDefinition']['insert']['beforeEvent'] = function () {
+        beforeEvent('insert');
+    };
+
+    //////////////////////////////////////////////////////////
+    // Ajouter vos Elément à détruire (variable, function, watcher) à oFormRequired.toDestructor
+};
+
+
+
+/**
+ * destructor_form
+ * Fonction appelé quand on quitte le formulaire nettoie toute les fonctions pour les rendres inutilisable en dehors du formulaire
+ * @returns {undefined}
+ */
+var destructor_form = function () {
+
+    for (var i = 0; i < oFormRequired.toDestructor.length; i++) {
+        oFormRequired.toDestructor[i] = undefined;
+        delete oFormRequired.toDestructor[i];
+    }
+
+    //supprimer la balise script du js pour pouvoir le recharger si on reviens sur le formulaire plus tard
+    angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove();
+
+    oFormRequired = undefined;
+    delete oFormRequired;
+
+    constructor_form = undefined;
+    delete constructor_form;
+    destructor_form = undefined;
+    delete destructor_form;
+};
+
+/**********************************************************************************/
+
+
diff --git a/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/published.js b/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/published.js
new file mode 100755
index 0000000000000000000000000000000000000000..de066e6fbd1e478806f3a70d18c66444d6624d81
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/forms/ressources/published.js
@@ -0,0 +1,109 @@
+/* global angular, goog */
+// CUSTOM
+//bloque les delete du destructeur à éviter
+//'use strict';
+
+/***********************************************************************************
+ vmap_dessin Javascript
+ ***********************************************************************************/
+
+var oFormRequired = {
+    "sUrl": "",
+    "scope_": {},
+    "toDestructor": []
+};
+/**
+ * constructor_form
+ * Fonction appelé à l'initialisation du formulaire si dans la structure json javascript vaut "true"
+ * @param {type} scope
+ * @param {type} s_url
+ * @returns {undefined}
+ */
+var constructor_form = function (scope, s_url) {
+    //////////////////////////////////////////////////////////
+    //Ne pas toucher
+    console.log("constructor_form");
+
+    oFormRequired.sUrl = s_url;
+    oFormRequired.scope_ = scope;
+        
+    var parseColorFromRGBA = function (rgba) {
+        if (isRGBA(rgba)) {
+            var matchColors = /rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)/;
+            var match = matchColors.exec(rgba);
+            var color = match[1] + ' ' + match[2] + ' ' + match[3];
+        } else {
+            color = rgba;
+        }
+        return color;
+    };
+
+    var parseColorToRGBA = function (color) {
+        if (isRGBA(color))
+            var rgba = color;
+        else
+            var rgba = 'rgba(' + color.replace(/ /g, ',') + ',1)';
+        return rgba;
+    };
+
+    var isRGBA = function (color) {
+        if (color.substring(0, 4) === 'rgba')
+            return true;
+        else
+            return false;
+    };
+
+    var beforeEvent = function (sMode) {
+        console.log('beforeEvent !!!')
+        scope['oFormValues'][sMode]['background_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['background_color_rgba']);
+        scope['oFormValues'][sMode]['contour_color'] = parseColorFromRGBA(scope['oFormValues'][sMode]['contour_color_rgba']);
+        scope['oFormValues'][sMode]['color_label'] = parseColorFromRGBA(scope['oFormValues'][sMode]['color_label_rgba']);
+    };
+    
+    if (angular.isDefined(scope['oFormValues']['update'])) {
+        scope['oFormValues']['update']['background_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['background_color']);
+        scope['oFormValues']['update']['contour_color_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['contour_color']);
+        scope['oFormValues']['update']['color_label_rgba'] = parseColorToRGBA(scope['oFormValues']['update']['color_label']);
+    }
+
+    // Ajoute BeforeEvent
+    scope['oFormDefinition']['update']['beforeEvent'] = function () {
+        beforeEvent('update');
+    };
+    scope['oFormDefinition']['insert']['beforeEvent'] = function () {
+        beforeEvent('insert');
+    };
+
+    //////////////////////////////////////////////////////////
+    // Ajouter vos Elément à détruire (variable, function, watcher) à oFormRequired.toDestructor
+};
+
+
+
+/**
+ * destructor_form
+ * Fonction appelé quand on quitte le formulaire nettoie toute les fonctions pour les rendres inutilisable en dehors du formulaire
+ * @returns {undefined}
+ */
+var destructor_form = function () {
+
+    for (var i = 0; i < oFormRequired.toDestructor.length; i++) {
+        oFormRequired.toDestructor[i] = undefined;
+        delete oFormRequired.toDestructor[i];
+    }
+
+    //supprimer la balise script du js pour pouvoir le recharger si on reviens sur le formulaire plus tard
+    angular.element('[src="' + oFormRequired.sUrl + '?version=' + oFormRequired.scope_["oProperties"]["build"] + '"]').remove();
+
+    oFormRequired = undefined;
+    delete oFormRequired;
+
+    constructor_form = undefined;
+    delete constructor_form;
+    destructor_form = undefined;
+    delete destructor_form;
+};
+
+/**********************************************************************************/
+
+
diff --git a/src/module_vmap/storage/veremes_demo_dessin/json/business_object.json b/src/module_vmap/storage/veremes_demo_dessin/json/business_object.json
new file mode 100755
index 0000000000000000000000000000000000000000..6e193dafff5fdf77677c0e477528edd0f98d7b6d
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/json/business_object.json
@@ -0,0 +1,20 @@
+{  
+   "business_object_id":"vmap_dessin",
+   "title":"Dessin",
+   "id_field":"draw_id",
+   "database":"vmap_angular",
+   "schema":"[TABLE_SCHEMA]",
+   "table":"v_draw",
+   "sql_summary":"select draw_id, description, text_label from [TABLE_SCHEMA].v_draw",
+   "sql_list":"select draw_id as \"Id\", text_label as \"Nom\" , area,  perimeter from [TABLE_SCHEMA].v_draw",
+   "sorted_by":"draw_id",
+   "geom_column":"geom",
+   "search_field":"draw_id",
+   "result_field":"draw_id",
+   "search_use_strict":"left",
+   "event_id":null,
+   "index":0,
+   "add_form_size":1,
+   "edit_form_size":1,
+   "display_form_size":1
+}
diff --git a/src/module_vmap/storage/veremes_demo_dessin/json/event.json b/src/module_vmap/storage/veremes_demo_dessin/json/event.json
new file mode 100755
index 0000000000000000000000000000000000000000..b1cc925ba0806aea91147e0d6f24138d16dc8fed
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/json/event.json
@@ -0,0 +1,4 @@
+{
+	"event_id":"veremes_demo_dessin_event",
+	"description":"Événement appelé lorsque veremes_demo_dessin change"
+}
diff --git a/src/module_vmap/storage/veremes_demo_dessin/json/mapserver_layers.json b/src/module_vmap/storage/veremes_demo_dessin/json/mapserver_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..5155634a2c2295191865d567b50548d370d1af44
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/json/mapserver_layers.json
@@ -0,0 +1,65 @@
+[{  
+   "ms_layer_id":30,
+   "name":"Dessin_Point",
+   "title":"Dessin Point",
+   "coordsys_id":2154,
+   "coordsys_label":"[EPSG:2154]-RGF93\/Lambert-93",
+   "source_id":null,
+   "connection_id":2,
+   "tableschema":"[TABLE_SCHEMA]",
+   "tablename":"v_draw_point",
+   "tableidfield":"draw_id",
+   "definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS ON\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tLABELITEM \"text_label\"\r\n\tCLASS\r\n\t\tNAME \"Dessin ponctuel\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\t\tSYMBOL \"circle\"\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tSIZE [geom_size]\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin ponctuel\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"f\")\r\n\t\tSTYLE\r\n\t\t\tSYMBOL \"circle\"\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tSIZE [geom_size]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin ponctuel\"\r\n\t\tEXPRESSION ('[graph]' eq \"f\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\tEND\r\n\tEND\r\nEND\r\n\r\n",
+   "active":true,
+   "opacity":100,
+   "ms_layertype_id":"POINT",
+   "private_connection":true,
+   "connection_label":"Connexion privée",
+   "source_label":null,
+   "definitiontmp":null,
+   "database":null,
+   "wmsservices":"",
+   "wmsservices_label":""
+}, {  
+   "ms_layer_id":31,
+   "name":"Dessin_Ligne",
+   "title":"Dessin Ligne",
+   "coordsys_id":2154,
+   "coordsys_label":"[EPSG:2154]-RGF93\/Lambert-93",
+   "source_id":null,
+   "connection_id":2,
+   "tableschema":"[TABLE_SCHEMA]",
+   "tablename":"v_draw_line",
+   "tableidfield":"draw_id",
+   "definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS ON\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tLABELITEM \"text_label\"\r\n\tCLASS\r\n\t\tNAME \"Dessin lin\u00e9aire\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin lin\u00e9aire\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"f\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tCOLOR [background_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin lin\u00e9aire\"\r\n\t\tEXPRESSION ('[graph]' eq \"f\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION UC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\nEND",
+   "active":true,
+   "opacity":100,
+   "ms_layertype_id":"LINE",
+   "private_connection":true,
+   "connection_label":"Connexion privée",
+   "source_label":null,
+   "database":null,
+   "wmsservices":"",
+   "wmsservices_label":""
+}, {  
+   "ms_layer_id":32,
+   "name":"Dessin_Polygone",
+   "title":"Dessin Polygone",
+   "coordsys_id":2154,
+   "coordsys_label":"[EPSG:2154]-RGF93\/Lambert-93",
+   "source_id":null,
+   "connection_id":2,
+   "tableschema":"[TABLE_SCHEMA]",
+   "tablename":"v_draw_poly",
+   "tableidfield":"draw_id",
+   "definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS ON\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\t\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.1.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tLABELITEM \"text_label\"\r\n\r\n\tCLASS\r\n\t\tNAME \"Dessin surfacique\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\t\tCOLOR [background_color]\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION CC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin surfacique\"\r\n\t\tEXPRESSION ('[graph]' eq \"t\" AND '[label]' eq \"f\")\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR [contour_color]\r\n\t\t\tWIDTH [geom_size]\r\n\t\t\tCOLOR [background_color]\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dessin surfacique\"\r\n\t\tEXPRESSION ('[graph]' eq \"f\" AND '[label]' eq \"t\")\r\n\t\tSTYLE\r\n\t\tEND\r\n\t\tLABEL\r\n\t\t\tTYPE TRUETYPE\r\n\t\t\tFONT \"Arial\"\r\n\t\t\tANGLE AUTO\r\n\t\t\tSIZE [text_size]\r\n\t\t\tPOSITION CC\r\n\t\t\tCOLOR [color_label]\r\n\t\t\tWRAP \"|\"\r\n\t\tEND\r\n\tEND\r\nEND",
+   "active":true,
+   "opacity":100,
+   "ms_layertype_id":"POLYGON",
+   "private_connection":true,
+   "connection_label":"Connexion privée",
+   "source_label":null,
+   "database":null,
+   "wmsservices":"",
+   "wmsservices_label":""
+}]
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_demo_dessin/package.json b/src/module_vmap/storage/veremes_demo_dessin/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..9bf4d6f5d5352f715d621d0dc0e242a4cea01bec
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/package.json
@@ -0,0 +1,5 @@
+{
+	"author": "Armand",
+	"mame": "veremes_demo_dessin",
+	"description": "Objet métier permettant la visualisation des dessins"
+}
diff --git a/src/module_vmap/storage/veremes_demo_dessin/sql/structure.json b/src/module_vmap/storage/veremes_demo_dessin/sql/structure.json
new file mode 100755
index 0000000000000000000000000000000000000000..f475b4532a7340d10f1fe9f7f55dd927be466c29
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/sql/structure.json
@@ -0,0 +1,6 @@
+{
+	"schema": "s_draw",
+	"srid": "2154",
+	"tables": ["draw, v_draw, v_draw_line, v_draw_poly, v_draw_point"],
+	"sequences": ["seq_draw"]
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_demo_dessin/sql/table.sql b/src/module_vmap/storage/veremes_demo_dessin/sql/table.sql
new file mode 100755
index 0000000000000000000000000000000000000000..1b037df8a4c2628c91e09dddd04cb350d8664a56
--- /dev/null
+++ b/src/module_vmap/storage/veremes_demo_dessin/sql/table.sql
@@ -0,0 +1,282 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.3.14
+-- Dumped by pg_dump version 9.5.6
+
+-- Started on 2017-06-07 09:12:15 CEST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+-- SET row_security = off;
+
+SET search_path = [TABLE_SCHEMA], pg_catalog;
+
+--
+-- TOC entry 452 (class 1259 OID 67429)
+-- Name: seq_draw; Type: SEQUENCE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE SEQUENCE seq_draw
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = true;
+
+--
+-- TOC entry 453 (class 1259 OID 67620)
+-- Name: draw; Type: TABLE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE TABLE draw (
+    draw_id integer DEFAULT nextval('seq_draw'::regclass) NOT NULL,
+    theme character varying(50),
+    comments text,
+    description character varying(255),
+    text_size integer,
+    geom_size integer,
+    user_id integer,
+    label boolean DEFAULT true,
+    graph boolean DEFAULT true,
+    contour_color character varying(50),
+    background_color character varying(50),
+    color_label character varying(50),
+    area character varying(30),
+    area_label boolean,
+    perimeter character varying(30),
+    perimeter_label boolean,
+    text_label character varying(255),
+    geom public.geometry(Geometry,[SRID]),
+    CONSTRAINT enforce_dims_geom CHECK ((public.st_ndims(geom) = 2)),
+    CONSTRAINT enforce_srid_geom CHECK ((public.st_srid(geom) = [SRID]))
+);
+
+
+--
+-- TOC entry 490 (class 1259 OID 68425)
+-- Name: v_draw; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE (("user".login)::name = "current_user"())
+  ORDER BY draw.draw_id DESC;
+
+
+--
+-- TOC entry 454 (class 1259 OID 67686)
+-- Name: v_draw_line; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw_line AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE ((public.st_geometrytype(draw.geom) ~~ '%Line%'::text) AND (("user".login)::name = "current_user"()));
+
+
+--
+-- TOC entry 455 (class 1259 OID 67691)
+-- Name: v_draw_point; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw_point AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE ((public.st_geometrytype(draw.geom) ~~ '%Point%'::text) AND (("user".login)::name = "current_user"()));
+
+
+--
+-- TOC entry 456 (class 1259 OID 67696)
+-- Name: v_draw_poly; Type: VIEW; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE VIEW v_draw_poly AS
+ SELECT draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    "user".login
+   FROM (draw
+     JOIN s_vitis."user" ON ((draw.user_id = "user".user_id)))
+  WHERE ((public.st_geometrytype(draw.geom) ~~ '%Polygon%'::text) AND (("user".login)::name = "current_user"()));
+
+
+--
+-- TOC entry 3985 (class 2606 OID 67632)
+-- Name: pk_draw; Type: CONSTRAINT; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+ALTER TABLE ONLY draw
+    ADD CONSTRAINT pk_draw PRIMARY KEY (draw_id);
+
+
+--
+-- TOC entry 3983 (class 1259 OID 67677)
+-- Name: dessin_geom; Type: INDEX; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE INDEX dessin_geom ON draw USING gist (geom);
+
+
+--
+-- TOC entry 4211 (class 2618 OID 68430)
+-- Name: delete_v_draw; Type: RULE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE RULE delete_v_draw AS
+    ON DELETE TO v_draw DO INSTEAD  DELETE FROM draw
+  WHERE (draw.draw_id = old.draw_id);
+
+
+--
+-- TOC entry 4212 (class 2618 OID 68431)
+-- Name: insert_v_draw; Type: RULE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE RULE insert_v_draw AS
+    ON INSERT TO v_draw DO INSTEAD  INSERT INTO draw (theme, comments, description, text_size, user_id, label, contour_color, background_color, color_label, geom, graph, geom_size, area, area_label, perimeter, perimeter_label, text_label)
+  VALUES (new.theme, new.comments, new.description, new.text_size, ( SELECT "user".user_id
+           FROM s_vitis."user"
+          WHERE (("user".login)::name = "current_user"())), new.label, new.contour_color, new.background_color, new.color_label, new.geom, new.graph, new.geom_size, new.area, new.area_label, new.perimeter, new.perimeter_label, new.text_label)
+  RETURNING draw.draw_id,
+    draw.theme,
+    draw.comments,
+    draw.description,
+    draw.text_size,
+    draw.geom_size,
+    draw.contour_color,
+    draw.background_color,
+    draw.color_label,
+    draw.user_id,
+    draw.label,
+    draw.graph,
+    draw.area,
+    draw.area_label,
+    draw.perimeter,
+    draw.perimeter_label,
+    draw.text_label,
+    "substring"(public.st_astext(draw.geom), 1, ("position"(public.st_astext(draw.geom), '('::text) - 1)) AS geom_type,
+    draw.geom,
+    ''::character varying AS "varchar";
+
+
+--
+-- TOC entry 4213 (class 2618 OID 68433)
+-- Name: update_v_draw; Type: RULE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+CREATE RULE update_v_draw AS
+    ON UPDATE TO v_draw DO INSTEAD  UPDATE draw SET draw_id = new.draw_id, theme = new.theme, comments = new.comments, description = new.description, text_size = new.text_size, user_id = new.user_id, label = new.label, contour_color = new.contour_color, background_color = new.background_color, color_label = new.color_label, geom = new.geom, graph = new.graph, geom_size = new.geom_size, area = new.area, area_label = new.area_label, perimeter = new.perimeter, perimeter_label = new.perimeter_label, text_label = new.text_label
+  WHERE (draw.draw_id = new.draw_id);
+
+
+--
+-- TOC entry 3986 (class 2606 OID 67633)
+-- Name: fk_user_login; Type: FK CONSTRAINT; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+ALTER TABLE ONLY draw
+    ADD CONSTRAINT fk_user_login FOREIGN KEY (user_id) REFERENCES s_vitis."user"(user_id) ON DELETE CASCADE;
+
+
+GRANT USAGE ON SCHEMA [TABLE_SCHEMA] TO vmap_user;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].v_draw TO vmap_user;
+GRANT SELECT ON TABLE [TABLE_SCHEMA].v_draw_point TO vmap_user;
+GRANT SELECT ON TABLE [TABLE_SCHEMA].v_draw_line TO vmap_user;
+GRANT SELECT ON TABLE [TABLE_SCHEMA].v_draw_poly TO vmap_user;
+GRANT SELECT, UPDATE ON SEQUENCE [TABLE_SCHEMA].seq_draw TO vmap_user;
+
+
+-- Completed on 2017-06-07 09:12:21 CEST
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/src/module_vmap/storage/veremes_oads_dossier/forms/custom.json b/src/module_vmap/storage/veremes_oads_dossier/forms/custom.json
new file mode 100755
index 0000000000000000000000000000000000000000..ae1448e7e7194b560893a1745c9c07af253b30a8
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/forms/custom.json
@@ -0,0 +1,175 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,	
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "author_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "create_date_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "modifier_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "update_date_6_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num",
+            "author",
+            "create_date",
+            "modifier",
+            "update_date"
+          ]
+        }
+      ]
+    }
+  },
+  "search": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": []
+        }
+      ]
+    }
+  },
+  "insert": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "update": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "datasources": {}
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/forms/default.json b/src/module_vmap/storage/veremes_oads_dossier/forms/default.json
new file mode 100755
index 0000000000000000000000000000000000000000..6c38ec4625b9209da63c12cde01665c990a9dabf
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/forms/default.json
@@ -0,0 +1,259 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_id",
+            "label": "dossier_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      }
+    ]
+  },
+  "search": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": []
+  },
+  "insert": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "integer",
+            "name": "dossier_id",
+            "label": "dossier_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12
+          }
+        ]
+      }
+    ]
+  },
+  "update": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "integer",
+            "name": "dossier_id",
+            "label": "dossier_id",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_id_1_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "author_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "create_date_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "modifier_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "update_date_6_1"
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/forms/published.json b/src/module_vmap/storage/veremes_oads_dossier/forms/published.json
new file mode 100755
index 0000000000000000000000000000000000000000..7dd25b34d74901abb86a2b664e61b8e1473a4f14
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/forms/published.json
@@ -0,0 +1,175 @@
+{
+  "display": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "author",
+            "label": "author",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "author_3_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "create_date",
+            "label": "create_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "create_date_4_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "modifier",
+            "label": "modifier",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "modifier_5_1"
+          }
+        ]
+      },
+      {
+        "fields": [
+          {
+            "type": "label",
+            "name": "update_date",
+            "label": "update_date",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "update_date_6_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num",
+            "author",
+            "create_date",
+            "modifier",
+            "update_date"
+          ]
+        }
+      ]
+    }
+  },
+  "search": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": []
+        }
+      ]
+    }
+  },
+  "insert": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "update": {
+    "name": "custom-form",
+    "title": "veremes_soads_dossier",
+    "input_size": "xxs",
+    "nb_cols": 12,
+    "javascript": false,
+    "rows": [
+      {
+        "fields": [
+          {
+            "type": "text",
+            "name": "dossier_num",
+            "label": "dossier_num",
+            "disabled": false,
+            "required": false,
+            "nb_cols": 12,
+            "id": "dossier_num_2_1"
+          }
+        ]
+      }
+    ],
+    "tabs": {
+      "position": "top",
+      "list": [
+        {
+          "label": "Tab 0",
+          "elements": [
+            "dossier_num"
+          ]
+        }
+      ]
+    }
+  },
+  "datasources": {}
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/json/business_object.json b/src/module_vmap/storage/veremes_oads_dossier/json/business_object.json
new file mode 100755
index 0000000000000000000000000000000000000000..77975551b01082b308ecb63c546e4f9c10e9dbca
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/json/business_object.json
@@ -0,0 +1,20 @@
+{  
+	"business_object_id":"veremes_oads_dossier",
+	"title":"veremes_oads_dossier",
+	"id_field":"dossier_num",
+	"database":"vmap",
+	"schema":"[TABLE_SCHEMA]",
+	"table":"dossier",
+	"sql_summary":"SELECT commune as \"Commune\", code_insee as \"Code INSEE\", type_dossier as \"Type du dossier\", dossier_num as \"Numéro du dossier\", author as \"Créateur\", create_date as \"Date de création\", modifier as \"Mise à jour\", update_date as \"Date de màj\"  FROM veremes_oads.v_dossier",
+	"sql_list":"SELECT dossier_num, code_insee, commune, division, annee_dossier, type_dossier, creation_automatique,author, create_date, modifier, update_date  FROM [TABLE_SCHEMA].v_dossier",
+	"sorted_by":"dossier_num",
+	"geom_column":"geom",
+	"search_field":"dossier_num",
+	"result_field":"dossier_num",
+	"search_use_strict":"left",
+	"event_id":null,
+	"index":2,
+	"add_form_size":1,
+	"edit_form_size":1,
+	"display_form_size":1
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/json/event.json b/src/module_vmap/storage/veremes_oads_dossier/json/event.json
new file mode 100755
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/json/event.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/json/mapserver_layers.json b/src/module_vmap/storage/veremes_oads_dossier/json/mapserver_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..aeae16f8a4579be2be0e52b787524fa99918b2a1
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/json/mapserver_layers.json
@@ -0,0 +1,45 @@
+[{  
+	"ms_layer_id":80,
+	"name":"Oads_dossier",
+	"title":"Oads_dossier",
+	"coordsys_id":2154,
+	"coordsys_label":"[EPSG:2154]-RGF93/Lambert-93",
+	"source_id":null,
+	"connection_id":6,
+	"tableschema":"veremes_oads",
+	"tablename":"v_dossier",
+	"tableidfield":"dossier_num",
+	"definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS DEFAULT\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154 EPSG:3857\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image\/png\"\r\n\tEND\r\n\r\n\tCLASS\r\n\t\tNAME \"Dossier\"\r\n\t\tSTYLE\r\n\t\t\tCOLOR \"#FF9896\"\r\n\t\t\tOUTLINECOLOR \"#A553A5\"\r\n\t\t\tSIZE 1\r\n\t\tEND\r\n\tEND\r\nEND",
+	"active":true,
+	"opacity":70,
+	"ms_layertype_id":"POLYGON",
+	"private_connection":true,
+	"connection_label":"Connexion privée",
+	"source_label":null,
+	"definitiontmp":null,
+	"database":"vmap",
+	"wmsservices":"",
+   "wmsservices_label":""
+},{  
+	"ms_layer_id":90,
+	"name":"Oads_dossier_type",
+	"title":"Oads_dossier_type",
+	"coordsys_id":2154,
+	"coordsys_label":"[EPSG:2154]-RGF93/Lambert-93",
+	"source_id":null,
+	"connection_id":6,
+	"tableschema":"veremes_oads",
+	"tablename":"v_dossier",
+	"tableidfield":"dossier_num",
+	"definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS DEFAULT\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\tMAXSCALEDENOM 10000\r\n\t{COORDSYS}\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image/png\"\r\n\tEND\r\n\tFILTER ([type_dossier] = ''%type_dossier%'' or ''%type_dossier%'' = ''-1000000'')\r\n\tVALIDATION\r\n\t\t''type_dossier'' ''^[a-zA-Z0-9_|]*$''\r\n\t\t''default_type_dossier'' ''-1000000''\r\n\tEND\r\n\r\n\tCLASS\r\n\t\tNAME \"PC\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"PC\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#FFC240\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"AT\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"AT\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#4E7887\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"CU\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"CU\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#129E18\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"DIA\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"DIA\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#BDB300\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"DP\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"DP\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#2E9BE8\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"PA\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"PA\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#F200FF\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"PD\"\r\n\t\tEXPRESSION (\"[type_dossier]\" = \"PD\")\r\n\t\tSTYLE\r\n\t\t\tGEOMTRANSFORM \"centroid\"\r\n\t\t\tSYMBOL 'circle'\r\n\t\t\tCOLOR \"#FA2525\"\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tSIZE 20\r\n\t\t\tWIDTH 1\r\n\t\tEND\r\n\tEND\r\n\tEND",
+	"active":true,
+	"opacity":100,
+	"ms_layertype_id":"POLYGON",
+	"private_connection":true,
+	"connection_label":"Connexion privée",
+	"source_label":null,
+	"definitiontmp":null,
+	"database":"vmap",
+	"wmsservices":"",
+   "wmsservices_label":""
+}]
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/package.json b/src/module_vmap/storage/veremes_oads_dossier/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..e509782f3ec924bdc7d9501d8ad05c99e65b08b4
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/package.json
@@ -0,0 +1,5 @@
+{
+	"author": "Laurent",
+	"mame": "veremes_oads_dossier",
+	"description": "Objet métier permettant la visualisation des dossiers OpenAds"
+}
diff --git a/src/module_vmap/storage/veremes_oads_dossier/sql/structure.json b/src/module_vmap/storage/veremes_oads_dossier/sql/structure.json
new file mode 100755
index 0000000000000000000000000000000000000000..7dcd23b6b249f98b8af4beac1abedc13c7ad508d
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/sql/structure.json
@@ -0,0 +1,6 @@
+{
+	"schema": "veremes_oads",
+	"srid": "2154",
+	"tables": ["dossier, parcelle_dossier, parcelle_oads, v_dossier, v_parcelle_dossier"],
+	"sequences": [""]
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_dossier/sql/table.sql b/src/module_vmap/storage/veremes_oads_dossier/sql/table.sql
new file mode 100755
index 0000000000000000000000000000000000000000..463a9356cf78bfd56d30b7465e51786c7990f0b4
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_dossier/sql/table.sql
@@ -0,0 +1,194 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.3.14
+-- Dumped by pg_dump version 9.5.6
+
+-- Started on 2017-06-07 09:12:15 CEST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+-- SET row_security = off;
+
+SET search_path = [TABLE_SCHEMA], public, pg_catalog;
+
+--
+-- TOC entry 452 (class 1259 OID 67429)
+-- Name: seq_draw; Type: SEQUENCE; Schema: [TABLE_SCHEMA]; Owner: -
+--
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = true;
+  
+select s_vitis.create_role_if_not_exists('oads_user', 'NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION'); 
+INSERT INTO s_vitis.privileges(rolname, description) VALUES ('oads_user', 'rôle utilisateur du module Open Ads de vMap"');
+
+CREATE TABLE [TABLE_SCHEMA].dossier
+(
+  dossier_num character varying(30) NOT NULL,
+  author character varying(50),
+  create_date date,
+  modifier character varying(50),
+  update_date date,
+  geom geometry(MultiPolygon,2154),
+  CONSTRAINT pk_dossier_num PRIMARY KEY (dossier_num),
+  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
+  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 2154)
+)
+WITH (
+  OIDS=FALSE
+);
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.author  IS 'Auteur de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.create_date  IS 'Date de création de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.modifier  IS 'Dernier modificateur de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.update_date  IS 'Date de la dernière mise à jour de l''enregistrement';
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.geom  IS 'Emprise globale du dossier';
+
+
+CREATE TABLE [TABLE_SCHEMA].parcelle_dossier
+(
+  dossier_num character varying(30) NOT NULL,
+  id_par character(14) NOT NULL,
+  CONSTRAINT pk_dossier_num_id_par PRIMARY KEY (dossier_num, id_par)
+)
+WITH (
+  OIDS=FALSE
+);
+  
+   
+CREATE TABLE [TABLE_SCHEMA].parcelle_oads
+(
+  id_par character(14) NOT NULL,
+  geom geometry(MultiPolygon,2154),
+  CONSTRAINT pk_id_par PRIMARY KEY (id_par),
+  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
+  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 2154)
+)
+WITH (
+  OIDS=FALSE
+);
+COMMENT ON COLUMN [TABLE_SCHEMA].dossier.geom  IS 'geométrie de la parcelle ';
+
+CREATE TRIGGER insert_author_date_dossier
+  BEFORE INSERT
+  ON [TABLE_SCHEMA].dossier
+  FOR EACH ROW
+  EXECUTE PROCEDURE s_vitis.insert_author_date();
+
+CREATE TRIGGER update_modifier_date_dossier
+  BEFORE UPDATE
+  ON [TABLE_SCHEMA].dossier
+  FOR EACH ROW
+  EXECUTE PROCEDURE s_vitis.update_modifier_date();
+
+-- Index: [TABLE_SCHEMA].dossier_geom
+-- DROP INDEX [TABLE_SCHEMA].dossier_geom;
+
+CREATE INDEX dossier_geom
+  ON [TABLE_SCHEMA].dossier
+  USING gist
+  (geom);
+
+-- Index: [TABLE_SCHEMA].dossier_geom
+-- DROP INDEX [TABLE_SCHEMA].dossier_geom;
+
+CREATE INDEX parcelle_oads_geom
+  ON [TABLE_SCHEMA].parcelle_oads
+  USING gist
+  (geom);
+
+CREATE OR REPLACE VIEW [TABLE_SCHEMA].v_dossier AS   
+ SELECT dossier.dossier_num, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 4, 5)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 5, 5)
+            ELSE '50'::text
+        END AS code_insee, 
+    v_vmap_commune.nom AS commune, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 11, 1)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 12, 1)
+            ELSE NULL::text
+        END AS division, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 9, 2)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 10, 2)
+            ELSE NULL::text
+        END AS annee_dossier, 
+        CASE
+            WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 1, 2)
+            WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 1, 3)
+            ELSE NULL::text
+        END AS type_dossier, 
+        CASE
+            WHEN dossier.author::text IS NULL THEN 'Oui'::text
+            ELSE 'Non'::text
+        END AS creation_automatique, 
+    dossier.author, dossier.create_date, dossier.modifier, dossier.update_date, 
+    dossier.geom
+   FROM [TABLE_SCHEMA].dossier
+   LEFT JOIN s_cadastre.v_vmap_commune ON 
+   CASE
+       WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 4, 5)
+       WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 5, 5)
+       ELSE NULL::text
+   END = v_vmap_commune.id_com::text
+  WHERE 
+   CASE
+       WHEN length(dossier.dossier_num::text) = 15 OR length(dossier.dossier_num::text) = 17 THEN substr(dossier.dossier_num::text, 4, 5)
+       WHEN length(dossier.dossier_num::text) = 16 OR length(dossier.dossier_num::text) = 18 THEN substr(dossier.dossier_num::text, 5, 5)
+       ELSE NULL::text
+   END ~ similar_escape(( SELECT "user".restriction
+      FROM s_vitis."user"
+     WHERE "user".login::name = "current_user"()), NULL::text)
+  ORDER BY dossier.dossier_num DESC;
+
+-- Rule: delete_v_dossier ON [TABLE_SCHEMA].v_dossier
+
+-- DROP RULE delete_v_dossier ON [TABLE_SCHEMA].v_dossier;
+
+CREATE OR REPLACE RULE delete_v_dossier AS
+    ON DELETE TO [TABLE_SCHEMA].v_dossier DO INSTEAD  DELETE FROM [TABLE_SCHEMA].dossier
+  WHERE dossier.dossier_num = old.dossier_num;
+
+-- Rule: insert_v_dossier ON [TABLE_SCHEMA].v_dossier
+
+-- DROP RULE insert_v_dossier ON [TABLE_SCHEMA].v_dossier;
+
+CREATE OR REPLACE RULE insert_v_dossier AS
+    ON INSERT TO [TABLE_SCHEMA].v_dossier DO INSTEAD  INSERT INTO [TABLE_SCHEMA].dossier ( dossier_num, author, create_date, geom)
+  VALUES (new.dossier_num, "current_user"()::text, 'now'::text::date, new.geom);
+
+-- Rule: update_v_dossier ON [TABLE_SCHEMA].v_dossier
+-- DROP RULE update_v_dossier ON [TABLE_SCHEMA].v_dossier;
+
+CREATE OR REPLACE RULE update_v_dossier AS
+    ON UPDATE TO [TABLE_SCHEMA].v_dossier DO INSTEAD  UPDATE [TABLE_SCHEMA].dossier SET geom = new.geom
+  WHERE dossier.dossier_num = new.dossier_num;
+  
+
+ALTER TABLE [TABLE_SCHEMA].dossier OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].dossier TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].dossier TO oads_user;
+
+ALTER TABLE [TABLE_SCHEMA].parcelle_dossier OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].parcelle_dossier TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].parcelle_dossier TO oads_user;
+
+ALTER TABLE [TABLE_SCHEMA].parcelle_oads OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].parcelle_oads TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].parcelle_oads TO oads_user;
+
+ALTER TABLE [TABLE_SCHEMA].v_dossier OWNER TO u_vitis;
+GRANT ALL ON TABLE [TABLE_SCHEMA].v_dossier TO u_vitis;
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE [TABLE_SCHEMA].v_dossier TO oads_user;
+	
+	
+	
diff --git a/src/module_vmap/storage/veremes_oads_parcelle/json/business_object.json b/src/module_vmap/storage/veremes_oads_parcelle/json/business_object.json
new file mode 100755
index 0000000000000000000000000000000000000000..0b13c041db3596b2abd17c3ad5991a9410baa822
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_parcelle/json/business_object.json
@@ -0,0 +1,20 @@
+{  
+	"business_object_id":"veremes_oads_parcelle",
+	"title":"veremes_oads_parcelle",
+	"id_field":"id_par",
+	"database":"vitis_angular_vmap",
+	"schema":"veremes_oads",
+	"table":"v_parcelle_dossier",
+	"sql_summary":"select id_par as \"Parcelle\", dossier as \"Dossier\", '[bo_link href=\"{{getPropertie(''serveur_oads'')}}'||lien_dossier||'\" target=\"_blank\"]Lien vers OpenAds[/bo_link]' as \"OpenAds\" from veremes_oads.v_parcelle_dossier",
+	"sql_list":"select id_par from veremes_oads.v_parcelle_dossier",
+	"sorted_by":"id_par",
+	"geom_column":"geom",
+	"search_field":"id_par",
+	"result_field":"id_par",
+	"search_use_strict":"false",
+	"event_id":"",
+	"index":1,
+	"add_form_size":1,
+	"edit_form_size":1,
+	"display_form_size":1
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_parcelle/json/event.json b/src/module_vmap/storage/veremes_oads_parcelle/json/event.json
new file mode 100755
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_parcelle/json/event.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_parcelle/json/mapserver_layers.json b/src/module_vmap/storage/veremes_oads_parcelle/json/mapserver_layers.json
new file mode 100755
index 0000000000000000000000000000000000000000..3fcc08f190c6bb79528b1cbca39d63b357b763cd
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_parcelle/json/mapserver_layers.json
@@ -0,0 +1,23 @@
+[{  
+	"ms_layer_id":91,
+	"name":"Oads_parcelle",
+	"title":"Oads_parcelle",
+	"coordsys_id":2154,
+	"coordsys_label":"[EPSG:2154]-RGF93/Lambert-93",
+	"source_id":null,
+	"connection_id":6,
+	"tableschema":"veremes_oads",
+	"tablename":"parcelle_oads",
+	"tableidfield":"id_par",
+	"definition":"LAYER\r\n\tNAME \"{LAYER_NAME}\"\r\n\tTYPE {LAYER_TYPE}\r\n\tSTATUS DEFAULT\r\n\t{CONNECTION}\r\n\tDATA \"geom from {TABLE_SCHEMA}.{TABLE_NAME} USING SRID={SRID} USING UNIQUE {TABLE_ID}\"\r\n\tOPACITY {LAYER_OPACITY}\r\n\t{COORDSYS}\r\n\tMETADATA\r\n\t\t\"wms_title\" \t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_srs\" \t\t\t\t\"EPSG:2154\"\r\n\t\t\"wms_name\" \t\t\t\t\"{LAYER_NAME}\"\r\n\t\t\"wms_server_version\" \t\"1.3.0\"\r\n\t\t\"wms_format\" \t\t\t\"image/png\"\r\n\tEND\r\n\tCLASS\r\n\t\tNAME \"Dossier\"\r\n\t\tSTYLE\r\n\t\t\tCOLOR \"#FED4FE\"\r\n\tOPACITY 50\r\n\t\tEND\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR \"#FFFFFF\"\r\n\t\t\tWIDTH 5\r\n\t\tEND\r\n\t\tSTYLE\r\n\t\t\tOUTLINECOLOR \"#FF0000\"\r\n\t\t\tWIDTH 4\r\n\t\t\tLINECAP butt #[butt|round|square|triangle]\r\n\t\t\tLINEJOIN miter #[round|miter|bevel]\r\n\t\t\tLINEJOINMAXSIZE 2\r\n\t\t\tPATTERN 10 10 END\r\n\t\tEND\r\n\tEND\r\nEND",
+	"active":true,
+	"opacity":100,
+	"ms_layertype_id":"POLYGON",
+	"private_connection":true,
+	"connection_label":"Connexion privée",
+	"source_label":null,
+	"definitiontmp":"",
+	"database":"vmap",
+	"wmsservices":"",
+	"wmsservices_label":""
+}]
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_parcelle/package.json b/src/module_vmap/storage/veremes_oads_parcelle/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..461fcecdd13e7a4fb59d955713e58c571d7e39d1
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_parcelle/package.json
@@ -0,0 +1,5 @@
+{
+	"author": "Laurent",
+	"mame": "veremes_oads_parcelle",
+	"description": "Objet métier permettant la visualisation des parcelles d'un dossier OpenAds"
+}
diff --git a/src/module_vmap/storage/veremes_oads_parcelle/sql/structure.json b/src/module_vmap/storage/veremes_oads_parcelle/sql/structure.json
new file mode 100755
index 0000000000000000000000000000000000000000..5eb29353e070d15f766bc882dc5d45efbcf6e55f
--- /dev/null
+++ b/src/module_vmap/storage/veremes_oads_parcelle/sql/structure.json
@@ -0,0 +1,6 @@
+{
+	"schema": "",
+	"srid": "",
+	"tables": [""],
+	"sequences": [""]
+}
\ No newline at end of file
diff --git a/src/module_vmap/storage/veremes_oads_parcelle/sql/table.sql b/src/module_vmap/storage/veremes_oads_parcelle/sql/table.sql
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/module_vmap/web_service/ws/PrintMapServices.class.inc b/src/module_vmap/web_service/ws/PrintMapServices.class.inc
index 34623aa9e67138ed38103a4660df48aa16457ba8..8c656d82a79f0611936a05c7a3bb8220adcab8db 100755
--- a/src/module_vmap/web_service/ws/PrintMapServices.class.inc
+++ b/src/module_vmap/web_service/ws/PrintMapServices.class.inc
@@ -15,7 +15,7 @@ require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.i
  *  \brief This file contains the PrintMapServices php class
  *
  * This class defines the rest api for printmapservices
- * 
+ *
  */
 class PrintMapServices extends PrintServices {
     /**
@@ -241,14 +241,6 @@ class PrintMapServices extends PrintServices {
             }
         }
 
-        // Change la taille de l'image en fonction de la résolution
-        if (isset($this->aValues['resolution_coeff'])) {
-            $aImageSize = explode('|', $sImageSize);
-            $aImageSize[0] = $aImageSize[0] * $this->aValues['resolution_coeff'];
-            $aImageSize[1] = $aImageSize[1] * $this->aValues['resolution_coeff'];
-            $sImageSize = implode('|', $aImageSize);
-        }
-
         // Écrit les paramètres gros dans des fichiers
         if (is_dir($this->aProperties['vas_home'])) {
             if (!is_dir($this->aProperties['vas_home'] . '/public')) {
@@ -343,4 +335,4 @@ class PrintMapServices extends PrintServices {
 
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/src/vitis/.gitignore b/src/vitis/.gitignore
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fb23a1f31378cce575900e083e4179591effa425 100644
--- a/src/vitis/.gitignore
+++ b/src/vitis/.gitignore
@@ -0,0 +1,6 @@
+vas/rest/class/*
+vas/rest/class/!*/
+vas/rest/class/!*.*
+vas/sql/*
+vas/sql/!*/
+vas/sql/!*.*
diff --git a/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js b/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js
index 283bbc430a4b12761af760ab9563956ee0ac3e1e..48e7a37a22b78e1f1154bcaec9471d51e4a1c3a5 100644
--- a/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js
+++ b/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js
@@ -176,6 +176,8 @@ formReader.formReaderDirective = function ($q, formReaderService, propertiesSrvc
                                 }
                         });
                     });
+                } else {
+                    console.error('Error: form not valid');
                 }
             };
 
@@ -711,6 +713,9 @@ formReader.appFormFieldSpecificParamsDrtv = function ($timeout, $translate, prop
                     $(element)["datetimepicker"](oOptions);
 
                     // Si sélection d'une date : mise à jour du modèle (NE PAS SUPPRIMER!).
+                    $(element).on("dp.hide", function (e) {
+                        scope["oFormValues"][scope["sFormDefinitionName"]][element[0].name] = element[0].value;
+                    });
                     $(element).on("dp.change", function (e) {
                         scope["oFormValues"][scope["sFormDefinitionName"]][element[0].name] = element[0].value;
                     });
@@ -2151,8 +2156,8 @@ formReader.appSubformGridDrtv = function ($timeout, $translate, propertiesSrvc,
 
                                     // Récupère lélément en sélectionné
                                     formReaderService['getWebServiceData'](oFormWebService).then(function (aResult) {
-
                                         var oSubformDefinition = aResult[0]['bo_json_form'];
+                                        var sSubformJSDefinition = aResult[0]['bo_json_form_js'];
                                         var oSubformValues = {};
                                         var sModalId = 'formreader_' + scope['sFormUniqueName'] + '_grid_subform_modal';
 
@@ -2219,7 +2224,7 @@ formReader.appSubformGridDrtv = function ($timeout, $translate, propertiesSrvc,
                                             }
                                         });
 
-                                        formReaderService['showModalSubform'](sModalId, oSubformScope, oSubformDefinition, sSubformDefinitionName, oSubformValues);
+                                        formReaderService['showModalSubform'](sModalId, oSubformScope, oSubformDefinition, sSubformDefinitionName, oSubformValues, sSubformJSDefinition);
                                     });
                                 };
 
@@ -2247,6 +2252,7 @@ formReader.appSubformGridDrtv = function ($timeout, $translate, propertiesSrvc,
                         };
                         var sModalId = 'formreader_' + scope['sFormUniqueName'] + '_grid_subform_modal';
                         var oSubformDefinition = oBusinessObject['json_form'][0];
+                        var sSubformJSDefinition = oBusinessObject['json_form_js'];
                         var sSubformDefinitionName = 'insert';
 
                         // Grise le champ contenant la valeur du parent
@@ -2288,7 +2294,7 @@ formReader.appSubformGridDrtv = function ($timeout, $translate, propertiesSrvc,
                                 });
                             });
                         };
-                        formReaderService['showModalSubform'](sModalId, oSubformScope, oSubformDefinition, sSubformDefinitionName, oSubformValues);
+                        formReaderService['showModalSubform'](sModalId, oSubformScope, oSubformDefinition, sSubformDefinitionName, oSubformValues, sSubformJSDefinition);
                     };
 
                     /**
diff --git a/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js b/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js
index 6ca6ef291e6a45bdf3b6298b998729bd7abddef5..613652f9c35ccf385e3b72c1c26432d8e0e8a09f 100644
--- a/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js
+++ b/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js
@@ -1230,15 +1230,15 @@ formReader.formReaderService = function ($translate, $rootScope, $q, $log, $time
          * @param {object} oSubformDefinition
          * @param {object} oSubformDefinitionName
          * @param {object} oSubformValues
+         * @param {string|null} sSubformJSDefinition
          */
-        "showModalSubform": function (sModalId, oSubformScope, oSubformDefinition, oSubformDefinitionName, oSubformValues) {
+        "showModalSubform": function (sModalId, oSubformScope, oSubformDefinition, oSubformDefinitionName, oSubformValues, sSubformJSDefinition) {
             $log.log("showModalSubform");
 
             var sToken = this['sToken'];
             var oProperties = this['oProperties'];
 
-            if (goog.isDefAndNotNull(oSubformScope['loadSubForm'])) {
-
+            var loadForm = function(){
                 oSubformScope['loadSubForm']({
                     'sFormDefinitionName': oSubformDefinitionName,
                     'oFormDefinition': oSubformDefinition,
@@ -1246,6 +1246,30 @@ formReader.formReaderService = function ($translate, $rootScope, $q, $log, $time
                     'oProperties': oProperties,
                     'sToken': sToken
                 });
+            }
+
+            if (goog.isDefAndNotNull(oSubformScope['loadSubForm'])) {
+
+                if (goog.isDefAndNotNull(sSubformJSDefinition)) {
+                    var sUrl = sSubformJSDefinition;
+                    oVmap.log("initHtmlForm : javascript assoc. to : " + sUrl);
+                    loadExternalJs([sUrl], {
+                        "callback": function () {
+                            loadForm();
+                            try {
+                                if (goog.isDef(constructor_form)) {
+                                    constructor_form(oSubformScope, sUrl);
+                                }
+                            } catch (e) {
+                                oVmap.log("constructor_form does not exist");
+                            }
+                        },
+                        "async": true,
+                        "scriptInBody": true
+                    });
+                } else {
+                    loadForm();
+                }
 
                 $('#' + sModalId).modal('show');
             }
diff --git a/src/vitis/vas/doc/index.phtml b/src/vitis/vas/doc/index.phtml
index 086cb768856aca4ecc21b4767186d05547388f71..d4fedf02fc3fd79b18c6da0ffab7f8110a02c8e3 100755
--- a/src/vitis/vas/doc/index.phtml
+++ b/src/vitis/vas/doc/index.phtml
@@ -1,6 +1,9 @@
 <?php
 session_start();
-require_once '../rest/conf/properties.inc';
+
+$_SERVER['VAS_PATH'] = pathinfo(dirname($_SERVER['SCRIPT_FILENAME']))['dirname'];
+
+require_once $_SERVER['VAS_PATH'] . '/rest/conf/properties.inc';
 
 function returnOverview($sFolder, $parent) {
     $aModules = array();
@@ -17,10 +20,12 @@ function returnOverview($sFolder, $parent) {
             }
         }
     }
+
     return $aModules;
 }
 
-$aOverview = returnOverview(__DIR__ . "/../rest/ws", "");
+$aOverview = returnOverview($_SERVER['VAS_PATH'] . "/rest/ws", "");
+error_log('$aOverview: '. print_r($aOverview, true));
 ?>
 
 <!DOCTYPE html>
@@ -59,7 +64,7 @@ $aOverview = returnOverview(__DIR__ . "/../rest/ws", "");
                     sToken = json.PrivateToken.token;
                 }   else {
                     sToken = code[0].outerText.split('<token>')[1].split('</token>')[0];
-                }  
+                }
                 if (sToken != "") {
                 $("input[name='token']").each(function () {
                     $(this).attr("value", sToken);
@@ -154,4 +159,3 @@ foreach ($aOverview as $key => $value) {
         </div>
     </body>
 </html>
-
diff --git a/src/vitis/vas/doc/swagger.php b/src/vitis/vas/doc/swagger.php
index 3437171a291a5f277b6518b72ff0afdd04f8dab5..aca8acffc87a164aedf500bb1f31effd57cf8e5c 100755
--- a/src/vitis/vas/doc/swagger.php
+++ b/src/vitis/vas/doc/swagger.php
@@ -1,8 +1,9 @@
 <?php
+$_SERVER['VAS_PATH'] = pathinfo(dirname($_SERVER['SCRIPT_FILENAME']))['dirname'];
 header('Content-Type: application/json');
-require_once "../rest/conf/properties.inc";
+require_once $_SERVER['VAS_PATH'] . "/rest/conf/properties.inc";
 require("vendor/autoload.php");
-$swagger = \Swagger\scan('../rest/ws/'.$_REQUEST['service']);
+$swagger = \Swagger\scan($_SERVER['VAS_PATH'] . '/rest/ws/'.$_REQUEST['service']);
 $aServer = explode("://", $properties["web_server_name"]);
 $swagger = str_replace("[service_alias]", $properties["services_alias"], $swagger);
 $swagger = str_replace("[protocol]", $aServer[0], $swagger);
diff --git a/src/vitis/vas/rest/index.phtml b/src/vitis/vas/rest/index.phtml
index 86af3b21c85db3857e6e5be0ffccaae43e8a50f7..d4b4cffa2cb95cad6d52b949c6476345429ae154 100755
--- a/src/vitis/vas/rest/index.phtml
+++ b/src/vitis/vas/rest/index.phtml
@@ -1,5 +1,7 @@
 <?php
 
+$_SERVER['VAS_PATH'] = pathinfo(dirname($_SERVER['SCRIPT_FILENAME']))['dirname'];
+
 require_once("class/vitis_lib/VitisError.class.inc");
 require_once("class/vmlib/cryptUtil.inc");
 require_once("conf/properties.inc");
@@ -199,4 +201,4 @@ function customErrorHandler ($errno, $errstr, $errfile, $errline, $context){
 }
 
 include ("index.vhtml");
-?>
\ No newline at end of file
+?>
diff --git a/src/vitis/vas/rest/ws/vitis/Properties.class.inc b/src/vitis/vas/rest/ws/vitis/Properties.class.inc
index d363c98601beb319ee43bce3dd2da87b4d247c80..c7f65b413b16534d0349e47a7b9a0a420d1ba76a 100755
--- a/src/vitis/vas/rest/ws/vitis/Properties.class.inc
+++ b/src/vitis/vas/rest/ws/vitis/Properties.class.inc
@@ -14,7 +14,7 @@ require_once(__DIR__ . '/../../class/vmlib/BdDataAccess.inc');
  * 	\brief This file contains the Properties php class
  *
  * This class defines the rest api for properties
- * 
+ *
  */
 class Properties extends Vitis {
     /**
@@ -53,7 +53,7 @@ class Properties extends Vitis {
     }
 
     /**
-     * @SWG\Get(path="/properties", 
+     * @SWG\Get(path="/properties",
      *   tags={"Properties"},
      *   summary="Get properties",
      *   description="Request to get properties",
@@ -75,7 +75,7 @@ class Properties extends Vitis {
      */
 
     /**
-     * 
+     *
      * @return properties
      */
     function GET() {
@@ -85,19 +85,19 @@ class Properties extends Vitis {
         } else {
             $this->aFields = $this->aProperties;
         }
-        require_once __DIR__ . "/../../conf/version.inc";
+        require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/conf/version.inc";
 
         if (VM_STATUS != "STABLE") {
             $this->aFields['VM_STATUS'] = "UNSTABLE";
         } else {
             $this->aFields['VM_STATUS'] = "STABLE";
-            if ($pointeur = opendir(__DIR__ . "/../../conf/")) {
+            if ($pointeur = opendir(dirname($_SERVER['SCRIPT_FILENAME']) . "/conf/")) {
                 while (($fichier = readdir($pointeur)) !== false) {
 
                     if (($fichier != '.') && ($fichier != '..')) {
 
-                        if (is_dir(__DIR__ . "/../../conf/" . $fichier)) {
-                            $sTexte = file_get_contents(__DIR__ . "/../../conf/" . $fichier . "/version.inc");
+                        if (is_dir(dirname($_SERVER['SCRIPT_FILENAME']) . "/conf/" . $fichier)) {
+                            $sTexte = file_get_contents(dirname($_SERVER['SCRIPT_FILENAME']) . "/conf/" . $fichier . "/version.inc");
 
                             if (strpos($sTexte, "define (\"VM_STATUS\", \"STABLE\");") == false) {
                                 $this->aFields['VM_STATUS'] = "UNSTABLE";
@@ -216,7 +216,7 @@ class Properties extends Vitis {
      *         description="Poprerties Response",
      *         @SWG\Schema(ref="#/definitions/properties")
      *     ),
-     * 
+     *
      *  )
      */
 
@@ -299,7 +299,7 @@ class Properties extends Vitis {
             // Message de retour
             $aMessage = array('status' => REQUEST_SUCCESS);
 
-            // Ouverture de php	
+            // Ouverture de php
             $sPropertiesFile = PHP_START . PHP_EOL;
 
             // Texte à ajouter avant le tableau des properties
@@ -343,14 +343,14 @@ class Properties extends Vitis {
                 $sPropertiesFile .= PROPERTIES_FOOTER . PHP_EOL;
             }
 
-            // Fermeture de php	
+            // Fermeture de php
             $sPropertiesFile .= PHP_END;
 
             // Sauve le fichier (LOCK_EX = accés exclusif au fichier)
             if ($this->aValues['module_name'] == 'vitis')
-                $sPathProperties = __DIR__ . '/../../conf/properties.inc';
+                $sPathProperties = dirname($_SERVER['SCRIPT_FILENAME']) . '/conf/properties.inc';
             else
-                $sPathProperties = __DIR__ . '/../../conf/' . $this->aValues['module_name'] . '/properties.inc';
+                $sPathProperties = dirname($_SERVER['SCRIPT_FILENAME']) . '/conf/' . $this->aValues['module_name'] . '/properties.inc';
             //
             if (file_put_contents($sPathProperties, $sPropertiesFile, LOCK_EX) === false)
                 $aReturn = array('status' => 0, 'message' => "FORM_ERROR_FILE_WRITING_CONFIGURATION");
@@ -424,4 +424,4 @@ class Properties extends Vitis {
 
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/src/vitis/vas/util/printserver/client/map/map.js b/src/vitis/vas/util/printserver/client/map/map.js
index 2a870d9a00d0935c5b31cc776ac42210b8d84ed9..d6dcd882b6e15b31919e02a1799a6bb2b0212263 100755
--- a/src/vitis/vas/util/printserver/client/map/map.js
+++ b/src/vitis/vas/util/printserver/client/map/map.js
@@ -7,7 +7,7 @@
 PrintMap = function (opt_options) {
 
     var this_ = this;
-    
+
     this.mapSize = [document.getElementById('map').offsetWidth, document.getElementById('map').offsetHeight];
 
     this.tileSize = (isDef(window.oProperties.print.tile_size) && window.oProperties.print.features_zoom >= 0) ? window.oProperties.print.tile_size : 2048;
@@ -29,7 +29,7 @@ PrintMap = function (opt_options) {
     this.mapJsonParser = new MapJSON({
         'properties': window.oProperties
     });
-        
+
     this.view = this.mapJsonParser.getViewFromDef(this.mapDefinition, {
         'size': this.mapSize,
         'tileSize': [this.tileSize, this.tileSize]
@@ -39,13 +39,13 @@ PrintMap = function (opt_options) {
 
     this.extent = this.getExtent(opt_options);
 
-    this.tileGrid = this.getTileGridFromDefinition(this.tileSize);    
-    
+    this.tileGrid = this.getTileGridFromDefinition(this.tileSize);
+
     this.layers = this.mapJsonParser.getLayersFromDef(this.mapDefinition, {
         'size': this.mapSize,
         'tileSize': [this.tileSize, this.tileSize]
     });
-    
+
     this.map = this.setMap(this.layers, this.view);
 
     this.featuresOverlay = this.setFeaturesOverlay(this.map);
@@ -63,6 +63,9 @@ PrintMap = function (opt_options) {
     // Supprime tous les controls par défaut
     this.removeMapControls();
 
+    // Taille des icones en fonction de la résolution demandée
+    this.setMapSymbolsResolution(this.map, this.resolutionCoeff)
+
     // Si aucune étendue a été donnée et que seul un point a été donné, alors zoom sur this.defaultScale
     if (!isDef(opt_options.extent) && !isDef(this.features)) {
         if (this.features.length === 1 && this.features[0].getGeometry().getType() === 'Point') {
@@ -310,7 +313,7 @@ PrintMap.prototype.getFeaturesFromEWKT = function (aEWKTFeatures) {
 };
 
 /**
- * Return true if EWKTGeom is an EWKT geometry 
+ * Return true if EWKTGeom is an EWKT geometry
  * @param {string} EWKTGeom
  * @returns {boolean}
  */
@@ -367,4 +370,21 @@ PrintMap.prototype.getGeomFromEWKT = function (EWKTGeom, proj) {
         return null;
     }
 
-};
\ No newline at end of file
+};
+
+/**
+ * For WMS layers set MAP.RESOLUTION and MAP.DEFRESOLUTION to rise the symbols size
+ *
+ * @param  {object} olMap
+ * @param  {integer} resolutionCoeff
+ */
+PrintMap.prototype.setMapSymbolsResolution = function (olMap, resolutionCoeff) {
+
+    var newRes = resolutionCoeff * 72;
+    var aLayers = olMap.getLayers().getArray();
+    for (var i = 0; i < aLayers.length; i++) {
+        if (aLayers[i].get('type') === 'imagewms' || aLayers[i].get('type') === 'tilewms') {
+            aLayers[i].getSource().updateParams({'MAP.RESOLUTION': newRes, 'MAP.DEFRESOLUTION': 72});
+        }
+    }
+}
diff --git a/update.bat b/update.bat
new file mode 100644
index 0000000000000000000000000000000000000000..46ef323f0223fbdc2a151c7c4b1395ee786ca135
--- /dev/null
+++ b/update.bat
@@ -0,0 +1,10 @@
+@echo off
+title Update Vitis App
+echo Update Vitis App
+
+call utils/update_tree.bat
+
+cd client/conf
+call grunt
+
+pause
diff --git a/utils/copy_hooks.bat b/utils/copy_hooks.bat
new file mode 100644
index 0000000000000000000000000000000000000000..a24ac68b0f099047b546b33d77a4fab3d99c0247
--- /dev/null
+++ b/utils/copy_hooks.bat
@@ -0,0 +1,3 @@
+
+
+robocopy "githooks" "../.git/hooks" /E /NFL /NDL /NJH /NJS /nc /ns /np
diff --git a/utils/get_deps.sh b/utils/get_deps.sh
index 92b0273980ef5ae8db6eea7268fd3a5c406243b9..0a26177f9d9a4d746b39799eff421477c4d6ebd8 100755
--- a/utils/get_deps.sh
+++ b/utils/get_deps.sh
@@ -1,24 +1,23 @@
 #!/bin/bash
 #
 #	Récupère l'ensemble des dépendances depuis conf/_install/dependency.xml
-#	Nécessite xmllint : sudo apt install libxml2-utils
 #
 #
 #
 #
 
-
 if [ "../conf/_install/dependency.xml" ]; then
 
-	let depsCount=$(xmllint --xpath 'count(//dependenciesCollection/dependency/name)' ../conf/_install/dependency.xml)
 	declare -A aDeps
 	vitisVersion=master
+	depsCount=0
+	dependencies=($(cat "../conf/_install/dependency.xml" | tr -d '\040\011\012\015' | grep -oP '<dependency>([\s\S]*?)<\/dependency>'))
 
-	for (( i=1; i <= $depsCount; i++ )); do
+	for i in ${!dependencies[*]}; do
 
-		sName="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/name)' ../conf/_install/dependency.xml)"
-		sVersion="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/version)' ../conf/_install/dependency.xml)"
-		sNature="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/nature)' ../conf/_install/dependency.xml)"
+		sName=$(grep -oP '(?<=name>)[^<]+' <<< ${dependencies[$i]})
+		sVersion=$(grep -oP '(?<=version>)[^<]+' <<< ${dependencies[$i]})
+		sNature=$(grep -oP '(?<=nature>)[^<]+' <<< ${dependencies[$i]})
 
 		if [ $sName == "vitis" ]; then
 			vitisVersion=$sVersion
@@ -27,22 +26,22 @@ if [ "../conf/_install/dependency.xml" ]; then
 			aDeps[$i, name]=$sName
 			aDeps[$i, version]=$sVersion
 			aDeps[$i, nature]=$sNature
+			let depsCount++
 		fi
 
 	done
 
 	echo "[INFO] dependencies:"
 	echo "vitis : $vitisVersion"
-	for (( i=1; i <= $depsCount; i++ )); do
-
-		echo "name: ${aDeps[$i, name]}"
-		echo "version: ${aDeps[$i, version]}"
-
+	for i in ${!dependencies[*]}; do
+		echo "(${aDeps[$i, nature]}) ${aDeps[$i, name]} : ${aDeps[$i, version]}"
 	done
+	echo "depsCount : ${depsCount}"
 
 	export vitisVersion
 	export depsCount
 	export aDeps
+
 else
 	echo "[ERROR] ../conf/_install/dependency.xml not found"
 fi
diff --git a/utils/init_symlinks.sh b/utils/init_symlinks.sh
index c98ed30e162c2d81c8b90e5b6755bb5602941b5e..562c7ddb343ad70e85c86d8300080d6eb2c7f7fa 100755
--- a/utils/init_symlinks.sh
+++ b/utils/init_symlinks.sh
@@ -19,20 +19,66 @@ read APP_EXISTING_PATH
 
 cd ..
 
+# Supprime les anciens symlinks
+if [ -d "client" ]; then
+	rm -Rf client
+fi
+if [ -d "vas" ]; then
+	rm -Rf vas
+fi
+find src/vitis/client -type l -delete
+find src/vitis/vas/sql -type l -delete
+find src/vitis/vas/rest -type l -delete
+
 # Vitis
 echo "---- Link vitis ----"
 if ! [ -e "$(pwd)/client" ]; then
-	echo "---- Link vitis 2 ----"
-	ln -rsf src/vitis/client client
+
+	mkdir client
+	mkdir client/javascript
+	mkdir client/modules
+	ln -rsf src/vitis/client/css client/css
+	ln -rsf src/vitis/client/forms client/forms
+	ln -rsf src/vitis/client/images client/images
+	ln -rsf src/vitis/client/javascript/app client/javascript/app
+	ln -rsf src/vitis/client/javascript/externs client/javascript/externs
+	ln -rsf src/vitis/client/javascript/require client/javascript/require
+	ln -rsf src/vitis/client/lang client/lang
+	ln -rsf src/vitis/client/less client/less
+	ln -rsf src/vitis/client/modules/vitis client/modules/vitis
+	ln -rsf src/vitis/client/templates client/templates
+	ln -rsf src/vitis/client/.htaccess client/.htaccess
+	ln -rsf src/vitis/client/index.html client/index.html
 fi
 if ! [ -e "$(pwd)/vas" ]; then
-	ln -rsf src/vitis/vas vas
+
+	mkdir vas
+	mkdir vas/rest
+	mkdir vas/rest/ws
+	ln -rsf src/vitis/vas/doc vas/doc
+	ln -rsf src/vitis/vas/rest/class vas/rest/class
+	ln -rsf src/vitis/vas/rest/inc vas/rest/inc
+	ln -rsf src/vitis/vas/rest/ws/vitis vas/rest/ws/vitis
+	ln -rsf src/vitis/vas/rest/index.phtml vas/rest/index.phtml
+	ln -rsf src/vitis/vas/rest/index.vhtml vas/rest/index.vhtml
+	ln -rsf src/vitis/vas/sql vas/sql
+	ln -rsf src/vitis/vas/util vas/util
 fi
 
 # Conf
 echo "---- Link conf ----"
 if ! [ -e "src/vitis/client/conf" ]; then
-	ln -rsf conf src/vitis/client/conf
+	# ln -rsf conf client/conf
+
+	mkdir client/conf
+	for elem in $( ls "conf"); do
+		if [[ $elem != 'properties.json' ]]; then
+			if [[ -d "conf/${elem}" || -f "conf/${elem}" ]]; then
+				echo "---- Link conf/$elem"
+				ln -rsf conf/$elem client/conf/$elem
+			fi
+		fi
+	done
 fi
 if ! [ -e "conf/closure" ]; then
 	ln -rsf src/closure/conf conf/closure
@@ -47,22 +93,17 @@ if [[ $depsCount > 0 ]]; then
 				echo "---- Link module_${module} ----"
 				if [ -d "$(pwd)/src/module_${module}/module" ]; then
 					if ! [ -e "src/vitis/client/modules/${module}" ]; then
-						ln -rsf src/module_${module}/module src/vitis/client/modules/${module}
+						ln -rsf src/module_${module}/module client/modules/${module}
 					fi
 				fi
 				if [ -d "$(pwd)/src/module_${module}/web_service/ws" ]; then
 					if ! [ -e "src/vitis/vas/rest/ws/${module}" ]; then
-						ln -rsf src/module_${module}/web_service/ws src/vitis/vas/rest/ws/${module}
-					fi
-				fi
-				if [ -d "$(pwd)/src/module_${module}/web_service/conf" ]; then
-					if ! [ -e "src/vitis/vas/rest/conf/${module}" ]; then
-						ln -rsf src/module_${module}/web_service/conf src/vitis/vas/rest/conf/${module}
+						ln -rsf src/module_${module}/web_service/ws vas/rest/ws/${module}
 					fi
 				fi
 				if [ -d "$(pwd)/src/module_${module}/web_service/sql" ]; then
 					if ! [ -e "src/vitis/vas/sql/${module}" ]; then
-						ln -rsf src/module_${module}/web_service/sql src/vitis/vas/sql/${module}
+						ln -rsf src/module_${module}/web_service/sql vas/sql/${module}
 					fi
 				fi
 				if [ -d "$(pwd)/src/module_${module}/web_service/class" ]; then
@@ -70,7 +111,7 @@ if [[ $depsCount > 0 ]]; then
 						if [ -d "$(pwd)/src/module_${module}/web_service/class/${class_dir}" ]; then
 							echo "---- Link module_${module}/${class_dir} ----"
 							if ! [ -e "src/vitis/vas/rest/class/${class_dir}" ]; then
-								ln -rsf src/module_${module}/web_service/class/${class_dir} src/vitis/vas/rest/class/${class_dir}
+								ln -rsf src/module_${module}/web_service/class/${class_dir} vas/rest/class/${class_dir}
 							fi
 						fi
 					done
@@ -84,6 +125,7 @@ if [[ $depsCount > 0 ]]; then
 		echo "---- Link exixting app ${APP_EXISTING_PATH} ----"
 
 		declare -a existing_folders_path=("vas/server"
+		                "vas/rest/conf"
 		                "vas/log"
 						"vas/public"
 						"vas/shared"
@@ -99,11 +141,6 @@ if [[ $depsCount > 0 ]]; then
 		done
 
 		declare -a existing_files_path=("client/conf/properties.json"
-										"vas/rest/conf/properties.inc"
-										"vas/rest/conf/properties_domain.inc"
-										"vas/rest/conf/properties_post.inc"
-										"vas/rest/conf/properties_server.inc"
-										"vas/rest/conf/version.inc"
 										"vas/rest/.htaccess")
 		for file_path in "${existing_files_path[@]}"; do
 			if [ -f "${APP_EXISTING_PATH}/$file_path" ]; then
@@ -114,15 +151,8 @@ if [[ $depsCount > 0 ]]; then
 
 		for properties_dir in $( ls "${APP_EXISTING_PATH}/vas/rest/conf"); do
 			if [ -d "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}" ]; then
-				if [ -d "$(pwd)/vas/rest/conf/${properties_dir}" ]; then
-					for properties_file in $( ls "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}"); do
-						# if [ ${properties_file:0:10}=="properties"  ||  ${properties_file}=="version.inc" ]; then
-						if [[ $properties_file == "properties"* ]] || [[ $properties_file == "version.inc" ]]; then
-							echo "copy vas/rest/conf/${properties_dir}/${properties_file}"
-							cp -f "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/${properties_file}" "$(pwd)/vas/rest/conf/${properties_dir}/${properties_file}"
-						fi
-					done
-				fi
+				echo "copy ${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/ > $(pwd)/vas/rest/conf/"
+				cp -Rf "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/" "$(pwd)/vas/rest/conf/"
 			fi
 		done
 	fi
diff --git a/utils/init_tree.bat b/utils/init_tree.bat
new file mode 100644
index 0000000000000000000000000000000000000000..d8e6956ca21d8e9e7a4d4d46c77657f1153fb8b9
--- /dev/null
+++ b/utils/init_tree.bat
@@ -0,0 +1,99 @@
+@echo off
+title Install Vitis App
+setlocal EnableDelayedExpansion
+
+cd ..
+
+set /p existing_path="Existing app path: "
+
+REM Client Dir
+echo Create client directory
+if exist "client" (
+  rmdir /S /Q "client"
+)
+echo copy client
+robocopy "src/vitis/client" "client" /E /NFL /NDL /NJH /NJS /nc /ns /np
+echo copy client/conf
+robocopy "conf" "client/conf" /E /NFL /NDL /NJH /NJS /nc /ns /np
+echo copy client/conf/closure
+robocopy "src/closure/conf" "client/conf/closure" /E /NFL /NDL /NJH /NJS /nc /ns /np
+
+echo Copy client modules
+for /d %%g in ("src/module_*") do (
+  set x=%%g
+  echo !x:~7!
+  if exist "src/%%g/module" (
+    echo copy client/modules/!x:~7!
+    robocopy "src/%%g/module" "client/modules/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+)
+
+REM VAS dir
+echo Create vas directory
+echo Create client directory
+if exist "vas" (
+  rmdir /S /Q "vas"
+)
+echo copy vas
+robocopy "src/vitis/vas" "vas" /E /NFL /NDL /NJH /NJS /nc /ns /np
+
+echo Copy vas web_services
+for /d %%g in ("src/module_*") do (
+  set x=%%g
+  echo !x:~7!
+  if exist "src/%%g/web_service/conf" (
+    echo copy vas/rest/conf/!x:~7!
+    robocopy "src/%%g/web_service/conf" "vas/rest/conf/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "src/%%g/web_service/sql" (
+    echo copy vas/sql/!x:~7!
+    robocopy "src/%%g/web_service/sql" "vas/sql/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "src/%%g/web_service/ws" (
+    echo copy vas/rest/ws/!x:~7!
+    robocopy "src/%%g/web_service/ws" "vas/rest/ws/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "src/%%g/web_service/class" (
+    echo copy vas/rest/class
+    robocopy "src/%%g/web_service/class" "vas/rest/class" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "src/%%g/web_service/ws_data" (
+    echo copy vas/ws_data
+    robocopy "src/%%g/web_service/ws_data" "vas/ws_data" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "src/%%g/web_service/public" (
+    echo copy vas/public
+    robocopy "src/%%g/web_service/public" "vas/public" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "src/%%g/web_service/upload" (
+    echo copy vas/upload
+    robocopy "src/%%g/web_service/upload" "vas/upload" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+)
+
+REM Copy from existing path
+if exist %existing_path% (
+  echo copy properties from %existing_path%
+
+  for %%G in (vas\server,vas\rest\conf,vas\log,vas\public,vas\shared,vas\tmp,vas\upload,vas\ws_data) do (
+    echo %%G
+    if exist %existing_path%\%%G (
+      echo copy %%G
+      robocopy "%existing_path%\%%G" "%%G" /E /NFL /NDL /NJH /NJS /nc /ns /np
+    )
+  )
+
+  if exist %existing_path%\client\conf\properties.json (
+    echo copy properties.json
+    robocopy "%existing_path%\client\conf" "client\conf" "properties.json" /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist %existing_path%\vas\rest\.htaccess (
+    echo copy .htaccess
+    robocopy "%existing_path%\vas\rest" "vas\rest" ".htaccess" /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+
+  if exist "%existing_path%\vas\rest\conf" (
+    echo copy vas\rest\conf
+    robocopy "%existing_path%\vas\rest\conf" "vas\rest\conf" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+)
diff --git a/utils/pull_subtrees.sh b/utils/pull_subtrees.sh
index c2793f2ee9ad6e0f53da243fb1b6d26dd9baa20b..5cac1ba0c4a626761809103e822793ec694068a4 100755
--- a/utils/pull_subtrees.sh
+++ b/utils/pull_subtrees.sh
@@ -17,17 +17,7 @@ cd ..
 
 # Vitis
 echo "---- Pull vitis ----"
-git subtree pull --prefix src/vitis --squash -m "pull subtree"  "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master
-
-# fichiers à ignorer
-git update-index --assume-unchanged conf/properties.json
-git update-index --assume-unchanged conf/package.json
-git update-index --assume-unchanged src/vitis/vas/rest/.htaccess
-git update-index --assume-unchanged src/vitis/vas/rest/conf/properties.inc
-git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_domain.inc
-git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_post.inc
-git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_server.inc
-git update-index --assume-unchanged src/vitis/vas/rest/conf/version.inc
+git subtree pull --prefix src/vitis --squash -m "pull subtree"  "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" $vitisVersion
 
 # Modules
 if [[ $depsCount > 0 ]]; then
@@ -36,11 +26,7 @@ if [[ $depsCount > 0 ]]; then
 			echo "---- Pull ${aDeps[$i, name]} ----"
 
 			# Ajoute le dépôt
-			git subtree pull --prefix src/${aDeps[$i, name]} --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master
-			# fichiers à ignorer
-			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties.inc
-			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties_server.inc
-			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/version.inc
+			git subtree pull --prefix src/${aDeps[$i, name]} --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" ${aDeps[$i, version]}
 		fi
 	done
 fi
diff --git a/utils/push_subtrees.sh b/utils/push_subtrees.sh
index b4949ea2dca1465c2cc0282d59442c158d7138e1..18a9d3bdac1f0d8d3f6af3e16af06d7337ddf9f6 100755
--- a/utils/push_subtrees.sh
+++ b/utils/push_subtrees.sh
@@ -17,7 +17,11 @@ cd ..
 
 # Vitis
 echo "---- Push vitis ----"
-git subtree push --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master
+{ # 'try' block
+	git subtree push --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" $vitisVersion
+} || { # 'catch' block
+	echo "could not push vitis"
+}
 
 # Modules
 if [[ $depsCount > 0 ]]; then
@@ -28,7 +32,7 @@ if [[ $depsCount > 0 ]]; then
 			# Push le dépôt
 
 			{ # 'try' block
-				git subtree push --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master
+				git subtree push --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" ${aDeps[$i, version]}
 			} || { # 'catch' block
 			    echo "could not push ${aDeps[$i, name]}"
 			}
diff --git a/utils/update_tree.bat b/utils/update_tree.bat
new file mode 100644
index 0000000000000000000000000000000000000000..3c3c5dc356d7cc5922c046ea95f6787f80faa363
--- /dev/null
+++ b/utils/update_tree.bat
@@ -0,0 +1,80 @@
+@echo off
+title Update Vitis tree
+echo Update Vitis tree
+setlocal EnableDelayedExpansion
+
+cd utils
+
+REM Pull repo
+"C:\Program Files\Git\bin\sh.exe" --login -i -c "git pull"
+
+REM Pull subtrees
+"C:\Program Files\Git\bin\sh.exe" --login -i -c "./pull_subtrees.sh"
+
+REM Save important files
+if exist "../vas/rest/sql" (
+  robocopy "../vas/rest/sql" "../vas/rest/sql_bak" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+if exist "../vas/rest/conf" (
+  robocopy "../vas/rest/conf" "../vas/rest/conf_bak" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+
+REM Replace Vitis files
+for /d %%g in ("../src/vitis/client/*") do (
+  set x=%%g
+  echo copy client/!x!
+  rmdir /S /Q "../client/!x!"
+  robocopy "../src/vitis/client/!x!" "../client/!x!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+for /d %%g in ("../src/vitis/vas/sql") do (
+  echo copy vas/sql
+  rmdir /S /Q "../vas/sql"
+  robocopy "../src/vitis/vas/sql" "../vas/sql" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+for /d %%g in ("../src/vitis/vas/rest/class") do (
+  echo copy vas/rest/class
+  rmdir /S /Q "../vas/rest/class"
+  robocopy "../src/vitis/vas/rest/class" "../vas/rest/class" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+for /d %%g in ("../src/vitis/vas/rest/conf") do (
+  echo copy vas/rest/conf
+  robocopy "../src/vitis/vas/rest/conf" "../vas/rest/conf_veremes" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+for /d %%g in ("../src/vitis/vas/rest/inc") do (
+  echo copy vas/rest/inc
+  rmdir /S /Q "../vas/rest/inc"
+  robocopy "../src/vitis/vas/rest/inc" "../vas/rest/inc" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+for /d %%g in ("../src/vitis/vas/rest/ws") do (
+  echo copy vas/rest/ws
+  rmdir /S /Q "../vas/rest/ws"
+  robocopy "../src/vitis/vas/rest/ws" "../vas/rest/ws" /E /NFL /NDL /NJH /NJS /nc /ns /np
+)
+
+REM Replace modules files
+for /d %%g in ("../src/module_*") do (
+  set x=%%g
+  if exist "../src/%%g/module" (
+    echo copy client/modules/!x:~7!
+    robocopy "../src/%%g/module" "../client/modules/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "../src/%%g/web_service/conf" (
+    echo copy vas/rest/conf_veremes/!x:~7!
+    robocopy "../src/%%g/web_service/conf" "../vas/rest/conf_veremes/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "../src/%%g/web_service/sql" (
+    echo copy vas/sql/!x:~7!
+    robocopy "../src/%%g/web_service/sql" "../vas/sql/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "../src/%%g/web_service/ws" (
+    echo copy vas/rest/ws/!x:~7!
+    robocopy "../src/%%g/web_service/ws" "../vas/rest/ws/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+  if exist "../src/%%g/web_service/class" (
+    echo copy vas/rest/class
+    robocopy "../src/%%g/web_service/class" "../vas/rest/class" /E /NFL /NDL /NJH /NJS /nc /ns /np
+  )
+)
+
+
+cd ..