diff --git a/src/module_vmap/module/javascript/app/vmap/mapmanager/mapmanager.js b/src/module_vmap/module/javascript/app/vmap/mapmanager/mapmanager.js
index 19118736763025e374066fb7bbc34cc4f9032595..27810afd468018ba2f04b034734b5a91ac4e1c69 100644
--- a/src/module_vmap/module/javascript/app/vmap/mapmanager/mapmanager.js
+++ b/src/module_vmap/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/src/module_vmap/module/javascript/app/vmap/tools/print.js b/src/module_vmap/module/javascript/app/vmap/tools/print.js
index 70d38801732b5d7990ce0aba1d270b022a8d15e9..4e28e42085e89c47751e534d4081bb8e524198b2 100644
--- a/src/module_vmap/module/javascript/app/vmap/tools/print.js
+++ b/src/module_vmap/module/javascript/app/vmap/tools/print.js
@@ -774,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/src/module_vmap/web_service/sql/sqlQueries.xml b/src/module_vmap/web_service/sql/sqlQueries.xml
index 4a1e026efafc58a3a828aa29a84425e347e3d53d..d9af111877a89980f885ff35a7e7742435366d03 100644
--- a/src/module_vmap/web_service/sql/sqlQueries.xml
+++ b/src/module_vmap/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/src/module_vmap/web_service/ws/MapJSON.class.inc b/src/module_vmap/web_service/ws/MapJSON.class.inc
index b31c07ba67f8e470f522349c22e86321e0e9e9db..7aff50530df0a36ce101dc6531bb6d32af351328 100755
--- a/src/module_vmap/web_service/ws/MapJSON.class.inc
+++ b/src/module_vmap/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;
+    }
+
 }
 
 ?>