diff --git a/module/css/vmap.less b/module/css/vmap.less
old mode 100755
new mode 100644
index 714bc72f15ff3a92cb4a602b102bb2c16c467255..0afd13f194d292e38f188753422b6b48c5ebab8c
--- a/module/css/vmap.less
+++ b/module/css/vmap.less
@@ -1482,6 +1482,11 @@ app-layertree button:hover {
     background-color: transparent;
     color: @color-text-1;
 }
+.basic-tools-element.inactive, .basic-tools-element.inactive:hover{
+    background-color: #838383 !important;
+    color: #A5A5A5 !important;
+    cursor : not-allowed !important;
+}
 .basic-tools-element.active{
     background-color: @basic-tool-active !important;
     color: @head-bar !important;
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_admin_map.json
old mode 100755
new mode 100644
diff --git a/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers.json b/module/forms/vmap_admin_map/vmap_admin_map_vmap_layers.json
old mode 100755
new mode 100644
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js
old mode 100755
new mode 100644
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
old mode 100755
new mode 100644
diff --git a/module/javascript/app/modules/Cadastre/cadastre.js b/module/javascript/app/modules/Cadastre/cadastre.js
old mode 100755
new mode 100644
index 6ec72c9e6ebdac16b1f70ed5aa52b951067b3216..91a57bf08b978aba916e302d0bbed6393037e661
--- a/module/javascript/app/modules/Cadastre/cadastre.js
+++ b/module/javascript/app/modules/Cadastre/cadastre.js
@@ -269,7 +269,12 @@ nsVmap.nsToolsManager.nsModules.Cadastre.prototype.cadastreController = function
         return oVmap.isLink(sString, 'link');
     };
     $scope['getRenderedParsedLink'] = function (sString) {
-        sString = oVmap.parseLink(sString, 'link');
+
+        if(sString.indexOf('<a') === 0 && sString.indexOf('[') !== 0 ){
+            sString = oVmap.checkLink(sString);
+        }else{
+            sString = oVmap.parseLink(sString, 'link');
+        }        
         return $sce.trustAsHtml(sString);
     };
 };
diff --git a/module/javascript/app/vmap/map/map.js b/module/javascript/app/vmap/map/map.js
old mode 100755
new mode 100644
index a57f5921057205886fdd9f2069a8b0856dcb529a..7c0ba9a4a13165ccacc01ee5c7584bd9b561101d
--- a/module/javascript/app/vmap/map/map.js
+++ b/module/javascript/app/vmap/map/map.js
@@ -26,7 +26,7 @@ goog.require('goog.async.AnimationDelay');
  * Class {@link nsVmap.Map}: initializes the map
  *
  * @constructor
- * @export 
+ * @export
  */
 nsVmap.Map = function () {
     oVmap.log("nsVmap.Map");
@@ -1246,7 +1246,7 @@ nsVmap.Map.prototype.startMobileDraw = function (sGeomType, callback) {
 
     var this_ = this;
 
-    // Géométrie multiple ? 
+    // Géométrie multiple ?
     this.mobileDrawMulti_ = false;
     if (sGeomType.substr(0, 5).toUpperCase() === 'MULTI') {
         this.mobileDrawMulti_ = true;
@@ -1373,11 +1373,11 @@ nsVmap.Map.prototype.getDrawOutput_ = function (aPoints) {
             return new ol.geom.LineString(aPoints);
             break;
         case 'POLYGON':
-            
+
             // Ajoute la même coord à la fin de la géométrie de manière à boucler le polygone
             var aTmpPoints = angular.copy(aPoints);
             aTmpPoints.push(aTmpPoints[0]);
-            
+
             return new ol.geom.Polygon([aTmpPoints]);
             break;
         case 'CIRCLE':
@@ -1420,7 +1420,7 @@ nsVmap.Map.prototype.displayDrawTmpFeature_ = function () {
 nsVmap.Map.prototype.finishMobileDraw = function () {
     oVmap.log('nsVmap.Map.prototype.finishMobileDraw');
 
-    // Géométrie multiple ? 
+    // Géométrie multiple ?
     var this_ = this;
     if (this.mobileDrawMulti_) {
         bootbox['dialog']({
@@ -1568,7 +1568,7 @@ nsVmap.Map.prototype.redoLastChange = function () {
 };
 
 /**
- * 
+ *
  * @private
  */
 nsVmap.Map.prototype.getMapMenuScope = function () {
@@ -1893,7 +1893,6 @@ nsVmap.Map.prototype.mapController.prototype.emptyLoadErrorsEvents = function ()
     oVmap.log('nsVmap.Map.prototype.emptyLoadErrorsEvents');
 
     for (var i = 0; i < this.loadErrorEventsContainer_.length; i++) {
-//        this.loadErrorEventsContainer_[i].layer.getSource().unByKey(this.loadErrorEventsContainer_[i].event);
         ol.Observable.unByKey(this.loadErrorEventsContainer_[i].event);
     }
 };
@@ -2372,4 +2371,4 @@ nsVmap.Map.prototype.getLayerById = function (layerId) {
 
     // Si aucun layer ne correspondait
     return null;
-};
\ No newline at end of file
+};
diff --git a/module/javascript/app/vmap/mapmanager/layerstree.js b/module/javascript/app/vmap/mapmanager/layerstree.js
old mode 100755
new mode 100644
index 137700c86a3f1db8561b5115c035021d32f67fdb..673cb4e0f66ff2e60cc0b2faab5137030da12bb0
--- a/module/javascript/app/vmap/mapmanager/layerstree.js
+++ b/module/javascript/app/vmap/mapmanager/layerstree.js
@@ -145,7 +145,11 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
         this['layerstree_collapsed'] = oVmap['properties']['vmap']['layerstree_collapsed'];
     }
 
-    this.loadTree();
+    if (goog.isDefAndNotNull(oUrlParams['extent'])){
+        var aExtent = decodeURI(oUrlParams['extent']).split("|");
+    }
+
+    this.loadTree(aExtent);
 
     // Événements sur les couches
     var keepLoadedTiles = true;
@@ -351,9 +355,10 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.reloadTre
 
 /**
  * Load layers from the tree
+ * @param  {array|undefined} aExtent exent to fit on
  * @returns {undefined}
  */
-nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree = function () {
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree = function (aExtent) {
     oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.loadTree');
 
     if (this['map'].getLayers().getArray().length > 0)
@@ -413,6 +418,12 @@ 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
+        });
+    }
 };
 
 /**
diff --git a/module/javascript/app/vmap/mapmanager/maplegend.js b/module/javascript/app/vmap/mapmanager/maplegend.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/mapmanager/mapmanager.js b/module/javascript/app/vmap/mapmanager/mapmanager.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/maplist.js b/module/javascript/app/vmap/mapmanager/mapmodal/maplist.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/mapmanager/mapmodal/maplistlitle.js b/module/javascript/app/vmap/mapmanager/mapmodal/maplistlitle.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/tools/basictools.js b/module/javascript/app/vmap/tools/basictools.js
old mode 100755
new mode 100644
index abf0e9a40f14ad3ad23d146224bed5da175a5ea2..f53955c43cccd66024db099c860b32b003b11aca
--- a/module/javascript/app/vmap/tools/basictools.js
+++ b/module/javascript/app/vmap/tools/basictools.js
@@ -16,6 +16,7 @@ goog.require('nsVmap.nsToolsManager.Measure');
 goog.require('nsVmap.nsToolsManager.Select');
 goog.require('nsVmap.nsToolsManager.Insert');
 goog.require('nsVmap.nsToolsManager.Print');
+goog.require('nsVmap.nsToolsManager.Urlexporter');
 
 
 /**
@@ -34,6 +35,7 @@ nsVmap.nsToolsManager.BasicTools = function () {
     this.oInsert_ = new nsVmap.nsToolsManager.Insert();
     this.oPrint_ = new nsVmap.nsToolsManager.Print();
     this.oControls_ = new nsVmap.nsToolsManager.Controls();
+    this.oUrlExporter_ = new nsVmap.nsToolsManager.Urlexporter();
 };
 
 /**
diff --git a/module/javascript/app/vmap/tools/infocontainer.js b/module/javascript/app/vmap/tools/infocontainer.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/tools/insert.js b/module/javascript/app/vmap/tools/insert.js
index f016afe6dc9a72adc7eb25ad01883ab008009e13..803d13add3e95a2916e129c4eb60e6db3b981b01 100644
--- a/module/javascript/app/vmap/tools/insert.js
+++ b/module/javascript/app/vmap/tools/insert.js
@@ -1434,9 +1434,9 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getMobileB
 
     if (sGeomType === 'GEOMETRY' || sGeomType === 'GEOMETRYCOLLECTION') {
         bootbox.prompt({
-            'title': "Type de géométrie à insérer",
-            'inputType': 'select',
-            'inputOptions': [
+            title: "Type de géométrie à insérer",
+            inputType: 'select',
+            inputOptions: [
                 {
                     text: 'Point',
                     value: 'POINT'
@@ -1454,7 +1454,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getMobileB
                     value: 'CIRCLE'
                 }
             ],
-            'callback': function (result) {
+            callback: function (result) {
                 deferred.resolve(result);
             }
         });
diff --git a/module/javascript/app/vmap/tools/location.js b/module/javascript/app/vmap/tools/location.js
old mode 100755
new mode 100644
index c4f32bfcacdf8145bcb3f015d28f580d31f4eb34..4cd96440554191c47a0415289ddde0cb77eb6065
--- a/module/javascript/app/vmap/tools/location.js
+++ b/module/javascript/app/vmap/tools/location.js
@@ -127,6 +127,23 @@ nsVmap.nsToolsManager.Location.prototype.locationController = function ($scope,
      */
     this['oBusinessObjects'] = [];
 
+    /**
+     * @type {array}
+     */
+    this['aLocationHistory'] = [{
+		center: this_.map_.getView().getCenter(),
+		zoom: this_.map_.getView().getZoom()
+	}];
+    /**
+     * @type {integer}
+     */
+    this['iHistoryOffset'] = 0;
+    /**
+     * @type {integer}
+     */
+    this['iHistoryOffset_save'] = 0;
+
+
     /**
      * @tyle {number}
      */
@@ -169,8 +186,44 @@ nsVmap.nsToolsManager.Location.prototype.locationController = function ($scope,
         });
     });
 
+    // remplissage de l'historique des étendues
+    var fHistoryDelayHandler;
+    this_.map_.on("moveend", function(event){
+    	if(this_['iHistoryOffset'] === this_['iHistoryOffset_save']){
+    		//check wait
+	        if (goog.isDefAndNotNull(fHistoryDelayHandler)){
+	            $timeout.cancel(fHistoryDelayHandler);
+	        }
+
+	        fHistoryDelayHandler = $timeout(function () {
+	        	if(this_['iHistoryOffset'] === 0){
+	        		this_["aLocationHistory"].push({
+		        		center: this_.map_.getView().getCenter(),
+		        		zoom: this_.map_.getView().getZoom()
+		    		});
+	        	} else {
+	        		// splice 
+	        		var iHistoryPosition = this_['aLocationHistory'].length - (this_['iHistoryOffset']);
+	        		this_["aLocationHistory"].splice(iHistoryPosition, this_['iHistoryOffset'], {
+		        		center: this_.map_.getView().getCenter(),
+		        		zoom: this_.map_.getView().getZoom()
+		    		});
+
+		    		this_['iHistoryOffset'] = 0;
+	        	}
+	        }, oVmap['properties']['vmap_history_timer']);
+    	} else {
+    		this_['iHistoryOffset_save'] = this_['iHistoryOffset'];
+    	}
+    });
+
     // Vide les localisations quand on change de carte
     oVmap['scope'].$on('mapChanged', function () {
+    	// purge de l'historique des étendues
+    	this_['aLocationHistory'] = [{
+			center: this_.map_.getView().getCenter(),
+			zoom: this_.map_.getView().getZoom()
+		}];
         if (goog.isDef(this_.locationPopup)) {
             this_.locationPopup.remove();
         }
@@ -311,6 +364,48 @@ nsVmap.nsToolsManager.Location.prototype.locationController.prototype.goHome = f
     currentView.setResolution(originalPosition.resolution);
 };
 
+
+/**
+ * Go on the previous extent
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.nextHistoryExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.nextHistoryExtent");
+
+    if(this['iHistoryOffset'] > 0){
+    	this['iHistoryOffset'] -= 1;
+    	this.selectHistoryExtent();
+    }
+};
+
+/**
+ * Go on the next extent
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.previousHistoryExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.previousHistoryExtent");
+
+    if(this['iHistoryOffset'] < this['aLocationHistory'].length - 1){
+    	this['iHistoryOffset'] += 1;
+    	this.selectHistoryExtent();
+    }
+};
+
+/**
+ * Go on the selected extent in history
+ * @export
+ */
+nsVmap.nsToolsManager.Location.prototype.locationController.prototype.selectHistoryExtent = function () {
+    oVmap.log("nsVmap.nsToolsManager.Location.prototype.locationController.selectHistoryExtent");
+
+    var currentView = oVmap.getMap().getOLMap().getView();
+
+    var iHistoryPosition = this['aLocationHistory'].length - ( 1 + this['iHistoryOffset']);
+
+    currentView.setCenter(this['aLocationHistory'][iHistoryPosition].center);
+    currentView.setZoom(this['aLocationHistory'][iHistoryPosition].zoom);
+};
+
 /**
  * Localise the map on the entry position
  * @param {string} CoordX html id to the X value
diff --git a/module/javascript/app/vmap/tools/print.js b/module/javascript/app/vmap/tools/print.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/tools/select/advancedselect.js b/module/javascript/app/vmap/tools/select/advancedselect.js
old mode 100755
new mode 100644
diff --git a/module/javascript/app/vmap/tools/urlexporter.js b/module/javascript/app/vmap/tools/urlexporter.js
new file mode 100644
index 0000000000000000000000000000000000000000..85e757f8f70c2bac1538b099482fd06940cec290
--- /dev/null
+++ b/module/javascript/app/vmap/tools/urlexporter.js
@@ -0,0 +1,140 @@
+/* global oVmap, nsVmap, goog, ol, vitisApp */
+
+/**
+ * @author: Anthony Borghi
+ * @Description: Fichier contenant la classe nsVmap.nsToolsManager.Urlexporter
+ * cette classe permet à l'utilisateur d'exporter une url pour un autre utilisateur
+ */
+goog.provide('nsVmap.nsToolsManager.Urlexporter');
+
+goog.require('oVmap');
+
+/**
+ * @classdesc
+ * Class {@link nsVmap.nsToolsManager.VmapUser}
+ * @constructor
+ * @export
+ */
+nsVmap.nsToolsManager.Urlexporter = function () {
+    oVmap.log('nsVmap.nsToolsManager.Urlexporter');
+};
+
+
+
+/**
+ * Directive
+ * @return {angular.Directive} The directive specs.
+ * @constructor
+ */
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterDirective = function () {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterDirective");
+    return {
+        restrict: 'A',
+        scope: {
+            'map': '=appMap',
+            'lang': '=appLang'
+        },
+        controller: 'AppUrlExporterController',
+        controllerAs: 'ctrl',
+        bindToController: true,
+        templateUrl: oVmap['properties']['vmap_folder'] + '/' + 'template/tools/' + (oVmap['properties']['is_mobile'] ? 'urlexporter_mobile.html' : 'urlexporter.html')
+    };
+};
+
+/**
+ * Controler
+ * @constructor
+ * @param {object} $scope
+ * @returns {undefined}
+ * @ngInject
+ */
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController = function ($scope, $q, $element) {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController");
+
+    var this_ = this;
+
+    this.$scope_ = $scope;
+
+    /**
+     * The current properties
+     */
+    this['properties'] = oVmap['properties'];
+
+    /**
+     * The current token
+     */
+    this['token'] = oVmap['properties']['token'];
+
+    /**
+     * @type {string}
+     */
+    this["urlToExport"] = "";
+    /**
+     * @type {boolean}
+     */
+    this["usePublicToken"] = false;
+
+    this["urlConstructor"]();
+
+    // Affiche les modales en plein écran pour la version mobile
+    //if (oVmap['properties']['is_mobile']) {
+    //    $element.find('.modal').on('shown.bs.modal', function () {
+    //        $('.modal-backdrop.fade.in').hide();
+    //        $('.modal.fade.in').find('.modal-dialog').addClass('mobile-full-modal');
+    //    });
+    //}
+
+    console.log(this['properties']);
+
+    // recalcule l'url quand on change de carte
+    oVmap['scope'].$on('mapChanged', function () {
+        this_["urlConstructor"]();
+    });
+
+    $scope.$watch("ctrl.usePublicToken", function(){
+        this_["urlConstructor"]();
+    })
+
+    oVmap.getMap().getOLMap().on("moveend", function(event){
+        this_["urlConstructor"]();
+    });
+};
+
+/**
+ * Display the user form in display mode
+ * @returns {undefined}
+ * @export
+ */
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlConstructor = function () {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.urlConstructor");
+
+    var sUrl = this['properties']['web_server_name'] + "/" + this['properties']['application'];
+
+    if (goog.isDefAndNotNull(this['properties']['environment'])){
+        if (this['properties']['environment'] != ""){
+            sUrl += "_" + this['properties']['environment'];
+        }
+    }
+
+    sUrl += "?";
+
+    var oMapCatalog = oVmap.getMapManager().getMapCatalog();
+    var iMapId = oMapCatalog["maps"][oMapCatalog["usedMap"]]["map_id"];
+
+    sUrl += "map_id=" + iMapId;
+
+    // si public add token
+    if (this["usePublicToken"]){
+        sUrl += "&token=" + this['properties']['public_token'];
+    }
+
+    // get extent and add in url
+    var sExtent = oVmap.getMap().getOLMap().getView().calculateExtent(oVmap.getMap().getOLMap().getSize()).join("|");
+    sUrl += "&extent=" + encodeURI(sExtent);
+
+    this["urlToExport"] = sUrl;
+};
+
+// Définit la directive et le controller
+oVmap.module.directive('appUrlExporter', nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterDirective);
+oVmap.module.controller('AppUrlExporterController', nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController);
\ No newline at end of file
diff --git a/module/javascript/app/vmap/vmap.js b/module/javascript/app/vmap/vmap.js
old mode 100755
new mode 100644
index 3c8347db3ba770d000f86dec38be9c18582361f5..48dbc1bacdb92c117848b877817f120614ccbc71
--- a/module/javascript/app/vmap/vmap.js
+++ b/module/javascript/app/vmap/vmap.js
@@ -1174,6 +1174,12 @@ oVmap.isLink = function (item, tagIdentifier) {
     if (item.indexOf('[' + tagIdentifier) !== -1 && item.indexOf('[/' + tagIdentifier + ']') !== -1) {
         return true;
     }
+
+    if (item.indexOf('<a') !== -1 && item.indexOf('</a>') !== -1) {
+        return true;
+    }
+
+
     return false;
 };
 
@@ -1211,18 +1217,53 @@ oVmap.parseLink = function (sString, tagIdentifier) {
     }
 };
 
+/**
+ * Parse a link and extract only good tags ex: <a href="https://www.google.fr" target="_blank">Lien</a>
+ * @param {String} sString
+ * @returns {String}
+ * @export
+ */
+oVmap.checkLink = function(sString){
+    if (!goog.isDefAndNotNull(sString)) {
+        return '';
+    }
+    if (!goog.isString(sString)) {
+        return '';
+    }
+    var sLink = sString.substr(sString.indexOf('<a'), sString.indexOf('</a>') - sString.indexOf('<a') + 10);
+    var sLinkFirstTag = oVmap.getFirstLinkTag_(sLink, '>');
+    var sLinkContent = oVmap.getLinkContent_(sLink, sLinkFirstTag, '</a>');
+    var oLinkArgs = oVmap.getLinkTagArguments_(sLinkFirstTag);
+    // extract only required tags (href and target)
+    var sHref = goog.isDefAndNotNull(oLinkArgs['href']) ? oLinkArgs['href'] : null;
+    var sTarget = goog.isDefAndNotNull(oLinkArgs['target']) ? oLinkArgs['target'] : '_blank';
+    var sContent = sLinkContent.length > 0 ? sLinkContent : sHref;
+
+    if (goog.isDefAndNotNull(sHref)) {
+        var sLink = '<a href="' + sHref + '" target="' + sTarget + '">' + sContent + '</a>';
+        return sLink;
+    } else {
+        console.error('cannot parse href');
+        // return empty string to avoid Javascript injection
+        return "";
+    }
+}
+
+
 /**
  * Get the first tag
  * @param {String} sLink
  * @returns {String}
  */
-oVmap.getFirstLinkTag_ = function (sLink) {
+oVmap.getFirstLinkTag_ = function (sLink, sLinkTagToFind) {
 
     var quoteIndex1 = null;
     var quoteIndex2 = null;
     var bInArgument = false;
     var sLinkFirstTag = '';
 
+    sLinkTagToFind = (goog.isDefAndNotNull(sLinkTagToFind)) ? sLinkTagToFind : ']';
+
     for (var i = 0; i < sLink.length; i++) {
         sLinkFirstTag += sLink[i];
         if (sLink[i] === '"') {
@@ -1252,7 +1293,7 @@ oVmap.getFirstLinkTag_ = function (sLink) {
             }
         }
 
-        if (!bInArgument && sLink[i] === ']') {
+        if (!bInArgument && sLink[i] === sLinkTagToFind) {
             break;
         }
     }
diff --git a/module/javascript/vitis/script_module.js b/module/javascript/vitis/script_module.js
old mode 100755
new mode 100644
diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json
old mode 100755
new mode 100644
diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json
old mode 100755
new mode 100644
diff --git a/module/template/layers/layertree.html b/module/template/layers/layertree.html
old mode 100755
new mode 100644
diff --git a/module/template/layers/mapmodal/maplist.html b/module/template/layers/mapmodal/maplist.html
old mode 100755
new mode 100644
diff --git a/module/template/layers/mapmodal/maplistlitle.html b/module/template/layers/mapmodal/maplistlitle.html
old mode 100755
new mode 100644
diff --git a/module/template/modules/cadastre.html b/module/template/modules/cadastre.html
old mode 100755
new mode 100644
diff --git a/module/template/tools/basicselect.html b/module/template/tools/basicselect.html
old mode 100755
new mode 100644
diff --git a/module/template/tools/basictools.html b/module/template/tools/basictools.html
old mode 100755
new mode 100644
index 5dc8dd2abc9080cf667aed84e571434ee4aa44db..e85c74762d60d92d19a6b560d5811b7a178fad98
--- a/module/template/tools/basictools.html
+++ b/module/template/tools/basictools.html
@@ -4,6 +4,21 @@
             <ul class="nav nav-pills basic-tools-nav">
                 <!-- Outils de localisation -->
                 <div app-location app-lang="ctrl.lang" app-map="ctrl.map"></div>
+                <!-- Outil d'export d'url -->
+                <div>
+                    <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+                        <a class="basic-tools-element pointer"
+                           title="Générateur d'URL"
+                           onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
+                            <span class="icon-at" aria-hidden="true"></span>
+                        </a>
+                        <div app-url-exporter app-lang="ctrl.lang" app-map="ctrl.map"
+                             id="basic-tools-dropdown-urlexporter"
+                             class="dropdown-menu basic-tools-dropdown-element"
+                             style="margin: -10px -1px; width: 30%;">
+                        </div>
+                    </li>
+                </div>
                 <!-- Login de l'utilisateur -->
                 <div class="right">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
diff --git a/module/template/tools/infocontainer.html b/module/template/tools/infocontainer.html
old mode 100755
new mode 100644
diff --git a/module/template/tools/insert.html b/module/template/tools/insert.html
old mode 100755
new mode 100644
diff --git a/module/template/tools/location.html b/module/template/tools/location.html
old mode 100755
new mode 100644
index 61a41368e0276418c34a60f737c9dc78fad69e3f..a9f3e9bca3288fb5fc5a32a7d83eb4dec5ce8667
--- a/module/template/tools/location.html
+++ b/module/template/tools/location.html
@@ -168,6 +168,22 @@
     </div>
 </li>
 
+<!--Previous history-->
+<li role="presentation">
+    <a class="basic-tools-element pointer" title="Aller à l'étendue précédente"
+       ng-click="ctrl.previousHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset >= ctrl.aLocationHistory.length - 1}">
+        <span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
+    </a>
+</li>
+
+<!--Next history-->
+<li role="presentation">
+    <a class="basic-tools-element pointer" title="Aller à l'étendue suivante"
+       ng-click="ctrl.nextHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset === 0}">
+        <span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>
+    </a>
+</li>
+
 <!-- Modal -->
 <div id="scale-modal" class="modal fade" role="dialog">
     <div class="modal-dialog">
diff --git a/module/template/tools/print.html b/module/template/tools/print.html
old mode 100755
new mode 100644
diff --git a/module/template/tools/select.html b/module/template/tools/select.html
old mode 100755
new mode 100644
diff --git a/module/template/tools/urlexporter.html b/module/template/tools/urlexporter.html
new file mode 100644
index 0000000000000000000000000000000000000000..8219c05115135bb301def37dcd88452878d5a06b
--- /dev/null
+++ b/module/template/tools/urlexporter.html
@@ -0,0 +1,11 @@
+<!--UrlExporter-->
+<div class="row margin-sides-0 margin-10">
+    <div class="col-md-3" ng-show="ctrl.properties.allow_public_connection">
+        <input type="checkbox" ng-model="ctrl.usePublicToken" id="publicAccountCheckbox">
+        <label for="publicAccountCheckbox" class="control-label">Public</label>
+    </div>          
+    <div class="" ng-class="{'col-md-9' : ctrl.properties.allow_public_connection, 'col-md-12': !ctrl.properties.allow_public_connection}">
+        <label for="urlExporterField" class="control-label">URL</label>
+        <input type="text" class="form-control" ng-model="ctrl.urlToExport" id="urlExporterField">
+    </div>
+</div>
\ No newline at end of file
diff --git a/web_service/conf/properties_server.inc b/web_service/conf/properties_server.inc
old mode 100755
new mode 100644
index 67e38fad198a4c2fd649838ddc0f41469a4e949d..5daa05566dab4546372c352ed9b8dba1d965ac3b
--- a/web_service/conf/properties_server.inc
+++ b/web_service/conf/properties_server.inc
@@ -14,4 +14,5 @@ $properties['vmap_log_dir'] = "{$properties['vas_home']}/log/vmap";
 $properties['vmap_map_log_file'] = $properties['vmap_log_dir'] . '/map/' . date($properties["log_period"]) . '/map.log';
 $properties['vmap_geocoders'] = '{"osm":{"title":"OpenStreetMap","url":"https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&limit=[limit]&extratags=1&namedetails=1&polygon_geojson=1&countrycodes=fr&q=[search]","data_field":"data","title_field":"display_name","geojson_field":"geojson","summary_fields":[{"key":"address.country","label":"Pays"},{"key":"address.state","label":"Région"},{"key":"address.postcode","label":"Code postal"},{"key":"extratags.population","label":"Population"}]},"national_adresse":{"title":"Base nationale","url":"https://api-adresse.data.gouv.fr/search/?q=[search]&limit=[limit]","data_field":"data.features","title_field":"properties.label","geojson_field":"geometry","summary_fields":[{"key":"properties.context","label":"Département"},{"key":"properties.city","label":"Ville"},{"key":"properties.postcode","label":"Code postal"}]}}';
 $properties['vmap_default_geocoders'] = 'osm';
+$properties['vmap_history_timer'] = 0;
 ?>
diff --git a/web_service/conf/selected_properties.inc b/web_service/conf/selected_properties.inc
old mode 100755
new mode 100644
index 1de10c2e7f175febd5ce29d638d9fd08c252e42b..51094a4a35be058e5f8ebbbbce0e2d02330c0f6c
--- a/web_service/conf/selected_properties.inc
+++ b/web_service/conf/selected_properties.inc
@@ -18,7 +18,8 @@ $aAdminFields = Array(
     'vmap_geocoders',
     'vmap_default_geocoders',
     'use_proxy_for_tiles',
-    'vmap_export.*'
+    'vmap_export.*',
+    'vmap_history_timer'
 );
 $aUserFields = Array(
     'phantomjs_root_path',
@@ -36,7 +37,8 @@ $aUserFields = Array(
     'vmap_geocoders',
     'vmap_default_geocoders',
     'use_proxy_for_tiles',
-    'vmap_export.*'
+    'vmap_export.*',
+    'vmap_history_timer'
 );
 
 $properties['aAdminFields'] = array_merge($properties['aAdminFields'], $aAdminFields);
diff --git a/web_service/ws/BusinessObject.class.inc b/web_service/ws/BusinessObject.class.inc
old mode 100755
new mode 100644
diff --git a/web_service/ws/BusinessObjects.class.inc b/web_service/ws/BusinessObjects.class.inc
old mode 100644
new mode 100755
index 4ab16f4a001f76972011d6380c98d23dbc380793..413f93e43ebbc728cbc4600f84d2cc8d85d05249
--- a/web_service/ws/BusinessObjects.class.inc
+++ b/web_service/ws/BusinessObjects.class.inc
@@ -786,15 +786,6 @@ class BusinessObjects extends Vmap {
         $bo_id_field = $oBusinessObject->aFields['id_field'];
         $geom_column = $oBusinessObject->aFields['geom_column'];
 
-        $oVitisBase = $this->oConnection->oBd;
-
-        // Connexion à la base de donées
-        if (!empty($bo_database) && $bo_database != $this->oConnection->oBd->base) {
-            $sLogin = $this->oConnection->oBd->login;
-            $sPassword = $this->oConnection->oBd->mdp;
-            $this->oConnection->oBd = new Vm($sLogin, $sPassword, $bo_database, $this->oConnection->oBd->serveur, $this->oConnection->oBd->port, $this->oConnection->oBd->sgbd, $this->oConnection->oBd->sPageEncoding);
-        }
-
         $oForm = new Form($this->aProperties, $this->oConnection);
         $aTableColumns = $oForm->getTableColumns($bo_schema, $bo_table);
 
@@ -836,8 +827,6 @@ class BusinessObjects extends Vmap {
             fclose($formFile);
         }
 
-        $this->oConnection->oBd = $oVitisBase;
-
         return $JSONcontent;
     }
 
diff --git a/web_service/ws/Layers.class.inc b/web_service/ws/Layers.class.inc
old mode 100755
new mode 100644
diff --git a/web_service/ws/Querys.class.inc b/web_service/ws/Querys.class.inc
old mode 100755
new mode 100644
diff --git a/web_service/ws/UserModules.class.inc b/web_service/ws/UserModules.class.inc
old mode 100755
new mode 100644
diff --git a/web_service/ws/UserPrintStyles.class.inc b/web_service/ws/UserPrintStyles.class.inc
old mode 100755
new mode 100644
diff --git a/web_service/ws/UserPrintTemplates.class.inc b/web_service/ws/UserPrintTemplates.class.inc
old mode 100755
new mode 100644
diff --git a/web_service/ws/VexExport.class.inc b/web_service/ws/VexExport.class.inc
old mode 100755
new mode 100644