diff --git a/.gitignore b/.gitignore
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fb23a1f31378cce575900e083e4179591effa425 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1,6 @@
+vas/rest/class/*
+vas/rest/class/!*/
+vas/rest/class/!*.*
+vas/sql/*
+vas/sql/!*/
+vas/sql/!*.*
diff --git a/client/javascript/externs/formReader/formReaderDrtv.js b/client/javascript/externs/formReader/formReaderDrtv.js
index 283bbc430a4b12761af760ab9563956ee0ac3e1e..48e7a37a22b78e1f1154bcaec9471d51e4a1c3a5 100644
--- a/client/javascript/externs/formReader/formReaderDrtv.js
+++ b/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/client/javascript/externs/formReader/formReaderSrvc.js b/client/javascript/externs/formReader/formReaderSrvc.js
index 6ca6ef291e6a45bdf3b6298b998729bd7abddef5..613652f9c35ccf385e3b72c1c26432d8e0e8a09f 100644
--- a/client/javascript/externs/formReader/formReaderSrvc.js
+++ b/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/vas/doc/index.phtml b/vas/doc/index.phtml
index 086cb768856aca4ecc21b4767186d05547388f71..d4fedf02fc3fd79b18c6da0ffab7f8110a02c8e3 100755
--- a/vas/doc/index.phtml
+++ b/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/vas/doc/swagger.php b/vas/doc/swagger.php
index 3437171a291a5f277b6518b72ff0afdd04f8dab5..aca8acffc87a164aedf500bb1f31effd57cf8e5c 100755
--- a/vas/doc/swagger.php
+++ b/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/vas/rest/index.phtml b/vas/rest/index.phtml
index 86af3b21c85db3857e6e5be0ffccaae43e8a50f7..d4b4cffa2cb95cad6d52b949c6476345429ae154 100755
--- a/vas/rest/index.phtml
+++ b/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/vas/rest/ws/vitis/Properties.class.inc b/vas/rest/ws/vitis/Properties.class.inc
index d363c98601beb319ee43bce3dd2da87b4d247c80..c7f65b413b16534d0349e47a7b9a0a420d1ba76a 100755
--- a/vas/rest/ws/vitis/Properties.class.inc
+++ b/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/vas/util/printserver/client/map/map.js b/vas/util/printserver/client/map/map.js
index 2a870d9a00d0935c5b31cc776ac42210b8d84ed9..d6dcd882b6e15b31919e02a1799a6bb2b0212263 100755
--- a/vas/util/printserver/client/map/map.js
+++ b/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});
+        }
+    }
+}