diff --git a/module/forms/users/users_vitis_users_vmap_user.json b/module/forms/users/users_vitis_users_vmap_user.json
index d922e45e1ba3d4d778a9e8e27b7b55a2a0e29ca5..1136d285e019d9c7209295c175e274becd0f57eb 100755
--- a/module/forms/users/users_vitis_users_vmap_user.json
+++ b/module/forms/users/users_vitis_users_vmap_user.json
@@ -1,4 +1,19 @@
 {
+    "datasources": {
+        "datasource_1": {
+            "type": "web_service",
+            "dataType": "webService",
+            "name": "datasource_maps",
+            "description": "",
+            "ressource_id": "vmap/Maps",
+            "webservice": {
+                "name": "vmap"
+            },
+            "ressource": {
+                "name": "Maps"
+            }
+        }
+    },
     "search":{
 
     },
@@ -19,6 +34,27 @@
                     }
                 ]
             },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "default_map",
+                        "label": "FORM_DEFAULT_MAP_USERS_USER_VMAP_USER",
+                        "required": false,
+                        "nb_cols": 12,
+                        "datasource": {
+                            "datasource_id": "datasource_1",
+                            "sort_order": "ASC",
+                            "distinct": "true",
+                            "label_key": "name",
+                            "order_by": "name",
+                            "id_key": "map_id",
+                            "attributs": "map_id|name"
+                        },
+                        "id_from": "Element_0_6_1_from"
+                    }
+                ]
+            },
             {
                 "fields":[
                     {
@@ -87,6 +123,28 @@
                     }
                 ]
             },
+            {
+                "fields": [
+                    {
+                        "type": "select",
+                        "name": "default_map",
+                        "label": "FORM_DEFAULT_MAP_USERS_USER_VMAP_USER",
+                        "required": false,
+                        "disabled": true,
+                        "nb_cols": 12,
+                        "datasource": {
+                            "datasource_id": "datasource_1",
+                            "sort_order": "ASC",
+                            "distinct": "true",
+                            "label_key": "name",
+                            "order_by": "name",
+                            "id_key": "map_id",
+                            "attributs": "map_id|name"
+                        },
+                        "id_from": "Element_0_6_1_from"
+                    }
+                ]
+            },
             {
                 "fields":[
                     {
@@ -117,4 +175,4 @@
             }
         ]
     }
-}
\ No newline at end of file
+}
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
index e0168f15efdbb3674d714c7de0f294e58283bb88..7dea0252d242dfedad6b2d5a00b345d4129d7bb7 100644
--- a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
@@ -511,6 +511,70 @@
                     }
                 ]
             },
+            {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "name": "enable_location",
+                        "label": "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "disabled": false,
+                        "required": true,
+                        "nb_cols": 2,
+                        "default_value": true
+                    },
+                    {
+                        "type": "text",
+                        "name": "location_placeholder",
+                        "label": "FORM_LOCATION_PLACEHOLDER_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 4,
+                        "id": "bo_location_placeholder",
+                        "default_value": "Localiser..."
+                    },
+                    {
+                        "type": "radio",
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "name": "enable_selection",
+                        "label": "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "disabled": false,
+                        "required": true,
+                        "nb_cols": 12,
+                        "default_value": true
+                    }
+                ]
+            },
             {
                 "fields": [
                     {
@@ -949,6 +1013,68 @@
                         "nb_cols": 6
                     }
                 ]
+            }, {
+                "fields": [
+                    {
+                        "type": "radio",
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "name": "enable_location",
+                        "label": "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "disabled": false,
+                        "required": true,
+                        "nb_cols": 2,
+                        "default_value": true
+                    },
+                    {
+                        "type": "text",
+                        "name": "location_placeholder",
+                        "label": "FORM_LOCATION_PLACEHOLDER_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 4,
+                        "id": "bo_location_placeholder"
+                    },
+                    {
+                        "type": "radio",
+                        "options": {
+                            "choices": [
+                                {
+                                    "label": "Oui",
+                                    "value": true
+                                },
+                                {
+                                    "label": "Non",
+                                    "value": false
+                                }
+                            ]
+                        },
+                        "name": "enable_selection",
+                        "label": "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT",
+                        "tooltip": {
+                            "title": "",
+                            "content": "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT_TOOLTIP",
+                            "container": "body"
+                        },
+                        "disabled": false,
+                        "required": true,
+                        "nb_cols": 12,
+                        "default_value": true
+                    }
+                ]
             },
             {
                 "fields": [
@@ -1169,7 +1295,7 @@
             {
                 "fields": [
                     {
-                        "type": "number",
+                        "type": "label",
                         "name": "max_snapping_scale",
                         "label": "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
                         "nb_cols": 12
@@ -1179,13 +1305,43 @@
             {
                 "fields": [
                     {
-                        "type": "number",
+                        "type": "label",
                         "name": "min_snapping_scale",
                         "label": "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT",
                         "nb_cols": 12
                     }
                 ]
             },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "enable_location",
+                        "label": "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "location_placeholder",
+                        "label": "FORM_LOCATION_PLACEHOLDER_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "label",
+                        "name": "enable_selection",
+                        "label": "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT",
+                        "nb_cols": 12
+                    }
+                ]
+            },
             {
                 "fields": [
                     {
diff --git a/module/javascript/app/vmap/mapmanager/layerstree.js b/module/javascript/app/vmap/mapmanager/layerstree.js
index 2a5fe743b519e0186dae873e6317327fee403212..82bca3e91b985ccdf6e627b811eb0b3d189b092b 100644
--- a/module/javascript/app/vmap/mapmanager/layerstree.js
+++ b/module/javascript/app/vmap/mapmanager/layerstree.js
@@ -157,12 +157,22 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
          */
         this['layerstree_collapsed'] = oVmap['properties']['vmap']['layerstree_collapsed'];
     }
-
+    
+    var oPositionOptions = {};
     if (goog.isDefAndNotNull(oUrlParams['extent'])){
-        var aExtent = decodeURI(oUrlParams['extent']).split("|");
+        oPositionOptions['extent'] = decodeURI(oUrlParams['extent']).split("|");
+    }
+    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(aExtent);
+    this.loadTree(oPositionOptions);
 
     // Événements sur les couches
     var keepLoadedTiles = true;
@@ -389,10 +399,11 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.reloadTre
 
 /**
  * Load layers from the tree
- * @param  {array|undefined} aExtent exent to fit on
+ * @param  {object|undefined} oPositionOptions
+ * @param  {array|undefined} oPositionOptions.extent exent to fit on
  * @returns {undefined}
  */
-nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree = function (aExtent) {
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree = function (oPositionOptions) {
     oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree');
 
     if (this['map'].getLayers().getArray().length > 0)
@@ -452,11 +463,26 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree
         this.addLayer(olLayers[i]);
     }
 
-    // Va à l'étendue fournie
-    if (goog.isDefAndNotNull(aExtent)) {
-        this['map'].getView().fit(aExtent, {
-            nearest : true
-        });
+    // Va à la position fournie
+    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
+            });
+        }
     }
 };
 
@@ -641,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
@@ -723,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');
 };
 
@@ -995,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 d42d368d9bce08e8b42bcc399a3efab62aee2ec9..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
@@ -1487,7 +1527,10 @@ nsVmap.nsMapManager.MapManager.prototype.getBusinessObjectsFromLayers = function
                 'bo_geom_type': aBos[ii]['geom_type'],
                 'bo_min_edition_scale': aBos[ii]['min_edition_scale'],
                 'bo_max_edition_scale': aBos[ii]['max_edition_scale'],
-                'bo_index': goog.isDefAndNotNull(aBos[ii]['index']) ? aBos[ii]['index'] : 1000000
+                'bo_enable_location': aBos[ii]['enable_location'],
+                'bo_enable_selection': aBos[ii]['enable_selection'],
+                'bo_index': goog.isDefAndNotNull(aBos[ii]['index']) ? aBos[ii]['index'] : 1000000,
+                'location_placeholder': aBos[ii]['location_placeholder']
             };
         }
     }
@@ -1498,19 +1541,40 @@ nsVmap.nsMapManager.MapManager.prototype.getBusinessObjectsFromLayers = function
 /**
  * Use getQueryableLayers to get the queryable business objects, group by bo_id if the same bo is used by two different layers
  * @param {boolean} bOnlyVisible true if you want to get only the visible layers
+ * @param {boolean} bSelectionEnabled true if you want to get only the selection enable bos
+ * @param {boolean} bLocationEnabled true if you want to get only the location enable bos
  * @returns {object} the queryables business objects
  * @export
  */
-nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjects = function (bOnlyVisible) {
+nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjects = function (bOnlyVisible, bSelectionEnabled, bLocationEnabled) {
     oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjects');
 
     var oBusinessObjects = this.getBusinessObjectsFromLayers(this.getQueryableLayers(bOnlyVisible));
     var oQueryableBOs = {};
+    var bSelectionTestPass = true;
+    var bLocationTestPass = true;
 
     for (var key in oBusinessObjects) {
         if (goog.isDefAndNotNull(oBusinessObjects[key]['bo_user_rights'])) {
             if (oBusinessObjects[key]['bo_user_rights'].indexOf('SELECT') !== -1) {
-                oQueryableBOs[key] = oBusinessObjects[key];
+
+                bSelectionTestPass = true;
+                bLocationTestPass = true;
+
+                if (bSelectionEnabled) {
+                    if (!oBusinessObjects[key]['bo_enable_selection']) {
+                        bSelectionTestPass = false;
+                    }
+                }
+                if (bLocationEnabled) {
+                    if (!oBusinessObjects[key]['bo_enable_location']) {
+                        bLocationTestPass = false;
+                    }
+                }
+
+                if (bSelectionTestPass && bLocationTestPass) {
+                    oQueryableBOs[key] = oBusinessObjects[key];
+                }
             }
         }
     }
@@ -1521,14 +1585,16 @@ nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjects = function
 /**
  * Use getQueryableLayers to get the queryable business objects, group by bo_id if the same bo is used by two different layers
  * @param {boolean} bOnlyVisible true if you want to get only the visible layers
+ * @param {boolean} bSelectionEnabled true if you want to get only the selection enable bos
+ * @param {boolean} bLocationEnabled true if you want to get only the location enable bos
  * @returns {array} the queryables business objects
  * @export
  */
-nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjectsAsArray = function (bOnlyVisible) {
+nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjectsAsArray = function (bOnlyVisible, bSelectionEnabled, bLocationEnabled) {
     oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getQueryableBusinessObjectsAsArray');
 
     var aQueryableBOs = [];
-    var oQueryableBOs = this.getQueryableBusinessObjects(bOnlyVisible);
+    var oQueryableBOs = this.getQueryableBusinessObjects(bOnlyVisible, bSelectionEnabled, bLocationEnabled);
 
     for (var key in oQueryableBOs) {
         aQueryableBOs.push(oQueryableBOs[key]);
@@ -1578,19 +1644,56 @@ nsVmap.nsMapManager.MapManager.prototype.getQueryableGetFeatureInfoLayers = func
  * @returns {object}
  * @export
  */
-nsVmap.nsMapManager.MapManager.prototype.getInsertableBusinessObjects = function () {
+nsVmap.nsMapManager.MapManager.prototype.getInsertableBusinessObjects = function (bOnlyVisible, bSelectionEnabled, bLocationEnabled) {
     oVmap.log('nsVmap.nsMapManager.MapManager.prototype.getInsertableBusinessObjects');
 
-    var oBusinessObjects = this.getBusinessObjectsFromLayers(this.getQueryableLayers());
+    var oBusinessObjects = this.getBusinessObjectsFromLayers(this.getQueryableLayers(bOnlyVisible));
     var aInsertableBOs = [];
+    var bSelectionTestPass = true;
+    var bLocationTestPass = true;
 
     for (var key in oBusinessObjects) {
         if (goog.isDefAndNotNull(oBusinessObjects[key]['bo_user_rights'])) {
             if (oBusinessObjects[key]['bo_user_rights'].indexOf('INSERT') !== -1) {
-                aInsertableBOs.push(oBusinessObjects[key]);
+
+                bSelectionTestPass = true;
+                bLocationTestPass = true;
+
+                if (bSelectionEnabled) {
+                    if (!oBusinessObjects[key]['bo_enable_selection']) {
+                        bSelectionTestPass = false;
+                    }
+                }
+                if (bLocationEnabled) {
+                    if (!oBusinessObjects[key]['bo_enable_location']) {
+                        bLocationTestPass = false;
+                    }
+                }
+
+                if (bSelectionTestPass && bLocationTestPass) {
+                    aInsertableBOs.push(oBusinessObjects[key]);
+                }
             }
         }
     }
 
     return aInsertableBOs;
 };
+
+/**
+ * Measure features getter
+ *
+ * @return {array}
+ */
+nsVmap.nsMapManager.MapManager.prototype.getMeasureFeatures = function () {
+
+    var oMeasureScope = angular.element($('[app-measure]').children()).scope();
+    var aMeasureFeatures = oMeasureScope['ctrl'].oOpenLayersMeasureOverlayFeatures_.getArray();
+
+    return aMeasureFeatures;
+}
+
+nsVmap.nsMapManager.MapManager.prototype.getMeasureFeaturesAsGeoJSON = function () {
+
+    aMeasureFeatures = this.getMeasureFeatures();
+}
diff --git a/module/javascript/app/vmap/tools/insert.js b/module/javascript/app/vmap/tools/insert.js
index ce07b2686567b9c5002a2441209ecb8a80568318..fc10d75e41bbb2cd629965bc201ed54d8a8eddc8 100644
--- a/module/javascript/app/vmap/tools/insert.js
+++ b/module/javascript/app/vmap/tools/insert.js
@@ -256,7 +256,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
     /**
      * Queryable Business Objects
      */
-    $scope['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+    $scope['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true, true, false);
 
     /**
      * Business objects avaliable for avoiding superpositions
@@ -298,11 +298,22 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
 
     // Supprime la feature lors de la sélection sur l'interaction this.delete_
     this.delete_.on('select', function () {
+
+        // Supprime la partie selectionnée
         var aSelectedFeatures = this.delete_.getFeatures().getArray();
         for (var i = 0; i < aSelectedFeatures.length; i++) {
             this.oOverlayLayer_.getSource().removeFeature(aSelectedFeatures[i]);
         }
         this.delete_.getFeatures().clear();
+
+        // Arrête la suppression si il ne reste plus de parties
+        if (goog.isDefAndNotNull(this.oOverlayLayer_.getSource().getFeatures().length)) {
+            if (this.oOverlayLayer_.getSource().getFeatures().length === 0) {
+                oVmap.getMap().removeActionsOnMap();
+                oVmap.getMap().getMapTooltip().hide();
+            }
+        }
+
     }, this);
 
     /**
@@ -389,6 +400,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
         this_.updateInsertForm(null, function(){
             this_.selectCurrentBoForSnapping();
             this_.loadAvoidSuperpositionBos();
+            this_.autoSelectDrawPart();
         });
     });
 
@@ -416,8 +428,8 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadInsert
 
     this.$scope_.$applyAsync(function () {
         setTimeout(function () {
-            this_.$scope_['aInsertableBOs'] = oVmap.getMapManager().getInsertableBusinessObjects();
-            this_.$scope_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+            this_.$scope_['aInsertableBOs'] = oVmap.getMapManager().getInsertableBusinessObjects(true, true, false);
+            this_.$scope_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true, true, false);
 
             // Mobile: cache le bouton "Insertion" si aucun bo est insertable
             if (goog.isDefAndNotNull(this_.$scope_['aInsertableBOs'])) {
@@ -456,7 +468,6 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.selectCurr
     this.checkEditionScale();
 };
 
-
 /**
  * Load this.aAvoidSuperpositionsBOs
  *
@@ -550,6 +561,59 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.checkEditi
     }
 };
 
+/**
+ * Commence automatiquement le dessin si le type de feature est connu
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.autoSelectDrawPart = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.autoSelectDrawPart');
+
+    // Supprime les interractions
+    oVmap.getMap().removeActionsOnMap();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+
+    // Supprime le snapping
+    this.oSnapOverlayLayer_.getSource().clear();
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+
+    // Lance automatiquement la saisie
+    if (this['addPartGeomType'] !== '') {
+        this['startInsertion']('insert' + this['addPartGeomType'], this['currentAction'] === 'basicTools-insert-insert' + this['addPartGeomType'])
+    }
+}
+
+/**
+ * Affiche automatiquement le formulaire après un dessin si besoin
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.autoShowForm = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.autoShowForm');
+
+    // Type de geom en base
+    var sGeomType = this.$scope_['oInsertObject']['sGeomType'];
+
+    // Si il ne s'agit pas d'une géométrie multiple
+    if (goog.isDefAndNotNull(sGeomType)) {
+        if (sGeomType.substr(0, 5) !== 'MULTI' && sGeomType !== 'GEOMETRYCOLLECTION') {
+
+            // Affiche le formulaire
+            this.displayEditFrom();
+        }
+    }
+}
+
+/**
+ * Affiche / cache le selecteur de type de géométrie
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.showDrawTypeSelectDropdown = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.showDrawTypeSelectDropdown');
+
+    setTimeout(function () {
+        $('#vmap-insert-select-type-dropdown').dropdown('toggle');
+    });
+}
+
 
 
 // Opérations sur les couches
@@ -600,6 +664,17 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.displayEdi
 
     var $scope = this.$scope_;
 
+    // Supprime les interractions
+    oVmap.getMap().removeActionsOnMap();
+
+    // Cache la tooltip
+    oVmap.getMap().getMapTooltip().hide();
+
+    // Supprime le snapping
+    this.oSnapOverlayLayer_.getSource().clear();
+    oVmap.getMap().getOLMap().removeInteraction(this.snap_);
+
+    // Affiche le formulaire
     oVmap.getToolsManager().getBasicTools().showTool($('#basic-tools-dropdown-insert-btn'));
     $('#basictools-insert-form-reader-modal').modal('show');
 
@@ -655,7 +730,6 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.validateFo
     $scope.isFormValid_ = false;
 
     setTimeout(function () {
-//        oVmap.simuleClick("basictools-insert-form-reader-submit-btn");
         var oFormReaderScope = this_.getEditFormReaderScope();
         oFormReaderScope['sendForm']();
         setTimeout(function () {
@@ -777,7 +851,8 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.updateInse
         return null;
     }
 
-    // Vide les variables oInsertObject
+    // Vide les variables
+    this['addPartGeomType'] = '';
     $scope['oInsertObject']['oResult'] = {};
     $scope['oInsertObject']['sGeomColumn'] = null;
     $scope['oInsertObject']['sGeomType'] = null;
@@ -916,6 +991,32 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getEditFor
     return angular.element($('#basictools-insert-form-reader').children()).scope();
 };
 
+/**
+ * Ferme le formulaire et retourne à l'édition de la géométrie
+ * @export
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.closeFormToEditGeom = function () {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.validateForm');
+
+    var this_ = this;
+    var $scope = this.$scope_;
+
+    // Récupère les valeurs sous un format propice à l'insertion (sans "selectedOption")
+    if (goog.isDefAndNotNull($scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']])) {
+        var EWKTGeometry = angular.copy($scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']]);
+    }
+    $scope['oInsertObject']['oResult'] = this_.getBOValuesFromFormValues($scope['oInsertObject']['oFormValues']);
+    if (!goog.isDefAndNotNull($scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']])) {
+        $scope['oInsertObject']['oResult'][$scope['oInsertObject']['sGeomColumn']] = EWKTGeometry;
+    }
+    $('#basictools-insert-form-reader-modal').modal('hide');
+
+    // Lance automatiquement la saisie
+    if (this['addPartGeomType'] !== '') {
+        this['startInsertion']('insert' + this['addPartGeomType'], this['currentAction'] === 'basicTools-insert-insert' + this['addPartGeomType'])
+    }
+}
+
 
 
 // Edition de la géométrie
@@ -965,7 +1066,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.startInser
     } else if (type === 'deleteFeature') {
 
         //Ajoute la tooltip
-        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur un dessin pour le supprimer');
+        oVmap.getMap().getMapTooltip().displayMessage('Cliquez sur une partie pour la supprimer');
 
         // Ajoute l'interraction
         oVmap.getMap().setInteraction(this.delete_, 'basicTools-insert-' + type);
@@ -1130,6 +1231,8 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.startDrawi
                 feature = this_.updateCircleGeoms(feature);
                 // Évite les superpositions avec les autres couches si besoin
                 this_.avoidSuperpositions(feature);
+                // Affiche le formulaire automatiquement
+                this_.autoShowForm();
             }, this);
 
 
@@ -1528,14 +1631,24 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getFormDat
     var oFormData_ = new FormData();
 
     for (var key in oValues) {
+
+        var bIsMultipleFiles = false;
+        if (goog.isObject(oValues[key])) {
+            if (goog.isDefAndNotNull(oValues[key].length)) {
+                bIsMultipleFiles = true
+            }
+        }
+
         // Fichier ?
-        if (goog.isDefAndNotNull(oValues[key])) {
-            if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
-                oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
-                oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
-            } else {
-                oFormData_.append(key, oValues[key]);
+        if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
+            oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
+            oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
+        } else if (bIsMultipleFiles) {
+            for (var i = 0; i < oValues[key].length; i++) {
+                oFormData_.append(key + '[]', oValues[key][i]);
             }
+        } else {
+            oFormData_.append(key, oValues[key]);
         }
     }
 
diff --git a/module/javascript/app/vmap/tools/location.js b/module/javascript/app/vmap/tools/location.js
index 415bd9cb19f286c3fcb11ea2c8818f5b60dc3c30..28aa5f557e9e39fe84a8314507320217fbbb401e 100644
--- a/module/javascript/app/vmap/tools/location.js
+++ b/module/javascript/app/vmap/tools/location.js
@@ -348,7 +348,7 @@ nsVmap.nsToolsManager.Location.prototype.locationController.prototype.addScale =
 nsVmap.nsToolsManager.Location.prototype.locationController.prototype.setBusinessObjectsList = function () {
     oVmap.log('nsVmap.nsToolsManager.Location.prototype.locationController.prototype.setBusinessObjectsList');
 
-    this['oBusinessObjects'] = oVmap.getMapManager().getQueryableBusinessObjects();
+    this['oBusinessObjects'] = oVmap.getMapManager().getQueryableBusinessObjects(false, false, true);
 };
 
 /**
@@ -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 ba56969063fd78c335aa9cc27883aca7701e9072..8549e94977bdbf6ddb9771cf3ff234c212908e9c 100755
--- a/module/javascript/app/vmap/tools/measure.js
+++ b/module/javascript/app/vmap/tools/measure.js
@@ -386,10 +386,10 @@ nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.createMeasur
     this.setInfosToFeature(olFeature);
 
     if (goog.isDefAndNotNull(this.measureTooltipElementTemp_)) {
-        
+
         this.measureTooltipElement_.innerHTML = this.measureTooltipElementTemp_.innerHTML;
         this.measureTooltipElementTemp_.style.display = 'none';
-        
+
     } else {
         this.measureTooltipElement_.innerHTML = '';
 
@@ -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
@@ -546,6 +546,9 @@ nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.setInfosToFe
         // Projection
         olFeature.set('Projection', this['map'].getView().getProjection().getCode());
 
+        olFeature.set('geom_center', olFeature.getGeometry().getCenter());
+        olFeature.set('geom_radius', olFeature.getGeometry().getRadius());
+
     } else {
         // Type
         olFeature.set('Type', 'undefined');
@@ -1128,4 +1131,4 @@ nsVmap.nsToolsManager.Measure.prototype.measureController.prototype.mobileDelete
 
 // Définit la directive et le controller
 oVmap.module.directive('appMeasure', nsVmap.nsToolsManager.Measure.prototype.measureDirective);
-oVmap.module.controller('AppmeasureController', nsVmap.nsToolsManager.Measure.prototype.measureController);
\ No newline at end of file
+oVmap.module.controller('AppmeasureController', nsVmap.nsToolsManager.Measure.prototype.measureController);
diff --git a/module/javascript/app/vmap/tools/print.js b/module/javascript/app/vmap/tools/print.js
index 0db6a4ec4cd11f72202643b963bea91f66eb2c9f..4e28e42085e89c47751e534d4081bb8e524198b2 100644
--- a/module/javascript/app/vmap/tools/print.js
+++ b/module/javascript/app/vmap/tools/print.js
@@ -598,6 +598,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.prepareAndLaunch
     var aLocationOverlayFeatures = oVmap.getMap().getLocationOverlayFeatures().getArray();
     var aPopupOverlayFeatures = oVmap.getMap().getPopupOverlayFeatures().getArray();
     var aSelectionOverlayFeatures = oVmap.getMap().getSelectionOverlayFeatures().getArray();
+    var aMeasureFeatures = oVmap.getMapManager().getMeasureFeatures();
 
     var oPrintOptions = {
         scope: scope,
@@ -605,6 +606,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.prepareAndLaunch
         templateId: templateId,
         printStyleId: this.$scope_['selectedPrintstyleId'],
         resolutionCoeff: this['dpi'],
+        measureFeatures: aMeasureFeatures,
         features: goog.array.concat(aLocationOverlayFeatures, aPopupOverlayFeatures, aSelectionOverlayFeatures)
     };
 
@@ -749,6 +751,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
                 extent: opt_options.extent,
                 features: opt_options.features,
                 featuresZoom: opt_options.featuresZoom,
+                measureFeatures: opt_options.measureFeatures,
                 mapImageSize: mapImageSize,
                 overviewSize: overviewSize
             }
@@ -771,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({
@@ -895,6 +902,15 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef =
         sFeaturesZoom = oVmap['properties']['print']['features_zoom'];
     }
 
+    // Measures
+    var oMeasureFeatures = null;
+    if (goog.isArray(opt_options.measureFeatures)) {
+        if (opt_options.measureFeatures.length > 0) {
+            oMeasureFeatures = ol.getGeoJSONFromFeatures(opt_options.measureFeatures,
+                oVmap.getMap().getOLMap().getView().getProjection().getCode());
+        }
+    }
+
     if (goog.isDefAndNotNull(opt_options.mapImageSize)) {
         var oMapDef = {
             'map_id': sMapId,
@@ -905,6 +921,9 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef =
             'features': sEWKTFeatures,
             'features_zoom': sFeaturesZoom
         };
+        if (goog.isDefAndNotNull(oMeasureFeatures)) {
+            oMapDef['measure_features'] = oMeasureFeatures;
+        }
     }
 
     if (goog.isDefAndNotNull(opt_options.overviewSize)) {
diff --git a/module/javascript/app/vmap/tools/select/advancedselect.js b/module/javascript/app/vmap/tools/select/advancedselect.js
index 85c43ac9b53b1510174e8165b7d3b609a2f9099a..1d4d012dc803bac2e46aa6a8995e1bf062c38feb 100644
--- a/module/javascript/app/vmap/tools/select/advancedselect.js
+++ b/module/javascript/app/vmap/tools/select/advancedselect.js
@@ -185,7 +185,7 @@ nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController = functi
     /**
      * Queryable business objects
      */
-    this['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true);
+    this['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true, true, false);
 
     /**
      * Business objects list
@@ -237,7 +237,7 @@ nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController = functi
         this_.$scope_.$applyAsync(function () {
 
             // rempli this.oQueryableBOs
-            this_['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true);
+            this_['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true, true, false);
 
             // rempli this.aBusinessObjectsList
             goog.array.clear(this_['aBusinessObjectsList']);
@@ -448,7 +448,7 @@ nsVmap.nsToolsManager.AdvancedSelect.prototype.AdvancedSelectController.prototyp
     this.EWKTGeometry = EWKTGeometry;
 
     // Récupère la liste des bo interrogeables
-    var oQueryableBOs = oVmap.getMapManager().getQueryableBusinessObjects(true);
+    var oQueryableBOs = oVmap.getMapManager().getQueryableBusinessObjects(true, true, false);
 
     // Met le compteur de requêtes en cours au nombre de requêtes à effectuer
     this.requestCounter_ = Object.keys(oQueryableBOs).length;
diff --git a/module/javascript/app/vmap/tools/select/basicselect.js b/module/javascript/app/vmap/tools/select/basicselect.js
index 200baf000377bef18fafd189872aea028fddca67..cd9c3943d6433202f21825bcf74e4b98006c7185 100755
--- a/module/javascript/app/vmap/tools/select/basicselect.js
+++ b/module/javascript/app/vmap/tools/select/basicselect.js
@@ -835,8 +835,8 @@ nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.setQ
 
         // rempli this.oQueryableBOs et aQueryableBOs
         this_['aQueryableLayers'] = oVmap.getMapManager().getQueryableGetFeatureInfoLayers(true);
-        this_['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true);
-        this_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+        this_['oQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjects(true, true, false);
+        this_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true, true, false);
         this_['aBusinessObjectsList'] = Object.keys(this_['oQueryableBOs']);
 
         // Élément sélectionné par défaut
diff --git a/module/javascript/app/vmap/tools/select/select.js b/module/javascript/app/vmap/tools/select/select.js
index 0944cee5c36c0157e090e853d22cadfe027a9f6e..9abfe9a36f1f77f3e8d99a951d40988bc3a5bcca 100755
--- a/module/javascript/app/vmap/tools/select/select.js
+++ b/module/javascript/app/vmap/tools/select/select.js
@@ -688,7 +688,7 @@ nsVmap.nsToolsManager.Select.prototype.selectController.prototype.loadQueryableB
 
     this_.$scope_.$applyAsync(function () {
         setTimeout(function () {
-            this_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true);
+            this_['aQueryableBOs'] = oVmap.getMapManager().getQueryableBusinessObjectsAsArray(true, true, false);
 
             // Snapping
             for (var i = 0; i < this_['aQueryableBOs'].length; i++) {
@@ -1556,7 +1556,7 @@ nsVmap.nsToolsManager.Select.prototype.selectController.prototype.updateBOValues
         'method': 'PUT',
         'url': oVmap['properties']['api_url'] + '/vmap/querys/' + bo_type,
         'headers': {
-            'Accept': 'application/x-vm-json'
+            'Accept': 'application/x-vm-json',
         },
         'data': data,
         'scope': this.$scope_,
@@ -1647,19 +1647,40 @@ nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormData =
 nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormDataFromValues = function (oValues) {
     oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getFormDataFromValues');
 
-    var oFormData_ = new FormData();
+    var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]);
+    return formSrvc['getFormDataFromValues'](oValues);
+};
+
+nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getUnchangedFilesFromValues = function (oValues) {
+    oVmap.log('nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getUnchangedFilesFromValues');
 
+    var oUnchangedFiles = {};
     for (var key in oValues) {
+
+        var bIsMultipleFiles = false;
+        if (goog.isObject(oValues[key])) {
+            if (goog.isDefAndNotNull(oValues[key].length)) {
+                bIsMultipleFiles = true
+            }
+        }
+
         // Fichier ?
-        if (goog.isDefAndNotNull(oValues[key]['aFiles'])) {
-            oFormData_.append(key + '_attached_content', oValues[key]['aFiles'][0]);
-            oFormData_.append(key, oValues[key]['aFiles'][0]['name']);
-        } else {
-            oFormData_.append(key, oValues[key]);
+        if (bIsMultipleFiles) {
+            for (var i = 0; i < oValues[key].length; i++) {
+                if (oValues[key][i]._modified === false) {
+
+                    if (!goog.isArray(oUnchangedFiles[key])) {
+                        oUnchangedFiles[key] = [];
+                    }
+
+                    oUnchangedFiles[key].push(oValues[key][i]['name']);
+
+                }
+            }
         }
     }
 
-    return oFormData_;
+    return oUnchangedFiles;
 };
 
 /**
diff --git a/module/javascript/app/vmap/vmap.js b/module/javascript/app/vmap/vmap.js
index f178a8c8318359837bd33d27463450bfe7744ea8..827c9d01c74d66819605bb7bba3177a2804d6454 100644
--- a/module/javascript/app/vmap/vmap.js
+++ b/module/javascript/app/vmap/vmap.js
@@ -897,7 +897,7 @@ oVmap.maxResizeBottomBar = function () {
 oVmap.minResizeBottomBar = function () {
     angular.element($('#olMap')).scope()['ctrl'].startAnimation();
     angular.element($('#olMapCompare')).scope()['ctrl'].startAnimation();
-    
+
     if ($("#map-container").hasClass("open2")) {
         $("#map-container").removeClass("open2");
         $("#bottombar").removeClass("open2");
@@ -1131,9 +1131,17 @@ oVmap.generatePrintReport = function (opt_options) {
     }
     printWindow.document.write('<div style="width: 100%; text-align: center; margin-top: 80px"><img src="images/ajax-big-loader.GIF" alt="Load img" style="width: 200px;height: 170px;"><br><br><i style="color: gray">Construction de la fiche en cours..</i></div>');
 
+    var sUrl;
+    if (goog.isDefAndNotNull(oVmap['properties']['api_url'])) {
+        sUrl = oVmap['properties']['api_url'] + '/vmap/printreportservices';
+    } else {
+        var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(['propertiesSrvc']);
+        sUrl = propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + '/vmap/printreportservices';
+    }
+
     ajaxRequest({
         'method': 'POST',
-        'url': oVmap['properties']['api_url'] + '/vmap/printreportservices',
+        'url': sUrl,
         'headers': {
             'Accept': 'application/x-vm-json'
         },
diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json
index dfca19f973cb24a29baabc9d4d03dbef574b89c8..8b71ffd1d8e56ee54a7c990922b272b57d3d8103 100644
--- a/module/lang/lang-en.json
+++ b/module/lang/lang-en.json
@@ -185,7 +185,12 @@
     "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Maximum edition scale",
     "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT": "Minimum edition scale",
     "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Minimum edition scale",
+    "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT": "Enable selection",
+    "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Display the object on tools i, i+ and insertion",
+    "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT": "Enable locate",
+    "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Display the object on the locate tool",
     "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT": "Delete the selected items and associations with layers?",
+    "FORM_LOCATION_PLACEHOLDER_VMAP_BUSINESS_OBJECT": "Location placeholder",
     "": "",
     "FORM_TITLE_VMAP_MODULE_MODULE": "Module {{::label}}",
     "FORM_LABEL_VMAP_MODULE_MODULE": "Label",
@@ -217,6 +222,7 @@
     "FORM_MAP_USERS_VMAP_PRINT_STYLE": "Users linked to style",
     "": "",
     "FORM_ID_USERS_USER_VMAP_USER": "ID",
+    "FORM_DEFAULT_MAP_USERS_USER_VMAP_USER": "Default map",
     "FORM_PRINT_STYLES_USERS_USER_VMAP_USER": "Print styles",
     "FORM_PRINT_STYLES_AVAILABLE_USERS_USER_VMAP_USER": "Available print styles",
     "FORM_GROUP_PRINT_STYLES_USERS_USER_VMAP_USER": "Print styles linked to user",
@@ -318,7 +324,7 @@
     "FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Snapping tolerance (in pixels)",
     "FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Default snapping type",
     "FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Selected objects visibility",
-    "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End point, vertex and segmtents",
+    "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End point, vertex and segments",
     "FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End pointet and vertex",
     "FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "End point",
     "": "",
@@ -464,5 +470,230 @@
     "": "",
     "ERROR_SERVICE_ASSOCIATED": "Un service vMap est associé",
     "ERROR_WMSSERVICE_ASSOCIATED": "Un service WMS est associé",
-    "ERROR_LAYER_ASSOCIATED": "Une ou plusieurs couches sont associées."
+    "ERROR_LAYER_ASSOCIATED": "Une ou plusieurs couches sont associées.",
+    "": "",
+    "VMAP_CANCEL": "Cancel",
+    "VMAP_PREVIOUS": "Previous",
+    "VMAP_NEXT": "Next",
+    "VMAP_FINISH": "Finish",
+    "VMAP_LOCATE": "Locate",
+    "VMAP_LOCATION": "Location",
+    "VMAP_ADD": "Add",
+    "VMAP_MENU": "Menu",
+    "VMAP_CHOOSE": "Choose",
+    "VMAP_VALIDATE": "Validate",
+    "VMAP_FILTER": "Filter",
+    "VMAP_POINT": "Point",
+    "VMAP_MULTI_POINT": "Multi point",
+    "VMAP_LINE": "Line",
+    "VMAP_POLYGON": "Polygon",
+    "VMAP_CIRCLE": "Circle",
+    "VMAP_EXPORT": "Export",
+    "VMAP_BUSINESS_OBJECT": "Business object",
+    "VMAP_BUSINESS_OBJECTS": "Business objects",
+    "VMAP_WMS_QUERY": "WMS query",
+    "VMAP_LEGEND": "Legend",
+    "VMAP_LAYER": "Layer",
+    "VMAP_LAYERS": "Layers",
+    "VMAP_LAYER_NAME": "Layer name",
+    "VMAP_SHEET": "Sheet",
+    "VMAP_SHEETS": "Sheets",
+    "VMAP_MAP": "Map",
+    "VMAP_MAPS": "Maps",
+    "VMAP_USER": "User",
+    "VMAP_COORDINATES": "Coordinates",
+    "VMAP_INSERTION": "Insertion",
+    "VMAP_BACK": "Back",
+    "VMAP_PROJETION": "Projection",
+    "VMAP_PRINT": "Print",
+    "VMAP_TOOLS": "Tools",
+    "VMAP_BASKET": "Basket",
+    "VMAP_REPORT": "Report",
+    "VMAP_REPORTS": "Reports",
+    "VMAP_ATTRS": "Attributs",
+    "VMAP_SAVE": "Save",
+    "VMAP_YES": "Yes",
+    "VMAP_NO": "No",
+    "VMAP_DETAILS": "Details",
+    "VMAP_MORE_RESULTS": "More results",
+    "VMAP_MEASURE": "Measure",
+    "VMAP_MEASURES": "Measures",
+    "VMAP_EDIT": "Edit",
+    "VMAP_DELETE": "Delete",
+    "VMAP_EMPTY": "Empty",
+    "VMAP_TYPE": "Type",
+    "VMAP_RADIUS": "Radius",
+    "VMAP_SEE_ON_MAP": "See on map",
+    "VMAP_CSV_EXPORT": "Export to CSV",
+    "VMAP_MODEL": "Model",
+    "VMAP_STYLE": "Style",
+    "VMAP_SCALE": "Scale",
+    "VMAP_RESOLUTION": "Resolution",
+    "VMAP_PRINT": "Print",
+    "VMAP_WMS_QUERY_RESULT": "WMS request result (GetFeatureInfo)",
+    "VMAP_WITH_RESULT": "With result",
+    "VMAP_WITHOUT_RESULT": "Without result",
+    "VMAP_NO_RESULTS_AVAILABLE": "No result available",
+    "VMAP_SERVICE": "Service",
+    "VMAP_FIND": "Find",
+    "VMAP_FILE": "File",
+    "VMAP_USE": "Use",
+    "VMAP_THEME": "Theme",
+    "VMAP_CENTER": "Center",
+    "VMAP_REPROJECT": "Reproject",
+    "VMAP_CREATE_AND_USE": "Create and use",
+    "VMAP_ALL": "All",
+    "VMAP_ZOOM": "Zoom",
+    "VMAP_EXTENT": "Extent",
+    "VMAP_DOWNLOAD": "Download",
+    "VMAP_NAME": "Name",
+    "VMAP_URL": "URL",
+    "VMAP_SERVICE_NAME": "Service name",
+    "VMAP_SERVICE_URL": "Service URL",
+    "VMAP_TITLE": "Title",
+    "VMAP_VERSION": "Version",
+    "VMAP_GET_CONTENT": "Get content",
+    "VMAP_MATRIX": "Matrix",
+    "VMAP_FORMAT": "Format",
+    "": "",
+    "VMAP_LAYERTREE_DATASETS": "Datasets",
+    "VMAP_LAYERTREE_MAP_1": "Map 1",
+    "VMAP_LAYERTREE_MAP_2": "Map 2",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_SHEET": "Sheet visible",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_GROUP": "Group visible",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_LAYER": "Layer visible",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_ALL_LAYER": "All layers visibles",
+    "VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_SHEET": "Sheet queryable by WMS",
+    "VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_LAYER": "Layer queryable by WMS",
+    "VMAP_LAYERTREE_FILTER": "Filer",
+    "VMAP_LAYERTREE_LAYER_FILTER": "Layer filter",
+    "VMAP_LAYERTREE_TRANSPARENCY": "Transparency",
+    "VMAP_LAYERTREE_APPLY_FILTER": "Apply filter",
+    "": "",
+    "VMAP_LAYERSORDER_TOOL": "Layers order tool",
+    "VMAP_LAYERSORDER_TABLE_OF_CONTENTS": "Table of contents",
+    "VMAP_LAYERSORDER_TITLE_VISIBLE_SHEET": "Sheet visible",
+    "": "",
+    "VMAP_LEGEND_TOOL": "Map lengend",
+    "VMAP_LEGEND_MAP_1": "Map 1",
+    "VMAP_LEGEND_MAP_2": "Map 2",
+    "": "",
+    "VMAP_MAP_CANCEL_SEIZURE": "Cancel seizure",
+    "VMAP_MAP_CHOOSE_VERTEX_TO_MODIFY": "Choose vertex to modify",
+    "VMAP_MAP_CANCEL_OPERATION": "Cancel operation",
+    "": "",
+    "VMAP_MAPS": "MAPS",
+    "VMAP_MAPS_MANAGEMENT": "MAP MANAGER",
+    "": "",
+    "VMAP_ADVANCEDSELECT_TABLE": "Resulting table",
+    "VMAP_ADVANCEDSELECT_GRAPHIC_SELECTION": "Graphic selection",
+    "VMAP_ADVANCEDSELECT_REQUESTER": "Requester",
+    "VMAP_ADVANCEDSELECT_NO_OBJECT": "No business object or insufficient permissions",
+    "VMAP_ADVANCEDSELECT_DELETE_RECORDINGS": "Delete records",
+    "VMAP_ADVANCEDSELECT_ADD_BASKET": "Add to basket",
+    "VMAP_ADVANCEDSELECT_REPLACE_BASKET": "Replace on basket",
+    "VMAP_ADVANCEDSELECT_OTHER_FORMATS": "Other formats",
+    "VMAP_ADVANCEDSELECT_EXPORT_REQUEST": "Export request",
+    "VMAP_ADVANCEDSELECT_EXPORT_FORMAT": "Output format",
+    "VMAP_ADVANCEDSELECT_EXPORT_SRID": "Coordinate system (SRID)",
+    "VMAP_ADVANCEDSELECT_EXPORT_MAIL": "Mail adress (separed by ; )",
+    "VMAP_ADVANCEDSELECT_EXPORT_SEND": "Ask export",
+    "": "",
+    "VMAP_BASICTOOLS_BACK_TO_THE_MAP": "Back to the map",
+    "VMAP_BASICTOOLS_INITIAL_POSITION": "Initial position",
+    "VMAP_BASICTOOLS_MY_POSITION": "My position",
+    "VMAP_BASICTOOLS_MAX_EXTENT": "Max extent",
+    "VMAP_BASICTOOLS_MEASURE": "Measures",
+    "VMAP_BASICTOOLS_JOIN_COORDS": "Join coords",
+    "VMAP_BASICTOOLS_MAP_LINK": "Current map link",
+    "VMAP_BASICTOOLS_MAP_COMPARE": "Map compare",
+    "VMAP_BASICTOOLS_CONTROL_TOOLS": "Control tools",
+    "": "",
+    "VMAP_COMPARE_MAP_TOGGLE": "Toggle map compare",
+    "": "",
+    "VMAP_INSERT_CREATE_OBJECT": "Create object",
+    "VMAP_INSERT_NO_OBJECT": "No business object or insufficient permissions",
+    "VMAP_INSERT_ADD_PART": "Add part",
+    "VMAP_INSERT_MODIFY_GEOM": "Modify geom",
+    "VMAP_INSERT_DELETE_PART": "Delete part",
+    "VMAP_INSERT_ADD_HOLE": "Add hole",
+    "VMAP_INSERT_DELETE_HOLE": "Delete hole",
+    "VMAP_INSERT_EDIT_ATTRS": "Edit attributes",
+    "VMAP_INSERT_VECTOR_SNAPPING": "Vector snapping",
+    "VMAP_INSERT_VECTOR_SNAPPING_DEF": "Define if the business object id snappable",
+    "VMAP_INSERT_SNAPPING_OPTIONS": "Snapping options",
+    "VMAP_INSERT_SNAPPING_MAX_SCALE": "Maximum scale reached",
+    "VMAP_INSERT_SNAPPING_MIN_SCALE": "Minimum scale reached",
+    "VMAP_INSERT_RESET_DEFAULT_PARAMS": "Reset default params",
+    "": "",
+    "VMAP_LOCATION_NEW_SCALE": "New scale",
+    "VMAP_LOCATION_NEW_SCALE_DEF": "Set a nez scale an click on \"Add\"",
+    "VMAP_LOCATION_SEARCH_RESULTS": "Search results",
+    "VMAP_LOCATION_CENTER_MAP_ON_DEFAULT_EXTENT": "Center map on default extent",
+    "VMAP_LOCATION_REFRESH_MAP_LAYERS": "Refresh map layers",
+    "VMAP_LOCATION_CENTER_MAP_ON_MAX_EXTENT": "Center map on maximum extent",
+    "VMAP_LOCATION_CENTER_MAP_ON_MY_POSITION": "Center map on my position",
+    "VMAP_LOCATION_CENTER_MAP_ON_GIVEN_POSITION": "Center map on a given position",
+    "VMAP_LOCATION_GO": "Go",
+    "VMAP_LOCATION_GO_TO_PREV_EXTENT": "Next extent",
+    "VMAP_LOCATION_GO_TO_NEXT_EXTENT": "Previous extent",
+    "": "",
+    "VMAP_MEASURE_SHOW_HIDE_ANOTATIONS": "Show / Hide Anotations",
+    "VMAP_MEASURE_SHOW_MEASURES": "Display measures",
+    "VMAP_MEASURE_NO_MEASURES": "No measure to display",
+    "VMAP_COORDINATES_PROJ": "Coordinates projection",
+    "": "",
+    "VMAP_PRINT_NO_MODEL_ASSOCIATE": "No model associated",
+    "VMAP_PRINT_MODIFY_MAP_PRINT_ZONE": "Modify print zone on map",
+    "VMAP_PRINT_MODIFY_COMPARE_MAP_PRINT_ZONE": "Modify print zone on compare map",
+    "": "",
+    "VMAP_SELECTION_MULTIPLE_SELECTION": "Multiple selection",
+    "VMAP_SELECTION_VALIDATE_GEOM": "Validate geometry",
+    "": "",
+    "VMAP_MAPMODAL_BING_ADD_LAYER": "Add Bing Maps layer",
+    "": "",
+    "VMAP_MAPMODAL_GEOM_LOAD_FILE": "Load local file",
+    "VMAP_MAPMODAL_GEOM_SERVICE_NAME": "Service name",
+    "VMAP_MAPMODAL_GEOM_LAYER_NAME": "Layer name",
+    "VMAP_MAPMODAL_GEOM_FILE_OR_URL": "File or URL",
+    "VMAP_MAPMODAL_GEOM_DRAG_FILE_DESCR": "Or simply drag file here",
+    "VMAP_MAPMODAL_GEOM_DRAG_FILE_HERE": "Drag file here",
+    "VMAP_MAPMODAL_GEOM_FORMATS": "Supported formats",
+    "": "",
+    "VMAP_MAPMODAL_MAPLIST_TITLE": "Avaliable maps list",
+    "VMAP_MAPMODAL_MAPLIST_DRAG_FILE_HERE": "Drag file here",
+    "VMAP_MAPMODAL_MAPLIST_NEW_MAP": "New map",
+    "VMAP_MAPMODAL_MAPLIST_NEW_EMPTY_MAP": "New map (empty)",
+    "VMAP_MAPMODAL_MAPLIST_USE_THIS_MAP": "Use this map",
+    "VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL": "Zoom level",
+    "VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL_MAX": "Maximum zoom level",
+    "VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL_MIM": "Minimum zoom level",
+    "": "",
+    "VMAP_MAPMODAL_TITLE": "Maps manager",
+    "VMAP_MAPMODAL_MY_MAP": "My map",
+    "VMAP_MAPMODAL_CHANGE_MAP": "Change map",
+    "VMAP_MAPMODAL_WMS_SERVICE": "WMS",
+    "VMAP_MAPMODAL_WMTS_SERVICE": "WMTS",
+    "VMAP_MAPMODAL_XYZ_SERVICE": "XYZ",
+    "VMAP_MAPMODAL_LOCAL_FILE": "Local file",
+    "VMAP_MAPMODAL_OSM": "Open Street Map",
+    "VMAP_MAPMODAL_BING": "Bing Maps",
+    "VMAP_MAPMODAL_ADD_LAYERS": "Add layers",
+    "": "",
+    "VMAP_MYMAP_TITLE": "Running map",
+    "VMAP_MYMAP_DELETE_SHEET": "Remove sheet from map",
+    "": "",
+    "VMAP_MAPMODAL_OSM_TITLE": "Add OSM layer",
+    "": "",
+    "VMAP_MAPMODAL_WMS_TITLE": "Add WMS layer",
+    "VMAP_MAPMODAL_WMS_ID": "Login (not required)",
+    "VMAP_MAPMODAL_WMS_PASS": "Password (not required)",
+    "": "",
+    "VMAP_MAPMODAL_WMTS_TITLE": "Add WMTS layer",
+    "": "",
+    "VMAP_MAPMODAL_XYZ_TITLE": "Add XYZ layer",
+    "VMAP_MAPMODAL_XYZ_DESCR_1": "Tiled services defined by a XYZ pyramid ex: http://tile.stamen.com/toner/{z}/{x}/{y}.png",
+    "VMAP_MAPMODAL_XYZ_DESCR_2": "By default it follows the most used model where X(0) and Y(0) are on top left",
+    "VMAP_MAPMODAL_XYZ_DESCR_3": "The TMS grids use this coords on bottom left, so to use them put {-y} on the URL",
+    "": ""
 }
diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json
index a1b1a7bbd94917d3d4b0021295bd5cac3f109774..4cbec1bf999fe0fb1fa2f24f26a35b9d859eac1c 100644
--- a/module/lang/lang-fr.json
+++ b/module/lang/lang-fr.json
@@ -185,7 +185,12 @@
     "FORM_MAX_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Échelle à partir de laquelle la saisie ne sera plus possible : il faudra zoomer pour reprendre la saisie",
     "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT": "Échelle minimale de saisie",
     "FORM_MIN_SNAPPING_SCALE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Échelle à partir de laquelle la saisie sera possible : il faudra dézoomer pour reprendre la saisie",
+    "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT": "Objet sélectionnable",
+    "FORM_SELECTABLE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Affiche l'objet dans les listes des outils i, i+ et insertion (ne garantit pas la sécurité de la donnée)",
+    "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT": "Objet localisable",
+    "FORM_LOCATABLE_VMAP_BUSINESS_OBJECT_TOOLTIP": "Affiche l'objet dans la liste de l'outil de localisation (ne garantit pas la sécurité de la donnée)",
     "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT": "Supprimer les objets métiers sélectionnés et les associations avec les calques ?",
+    "FORM_LOCATION_PLACEHOLDER_VMAP_BUSINESS_OBJECT": "Balise du champ localisation",
     "": "",
     "FORM_TITLE_VMAP_MODULE_MODULE": "Module {{::label}}",
     "FORM_LABEL_VMAP_MODULE_MODULE": "Libellé",
@@ -217,6 +222,7 @@
     "FORM_MAP_USERS_VMAP_PRINT_STYLE": "Utilisateurs liés au style",
     "": "",
     "FORM_ID_USERS_USER_VMAP_USER": "ID",
+    "FORM_DEFAULT_MAP_USERS_USER_VMAP_USER": "Carte par défaut",
     "FORM_PRINT_STYLES_USERS_USER_VMAP_USER": "Styles d'impression",
     "FORM_PRINT_STYLES_AVAILABLE_USERS_USER_VMAP_USER": "Styles d'impression disponibles",
     "FORM_GROUP_PRINT_STYLES_USERS_USER_VMAP_USER": "Styles d'impression liés à l'utilisateur",
@@ -318,7 +324,7 @@
     "FORM_SNAPPING_DEFAUT_TOLERANCE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Tolérance d'accrochage (pixels)",
     "FORM_SNAPPING_DEFAUT_TYPE_ACC_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Type d'accrochage",
     "FORM_SNAPPING_DEFAUT_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Visibilité des zones d'accrochage",
-    "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités, vertex et segmtents",
+    "FORM_SNAPPING_METHOD_SEN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités, vertex et segments",
     "FORM_SNAPPING_METHOD_EN_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités et vertex",
     "FORM_SNAPPING_METHOD_N_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Extrémités",
     "": "",
@@ -465,5 +471,229 @@
     "": "",
     "ERROR_SERVICE_ASSOCIATED": "Un service vMap est associé",
     "ERROR_WMSSERVICE_ASSOCIATED": "Un service WMS est associé",
-    "ERROR_LAYER_ASSOCIATED": "Une ou plusieurs couches sont associées."
+    "ERROR_LAYER_ASSOCIATED": "Une ou plusieurs couches sont associées.",
+    "": "",
+    "VMAP_CANCEL": "Annuler",
+    "VMAP_PREVIOUS": "Précédent",
+    "VMAP_NEXT": "Suivant",
+    "VMAP_FINISH": "Terminer",
+    "VMAP_LOCATE": "Localiser",
+    "VMAP_LOCATION": "Localisation",
+    "VMAP_ADD": "Ajouter",
+    "VMAP_MENU": "Menu",
+    "VMAP_CHOOSE": "Choisir",
+    "VMAP_VALIDATE": "Valider",
+    "VMAP_FILTER": "Filtre",
+    "VMAP_POINT": "Point",
+    "VMAP_MULTI_POINT": "Multi point",
+    "VMAP_LINE": "Ligne",
+    "VMAP_POLYGON": "Polygone",
+    "VMAP_CIRCLE": "Cercle",
+    "VMAP_EXPORT": "Exporter",
+    "VMAP_BUSINESS_OBJECT": "Objet métier",
+    "VMAP_BUSINESS_OBJECTS": "Objets métiers",
+    "VMAP_WMS_QUERY": "Interrogation WMS",
+    "VMAP_LEGEND": "Légende",
+    "VMAP_LAYER": "Couche",
+    "VMAP_LAYERS": "Couches",
+    "VMAP_LAYER_NAME": "Nom de la couche",
+    "VMAP_SHEET": "Calque",
+    "VMAP_SHEETS": "Calques",
+    "VMAP_MAP": "Carte",
+    "VMAP_MAPS": "Cartes",
+    "VMAP_USER": "Utilisateur",
+    "VMAP_COORDINATES": "Coordonnées",
+    "VMAP_INSERTION": "Insertion",
+    "VMAP_BACK": "Retour",
+    "VMAP_PROJETION": "Projection",
+    "VMAP_PRINT": "Impression",
+    "VMAP_TOOLS": "Outils",
+    "VMAP_BASKET": "Panier",
+    "VMAP_REPORT": "Rapport",
+    "VMAP_REPORTS": "Rapports",
+    "VMAP_ATTRS": "Attributs",
+    "VMAP_SAVE": "Sauvegarder",
+    "VMAP_YES": "Oui",
+    "VMAP_NO": "Non",
+    "VMAP_DETAILS": "Détails",
+    "VMAP_MORE_RESULTS": "Plus de résultats",
+    "VMAP_MEASURE": "Mesure",
+    "VMAP_MEASURES": "Mesures",
+    "VMAP_EDIT": "Editer",
+    "VMAP_DELETE": "Supprimer",
+    "VMAP_EMPTY": "Vider",
+    "VMAP_TYPE": "Type",
+    "VMAP_RADIUS": "Rayon",
+    "VMAP_SEE_ON_MAP": "Voir sur la carte",
+    "VMAP_CSV_EXPORT": "Exporter en CSV",
+    "VMAP_MODEL": "Modèle",
+    "VMAP_STYLE": "Style",
+    "VMAP_SCALE": "Échelle",
+    "VMAP_RESOLUTION": "Résolution",
+    "VMAP_PRINT": "Imprimer",
+    "VMAP_WMS_QUERY_RESULT": "Résultat requête WMS (GetFeatureInfo)",
+    "VMAP_WITH_RESULT": "Avec résultat",
+    "VMAP_WITHOUT_RESULT": "Sans résultat",
+    "VMAP_NO_RESULTS_AVAILABLE": "Aucun résultat disponible",
+    "VMAP_SERVICE": "Service",
+    "VMAP_FIND": "Chercher",
+    "VMAP_FILE": "Fichier",
+    "VMAP_USE": "Utiliser",
+    "VMAP_THEME": "Thème",
+    "VMAP_CENTER": "Centre",
+    "VMAP_REPROJECT": "Reprojeter",
+    "VMAP_CREATE_AND_USE": "Créér et utiliser",
+    "VMAP_ALL": "Tous",
+    "VMAP_ZOOM": "Zoom",
+    "VMAP_EXTENT": "Étendue",
+    "VMAP_DOWNLOAD": "Télécharger",
+    "VMAP_NAME": "Nom",
+    "VMAP_URL": "URL",
+    "VMAP_SERVICE_NAME": "Nom du service",
+    "VMAP_SERVICE_URL": "URL du service",
+    "VMAP_TITLE": "Titre",
+    "VMAP_VERSION": "Version",
+    "VMAP_GET_CONTENT": "Voir le contenu",
+    "VMAP_MATRIX": "Matrice",
+    "VMAP_FORMAT": "Format",
+    "": "",
+    "VMAP_LAYERTREE_DATASETS": "Jeux de données",
+    "VMAP_LAYERTREE_MAP_1": "Carte 1",
+    "VMAP_LAYERTREE_MAP_2": "Carte 2",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_SHEET": "Definit si le calque est visible",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_GROUP": "Definit si le groupe est visible",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_LAYER": "Définit si la couche est visible",
+    "VMAP_LAYERTREE_TITLE_VISIBLE_ALL_LAYER": "Définit si les couches sont visibles",
+    "VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_SHEET": "Definit si le calque est interrogeable par requête WMS",
+    "VMAP_LAYERTREE_FILTER": "Filtre",
+    "VMAP_LAYERTREE_LAYER_FILTER": "Filtre de la couche",
+    "VMAP_LAYERTREE_TRANSPARENCY": "Transparence",
+    "VMAP_LAYERTREE_APPLY_FILTER": "Appliquer le filtre",
+    "": "",
+    "VMAP_LAYERSORDER_TOOL": "Outil de modification de l'ordre des couches",
+    "VMAP_LAYERSORDER_TABLE_OF_CONTENTS": "Table des matières",
+    "VMAP_LAYERSORDER_TITLE_VISIBLE_SHEET": "Definit si le calque est visible",
+    "": "",
+    "VMAP_LEGEND_TOOL": "Légende de la carte",
+    "VMAP_LEGEND_MAP_1": "Carte 1",
+    "VMAP_LEGEND_MAP_2": "Carte 2",
+    "": "",
+    "VMAP_MAP_CANCEL_SEIZURE": "Annuler la saisie",
+    "VMAP_MAP_CHOOSE_VERTEX_TO_MODIFY": "Choix du vertex à modifier",
+    "VMAP_MAP_CANCEL_OPERATINO": "Annuler l'opération",
+    "": "",
+    "VMAP_MAPS": "CARTES",
+    "VMAP_MAPS_MANAGEMENT": "GESTION DES CARTES",
+    "": "",
+    "VMAP_ADVANCEDSELECT_TABLE": "Tableau résultant",
+    "VMAP_ADVANCEDSELECT_GRAPHIC_SELECTION": "Sélection graphique",
+    "VMAP_ADVANCEDSELECT_REQUESTER": "Requêteur",
+    "VMAP_ADVANCEDSELECT_NO_OBJECT": "Aucun objet métier ou pas de droits en édition",
+    "VMAP_ADVANCEDSELECT_DELETE_RECORDINGS": "Supprimer les enregistrements",
+    "VMAP_ADVANCEDSELECT_ADD_BASKET": "Ajouter au panier",
+    "VMAP_ADVANCEDSELECT_REPLACE_BASKET": "Remplacer panier",
+    "VMAP_ADVANCEDSELECT_OTHER_FORMATS": "Autres formats",
+    "VMAP_ADVANCEDSELECT_EXPORT_REQUEST": "Demande d'export",
+    "VMAP_ADVANCEDSELECT_EXPORT_FORMAT": "Format de sortie",
+    "VMAP_ADVANCEDSELECT_EXPORT_SRID": "Système de coordonnées (SRID)",
+    "VMAP_ADVANCEDSELECT_EXPORT_MAIL": "Addresses mail (séparées par un point virgule)",
+    "VMAP_ADVANCEDSELECT_EXPORT_SEND": "Demander un export",
+    "": "",
+    "VMAP_BASICTOOLS_BACK_TO_THE_MAP": "Retour à la carte",
+    "VMAP_BASICTOOLS_INITIAL_POSITION": "Position initialie",
+    "VMAP_BASICTOOLS_MY_POSITION": "Ma position",
+    "VMAP_BASICTOOLS_MAX_EXTENT": "Étendue max",
+    "VMAP_BASICTOOLS_MEASURE": "Mesures",
+    "VMAP_BASICTOOLS_JOIN_COORDS": "Rejoindre les coordonnées",
+    "VMAP_BASICTOOLS_MAP_LINK": "Lien vers la carte en cours",
+    "VMAP_BASICTOOLS_MAP_COMPARE": "Comparaison de carte",
+    "VMAP_BASICTOOLS_CONTROL_TOOLS": "Outils de contrôle",
+    "": "",
+    "VMAP_COMPARE_MAP_TOGGLE": "Activer / Désactiver le mode comparaison",
+    "": "",
+    "VMAP_INSERT_CREATE_OBJECT": "Créer un objet",
+    "VMAP_INSERT_NO_OBJECT": "Aucun objet métier ou pas de droits en insertion",
+    "VMAP_INSERT_ADD_PART": "Ajouter une partie",
+    "VMAP_INSERT_MODIFY_GEOM": "Modifier la géométrie",
+    "VMAP_INSERT_DELETE_PART": "Supprimer une partie",
+    "VMAP_INSERT_ADD_HOLE": "Ajouter un trou",
+    "VMAP_INSERT_DELETE_HOLE": "Supprimer un trou",
+    "VMAP_INSERT_EDIT_ATTRS": "Éditer les attributs",
+    "VMAP_INSERT_VECTOR_SNAPPING": "Accrochage vectoriel",
+    "VMAP_INSERT_VECTOR_SNAPPING_DEF": "Definit si l'objet métier est accrochable",
+    "VMAP_INSERT_SNAPPING_OPTIONS": "Options d'accrochage",
+    "VMAP_INSERT_SNAPPING_MAX_SCALE": "Échelle maximale de saisie atteinte",
+    "VMAP_INSERT_SNAPPING_MIN_SCALE": "Échelle minimale de saisie atteinte",
+    "VMAP_INSERT_RESET_DEFAULT_PARAMS": "Rétablir les paramètres par défaut",
+    "": "",
+    "VMAP_LOCATION_NEW_SCALE": "Nouvelle échelle",
+    "VMAP_LOCATION_NEW_SCALE_DEF": "Saisissez une nouvelle échelle puis cliquez sur \"Ajouter\"",
+    "VMAP_LOCATION_SEARCH_RESULTS": "Résultats de la recherche",
+    "VMAP_LOCATION_CENTER_MAP_ON_DEFAULT_EXTENT": "Centrer la carte sur l’emprise par défaut",
+    "VMAP_LOCATION_REFRESH_MAP_LAYERS": "Rafraichir les couches de la carte",
+    "VMAP_LOCATION_CENTER_MAP_ON_MAX_EXTENT": "Centrer la carte à l’étendue maximale",
+    "VMAP_LOCATION_CENTER_MAP_ON_MY_POSITION": "Centrer la carte sur ma position",
+    "VMAP_LOCATION_CENTER_MAP_ON_GIVEN_POSITION": "Centrer la carte sur une position donnée",
+    "VMAP_LOCATION_GO": "Aller",
+    "VMAP_LOCATION_GO_TO_PREV_EXTENT": "Aller à l'étendue précédente",
+    "VMAP_LOCATION_GO_TO_NEXT_EXTENT": "Aller à l'étendue suivante",
+    "": "",
+    "VMAP_MEASURE_SHOW_HIDE_ANOTATIONS": "Afficher / Cacher les annotations",
+    "VMAP_MEASURE_SHOW_MEASURES": "Afficher les mesures",
+    "VMAP_MEASURE_NO_MEASURES": "Aucune mesure à afficher",
+    "VMAP_COORDINATES_PROJ": "Projection des coordonnées",
+    "": "",
+    "VMAP_PRINT_NO_MODEL_ASSOCIATE": "Aucun modèle d'impression associé",
+    "VMAP_PRINT_MODIFY_MAP_PRINT_ZONE": "Modification de la zone d'impression sur la carte",
+    "VMAP_PRINT_MODIFY_COMPARE_MAP_PRINT_ZONE": "Modification de la zone d'impression sur la carte de comparaison",
+    "": "",
+    "VMAP_SELECTION_MULTIPLE_SELECTION": "Sélection multiple",
+    "VMAP_SELECTION_VALIDATE_GEOM": "Valider géométrie",
+    "": "",
+    "VMAP_MAPMODAL_BING_ADD_LAYER": "Ajouter une couche Bing Maps",
+    "": "",
+    "VMAP_MAPMODAL_GEOM_LOAD_FILE": "Charger une fichier local",
+    "VMAP_MAPMODAL_GEOM_SERVICE_NAME": "Nom du service",
+    "VMAP_MAPMODAL_GEOM_LAYER_NAME": "Nom de la couche",
+    "VMAP_MAPMODAL_GEOM_FILE_OR_URL": "Fichier ou URL",
+    "VMAP_MAPMODAL_GEOM_DRAG_FILE_DESCR": "Ou simplement déplacer le fichier ci-dessous",
+    "VMAP_MAPMODAL_GEOM_DRAG_FILE_HERE": "Déplacer le fichier ici",
+    "VMAP_MAPMODAL_GEOM_FORMATS": "Formats supportés",
+    "": "",
+    "VMAP_MAPMODAL_MAPLIST_TITLE": "Liste des cartes utilisables",
+    "VMAP_MAPMODAL_MAPLIST_DRAG_FILE_HERE": "Déplacer le fichier ici",
+    "VMAP_MAPMODAL_MAPLIST_NEW_MAP": "Nouvelle carte",
+    "VMAP_MAPMODAL_MAPLIST_NEW_EMPTY_MAP": "Nouvelle carte (vide)",
+    "VMAP_MAPMODAL_MAPLIST_USE_THIS_MAP": "Utiliser cette carte",
+    "VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL": "Niveau de zoom",
+    "VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL_MAX": "Niveau de zoom maximum",
+    "VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL_MIM": "Niveau de zoom minimum",
+    "": "",
+    "VMAP_MAPMODAL_TITLE": "Gestion des cartes",
+    "VMAP_MAPMODAL_MY_MAP": "Ma carte",
+    "VMAP_MAPMODAL_CHANGE_MAP": "Changer de carte",
+    "VMAP_MAPMODAL_WMS_SERVICE": "Service WMS",
+    "VMAP_MAPMODAL_WMTS_SERVICE": "Service WMTS",
+    "VMAP_MAPMODAL_XYZ_SERVICE": "Service XYZ",
+    "VMAP_MAPMODAL_LOCAL_FILE": "Fichier local",
+    "VMAP_MAPMODAL_OSM": "Open Street Map",
+    "VMAP_MAPMODAL_BING": "Bing Maps",
+    "VMAP_MAPMODAL_ADD_LAYERS": "Ajout de couches",
+    "": "",
+    "VMAP_MYMAP_TITLE": "Carte en cours",
+    "VMAP_MYMAP_DELETE_SHEET": "Supprime le calque de la carte",
+    "": "",
+    "VMAP_MAPMODAL_OSM_TITLE": "Ajouter une couche OSM",
+    "": "",
+    "VMAP_MAPMODAL_WMS_TITLE": "Ajouter une couche WMS",
+    "VMAP_MAPMODAL_WMS_ID": "Identifiant (optionnel)",
+    "VMAP_MAPMODAL_WMS_PASS": "Mot de passe (optionnel)",
+    "": "",
+    "VMAP_MAPMODAL_WMTS_TITLE": "Ajouter une couche WMTS",
+    "": "",
+    "VMAP_MAPMODAL_XYZ_TITLE": "Ajouter une couche XYZ",
+    "VMAP_MAPMODAL_XYZ_DESCR_1": "Services tuilés définis par XYZ dans l'URL exemple: http://tile.stamen.com/toner/{z}/{x}/{y}.png.",
+    "VMAP_MAPMODAL_XYZ_DESCR_2": "Par défaut, cela suit le modèle le plus utilisé où X(0) et Y(0) sont en haut à gauche.",
+    "VMAP_MAPMODAL_XYZ_DESCR_3": "Les grilles de type TMS où ces coordonnées se trouvent en bas à gauche peuvent être utilisées en utilisant {-y} dans l'URL",
+    "": ""
 }
diff --git a/module/template/layers/layersorder.html b/module/template/layers/layersorder.html
index 93b9e4b44f775c61cb93c62f77248ce848f403f9..8dbeaa271c5f810ef14cae9ebdec2afd9f2198ba 100755
--- a/module/template/layers/layersorder.html
+++ b/module/template/layers/layersorder.html
@@ -1,11 +1,11 @@
 <div id="layersorder-button">
-    <div class="list-group-item active pointer layersorder-button-content" 
-         title="Outil de modification de l'ordre des couches" 
-         collapse="{{ctrl.layersorder_collapsed === true ? 'out' : 'in'}}" 
-         data-target="#layersorder" 
+    <div class="list-group-item active pointer layersorder-button-content"
+         title="{{ 'VMAP_LAYERSORDER_TOOL' | translate }}"
+         collapse="{{ctrl.layersorder_collapsed === true ? 'out' : 'in'}}"
+         data-target="#layersorder"
          onclick="oVmap.getMapManager().collapseElement(this)">
         <span class="icon-layers2 list-group-icon"></span>
-        <span>Table des matières</span>
+        <span data-translate="VMAP_LAYERSORDER_TABLE_OF_CONTENTS"></span>
         <span class="list-group-icon2"
               ng-class="{'icon-keyboard_arrow_down':ctrl.layersorder_collapsed !== true, 'icon-keyboard_arrow_right':ctrl.layersorder_collapsed === true}"></span>
     </div>
@@ -27,13 +27,13 @@
             <div class="margin-3">
                 <!-- Checkbox visible -->
                 <div class="checkbox checkbox-info inline-checkbox">
-                    <input id="{{$id}}_visible_order_checkbox" 
-                           type="checkbox" 
-                           style="cursor:pointer" 
-                           title="Definit si la couche est visible"
+                    <input id="{{$id}}_visible_order_checkbox"
+                           type="checkbox"
+                           style="cursor:pointer"
+                           title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"
                            ng-checked="layer.values.visible === true"
                            ng-click="ctrl.setVisible(layer, !layer.values.visible)">
-                    <label for="{{$id}}_visible_order_checkbox" style="cursor:pointer" title="Definit si la couche est visible"></label>
+                    <label for="{{$id}}_visible_order_checkbox" style="cursor:pointer" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"></label>
                 </div>
             </div>
         </li>
diff --git a/module/template/layers/layertree.html b/module/template/layers/layertree.html
index 3141c44e2381b972cbd1df47df5f2c3cd7f5de90..a36096c62f26392dca0ba9775ac6a17063f756d1 100644
--- a/module/template/layers/layertree.html
+++ b/module/template/layers/layertree.html
@@ -1,12 +1,11 @@
 <div ng-if="!$root.is_mobile" id="layertree-button">
     <div class="list-group-item active pointer layertree-button-content"
-         title="Affiche les jeux de données"
          collapse="{{ctrl.layerstree_collapsed === true ? 'out' : 'in'}}"
          data-target="#layertree"
          onclick="oVmap.getMapManager().collapseElement(this)">
 
         <span class="icon-database list-group-icon"></span>
-        <span>Jeux de données</span>
+        <span data-translate="VMAP_LAYERTREE_DATASETS"></span>
         <span class="list-group-icon2" ng-class="{'icon-keyboard_arrow_down':ctrl.layerstree_collapsed !== true, 'icon-keyboard_arrow_right':ctrl.layerstree_collapsed === true}"></span>
     </div>
 </div>
@@ -15,14 +14,14 @@
 
     <ul class="nav nav-tabs layerstree-nav left" ng-show="$root.compare_enabled">
         <li ng-class="{'active' : activeMap == 1}">
-            <a href="#" ng-click="activeMap=1;ctrl.resize()">Carte 1</a>
+            <a href="#" ng-click="activeMap=1;ctrl.resize()" data-translate="VMAP_LAYERTREE_MAP_1"></a>
         </li>
         <li ng-class="{'active' : activeMap == 2}">
-            <a href="#" ng-click="activeMap=2;ctrl.resize()">Carte 2</a>
+            <a href="#" ng-click="activeMap=2;ctrl.resize()" data-translate="VMAP_LAYERTREE_MAP_2"></a>
         </li>
     </ul>
     <div class="indicators">
-        <span class="text-info icon-eye" style="font-size: 18px;line-height: 0" title="Définit si la couche est visible"></span>
+        <span class="text-info icon-eye" style="font-size: 18px;line-height: 0" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"></span>
     </div>
 
     <ul class="tree" ng-show="activeMap == 1 || !$root.compare_enabled">
@@ -47,7 +46,7 @@
                            title="Definit si le groupe est visible">
                     <label for="service_{{$id}}_visible"
                            style="cursor:pointer"
-                           title="Definit si le groupe est visible"></label>
+                           title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_GROUP' | translate }}"></label>
                 </div>
             </div>
 
@@ -73,10 +72,10 @@
                                     <input id="{{layer.$$hashKey}}_visible_order_checkbox"
                                            type="checkbox"
                                            style="cursor:pointer; position: absolute"
-                                           title="Definit si le calque est visible"
+                                           title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"
                                            ng-checked="layer.olLayer.values.visible === true"
                                            ng-click="ctrl.setVisible(layer.olLayer, !layer.olLayer.values.visible);node.visible = ctrl.isGroupVisible(node)">
-                                    <label for="{{layer.$$hashKey}}_visible_order_checkbox" style="cursor:pointer" title="Definit si la couche est visible"></label>
+                                    <label for="{{layer.$$hashKey}}_visible_order_checkbox" style="cursor:pointer" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"></label>
                                 </div>
                                 <!-- Checkbox interrogation GetFeatureInfo -->
                                 <div class="checkbox checkbox-success inline-checkbox"
@@ -85,11 +84,11 @@
                                     <input id="{{layer.$$hashKey}}_wms_queryable_checkbox"
                                            type="checkbox"
                                            style="cursor:pointer; position: absolute"
-                                           title="Definit si le calque est interrogeable par requête WMS"
+                                           title="{{ 'VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_SHEET' | translate }}"
                                            ng-disabled="layer.olLayer.values.visible === false"
                                            ng-checked="ctrl.isLayerWMSQueryable(layer.olLayer)"
                                            ng-click="ctrl.toggleLayerWMSQueryable(layer.olLayer)">
-                                    <label for="{{layer.$$hashKey}}_wms_queryable_checkbox" style="cursor:pointer" title="Definit si le calque est interrogeable par requête WMS"></label>
+                                    <label for="{{layer.$$hashKey}}_wms_queryable_checkbox" style="cursor:pointer" title="{{ 'VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_SHEET' | translate }}"></label>
                                 </div>
                             </div>
                         </ul>
@@ -99,7 +98,7 @@
                             <li ng-if="layer.olLayer.get('is_filtered')" ng-click="ctrl.displayFilterLayerModal(layer.olLayer)">
                                 <a href="#">
                                     <span class="icon-filter"></span>
-                                    Filtre
+                                    {{ 'VMAP_LAYERTREE_FILTER' | translate }}
                                 </a>
                             </li>
                             <li>
@@ -107,7 +106,7 @@
                                     <div class="row">
                                         <div class="col-xs-6">
                                             <span class="icon-star-half"></span>
-                                            Transparence
+                                            {{ 'VMAP_LAYERTREE_TRANSPARENCY' | translate }}
                                         </div>
                                         <div class="col-xs-6">
                                             <div class="layer-menu-list-slider">
@@ -117,30 +116,49 @@
                                     </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"
+                                             title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_ALL_LAYER' | translate }}"
+                                             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="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_ALL_LAYER' | translate }}"></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="{{ 'VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_LAYER' | translate }}"
+                                               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="{{ 'VMAP_LAYERTREE_TITLE_WMS_QUERYABLE_LAYER' | translate }}"></label>
                                     </div>
                                     <!-- Checkbox visible -->
                                     <div class="checkbox checkbox-info sublayer-checkbox inline-checkbox">
                                         <input id="{{layer.$$hashKey}}_sublayer_{{sublayer}}_visible_checkbox"
                                                type="checkbox"
                                                style="cursor:pointer; position: absolute"
-                                               title="Definit si la couche est visible"
+                                               title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_LAYER' | translate }}"
                                                ng-checked="ctrl.isSublayerActive(layer.olLayer, sublayer)"
                                                ng-disabled="layer.olLayer.values.visible !== true"
                                                ng-click="ctrl.toggleSubLayer(layer.olLayer, sublayer, '#' + layer.$$hashKey + '_sublayer_' + sublayer + '_visible_checkbox')">
-                                        <label for="{{layer.$$hashKey}}_sublayer_{{sublayer}}_visible_checkbox" style="cursor:pointer" title="Definit si la couche est visible">{{sublayer}}</label>
+                                        <label for="{{layer.$$hashKey}}_sublayer_{{sublayer}}_visible_checkbox" style="cursor:pointer" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_LAYER' | translate }}">{{sublayer}}</label>
                                     </div>
                                 </div>
                             </li>
@@ -170,10 +188,10 @@
                            ng-click="ctrl.setGroupVisible(node)"
                            type="checkbox"
                            style="cursor:pointer; position: absolute"
-                           title="Definit si le groupe est visible">
+                           title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_GROUP' | translate }}">
                     <label for="compare_service_{{$id}}_visible"
                            style="cursor:pointer"
-                           title="Definit si le groupe est visible"></label>
+                           title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_GROUP' | translate }}"></label>
                 </div>
             </div>
 
@@ -199,10 +217,10 @@
                                     <input id="{{layer.$$hashKey}}_compare_visible_order_checkbox"
                                            type="checkbox"
                                            style="cursor:pointer; position: absolute"
-                                           title="Definit si le calque est visible"
+                                           title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"
                                            ng-checked="layer.olLayer.values.visible === true"
                                            ng-click="ctrl.setVisible(layer.olLayer, !layer.olLayer.values.visible);node.visible = ctrl.isGroupVisible(node)">
-                                    <label for="{{layer.$$hashKey}}_compare_visible_order_checkbox" style="cursor:pointer" title="Definit si la couche est visible"></label>
+                                    <label for="{{layer.$$hashKey}}_compare_visible_order_checkbox" style="cursor:pointer" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"></label>
                                 </div>
                             </div>
                         </ul>
@@ -238,11 +256,11 @@
                                         <input id="{{layer.$$hashKey}}_compare_sublayer_{{sublayer}}_visible_checkbox"
                                                type="checkbox"
                                                style="cursor:pointer; position: absolute"
-                                               title="Definit si la couche est visible"
+                                               title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_LAYER' | translate }}"
                                                ng-checked="ctrl.isSublayerActive(layer.olLayer, sublayer)"
                                                ng-disabled="layer.olLayer.values.visible !== true"
                                                ng-click="ctrl.toggleSubLayer(layer.olLayer, sublayer, '#' + layer.$$hashKey + '_sublayer_' + sublayer + '_visible_checkbox')">
-                                        <label for="{{layer.$$hashKey}}_compare_sublayer_{{sublayer}}_visible_checkbox" style="cursor:pointer" title="Definit si la couche est visible">{{sublayer}}</label>
+                                        <label for="{{layer.$$hashKey}}_compare_sublayer_{{sublayer}}_visible_checkbox" style="cursor:pointer" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_LAYER' | translate }}">{{sublayer}}</label>
                                     </div>
                                 </div>
                             </li>
@@ -260,7 +278,7 @@
         <div class="modal-content" style="max-height: 100%">
             <div class="modal-header">
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title">Filtrer la couche: {{ctrl.olFilteredLayer.get('name')}}</h4>
+                <h4 class="modal-title">{{ 'VMAP_LAYERTREE_LAYER_FILTER' | translate }}: {{ctrl.olFilteredLayer.get('name')}}</h4>
             </div>
             <div class="modal-body modal-body-big-with-footer-3">
                 <div id="layerstree_filter_formreader"
@@ -269,8 +287,8 @@
                      app-token="ctrl.token"></div>
             </div>
             <div class="modal-footer modal-footer-sm">
-                <button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button>
-                <button type="button" class="btn btn-primary" onclick="oVmap.simuleClick('layerstree_filter_formreader_submit_btn')">Appliquer le filtre</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal" data-translate="VMAP_CANCEL"></button>
+                <button type="button" class="btn btn-primary" onclick="oVmap.simuleClick('layerstree_filter_formreader_submit_btn')" data-translate="VMAP_LAYERTREE_APPLY_FILTER"></button>
             </div>
         </div>
     </div>
diff --git a/module/template/layers/maplegend.html b/module/template/layers/maplegend.html
index 4c34eb4904c8941687b5019d7b7c9d20076a7b57..b90eb06f35416ef6e21c134007f3e78c1f73c709 100755
--- a/module/template/layers/maplegend.html
+++ b/module/template/layers/maplegend.html
@@ -1,12 +1,12 @@
 <div class="maplegendtool">
     <div ng-if="!$root.is_mobile" id="maplegendcontainer-button">
         <div class="list-group-item active pointer maplegend-button-content"
-             title="Légende de la carte"
+             title="{{ 'VMAP_LEGEND_TOOL' | translate }}"
              collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}"
              data-target="#maplegendcontainer"
              onclick="oVmap.getMapManager().collapseElement(this)">
             <span class="icon-info list-group-icon"></span>
-            <span>Légende</span>
+            <span>{{ 'VMAP_LEGEND' | translate }}</span>
             <span class="list-group-icon2"
                   ng-class="{'icon-keyboard_arrow_down':ctrl.legend_collapsed !== true, 'icon-keyboard_arrow_right':ctrl.legend_collapsed === true}"></span>
         </div>
@@ -14,10 +14,10 @@
     <div id="maplegendcontainer" class="layers-tool legend" collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}">
         <ul class="nav nav-tabs layerstree-nav" ng-show="$root.compare_enabled">
             <li ng-class="{'active' : activeMap == 1}">
-                <a href="#" ng-click="activeMap=1;ctrl.resize()">Carte 1</a>
+                <a href="#" ng-click="activeMap=1;ctrl.resize()">{{ 'VMAP_LEGEND_MAP_1' | translate }}</a>
             </li>
             <li ng-class="{'active' : activeMap == 2}">
-                <a href="#" ng-click="activeMap=2;ctrl.resize()">Carte 2</a>
+                <a href="#" ng-click="activeMap=2;ctrl.resize()">{{ 'VMAP_LEGEND_MAP_2' | translate }}</a>
             </li>
         </ul>
         <div id="maplegend" class="tree legend" ng-show="activeMap == 1 || !$root.compare_enabled">
diff --git a/module/template/layers/mapmodal/bingsuggestions.html b/module/template/layers/mapmodal/bingsuggestions.html
index 73c103c1635603357940220ab7f594c0ff7134aa..65759f611da95eedd2e350ac7b90348ec7f821eb 100755
--- a/module/template/layers/mapmodal/bingsuggestions.html
+++ b/module/template/layers/mapmodal/bingsuggestions.html
@@ -1,19 +1,18 @@
 <!-- Liste des couches utilisables -->
 
-
-<h3>Ajouter une couche Bing Maps: </h3>
+<h3>{{ 'VMAP_MAPMODAL_BING_ADD_LAYER' | translate }}: </h3>
 <hr>
 
 <div>
     <div class="row">
         <div class="col-xs-3">
-            <b>Couche:</b>
+            <b>{{ 'VMAP_LAYER' | translate }}</b>
         </div>
         <div class="col-xs-4">
-            <b>Clé Bing:</b>
+            <b>{{ 'FORM_KEY_VMAP_MAP_SERVICE' | translate }}</b>
         </div>
         <div class="col-xs-3">
-            <b>Langue:</b>
+            <b>{{ 'FORM_LANG_VMAP_MAP_SERVICE' | translate }}</b>
         </div>
         <div class="col-xs-2">
         </div>
@@ -32,7 +31,7 @@
             </select>
         </div>
         <div class="col-xs-2">
-            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">Ajouter</button>
+            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
 </div>
@@ -43,8 +42,8 @@
 <div ng-repeat="node in ctrl.catalog.services.bing">
     <div class="row">
         <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'">
-            <img src="{{node.thumbnail}}" 
-                 class="img-responsive pointer opacity-hover" 
+            <img src="{{node.thumbnail}}"
+                 class="img-responsive pointer opacity-hover"
                  ng-click="ctrl.addLayer(node)">
         </div>
         <div class="col-xs-9">
@@ -65,9 +64,9 @@
             <b>key</b>: <i>{{node.key}}</i>
         </div>
         <div class="col-xs-2">
-            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">Ajouter</button>
+            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
     <hr>
 </div>
-<button id="btn-reload-bing" style="display: none" ng-click="ctrl.reload()">Reload map</button>
\ No newline at end of file
+<button id="btn-reload-bing" style="display: none" ng-click="ctrl.reload()">Reload map</button>
diff --git a/module/template/layers/mapmodal/loadgeometry.html b/module/template/layers/mapmodal/loadgeometry.html
index 91a3b423bf39239ba40af70babc47f9d6613b2ab..25b7db296313bf615ed98f03f182d9d1c3beb61c 100755
--- a/module/template/layers/mapmodal/loadgeometry.html
+++ b/module/template/layers/mapmodal/loadgeometry.html
@@ -1,28 +1,28 @@
 <!-- Liste des cartes utilisables -->
-<h3>Ajouter une géométrie: </h3>
+<h3>{{ 'VMAP_MAPMODAL_GEOM_LOAD_FILE' | translate }}: </h3>
 <hr>
 
 
 <div>
     <div class="row">
         <div class="col-xs-3">
-            <b>Service</b>
-            <input type="text" ng-model="sServiceName" class="form-control" placeholder="Nom du service">
+            <b>{{ 'VMAP_SERVICE' | translate }}</b>
+            <input type="text" ng-model="sServiceName" class="form-control" placeholder="{{ 'VMAP_MAPMODAL_GEOM_SERVICE_NAME' | translate }}">
         </div>
         <div class="col-xs-3">
-            <b>Couche</b>
-            <input type="text" ng-model="sLayerTitle" class="form-control" placeholder="Nom de la couche">
+            <b>{{ 'VMAP_LAYER' | translate }}</b>
+            <input type="text" ng-model="sLayerTitle" class="form-control" placeholder="{{ 'VMAP_MAPMODAL_GEOM_LAYER_NAME' | translate }}">
         </div>
     </div>
     <br>
     <div class="row">
         <div class="col-xs-12">
-            <b>Fichier ou URL</b>
+            <b>{{ 'VMAP_MAPMODAL_GEOM_FILE_OR_URL' | translate }}</b>
             <div class="input-group">
-                <input type="text" id="upload-geometry-file-info" class="form-control" ng-change="bIsUrl = true" ng-model="sFileName" placeholder="http://www.ma-carte.com/get-geometry.php">
+                <input type="text" id="upload-geometry-file-info" class="form-control" ng-change="bIsUrl = true" ng-model="sFileName" placeholder="http://www.maps.com/get-geometry.php">
                 <span class="input-group-btn">
-                    <span class="btn btn-success btn-file">                       
-                        Chercher&hellip; <input type="file" id="browse-geometry-button"/>
+                    <span class="btn btn-success btn-file">
+                        {{ 'VMAP_FIND' | translate }}&hellip; <input type="file" id="browse-geometry-button"/>
                     </span>
                 </span>
             </div>
@@ -31,16 +31,16 @@
     <br>
     <div class="row">
         <div class="col-xs-12">
-            <b>Ou vous pouvez simplement déplacer le fichier ci-dessous</b>
-            <div class="upload-drop-zone" id="upload-geometry-file-drop-zone">Déplacer le fichier ici</div>
-            <div class="right"><i>Formats supportés: GPX, GeoJSON, IGC, KML, TopoJSON</i></div><br>
+            <b>{{ 'VMAP_MAPMODAL_GEOM_DRAG_FILE_DESCR' | translate }}</b>
+            <div class="upload-drop-zone" id="upload-geometry-file-drop-zone">{{ 'VMAP_MAPMODAL_GEOM_DRAG_FILE_HERE' | translate }}</div>
+            <div class="right"><i>{{ 'VMAP_MAPMODAL_GEOM_FORMATS' | translate }}: GPX, GeoJSON, IGC, KML, TopoJSON</i></div><br>
         </div>
     </div>
     <br>
     <div class="row">
         <div class="col-xs-12">
-            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">Ajouter</button>
+            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
 </div>
-<button id="btn-reload-geometry" style="display: none" ng-click="ctrl.reload()"></button>
\ No newline at end of file
+<button id="btn-reload-geometry" style="display: none" ng-click="ctrl.reload()"></button>
diff --git a/module/template/layers/mapmodal/maplist.html b/module/template/layers/mapmodal/maplist.html
index f484cc331c25d69cb5ccbb75ce05221b1ef92c12..754ce286d3715c88d7b06f0f03fe8ad5dbe3e0ef 100644
--- a/module/template/layers/mapmodal/maplist.html
+++ b/module/template/layers/mapmodal/maplist.html
@@ -1,12 +1,11 @@
 <!-- Liste des cartes utilisables -->
 
-
-<h3>Liste des cartes utilisables: </h3>
+<h3>{{ 'VMAP_MAPMODAL_MAPLIST_TITLE' | translate }}: </h3>
 <hr>
 <div>
     <div class="row">
         <div class="col-md-10">
-            <b>Fichier:</b>
+            <b>{{ 'VMAP_FILE' | translate }}:</b>
         </div>
         <div class="col-md-2">
         </div>
@@ -17,19 +16,19 @@
                 <input type="text" id="upload-file-info" class="form-control" ng-model="ctrl.newMapUrl" placeholder="http://www.ma-carte.com/get-map.php">
                 <span class="input-group-btn">
                     <span class="btn btn-success btn-file">
-                        Chercher&hellip; <input type="file" id="browse-map-button" onchange='oVmap.getMapManager().getMapModalTool().getMapListTool().changeFilePath(this)'>
+                        {{ 'VMAP_FIND' | translate }}&hellip; <input type="file" id="browse-map-button" onchange='oVmap.getMapManager().getMapModalTool().getMapListTool().changeFilePath(this)'>
                     </span>
                 </span>
             </div>
         </div>
         <div class="col-md-2">
             <!-- l'attribut "url" est utilisé si on rentre le path à la main, si on rentre par le bouton "browse", alors on utilisera le contennu de browse-map-button -->
-            <button type="button" id="upload-file-add-button" url="{{ctrl.newMapUrl}}" file-container="" class="btn btn-success right" onclick="oVmap.getMapManager().loadMapFromFile(this)">Utiliser</button>
+            <button type="button" id="upload-file-add-button" url="{{ctrl.newMapUrl}}" file-container="" class="btn btn-success right" onclick="oVmap.getMapManager().loadMapFromFile(this)">{{ 'VMAP_USE' | translate }}</button>
         </div>
     </div>
 </div>
 <br>
-<div class="upload-drop-zone" id="maplist-file-drop-zone">Déplacer le fichier ici</div>
+<div class="upload-drop-zone" id="maplist-file-drop-zone">{{ 'VMAP_MAPMODAL_MAPLIST_DRAG_FILE_HERE' | translate }}</div>
 <div id="maplist-log-message"></div>
 <div class="row">
     <div class="col-md-10"></div>
@@ -40,7 +39,7 @@
                 data-toggle="modal"
                 data-target="#mapmodal-newmap-modal"
                 ng-click="ctrl.initNewMapForm()">
-            Nouvelle carte (vide)
+            {{ 'VMAP_MAPMODAL_MAPLIST_NEW_EMPTY_MAP' | translate }}
         </button>
     </div>
 </div>
@@ -63,11 +62,11 @@
         <div class="col-md-3"></div>
         <div class="col-md-6">
             <div ng-if="node.theme_name !== null && node.theme_name !== undefined">
-                <b>Thème</b>: <i>{{node.theme_name}}</i>
+                <b>{{ 'VMAP_THEME' | translate }}</b>: <i>{{node.theme_name}}</i>
             </div>
         </div>
         <div class="col-md-3">
-            <button type="button" url="{{node.url}}" class="btn btn-primary right" data-dismiss="modal" onclick="oVmap.getMapManager().loadMap(this)">Utiliser cette carte</button>
+            <button type="button" url="{{node.url}}" class="btn btn-primary right" data-dismiss="modal" onclick="oVmap.getMapManager().loadMap(this)">{{ 'VMAP_MAPMODAL_MAPLIST_USE_THIS_MAP' | translate }}</button>
         </div>
     </div>
     <hr>
@@ -84,11 +83,11 @@
         <div class="modal-content">
             <div class="modal-header">
                 <button type="button" class="close" onclick="$('#mapmodal-newmap-modal').modal('hide')">&times;</button>
-                <h4 class="modal-title">Nouvelle carte</h4>
+                <h4 class="modal-title">{{ 'VMAP_MAPMODAL_MAPLIST_NEW_MAP' | translate }}</h4>
             </div>
             <div class="modal-body">
                 <form>
-                    <label>Centre</label>
+                    <label>{{ 'VMAP_CENTER' | translate }}</label>
                     <div class="row">
                         <div class="col-md-4">
                             <div class="input-group">
@@ -107,27 +106,27 @@
                                 <button id="myMap-newMapForm-reproject"
                                         class="btn btn-success"
                                         title="Reprojeter en fonction de la nouvelle projection"
-                                        ng-click="ctrl.reprojectCenter()">Reprojeter</button>
+                                        ng-click="ctrl.reprojectCenter()">{{ 'VMAP_REPROJECT' | translate }}</button>
                             </div>
                         </div>
                     </div>
                     <br>
 
-                    <label>Niveau de zoom</label>
+                    <label>{{ 'VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL' | translate }}</label>
                     <div class="row">
                         <div class="col-md-3">
                             <input type="number" class="form-control" required="true" ng-model="ctrl.mapForm.view.zoom">
                         </div>
                     </div>
                     <br>
-                    <label>Niveau de zoom maximum</label>
+                    <label>{{ 'VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL_MAX' | translate }}</label>
                     <div class="row">
                         <div class="col-md-3">
                             <input type="number" class="form-control" required="true" ng-model="ctrl.mapForm.view.maxZoom">
                         </div>
                     </div>
                     <br>
-                    <label>Niveau de zoom minimum</label>
+                    <label>{{ 'VMAP_MAPMODAL_MAPLIST_ZOOM_LEVEL_MIM' | translate }}</label>
                     <div class="row">
                         <div class="col-md-3">
                             <input type="number" class="form-control" required="true" ng-model="ctrl.mapForm.view.minZoom">
@@ -135,7 +134,7 @@
                     </div>
                     <br>
 
-                    <label>Projection</label>
+                    <label>{{ 'VMAP_PROJETION' | translate }}</label>
                     <select class="form-control" ng-model="ctrl.mapForm.view.projection">
                         <option ng-repeat="(key, value) in ctrl.projections"
                                 value="{{key}}">{{value}}</option>
@@ -146,7 +145,7 @@
                         <button type="submit"
                                 class="btn btn-primary center"
                                 onclick="$('#mapmodal-newmap-modal').modal('hide')"
-                                ng-click="ctrl.createNewMap()">Créér et utiliser</button>
+                                ng-click="ctrl.createNewMap()">{{ 'VMAP_CREATE_AND_USE' | translate }}</button>
                     </div>
                 </form>
             </div>
diff --git a/module/template/layers/mapmodal/maplistlitle.html b/module/template/layers/mapmodal/maplistlitle.html
index bbfb1ce35b74f2e4b9d053cecca26f3913f72c2e..274403bf9ae2e933de633e11030ac663330aacdb 100644
--- a/module/template/layers/mapmodal/maplistlitle.html
+++ b/module/template/layers/mapmodal/maplistlitle.html
@@ -4,13 +4,13 @@
     <div style="width: 100%; height: 30px;">
 
         <select class="form-control minus left margin-5 margin-sides-10" style="width: 200px" ng-model="filterTheme">
-            <option value="">Tous</option>
+            <option value="">{{ 'VMAP_ALL' | translate }}</option>
             <option ng-repeat="theme in themes | orderBy" ng-value="theme">{{theme}}</option>
         </select>
 
         <input class="form-control input-sm right margin-sides-10 margin-5"
                type="text"
-               placeholder="Rechercher"
+               placeholder="{{ 'VMAP_FIND' | translate }}"
                style="width: 200px;"
                ng-model="filter">
     </div>
diff --git a/module/template/layers/mapmodal/maplistlitle_mobile.html b/module/template/layers/mapmodal/maplistlitle_mobile.html
index 1c7713ffa71b6345a23fbd964ae430141e4d5f90..0b1f7cabd2ddb60260cda03b833f7a098b2e8d2c 100644
--- a/module/template/layers/mapmodal/maplistlitle_mobile.html
+++ b/module/template/layers/mapmodal/maplistlitle_mobile.html
@@ -5,12 +5,12 @@
         <div class="row">
             <div class="col-xs-6">
                 <select class="form-control minus left margin-5 margin-sides-10" ng-model="filterTheme">
-                    <option value="">Tous</option>
+                    <option value="">{{ 'VMAP_ALL' | translate }}</option>
                     <option ng-repeat="theme in themes track by $index" ng-value="theme">{{theme}}</option>
                 </select>
             </div>
             <div class="col-xs-6">
-                <input class="form-control input-sm right margin-sides-10 margin-5" type="text" placeholder="Rechercher" ng-model="filter">
+                <input class="form-control input-sm right margin-sides-10 margin-5" type="text" placeholder="{{ 'VMAP_FIND' | translate }}" ng-model="filter">
             </div>
         </div>
     </div>
diff --git a/module/template/layers/mapmodal/mapmodal.html b/module/template/layers/mapmodal/mapmodal.html
index 564c21f759c19544a482e9d3a31bf3f19fe018de..2b961dbd8971d65f50dc660d090821e2b320c574 100755
--- a/module/template/layers/mapmodal/mapmodal.html
+++ b/module/template/layers/mapmodal/mapmodal.html
@@ -3,7 +3,7 @@
     <div class="modal-content">
         <div class="modal-header">
             <button type="button" id="close-modal-button" class="close" data-dismiss="modal">&times;</button>
-            <h4 class="modal-title">Gestion des cartes</h4>
+            <h4 class="modal-title">{{ 'VMAP_MAPMODAL_TITLE' | translate }}</h4>
         </div>
         <!-- Body -->
         <div class="modal-body modal-body-big">
@@ -13,19 +13,19 @@
                     <br>
                     <ul class="nav nav-pills nav-stacked" style="width: 180px">
                         <br>
-                        <li data-toggle="pill" href="#modal-mymap" class="list-group-item list-group-item-modal active" onclick="oVmap.simuleClick('btn-reload-myMap')">Ma carte</li>
-                        <li data-toggle="pill" href="#modal-maplist" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-maplist')">Changer de carte</li>
+                        <li data-toggle="pill" href="#modal-mymap" class="list-group-item list-group-item-modal active" onclick="oVmap.simuleClick('btn-reload-myMap')">{{ 'VMAP_MAPMODAL_MY_MAP' | translate }}</li>
+                        <li data-toggle="pill" href="#modal-maplist" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-maplist')">{{ 'VMAP_MAPMODAL_CHANGE_MAP' | translate }}</li>
                         <br>
                         <br>
-                        <i class="center"> -- Ajout de couches -- </i>
+                        <i class="center"> -- {{ 'VMAP_MAPMODAL_ADD_LAYERS' | translate }} -- </i>
                         <br>
                         <br>
-                        <li data-toggle="pill" href="#modal-wms" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-wms')">Service WMS</li>
-                        <li data-toggle="pill" href="#modal-wmts" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-wmts')">Service WMTS</li>
-                        <li data-toggle="pill" href="#modal-xyz" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-xyz')">Service XYZ</li>
-                        <li id="modal-geometry-modal-button" data-toggle="pill" href="#modal-geometry" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-geometry')">Fichier local</li>
-                        <li data-toggle="pill" href="#modal-osm" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-osm')">Open Street Map</li>
-                        <li data-toggle="pill" href="#modal-bing" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-bing')">Bing Maps</li>
+                        <li data-toggle="pill" href="#modal-wms" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-wms')">{{ 'VMAP_MAPMODAL_WMS_SERVICE' | translate }}</li>
+                        <li data-toggle="pill" href="#modal-wmts" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-wmts')">{{ 'VMAP_MAPMODAL_WMTS_SERVICE' | translate }}</li>
+                        <li data-toggle="pill" href="#modal-xyz" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-xyz')">{{ 'VMAP_MAPMODAL_XYZ_SERVICE' | translate }}</li>
+                        <li id="modal-geometry-modal-button" data-toggle="pill" href="#modal-geometry" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-geometry')">{{ 'VMAP_MAPMODAL_LOCAL_FILE' | translate }}</li>
+                        <li data-toggle="pill" href="#modal-osm" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-osm')">{{ 'VMAP_MAPMODAL_OSM' | translate }}</li>
+                        <li data-toggle="pill" href="#modal-bing" class="list-group-item list-group-item-modal" onclick="oVmap.simuleClick('btn-reload-bing')">{{ 'VMAP_MAPMODAL_BING' | translate }}</li>
                     </ul>
                 </div>
 
diff --git a/module/template/layers/mapmodal/mymap.html b/module/template/layers/mapmodal/mymap.html
index da0f769f163d046e75f2fb512a8dfd4592bd58e3..0455f8f6ab9582894f01b72bb4e452b0536d5657 100755
--- a/module/template/layers/mapmodal/mymap.html
+++ b/module/template/layers/mapmodal/mymap.html
@@ -1,34 +1,33 @@
 <!-- Gestion de la carte en cours -->
 
-
-<h3>Carte en cours: </h3>
+<h3>{{ 'VMAP_MYMAP_TITLE' | translate }}: </h3>
 
 <hr>
 
 <!-- Vue -->
 <br>
 <div class="input-group">
-    <span class="input-group-addon" id="sizing-addon2">Projection:</span>
+    <span class="input-group-addon" id="sizing-addon2">{{ 'VMAP_PROJETION' | translate }}</span>
     <label type="text" class="form-control" value="{{ctrl.displayedView.projection}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.projection}}</label>
 </div>
 <br>
 <div class="row">
     <div class="col-md-3">
         <div class="input-group">
-            <span class="input-group-addon" id="sizing-addon2">Zoom:</span>
+            <span class="input-group-addon" id="sizing-addon2">{{ 'VMAP_ZOOM' | translate }}</span>
             <label type="text" class="form-control" value="{{ctrl.displayedView.zoom}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.zoom}}</label>
         </div>
     </div>
     <div class="col-md-9">
         <div class="input-group">
-            <span class="input-group-addon" id="sizing-addon2">Centre:</span>
+            <span class="input-group-addon" id="sizing-addon2">{{ 'VMAP_CENTER' | translate }}</span>
             <label type="text" class="form-control" value="{{ctrl.displayedView.center}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.center}}</label>
         </div>
     </div>
 </div>
 <br>
 <div class="input-group">
-    <span class="input-group-addon" id="sizing-addon2">Etendue</span>
+    <span class="input-group-addon" id="sizing-addon2">{{ 'VMAP_EXTENT' | translate }}</span>
     <label type="text" class="form-control font-12" value="{{ctrl.displayedView.extent}}" aria-describedby="sizing-addon2" style="cursor:default !important;" readonly>{{ctrl.displayedView.extent}}</label>
 </div>
 
@@ -55,14 +54,14 @@
                                 <div class="col-md-10" style="padding-right: 0px">
                                     <div class="layer-name layer-name-tree">{{layer.name}}</div>
                                     <div class="checkbox checkbox-info inline-checkbox">
-                                        <input ng-model="layer.olLayer.getVisible()" ng-model-options="{getterSetter: true}" type="checkbox" style="cursor:default; position: absolute" title="Definit si la couche est visible">
-                                        <label for="" style="cursor:default" title="Definit si la couche est visible"></label>
+                                        <input ng-model="layer.olLayer.getVisible()" ng-model-options="{getterSetter: true}" type="checkbox" style="cursor:default; position: absolute" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}">
+                                        <label for="" style="cursor:default" title="{{ 'VMAP_LAYERTREE_TITLE_VISIBLE_SHEET' | translate }}"></label>
                                     </div>
                                 </div>
                                 <div class="col-md-2">
-                                    <button class="btn btn-xs btn-warning glyphicon glyphicon glyphicon-trash right" aria-hidden="true" data-toggle="tooltip" title="Supprime la couche de la carte" ng-click="ctrl.removeLayer(layer.olLayer)"></button>
+                                    <button class="btn btn-xs btn-warning glyphicon glyphicon glyphicon-trash right" aria-hidden="true" data-toggle="tooltip" title="{{ 'VMAP_MYMAP_DELETE_SHEET' | translate }}" ng-click="ctrl.removeLayer(layer.olLayer)"></button>
                                 </div>
-                            </div>						
+                            </div>
                         </div>
                     </li>
                 </ul>
@@ -75,13 +74,13 @@
 <div style="display: inline-block; width: 100%">
 
     <div ng-if="ctrl.isIE">
-        <a id="exportMapButtonIe" class="btn btn-warning left" ng-click="ctrl.downloadBlob()">Télécharger ie</a>
+        <a id="exportMapButtonIe" class="btn btn-warning left" ng-click="ctrl.downloadBlob()">{{ 'VMAP_DOWNLOAD' | translate }}</a>
     </div>
     <div ng-if="!ctrl.isIE">
         <!-- le href est défini dans nsVmap.nsMapManager.nsMapModal.MyMap.mymapController.reloadMapFile -->
-        <a id="exportMapButton" class="btn btn-warning left" href="" download="map.json">Télécharger</a>
+        <a id="exportMapButton" class="btn btn-warning left" href="" download="map.json">{{ 'VMAP_DOWNLOAD' | translate }}</a>
     </div>
 
 
 </div>
-<button id="btn-reload-myMap" style="display: none" ng-click="ctrl.reloadTree()">Reload map</button>
\ No newline at end of file
+<button id="btn-reload-myMap" style="display: none" ng-click="ctrl.reloadTree()">Reload map</button>
diff --git a/module/template/layers/mapmodal/osmsuggestions.html b/module/template/layers/mapmodal/osmsuggestions.html
index cd6b870f1cd90782bcab1a4ecb0f96bdff38a5a9..7cddb64390585b3671fc777d1e1ebde7bfc2b21c 100755
--- a/module/template/layers/mapmodal/osmsuggestions.html
+++ b/module/template/layers/mapmodal/osmsuggestions.html
@@ -1,27 +1,27 @@
 <!-- Liste des couches utilisables -->
 
+<h3>{{ 'VMAP_MAPMODAL_OSM_TITLE' | translate }}: </h3>
 
-<h3>Ajouter une couche OSM: </h3>
 <hr>
 
 <div>
     <div class="row">
         <div class="col-xs-3">
-            <b>Nom:</b>
+            <b>{{ 'VMAP_NAME' | translate }}:</b>
         </div>
         <div class="col-xs-7">
-            <b>URL:</b>
+            <b>{{ 'VMAP_URL' | translate }}:</b>
         </div>
     </div>
     <div class="row">
         <div class="col-xs-3">
-            <input type="text" ng-model="ctrl.sLayerName" class="form-control" placeholder="Service name" aria-describedby="sizing-addon1">
+            <input type="text" ng-model="ctrl.sLayerName" class="form-control" placeholder="{{ 'VMAP_SERVICE_NAME' | translate }}" aria-describedby="sizing-addon1">
         </div>
         <div class="col-xs-7">
-            <input type="text" ng-model="ctrl.sLayerUrl" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1">
+            <input type="text" ng-model="ctrl.sLayerUrl" class="form-control" placeholder="{{ 'VMAP_SERVICE_URL' | translate }}" aria-describedby="sizing-addon1">
         </div>
         <div class="col-xs-2">
-            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">Ajouter</button>
+            <button type="button" class="btn btn-success right" ng-click="ctrl.addLayer()">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
 </div>
@@ -32,8 +32,8 @@
 <div ng-repeat="node in ctrl.catalog.services.osm">
     <div class="row">
         <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'">
-            <img src="{{node.thumbnail}}" 
-                 class="img-responsive pointer opacity-hover" 
+            <img src="{{node.thumbnail}}"
+                 class="img-responsive pointer opacity-hover"
                  ng-click="ctrl.addLayer(node)">
         </div>
         <div class="col-xs-9">
@@ -53,9 +53,9 @@
             </div>
         </div>
         <div class="col-xs-2">
-            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">Ajouter</button>
+            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
     <hr>
 </div>
-<button id="btn-reload-osm" style="display: none" ng-click="ctrl.reload()">Reload map</button>
\ No newline at end of file
+<button id="btn-reload-osm" style="display: none" ng-click="ctrl.reload()">Reload map</button>
diff --git a/module/template/layers/mapmodal/wmssuggestions.html b/module/template/layers/mapmodal/wmssuggestions.html
index f376667739b53412c9cee147b9b5190156853cbd..096259c8eb128c09336c22bf9602593814494a80 100755
--- a/module/template/layers/mapmodal/wmssuggestions.html
+++ b/module/template/layers/mapmodal/wmssuggestions.html
@@ -1,23 +1,23 @@
 <!-- Liste des cartes utilisables -->
 
 
-<h3>Ajouter une couche WMS: </h3>
+<h3>{{ 'VMAP_MAPMODAL_WMS_TITLE' | translate }}: </h3>
 <hr>
 
 <form ng-submit="ctrl.getCapabilities()">
     <div class="row">
         <div class="col-xs-3">
-            <b>Service: </b>
-            <select class="form-control" 
-                    ng-model="oSelectedService" 
+            <b>{{ 'VMAP_SERVICE' | translate }}: </b>
+            <select class="form-control"
+                    ng-model="oSelectedService"
                     ng-options="oSelectedService.name for oSelectedService in aServices"></select>
         </div>
         <div class="col-xs-9">
-            <b>URL: </b>
+            <b>{{ 'VMAP_URL' | translate }}: </b>
             <div class="input-group">
-                <input type="text" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1" ng-model="oSelectedService.url" ng-change="ctrl.reloadServicesList()">
+                <input type="text" class="form-control" placeholder="{{ 'VMAP_SERVICE_URL' | translate }}" aria-describedby="sizing-addon1" ng-model="oSelectedService.url" ng-change="ctrl.reloadServicesList()">
                 <span class="input-group-btn">
-                    <button type="submit" class="btn btn-success">Voir le contenu</button>
+                    <button type="submit" class="btn btn-success">{{ 'VMAP_GET_CONTENT' | translate }}</button>
                 </span>
             </div>
         </div>
@@ -28,13 +28,13 @@
         </div>
         <div class="col-xs-3">
             <div class="form-group">
-                <b>Identifiant (optionnel):</b>
+                <b>{{ 'VMAP_MAPMODAL_WMS_ID' | translate }}:</b>
                 <input type="text" class="form-control" ng-model="oSelectedService.login" ng-change="ctrl.reloadServicesList()">
             </div>
         </div>
         <div class="col-xs-3">
             <div class="form-group">
-                <b>Mot de passe (optionnel):</b>
+                <b>{{ 'VMAP_MAPMODAL_WMS_PASS' | translate }}:</b>
                 <input type="password" class="form-control" ng-model="oSelectedService.password" ng-change="ctrl.reloadServicesList()">
             </div>
         </div>
@@ -44,18 +44,18 @@
 <div id="load-img-wms" style="display: none; text-align: center"><img src="images/ajax-load-big.gif"></div>
 <div id="wms-suggestions-list" style="display: none">
 
-    <input class="form-control input-sm right margin-sides-10 margin-5" 
-           type="text" 
-           placeholder="Rechercher" 
+    <input class="form-control input-sm right margin-sides-10 margin-5"
+           type="text"
+           placeholder="{{ 'VMAP_FIND' | translate }}"
            style="width: 200px;"
            ng-model="filter">
 
     <table class="table table-striped">
         <thead>
             <tr>
-                <th>Titre</th>
-                <th>Nom</th>
-                <th>Projection</th>
+                <th>{{ 'VMAP_TITLE' | translate }}</th>
+                <th>{{ 'VMAP_NAME' | translate }}</th>
+                <th>{{ 'VMAP_PROJETION' | translate }}</th>
                 <th></th>
             </tr>
         </thead>
@@ -66,10 +66,10 @@
                 <td class="WMSSuggestion">{{node.projections}}</td>
                 <!-- Si la projeciton est bonne -->
                 <td class="WMSSuggestionsButton">
-                    <button type="button" 
+                    <button type="button"
                             class="btn btn-info"
                             ng-class="{'btn-danger': node.projections.indexOf(ctrl.proj) === -1}"
-                            ng-click="ctrl.addLayer(node)">Ajouter</button>
+                            ng-click="ctrl.addLayer(node)">{{ 'VMAP_ADD' | translate }}</button>
                 </td>
             </tr>
         </tbody>
@@ -89,9 +89,9 @@
                       ng-submit="ctrl.addLayer(ctrl.oLayerToAdd, oSelectedStyle.Name)">
                     <div class="row">
                         <div class="col-xs-12">
-                            <label>Style</label>                            
-                            <select class="form-control" 
-                                    ng-model="oSelectedStyle" 
+                            <label>Style</label>
+                            <select class="form-control"
+                                    ng-model="oSelectedStyle"
                                     ng-options="oStyle.Title for oStyle in ctrl.oLayerToAdd.Style"></select>
                             <br>
                             <div ng-repeat="(key, value) in ctrl.oLayerToAdd.Style[iSelectedStyleIndex]" ng-if="(value | getType) == 'string'">
@@ -102,8 +102,8 @@
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="submit" class="btn btn-primary" form="wms-select-style-modal-form">Valider</button>
+                <button type="submit" class="btn btn-primary" form="wms-select-style-modal-form">{{ 'VMAP_VALIDATE' | translate }}</button>
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/module/template/layers/mapmodal/wmtssuggestions.html b/module/template/layers/mapmodal/wmtssuggestions.html
index 5a2f5eadc0ba26f1be0558d74624fc642ae0e6d0..897dc52e39cffb301e05bc516060d29097102c80 100755
--- a/module/template/layers/mapmodal/wmtssuggestions.html
+++ b/module/template/layers/mapmodal/wmtssuggestions.html
@@ -1,45 +1,45 @@
 <!-- Liste des cartes utilisables -->
 
 
-<h3>Ajouter une couche WMTS: </h3>
+<h3>{{ 'VMAP_MAPMODAL_WMTS_TITLE' | translate }}: </h3>
 <hr>
 
 <form ng-submit="ctrl.getCapabilities()">
     <div class="row">
         <div class="col-xs-3">
-            <b>Service: </b>
-            <select id="select-wmts-service" class="form-control" 
-                    ng-model="iServiceIndex" 
+            <b>{{ 'VMAP_SERVICE' | translate }}: </b>
+            <select id="select-wmts-service" class="form-control"
+                    ng-model="iServiceIndex"
                     ng-change="ctrl.selectService(iServiceIndex)">
                 <option value=""></option>
                 <option ng-repeat="node in ctrl.catalog.services.wmts" value="{{$index}}">{{node.name}}</option>
             </select>
         </div>
         <div class="col-xs-3">
-            <b>Type: </b>
-            <select id="select-wmts-service" class="form-control" 
+            <b>{{ 'VMAP_TYPE' | translate }}: </b>
+            <select id="select-wmts-service" class="form-control"
                     ng-model="ctrl.sRequestType">
                 <option value="KVP">KVP</option>
                 <option value="REST">REST</option>
             </select>
         </div>
         <div class="col-xs-3">
-            <b>Version: </b>
-            <input type="text" id="getCapabilities-wmts-version-field" class="form-control" placeholder="Version" aria-describedby="sizing-addon1" ng-model="ctrl.sRequestVersion">
+            <b>{{ 'VMAP_VERSION' | translate }}: </b>
+            <input type="text" id="getCapabilities-wmts-version-field" class="form-control" placeholder="{{ 'VMAP_VERSION' | translate }}" aria-describedby="sizing-addon1" ng-model="ctrl.sRequestVersion">
         </div>
     </div>
     <br>
     <div class="row">
         <div class="col-xs-12">
-            <b>URL: </b>
+            <b>{{ 'VMAP_URL' | translate }}: </b>
             <div class="input-group">
                 <input type="text" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1" ng-model="ctrl.sRequestUrl">
                 <span class="input-group-btn">
-                    <button type="submit" class="btn btn-success">Voir le contenu</button>
+                    <button type="submit" class="btn btn-success">{{ 'VMAP_GET_CONTENT' | translate }}</button>
                 </span>
             </div>
         </div>
-    </div>    
+    </div>
 </form>
 
 <br>
@@ -47,18 +47,18 @@
 <div id="load-img-wmts" style="display: none; text-align: center"><img src="images/ajax-load-big.gif"></div>
 <div id="wmts-suggestions-list" style="display: none">
 
-    <input class="form-control input-sm right margin-sides-10 margin-5" 
-           type="text" 
-           placeholder="Rechercher" 
+    <input class="form-control input-sm right margin-sides-10 margin-5"
+           type="text"
+           placeholder="Rechercher"
            style="width: 200px;"
            ng-model="filter">
 
     <table class="table table-striped">
         <thead>
             <tr>
-                <th>Titre</th>
-                <th>Nom</th>
-                <th>Matrice</th>
+                <th>{{ 'VMAP_TITLE' | translate }}</th>
+                <th>{{ 'VMAP_NAME' | translate }}</th>
+                <th>{{ 'VMAP_MATRIX' | translate }}</th>
                 <th></th>
             </tr>
         </thead>
@@ -71,9 +71,9 @@
                 </td>
                 <!-- Si la projeciton est bonne -->
                 <td class="WMTSSuggestionsButton">
-                    <button type="button" 
+                    <button type="button"
                             class="btn btn-info"
-                            ng-click="ctrl.addLayer(oLayer)">Ajouter</button>
+                            ng-click="ctrl.addLayer(oLayer)">{{ 'VMAP_ADD' | translate }}</button>
                 </td>
             </tr>
         </tbody>
@@ -92,9 +92,9 @@
 
                 <div class="row">
                     <div class="col-xs-4">
-                        <label>Style</label>
-                        <select class="form-control" 
-                                ng-model="oSelectedStyle" 
+                        <label>{{ 'VMAP_STYLE' | translate }}</label>
+                        <select class="form-control"
+                                ng-model="oSelectedStyle"
                                 ng-change="ctrl.sLayerToAdd_style_name = oSelectedStyle.Identifier"
                                 ng-options="oStyle.Title for oStyle in ctrl.oLayerToAdd.Style"></select>
                         <br>
@@ -103,16 +103,16 @@
                         </div>
                     </div>
                     <div class="col-xs-4">
-                        <label>Format</label>
-                        <select id="select-wmts-service" class="form-control" 
+                        <label>{{ 'VMAP_FORMAT' | translate }}</label>
+                        <select id="select-wmts-service" class="form-control"
                                 ng-model="ctrl.sLayerToAdd_format_name">
                             <option value="?"></option>
                             <option ng-repeat="sFormat in ctrl.oLayerToAdd.Format" value="{{sFormat}}">{{sFormat}}</option>
                         </select>
                     </div>
                     <div class="col-xs-4">
-                        <label>Matrice</label>
-                        <select id="select-wmts-service" class="form-control" 
+                        <label>{{ 'VMAP_MATRIX' | translate }}</label>
+                        <select id="select-wmts-service" class="form-control"
                                 ng-model="ctrl.sLayerToAdd_matrix_name">
                             <option value="?"></option>
                             <option ng-repeat="oMatrix in ctrl.oLayerToAdd.TileMatrixSetLink" value="{{oMatrix.TileMatrixSet}}">{{oMatrix.TileMatrixSet}}</option>
@@ -126,8 +126,8 @@
 
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-primary" ng-click="ctrl.addLayerToAdd()">Valider</button>
+                <button type="button" class="btn btn-primary" ng-click="ctrl.addLayerToAdd()">{{ 'VMAP_VALIDATE' | translate }}</button>
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/module/template/layers/mapmodal/xyzsuggestions.html b/module/template/layers/mapmodal/xyzsuggestions.html
index f07b7c08342d99f47c08b53c22fec7dba51908b3..6d29b5234bb778398b02f2c49c830b115929175d 100755
--- a/module/template/layers/mapmodal/xyzsuggestions.html
+++ b/module/template/layers/mapmodal/xyzsuggestions.html
@@ -1,38 +1,37 @@
 <!-- Liste des couches utilisables -->
 
 
-<h3>Ajouter une couche XYZ: </h3>
+<h3>{{ 'VMAP_MAPMODAL_XYZ_TITLE' | translate }}: </h3>
 <i>
-    Services tuilés définis par XYZ dans l'URL exemple: http://tile.stamen.com/toner/{z}/{x}/{y}.png.
-    Par défaut, cela suit le modèle le plus utilisé où X(0) et Y(0) sont en haut à gauche.
-    Les grilles de type TMS où ces coordonnées se trouvent en bas à gauche peuvent
-    être utilisées en utilisant {-y} dans l'URL
+    {{ 'VMAP_MAPMODAL_XYZ_DESCR_1' | translate }}<br>
+    {{ 'VMAP_MAPMODAL_XYZ_DESCR_2' | translate }}<br>
+    {{ 'VMAP_MAPMODAL_XYZ_DESCR_3' | translate }}<br>
 </i>
 <hr>
 
 <form ng-submit="ctrl.addLayer()">
     <div class="row">
         <div class="col-xs-3">
-            <b>Service:</b>
-            <input type="text" class="form-control" placeholder="Nom du service" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sService" required>
+            <b>{{ 'VMAP_SERVICE' | translate }}:</b>
+            <input type="text" class="form-control" placeholder="{{ 'VMAP_SERVICE_NAME' | translate }}" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sService" required>
         </div>
         <div class="col-xs-3">
-            <b>Couche:</b>
-            <input type="text" class="form-control" placeholder="Nom de la couche" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sLayer" required>
+            <b>{{ 'VMAP_LAYER' | translate }}:</b>
+            <input type="text" class="form-control" placeholder="{{ 'VMAP_LAYER_NAME' | translate }}" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sLayer" required>
         </div>
     </div>
     <br>
     <div class="row">
         <div class="col-xs-10">
-            <b>URL: </b>
+            <b>{{ 'VMAP_URL' | translate }}: </b>
         </div>
     </div>
     <div class="row">
         <div class="col-xs-10">
-            <input type="text" class="form-control" placeholder="Service url" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sUrl" required>
+            <input type="text" class="form-control" placeholder="{{ 'VMAP_SERVICE_URL' | translate }}" aria-describedby="sizing-addon1" ng-model="ctrl.oLayerToAdd.sUrl" required>
         </div>
         <div class="col-xs-2">
-            <button type="submit" class="btn btn-success right">Ajouter</button>
+            <button type="submit" class="btn btn-success right">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
 </form>
@@ -42,8 +41,8 @@
 <div ng-repeat="node in ctrl.catalog.services.xyz">
     <div class="row">
         <div class="col-xs-3" ng-if="(node.thumbnail | getType) == 'string'">
-            <img src="{{node.thumbnail}}" 
-                 class="img-responsive pointer opacity-hover" 
+            <img src="{{node.thumbnail}}"
+                 class="img-responsive pointer opacity-hover"
                  ng-click="ctrl.addLayer(node)">
         </div>
         <div class="col-xs-9">
@@ -63,9 +62,9 @@
             </div>
         </div>
         <div class="col-xs-2">
-            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">Ajouter</button>
+            <button type="button" class="btn btn-primary right" ng-click="ctrl.addLayer(node)">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
     <hr>
 </div>
-<button id="btn-reload-xyz" style="display: none" ng-click="ctrl.reload()">Reload map</button>
\ No newline at end of file
+<button id="btn-reload-xyz" style="display: none" ng-click="ctrl.reload()">Reload map</button>
diff --git a/module/template/map/map.html b/module/template/map/map.html
index 3b411e522279f80b57ea992c17df4bc89ceb09cd..f4d5aa75400086554a8287ac9b2e1b64a3d0c3a0 100755
--- a/module/template/map/map.html
+++ b/module/template/map/map.html
@@ -5,39 +5,39 @@
     <div class="ol_draw_menu_top_buttons_container">
         <div class="col-xs-6">
             <div class="dropdown">
-                <button type="button" class="btn btn-warning" id="ol_draw_menu_dropdown_menu" data-toggle="dropdown">Menu <span class="caret"></span></button>
+                <button type="button" class="btn btn-warning" id="ol_draw_menu_dropdown_menu" data-toggle="dropdown">{{ 'VMAP_MENU' | translate }} <span class="caret"></span></button>
                 <ul class="dropdown-menu" aria-labelledby="ol_draw_menu_dropdown_menu">
                     <li>
                         <a href="#" ng-click="ctrl.cancelMobileDraw()">
                             <span class="icon-block"></span>
-                            Annuler la saisie
+                            {{ 'VMAP_MAP_CANCEL_SEIZURE' | translate }}
                         </a>
                     </li>
                     <li>
                         <a href="#" ng-click="ctrl.undoLastChange()">
                             <span class="icon-rotate_left"></span>
-                            Précédent
+                            {{ 'VMAP_PREVIOUS' | translate }}
                         </a>
                     </li>
                     <li>
                         <a href="#" ng-click="ctrl.redoLastChange()">
                             <span class="icon-rotate_right"></span>
-                            Suivant
+                            {{ 'VMAP_NEXT' | translate }}
                         </a>
                     </li>
                 </ul>
             </div>
         </div>
         <div class="col-xs-6">
-            <button type="button" class="btn btn-warning" ng-disabled="!ctrl.isDrawFeatureComplete()" ng-click="ctrl.finishMobileDraw()">Terminer</button>
+            <button type="button" class="btn btn-warning" ng-disabled="!ctrl.isDrawFeatureComplete()" ng-click="ctrl.finishMobileDraw()">{{ 'VMAP_FINISH' | translate }}</button>
         </div>
     </div>
     <div class="ol_draw_menu_bottom_buttons_container">
         <div class="col-xs-6">
-            <button type="button" class="btn btn-warning" ng-click="ctrl.geolocateMe()">Localiser</button>
+            <button type="button" class="btn btn-warning" ng-click="ctrl.geolocateMe()">{{ 'VMAP_LOCATE' | translate }}</button>
         </div>
         <div class="col-xs-6">
-            <button type="button" class="btn btn-warning" ng-click="ctrl.addMobileDrawPoint()">Ajouter</button>
+            <button type="button" class="btn btn-warning" ng-click="ctrl.addMobileDrawPoint()">{{ 'VMAP_ADD' | translate }}</button>
         </div>
     </div>
 </div>
@@ -48,16 +48,16 @@
     <div class="ol_geom_edit_menu_vertical_bar"></div>
     <div class="ol_draw_menu_top_buttons_container">
         <div ng-show="edit_state === 1" class="color-white text-center">
-            <h4>Choix du vertex à modifier</h4>
+            <h4>{{ 'VMAP_MAP_CHOOSE_VERTEX_TO_MODIFY' | translate }}</h4>
         </div>
         <div class="col-xs-6">
             <div ng-show="edit_state === 2" class="dropdown">
-                <button type="button" class="btn btn-warning" id="ol_geom_edit_menu_dropdown_menu" data-toggle="dropdown">Menu <span class="caret"></span></button>
+                <button type="button" class="btn btn-warning" id="ol_geom_edit_menu_dropdown_menu" data-toggle="dropdown">{{ 'VMAP_MENU' | translate }} <span class="caret"></span></button>
                 <ul class="dropdown-menu" aria-labelledby="ol_geom_edit_menu_dropdown_menu">
                     <li>
                         <a href="#" ng-click="ctrl.cancelMobileGeomEdition()">
                             <span class="icon-block"></span>
-                            Annuler l'opération
+                            {{ 'VMAP_MAP_CANCEL_OPERATION' | translate }}
                         </a>
                     </li>
                 </ul>
@@ -68,15 +68,15 @@
     </div>
     <div class="ol_draw_menu_bottom_buttons_container">
         <div class="col-xs-6">
-            <button ng-show="edit_state === 1" type="button" class="btn btn-warning" ng-click="ctrl.finishMobileGeomEdition()">Terminer</button>
-            <button ng-show="edit_state === 2" type="button" class="btn btn-warning" ng-click="ctrl.geolocateMe()">Localiser</button>
+            <button ng-show="edit_state === 1" type="button" class="btn btn-warning" ng-click="ctrl.finishMobileGeomEdition()">{{ 'VMAP_FINISH' | translate }}</button>
+            <button ng-show="edit_state === 2" type="button" class="btn btn-warning" ng-click="ctrl.geolocateMe()">{{ 'VMAP_LOCATE' | translate }}</button>
         </div>
         <div class="col-xs-6">
-            <button ng-show="edit_state === 1" type="button" class="btn btn-warning" ng-click="ctrl.validateGeomEditionModifyVertex()">Choisir</button>
-            <button ng-show="edit_state === 2" type="button" class="btn btn-warning" ng-click="ctrl.validateGeomEditionModifyGeometry()">Valider</button>
+            <button ng-show="edit_state === 1" type="button" class="btn btn-warning" ng-click="ctrl.validateGeomEditionModifyVertex()">{{ 'VMAP_CHOOSE' | translate }}</button>
+            <button ng-show="edit_state === 2" type="button" class="btn btn-warning" ng-click="ctrl.validateGeomEditionModifyGeometry()">{{ 'VMAP_VALIDATE' | translate }}</button>
         </div>
     </div>
 </div>
 
 <!--Bandeau popup mobile-->
-<div id="mobile-popup-bar" ng-if="$root.is_mobile" class="hidden"></div>
\ No newline at end of file
+<div id="mobile-popup-bar" ng-if="$root.is_mobile" class="hidden"></div>
diff --git a/module/template/tools/advancedselect.html b/module/template/tools/advancedselect.html
index 9e0f58029789848d5353dcddb138c5bb9c7fa15d..84b2a6ca2cb5897a8acb5b7616dda995692a5c93 100755
--- a/module/template/tools/advancedselect.html
+++ b/module/template/tools/advancedselect.html
@@ -11,7 +11,7 @@
                     style="width: 80%"
                     ng-class="{'white color-gray': ctrl.currentAction === 'basicTools-selectByPoint' || ctrl.currentAction === 'basicTools-selectByLineString' || ctrl.currentAction === 'basicTools-selectByPolygon' || ctrl.currentAction === 'basicTools-selectByCircle'}"
                     ng-click="ctrl.selectGeomType !== '' ? ctrl.startSelection(ctrl.selectGeomType, ctrl.currentAction === 'basicTools-selectBy' + ctrl.selectGeomType) : angular.noop">
-                Sélection graphique
+                {{ 'VMAP_ADVANCEDSELECT_GRAPHIC_SELECTION' | translate }}
             </button>
             <button type="button"
                     class="btn btn-sm btn-default dropdown-toggle"
@@ -28,23 +28,28 @@
             <ul class="dropdown-menu">
                 <li><a href="javascript:void(0)"
                        ng-click="ctrl.selectGeomType = 'Point'; ctrl.startSelection('Point', false)">
-                        <span class="icon-point"></span> Point
+                        <span class="icon-point"></span>
+                        {{ 'VMAP_POINT' | translate }}
                     </a></li>
                 <li><a href="javascript:void(0)"
                        ng-click="ctrl.selectGeomType = 'MultiPoint'; ctrl.startSelection('MultiPoint', false)">
-                        <span class="icon-multipoint"></span> Multi point
+                        <span class="icon-multipoint"></span>
+                        {{ 'VMAP_MULTI_POINT' | translate }}
                     </a></li>
                 <li><a href="javascript:void(0)"
                        ng-click="ctrl.selectGeomType = 'LineString'; ctrl.startSelection('LineString', false)">
-                        <span class="icon-line"></span> Ligne
+                        <span class="icon-line"></span>
+                        {{ 'VMAP_LINE' | translate }}
                     </a></li>
                 <li><a href="javascript:void(0)"
                        ng-click="ctrl.selectGeomType = 'Polygon'; ctrl.startSelection('Polygon', false)">
-                        <span class="icon-polygon"></span> Polygone
+                        <span class="icon-polygon"></span>
+                        {{ 'VMAP_POLYGON' | translate }}
                     </a></li>
                 <li><a href="javascript:void(0)"
                        ng-click="ctrl.selectGeomType = 'Circle'; ctrl.startSelection('Circle', false)">
-                        <span class="icon-circle"></span> Cercle
+                        <span class="icon-circle"></span>
+                        {{ 'VMAP_CIRCLE' | translate }}
                     </a></li>
             </ul>
         </div>
@@ -57,13 +62,13 @@
                     class="btn btn-info btn-sm btn-block"
                     ng-click="ctrl.displaySelectionTable(ctrl.aSelections)">
                 <span class="icon-format_list_bulleted margin-sides-2"></span>
-                Requêteur
+                {{ 'VMAP_ADVANCEDSELECT_REQUESTER' | translate }}
             </button>
         </div>
     </div>
     <div ng-show="!vmapScope.sizeOf(ctrl.oQueryableBOs) > 0">
         <label class="margin-10 margin-sides-10">
-            Aucun objet métier ou pas de droits en édition
+            {{ 'VMAP_ADVANCEDSELECT_NO_OBJECT' | translate }}
         </label>
     </div>
 
@@ -76,7 +81,7 @@
         <div class="modal-content">
             <div class="modal-header">
                 <button type="button" class="close" data-dismiss="modal">&times;</button>
-                <h4 class="modal-title"><span class="icon-format_list_bulleted margin-sides-5"></span>Requêteur</h4>
+                <h4 class="modal-title"><span class="icon-format_list_bulleted margin-sides-5"></span> {{ 'VMAP_ADVANCEDSELECT_REQUESTER' | translate }}</h4>
             </div>
             <div class="modal-body modal-body-big">
 
@@ -173,23 +178,28 @@
                                 </div>
                                 <div class="col-xs-8" style="text-align: right">
                                     <button class="btn btn-default" ng-click="ctrl.tableDeleteSelection('#select_table_' + bo_id)" ng-show="bo.user_rights.indexOf('DELETE') !== -1">
-                                        <span class="icon-trash"></span> Supprimer les enregistrements
+                                        <span class="icon-trash"></span>
+                                        {{ 'VMAP_ADVANCEDSELECT_DELETE_RECORDINGS' | translate }}
                                     </button>
                                     <button class="btn btn-default" ng-click="ctrl.tableAddToCard('#select_table_' + bo_id, false)">
-                                        <span class="icon-shopping_basket"></span> Ajouter au panier
+                                        <span class="icon-shopping_basket"></span>
+                                        {{ 'VMAP_ADVANCEDSELECT_ADD_BASKET' | translate }}
                                     </button>
                                     <button class="btn btn-default" ng-click="ctrl.tableAddToCard('#select_table_' + bo_id, true)">
-                                        <span class="glyphicon glyphicon-repeat"></span> Remplacer panier
+                                        <span class="glyphicon glyphicon-repeat"></span>
+                                        {{ 'VMAP_ADVANCEDSELECT_REPLACE_BASKET' | translate }}
                                     </button>
                                     <div class="export btn-group dropup">
                                         <button class="btn btn-default dropdown-toggle" aria-label="export type" title="Export data" data-toggle="dropdown" type="button">
-                                            <i class="glyphicon glyphicon-export icon-share"></i> Exporter <span class="caret"></span>
+                                            <i class="glyphicon glyphicon-export icon-share"></i>
+                                            {{ 'VMAP_EXPORT' | translate }}
+                                            <span class="caret"></span>
                                         </button>
                                         <ul class="dropdown-menu" role="menu">
                                             <li role="menuitem" data-type="json" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'json')"><a href="javascript:void(0)">JSON</a></li>
                                             <li role="menuitem" data-type="csv" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'csv')"><a href="javascript:void(0)">CSV</a></li>
                                             <li role="menuitem" data-type="excel" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'xlsx')"><a href="javascript:void(0)">MS-Excel</a></li>
-                                            <li ng-if="ctrl.bGTFExport" role="menuitem" data-type="excel" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'gtf')"><a href="javascript:void(0)">Autres formats</a></li>
+                                            <li ng-if="ctrl.bGTFExport" role="menuitem" data-type="excel" ng-click="ctrl.exportTable(bo_id, '#select_table_' + bo_id, 'gtf')"><a href="javascript:void(0)">{{ 'VMAP_ADVANCEDSELECT_OTHER_FORMATS' | translate }}</a></li>
                                         </ul>
                                     </div>
                                 </div>
@@ -208,12 +218,12 @@
         <div class="modal-content">
             <div class="modal-header">
                 <button type="button" class="close" data-dismiss="modal">&times;</button>
-                <h4 class="modal-title"><span class="glyphicon glyphicon-export icon-share margin-sides-5"></span>Demande d'export</h4>
+                <h4 class="modal-title"><span class="glyphicon glyphicon-export icon-share margin-sides-5"></span>{{ 'VMAP_ADVANCEDSELECT_EXPORT_REQUEST' | translate }}</h4>
             </div>
             <div class="modal-body">
                 <form id="vmap-gtf-export-form" ng-submit="ctrl.submitGtfExportFormModal(ctrl.oGTFExportAttibutes)">
                     <div class="form-group">
-                        <label for="vmap-gtf-export-form-format">Format de sortie</label>
+                        <label for="vmap-gtf-export-form-format">{{ 'VMAP_ADVANCEDSELECT_EXPORT_FORMAT' | translate }}</label>
                         <select id="vmap-gtf-export-form-format"
                                 class="form-control"
                                 ng-model="ctrl.oGTFExportAttibutes.format"
@@ -221,7 +231,7 @@
                                 ng-required="true"></select>
                     </div>
                     <div class="form-group">
-                        <label for="vmap-gtf-export-form-coordsys">Stystème de coordonnées (SRID)</label>
+                        <label for="vmap-gtf-export-form-coordsys">{{ 'VMAP_ADVANCEDSELECT_EXPORT_SRID' | translate }}</label>
                         <select id="vmap-gtf-export-form-coordsys"
                                 class="form-control"
                                 ng-model="ctrl.oGTFExportAttibutes.coordsys"
@@ -229,14 +239,14 @@
                                 ng-required="true"></select>
                     </div>
                     <div class="form-group">
-                        <label for="vmap-gtf-export-form-mails">Addresses mail (séparées par un point virgule)</label>
+                        <label for="vmap-gtf-export-form-mails">{{ 'VMAP_ADVANCEDSELECT_EXPORT_MAIL' | translate }}</label>
                         <input type="text" class="form-control" id="vmap-gtf-export-form-mails" placeholder="ex: john.doe@veremes.com;armand@gmail.com" ng-model="ctrl.oGTFExportAttibutes.mails" required>
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="submit" class="btn btn-primary" form="vmap-gtf-export-form">Demander un export</button>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
+                <button type="submit" class="btn btn-primary" form="vmap-gtf-export-form">{{ 'VMAP_ADVANCEDSELECT_EXPORT_SEND' | translate }}</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">{{ 'VMAP_CANCEL' | translate }}</button>
             </div>
         </div>
     </div>
diff --git a/module/template/tools/advancedselect_mobile.html b/module/template/tools/advancedselect_mobile.html
index 35341c47d45db7e68361202fd59e3f942160d01c..99bd7ac3f25952740f55496caaaa9cc0c8d93a70 100755
--- a/module/template/tools/advancedselect_mobile.html
+++ b/module/template/tools/advancedselect_mobile.html
@@ -5,7 +5,7 @@
     <select class="form-control margin-5" ng-model="ctrl.sSelectedBo" ng-options="bo_id as bo.title for (bo_id, bo) in ctrl.oBusinessObjects"></select>
 </div>
 <!-- Menu -->
-<div id="vmap_menu_requeteur_menu_{{bo_id}}" 
+<div id="vmap_menu_requeteur_menu_{{bo_id}}"
      class="advanced-select-mobile-accordion"
      ng-repeat="(bo_id, bo) in ctrl.oBusinessObjects"
      ng-show="ctrl.sSelectedBo === bo_id">
@@ -13,23 +13,23 @@
     <div class="panel list-group height-100">
         <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_requeteur_menu_filtre_{{bo_id}}" data-parent="#vmap_menu_requeteur_menu_{{bo_id}}">
             <span class="icon-filter menu_logo"></span>
-            Filtre
+            {{ 'VMAP_FILTER' | translate }}
         </a>
         <div id="vmap_menu_requeteur_menu_filtre_{{bo_id}}" class="sublinks collapse in">
 
             <!--Search Form reader-->
             <div id="select_search_form_reader_{{bo_id}}"
-                 app-form-reader 
+                 app-form-reader
                  app-properties="ctrl.properties"
                  app-token="ctrl.token"></div>
 
         </div>
         <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_requeteur_menu_table_{{bo_id}}" data-parent="#vmap_menu_requeteur_menu_{{bo_id}}">
             <span class="icon-table menu_logo"></span>
-            Tableau résultant
+            {{ 'VMAP_ADVANCEDSELECT_TABLE' | translate }}
         </a>
         <div id="vmap_menu_requeteur_menu_table_{{bo_id}}" class="sublinks collapse margin-10 advanced-select-mobile-accordion-table">
-            <table id="select_table_{{bo_id}}" 
+            <table id="select_table_{{bo_id}}"
                    class="select_modal_table"
                    data-toggle="table"
                    data-search="false"
@@ -54,4 +54,4 @@
             </table>
         </div>
     </div>
-</div> 
\ No newline at end of file
+</div>
diff --git a/module/template/tools/basicselect.html b/module/template/tools/basicselect.html
index d0ecff8d419dbc2a90adbf8772de3f0f568a4e27..59e20cd50023f641f0af98e9d88f4def22636f44 100644
--- a/module/template/tools/basicselect.html
+++ b/module/template/tools/basicselect.html
@@ -20,7 +20,7 @@
     <!-- Liste des objets interrogeables -->
     <ul class="dropdown-menu basic-tools-dropdown-element basic-tools-dropdown-basicselect-content"
         ng-show="ctrl.aBusinessObjectsList.length > 0">
-        <li class="dropdown-header" ng-if="ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0">Objets métiers</li>
+        <li class="dropdown-header" ng-if="ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0">{{ 'VMAP_BUSINESS_OBJECTS' | translate }}</li>
         <li ng-repeat="bo in ctrl.aQueryableBOs | orderBy : 'bo_title'"
             ng-click="ctrl.sSelectedBo = bo.bo_id"
             onclick="oVmap.getMap().removeActionsAndTooltips();oVmap.getToolsManager().getBasicTools().toggleOutTools();">
@@ -30,7 +30,7 @@
         <li ng-click="ctrl.sSelectedBo = 'vmap_select_getfeatureinfo'"
             onclick="oVmap.getMap().removeActionsAndTooltips();oVmap.getToolsManager().getBasicTools().toggleOutTools();"
             ng-if="ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0">
-            <a href="#">Interrogation WMS</a>
+            <a href="#">{{ 'VMAP_WMS_QUERY' | translate }}</a>
         </li>
     </ul>
 </li>
diff --git a/module/template/tools/basictools.html b/module/template/tools/basictools.html
index 8d42420c8cb939607f43cac769066030a2b7c227..9cedad1ea367a00bef03e7cbd9eedef89c157ba8 100644
--- a/module/template/tools/basictools.html
+++ b/module/template/tools/basictools.html
@@ -8,7 +8,7 @@
                 <div ng-class="{'hidden': !$root.isVmapToolActive('URLGenerator')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
-                           title="Lien vers la carte en cours"
+                           title="{{ 'VMAP_BASICTOOLS_MAP_LINK' | translate }}"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
                             <span class="icon-link_url" aria-hidden="true"></span>
                         </a>
@@ -24,7 +24,7 @@
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            id="map-compare-tool-btn"
-                           title="Comparaison de carte"
+                           title="{{ 'VMAP_BASICTOOLS_MAP_COMPARE' | translate }}"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)"
                            ng-class="{'active2':$root.compare_enabled}">
                             <span class="icon-mirror" aria-hidden="true"></span>
@@ -39,7 +39,7 @@
                 <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('User')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
-                           title="Utilisateur"
+                           title="{{ 'VMAP_USER' | translate }}"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
                             <span class="icon-user" aria-hidden="true"></span>
                         </a>
@@ -53,7 +53,7 @@
                 <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Config')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
-                           title="Outils de contrôle"
+                           title="{{ 'VMAP_BASICTOOLS_CONTROL_TOOLS' | translate }}"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
                             <span class="icon-cog" aria-hidden="true"></span>
                         </a>
@@ -68,7 +68,7 @@
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a id="print-select-btn"
                            class="basic-tools-element pointer"
-                           title="Impression"
+                           title="{{ 'VMAP_PRINT' | translate }}"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
                             <span class="glyphicon glyphicon-print" aria-hidden="true"></span>
                         </a>
@@ -83,7 +83,7 @@
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            id="basic-tools-dropdown-insert-btn"
-                           title="Insertion"
+                           title="{{ 'VMAP_INSERTION' | translate }}"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
                             <span class="icon-add-feature" aria-hidden="true"></span>
                         </a>
@@ -99,7 +99,7 @@
                 <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Mesure')}">
                     <li style="position: inherit" class="basic-tools-dropdown">
                         <a 	class="basic-tools-element pointer"
-                            title="Outils de mesure"
+                            title="{{ 'VMAP_BASICTOOLS_MEASURE' | translate }}"
                             onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
                             <span class="icon-measure"></span>
                         </a>
diff --git a/module/template/tools/basictools_mobile.html b/module/template/tools/basictools_mobile.html
index 0d4cf4f74244b71fcc358a229e310247d291c9e8..d651f2a9eef025c5e6c7f8b0cc1c9cbe304e3fe0 100755
--- a/module/template/tools/basictools_mobile.html
+++ b/module/template/tools/basictools_mobile.html
@@ -28,7 +28,7 @@
 
                 <!-- Bouton retour -->
                 <div class="btn btn-default vmap_return_tool right" ng-click="ctrl.hideMobileMenu()">
-                    <span class="icon-caret-left"></span> Retour à la carte
+                    <span class="icon-caret-left"></span> {{ 'VMAP_BASICTOOLS_BACK_TO_THE_MAP' | translate }}
                 </div>
 
             </ul>
@@ -44,9 +44,9 @@
     <!--Outil couches et cartes-->
     <div ng-show="bMobileLayersMenuOpen" class="height-100">
         <ul class="nav nav-tabs navbar-default">
-            <li class="right"><a data-toggle="tab" href="#vmap_menu_map_legend">Légende</a></li>
-            <li class="right"><a data-toggle="tab" href="#vmap_menu_map_layers">Couches</a></li>
-            <li class="right active"><a data-toggle="tab" href="#vmap_menu_map_maps">Cartes</a></li>
+            <li class="right"><a data-toggle="tab" href="#vmap_menu_map_legend">{{ 'VMAP_LEGEND' | translate }}</a></li>
+            <li class="right"><a data-toggle="tab" href="#vmap_menu_map_layers">{{ 'VMAP_LAYERS' | translate }}</a></li>
+            <li class="right active"><a data-toggle="tab" href="#vmap_menu_map_maps">{{ 'VMAP_MAPS' | translate }}</a></li>
         </ul>
         <div class="tab-content" style="height: calc(100% - 42px)">
             <!-- Cartes -->
@@ -70,31 +70,31 @@
             <div class="panel list-group">
                 <a id="vmap_menu_mobile_menu_user_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_user" data-parent="#vmap_menu_mobile_menu">
                     <span class="icon-user mobile_menu_logo"></span>
-                    Utilisateur
+                    {{ 'VMAP_USER' | translate }}
                 </a>
                 <div id="vmap_menu_mobile_menu_user" app-vmap-user app-lang="ctrl.lang" app-map="ctrl.map" class="sublinks collapse"></div>
                 <a id="vmap_menu_mobile_menu_location_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_location" data-parent="#vmap_menu_mobile_menu">
                     <span class="icon-map mobile_menu_logo"></span>
-                    Localisation
+                    {{ 'VMAP_LOCATION' | translate }}
                 </a>
                 <div id="vmap_menu_mobile_menu_location" class="sublinks collapse">
-                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGoHome()"><span class="icon-home mobile_menu_logo"></span> Position initialie</a>
-                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGeolocateMe()"><span class="icon-location mobile_menu_logo"></span> Ma position</a>
-                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationMaxExtent()"><span class="icon-language mobile_menu_logo"></span> Étendue max</a>
-                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGoCoordinates()"><span class="icon-coordinates mobile_menu_logo"></span> Coordonnées</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGoHome()"><span class="icon-home mobile_menu_logo"></span> {{ 'VMAP_BASICTOOLS_INITIAL_POSITION' | translate }}</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGeolocateMe()"><span class="icon-location mobile_menu_logo"></span> {{ 'VMAP_BASICTOOLS_MY_POSITION' | translate }}</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationMaxExtent()"><span class="icon-language mobile_menu_logo"></span> {{ 'VMAP_BASICTOOLS_MAX_EXTENT' | translate }}</a>
+                    <a class="list-group-item sublist-group-item" ng-click="ctrl.locationGoCoordinates()"><span class="icon-coordinates mobile_menu_logo"></span> {{ 'VMAP_COORDINATES' | translate }}</a>
                 </div>
                 <a id="vmap_menu_mobile_menu_measure_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_measure" data-parent="#vmap_menu_mobile_menu">
                     <span class="icon-measure mobile_menu_logo"></span>
-                    Mesurer
+                    {{ 'VMAP_BASICTOOLS_MEASURE' | translate }}
                 </a>
                 <div id="vmap_menu_mobile_menu_measure" app-measure app-lang="ctrl.lang" app-map="ctrl.map" class="sublinks collapse"></div>
                 <a id="vmap_menu_mobile_menu_requeteur_button" href="#" class="list-group-item" data-parent="#vmap_menu_mobile_menu" ng-click="ctrl.displayRequeteur()">
                     <span class="icon-table mobile_menu_logo"></span>
-                    Requêteur
+                    {{ 'VMAP_ADVANCEDSELECT_REQUESTER' | translate }}
                 </a>
                 <a id="vmap_menu_mobile_menu_insert_button" href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_mobile_menu_insert" data-parent="#vmap_menu_mobile_menu">
                     <span class="icon-add-feature mobile_menu_logo"></span>
-                    Insertion
+                    {{ 'VMAP_INSERTION' | translate }}
                 </a>
                 <div id="vmap_menu_mobile_menu_insert" class="sublinks collapse">
                     <div app-insert app-lang="ctrl.lang" app-map="ctrl.map"></div>
@@ -102,7 +102,7 @@
             </div>
         </div>
     </div>
-    
+
     <!--Requêteur-->
     <div ng-show="bMobileRequeteurOpen" class="height-100">
         <div app-advancedselect app-lang="ctrl.lang" app-map="ctrl.map" class="height-100"></div>
@@ -124,19 +124,19 @@
             <div class="modal-header">
                 <!-- Bouton retour -->
                 <div class="btn btn-default vmap_mobile_return_modal right" data-dismiss="modal">
-                    <span class="icon-caret-left"></span> Retour
+                    <span class="icon-caret-left"></span> {{ 'VMAP_BACK' | translate }}
                 </div>
-                <h4 class="modal-title">Rejoindre les coordonnées</h4>
+                <h4 class="modal-title">{{ 'VMAP_BASICTOOLS_JOIN_COORDS' | translate }}</h4>
             </div>
             <div class="modal-body modal-body-big-with-footer">
-                <b>Projection:</b>
+                <b>{{ 'VMAP_PROJETION' | translate }}:</b>
                 <select class="form-control" ng-model="locationGoToProjection">
                     <option value="EPSG:4326">{{locationProjections['EPSG:4326']}}</option>
                     <option value="EPSG:3857">{{locationProjections['EPSG:3857']}}</option>
                     <option value="EPSG:2154">{{locationProjections['EPSG:2154']}}</option>
                 </select>
                 <br>
-                <b>Coordonnées:</b>
+                <b>VMAP_COORDINATES:</b>
                 <div class="input-group-sm">
                     <input type="number" class="form-control" placeholder="X" ng-model="locationGoToX">
                 </div>
@@ -145,9 +145,9 @@
                 </div>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-default" data-dismiss="modal">Annuler</button>
-                <button type="button" class="btn btn-primary" ng-click="ctrl.locationGoTo(locationGoToX, locationGoToY, locationGoToProjection)">Valider</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">{{ 'VMAP_CANCEL' | translate }}</button>
+                <button type="button" class="btn btn-primary" ng-click="ctrl.locationGoTo(locationGoToX, locationGoToY, locationGoToProjection)">{{ 'VMAP_VALIDATE' | translate }}</button>
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/module/template/tools/comparemapmanager.html b/module/template/tools/comparemapmanager.html
index 5400040928382b75fee2971115575455e96f07c6..602d9bf0c538953e2b549617230a12edeb849f77 100644
--- a/module/template/tools/comparemapmanager.html
+++ b/module/template/tools/comparemapmanager.html
@@ -11,7 +11,7 @@
                 <label for="useCompareModeCheckbox"
                        style="cursor:pointer"
                        title="Activer / Désactiver le mode comparaison">
-                    Activer / Désactiver le mode comparaison
+                    {{ 'VMAP_COMPARE_MAP_TOGGLE' | translate }}
                 </label>
             </div>
         </div>
diff --git a/module/template/tools/controls.html b/module/template/tools/controls.html
index 63a7284c85166b12882126b5b69fbf2ac43b3810..8bfc997e2611b87d06c59902f6b8b660c3bf5a78 100755
--- a/module/template/tools/controls.html
+++ b/module/template/tools/controls.html
@@ -1,11 +1,11 @@
 
-<i class="basic-tools-dropdown-title">Outils</i>
+<i class="basic-tools-dropdown-title">{{ 'VMAP_TOOLS' | translate }}</i>
 
 <ul class="basic-tools-dropdown-menu">
     <li role="separator" class="divider"></li>
 
 
-    <li ng-repeat="tool in ctrl.aAvaliableControls" 
+    <li ng-repeat="tool in ctrl.aAvaliableControls"
         ng-click="tool.active = !tool.active; ctrl.Controls.setToolActive(tool.id, tool.active);">
         <a data-toggle="tooltip" data-placement="left"
            title="{{::tool.description}}">
diff --git a/module/template/tools/infocontainer.html b/module/template/tools/infocontainer.html
index 187bfcaedb5653aec80fb2cebccfe0d4ec8c5f15..5e2483480119630aa91546173664c81f7eae6db0 100644
--- a/module/template/tools/infocontainer.html
+++ b/module/template/tools/infocontainer.html
@@ -8,7 +8,7 @@
             <li class="margin-sides-10">
                 <label class="color-dark-blue">
                     <span class="icon-shopping_basket my-card-logo"></span>
-                    MON PANIER
+                    {{ 'VMAP_BASKET' | translate }}
                 </label>
             </li>
             <li role="presentation"
@@ -32,7 +32,7 @@
                 <button class="btn btn-default btn-xs"
                         type="button"
                         onclick="oVmap.getMap().getLocationOverlayFeatures().clear()">
-                    <span class="glyphicon glyphicon-remove"></span> Localisation
+                    <span class="glyphicon glyphicon-remove"></span> {{ 'VMAP_LOCATION' | translate }}
                 </button>
             </div>
             <div class="btn-group dropup infocontainer-btn-export">
@@ -42,15 +42,13 @@
                         data-toggle="dropdown"
                         aria-haspopup="true"
                         aria-expanded="false">
-                    <i class="glyphicon glyphicon-export icon-share"></i> Exporter <span class="caret"></span>
+                    <i class="glyphicon glyphicon-export icon-share"></i> {{ 'VMAP_EXPORT' | translate }} <span class="caret"></span>
                 </button>
-                </ul>
                 <ul class="dropdown-menu pull-right">
                     <li role="menuitem" data-type="json" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'json')"><a href="javascript:void(0)">JSON</a></li>
                     <li role="menuitem" data-type="xml" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'xml')"><a href="javascript:void(0)">XML</a></li>
                     <li role="menuitem" data-type="csv" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'csv')"><a href="javascript:void(0)">CSV</a></li>
                     <li role="menuitem" data-type="txt" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'txt')"><a href="javascript:void(0)">TXT</a></li>
-                    <!--<li role="menuitem" data-type="sql" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'sql')"><a href="javascript:void(0)">SQL</a></li>-->
                     <li role="menuitem" data-type="excel" ng-click="ctrl.exportTable(ctrl.selectedTabIndex, 'excel')"><a href="javascript:void(0)">MS-Excel</a></li>
                 </ul>
             </div>
@@ -62,7 +60,7 @@
                         aria-haspopup="true"
                         aria-expanded="false"
                         ng-click="ctrl.setAvaliablePrintReports(ctrl.infos[ctrl.selectedTabIndex].tabCode)">
-                    Rapports <span class="caret"></span>
+                    {{ 'VMAP_REPORTS' | translate }} <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu pull-right">
                     <li ng-repeat="printReport in ctrl.avaliablePrintReports">
diff --git a/module/template/tools/insert.html b/module/template/tools/insert.html
index b18ed5994bdc1bfbf72020ce20aae6262f22d3be..b8941d1f57a92157e337e7c796e864a031660939 100644
--- a/module/template/tools/insert.html
+++ b/module/template/tools/insert.html
@@ -5,7 +5,7 @@
     <!--selecteur d'objet métier-->
     <div class="padding-sides-10 margin-10" ng-show="vmapScope.sizeOf(aInsertableBOs) > 0">
         <div id="select-insert-layer-dropdown-button-group" class="btn-group width-100">
-            <label class="control-label text-center">Créer un objet</label>
+            <label class="control-label text-center">{{ 'VMAP_INSERT_CREATE_OBJECT' | translate }}</label>
             <select id="{{:refresh:field.id}}"
                     class="form-control"
                     ng-model="selectedBoId">
@@ -16,7 +16,7 @@
     </div>
     <div ng-show="!vmapScope.sizeOf(aInsertableBOs) > 0">
         <label class="margin-10 margin-sides-10">
-            Aucun objet métier ou pas de droits en insertion
+            {{ 'VMAP_INSERT_NO_OBJECT' | translate }}
         </label>
     </div>
 
@@ -30,22 +30,26 @@
                         class="btn btn-sm btn-info"
                         style="width: 80%"
                         ng-class="{'white color-gray': ctrl.currentAction === 'basicTools-insert-insertPoint' || ctrl.currentAction === 'basicTools-insert-insertLineString' || ctrl.currentAction === 'basicTools-insert-insertPolygon' || ctrl.currentAction === 'basicTools-insert-insertCircle'}"
-                        ng-click="ctrl.addPartGeomType !== '' ? ctrl.startInsertion('insert' + ctrl.addPartGeomType, ctrl.currentAction === 'basicTools-insert-insert' + ctrl.addPartGeomType) : angular.noop">
-                    Ajouter une partie
+                        ng-click="ctrl.addPartGeomType !== '' ? ctrl.startInsertion('insert' + ctrl.addPartGeomType, ctrl.currentAction === 'basicTools-insert-insert' + ctrl.addPartGeomType) : ctrl.showDrawTypeSelectDropdown()">
+                    {{ 'VMAP_INSERT_ADD_PART' | translate }}
                 </button>
                 <button type="button"
+                        id="vmap-insert-select-type-dropdown-trigger"
                         class="btn btn-sm btn-default dropdown-toggle"
                         style="width: 20%"
                         data-toggle="dropdown"
                         aria-haspopup="true"
-                        aria-expanded="false">
+                        aria-expanded="false"
+                        ng-click="(oInsertObject.sGeomType !== 'GEOMETRYCOLLECTION' && oInsertObject.sGeomType !== 'GEOMETRY') ? ctrl.startInsertion('insert' + ctrl.addPartGeomType, ctrl.currentAction === 'basicTools-insert-insert' + ctrl.addPartGeomType) : angular.noop">
                     <span class="caret" ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' && ctrl.addPartGeomType === ''"></span>
                     <span class="icon-point" ng-show="ctrl.addPartGeomType === 'Point'"></span>
                     <span class="icon-line" ng-show="ctrl.addPartGeomType === 'LineString'"></span>
                     <span class="icon-polygon" ng-show="ctrl.addPartGeomType === 'Polygon'"></span>
                     <span class="icon-circle" ng-show="ctrl.addPartGeomType === 'Circle'"></span>
                 </button>
-                <ul class="dropdown-menu">
+                <ul ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY'"
+                    id="vmap-insert-select-type-dropdown"
+                    class="dropdown-menu">
                     <li><a href="javascript:void(0)"
                            ng-show="oInsertObject.sGeomType === 'GEOMETRYCOLLECTION' || oInsertObject.sGeomType === 'GEOMETRY' || oInsertObject.sGeomType === 'POINT' || oInsertObject.sGeomType === 'MULTIPOINT'"
                            ng-click="ctrl.addPartGeomType = 'Point'; ctrl.startInsertion('insertPoint', false)">
@@ -79,7 +83,7 @@
                        ng-click="ctrl.startInsertion('editFeature', ctrl.currentAction === 'basicTools-insert-editFeature')"
                        ng-show="featuresLength > 0">
                         <span class="icon-edit"></span>
-                        <span class="margin-sides-10">Modifier la géométrie</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_MODIFY_GEOM' | translate }}</span>
                     </a>
                 </li>
                 <li class="basic-tools-dropdown-btn">
@@ -88,7 +92,7 @@
                        ng-click="ctrl.startInsertion('deleteFeature', ctrl.currentAction === 'basicTools-insert-deleteFeature')"
                        ng-show="featuresLength > 0">
                         <span class="icon-trash"></span>
-                        <span class="margin-sides-10">Supprimer une partie</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_DELETE_PART' | translate }}</span>
                     </a>
                 </li>
                 <li class="basic-tools-dropdown-btn">
@@ -97,7 +101,7 @@
                        ng-class="{'active': ctrl.currentAction === 'basicTools-insert-addHole'}"
                        ng-click="ctrl.startInsertion('addHole', ctrl.currentAction === 'basicTools-insert-addHole')">
                         <span class="icon-dot-circle-o"></span>
-                        <span class="margin-sides-10">Ajouter trou</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_ADD_HOLE' | translate }}</span>
                     </a>
                 </li>
                 <li class="basic-tools-dropdown-btn">
@@ -106,7 +110,7 @@
                        ng-class="{'active': ctrl.currentAction === 'basicTools-insert-deleteHole'}"
                        ng-click="ctrl.startInsertion('deleteHole', ctrl.currentAction === 'basicTools-insert-deleteHole')">
                         <span class="icon-dot-circle-o"></span>
-                        <span class="margin-sides-10">Supprimer trou</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_DELETE_HOLE' | translate }}</span>
                     </a>
                 </li>
             </ul>
@@ -118,17 +122,17 @@
                 <a class="btn-draw"
                    ng-click="ctrl.displayEditFrom()">
                     <span class="icon-format_list_bulleted"></span>
-                    <span class="margin-sides-10">Éditer les attributs</span>
+                    <span class="margin-sides-10">{{ 'VMAP_INSERT_EDIT_ATTRS' | translate }}</span>
                 </a>
             </li>
         </ul>
         <div class="hr-gray margin-10"></div>
         <!--Snapping-->
         <div>
-            <div class="basic-tools-dropdown-btn vmap-insert-snapping-collapse-button "
+            <div class="basic-tools-dropdown-btn vmap-insert-snapping-collapse-button pointer"
                  ng-click="ctrl.isSnapMenuCollapse = !ctrl.isSnapMenuCollapse">
                 <span class ="glyphicon glyphicon-magnet" ></span>
-                <span class="margin-sides-10"> Accrochage vectoriel </span>
+                <span class="margin-sides-10"> {{ 'VMAP_INSERT_VECTOR_SNAPPING' | translate }} </span>
                 <span class="glyphicon"
                       ng-class="{'glyphicon-menu-down': ctrl.isSnapMenuCollapse, 'glyphicon-menu-right': !ctrl.isSnapMenuCollapse }"></span>
             </div>
@@ -145,7 +149,7 @@
                                            style="cursor:pointer"
                                            ng-model="oBo.bo_snapping_enabled"
                                            ng-click="ctrl.loadVectorSnappingData()">
-                                    <label for="vmap-insert-snapping-menu-checkbox-{{$index}}" style="cursor:pointer" title="Definit si l'objet métier est accrochable">
+                                    <label for="vmap-insert-snapping-menu-checkbox-{{$index}}" style="cursor:pointer" title="{{ 'VMAP_INSERT_VECTOR_SNAPPING_DEF' | translate }}">
                                         {{oBo.bo_title}}
                                     </label>
                                 </div>
@@ -170,7 +174,7 @@
                                 class="btn btn-info btn-xs width-100"
                                 ng-click="ctrl.showSnappingOptionsModal()">
                             <span class="fa fa-cog margin-sides-2"></span>
-                            Options d'accrochage
+                            {{ 'VMAP_INSERT_SNAPPING_OPTIONS' | translate }}
                         </button>
                     </div>
                 </div>
@@ -179,10 +183,10 @@
         </div>
         <!--Messages d'alerte pour l'échelle d'édition-->
         <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMaxScaleOk">
-            <span class="glyphicon glyphicon-warning-sign"></span> Échelle maximale de saisie atteinte
+            <span class="glyphicon glyphicon-warning-sign"></span> {{ 'VMAP_INSERT_SNAPPING_MAX_SCALE' | translate }}
         </div>
         <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMinScaleOk">
-            <span class="glyphicon glyphicon-warning-sign"></span> Échelle minimale de saisie atteinte
+            <span class="glyphicon glyphicon-warning-sign"></span> {{ 'VMAP_INSERT_SNAPPING_MIN_SCALE' | translate }}
         </div>
         <!--Boutons-->
         <div style="text-align: center; padding: 0px 8px;">
@@ -190,7 +194,7 @@
                     class="btn btn-info btn-sm btn-block"
                     ng-click="ctrl.submitInsertion()">
                 <span class="glyphicon glyphicon-share-alt margin-sides-2"></span>
-                Sauvegarder
+                {{ 'VMAP_SAVE' | translate }}
             </button>
         </div>
     </div>
@@ -204,7 +208,7 @@
         <div class="modal-content" style="">
             <div class="modal-header">
                 <button type="button" class="close" data-dismiss="modal">×</button>
-                <h4 class="modal-title">Attributs</h4>
+                <h4 class="modal-title">{{ 'VMAP_ATTRS' | translate }}</h4>
             </div>
             <div class="modal-body modal-body-big-with-footer-3 font-12 width-100">
 
@@ -220,13 +224,13 @@
             </div>
             <div class="modal-footer modal-footer-sm text-left">
                 <button class="btn btn-info"
-                        ng-click="ctrl.validateForm()">
-                    Modifier la géométrie
+                        ng-click="ctrl.closeFormToEditGeom()">
+                    {{ 'VMAP_INSERT_MODIFY_GEOM' | translate }}
                 </button>
                 <button type="submit" class="btn btn-primary" form="basictools-insert-form-reader-form"
                         ng-click="ctrl.trySubmitInsertion()">
                     <span class="glyphicon glyphicon-share-alt margin-2"></span>
-                    Sauvegarder
+                    {{ 'VMAP_SAVE' | translate }}
                 </button>
             </div>
         </div>
@@ -266,11 +270,11 @@
                         <h5 data-translate="FORM_SNAPPING_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
                         <div class="radio radio-inline">
                             <input type="radio" name="vmap_insert_snap_visible" id="vmap_insert_snap_visible_1" ng-model="ctrl.tmpSnapOptions.visible" ng-value="true">
-                            <label for="vmap_insert_snap_visible_1">Oui</label>
+                            <label for="vmap_insert_snap_visible_1">{{ 'VMAP_YES' | translate }}</label>
                         </div>
                         <div class="radio radio-inline">
                             <input type="radio" name="vmap_insert_snap_visible" id="vmap_insert_snap_visible_2" ng-model="ctrl.tmpSnapOptions.visible" ng-value="false">
-                            <label for="vmap_insert_snap_visible_2">Non</label>
+                            <label for="vmap_insert_snap_visible_2">{{ 'VMAP_NO' | translate }}</label>
                         </div>
                     </div>
                 </div>
@@ -293,7 +297,7 @@
                                             id="vmap_insert_snap_avoid_superpositions_1_{{$index}}"
                                             ng-model="ctrl.tmpSnapOptions.avoidSuperpositions[bo.bo_id]"
                                             ng-value="true">
-                                    <label for="vmap_insert_snap_avoid_superpositions_1_{{$index}}">Oui</label>
+                                    <label for="vmap_insert_snap_avoid_superpositions_1_{{$index}}">{{ 'VMAP_YES' | translate }}</label>
                                 </div>
                                 <div class="radio radio-inline">
                                     <input  type="radio"
@@ -301,7 +305,7 @@
                                             id="vmap_insert_snap_avoid_superpositions_2_{{$index}}"
                                             ng-model="ctrl.tmpSnapOptions.avoidSuperpositions[bo.bo_id]"
                                             ng-value="false">
-                                    <label for="vmap_insert_snap_avoid_superpositions_2_{{$index}}">Non</label>
+                                    <label for="vmap_insert_snap_avoid_superpositions_2_{{$index}}">{{ 'VMAP_NO' | translate }}</label>
                                 </div>
                             </div>
                         </div>
@@ -310,10 +314,10 @@
             </div>
             <div class="modal-footer modal-footer-sm text-left">
                 <button class="btn btn-primary" ng-click="ctrl.resetSnapOptions()">
-                    Rétablir les paramètres par défaut
+                    {{ 'VMAP_INSERT_RESET_DEFAULT_PARAMS' | translate }}
                 </button>
                 <button class="btn btn-primary" ng-click="ctrl.submitSnappingOptionsModal()">
-                    Valider
+                    {{ 'VMAP_VALIDATE' | translate }}
                 </button>
             </div>
         </div>
diff --git a/module/template/tools/insert_mobile.html b/module/template/tools/insert_mobile.html
index 768c5b0f7aba4cee60b8cf12d7350ca33cfa9f12..db047b1a7b00c6bd3467bcec52d011c28c428efa 100755
--- a/module/template/tools/insert_mobile.html
+++ b/module/template/tools/insert_mobile.html
@@ -10,18 +10,18 @@
             <div class="modal-header">
                 <!-- Bouton retour -->
                 <div class="btn btn-default vmap_mobile_return_modal right" data-dismiss="modal" onclick="oVmap.getToolsManager().getBasicTools().toggleOutTools()">
-                    <span class="icon-caret-left"></span> Retour
+                    <span class="icon-caret-left"></span> {{ 'VMAP_BACK' | translate }}
                 </div>
-                <h4 class="modal-title">Attributs</h4>
+                <h4 class="modal-title">{{ 'VMAP_ATTRS' | translate }}</h4>
             </div>
             <div class="modal-body modal-body-big-with-footer-3 font-12 width-100">
 
                 <!--Form reader-->
                 <div id="basictools-insert-form-reader"
-                     app-form-reader 
-                     app-form-definition-name="oInsertObject.sFormDefinitionName" 
+                     app-form-reader
+                     app-form-definition-name="oInsertObject.sFormDefinitionName"
                      app-form-definition="oInsertObject.oFormDefinition"
-                     app-form-values="oInsertObject.oFormValues" 
+                     app-form-values="oInsertObject.oFormValues"
                      app-properties="ctrl.properties"
                      app-token="ctrl.token"></div>
 
@@ -30,9 +30,9 @@
                 <button type="submit" class="btn btn-primary" form="basictools-insert-form-reader-form"
                         ng-click="ctrl.trySubmitInsertion()">
                     <span class="glyphicon glyphicon-share-alt margin-2"></span>
-                    Sauvegarder
+                    {{ 'VMAP_SAVE' | translate }}
                 </button>
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/module/template/tools/location.html b/module/template/tools/location.html
index 62e46ed34e6b7d9853846d9d0845101216ac75a9..14d0b3cadb4f16e2cfe1acae1c077385fd29e0bf 100644
--- a/module/template/tools/location.html
+++ b/module/template/tools/location.html
@@ -4,7 +4,7 @@
         <!--Recherche-->
         <input id="location-search-input"
                type="text"
-               placeholder="Localiser.."
+               placeholder="{{ctrl.oBusinessObjects[ctrl.sSelectedLocationService].bo_enable_location && ctrl.oBusinessObjects[ctrl.sSelectedLocationService].location_placeholder != '' ? ctrl.oBusinessObjects[ctrl.sSelectedLocationService].location_placeholder : 'Localiser...'}}"
                ng-model="ctrl.locationSearch"
                ng-click="ctrl.searchLocation()">
         <!--Sélecteur-->
@@ -25,7 +25,7 @@
 
         <!--Bandeau du haut-->
         <div style="margin: 10px">
-            <label>Résultats de la recherche: </label>
+            <label>{{ 'VMAP_LOCATION_SEARCH_RESULTS' | translate }}: </label>
             <span class="glyphicon glyphicon-remove right pointer margin-sides-10"
                   ng-click="ctrl.removeLocation()"></span>
         </div>
@@ -47,7 +47,7 @@
                 </div>
 
                 <div class="location-search-dropdown-result-buttons pointer collapsed" data-toggle="collapse" href="#location-custom-search-dropdown-result-infos-{{this['$index']}}">
-                    <a>Détails</a>
+                    <a>{{ 'VMAP_DETAILS' | translate }}</a>
                     <i class="caret right" style="margin: 9px 0px 0px 6px;"></i>
                 </div>
 
@@ -73,7 +73,7 @@
                 </div>
 
                 <div class="location-search-dropdown-result-buttons pointer collapsed" data-toggle="collapse" href="#location-search-dropdown-result-infos-{{this['$index']}}">
-                    <a>Détails</a>
+                    <a>{{ 'VMAP_DETAILS' | translate }}</a>
                     <i class="caret right" style="margin: 9px 0px 0px 6px;"></i>
                 </div>
 
@@ -90,7 +90,7 @@
         <!--Bandeau du bas-->
         <div style="text-align: center; margin: 10px;">
             <button type="button" class="btn btn-sm btn-primary" ng-click="ctrl.searchLocation(ctrl.locationSearch, 12)">
-                Plus de résultats
+                {{ 'VMAP_MORE_RESULTS' | translate }}
             </button>
         </div>
     </div>
@@ -99,7 +99,7 @@
 <!--Go home-->
 <li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationHome')}">
     <a id="original-position-tool"
-       class="basic-tools-element pointer" title="Centrer la carte sur l’emprise par défaut"
+       class="basic-tools-element pointer" title="{{ 'VMAP_LOCATION_CENTER_MAP_ON_DEFAULT_EXTENT' | translate }}"
        ng-click="ctrl.goHome()">
         <span class="glyphicon glyphicon-home" aria-hidden="true"></span>
     </a>
@@ -108,7 +108,7 @@
 <!--Refresh map-->
 <li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationRefresh')}">
     <a id="original-position-tool"
-       class="basic-tools-element pointer" title="Rafraichir les couches de la carte"
+       class="basic-tools-element pointer" title="{{ 'VMAP_LOCATION_REFRESH_MAP_LAYERS' | translate }}"
        ng-click="ctrl.refreshMap()">
         <span class="icon-repeat" aria-hidden="true"></span>
     </a>
@@ -116,7 +116,7 @@
 
 <!--Max extent-->
 <li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationMaxExtent')}">
-    <a class="basic-tools-element pointer" title="Centrer la carte à l’étendue maximale"
+    <a class="basic-tools-element pointer" title="{{ 'VMAP_LOCATION_CENTER_MAP_ON_MAX_EXTENT' | translate }}"
        ng-click="ctrl.maxExtent()">
         <span class="icon-language" aria-hidden="true"></span>
     </a>
@@ -124,7 +124,7 @@
 
 <!--Geolocate me-->
 <li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationMyPosition')}">
-    <a class="basic-tools-element pointer" title="Centrer la carte sur ma position"
+    <a class="basic-tools-element pointer" title="{{ 'VMAP_LOCATION_CENTER_MAP_ON_MY_POSITION' | translate }}"
        ng-click="ctrl.geolocateMe()">
         <span class="glyphicon glyphicon-map-marker" aria-hidden="true"></span>
     </a>
@@ -134,7 +134,7 @@
 <li role="presentation" style="position: inherit" class="basic-tools-dropdown" ng-class="{'hidden': !$root.isVmapToolActive('LocationXY')}">
 
     <a class="basic-tools-element pointer"
-       title="Centrer la carte sur une position donnée"
+       title="{{ 'VMAP_LOCATION_CENTER_MAP_ON_GIVEN_POSITION' | translate }}"
        onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
         <span class="icon-coordinates" aria-hidden="true" style="font-size: 19px;line-height: 0.7 !important;"></span>
     </a>
@@ -143,14 +143,14 @@
         <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">
-                <b>Projection:</b>
+                <b>{{ 'VMAP_PROJETION' | translate }}:</b>
                 <select class="form-control" ng-model="goToProj">
                     <option value="EPSG:4326">{{ctrl.projections['EPSG:4326']}}</option>
                     <option value="EPSG:3857">{{ctrl.projections['EPSG:3857']}}</option>
@@ -161,7 +161,7 @@
                 <br>
                 <button type="button" class="btn btn-success btn-sm"
                         ng-click="ctrl.goTo(goToX, goToY, goToProj)">
-                    Go
+                    {{ 'VMAP_LOCATION_GO' | translate }}
                 </button>
             </div>
         </div>
@@ -170,7 +170,7 @@
 
 <!--Previous history-->
 <li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationPrecNext')}">
-    <a class="basic-tools-element pointer" title="Aller à l'étendue précédente"
+    <a class="basic-tools-element pointer" title="{{ 'VMAP_LOCATION_GO_TO_PREV_EXTENT' | translate }}"
        ng-click="ctrl.previousHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset >= ctrl.aLocationHistory.length - 1}">
         <span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
     </a>
@@ -178,7 +178,7 @@
 
 <!--Next history-->
 <li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationPrecNext')}">
-    <a class="basic-tools-element pointer" title="Aller à l'étendue suivante"
+    <a class="basic-tools-element pointer" title="{{ 'VMAP_LOCATION_GO_TO_NEXT_EXTENT' | translate }}"
        ng-click="ctrl.nextHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset === 0}">
         <span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>
     </a>
@@ -193,17 +193,17 @@
             <form ng-submit="ctrl.addScale()">
                 <div class="modal-header">
                     <button type="button" class="close" data-dismiss="modal">&times;</button>
-                    <h4 class="modal-title">Nouvelle échelle</h4>
+                    <h4 class="modal-title">{{ 'VMAP_LOCATION_NEW_SCALE' | translate }}</h4>
                 </div>
                 <div class="modal-body">
-                    <i>Saisissez une nouvelle échelle puis cliquez sur "ajouter"</i>
+                    <i>{{ 'VMAP_LOCATION_NEW_SCALE_DEF' | translate }}</i>
                     <div class="input-group">
                         <span class="input-group-addon" id="new-scale-describer">1:</span>
                         <input type="number" class="form-control" id="new-scale-input" aria-describedby="new-scale-describer" required>
                     </div>
                 </div>
                 <div class="modal-footer">
-                    <button type="submit" class="btn btn-primary">Ajouter</button>
+                    <button type="submit" class="btn btn-primary">{{ 'VMAP_ADD' | translate }}</button>
                 </div>
             </form>
         </div>
diff --git a/module/template/tools/location_mobile.html b/module/template/tools/location_mobile.html
index 1151791517505cb1102c080a84140027f66e6c73..471955dc447349565af3834b21c11478d463ac57 100755
--- a/module/template/tools/location_mobile.html
+++ b/module/template/tools/location_mobile.html
@@ -10,7 +10,7 @@
                     class="form-control minus left margin-5 margin-sides-10"
                     ng-if="sizeOf(ctrl.oBusinessObjects) > 0"
                     ng-model="ctrl.sSelectedLocationService"
-                    ng-change="ctrl.searchLocation()">            
+                    ng-change="ctrl.searchLocation()">
                 <!--Géocodeurs-->
                 <option ng-repeat="(key, value) in ctrl.locationServices"
                         value="{{key}}">{{value.title}}</option>
@@ -29,7 +29,7 @@
     <!--Résultats-->
     <div id="vmap_menu_location_results">
         <div class="panel list-group">
-            <!--Objet métier--> 
+            <!--Objet métier-->
             <div ng-if="locationServiceType === 'business_object'" ng-repeat="node in ctrl.locationResults">
                 <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_location_results_{{$index}}" data-parent="#vmap_menu_location_results" onclick="$('#vmap_menu_location_results .in').collapse('hide');">
                     <span ng-bind-html="node['bo_summary'][ctrl.oBusinessObjects[ctrl.sSelectedLocationService].bo_result_field]"></span>
@@ -41,13 +41,13 @@
                                 ng-bind-html="key + ': '+node['bo_summary'][key]">
                             </li>
                             <div style="margin: 10px;">
-                                <button type="button" name="button" class="btn btn-primary btn-sm pull-right" ng-click="ctrl.addToSelection(node, ctrl.oBusinessObjects[ctrl.sSelectedLocationService])">Voir sur la carte</button>
+                                <button type="button" name="button" class="btn btn-primary btn-sm pull-right" ng-click="ctrl.addToSelection(node, ctrl.oBusinessObjects[ctrl.sSelectedLocationService])">{{ 'VMAP_SEE_ON_MAP' | translate }}</button>
                             </div>
                         </ul>
                     </div>
                 </div>
             </div>
-            <!--Géocodeur--> 
+            <!--Géocodeur-->
             <div ng-if="locationServiceType === 'geocoder'" ng-repeat="node in ctrl.locationResults">
                 <a href="#" class="list-group-item" data-toggle="collapse" data-target="#vmap_menu_location_results_{{$index}}" data-parent="#vmap_menu_location_results" onclick="$('#vmap_menu_location_results .in').collapse('hide');">
                     {{node.title}}
@@ -57,7 +57,7 @@
                         <ul style="margin: 10px 0px 40px 0px;">
                             <li ng-repeat="oSummaryElement in node.summary">{{oSummaryElement.label}}: {{oSummaryElement.value}}</li>
                             <div style="margin: 10px;">
-                                <button type="button" name="button" class="btn btn-primary btn-sm pull-right" ng-click="ctrl.locatePlace(node)">Voir sur la carte</button>
+                                <button type="button" name="button" class="btn btn-primary btn-sm pull-right" ng-click="ctrl.locatePlace(node)">{{ 'VMAP_SEE_ON_MAP' | translate }}</button>
                             </div>
                         </ul>
                     </div>
@@ -77,17 +77,17 @@
             <form ng-submit="ctrl.addScale()">
                 <div class="modal-header">
                     <button type="button" class="close" data-dismiss="modal">&times;</button>
-                    <h4 class="modal-title">Nouvelle échelle</h4>
+                    <h4 class="modal-title">{{ 'VMAP_LOCATION_NEW_SCALE' | translate }}</h4>
                 </div>
                 <div class="modal-body">
-                    <i>Saisissez une nouvelle échelle puis cliquez sur "ajouter"</i>
+                    {{ 'VMAP_LOCATION_NEW_SCALE_DEF' | translate }}</i>
                     <div class="input-group">
                         <span class="input-group-addon" id="new-scale-describer">1:</span>
                         <input type="number" class="form-control" id="new-scale-input" aria-describedby="new-scale-describer" required>
                     </div>
                 </div>
                 <div class="modal-footer">
-                    <button type="submit" class="btn btn-primary">Ajouter</button>
+                    <button type="submit" class="btn btn-primary">{{ 'VMAP_ADD' | translate }}</button>
                 </div>
             </form>
         </div>
diff --git a/module/template/tools/measure.html b/module/template/tools/measure.html
index 4bde3781695ed8ea7df4feff4ca5a7c5b760b1df..8febc84446add4204690b73fc0760e64f1d4f39b 100755
--- a/module/template/tools/measure.html
+++ b/module/template/tools/measure.html
@@ -5,10 +5,10 @@
 </div>
 <div style="display: none" class="checkbox checkbox-success">
     <input id="measure-anotations" type="checkbox" style="cursor:pointer" ng-click="ctrl.showHideAnotations()" checked>
-    <label for="measure-anotations" style="cursor:pointer">Afficher / Cacher les annotations</label>
+    <label for="measure-anotations" style="cursor:pointer">{{ 'VMAP_MEASURE_SHOW_HIDE_ANOTATIONS' | translate }}</label>
 </div>
 
-<i class="basic-tools-dropdown-title">Mesure</i>
+<i class="basic-tools-dropdown-title">{{ 'VMAP_MEASURE' | translate }}</i>
 
 <ul class="basic-tools-dropdown-menu">
     <li role="separator" class="divider"></li>
@@ -20,7 +20,7 @@
                    : ctrl.currentAction === 'basicTools-measurePoint'}"
            ng-click="ctrl.drawPoint(ctrl.currentAction === 'basicTools-measurePoint')">
             <span class="icon-point"></span>
-            <span class="margin-sides-10">Point</span>
+            <span class="margin-sides-10">{{ 'VMAP_POINT' | translate }}</span>
         </a>
     </li>
     <li class="basic-tools-dropdown-btn">
@@ -30,7 +30,7 @@
                    'active': ctrl.currentAction === 'basicTools-measureLineString'}"
            ng-click="ctrl.measureLine(ctrl.currentAction === 'basicTools-measureLineString')">
             <span class="icon-line"></span>
-            <span class="margin-sides-10">Ligne</span>
+            <span class="margin-sides-10">{{ 'VMAP_LINE' | translate }}</span>
         </a>
     </li>
     <li class="basic-tools-dropdown-btn">
@@ -40,7 +40,7 @@
                    'active': ctrl.currentAction === 'basicTools-measurePolygon'}"
            ng-click="ctrl.measurePolygon(ctrl.currentAction === 'basicTools-measurePolygon')">
             <span class="icon-polygon"></span>
-            <span class="margin-sides-10">Polygone</span>
+            <span class="margin-sides-10">{{ 'VMAP_POLYGON' | translate }}</span>
         </a>
     </li>
     <li class="basic-tools-dropdown-btn">
@@ -51,7 +51,7 @@
                    : ctrl.currentAction === 'basicTools-measureCircle'}"
            ng-click="ctrl.measureCircle(ctrl.currentAction === 'basicTools-measureCircle')">
             <span class="icon-circle"></span>
-            <span class="margin-sides-10">Cercle</span>
+            <span class="margin-sides-10">{{ 'VMAP_CIRCLE' | translate }}</span>
         </a>
     </li>
 
@@ -65,7 +65,7 @@
                    : ctrl.currentAction === 'basicTools-modifyMeasure'}"
            ng-click="ctrl.modifyFeature(ctrl.currentAction === 'basicTools-modifyMeasure')">
             <span class="glyphicon glyphicon-pencil"></span>
-            <span class="margin-sides-10">Editer</span>
+            <span class="margin-sides-10">{{ 'VMAP_EDIT' | translate }}</span>
         </a>
     </li>
     <li class="basic-tools-dropdown-btn">
@@ -75,13 +75,13 @@
                    'active': ctrl.currentAction === 'basicTools-deleteMeasure'}"
            ng-click="ctrl.deleteFeature(ctrl.currentAction === 'basicTools-deleteMeasure')">
             <span class="glyphicon glyphicon-remove"></span>
-            <span class="margin-sides-10">Supprimer</span>
+            <span class="margin-sides-10">{{ 'VMAP_DELETE' | translate }}</span>
         </a>
     </li>
     <li class="basic-tools-dropdown-btn">
         <a id="measure-deleteAllFeatures-btn" class="btn-measure" ng-click="ctrl.deleteAllFeatures()">
             <span class="glyphicon glyphicon-trash"></span>
-            <span class="margin-sides-10">Vider</span>
+            <span class="margin-sides-10">{{ 'VMAP_EMPTY' | translate }}</span>
         </a>
     </li>
 
@@ -90,7 +90,7 @@
                                             data-toggle="modal"
                                             data-target="#measureAndDrawModal"
                                             ng-click="ctrl.displayFeatures()">
-            Afficher les mesures
+            {{ 'VMAP_MEASURE_SHOW_MEASURES' | translate }}
         </a></li>
 </ul>
 
@@ -102,19 +102,19 @@
         <div class="modal-content">
             <div class="modal-header">
                 <button id="modal-display-measure-close" type="button" class="close" data-dismiss="modal">&times;</button>
-                <h4 class="modal-title">Mesures</h4>
+                <h4 class="modal-title">{{ 'VMAP_MEASURES' | translate }}</h4>
             </div>
             <div class="modal-body modal-body-big" style="height:82%">
                 <div ng-if="ctrl.sketches.length === 0">
-                    <b>Aucune mesure à afficher</b>
+                    <b>{{ 'VMAP_MEASURE_NO_MEASURES' | translate }}</b>
                 </div>
                 <div ng-repeat="feature in ctrl.sketches">
 
                     <div ng-if="feature.get('Type') === 'Cercle'">
                         <div class="font-15" class="font-14">
-                            <div><b class="font-15">Type: </b>{{feature.get('Type')}}</div>
-                            <div><b class="font-15">Rayon: </b>{{feature.get('Rayon')}}</div>
-                            <div><b class="font-15">Projection des coordonnées </b>{{ctrl.oProjections[feature.get('Projection')]}}</div>
+                            <div><b class="font-15">{{ 'VMAP_TYPE' | translate }}: </b>{{feature.get('Type')}}</div>
+                            <div><b class="font-15">{{ 'VMAP_RADIUS' | translate }}: </b>{{feature.get('Rayon')}}</div>
+                            <div><b class="font-15">{{ 'VMAP_COORDINATES_PROJ' | translate }}: </b>{{ctrl.oProjections[feature.get('Projection')]}}</div>
                         </div>
                         <table class="table table-striped bordered margin-10 font-14">
                             <thead>
@@ -137,7 +137,7 @@
                         <div class="font-15" ng-repeat="key in feature.get('Keys')" ng-if="key === 'Coordonnées'">
                             <b class="font-15">{{key}}: </b>{{ctrl.transform(feature.get('Coordonnées'), ctrl.projection, feature.get('Projection'))}}
                         </div>
-                        <div><b class="font-15">Projection des coordonnées: </b>{{ctrl.oProjections[feature.get('Projection')]}}</div>
+                        <div><b class="font-15">{{ 'VMAP_COORDINATES_PROJ' | translate }}: </b>{{ctrl.oProjections[feature.get('Projection')]}}</div>
                     </div>
 
                     <table class="table table-striped bordered margin-10 font-14" ng-if="feature.get('Type') !== 'Point' || feature.get('Type') !== 'Cercle'">
@@ -156,7 +156,7 @@
                             </tr>
                         </tbody>
                     </table>
-                    <button type="button" class="btn btn-primary right margin-sides-5" data-dismiss="modal" ng-click="ctrl.zoomToFeature(feature)">Voir sur la carte</button>
+                    <button type="button" class="btn btn-primary right margin-sides-5" data-dismiss="modal" ng-click="ctrl.zoomToFeature(feature)">{{ 'VMAP_SEE_ON_MAP' | translate }}</button>
                     <br>
                     <br>
                 </div>
@@ -164,7 +164,7 @@
             </div>
             <!--/.modal-body modal-body-big-->
             <div class="modal-footer" ng-if="ctrl.sketches.length !== 0">
-                <a id="export-csv-button" class="btn btn-primary" download='Mesures.csv' href="" >Exporter tout en CSV</a>
+                <a id="export-csv-button" class="btn btn-primary" download='Mesures.csv' href="" >{{ 'VMAP_CSV_EXPORT' | translate }}</a>
             </div>
         </div>
     </div>
diff --git a/module/template/tools/measure_mobile.html b/module/template/tools/measure_mobile.html
index b69fba213951917ea1b0ebbcb0939f3627d00699..e0f2512c0d9cdf8dce8f634ea7bffec4ddac123c 100755
--- a/module/template/tools/measure_mobile.html
+++ b/module/template/tools/measure_mobile.html
@@ -1,14 +1,13 @@
-<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasurePoint()"><span class="icon-point mobile_menu_logo"></span> Point</a>
-<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasureLine()"><span class="icon-line mobile_menu_logo"></span> Ligne</a>
-<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasurePolygon()"><span class="icon-polygon mobile_menu_logo"></span> Polygone</a>
-<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasureCircle()"><span class="icon-circle mobile_menu_logo"></span> Cercle</a>
-<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileDeleteAllFeatures()"><span class="icon-trash mobile_menu_logo"></span> Vider</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasurePoint()"><span class="icon-point mobile_menu_logo"></span> {{ 'VMAP_POINT' | translate }}</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasureLine()"><span class="icon-line mobile_menu_logo"></span> {{ 'VMAP_LINE' | translate }}</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasurePolygon()"><span class="icon-polygon mobile_menu_logo"></span> {{ 'VMAP_POLYGON' | translate }}</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileMeasureCircle()"><span class="icon-circle mobile_menu_logo"></span> {{ 'VMAP_CIRCLE' | translate }}</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.mobileDeleteAllFeatures()"><span class="icon-trash mobile_menu_logo"></span> {{ 'VMAP_EMPTY' | translate }}</a>
 
 <div style="display: none">
     <input id="geodesic" type="checkbox" style="cursor:pointer" checked>use geodesic measures
 </div>
 <div style="display: none" class="checkbox checkbox-success">
     <input id="measure-anotations" type="checkbox" style="cursor:pointer" ng-click="ctrl.showHideAnotations()" checked>
-    <label for="measure-anotations" style="cursor:pointer">Afficher / Cacher les annotations</label>
+    <label for="measure-anotations" style="cursor:pointer">{{ 'VMAP_MEASURE_SHOW_HIDE_ANOTATIONS' | translate }}</label>
 </div>
-
diff --git a/module/template/tools/print.html b/module/template/tools/print.html
index 330a8b9c2733511e33358d8d02c6e41a6463122a..2190f57f46cc6116d9221a8885e5fd678b0ddfe3 100644
--- a/module/template/tools/print.html
+++ b/module/template/tools/print.html
@@ -2,17 +2,17 @@
 <div style="text-align: left">
 
     <div class="print-form-label" ng-show="!ctrl.models.length > 0">
-        Aucun modèle d'impression associé
+        {{ 'VMAP_PRINT_NO_MODEL_ASSOCIATE' | translate }}
     </div>
 
     <form role="form" ng-submit="ctrl.prepareAndLaunchPrint()" ng-show="ctrl.models.length > 0">
-        <div class="print-form-label">Modèle</div>
+        <div class="print-form-label">{{ 'VMAP_MODEL' | translate }}</div>
         <select id="select-print-format" class="form-control minus"
                 ng-model="modelIndex"
                 ng-options="index as model.name for (index, model) in ctrl.models"
                 ng-change="ctrl.loadModelParmas(modelIndex)"></select>
 
-        <div class="print-form-label" ng-if="ctrl.printStyles.length > 0">Style</div>
+        <div class="print-form-label" ng-if="ctrl.printStyles.length > 0">{{ 'VMAP_STYLE' | translate }}</div>
         <select id="select-print-format" class="form-control minus"
                 ng-if="ctrl.printStyles.length > 0"
                 ng-model="$parent.selectedPrintstyleId"
@@ -26,7 +26,7 @@
             <br>
         </div>
 
-        <div class="print-form-label">Echelle</div>
+        <div class="print-form-label">{{ 'VMAP_SCALE' | translate }}</div>
         <select id="select-print-scale" class="form-control minus" ng-model="ctrl.scale" ng-change="ctrl.changeScale(ctrl.scale)">
             <option value="auto">{{ctrl.currentScale}}</option>
             <option value="1000000">1:1,000,000</option>
@@ -45,7 +45,7 @@
             <option value="100">1:100</option>
         </select>
 
-        <div class="print-form-label">Résolution</div>
+        <div class="print-form-label">{{ 'VMAP_RESOLUTION' | translate }}</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>
@@ -53,13 +53,13 @@
         </select>
 
         <button type="button"
-                title="Modification de la zone d'impression sur la carte"
+                title="{{ 'VMAP_PRINT_MODIFY_MAP_PRINT_ZONE' | translate }}"
                 class="btn btn-info btn-sm"
                 style="margin-top: 10px"
                 ng-class="{'active': managePrintZoneInProgress}"
                 ng-click="ctrl.managePrintZone()"><span class="glyphicon glyphicon-move"></span></button>
        <button type="button"
-               title="Modification de la zone d'impression sur la carte de comparaison"
+               title="{{ 'VMAP_PRINT_MODIFY_COMPARE_MAP_PRINT_ZONE' | translate }}"
                ng-show="$root.compare_enabled"
                class="btn btn-info btn-sm"
                style="margin-top: 10px"
@@ -68,6 +68,6 @@
 
         <button type="submit"
                 class="btn btn-info btn-sm"
-                style="margin-top: 10px">Imprimer</button>
+                style="margin-top: 10px">{{ 'VMAP_PRINT' | translate }}</button>
     </form>
 </div>
diff --git a/module/template/tools/select.html b/module/template/tools/select.html
index f801d83e906904ae6028f8e76bd8041af1c7d928..ce4e247da6c6180c09c736cb6e78d4dbf900907e 100644
--- a/module/template/tools/select.html
+++ b/module/template/tools/select.html
@@ -6,7 +6,7 @@
     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
         <a class="basic-tools-element pointer"
            id="basic-tools-dropdown-select-btn"
-           title="Sélection multiple"
+           title="{{ 'VMAP_SELECTION_MULTIPLE_SELECTION' | translate }}"
            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
             <span class="icon-info" aria-hidden="true"></span> +
         </a>
@@ -32,7 +32,7 @@
                         style="width: 80%"
                         ng-class="{'white color-gray': ctrl.currentAction === 'basicTools-select-insertPoint' || ctrl.currentAction === 'basicTools-select-insertLineString' || ctrl.currentAction === 'basicTools-select-insertPolygon' || ctrl.currentAction === 'basicTools-select-insertCircle'}"
                         ng-click="ctrl.addPartGeomType !== '' ? ctrl.startEdition('insert' + ctrl.addPartGeomType, ctrl.currentAction === 'basicTools-select-insert' + ctrl.addPartGeomType) : angular.noop">
-                    Ajouter une partie
+                    {{ 'VMAP_INSERT_ADD_PART' | translate }}
                 </button>
                 <button type="button"
                         class="btn btn-sm btn-default dropdown-toggle"
@@ -50,22 +50,22 @@
                     <li><a href="javascript:void(0)"
                            ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POINT' || ctrl.editableFeatureType === 'MULTIPOINT'"
                            ng-click="ctrl.addPartGeomType = 'Point'; ctrl.startEdition('insertPoint', false)">
-                            <span class="icon-point"></span> Point
+                            <span class="icon-point"></span> {{ 'VMAP_POINT' | translate }}
                         </a></li>
                     <li><a href="javascript:void(0)"
                            ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'LINESTRING' || ctrl.editableFeatureType === 'MULTILINESTRING'"
                            ng-click="ctrl.addPartGeomType = 'LineString'; ctrl.startEdition('insertLineString', false)">
-                            <span class="icon-line"></span> Ligne
+                            <span class="icon-line"></span> {{ 'VMAP_LINE' | translate }}
                         </a></li>
                     <li><a href="javascript:void(0)"
                            ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POLYGON' || ctrl.editableFeatureType === 'MULTIPOLYGON'"
                            ng-click="ctrl.addPartGeomType = 'Polygon'; ctrl.startEdition('insertPolygon', false)">
-                            <span class="icon-polygon"></span> Polygone
+                            <span class="icon-polygon"></span> {{ 'VMAP_POLYGON' | translate }}
                         </a></li>
                     <li><a href="javascript:void(0)"
                            ng-show="ctrl.editableFeatureType === 'GEOMETRYCOLLECTION' || ctrl.editableFeatureType === 'GEOMETRY' || ctrl.editableFeatureType === 'POLYGON' || ctrl.editableFeatureType === 'MULTIPOLYGON'"
                            ng-click="ctrl.addPartGeomType = 'Circle'; ctrl.startEdition('insertCircle', false)">
-                            <span class="icon-circle"></span> Cercle
+                            <span class="icon-circle"></span> {{ 'VMAP_CIRCLE' | translate }}
                         </a></li>
                 </ul>
             </div>
@@ -77,7 +77,7 @@
                        ng-class="{'active': ctrl.currentAction === 'basicTools-select-editFeature'}"
                        ng-click="ctrl.startEdition('editFeature', ctrl.currentAction === 'basicTools-select-editFeature')">
                         <span class="icon-edit"></span>
-                        <span class="margin-sides-10">Modifier la géométrie</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_MODIFY_GEOM' | translate }}</span>
                     </a>
                 </li>
                 <li class="basic-tools-dropdown-btn">
@@ -85,7 +85,7 @@
                        ng-class="{'active': ctrl.currentAction === 'basicTools-select-deleteFeature'}"
                        ng-click="ctrl.startEdition('deleteFeature', ctrl.currentAction === 'basicTools-select-deleteFeature')">
                         <span class="icon-trash"></span>
-                        <span class="margin-sides-10">Supprimer une partie</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_DELETE_PART' | translate }}</span>
                     </a>
                 </li>
                 <li class="basic-tools-dropdown-btn">
@@ -94,7 +94,7 @@
                        ng-class="{'active': ctrl.currentAction === 'basicTools-select-addHole'}"
                        ng-click="ctrl.startEdition('addHole', ctrl.currentAction === 'basicTools-select-addHole')">
                         <span class="icon-dot-circle-o"></span>
-                        <span class="margin-sides-10">Ajouter un trou</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_ADD_HOLE' | translate }}</span>
                     </a>
                 </li>
                 <li class="basic-tools-dropdown-btn">
@@ -103,7 +103,7 @@
                        ng-class="{'active': ctrl.currentAction === 'basicTools-select-deleteHole'}"
                        ng-click="ctrl.startEdition('deleteHole', ctrl.currentAction === 'basicTools-select-deleteHole')">
                         <span class="icon-dot-circle-o"></span>
-                        <span class="margin-sides-10">Supprimer un trou</span>
+                        <span class="margin-sides-10">{{ 'VMAP_INSERT_DELETE_HOLE' | translate }}</span>
                     </a>
                 </li>
             </ul>
@@ -113,7 +113,7 @@
                 <div class="basic-tools-dropdown-btn vmap-select-snapping-collapse-button "
                      ng-click="ctrl.isSnapMenuCollapse = !ctrl.isSnapMenuCollapse">
                     <span class ="glyphicon glyphicon-magnet" ></span>
-                    <span class="margin-sides-10"> Accrochage vectoriel </span>
+                    <span class="margin-sides-10"> {{ 'VMAP_INSERT_VECTOR_SNAPPING' | translate }} </span>
                     <span class="glyphicon"
                           ng-class="{'glyphicon-menu-down': ctrl.isSnapMenuCollapse, 'glyphicon-menu-right': !ctrl.isSnapMenuCollapse }"></span>
                 </div>
@@ -130,7 +130,7 @@
                                                style="cursor:pointer"
                                                ng-model="oBo.bo_snapping_enabled"
                                                ng-click="ctrl.loadVectorSnappingData()">
-                                        <label for="vmap-select-snapping-menu-checkbox-{{$index}}" style="cursor:pointer" title="Definit si l'objet métier est accrochable">
+                                        <label for="vmap-select-snapping-menu-checkbox-{{$index}}" style="cursor:pointer" title="{{ 'VMAP_INSERT_VECTOR_SNAPPING_DEF' | translate }}">
                                             {{oBo.bo_title}}
                                         </label>
                                     </div>
@@ -155,7 +155,7 @@
                                     class="btn btn-info btn-xs width-100"
                                     ng-click="ctrl.showSnappingOptionsModal()">
                                 <span class="fa fa-cog margin-sides-2"></span>
-                                Options d'accrochage
+                                {{ 'VMAP_INSERT_SNAPPING_OPTIONS' | translate }}
                             </button>
                         </div>
                     </div>
@@ -164,10 +164,10 @@
             </div>
             <!--Messages d'alerte pour l'échelle d'édition-->
             <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMaxScaleOk">
-                <span class="glyphicon glyphicon-warning-sign"></span> Échelle maximale de saisie atteinte
+                <span class="glyphicon glyphicon-warning-sign"></span> {{ 'VMAP_INSERT_SNAPPING_MAX_SCALE' | translate }}
             </div>
             <div class="alert alert-warning vmap-select-scale-alert" role="alert" ng-show="!ctrl.isMinScaleOk">
-                <span class="glyphicon glyphicon-warning-sign"></span> Échelle minimale de saisie atteinte
+                <span class="glyphicon glyphicon-warning-sign"></span> {{ 'VMAP_INSERT_SNAPPING_MIN_SCALE' | translate }}
             </div>
             <!--Boutons-->
             <div style="text-align: center">
@@ -175,21 +175,21 @@
                         class="btn btn-info btn-sm"
                         ng-click="ctrl.finishEdition()">
                     <span class="glyphicon glyphicon-remove margin-sides-2"></span>
-                    Annuler
+                    {{ 'VMAP_CANCEL' | translate }}
                 </button>
                 <button type="button"
                         class="btn btn-info btn-sm"
                         ng-show="ctrl.editGeometryFromForm"
                         ng-click="ctrl.validateGeomAndDisplayEditForm()">
                     <span class="glyphicon glyphicon-share-alt margin-sides-2"></span>
-                    Valider géométrie
+                    {{ 'VMAP_SELECTION_VALIDATE_GEOM' | translate }}
                 </button>
                 <button type="button"
                         class="btn btn-info btn-sm"
                         ng-show="!ctrl.editGeometryFromForm"
                         ng-click="ctrl.submitGeomEdition(); ctrl.finishEdition();">
                     <span class="glyphicon glyphicon-share-alt margin-sides-2"></span>
-                    Sauvegarder
+                    {{ 'VMAP_SAVE' | translate }}
                 </button>
             </div>
         </div>
@@ -200,14 +200,14 @@
 <div id="getFeatureInfo-result-window" class="basic-tools-dropdown-element basic-tools-dropdown-select-getFeatureInfo-content dropdown-menu">
     <div class="modal-header">
         <button type="button" class="close" ng-click="ctrl.closeGetFeatureInfoResultWindow()">×</button>
-        <h4 class="modal-title">Résultat requête WMS (GetFeatureInfo)</h4>
+        <h4 class="modal-title">{{ 'VMAP_WMS_QUERY_RESULT' | translate }}</h4>
     </div>
     <div class="modal-body modal-body-big">
         <div class="row" style="height: 99%;">
             <!-- Bouttons calques -->
             <div class="col-md-4">
                 <div ng-if="ctrl.iGetFeatureInfoWithResultLayers > 0" class="">
-                    <i>Avec résultat</i>
+                    <i>{{ 'VMAP_WITH_RESULT' | translate }}</i>
                     <ul class="nav nav-pills nav-stacked" style="width: 180px">
                         <li data-toggle="pill"
                             class="list-group-item list-group-item-modal"
@@ -222,7 +222,7 @@
                     </ul>
                 </div>
                 <div ng-if="ctrl.iGetFeatureInfoWithoutResultLayers > 0" class="margin-20">
-                    <i>Sans résultat</i>
+                    <i>{{ 'VMAP_WITHOUT_RESULT' | translate }}</i>
                     <ul class="nav nav-pills nav-stacked" style="width: 180px">
                         <li data-toggle="pill"
                             class="list-group-item list-group-item-modal"
@@ -274,7 +274,7 @@
                 </div>
                 <div ng-if="!ctrl.aGetFeatureInfoResult[ctrl.aGetFeatureInfoSelectedLayer].aSubLayers[ctrl.aGetFeatureInfoSelectedSubLayer].result">
                     <br>
-                    Aucun résultat disponible
+                    {{ 'VMAP_NO_RESULTS_AVAILABLE' | translate }}
                 </div>
             </div>
         </div>
@@ -314,11 +314,11 @@
                         <h5 data-translate="FORM_SNAPPING_VISIBILITY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG"></h5>
                         <div class="radio radio-inline">
                             <input type="radio" name="vmap_select_snap_visible" id="vmap_select_snap_visible_1" ng-model="ctrl.tmpSnapOptions.visible" ng-value="true">
-                            <label for="vmap_select_snap_visible_1">Oui</label>
+                            <label for="vmap_select_snap_visible_1">{{ 'VMAP_YES' | translate }}</label>
                         </div>
                         <div class="radio radio-inline">
                             <input type="radio" name="vmap_select_snap_visible" id="vmap_select_snap_visible_2" ng-model="ctrl.tmpSnapOptions.visible" ng-value="false">
-                            <label for="vmap_select_snap_visible_2">Non</label>
+                            <label for="vmap_select_snap_visible_2">{{ 'VMAP_NO' | translate }}</label>
                         </div>
                     </div>
                 </div>
@@ -341,7 +341,7 @@
                                             id="vmap_select_snap_avoid_superpositions_1_{{$index}}"
                                             ng-model="ctrl.tmpSnapOptions.avoidSuperpositions[bo.bo_id]"
                                             ng-value="true">
-                                    <label for="vmap_select_snap_avoid_superpositions_1_{{$index}}">Oui</label>
+                                    <label for="vmap_select_snap_avoid_superpositions_1_{{$index}}">{{ 'VMAP_YES' | translate }}</label>
                                 </div>
                                 <div class="radio radio-inline">
                                     <input  type="radio"
@@ -349,7 +349,7 @@
                                             id="vmap_select_snap_avoid_superpositions_2_{{$index}}"
                                             ng-model="ctrl.tmpSnapOptions.avoidSuperpositions[bo.bo_id]"
                                             ng-value="false">
-                                    <label for="vmap_select_snap_avoid_superpositions_2_{{$index}}">Non</label>
+                                    <label for="vmap_select_snap_avoid_superpositions_2_{{$index}}">{{ 'VMAP_NO' | translate }}</label>
                                 </div>
                             </div>
                         </div>
@@ -358,10 +358,10 @@
             </div>
             <div class="modal-footer modal-footer-sm text-left">
                 <button class="btn btn-primary" ng-click="ctrl.resetSnapOptions()">
-                    Rétablir les paramètres par défaut
+                    {{ 'VMAP_INSERT_RESET_DEFAULT_PARAMS' | translate }}
                 </button>
                 <button class="btn btn-primary" ng-click="ctrl.submitSnappingOptionsModal()">
-                    Valider
+                    {{ 'VMAP_VALIDATE' | translate }}
                 </button>
             </div>
         </div>
@@ -409,12 +409,12 @@
             <div class="modal-footer modal-footer-sm text-left">
                 <button class="btn btn-primary" ng-click="ctrl.editFormFeature(ctrl.editSelection)" ng-if="!$root.is_mobile">
                     <span class="icon-line margin-2"></span>
-                    Modifier la géométrie
+                    {{ 'VMAP_INSERT_MODIFY_GEOM' | translate }}
                 </button>
                 <button class="btn btn-primary"
                         onclick="oVmap.simuleClick('basictools-select-form-reader-submit-btn')">
                     <span class="glyphicon glyphicon-share-alt margin-2"></span>
-                    Sauvegarder
+                    {{ 'VMAP_SAVE' | translate }}
                 </button>
             </div>
         </div>
diff --git a/module/template/tools/urlexporter.html b/module/template/tools/urlexporter.html
index a1602e307b52d657096cda53b9c1ee618df0a754..f3fbd31d2b45299305764230e674f36057e0e0cd 100644
--- a/module/template/tools/urlexporter.html
+++ b/module/template/tools/urlexporter.html
@@ -2,7 +2,7 @@
 <div class="row margin-sides-0 margin-10">
     <div class="col-md-12">
         <div class="left">
-            <label for="privateExportUrlField" class="control-label">Lien vers la carte en cours</label>
+            <label for="privateExportUrlField" class="control-label">{{ 'VMAP_BASICTOOLS_MAP_LINK' | translate }}</label>
         </div>
     </div>
     <div class="col-md-12">
diff --git a/module/template/tools/user_mobile.html b/module/template/tools/user_mobile.html
index 947aa7d18d97f3c3912d6c61b5347a1dfab7e655..e3581a219fd0dbe041382582765243d0acb40995 100755
--- a/module/template/tools/user_mobile.html
+++ b/module/template/tools/user_mobile.html
@@ -1,15 +1,15 @@
-<a class="list-group-item sublist-group-item" ng-click="ctrl.displayUserInfos()"><span class="icon-format_list_bulleted mobile_menu_logo"></span> Infos utilisateur</a>
-<a class="list-group-item sublist-group-item" ng-click="ctrl.disconnect()"><span class="icon-block mobile_menu_logo"></span> Déconnexion</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.displayUserInfos()"><span class="icon-format_list_bulleted mobile_menu_logo"></span> {{ 'USER_INFOS' | translate }}</a>
+<a class="list-group-item sublist-group-item" ng-click="ctrl.disconnect()"><span class="icon-block mobile_menu_logo"></span> {{ 'DISCONNECT' | translate }}</a>
 
 <!--Modale contenant le formulaire utilisateur-->
 <div class="modal fade" id="basictools-user-form-reader-modal" role="dialog">
     <div class="modal-dialog">
         <!--Modal content-->
         <div class="modal-content" style="">
-            <div class="modal-header">                
+            <div class="modal-header">
                 <!-- Bouton retour -->
                 <div class="btn btn-default vmap_mobile_return_modal right" data-dismiss="modal">
-                    <span class="icon-caret-left"></span> Retour
+                    <span class="icon-caret-left"></span> {{ 'VMAP_BACK' | translate }}
                 </div>
                 <h4 class="modal-title">{{sUserLoginText}}</h4>
             </div>
@@ -17,10 +17,10 @@
 
                 <!--Form reader-->
                 <div id="basictools-user-form-reader"
-                     app-form-reader 
+                     app-form-reader
                      app-properties="ctrl.properties"
                      app-token="ctrl.token"></div>
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/module/template/vmap.html b/module/template/vmap.html
index 3dfe8e972c9041da49bdcca98ac684467dbcd2c4..b3b82d5f673df0cd2a138ffc4dec5a24695729a2 100755
--- a/module/template/vmap.html
+++ b/module/template/vmap.html
@@ -8,7 +8,7 @@
                     type="button"
                     onclick="$('#maplistlitle-container').toggleClass('open')">
                 <span class="icon-map left" style="font-size: 30px"></span>
-                <span class="left" style="margin: 6px 14px">CARTES</span>
+                <span class="left" style="margin: 6px 14px">{{ 'VMAP_MAPS' | translate }}</span>
                 <span class="right" style="margin: 6px 4px">
                     <span class="caret"></span>
                 </span>
@@ -24,7 +24,7 @@
                             type="button"
                             class="btn btn-success btn-sm btn-modal margin-10"
                             onclick="oVmap.simuleClick('btn-reload-myMap'); $('#mapModalManager').modal('show'); $('#dropdownMenuMaps').dropdown('toggle')">
-                        GESTION DES CARTES
+                        {{ 'VMAP_MAPS_MANAGEMENT' | translate }}
                     </button>
                 </div>
             </div>
diff --git a/web_service/sql/sqlQueries.xml b/web_service/sql/sqlQueries.xml
index a7a4ff6699e62b6fb67a7b5637015655befbf6d5..d9af111877a89980f885ff35a7e7742435366d03 100644
--- a/web_service/sql/sqlQueries.xml
+++ b/web_service/sql/sqlQueries.xml
@@ -1145,5 +1145,36 @@
 				]]>
 			</code>
 		</query>
+		<query>
+			<type>update</type>
+			<version>2019.01.00</version>
+			<code>
+				<![CDATA[
+					-- Armand 02/01/2019 Ajout carte par défaut par utilisateur
+					CREATE TABLE s_vmap.user_defaultmap ( user_id integer NOT NULL, map_id integer NOT NULL, CONSTRAINT user_defaultmap_pkey PRIMARY KEY (map_id, user_id), CONSTRAINT fk_user_defaultmap_user FOREIGN KEY (user_id) REFERENCES s_vitis."user" (user_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT fk_user_defaultmap_map FOREIGN KEY (map_id) REFERENCES s_vmap.map (map_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION) WITH ( OIDS=FALSE);
+					ALTER TABLE s_vmap.user_defaultmap OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.user_defaultmap TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.user_defaultmap TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.user_defaultmap TO vmap_user;
+					CREATE OR REPLACE VIEW s_vmap.v_user_defaultmap AS SELECT user_defaultmap.map_id, user_defaultmap.user_id FROM s_vmap.user_defaultmap WHERE user_defaultmap.user_id = ( SELECT "user".user_id FROM s_vitis."user" WHERE "user".login::name = CURRENT_USER );
+					ALTER TABLE s_vmap.v_user_defaultmap  OWNER TO u_vitis;
+					GRANT ALL ON TABLE s_vmap.v_user_defaultmap TO vmap_admin;
+					GRANT SELECT ON TABLE s_vmap.v_user_defaultmap TO vmap_user;
+					-- Armand 02/01/2019 10:27 Ajout des colonnes enable_selection et enable_location
+					ALTER TABLE s_vmap.business_object ADD COLUMN enable_selection boolean;
+					ALTER TABLE s_vmap.business_object ADD COLUMN enable_location boolean;
+					UPDATE s_vmap.business_object SET enable_selection=true, enable_location=true;
+					-- Frédéric 18/01/2019 Placeholder dans la localisation
+					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,iVBORw0KGgoAAAANSUhEUgAAAFsAAABvCAMAAAC0A0wQAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH4AoaDB4SgWapiwAAAIpQTFRF5z+B61+W7W+h73+r8Y+285/A9a/L97/V+c/g+9/q/e/1////97/V9a/L97/V9a/L8Y+29a/L97/V9a/L3wBY3wFZ3wJZ4Ahe4Ale4Q9i4RNl4hVm4x9s4yBt4yNv5CZx5Clz5S935TN65z+B50CC6U+M6VOO6lmS61+W7Gic7W+h73+r8Y+285/AbLUkSgAAABR0Uk5TAAAAAAAAAAAAAAAAEBgrYIaUqrbZfjuKAAAE00lEQVRo3u2abZOcKBCAzW02y4vnxR1390jM5Tzihgj+/78XeRXUUUSn6j4MVVtxBB+bpulu2mTYaw/VRuvkKLY+ZsRle9gEDYNEdRM2H8bA6jZsKTa9DZvFiL2HTapa/dNWVTkM6cxddpjd5zlmpVw9zrVKiJ4BvK6bWLbQ93tOAa/ocAWqYRoUSL23nHN6RO6xjyvjFlWNkPoNsX5VApt0cvalz5aTYNwfj/s6hc0x4sLv41UuNYFw2HgCm+EZRGq5xngLvs2GU0apHqIz9sxgNtlz+XL5EOzmbEj2sfkckUuR84UODMguNpoTkGKXC2wM6x1sukRopXmDw3IvzRwL8zd/6S5953hPY5TsYCO8rwWmssHGexuksWyK97feKWadXZcJ8DzWvvfDR0PcYne72XXsWop0jWyxSb6bjWgkmyUsZaS+a4SPwNflTmDDro6SmyawQeRapuwcXNIodspSeqnzKrtpU9iwi1pLniS4TUM39g4+opWNvdMlsXPeRLAnqxlpkyjvInxVGM1BVKwANCVesqsGj+BCtN+Tn0C6EoMFBvIFPW9JCpuueNy+ajtCOOBpeVW+qu2S7M2/PRyq8/jUJIZd+0lTdDCLjMUmYKKu3Mrf9rO14KipyKZtk/1nkuH0J5qYtDPhvCNaZQIRKZZIOLuSmFSlO1IrQDdkE7SeG5MjNY48Mg1MYUPBr4gOOTymEyU6vJIDEi6OspvlGJfTM+pVbaSbSqqFLSvlFLmXUi3Iy7NqeJR19bVT3xn1QYCdsSNxcu2xa6pVTR+qmaqdRCnj1S3YEe3O/l+wi4cT2hX2ye3OvrOT2Q+zfWBDY3Ee2x4G3RejE9nCnZnOZ9vkgd2AbcNvcwO2SUxQlcb+Vz5yCQ4Bf5h6m/swdZGJW8guHgeX93H+Kjjc/9OkSpmivduub0pYU1tyxVNuflk24i5daw1e99oSZKvomZrvm29r/xmdyLc2LmXoRzZqZt+QNfviOkiv9P3uKUW8Kj1oNnBnEjWZkT3JTgrHJuHdTCnTKuWrnAMybGwfLFSdqfJ/yjv2PNI6tt9qZSdfnHxK0p/WTpR83CxwO7K15i+u4kg8Nv309EjtCXVg/3q1BqGugGNzUzZo1Tscm467ijmv41foWjOdzCzgD3lTzuAfZ99aW+bAVIxsFXGBLlKEbLPVkFaW2juNUYqc4ms/spF2V1A/P9k7oBCsrkI2D1wEzIwneh3c0i+9ko6tBBaquwnYUNBpRqIungz7sx4r2ehtuPqO8d/WYCybKbV12ohHdr/wVTFgP41sbeLw4h627F7psNFW4di9d4DbZkuLfRHyDV+xzwZuC8GRbVaKimeEn5fZOj8H2g9KA/n2prXusVUoY8YALPsvr6QlQvbnoFZofCx/CcoOjk29GGHZD1606xZtULuHxrBtPHzHIZt7sS1kI9+Q3d5h3veYzsaGH4Hrd+zCc0chW5ryczOxk0Fy9uljbcNK5gfbL3jCRlMrKzxX1cxscHLctTFNmvgLn7JNoKQ+GzfTuhOwvV5Pg0b2T//YPrLZuJcde/wExfS8Mtfb+OjlWPyYyaYipbpSy6CulHlA/cZ6cD0f7EgT09T/0KhqcSAfREVRhLWJcVZjz1m55lKGcWff2bNStWyTktlvZmREwIT2iEIAAAAASUVORK5CYII=">' || 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>
 	</queriesCollection>
 </sqlQueries>
diff --git a/web_service/ws/BusinessObject.class.inc b/web_service/ws/BusinessObject.class.inc
index b3da1a450873ab4e1f76bae4ac4d0c60fe9c1f55..2a990d6d616181648cdf2a9dcd6f9abb36d4e781 100644
--- a/web_service/ws/BusinessObject.class.inc
+++ b/web_service/ws/BusinessObject.class.inc
@@ -31,7 +31,7 @@ class BusinessObject extends Vmap {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("business_object_id", "title", "formtitle", "summarytitle", "id_field", "database", "schema", "table", "sql_summary", "sql_list", "sorted_by", "geom_column", "search_field", "result_field", "search_use_strict", "event_id", "index", "add_form_size", "edit_form_size", "display_form_size", "selection_buffer", "user_rights", "max_edition_scale", "min_edition_scale");
+        $this->aSelectedFields = Array("business_object_id", "title", "formtitle", "summarytitle", "id_field", "database", "schema", "table", "sql_summary", "sql_list", "sorted_by", "geom_column", "search_field", "result_field", "search_use_strict", "event_id", "index", "add_form_size", "edit_form_size", "display_form_size", "selection_buffer", "user_rights", "max_edition_scale", "min_edition_scale", "enable_selection", "enable_location", "location_placeholder");
     }
 
     /**
diff --git a/web_service/ws/BusinessObjects.class.inc b/web_service/ws/BusinessObjects.class.inc
index fa7ca58d1eaf4d159d82c3498a6c75caf20b1d79..a90bc69b890d9b7c617ff219a4cc2bb996525eb8 100755
--- a/web_service/ws/BusinessObjects.class.inc
+++ b/web_service/ws/BusinessObjects.class.inc
@@ -42,7 +42,7 @@ class BusinessObjects extends Vmap {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("business_object_id", "title", "formtitle", "summarytitle", "id_field", "database", "schema", "table", "sql_summary", "sql_list", "sorted_by", "geom_column", "search_field", "result_field", "search_use_strict", "event_id", "index", "add_form_size", "edit_form_size", "display_form_size", "selection_buffer", "user_rights", "max_edition_scale", "min_edition_scale");
+        $this->aSelectedFields = Array("business_object_id", "title", "formtitle", "summarytitle", "id_field", "database", "schema", "table", "sql_summary", "sql_list", "sorted_by", "geom_column", "search_field", "result_field", "search_use_strict", "event_id", "index", "add_form_size", "edit_form_size", "display_form_size", "selection_buffer", "user_rights", "max_edition_scale", "min_edition_scale", "enable_selection", "enable_location", "location_placeholder");
     }
 
     /**
diff --git a/web_service/ws/Map.class.inc b/web_service/ws/Map.class.inc
index f57f594551256f366c1ed2003f93b161b6500820..a3a8371b810a95849c0184bc013349dcb0559ce7 100755
--- a/web_service/ws/Map.class.inc
+++ b/web_service/ws/Map.class.inc
@@ -12,7 +12,7 @@ require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection
  * \brief This file contains the Map php class
  *
  * This class defines operation for one Map
- * 
+ *
  */
 class Map extends Vmap {
 
@@ -32,7 +32,7 @@ class Map extends Vmap {
     }
 
     /**
-     * @SWG\Get(path="/maps/{map_id}", 
+     * @SWG\Get(path="/maps/{map_id}",
      *   tags={"Maps"},
      *   summary="Get Map",
      *   description="Request to get Map by id",
@@ -65,7 +65,7 @@ class Map extends Vmap {
      */
     function GET() {
         require $this->sRessourcesFile;
-        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_map', 'map_id');
+        $this->aFields = $this->getFields($this->aProperties['schema_vmap'], 'v_map', 'map_id', 'vmap_admin_map_vmap_admin_map');
         $this->getGroups();
     }
 
@@ -94,7 +94,7 @@ class Map extends Vmap {
             $this->aFields['groups_label'] = implode(',', $aListGroupName);
         }
     }
-    
+
     /**
      * delete a map
      */
@@ -116,4 +116,4 @@ class Map extends Vmap {
     }
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/web_service/ws/MapCatalog.class.inc b/web_service/ws/MapCatalog.class.inc
index 34e8a343a09402b2728ff8e2f7952bb479d40099..01c90bad020d7a88026ee1481c30cd5cc3de0651 100755
--- a/web_service/ws/MapCatalog.class.inc
+++ b/web_service/ws/MapCatalog.class.inc
@@ -16,7 +16,7 @@ require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection
  * \brief This file contains the Map php class
  *
  * This class defines operation for one Map
- * 
+ *
  */
 class MapCatalog extends Vmap {
 
@@ -39,7 +39,7 @@ class MapCatalog extends Vmap {
     }
 
     /**
-     * @SWG\Get(path="/mapcatalog", 
+     * @SWG\Get(path="/mapcatalog",
      *   tags={"Catalog"},
      *   summary="Get Map",
      *   description="Request to get Map by id",
@@ -74,13 +74,13 @@ class MapCatalog extends Vmap {
         // Récupère les groupes correspondants
         $sGroups = $this->oConnection->sesGroup;
 
-        // Récupère les cartes correspondante      
+        // Récupère les cartes correspondante
         $aMaps = $this->getMaps($sGroups);
 
         // Récupère les services correspondants
         $aServices = $this->getServices();
 
-        $MapCatalog['usedMap'] = 0;
+        $MapCatalog['usedMap'] = $this->getDefaultMap($aMaps);
         $MapCatalog['maps'] = $aMaps;
         $MapCatalog['services'] = $aServices;
 
@@ -238,6 +238,40 @@ class MapCatalog extends Vmap {
         return $aServices;
     }
 
+    /**
+     * getDefaultMap - get the default map index
+     *
+     * @param  {array} $aMaps
+     * @return {number} default map index
+     */
+    function getDefaultMap($aMaps) {
+        require $this->sRessourcesFile;
+
+        $iDefaultMapId = false;
+        $iDefaultMapIndex = 0;
+
+        // Récupère la carte par défaut de l'utilisateur en cours
+        $sSql = $aSql['getCurrentUserDefaultMap'];
+        $aSQLParams = array(
+            'sSchemaFramework' => array('value' => $this->aProperties['schema_framework'], 'type' => 'schema_name'),
+            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name')
+        );
+        $oPDOresult = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+            $iDefaultMapId = $aLigne['map_id'];
+        }
+
+        if ($iDefaultMapId !== false) {
+            for ($i=0; $i < count($aMaps); $i++) {
+                if ($aMaps[$i]['map_id'] == $iDefaultMapId) {
+                    $iDefaultMapIndex = $i;
+                }
+            }
+        }
+
+        return $iDefaultMapIndex;
+    }
+
     function httpPost($url, $params) {
         $postData = '';
         //create name value pairs seperated by &
@@ -262,4 +296,4 @@ class MapCatalog extends Vmap {
 
 }
 
-?>
\ No newline at end of file
+?>
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;
+    }
+
 }
 
 ?>
diff --git a/web_service/ws/Maps.class.inc b/web_service/ws/Maps.class.inc
index 59edd0491d82bf2d30348b6df7a39e4329ef706c..5c1c649f4d541dfb52539b466fb03e936542e78b 100755
--- a/web_service/ws/Maps.class.inc
+++ b/web_service/ws/Maps.class.inc
@@ -9,7 +9,7 @@
  * \brief This file contains the Maps php class
  *
  * This class defines Rest Api to Vmap Maps
- * 
+ *
  */
 require_once 'Vmap.class.inc';
 require_once 'Map.class.inc';
@@ -195,45 +195,18 @@ class Maps extends Vmap {
     function POST() {
         require $this->sRessourcesFile;
 
-        // Vignette à uploader ?
-        if (!empty($_FILES['thumbnail'])) {
-            // la colonne thumbnail vaudra le nom du fichier
-            $this->aValues["thumbnail"] = $_FILES['thumbnail']["name"];
-        }
+        // Fichiers à uploader
+        $aUploadFiles = array(
+            'thumbnail' => []
+        );
 
-        // Redimmensionnement de l'image.
         if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
-            // Renomme l'image en jpg
-            $aPointsArray = explode('.', $this->aValues["thumbnail"]);
-            $aPointsArray[count($aPointsArray) - 1] = 'jpg';
-            $this->aValues["thumbnail"] = join('.', $aPointsArray);
+            $aUploadFiles['thumbnail']['width'] = $this->aValues['thumbnail_width'];
+            $aUploadFiles['thumbnail']['height'] = $this->aValues['thumbnail_height'];
         }
 
         // Création de la carte.
-        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'map', $this->aProperties['schema_vmap'] . '.seq_common', 'map_id');
-
-        // Vignette à uploader ?
-        if (!empty($_FILES['thumbnail'])) {
-            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_admin_map/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $_FILES['thumbnail']["name"];
-
-            // Crée les répertoires si ils n'existent pas
-            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_admin_map', $this->aValues["my_vitis_id"]);
-            $sDirColumnPath = $sDirPath . '/thumbnail';
-            if (!is_dir($sDirColumnPath)) {
-                mkdir($sDirColumnPath, 0777, true);
-            }
-
-            $sErrorMessage = uploadFile("thumbnail", "", $sImageDir, $_FILES['thumbnail']['size'] + 1);
-
-            if ($sErrorMessage != "") {
-                writeToErrorLog($sErrorMessage);
-            } else {
-                // Redimmensionnement de l'image.
-                if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
-                    $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
-                }
-            }
-        }
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'map', $this->aProperties['schema_vmap'] . '.seq_common', 'map_id', $aUploadFiles, 'vmap_admin_map_vmap_admin_map');
 
         // Si création OK -> maj des groupes rattachés à la carte.
         if ($aReturn['sStatus'] == 1) {
@@ -342,7 +315,7 @@ class Maps extends Vmap {
      *         description="Poprerties Response",
      *         @SWG\Schema(ref="#/definitions/maps")
      *     ),
-     * 
+     *
      *  )
      */
 
@@ -352,35 +325,18 @@ class Maps extends Vmap {
      */
     function PUT() {
         require $this->sRessourcesFile;
-        // Vignette à uploader ?
-        if (!empty($this->aValues["thumbnail_file"])) {
-
-            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_admin_map/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $this->aValues["thumbnail_name"];
-
-            // Crée les répertoires si ils n'existent pas
-            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_admin_map', $this->aValues["my_vitis_id"]);
-            $sDirColumnPath = $sDirPath . '/thumbnail';
-            if (!is_dir($sDirColumnPath)) {
-                mkdir($sDirColumnPath, 0777, true);
-            }
 
-            // la colonne thumbnail vaudra le nom du fichier
-            $this->aValues["thumbnail"] = $this->aValues["thumbnail_name"];
-            $fp = fopen($sImageDir, "w");
-            fwrite($fp, $this->aValues["thumbnail_file"]);
-            fclose($fp);
-
-            // Redimmensionnement de l'image.
-            if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
-                $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
-                // Renomme l'image en jpg
-                $aPointsArray = explode('.', $this->aValues["thumbnail"]);
-                $aPointsArray[count($aPointsArray) - 1] = 'jpg';
-                $this->aValues["thumbnail"] = join('.', $aPointsArray);
-            }
+        // Fichiers à uploader
+        $aUploadFiles = array(
+            'thumbnail' => []
+        );
+        if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+            $aUploadFiles['thumbnail']['width'] = $this->aValues['thumbnail_width'];
+            $aUploadFiles['thumbnail']['height'] = $this->aValues['thumbnail_height'];
         }
+
         // Mise à jour.
-        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'map', 'map_id');
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'map', 'map_id', $aUploadFiles, 'vmap_admin_map_vmap_admin_map');
         // Si mise à jour OK -> maj des groupes rattachés à la carte.
         if ($aReturn['sStatus'] == 1) {
             $aXmlRacineAttribute['status'] = 1;
@@ -492,4 +448,4 @@ class Maps extends Vmap {
 
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/web_service/ws/PrintMapServices.class.inc b/web_service/ws/PrintMapServices.class.inc
index 8c656d82a79f0611936a05c7a3bb8220adcab8db..a70672de6b20056261f8e97db20b2dde95dda170 100755
--- a/web_service/ws/PrintMapServices.class.inc
+++ b/web_service/ws/PrintMapServices.class.inc
@@ -199,7 +199,12 @@ class PrintMapServices extends PrintServices {
         $sFeaturesZoom = $this->aValues['features_zoom'];
 
         /**
-         * Map features zoom
+         * Measure features
+         */
+        $aMeasureFeatures = $this->aValues['measure_features'];
+
+        /**
+         * Map resolution coef
          */
         $sResolutionCoeff = $this->aValues['resolution_coeff'];
 
@@ -253,11 +258,13 @@ class PrintMapServices extends PrintServices {
                 mkdir($this->aProperties['vas_home'] . '/public/vmap/prints', 0777, true);
             }
         }
+
         $sMapJSONPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'map_json_' . $sTimestamp, $sMapJSON);
         $sFeaturesPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'features_' . $sTimestamp, $sFeatures);
+        $sMeasureFeaturesPath = $this->writeToFile($this->aProperties['vas_home'] . '/public/vmap/prints', 'measure_features_' . $sTimestamp, json_encode($aMeasureFeatures));
 
         // Arguments de la ligne de commande
-        $aArguments = array($sProjectPath, $sPrintClientrUrl, $RestUrl, $sToken, $sOutputFile, $sMapId, $sMapJSONPath, $sImageSize, $sExtent, $sFeaturesPath, $sFeaturesZoom, $this->aValues['resolution_coeff'], $sQuality);
+        $aArguments = array($sProjectPath, $sPrintClientrUrl, $RestUrl, $sToken, $sOutputFile, $sMapId, $sMapJSONPath, $sImageSize, $sExtent, $sFeaturesPath, $sFeaturesZoom, $this->aValues['resolution_coeff'], $sQuality, $sMeasureFeaturesPath);
 
         // Commande à lancer
         $sCommand = '"' . $sPhantomjsPath . '" --ignore-ssl-errors=yes --ssl-protocol=any';
diff --git a/web_service/ws/Querys.class.inc b/web_service/ws/Querys.class.inc
index 3aed39da27e23ba5bbe1615d9fa027c6127d5f48..41656427c4bfaae5f067386cae79fe4eceff5579 100644
--- a/web_service/ws/Querys.class.inc
+++ b/web_service/ws/Querys.class.inc
@@ -15,8 +15,9 @@ require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
 require_once 'Query.class.inc';
 require_once 'BusinessObject.class.inc';
-require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
-require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc');
+require_once (dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
+require_once (dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc');
+require_once (dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/files/Files_manager.class.inc');
 require_once 'vmlib/logUtil.inc';
 
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/Vm.class.inc';
@@ -51,6 +52,7 @@ class Querys extends Vmap {
         $this->aProperties = $properties;
         $this->aValues['getGroup'] = false;
         $this->oConnection = new Connection($this->aValues, $this->aProperties);
+        $this->oFilesManager = new Files_manager($this->aProperties);
     }
 
     /**
@@ -841,7 +843,21 @@ class Querys extends Vmap {
 
                         foreach ($aLigne['bo_' . $type] as $key => $value) {
                             if (is_dir($sDataDir . "/" . $key)) {
-                                $aLigne['bo_' . $type][$key] = $sDataUrl . "/" . $key . "/" . $value . "?d=" . $date->getTimestamp();
+                                $aFiles = explode('|', $value);
+                                if (count($aFiles) > 1) {
+                                    $aLigne['bo_' . $type][$key] = [];
+                                    for ($i=0; $i < count($aFiles); $i++) {
+                                        if (file_exists($sDataDir . "/" . $key . "/" . $aFiles[$i])) {
+                                            array_push($aLigne['bo_' . $type][$key], $this->oFilesManager->oFileInterface->getProxyPassUrl($sDataDir . "/" . $key . "/" . $aFiles[$i]));
+                                        }
+                                    }
+                                } else {
+                                    if (!empty($value)) {
+                                        if (file_exists($sDataDir . "/" . $key . "/" . $value)) {
+                                            $aLigne['bo_' . $type][$key] = $this->oFilesManager->oFileInterface->getProxyPassUrl($sDataDir . "/" . $key . "/" . $value);
+                                        }
+                                    }
+                                }
                             }
                         }
                     }
@@ -1429,32 +1445,8 @@ class Querys extends Vmap {
 
         $this->aValues['my_vitis_id'] = $this->aValues[$bo_id_field];
 
-        // Définit si il a des fichiers a uploader
-        $bUploadFiles = false;
-        foreach ($this->aValues as $key => $value) {
-            if (strrpos($key, '_file')) {
-                $sName = substr($key, 0, strrpos($key, '_file'));
-                if (isset($this->aValues[$sName . '_name'])) {
-                    $bUploadFiles = true;
-                }
-            }
-        }
-
-        // Fichiers à uploader ?
-        if ($bUploadFiles) {
-            // Création du dossier contenneur si il n'existe pas
-            $sDirPath = $this->createElementFilesFolder($sBusinessObjectId, $this->aValues['my_vitis_id']);
-            if (!is_dir($sDirPath)) {
-                $oError = new VitisError(1, "Unable to acces to the business object direrctory :" . $sDirPath);
-                $aXmlRacineAttribute['status'] = 0;
-                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-                return $sMessage;
-            }
-            // Mise en place des fichiers
-            $this->aValues = $this->extractFilesFromValues($this->aValues, $sDirPath);
-        }
-
-        $aReturn = $this->genericPut($bo_schema, $bo_table, $bo_id_field);
+        // Maj en base
+        $aReturn = $this->genericPut($bo_schema, $bo_table, $bo_id_field, '*', $sBusinessObjectId, "vitis", "documents");
 
         // Lance l'évènement webSocket
         if (!empty($bo_event)) {
@@ -1467,37 +1459,51 @@ class Querys extends Vmap {
         return $aReturn['sMessage'];
     }
 
-    /**
-     * Extract the files from aValues and modify the paths
-     * @param array $aValues
-     * @param string $sDirPath
-     * @param string $sFilePrefix
-     * @return array Parsed $aValues
-     */
-    function extractFilesFromValues($aValues, $sDirPath) {
+    function extractFile($aValues, $sName, $oFile, $sDirPath) {
+
+        if (!empty($sName) && !empty($oFile['name']) && !empty($oFile['file'])) {
 
-        foreach ($aValues as $key => $value) {
-            if (strrpos($key, '_file')) {
+            // Crée le dossier si besoin
+            $sDirColumnPath = $sDirPath . '/' . $sName;
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
 
-                $sName = substr($key, 0, strrpos($key, '_file'));
-                $sFileName = $aValues[$sName . '_name'];
+            // Cŕee le fichier sur le serveur
+            $fp = fopen($sDirColumnPath . '/' . $oFile['name'], "w");
+            fwrite($fp, $oFile['file']);
+            fclose($fp);
 
-                if (!empty($sFileName)) {
+            // Mise en place pour la base de données
+            if (empty($aValues[$sName])) {
+                $aValues[$sName] = $oFile['name'];
+            } else {
+                $aValues[$sName] .= '|' . $oFile['name'];
+            }
 
-                    $sDirColumnPath = $sDirPath . '/' . $sName;
-                    if (!is_dir($sDirColumnPath)) {
-                        mkdir($sDirColumnPath, 0777, true);
-                    }
+            if (!empty($aValues[$sName . '_file'])) {
+                unset($aValues[$sName . '_file']);
+            }
+            if (!empty($aValues[$sName . '_name'])) {
+                unset($aValues[$sName . '_name']);
+            }
+        }
+
+        return $aValues;
+    }
 
-                    // Cŕee le fichier sur le serveur
-                    $fp = fopen($sDirColumnPath . '/' . $sFileName, "w");
-                    fwrite($fp, $value);
-                    fclose($fp);
+    function extractFiles($aValues, $sDirPath) {
 
-                    // Mise en place pour la base de données
-                    $aValues[$sName] = $aValues[$sName . '_name'];
-                    unset($aValues[$sName . '_file']);
-                    unset($aValues[$sName . '_name']);
+        foreach ($_FILES as $key => $value) {
+
+            if (!empty($value['file'])) {
+                $aValues = $this->extractFile($aValues, $key, $value, $sDirPath);
+            }
+            if (!empty($value[0])) {
+                for ($i=0; $i < count($value); $i++) {
+                    if (!empty($value[$i]['file'])) {
+                        $aValues = $this->extractFile($aValues, $key, $value[$i], $sDirPath);
+                    }
                 }
             }
         }
@@ -1607,34 +1613,7 @@ class Querys extends Vmap {
         // $this->aValues['my_vitis_id'] = $this->aValues[$bo_id_field];
         unset($this->aValues['my_vitis_id']);
 
-        $aReturn = $this->genericPost($bo_schema, $bo_table, '', $bo_id_field);
-
-        // Fichiers à uploader ?
-        if (!empty($_FILES) && !empty($this->aValues['my_vitis_id'])) {
-
-            // Création du dossier contenneur
-            $sDirPath = $this->createElementFilesFolder($sBusinessObjectId, $this->aValues['my_vitis_id']);
-            if (!is_dir($sDirPath)) {
-                $oError = new VitisError(1, "Unable to acces to the business object direrctory :" . $sDirPath);
-                $aXmlRacineAttribute['status'] = 0;
-                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-                return $sMessage;
-            }
-            // Écriture du fichier
-            foreach ($_FILES as $sName => $aFile) {
-
-                $sDirColumnPath = $sDirPath . '/' . $sName;
-                if (!is_dir($sDirColumnPath)) {
-                    mkdir($sDirColumnPath, 0777, true);
-                }
-
-                $this->aValues[$sName] = $aFile['name'];
-
-                // Écrit le fichier dans son enplacement
-                uploadFile($sName, "", $sDirColumnPath . "/" . $aFile['name'], $aFile['size'] + 1);
-            }
-            $this->genericPut($bo_schema, $bo_table, $bo_id_field);
-        }
+        $aReturn = $this->genericPost($bo_schema, $bo_table, '', $bo_id_field, '*', $sBusinessObjectId, "vitis", "documents");
 
         // Lance l'évènement webSocket
         if (!empty($bo_event)) {
diff --git a/web_service/ws/Services.class.inc b/web_service/ws/Services.class.inc
index d5e8deda7e33af0f4f91e3d230c1ebe0488fbeeb..ff4423e4e7a3febb7fab9f0a2c163de1d134ebf9 100755
--- a/web_service/ws/Services.class.inc
+++ b/web_service/ws/Services.class.inc
@@ -9,7 +9,7 @@
  * \brief This file contains the Services php class
  *
  * This class defines Rest Api to Vmap Services
- * 
+ *
  */
 require_once 'Vmap.class.inc';
 require_once 'Service.class.inc';
@@ -128,7 +128,7 @@ class Services extends Vmap {
             }
         }
 
-        // Reformatte la réponse 
+        // Reformatte la réponse
         if (isset($this->aValues['sEncoding'])) {
             $sEncoding = $this->aValues['sEncoding'];
         } else {
@@ -220,7 +220,7 @@ class Services extends Vmap {
      *     )
      *
      *  )
-     * 
+     *
      * )
      */
 
@@ -230,45 +230,17 @@ class Services extends Vmap {
      */
     function POST() {
 
-        // Vignette à uploader ?
-        if (!empty($_FILES['thumbnail'])) {
-            // la colonne thumbnail vaudra le nom du fichier
-            $this->aValues["thumbnail"] = $_FILES['thumbnail']["name"];
-        }
-
-        // Redimmensionnement de l'image.
+        // Fichiers à uploader
+        $aUploadFiles = array(
+            'thumbnail' => []
+        );
         if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
-            // Renomme l'image en jpg
-            $aPointsArray = explode('.', $this->aValues["thumbnail"]);
-            $aPointsArray[count($aPointsArray) - 1] = 'jpg';
-            $this->aValues["thumbnail"] = join('.', $aPointsArray);
-        }
-
-        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'service', $this->aProperties['schema_vmap'] . '.seq_common', 'service_id');
-
-        // Vignette à uploader ?
-        if (!empty($_FILES['thumbnail'])) {
-            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_services/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $_FILES['thumbnail']["name"];
-
-            // Crée les répertoires si ils n'existent pas
-            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_services', $this->aValues["my_vitis_id"]);
-            $sDirColumnPath = $sDirPath . '/thumbnail';
-            if (!is_dir($sDirColumnPath)) {
-                mkdir($sDirColumnPath, 0777, true);
-            }
-
-            $sErrorMessage = uploadFile("thumbnail", "", $sImageDir, $_FILES['thumbnail']['size'] + 1);
-
-            if ($sErrorMessage != "") {
-                writeToErrorLog($sErrorMessage);
-            } else {
-                // Redimmensionnement de l'image.
-                if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
-                    $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
-                }
-            }
+            $aUploadFiles['thumbnail']['width'] = $this->aValues['thumbnail_width'];
+            $aUploadFiles['thumbnail']['height'] = $this->aValues['thumbnail_height'];
         }
 
+        // Envoi Post
+        $aReturn = $this->genericPost($this->aProperties['schema_vmap'], 'service', $this->aProperties['schema_vmap'] . '.seq_common', 'service_id', $aUploadFiles, 'vmap_admin_map_vmap_services');
         return $aReturn['sMessage'];
     }
 
@@ -347,7 +319,7 @@ class Services extends Vmap {
      *         description="Poprerties Response",
      *         @SWG\Schema(ref="#/definitions/services")
      *     ),
-     * 
+     *
      *  )
      */
 
@@ -356,35 +328,18 @@ class Services extends Vmap {
      * @return array containing the status and the message
      */
     function PUT() {
-        // Vignette à uploader ?
-        if (!empty($this->aValues["thumbnail_file"])) {
-
-            $sImageDir = $this->aProperties['ws_data_dir'] . '/vitis/vmap_admin_map_vmap_services/documents/' . $this->aValues["my_vitis_id"] . '/thumbnail/' . $this->aValues["thumbnail_name"];
 
-            // Crée les répertoires si ils n'existent pas
-            $sDirPath = $this->createElementFilesFolder('vmap_admin_map_vmap_services', $this->aValues["my_vitis_id"]);
-            $sDirColumnPath = $sDirPath . '/thumbnail';
-            if (!is_dir($sDirColumnPath)) {
-                mkdir($sDirColumnPath, 0777, true);
-            }
-
-            // la colonne thumbnail vaudra le nom du fichier
-            $this->aValues["thumbnail"] = $this->aValues["thumbnail_name"];
-            $fp = fopen($sImageDir, "w");
-            fwrite($fp, $this->aValues["thumbnail_file"]);
-            fclose($fp);
-
-            // Redimmensionnement de l'image.
-            if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
-                $this->pictureResampler($sImageDir, $this->aValues['thumbnail_width'], $this->aValues['thumbnail_height']);
-                // Renomme l'image en jpg
-                $aPointsArray = explode('.', $this->aValues["thumbnail"]);
-                $aPointsArray[count($aPointsArray) - 1] = 'jpg';
-                $this->aValues["thumbnail"] = join('.', $aPointsArray);
-            }
+        // Fichiers à uploader
+        $aUploadFiles = array(
+            'thumbnail' => []
+        );
+        if (!empty($this->aValues['thumbnail_width']) && !empty($this->aValues['thumbnail_height'])) {
+            $aUploadFiles['thumbnail']['width'] = $this->aValues['thumbnail_width'];
+            $aUploadFiles['thumbnail']['height'] = $this->aValues['thumbnail_height'];
         }
 
-        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'service', 'service_id');
+        // Envoi Put
+        $aReturn = $this->genericPut($this->aProperties['schema_vmap'], 'service', 'service_id', $aUploadFiles, 'vmap_admin_map_vmap_services');
         return $aReturn['sMessage'];
     }
 
diff --git a/web_service/ws/Vmap.class.sql.inc b/web_service/ws/Vmap.class.sql.inc
index cf54181a5398368ea642685ca3d390afdb6f49e2..3b44532a96922a1c7600ff79d57e63dde66cc6ea 100755
--- a/web_service/ws/Vmap.class.sql.inc
+++ b/web_service/ws/Vmap.class.sql.inc
@@ -27,6 +27,10 @@ $aSql['updateMapLayerOpacity'] = "UPDATE [sSchemaVmap].map_layer SET layer_opaci
 // VmapUsers
 $aSql['getUserPrintStyles'] = "SELECT user_printstyle.printstyle_id,printstyle.name FROM [sSchemaVmap].user_printstyle LEFT JOIN [sSchemaVmap].printstyle ON user_printstyle.printstyle_id = printstyle.printstyle_id WHERE user_printstyle.user_id = [user_id]";
 $aSql['insertUserPrintStyles'] = "INSERT INTO [sSchemaVmap].user_printstyle(user_id, printstyle_id) VALUES([user_id], [printstyle_id])";
+$aSql['getUserDefaultMap'] = "SELECT user_defaultmap.map_id FROM [sSchemaVmap].user_defaultmap WHERE user_defaultmap.user_id = [user_id]";
+$aSql['getCurrentUserDefaultMap'] = "SELECT map_id FROM [sSchemaVmap].v_user_defaultmap";
+$aSql['removeUserDefaultMap'] = "DELETE FROM [sSchemaVmap].user_defaultmap WHERE user_defaultmap.user_id = [user_id]";
+$aSql['insertUserDefaultMap'] = "INSERT INTO [sSchemaVmap].user_defaultmap(user_id, map_id) VALUES([user_id], [map_id])";
 // PrintTemplates
 $aSql['getPrintTemplateParameters'] = "SELECT * FROM [sSchemaVmap].v_print_parameter WHERE printtemplate_id=[printtemplate_id]";
 $aSql['insertPrintTemplateGroups'] = "INSERT INTO [sSchemaVmap].printtemplate_group(group_id, printtemplate_id) VALUES([group_id], [printtemplate_id])";
@@ -42,4 +46,4 @@ $aSql['setLayerBoId'] = "UPDATE [sSchemaVmap].layer SET bo_id = NULL WHERE layer
 $aSql['deleteAssociatedBos'] = "DELETE FROM [sSchemaVmap].layer_businessobject WHERE layer_id = [layer_id]";
 $aSql['deleteAssociatedLayers'] = "DELETE FROM [sSchemaVmap].layer_businessobject WHERE business_object_id = [business_object_id]";
 $aSql['addAssociatedBos'] = "INSERT INTO [sSchemaVmap].layer_businessobject(layer_id, business_object_id) VALUES ([layer_id], [business_object_id]);";
-?>
\ No newline at end of file
+?>
diff --git a/web_service/ws/VmapUser.class.inc b/web_service/ws/VmapUser.class.inc
index d2225a63c1ddcc1b2aa30fabf6ed3beac354bafa..41a75bbadce8a33b391ea037d1aa93291d5efc8c 100755
--- a/web_service/ws/VmapUser.class.inc
+++ b/web_service/ws/VmapUser.class.inc
@@ -10,10 +10,10 @@ require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection
 *	\brief This file contains the VmapUser php class
 *
 * This class defines operation for one User
-* 
+*
 */
 class VmapUser  extends Vmap {
-    
+
     public $oError;
     /**
      * construct
@@ -25,10 +25,10 @@ class VmapUser  extends Vmap {
      */
     function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
-        $this->aSelectedFields = Array("user_id", "login", "print_styles");
+        $this->aSelectedFields = Array("user_id", "login", "print_styles", "default_map");
     }
       /**
-     * @SWG\Get(path="/vmapusers/{user_id}", 
+     * @SWG\Get(path="/vmapusers/{user_id}",
      *   tags={"Users"},
      *   summary="Get User",
      *   description="Request to get user by id",
@@ -69,31 +69,50 @@ class VmapUser  extends Vmap {
         require $this->sRessourcesFile;
         $this->aFields = $this->getFields($this->aProperties['schema_framework'], "v_user", "user_id");
         $this->getPrintStyles();
+        $this->getDefaultMap();
     }
-    
+
     /**
-     *  get print styles of user
-     */
+    *  get print styles of user
+    */
     function getPrintStyles(){
         require $this->sRessourcesFile;
         if (in_array("print_styles", $this->aSelectedFields)){
-                $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
-                $aParams['user_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
-                $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getUserPrintStyles'], $aParams);
-		$sListPrintStyleId = "";
-                $aListPrintStyleId = array();
-		while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
-			if ($sListPrintStyleId == ""){
-				$sListPrintStyleId = $aLigne["printstyle_id"];
-			}else{
-				$sListPrintStyleId .= "|".$aLigne["printstyle_id"];
-			}
-                        $aListPrintStyleId[] = $aLigne["name"];
-		}
-		$oPDOresult=$this->oConnection->oBd->fermeResultat();
-                $this->aFields['print_styles'] = $sListPrintStyleId;
-                $this->aFields['print_styles_label'] = implode(',', $aListPrintStyleId);
+            $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+            $aParams['user_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+            $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getUserPrintStyles'], $aParams);
+            $sListPrintStyleId = "";
+            $aListPrintStyleId = array();
+            while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+                if ($sListPrintStyleId == ""){
+                    $sListPrintStyleId = $aLigne["printstyle_id"];
+                }else{
+                    $sListPrintStyleId .= "|".$aLigne["printstyle_id"];
+                }
+                $aListPrintStyleId[] = $aLigne["name"];
+            }
+            $oPDOresult=$this->oConnection->oBd->fermeResultat();
+            $this->aFields['print_styles'] = $sListPrintStyleId;
+            $this->aFields['print_styles_label'] = implode(',', $aListPrintStyleId);
+        }
+    }
+
+    /**
+     *  get the user default map
+     */
+    function getDefaultMap(){
+        require $this->sRessourcesFile;
+        if (in_array("default_map", $this->aSelectedFields)){
+            $aParams['sSchemaVmap'] = array('value' => $this->aProperties['schema_vmap'], 'type' => 'schema_name');
+            $aParams['user_id'] = array('value' => $this->aValues['my_vitis_id'], 'type' => 'number');
+            $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getUserDefaultMap'], $aParams);
+            $sDefaultMapId = "";
+            while($aLigne=$this->oConnection->oBd->ligneSuivante ($oPDOresult)) {
+                $sDefaultMapId = $aLigne['map_id'];
+            }
+		    $oPDOresult=$this->oConnection->oBd->fermeResultat();
+            $this->aFields['default_map'] = $sDefaultMapId;
         }
     }
 }
-?>
\ No newline at end of file
+?>
diff --git a/web_service/ws/VmapUsers.class.inc b/web_service/ws/VmapUsers.class.inc
index ed8262b4f3b894ad2249154423789106444ad166..84088f8bf484bd7216703065b3b10c63bbb05c29 100755
--- a/web_service/ws/VmapUsers.class.inc
+++ b/web_service/ws/VmapUsers.class.inc
@@ -9,7 +9,7 @@
 *	\brief This file contains the Modes php class
 *
 * This class defines Rest Api to Vmap Users
-* 
+*
 */
 require_once 'Vmap.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
@@ -17,7 +17,7 @@ require_once 'VmapUser.class.inc';
 require_once(dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc');
 
 class VmapUsers extends Vmap {
-    
+
      /**
      * @SWG\Definition(
      *   definition="/vmapusers",
@@ -42,7 +42,7 @@ class VmapUsers extends Vmap {
         parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
         $this->aSelectedFields = Array("user_id", "login", "print_styles");
     }
-    
+
     /**
      * get Users
      * @return  Users
@@ -51,7 +51,7 @@ class VmapUsers extends Vmap {
         $aReturn = $this->genericGet( $this->aProperties['schema_framework'], "v_user", "user_id");
         return $aReturn['sMessage'];
     }
-    
+
     /**
      * @SWG\Put(path="/vmapusers/{user_id}",
      *   tags={"Users"},
@@ -106,10 +106,10 @@ class VmapUsers extends Vmap {
         $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
         // Supprime les styles d'impression rattachés à l'utilisateur.
         $this->oConnection->oBd->delete($this->aProperties['schema_vmap'], 'user_printstyle', 'user_id', $this->aValues["my_vitis_id"]);
-        // Styles d'impression à rattacher au usere ?
+        // Styles d'impression à rattacher au user ?
         if (!empty($this->aValues['print_styles'])) {
             $aPrintStyles = explode('|', $this->aValues['print_styles']);
-            foreach ($aPrintStyles as $iPrintStyleId) {                
+            foreach ($aPrintStyles as $iPrintStyleId) {
                 $sSql = $aSql['insertUserPrintStyles'];
                 $aSQLParams = array(
                     'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
@@ -125,7 +125,31 @@ class VmapUsers extends Vmap {
                 }
             }
         }
+        // Carte par défaut à rattacher au user ?
+        // Supprime la carte par défaut
+        $sSql = $aSql['removeUserDefaultMap'];
+        $aSQLParams = array(
+            'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+            'user_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number')
+        );
+        $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+        if (!empty($this->aValues['default_map'])) {
+            // Ajoute la carte par défaut
+            $sSql = $aSql['insertUserDefaultMap'];
+            $aSQLParams = array(
+                'sSchemaVmap' => array('value' => $this->aProperties['schema_vmap'], 'type' => 'column_name'),
+                'user_id' => array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'),
+                'map_id' => array('value' => $this->aValues['default_map'], 'type' => 'number')
+            );
+            $resultat = $this->oConnection->oBd->executeWithParams($sSql, $aSQLParams);
+            if ($this->oConnection->oBd->enErreur()) {
+                $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                $oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+                $aXmlRacineAttribute['status'] = 0;
+                $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            }
+        }
         return $sMessage;
     }
 }
-?>
\ No newline at end of file
+?>