diff --git a/module/javascript/app/vmap/mapmanager/layerstree.js b/module/javascript/app/vmap/mapmanager/layerstree.js
index 593b84d22c30b1a15dcd6b4229e6a21921dc1e94..82bca3e91b985ccdf6e627b811eb0b3d189b092b 100644
--- a/module/javascript/app/vmap/mapmanager/layerstree.js
+++ b/module/javascript/app/vmap/mapmanager/layerstree.js
@@ -157,19 +157,19 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
          */
         this['layerstree_collapsed'] = oVmap['properties']['vmap']['layerstree_collapsed'];
     }
-
-    console.log("oUrlParams: ", oUrlParams);
-
+    
     var oPositionOptions = {};
     if (goog.isDefAndNotNull(oUrlParams['extent'])){
         oPositionOptions['extent'] = decodeURI(oUrlParams['extent']).split("|");
     }
-    if (goog.isDefAndNotNull(oUrlParams['lon']) &&
-        goog.isDefAndNotNull(oUrlParams['lat']) &&
-        goog.isDefAndNotNull(oUrlParams['zoom'])){
-        oPositionOptions['lon'] = decodeURI(oUrlParams['lon']);
-        oPositionOptions['lat'] = decodeURI(oUrlParams['lat']);
-        oPositionOptions['zoom'] = decodeURI(oUrlParams['zoom']);
+    if (goog.isDefAndNotNull(oUrlParams)) {
+        if (goog.isDefAndNotNull(oUrlParams['lon']) &&
+            goog.isDefAndNotNull(oUrlParams['lat']) &&
+            goog.isDefAndNotNull(oUrlParams['zoom'])){
+            oPositionOptions['lon'] = decodeURI(oUrlParams['lon']);
+            oPositionOptions['lat'] = decodeURI(oUrlParams['lat']);
+            oPositionOptions['zoom'] = decodeURI(oUrlParams['zoom']);
+        }
     }
 
     this.loadTree(oPositionOptions);
@@ -464,23 +464,25 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree
     }
 
     // Va à la position fournie
-    if (goog.isDefAndNotNull(oPositionOptions['lon']) &&
-        goog.isDefAndNotNull(oPositionOptions['lat']) &&
-        goog.isDefAndNotNull(oPositionOptions['zoom'])){
-
-        // Projette les coordonnées
-        var coordinates = [parseFloat(oPositionOptions['lon']), parseFloat(oPositionOptions['lat'])];
-        var projection = 'EPSG:4326';
-        var currentProjeciton = this['map'].getView().getProjection();
-        var projectedCoordinates = ol.proj.transform(coordinates, projection, currentProjeciton);
-
-        this['map'].getView().setCenter(projectedCoordinates);
-        this['map'].getView().setZoom(oPositionOptions['zoom']);
-    }
-    if (goog.isDefAndNotNull(oPositionOptions['extent'])) {
-        this['map'].getView().fit(oPositionOptions['extent'], {
-            nearest : true
-        });
+    if (goog.isDefAndNotNull(oPositionOptions)) {
+        if (goog.isDefAndNotNull(oPositionOptions['lon']) &&
+            goog.isDefAndNotNull(oPositionOptions['lat']) &&
+            goog.isDefAndNotNull(oPositionOptions['zoom'])){
+
+            // Projette les coordonnées
+            var coordinates = [parseFloat(oPositionOptions['lon']), parseFloat(oPositionOptions['lat'])];
+            var projection = 'EPSG:4326';
+            var currentProjeciton = this['map'].getView().getProjection();
+            var projectedCoordinates = ol.proj.transform(coordinates, projection, currentProjeciton);
+
+            this['map'].getView().setCenter(projectedCoordinates);
+            this['map'].getView().setZoom(oPositionOptions['zoom']);
+        }
+        if (goog.isDefAndNotNull(oPositionOptions['extent'])) {
+            this['map'].getView().fit(oPositionOptions['extent'], {
+                nearest : true
+            });
+        }
     }
 };
 
@@ -665,6 +667,8 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleLay
     } else {
         this.closeLayersMenus();
         oLayer['displayedMenu'] = true;
+        // Si toutes les couches sont activés : le checkbox pour activer ou désactiver toutes les couches est coché.
+        this.setAllSublayersActivationCheckbox(oLayer["olLayer"]);
     }
 
     // Resize la fenêtre
@@ -747,6 +751,9 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleSub
         this.activeSublayer(olLayer, sSublayer);
     }
 
+    // Si toutes les couches sont activés : le checkbox pour activer ou désactiver toutes les couches est coché.
+    this.setAllSublayersActivationCheckbox(olLayer);
+    //
     oVmap['scope'].$broadcast('layersChanged');
 };
 
@@ -1019,3 +1026,41 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setSublay
 
     oVmap['scope'].$broadcast('layersChanged');
 }
+
+/**
+ * Toggle all the sublayers in the olLayer
+ * @param  {ol.Layer} oLayer
+ * @param  {string} sCheckboxId
+ * @export
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.toggleAllSubLayers = function (oLayer, sCheckboxId) {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.toggleAllSubLayers');
+    var aAvailableSublayers = angular.copy(oLayer["olLayer"]["get"]('sublayers'));
+    var bLayersVisibility = document.getElementById(sCheckboxId).checked;
+    for (var i = 0; i < aAvailableSublayers.length; i++) {
+        if (bLayersVisibility || i == 0)
+            this.activeSublayer(oLayer["olLayer"], aAvailableSublayers[i]);
+        else
+            this.unactiveSublayer(oLayer["olLayer"], aAvailableSublayers[i], '#' + oLayer["olLayer"].$$hashKey + '_sublayer_' + aAvailableSublayers[i] + '_visible_checkbox');
+    }
+    oLayer["olLayer"]["allSublayersActive"] = bLayersVisibility;
+    oVmap['scope'].$broadcast('layersChanged');
+};
+
+/*
+* LayertreeController.prototype.setAllSublayersActivationCheckbox - Coche ou décoche le checkbox pour activer ou désactiver toutes les couches
+*
+* @param  {ol.Layer} olLayer
+* @export
+*/
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setAllSublayersActivationCheckbox = function(olLayer) {
+   oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.setAllSublayersActivationCheckbox');
+   var aAvailableSublayers = olLayer.get('sublayers');
+   var aActiveSublayers = olLayer.get('activeSublayers');
+   if (goog.isArray(aAvailableSublayers) && goog.isArray(aAvailableSublayers)) {
+      if (aAvailableSublayers.length == aActiveSublayers.length)
+          olLayer["allSublayersActive"] = true;
+      else
+          olLayer["allSublayersActive"] = false;
+   }
+};
diff --git a/module/javascript/app/vmap/mapmanager/mapmanager.js b/module/javascript/app/vmap/mapmanager/mapmanager.js
index 19118736763025e374066fb7bbc34cc4f9032595..27810afd468018ba2f04b034734b5a91ac4e1c69 100644
--- a/module/javascript/app/vmap/mapmanager/mapmanager.js
+++ b/module/javascript/app/vmap/mapmanager/mapmanager.js
@@ -1372,6 +1372,46 @@ nsVmap.nsMapManager.MapManager.prototype.getJSONLayersTree = function ($bCompare
     return sJSONLayersTree;
 };
 
+/**
+ * Récupère les sources des couches visibles
+ *
+ * @return {array}
+ */
+nsVmap.nsMapManager.MapManager.prototype.getMapSources = function () {
+
+    var oLayer;
+    var aSubLayers;
+    var aSources = [];
+    var oLayersTree = oVmap.getMapManager().getLayersTree();
+
+    if (goog.isArray(oLayersTree['children'])) {
+        for (var i = 0; i < oLayersTree['children'].length; i++) {
+            if (goog.isDefAndNotNull(oLayersTree['children'][i]['name'])) {
+                if (goog.isArray(oLayersTree['children'][i]['children'])) {
+                    for (var ii = 0; ii < oLayersTree['children'][i]['children'].length; ii++) {
+
+                        oLayer = oLayersTree['children'][i]['children'][ii];
+                        if (goog.isObject(oLayer['vm4ms_sources']) &&
+                            oLayer['olLayer'].getVisible()) {
+                            aSubLayers = oLayer['olLayer'].get('activeSublayers');
+
+                            for (var iii = 0; iii < aSubLayers.length; iii++) {
+                                if (goog.isDefAndNotNull(oLayer['vm4ms_sources'][aSubLayers[iii]])) {
+                                    if (aSources.indexOf(oLayer['vm4ms_sources'][aSubLayers[iii]]) === -1) {
+                                        aSources.push(oLayer['vm4ms_sources'][aSubLayers[iii]]);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return aSources
+}
+
 /**
  * LayersTree_ setter
  * @param {object} oTree Layers tree
diff --git a/module/javascript/app/vmap/tools/location.js b/module/javascript/app/vmap/tools/location.js
index f5af7b5693fa3f287a97555e391ad4a5f4a9422f..28aa5f557e9e39fe84a8314507320217fbbb401e 100644
--- a/module/javascript/app/vmap/tools/location.js
+++ b/module/javascript/app/vmap/tools/location.js
@@ -377,7 +377,6 @@ nsVmap.nsToolsManager.Location.prototype.locationController.prototype.goHome = f
     currentView.setResolution(originalPosition.resolution);
 };
 
-
 /**
  * Go on the previous extent
  * @export
@@ -421,15 +420,18 @@ nsVmap.nsToolsManager.Location.prototype.locationController.prototype.selectHist
 
 /**
  * Localise the map on the entry position
- * @param {string} CoordX html id to the X value
- * @param {string} CoordY html id to the Y value
+ * @param {string} sCoordX html id to the X value
+ * @param {string} sCoordY html id to the Y value
  * @param {string} projectionId html id to the projection value
  * @export
  */
-nsVmap.nsToolsManager.Location.prototype.locationController.prototype.goTo = function (CoordX, CoordY, projection) {
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.goTo = function (sCoordX, sCoordY, projection) {
     oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.goTo");
 
-    var coordinates = [parseFloat(CoordX), parseFloat(CoordY)];
+    sCoordX = sCoordX.replace(',', '.');
+    sCoordY = sCoordY.replace(',', '.');
+
+    var coordinates = [parseFloat(sCoordX), parseFloat(sCoordY)];
     var currentProjeciton = oVmap.getMap().getOLMap().getView().getProjection();
     var projectedCoordinates = ol.proj.transform(coordinates, projection, currentProjeciton);
 
diff --git a/module/javascript/app/vmap/tools/measure.js b/module/javascript/app/vmap/tools/measure.js
index 49786e4049fc529128c43666bd22dc5279a2414b..8549e94977bdbf6ddb9771cf3ff234c212908e9c 100755
--- a/module/javascript/app/vmap/tools/measure.js
+++ b/module/javascript/app/vmap/tools/measure.js
@@ -504,7 +504,7 @@ nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.setInfosToFe
         // Coordonnées
         olFeature.set('Coordonnées', this.formatCoordinate(olFeature.getGeometry()));
         // Projection
-        olFeature.set('Projection', this['map'].getView().getProjection().getCode());
+        olFeature.set('Projection', 'EPSG:4326');
 
     } else if (olFeature.getGeometry() instanceof ol.geom.LineString) {
         // Type
diff --git a/module/javascript/app/vmap/tools/print.js b/module/javascript/app/vmap/tools/print.js
index a4da24b2226efaebd24a242eb9e0ac342265eb0e..4e28e42085e89c47751e534d4081bb8e524198b2 100644
--- a/module/javascript/app/vmap/tools/print.js
+++ b/module/javascript/app/vmap/tools/print.js
@@ -530,6 +530,12 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.changeScale = fu
     // Change la résolution en fonction de l'échelle
     oVmap.getMap().setScale(viewScale);
 
+    // Change l'échalle de la carte comparée si besoin
+    if(this.$scope_["$root"]["compare_enabled"]) {
+        setTimeout(function () {
+            oVmap.getMapCompare().setScale(oVmap.getMap().getScale());
+        });
+    }
 };
 
 /**
@@ -768,6 +774,10 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
                         oPrintScope['user_' + key] = oUserInfos[key];
                     }
                 }
+
+                // Sources des couches
+                oPrintScope['layer_sources'] = oVmap.getMapManager().getMapSources();
+
                 sScope = JSON.stringify(oPrintScope);
 
                 ajaxRequest({
diff --git a/module/template/layers/layertree.html b/module/template/layers/layertree.html
index 3141c44e2381b972cbd1df47df5f2c3cd7f5de90..16ede7a751f412636438248f9bad2648fedba6af 100644
--- a/module/template/layers/layertree.html
+++ b/module/template/layers/layertree.html
@@ -117,19 +117,37 @@
                                     </div>
                                 </a>
                             </li>
+                            <!-- Coche ou décoche toutes les couches -->
+                            <li ng-if="layer.olLayer.get('sublayers').length > 1">
+                              <div class="sublayer-checkboxes">
+                                  <!-- Checkbox interrogation GetFeatureInfo -->
+                                  <div class="checkbox checkbox-success sublayer-checkbox inline-checkbox" ng-if="layer.olLayer.values.is_queryable_getfeatureinfo === true && ctrl.properties.selection.enable_getfeatureinfo === true">
+                                  </div>
+                                  <!-- Checkbox visible -->
+                                  <div class="checkbox checkbox-info inline-checkbox" ng-class="{'checkbox_indeterminate' : layer.olLayer.allSublayersActive === false}">
+                                      <input id="{{layer.$$hashKey}}_all_sublayer_visibility_checkbox"
+                                             type="checkbox"
+                                             style="cursor:pointer; position: absolute"
+                                             title="Définition de la visibilité de toutes les couches"
+                                             ng-checked="layer.olLayer.allSublayersActive"
+                                             ng-click="ctrl.toggleAllSubLayers(layer, layer.$$hashKey + '_all_sublayer_visibility_checkbox')">
+                                      <label for="{{layer.$$hashKey}}_all_sublayer_visibility_checkbox" style="cursor:pointer" title="Définition de la visibilité de toutes les couches"></label>
+                                  </div>
+                              </div>
+                            </li>
                             <li ng-if="layer.olLayer.get('type') === 'imagewms' || layer.olLayer.get('type') === 'tilewms'"
                                 ng-repeat="sublayer in layer.olLayer.get('sublayers')">
                                 <div class="sublayer-checkboxes">
                                     <!-- Checkbox interrogation GetFeatureInfo -->
                                     <div class="checkbox checkbox-success sublayer-checkbox inline-checkbox" ng-if="layer.olLayer.values.is_queryable_getfeatureinfo === true && ctrl.properties.selection.enable_getfeatureinfo === true">
                                         <input id="{{layer.$$hashKey}}_sublayer_{{sublayer}}_wms_queryable_checkbox"
-                                        type="checkbox"
-                                        style="cursor:pointer; position: absolute"
-                                        title="Definit si la couche est est interrogeable par requête WMS"
-                                        ng-checked="ctrl.isSublayerWMSQueryable(layer.olLayer, sublayer)"
-                                        ng-disabled="layer.olLayer.values.visible !== true"
-                                        ng-click="ctrl.toggleSublayerWMSQueryable(layer.olLayer, sublayer)">
-                                        <label for="{{layer.$$hashKey}}_sublayer_{{sublayer}}_wms_queryable_checkbox" style="cursor:pointer" title="Definit si la couche est interrogeable par requête WMS"></label>
+                                               type="checkbox"
+                                               style="cursor:pointer; position: absolute"
+                                               title="Definit si la couche est est interrogeable par requête WMS"
+                                               ng-checked="ctrl.isSublayerWMSQueryable(layer.olLayer, sublayer)"
+                                               ng-disabled="layer.olLayer.values.visible !== true"
+                                               ng-click="ctrl.toggleSublayerWMSQueryable(layer.olLayer, sublayer)">
+                                            <label for="{{layer.$$hashKey}}_sublayer_{{sublayer}}_wms_queryable_checkbox" style="cursor:pointer" title="Definit si la couche est interrogeable par requête WMS"></label>
                                     </div>
                                     <!-- Checkbox visible -->
                                     <div class="checkbox checkbox-info sublayer-checkbox inline-checkbox">
diff --git a/module/template/tools/location.html b/module/template/tools/location.html
index 59d1b1faed4848c8ed64c87adc9b30dccf43eb7a..39157c3070b80e003d3de56e9ed378d7dcb920e9 100644
--- a/module/template/tools/location.html
+++ b/module/template/tools/location.html
@@ -143,10 +143,10 @@
         <div class="row margin-sides-0 margin-10">
             <div class="col-md-5">
                 <div class="input-group-sm">
-                    <input type="number" class="form-control" placeholder="X" ng-model="goToX">
+                    <input type="text" class="form-control" placeholder="X" ng-model="goToX">
                 </div>
                 <div class="input-group-sm">
-                    <input type="number" class="form-control" placeholder="Y" ng-model="goToY">
+                    <input type="text" class="form-control" placeholder="Y" ng-model="goToY">
                 </div>
             </div>
             <div class="col-md-5">
diff --git a/web_service/sql/sqlQueries.xml b/web_service/sql/sqlQueries.xml
index 4a1e026efafc58a3a828aa29a84425e347e3d53d..d9af111877a89980f885ff35a7e7742435366d03 100644
--- a/web_service/sql/sqlQueries.xml
+++ b/web_service/sql/sqlQueries.xml
@@ -1168,6 +1168,11 @@
 					ALTER TABLE s_vmap.business_object ADD COLUMN location_placeholder character varying(100);
 					-- Armand 23/01/2019 Placeholder dans la localisation
 					UPDATE s_vmap.business_object set location_placeholder='Localiser...';
+					-- Armand 13/02/2019 Modèle d'impression avec sources
+					INSERT INTO "s_vmap"."printtemplate" ("name","rt_format_id","rt_orientation_id","outputformats_id","definition") VALUES ('Modèle par défaut 2','A4','portrait','pdf','<style>' || chr(13) || '    #A4_print_template {' || chr(13) || '        width: 21cm;' || chr(13) || '        font-family: arial;' || chr(13) || '        position: absolute;' || chr(13) || '    }' || chr(13) || '    #map_overview {' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '        height: 4cm;' || chr(13) || '        width: 4cm;' || chr(13) || '        border: 1px solid black;' || chr(13) || '    }' || chr(13) || '    .map_image {' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '        height: 22cm;' || chr(13) || '        width: 14cm;' || chr(13) || '        border: 1px solid black;' || chr(13) || '    }' || chr(13) || '    .map_image_compare_mode {' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '        height: 11cm;' || chr(13) || '        width: 14cm;' || chr(13) || '        border: 1px solid black;' || chr(13) || '    }' || chr(13) || '    .map_legend {' || chr(13) || '        width: 3cm; ' || chr(13) || '        margin-top: 16px;' || chr(13) || '    }' || chr(13) || '    .map_legend_compare_mode {' || chr(13) || '        width: 3cm; ' || chr(13) || '        margin-top: 16px;' || chr(13) || '    }' || chr(13) || '    .color_blue{' || chr(13) || '        color: #424A96 !important;' || chr(13) || '    }' || chr(13) || '    .logo {' || chr(13) || '        height: 2cm;' || chr(13) || '    }' || chr(13) || '    .container {' || chr(13) || '        position: absolute;' || chr(13) || '    }' || chr(13) || '    #header_container{' || chr(13) || '        width: 18cm;' || chr(13) || '        height: 2.5cm;' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '    }' || chr(13) || '    #footer_container{' || chr(13) || '        width: 18cm;' || chr(13) || '        height: 1cm;' || chr(13) || '        background-color: #D8D8D8 !important;' || chr(13) || '    }' || chr(13) || '    .header_content{' || chr(13) || '        margin-left: 10px;' || chr(13) || '    }' || chr(13) || '    .title{' || chr(13) || '        display: block;' || chr(13) || '        font-size: 24pt;' || chr(13) || '        font-weight: bold;' || chr(13) || '        margin-top: 0.8em;' || chr(13) || '    }' || chr(13) || '    .headline{' || chr(13) || '        font-weight: bold;' || chr(13) || '        font-size: 14pt;' || chr(13) || '    }' || chr(13) || '    .legend_headline{' || chr(13) || '        font-weight: bold;' || chr(13) || '        font-size: 14pt;' || chr(13) || '        color: black;' || chr(13) || '    }' || chr(13) || '    .footer_text{' || chr(13) || '        font-weight: bold;' || chr(13) || '        font-size: 10pt;' || chr(13) || '        margin: 0.3cm;' || chr(13) || '    }' || chr(13) || '' || chr(13) || '</style>' || chr(13) || '<div id="A4_print_template">' || chr(13) || '' || chr(13) || '    <div id="header_container" class="container" style="top: 1.2cm; left: 1.5cm;">' || chr(13) || '        <div class="container" style="top: -0.5cm; left: 0cm;">' || chr(13) || '            <div class="header_content title color_blue">{{title}}</div>' || chr(13) || '            <div class="header_content headline color_blue">{{headline}}</div>' || chr(13) || '        </div>' || chr(13) || '        <div class="container" style="top: 0.2cm; right: 10px;">' || chr(13) || '            <img class="logo" src="data:image/png;base64,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">' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '    <!-- Mode normal -->' || chr(13) || '    <div ng-if="!compare_mode" class="container" style="top: 5cm; left: 1.5cm;">' || chr(13) || '        <label class="legend_headline">Légende</label>' || chr(13) || '        <div id="map_legend"></div>' || chr(13) || '    </div>' || chr(13) || '    <!-- Mode comparaison -->' || chr(13) || '    <div ng-if="compare_mode" class="container" style="top: 5cm; left: 1.5cm;">' || chr(13) || '        <label class="legend_headline">Légende</label>' || chr(13) || '        <div id="map_legend"></div>' || chr(13) || '        <div id="map_legend_compare"></div>' || chr(13) || '    </div>' || chr(13) || '    <!-- Mode normal -->' || chr(13) || '    <div ng-if="!compare_mode" class="container" style="top: 4cm; right: 1.1cm;">' || chr(13) || '        <img id="map_image" class="map_image" src="images/transparent.png">' || chr(13) || '    </div>' || chr(13) || '    <!-- Mode comparaison -->' || chr(13) || '    <div ng-if="compare_mode">' || chr(13) || '        <div class="container" style="top: 4cm; right: 1.1cm;">' || chr(13) || '            <img id="map_image" class="map_image_compare_mode" src="images/transparent.png">    ' || chr(13) || '        </div>    ' || chr(13) || '        <div class="container" style="top: 15cm; right: 1.1cm;">' || chr(13) || '            <img id="map_image_compare" class="map_image_compare_mode" src="images/transparent.png">' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '' || chr(13) || '    <div class="container" style="top: 24.5cm; left: 1.7cm; z-index: 9;">' || chr(13) || '        <!-- Pour afficher l''overview utiliser id="map_overview-->' || chr(13) || '        <img id="map_overview">' || chr(13) || '    </div>' || chr(13) || '    ' || chr(13) || '    <div class="container" style="top: 25.9cm; right: 1.5cm;">' || chr(13) || '      <!-- Pour afficher l''échelle actuelle utiliser {{map_scale}}-->' || chr(13) || '      <div class="footer_text">' || chr(13) || '        <label class="color_blue"></label>' || chr(13) || '        <label class="color_blue">Echelle: {{map_scale}}</label>' || chr(13) || '      </div>' || chr(13) || '  </div>' || chr(13) || '' || chr(13) || '' || chr(13) || '    <div id="footer_container" class="container" style="top: 26.7cm; left: 1.5cm">' || chr(13) || '        <div class="container" style="top: 0cm; left: 4.5cm;">' || chr(13) || '            <div class="footer_text">' || chr(13) || '                <label class="color_blue">Source(s):</label>' || chr(13) || '                <label class="color_blue">{{layer_sources.join('', '')}}</label>' || chr(13) || '            </div>' || chr(13) || '        </div>' || chr(13) || '    </div>' || chr(13) || '</div>');
+					INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut 2'), 'title', true, 'Titre', 'Titre du document', NULL);
+					INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut 2'), 'footer', false, NULL, NULL, 'Tout droits réservés');
+					INSERT INTO s_vmap.printparameter (printtemplate_id, name, editable, label, placeholder, defaultvalue) VALUES ((select printtemplate_id from s_vmap.printtemplate where name = 'Modèle par défaut 2'), 'headline', true, 'Sous titre', 'Sous titre de la carte', NULL);
 				]]>
 			</code>
 		</query>
diff --git a/web_service/ws/MapJSON.class.inc b/web_service/ws/MapJSON.class.inc
index b31c07ba67f8e470f522349c22e86321e0e9e9db..7aff50530df0a36ce101dc6531bb6d32af351328 100755
--- a/web_service/ws/MapJSON.class.inc
+++ b/web_service/ws/MapJSON.class.inc
@@ -267,6 +267,11 @@ class MapJSON extends Vmap {
             else
                 $tmp['is_queryable_getfeatureinfo'] = false;
 
+            if (!empty($oLayer->aFields['service_vm4ms']))
+                $tmp['is_vm4ms_layer'] = $oLayer->aFields['service_vm4ms'];
+            else
+                $tmp['is_vm4ms_layer'] = false;
+
             if (!empty($oLayer->aFields['is_filtered']) && !empty($oLayer->aFields['filter_form']))
                 $tmp['is_filtered'] = $oLayer->aFields['is_filtered'];
             else
@@ -339,6 +344,11 @@ class MapJSON extends Vmap {
 
             $tmp['layer_id'] = $oLayer->aFields['layer_id'];
 
+            // Sources des couches
+            if (($tmp['is_vm4ms_layer'] === true) && !empty($oLayer->aFields['layer_list'])) {
+                $tmp['vm4ms_sources'] = $this->getLayersSources(explode(',', $oLayer->aFields['layer_list']));
+            }
+
             array_push($aThemes[$oLayer->aFields['theme_name']], $tmp);
             unset($tmp);
         }
@@ -346,6 +356,41 @@ class MapJSON extends Vmap {
         return $aThemes;
     }
 
+    /**
+     * Get the vm4ms layers sources
+     *
+     * @param  {array} $aLayers layers names
+     * @return {array} avaliable sources
+     */
+    function getLayersSources($aLayers) {
+
+        $aSources = array();
+        if (!empty($this->aProperties['schema_vm4ms'])) {
+
+            $aFilter = $this->decodeJSONFilter(array(
+                'column' => 'name',
+                'compare_operator' => 'IN',
+                'value' => $aLayers,
+            ));
+
+            $aSQLParams = $aFilter['params'];
+            $aSQLParams['sSchema'] = array('value' => $this->aProperties['schema_vm4ms'], 'type' => 'column_name');
+
+            $sSql = "SELECT name, source_label FROM [sSchema].v_ms_layer WHERE " . $aFilter['request'];
+
+            $oResult = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+            if (!$this->oConnection->oBd->enErreur()) {
+                while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                    if (!empty($aLigne['source_label'])) {
+                        $aSources[$aLigne['name']] = $aLigne['source_label'];
+                    }
+                }
+            }
+        }
+
+        return $aSources;
+    }
+
 }
 
 ?>