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/_install/client/fileToDelete.txt b/src/vitis/_install/client/fileToDelete.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ca3a9114882b45d4b55b25a40380235fc553ceb9
--- /dev/null
+++ b/src/vitis/_install/client/fileToDelete.txt
@@ -0,0 +1,4 @@
+javascript/externs/formreader/formreader.js
+javascript/externs/formreader/formreaderCtrl.js
+javascript/externs/formreader/formreaderDrtv.js
+javascript/externs/formreader/formreaderSrvc.js
\ No newline at end of file
diff --git a/src/vitis/_install/client/folderToDelete.txt b/src/vitis/_install/client/folderToDelete.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a0e7984dc0bc0ee6987ebffa481549c126c7ef9b
--- /dev/null
+++ b/src/vitis/_install/client/folderToDelete.txt
@@ -0,0 +1,8 @@
+javascript/app
+javascript/require
+javascript/test
+javascript/externs/openLayers/ol
+javascript/externs/openLayers/ol.ext
+javascript/externs/studio/properties
+javascript/externs/studio/javascript
+modules/vitis/javascript
\ No newline at end of file
diff --git a/src/vitis/_install/client/listModuleApache.txt b/src/vitis/_install/client/listModuleApache.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2c0309e320b509b2ba74dc5f3ddd6a211245e922
--- /dev/null
+++ b/src/vitis/_install/client/listModuleApache.txt
@@ -0,0 +1,5 @@
+alias
+deflate
+headers
+rewrite
+ssl
\ No newline at end of file
diff --git a/src/vitis/_install/vas/apache.conf b/src/vitis/_install/vas/apache.conf
new file mode 100644
index 0000000000000000000000000000000000000000..2281b2e2673c513df20924e94a224bfa45673fad
--- /dev/null
+++ b/src/vitis/_install/vas/apache.conf
@@ -0,0 +1,70 @@
+PassEnv TEMP
+Alias /rest[ENV] "[VASDIRECTORY]/rest"
+	<Directory "[VASDIRECTORY]/rest">
+		<FilesMatch ".+\.ph(p[345]?|t|tml)$">
+			SetHandler application/x-httpd-php_vitis[ENV]
+		</FilesMatch>
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+		<Files ~ "\.(map|log|inc|php)$">
+			Order allow,deny
+			Deny from all
+		</Files>
+	</Directory>
+
+Alias /doc[ENV] "[VASDIRECTORY]/doc"
+	<Directory "[VASDIRECTORY]/doc">
+		<FilesMatch ".+\.ph(p[345]?|t|tml)$">
+			SetHandler application/x-httpd-php_vitis[ENV]
+		</FilesMatch>
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+	</Directory>
+
+Alias /public[ENV] "[VASDIRECTORY]/public"
+	<Directory "[VASDIRECTORY]/public">
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+		<Files ~ "\.(map|inc|php)$">
+			Order allow,deny
+			Deny from all
+		</Files>
+		SetHandler application/x-download
+	</Directory>
+Alias /ws_data[ENV] "[VASDIRECTORY]/ws_data"
+	<Directory "[VASDIRECTORY]/ws_data">
+		AllowOverride All
+		Options FollowSymLinks
+		Require all granted
+		<Files ~ "\.(map|log|inc|php)$">
+			Order allow,deny
+			Deny from all
+		</Files>
+		SetHandler application/x-download
+	</Directory>
+Alias /proxy[ENV] "[VASDIRECTORY]/util/proxy"
+	<Directory "[VASDIRECTORY]/util/proxy">
+		<FilesMatch ".+\.ph(p[345]?|t|tml)$">
+			SetHandler application/x-httpd-php_vitis[ENV]
+		</FilesMatch>
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+		<Files ~ "\.(map|log|inc)$">
+			Order allow,deny
+			Deny from all
+		</Files>
+	</Directory>
+Alias /printserver[ENV] "[VASDIRECTORY]/util/printserver"
+	<Directory "[VASDIRECTORY]/util/printserver">
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+		<Files ~ "\.(map|log|inc|php)$">
+			Order allow,deny
+			Deny from all
+		</Files>
+	</Directory>
\ No newline at end of file
diff --git a/src/vitis/_install/vas/listModuleApache.txt b/src/vitis/_install/vas/listModuleApache.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c2626d946f4a9bbaad4d7ca16423af23007c0ca3
--- /dev/null
+++ b/src/vitis/_install/vas/listModuleApache.txt
@@ -0,0 +1,16 @@
+actions
+alias
+cgi
+deflate
+headers
+ldap
+rewrite
+ssl
+proxy
+proxy_ajp
+proxy_connect
+proxy_fcgi
+proxy_ftp
+proxy_http
+proxy_scgi
+proxy_wstunnel
\ No newline at end of file
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/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});
+        }
+    }
+}