From 1629e86cd52f9b1cd981da45c7ef98371e73f8a6 Mon Sep 17 00:00:00 2001
From: Armand Bahi <armand.bahi@veremes.com>
Date: Wed, 28 Nov 2018 17:00:10 +0100
Subject: [PATCH] Squashed 'src/module_vmap/' changes from 467dfde..83c6b67
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

83c6b67 Merge commit 'a93f105b814cad44ec1deb72ffc1d192bd2d3720'
1a0869b Merge commit '28ac2839fb933147caffe3294df25cc077e41f09'
409c646 Merge commit 'a77c66ec67579160da021bc5521dbc54b5154855'
749ee86 Merge commit '9ec6a9125359a496524c3105307946a63760da3c'
a93f105 Merge branch 'next_version'
28ac283 Merge branch 'next_version'
a77c66e Merge branch 'next_version'
95760f8 Merge branch 'next_version'
9ec6a91 Merge branch 'next_version'
2f9770d Merge branch 'master'
38a75ca Merge branch 'master'
9281372 Merge branch 'master'
0d5dda2 Merge branch 'master'
78a6c62 Merge branch 'master'
bf88027 Merge branch 'master' into 'app_vmap'
4188d1e Merge module_cadastreV2
17aa49c Merge module_cadastreV2
3112a2e Merge module_cadastreV2
4dabc71 Merge module_cadastreV2
f6ff85d Merge module_cadastreV2
778f28d Merge module_cadastreV2
050f823 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
f7b6381 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
755fd34 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
64e0916 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
a2957b7 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
1044e68 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
7100bf0 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
19df232 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
a1d7358 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
26e216c Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
a86b0f3 Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
041b403 Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
749f5d1 Merge commit '348d59b718cb686ea85648f78376400ae15ccbdb'
fb5f021 Merge commit '348d59b718cb686ea85648f78376400ae15ccbdb'
52b157e Merge commit '4398b26d4ab4082f226a08bea5e3d581bb18e730'
101fad2 Merge branch 'master' into app_vmap
04012fb Remove gitignore
1c5454e Merge branch 'master' into app_vmap
80c027e Merge branch 'app_vmap'
9862a97 Remove gitignore
1e0dea6 Merge branch 'next_version' into 'master'
40e7d46 pull subtree
7e14e88 Ajout propertie intersect_id_com pour utiliser un filtre id_com en plus de l'intersection
68214db Update crontab.txt - Changement nom balise
771a565 Merge branch 'Sebastien-master-patch-58096' into 'master'
940a591 Merge branch 'cherry-pick-4398b26d' into 'next_version'
622dea6 Merge branch 'bug/4-formreader-champs-date-non-pris-en-compte-si-on-met-la-date-du-jour-en-insertion' into 'master'
4398b26 Merge branch 'bug/4-formreader-champs-date-non-pris-en-compte-si-on-met-la-date-du-jour-en-insertion' into 'master'
d17933b Edit datetime picker event
b3b6ec0 Merge branch '1-js-sous-formulaire' into 'master'
41a1553 Load BO Javascript on subforms
4f3da34 Merge branch 'master' into 'next_version'
e3923b1 Merge branch 'feature/impressions_144dpi' into 'master'
38bafaf Increase the WMS symbols size to match resolution
431529f Merge branch 'master' into 'next_version'
3516369 Merge branch 'hotfix/swagger_doc' into 'master'
275422b Make swagger work for dev installs
064924e Mise à jour du fichier de version pour fonctionnait avec la version 11.0 de PostgreSQL
ee4da38 Add gitignore
f53e707 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/sources/vitis
6c984be Add client/vas dependencies
1c340f7 pull subtree
895d7e3 pull subtree
12a22d7 pull subtree
7b55e67 Utilisation de dirname($_SERVER['SCRIPT_FILENAME']) au dlieu de __DIR__
24ea0f3 pull subtree
f4326e8 Squashed 'src/module_vm4ms/' changes from 4d95a3da..af1a2e36
68cd713 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
af1a2e3 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
258a417 Modify symlinks strategy
6acd8ed Modify symlinks strategy
8bb3577 add subtree
4d95a3d add subtree
cbd47c2 Squashed 'src/module_cadastre/' content from commit 0bb9b2fa9
a77b5d1 Squashed 'src/module_cadastre/' content from commit 0bb9b2fa9
32487f9 add subtree
cc0df5e add subtree
16f9769 Merge branch 'master' into next_version
24e0fb6 Merge branch 'master' into next_version
ad32c46 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/sources/module_anc
8158b9a Resolve require problems
373ef42 Change __DIR__ by dirname($_SERVER['SCRIPT_FILENAME'])
e132804 Change __DIR__ by dirname($_SERVER['SCRIPT_FILENAME'])
4321adc Change __DIR__ by dirname($_SERVER['SCRIPT_FILENAME'])
7a1818a add subtree
6c1b3e3 Reset sources
a195a4d Init from SVN
4ad29c4 add subtree
1ac46cd Squashed 'src/closure/' content from commit 622066d
635a2f9 add subtree
7593c38 Squashed 'src/vitis/' content from commit 01d199c
b487cd6 Update from SVN
266e19a Initial commit
3adab3a gitignore
4f506db add gitignore
e678ee1 add gitignore
b55c5e8 add gitignore
01d199c Update from SVN
7780fca Update from SVN
8ac7a8b Update from SVN
df3f8eb Update from SVN
21f8928 gitignore
1d1dcfc gitignore
caaa168 gitignore
5674ba2 fixed untracked files
bc1486d fixed untracked files
80e8527 fixed untracked files
be58244 fixed untracked files
68af99b add subtree
28140b9 add subtree
0b81257 add subtree
ce1c22a add subtree
355b5f8 Update from SVN
ddd89b9 Update from SVN
4e05585 Update from SVN
1a7d90a Update from SVN
1f0d403 Update from SVN
519580a Update from SVN
7347d06 Update from SVN
015a4e7 Update from SVN
2feba72 Update from SVN
00cb90d Update from SVN
ab8db90 Update dependency.xml
3c167ff Ajout de la dépendance au schema cadastre
9b7aed8 Update dependency.xml
d374201 Update dependency.xml
80ef848 Update dependency.xml
8c49823 Divise les dependances client et vas pour apache
a7b754e Update _install/dependency.xml
0033955 Update dependency.xml
b03d7e5 Update dependency.xml
189e0e6 Update dependency.xml
3bf002c Update dependency.xml
2c489f9 Update dependency.xml
b05764f Update dependency.xml
54d83af Update dependency.xml
7743bd8 Update dependency.xml
ecf80b3 Update dependency.xml
700adff Change dependencies model
598189b Change dependencies model
87b86b4 Change dependencies model
ce4f3cc Change dependencies model
832eb3b Change dependencies model
12a17e1 Change dependencies model
a18be2f Chamge dependencies model
449fe8f Modification du titre
e3b4bf8 Update README.md
REVERT: 467dfde Merge branch 'next_version' into next_app_vmap
REVERT: dfc1306 Merge remote-tracking branch 'origin/next_version' into next_version
REVERT: 407a18b Merge branch 'master' into next_version
REVERT: 4be0629 Merge branch 'master' into 'next_version'
REVERT: 00ecdc5 Merge branch 'app_vmap' into 'master'
REVERT: 49b02a0 pull subtree
REVERT: 7755613 Squashed 'src/module_cadastre/' changes from 66dbfede..5883a499
REVERT: e2547f6 pull subtree
REVERT: ec89ac3 Squashed 'src/module_cadastreV2/' changes from 66dbfede..bc664f7f
REVERT: 2b3986a pull subtree
REVERT: 9241261 Squashed 'src/module_anc/' changes from 66dbfede..24e0fb69
REVERT: af78a82 pull subtree
REVERT: 90da177 Squashed 'src/module_vm4ms/' changes from 66dbfede..16f9769a
REVERT: 1336417 pull subtree
REVERT: fcaa437 update colonne version pour accepter les version de plus de 10 caractères
REVERT: 8aa6330 Merge branch 'master' into 'next_version'
REVERT: 0a99f83 Merge remote-tracking branch 'origin/next_version' into next_version
REVERT: 9b18e65 Interface générateur d'URL
REVERT: be845c0 Review Checkbox CSS
REVERT: 67e90d7 Review Checkbox CSS
REVERT: 313b106 Resolve "mode comparaison"
REVERT: c6698d6 Ajout de listes déroulantes au formulaire objet métier
REVERT: e996ab2 Resolve "[Studio] suppressions des différents formulaires"
REVERT: 710bebc Synchronisation
REVERT: bffda11 Prettify code
REVERT: 95289ac Nommage & affichage
REVERT: f0c4c8a Ajout calcul de polygones jointifs en mode update
REVERT: cbd5767 correction syntaxe
REVERT: c3aac3e Limite le calcul des polygones jointifs aux types polygon, multipolygon, geometry, geometrycollection
REVERT: c815ad8 Ajout des fonctions de calcul de polygones jointifs
REVERT: 4063537 Add diff_geometry request
REVERT: c3fbd52 Avoid intersections interface
REVERT: 1a51936 Edit snapping modal title
REVERT: 5762b29 Add right-click to termine drawing
REVERT: b261544 pull subtree
REVERT: 7facefc Merge branch 'master' into next_version
REVERT: 7fbff5c Merge remote-tracking branch 'origin/master'
REVERT: 65d69a4 Remove auto pull/push subtrees
REVERT: 02633d0 Remove auto pull/push subtrees
REVERT: 5a8cfb3 Pull/push_subtrees.sh
REVERT: 2fb6e11 use next_app_vmap branches
REVERT: c64422b Merge branch 'master'
REVERT: 3097ea4 Merge branch 'cherry-pick-08ef8c91' into 'next_version'
REVERT: 1a3e250 Merge branch 'bug/1-cadastre-recherche-attributaire-la-selection-reste-en-memoire-quand-on-filtre-la-liste-des-parcelles' into 'master'
REVERT: 08ef8c9 Merge branch 'bug/1-cadastre-recherche-attributaire-la-selection-reste-en-memoire-quand-on-filtre-la-liste-des-parcelles' into 'master'
REVERT: 731fb56 Merge branch 'bug/1-cadastre-recherche-attributaire-la-selection-reste-en-memoire-quand-on-filtre-la-liste-des-parcelles' into 'master'
REVERT: ef0c46d Bug/1 cadastre recherche attributaire la selection reste en memoire quand on filtre la liste des parcelles
REVERT: 7fd95b0 Replace bootstrapTable getAllSelections by getSelections
REVERT: 173760d Merge branch 'master' into bug/1-cadastre-recherche-attributaire-la-selection-reste-en-memoire-quand-on-filtre-la-liste-des-parcelles
REVERT: 4613f70 link subtrees on branch app_vmap
REVERT: 6a47c43 Rename pull.sh into pull_subtrees.sh
REVERT: 591f4ec pull subtree
REVERT: 77845c6 Squashed 'src/module_vmap/' changes from 3e46450b..fb263937
REVERT: 475f621 pull subtree
REVERT: 4b44e6b Squashed 'src/vitis/' changes from 12a22d70..4398b26d
REVERT: 2b3157a Merge branch 'cherry-pick-fb263937' into 'next_version'
REVERT: 3c58909 Merge branch 'bug/1-probleme-d-affichage-getfeatureinfo-sur-mobile' into 'master'
REVERT: 97cbc15 Merge branch 'master' into 'next_version'
REVERT: 3764327 Merge remote-tracking branch 'origin/master'
REVERT: e058ef8 Resolve grunt links
REVERT: 4f4bf75 Correct grunt problems
REVERT: dca067b Merge branch 'dev_master' into 'master'
REVERT: 837046c Dev master
REVERT: 82a645d Update properties.json
REVERT: 5d57e51 Update conf/properties.json
REVERT: ee905c1 Resolve web services update problem
REVERT: 54bd177 Minify JS after updating files
REVERT: c35cc38 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
REVERT: 6a7cf62 Minify JS after updating files
REVERT: 7b0e04e Minify JS after updating files
REVERT: 479d785 Add install/update files for windows
REVERT: 78a320a pull subtree
REVERT: e2a617e Squashed 'src/module_cadastreV2/' changes from 8158b9a2..895d7e3b
REVERT: 926bff6 Utilisation des utils sans avoir besoin de linxml2
REVERT: 3df5e36 Squashed 'src/module_vmap/' changes from 98047575..3e46450b
REVERT: 0852ad9 pull subtree
REVERT: 9f13187 Utilisation des utils sans avoir besoin de libxml2
REVERT: 1a61e63 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
REVERT: 03a5dfe Update pull/push_subtrees.sh to use the current version of subtrees
REVERT: 51f83a0 Add windows install files
REVERT: 457792c pull subtree
REVERT: 0bf9c2c Squashed 'src/module_cadastre/' changes from a36394b9..1c340f7e
REVERT: b5c65a6 pull subtree
REVERT: 5e944c4 Squashed 'src/vitis/' changes from 7b55e67..12a22d7
REVERT: 85f07d4 Update init_symlinks
REVERT: 896a06b pull subtree
REVERT: e9dfdcb Squashed 'src/module_anc/' changes from 8bb35778..68cd7130
REVERT: 393551e pull subtree
REVERT: 5cd5ab0 Squashed 'src/module_vmap/' changes from e7dabee..9804757
REVERT: 19925d4 pull subtree
REVERT: df41643 Squashed 'src/vitis/' changes from 7a1818a..7b55e67
REVERT: 59e770c pull subtree
REVERT: 77582f1 Update gitignore
REVERT: aa4b71d Remvove web_service from parent
REVERT: 99dab64 Update gitignore
REVERT: 7e0d02d Update Readme
REVERT: 74b02e3 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
REVERT: 05269f9 Modify symlinks strategy
REVERT: 577d765 Modify symlinks strategy
REVERT: 3c521a9 Modify symlinks strategy
REVERT: cf8ebcd Update symlinks strategy
REVERT: b93b890 Modify symlinks strategy
REVERT: 139ee7e Modify symlinks strategy
REVERT: 3427147 Squashed 'src/module_cadastre/' changes from ee26cf16..a36394b9
REVERT: 54df607 pull subtree
REVERT: 3ce44dc Squashed 'src/module_anc/' changes from 4321adc4..8bb35778
REVERT: 1056cb4 pull subtree
REVERT: 278331d pull subtree
REVERT: a0cda92 Squashed 'src/module_vm4ms/' changes from 373ef426..4d95a3da
REVERT: 9d999ac add subtree
REVERT: 2b0c911 Squashed 'src/module_cadastre/' content from commit 0bb9b2fa9
REVERT: e2a23ca add subtree
REVERT: e0e437e Squashed 'src/module_cadastreV2/' content from commit b442386a7
REVERT: 4fa86e7 add subtree
REVERT: 6b7d2e6 Squashed 'src/module_anc/' content from commit 24e0fb694
REVERT: 66dbfed Merge branch 'master' into next_version

git-subtree-dir: src/module_vmap
git-subtree-split: 83c6b6786427a21d3c2595d949c819deb1179302
---
 module/css/vmap.less                          |  20 +++
 ...ration_vitis_configuration_vmapConfig.json |  91 +++++++++++---
 ...ap_business_object_vmap_business_object.js |   5 +
 ..._business_object_vmap_business_object.json |  38 ++++--
 module/javascript/app/vmap/map/mapcompare.js  |  49 +++++++-
 .../app/vmap/mapmanager/layerstree.js         |  48 ++++++++
 .../app/vmap/mapmanager/maplegend.js          |  38 +++++-
 .../app/vmap/mapmanager/mapmanager.js         |  10 +-
 module/javascript/app/vmap/tools/controls.js  |   6 +-
 module/javascript/app/vmap/tools/insert.js    |  20 ++-
 module/javascript/app/vmap/tools/location.js  |  19 ++-
 module/javascript/app/vmap/tools/print.js     | 111 +++++++++--------
 .../app/vmap/tools/select/basicselect.js      |  46 +++++++
 .../app/vmap/tools/select/select.js           |   8 +-
 .../javascript/app/vmap/tools/urlexporter.js  |  50 ++++----
 module/javascript/vitis/script_module.js      |  18 +++
 module/lang/lang-en.json                      |  43 +++++--
 module/lang/lang-fr.json                      |  45 +++++--
 module/template/layers/layertree.html         | 114 +++++++++++++++++-
 module/template/layers/maplegend.html         |  39 +++++-
 module/template/tools/basicselect.html        |   2 +-
 module/template/tools/basictools.html         |  16 +--
 module/template/tools/location.html           |  32 ++---
 module/template/tools/select.html             |   2 +-
 module/template/tools/urlexporter.html        |  32 ++---
 module/template/vmap.html                     |   2 +-
 web_service/conf/properties.inc               |   2 +
 27 files changed, 711 insertions(+), 195 deletions(-)

diff --git a/module/css/vmap.less b/module/css/vmap.less
index cc42f401..fa7278d2 100644
--- a/module/css/vmap.less
+++ b/module/css/vmap.less
@@ -2438,3 +2438,23 @@ div.vmap-select-scale-alert{
     min-height: 55px;
     padding-top: 15px !important;
 }
+
+.basic-tools-element>span.icon-mirror {
+    font-size: 16px;
+    line-height: 0;
+}
+
+.layerstree-nav {
+    margin-left: 40px;
+}
+
+.layerstree-nav>li>a {
+    padding: 0px 15px;
+    border: 1px solid #8a8a8a !important;
+    color: #333;
+}
+
+.ol-current-projection-compare{
+    bottom: 29px;
+    margin-left: -16%;
+}
diff --git a/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json b/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
index eed719d9..4304e139 100755
--- a/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
+++ b/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
@@ -1,21 +1,46 @@
 {
     "datasources": {
-        "datasource_1": {
+        "datasource_tools": {
             "type": "object",
             "dataType": "text",
             "name": "avaliable_controls",
             "description": "",
             "options": [
-                "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Attribution",
-                "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MousePosition",
-                "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|CurrentProjection",
-                "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapName",
-                "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Scale",
-                "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ScaleLine",
-                "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|OverviewMap",
-                "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Zoom",
-                "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ZoomSlider",
-                "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|RefreshSocket"
+                "FORM_TOOLS_MAP_MANAGER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapManager",
+                "FORM_TOOLS_LOCATION_SEARCH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationSearch",
+                "FORM_TOOLS_LOCATION_HOME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationHome",
+                "FORM_TOOLS_LOCATION_REFRESH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationRefresh",
+                "FORM_TOOLS_LOCATION_MAX_EXTENT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationMaxExtent",
+                "FORM_TOOLS_LOCATION_MY_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationMyPosition",
+                "FORM_TOOLS_LOCATION_XY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationXY",
+                "FORM_TOOLS_LOCATION_PREC_NEXT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationPrecNext",
+                "FORM_TOOLS_URL_GENERATOR_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|URLGenerator",
+                "FORM_TOOLS_MAP_COMPARE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapCompare",
+                "FORM_TOOLS_MESURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Mesure",
+                "FORM_TOOLS_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Select",
+                "FORM_TOOLS_ADVANCED_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|AdvancedSelect",
+                "FORM_TOOLS_INSERT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Insert",
+                "FORM_TOOLS_PRINT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Print",
+                "FORM_TOOLS_CONFIG_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Config",
+                "FORM_TOOLS_USER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|User"
+            ]
+        },
+        "datasource_controls": {
+            "type": "object",
+            "dataType": "text",
+            "name": "avaliable_controls",
+            "description": "",
+            "options": [
+                "FORM_CONTROLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Attribution",
+                "FORM_CONTROLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MousePosition",
+                "FORM_CONTROLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|CurrentProjection",
+                "FORM_CONTROLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapName",
+                "FORM_CONTROLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Scale",
+                "FORM_CONTROLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ScaleLine",
+                "FORM_CONTROLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|OverviewMap",
+                "FORM_CONTROLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Zoom",
+                "FORM_CONTROLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ZoomSlider",
+                "FORM_CONTROLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|RefreshSocket"
             ]
         }
     },
@@ -252,19 +277,53 @@
                 "fields": [
                     {
                         "type": "double_select",
-                        "name": "controls.active_controls",
+                        "name": "controls.active_tools",
                         "label_from": "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
                         "label_to": "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
                         "required": false,
                         "nb_cols": 12,
                         "size": 10,
-                        "id": "Element_0_1_1",
+                        "name_to": "controls.active_tools",
+                        "name_from": "controls.active_tool",
+                        "datasource": {
+                            "datasource_id": "datasource_tools"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "controls.public_active_tools",
+                        "label_from": "FORM_AVALIABLE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "label_to": "FORM_ACTIVE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12,
+                        "size": 10,
+                        "name_to": "controls.public_active_tools",
+                        "name_from": "controls.public_active_tool",
+                        "datasource": {
+                            "datasource_id": "datasource_tools"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "controls.active_controls",
+                        "label_from": "FORM_AVALIABLE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "label_to": "FORM_ACTIVE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12,
+                        "size": 10,
                         "name_to": "controls.active_controls",
                         "name_from": "controls.active_control",
                         "datasource": {
-                            "datasource_id": "datasource_1"
-                        },
-                        "id_from": "Element_0_1_1_from"
+                            "datasource_id": "datasource_controls"
+                        }
                     }
                 ]
             },
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
index 80ce2724..6a1ab146 100644
--- 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
@@ -250,6 +250,11 @@ var oFormScope;
                         oFormValues['id_field']['options'] = aColumnsOptions;
                     }
                 }
+                if (angular.isDefined(oFormValues['sorted_by'])) {
+                    if (angular.isDefined(oFormValues['sorted_by']['options'])) {
+                        oFormValues['sorted_by']['options'] = aColumnsOptions;
+                    }
+                }
                 if (angular.isDefined(oFormValues['geom_column'])) {
                     if (angular.isDefined(oFormValues['geom_column']['options'])) {
                         oFormValues['geom_column']['options'] = aColumnsOptions;
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 17dbe046..e0168f15 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
@@ -280,13 +280,24 @@
             },
             {
                 "fields": [{
-                        "type": "text",
+                        "type": "editable_select",
                         "name": "sorted_by",
                         "label": "FORM_SORTED_BY_DEVELOPMENT_0",
                         "required": false,
-                        "pattern": "",
-                        "nb_cols": 6,
-                        "id": "New_el_9_11_1"
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [{
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormColumns()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
                     }]
             },
             {
@@ -709,13 +720,24 @@
             },
             {
                 "fields": [{
-                        "type": "text",
+                        "type": "editable_select",
                         "name": "sorted_by",
                         "label": "FORM_SORTED_BY_DEVELOPMENT_0",
                         "required": false,
-                        "pattern": "",
-                        "nb_cols": 6,
-                        "id": "New_el_9_11_1"
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [{
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormColumns()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
                     }]
             },
             {
diff --git a/module/javascript/app/vmap/map/mapcompare.js b/module/javascript/app/vmap/map/mapcompare.js
index 4fdf3a75..b3304a3c 100644
--- a/module/javascript/app/vmap/map/mapcompare.js
+++ b/module/javascript/app/vmap/map/mapcompare.js
@@ -86,8 +86,15 @@ nsVmap.MapCompare = function () {
      * @private
      */
     this.vmapTooltip_ = {};
+
     // Ajoute les couches à reprojeter en cas de changement de carte dans layersToTransform_
     this.layersToTransform_ = [];
+
+    // Vide les controls par défaut
+    var controls = this.oOpenLayersMap_.getControls().getArray();
+    for (var i = 0; i < controls.length; i++) {
+        this.oOpenLayersMap_.removeControl(controls[i]);
+    }
 }
 
 /**
@@ -512,8 +519,10 @@ nsVmap.MapCompare.prototype.mapCompareController = function ($scope, $window, $e
             'size': this_.map.getSize(),
             'tileSize': tileSize
         });
+
         // Définit la vue de la carte
         this_.addView(olView_);
+
         // Définit les couches de la carte
         for (var i = 0; i < olLayers_.length; i++) {
             this_.addLayer(olLayers_[i]);
@@ -526,6 +535,12 @@ nsVmap.MapCompare.prototype.mapCompareController = function ($scope, $window, $e
         setTimeout(function () {
             this_.updateCompareScaleMap();
         });
+
+        // Affiche le nom de la carte
+        this_.displayMapName();
+
+        // Affiche le nom de la carte
+        this_.displayMapProj();
     })
 
     /**
@@ -577,7 +592,7 @@ nsVmap.MapCompare.prototype.mapCompareController.prototype.synchronizeMap = func
     var this_ = this;
 
     // Synchro Échelle
-    oVmap.getMap().getOLMap().getTargetElement().addEventListener('mouseenter', function(){
+    this_.map.getTargetElement().addEventListener('mouseleave', function(){
         oVmap.getMap().getOLMap().on("moveend", this_.updateCompareScaleMap, this_);
         this_.map.un("moveend", this_.updateScaleMap, this_);
     });
@@ -758,3 +773,35 @@ nsVmap.MapCompare.prototype.mapCompareController.prototype.addView = function (o
         });
     }
 };
+
+/**
+ * Display the map name tool
+ */
+nsVmap.MapCompare.prototype.mapCompareController.prototype.displayMapName = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.displayMapName');
+
+    if ($("#map-name-compare").length == 0) {
+        $('#olMapCompare').children().children('.ol-overlaycontainer-stopevent').append('<div class="ol-map-name ol-map-name-compare ol-unselectable"><span id="map-name-compare" class="ol-control"></span></div>');
+    }
+
+    var vMapCatalog = oVmap.getMapManager().getMapCatalog();
+    for (var i = 0; i < vMapCatalog['maps'].length; i++) {
+        if (vMapCatalog['maps'][i]['compare'] === true) {
+            var currentMapName = vMapCatalog['maps'][i]['name'];
+        }
+    }
+    $("#map-name-compare").html(currentMapName);
+}
+
+/**
+ * Display the map proj tool
+ */
+nsVmap.MapCompare.prototype.mapCompareController.prototype.displayMapProj = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.displayMapProj');
+
+    if ($("#current-projection-compare").length == 0) {
+        $('#olMapCompare').children().children('.ol-overlaycontainer-stopevent').append('<div class="ol-current-projection ol-unselectable ol-current-projection-compare"><span id="current-projection-compare" class="ol-control"></span></div>');
+    }
+
+    $("#current-projection-compare").html(oVmap['oProjections'][oVmap.getMapCompare().getOLMap().getView().getProjection().getCode()]);
+}
diff --git a/module/javascript/app/vmap/mapmanager/layerstree.js b/module/javascript/app/vmap/mapmanager/layerstree.js
index 673cb4e0..2a5fe743 100644
--- a/module/javascript/app/vmap/mapmanager/layerstree.js
+++ b/module/javascript/app/vmap/mapmanager/layerstree.js
@@ -117,6 +117,19 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
      */
     $scope['tree'] = oVmap.getMapManager().getLayersTree();
 
+
+    /**
+     * The map compare layersTree
+     * @type {object}
+     */
+    $scope['compareTree'] = {};
+
+
+    /**
+     * The active map
+     */
+    $scope['activeMap'] = 1;
+
     /**
      * The current properties
      */
@@ -194,6 +207,17 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
 };
 oVmap.module.controller('AppLayertreeController', nsVmap.nsMapManager.LayersTree.prototype.LayertreeController);
 
+/**
+ * Resize the layertools
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.resize = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.resize');
+
+    setTimeout(function () {
+        oVmap.resizeLayerTools();
+    });
+}
+
 /**
  * Set a layer visible or not
  * @param {ol.layer.Base} olLayer
@@ -270,6 +294,8 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setGroupV
     }
 
     this.memoriseGroupVisible(node);
+
+    oVmap['scope'].$broadcast('layersChanged');
 };
 
 /**
@@ -350,6 +376,14 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.reloadTre
     // relance le chargement des couches avec le nouvel arbre
     this.loadTree();
 
+    // Arbre pour la comparaison
+    if(this.scope_["$root"]["compare_enabled"]){
+        var oCompareTree = jQuery.extend(true, {}, oVmap.getMapManager().getCompareLayersTree());
+        this.scope_['compareTree'] = oCompareTree;
+    } else {
+        this.scope_['compareTree'] = {};
+    }
+
     oVmap.resizeLayerTools(false);
 };
 
@@ -638,6 +672,20 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.closeLaye
             }
         }
     }
+
+    if (goog.isDefAndNotNull(this.scope_['compareTree'])) {
+        if (goog.isArray(this.scope_['compareTree']['children'])) {
+            for (var i = 0; i < this.scope_['compareTree']['children'].length; i++) {
+                if (goog.isDefAndNotNull(this.scope_['compareTree']['children'][i]['children'])) {
+                    for (var ii = 0; ii < this.scope_['compareTree']['children'][i]['children'].length; ii++) {
+                        if (goog.isDefAndNotNull(this.scope_['compareTree']['children'][i]['children'][ii]['olLayer'])) {
+                            this.scope_['compareTree']['children'][i]['children'][ii]['displayedMenu'] = false;
+                        }
+                    }
+                }
+            }
+        }
+    }
 };
 
 /**
diff --git a/module/javascript/app/vmap/mapmanager/maplegend.js b/module/javascript/app/vmap/mapmanager/maplegend.js
index 48d2e54e..c6759068 100644
--- a/module/javascript/app/vmap/mapmanager/maplegend.js
+++ b/module/javascript/app/vmap/mapmanager/maplegend.js
@@ -136,7 +136,17 @@ nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope)
     /**
      * @private
      */
-    this['aUrls'] = [];
+    this['oUrls'] = {};
+
+    /**
+     * @private
+     */
+    this['oCompareUrls'] = {};
+
+    /**
+     * The active map
+     */
+    $scope['activeMap'] = 1;
 
     /**
      * Contains the events stocked by listenLayers()
@@ -158,6 +168,18 @@ nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope)
     });
 };
 
+
+/**
+ * Resize the layertools
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.resize = function () {
+    oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.resize');
+
+    setTimeout(function () {
+        oVmap.resizeLayerTools();
+    });
+}
+
 /**
  * Loads the legend
  * @export
@@ -165,18 +187,26 @@ nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope)
 nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.loadLegend = function () {
     oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.loadLegend');
 
-    this['oUrls'] = this.getLegendUrls();
+    this['oUrls'] = this.getLegendUrls(oVmap.getMap().getOLMap());
     this.downloadLegendImgs(this['oUrls']);
+
+    if(this.$scope_["$root"]["compare_enabled"]){
+        this['oCompareUrls'] = this.getLegendUrls(oVmap.getMapCompare().getOLMap());
+        this.downloadLegendImgs(this['oCompareUrls']);
+    } else {
+        this['oCompareUrls'] = {};
+    }
 };
 
 /**
  * Get the legend URLs
+ * @param {object} olMap
  * @returns {object}
  */
-nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.getLegendUrls = function () {
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.getLegendUrls = function (olMap) {
     oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.getLegendUrls');
 
-    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+    var aLayers = olMap.getLayers().getArray();
     var oUrls = {};
 
     // Récupération des URL WMS
diff --git a/module/javascript/app/vmap/mapmanager/mapmanager.js b/module/javascript/app/vmap/mapmanager/mapmanager.js
index 13114d60..d42d368d 100644
--- a/module/javascript/app/vmap/mapmanager/mapmanager.js
+++ b/module/javascript/app/vmap/mapmanager/mapmanager.js
@@ -314,7 +314,7 @@ nsVmap.nsMapManager.MapManager.prototype.loadCompareMap = function (element) {
     var this_ = this;
     this_.getAjaxLayersTree(sUrl, function(oTree){
 
-        oVmap.log("oTree: ", oTree);
+        oVmap.log("oCompareTree: ", oTree);
 
         // Change la variable oLayersTree
         this_.setCompareLayersTree(oTree);
@@ -927,7 +927,7 @@ nsVmap.nsMapManager.MapManager.prototype.ajaxGetMapCatalog = function (sUrl) {
  * @return {object<LayersTree>}
  */
 nsVmap.nsMapManager.MapManager.prototype.getAjaxLayersTree = function (sUrl, callback) {
-    var LayersTree;
+    var oLayersTree;
 
     ajaxRequest({
         'method': 'GET',
@@ -937,11 +937,9 @@ nsVmap.nsMapManager.MapManager.prototype.getAjaxLayersTree = function (sUrl, cal
         'success': function (response) {
             var data = JSON.parse(response['data']);
             if (goog.isDef(data['mapjsons'])) {
-                LayersTree = data['mapjsons'][0];
+                oLayersTree = data['mapjsons'][0];
             }
-
-            oVmap.log(LayersTree);
-            callback.call(this, LayersTree);
+            callback.call(this, oLayersTree);
         }
     });
 };
diff --git a/module/javascript/app/vmap/tools/controls.js b/module/javascript/app/vmap/tools/controls.js
index 67b20e2e..6fee41a7 100755
--- a/module/javascript/app/vmap/tools/controls.js
+++ b/module/javascript/app/vmap/tools/controls.js
@@ -31,7 +31,7 @@ goog.require('ol.format.TopoJSON');
 /**
  * @classdesc
  * Class {@link nsVmap.nsToolsManager.Controls}: Add the controls defined in data/tools.json,
- * available : Attribution, FullScreen, MousePosition, OverviewMap, Rotate, ScaleLine, Zoom, ZoomSlider, 
+ * available : Attribution, FullScreen, MousePosition, OverviewMap, Rotate, ScaleLine, Zoom, ZoomSlider,
  * ZoomToExtent, CurrentProjection, DragAndDrop (GPX,GeoJSON,IGC,KML,TopoJSON)
  * @param {array} aControls Controls to set
  * @constructor
@@ -273,7 +273,7 @@ nsVmap.nsToolsManager.Controls.prototype.addControl = function (control) {
 /**
  * Toggle a control to the ol map
  * @param {string} control Control to toggle
- * @param {boolean} bActive 
+ * @param {boolean} bActive
  * @export
  */
 nsVmap.nsToolsManager.Controls.prototype.setToolActive = function (control, bActive) {
@@ -426,4 +426,4 @@ nsVmap.nsToolsManager.Controls.prototype.getOverviewMap = function () {
 
 // Définit la directive et le controller
 oVmap.module.directive('appControls', nsVmap.nsToolsManager.Controls.prototype.controlsDirective);
-oVmap.module.controller('AppControlsController', nsVmap.nsToolsManager.Controls.prototype.controlsController);
\ No newline at end of file
+oVmap.module.controller('AppControlsController', nsVmap.nsToolsManager.Controls.prototype.controlsController);
diff --git a/module/javascript/app/vmap/tools/insert.js b/module/javascript/app/vmap/tools/insert.js
index 456136bc..ce07b268 100644
--- a/module/javascript/app/vmap/tools/insert.js
+++ b/module/javascript/app/vmap/tools/insert.js
@@ -317,6 +317,19 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
     // Supprime du trou de la feature (si il existe) feature lors de la sélection sur l'interaction this.deleteHole_
     this.deleteHole_.on('select', this.deleteHole, this);
 
+    // Évite les superpositions à l'édition
+    this.modify_.on('modifyend', function (evt) {
+
+        // Récupère la feature ajoutée
+        var aFeatures = evt.features.getArray();
+
+        var j = 0;
+        for (var i = 0; i < aFeatures.length; i++) {
+            // Évite les superpositions avec les autres couches si besoin
+            this_.avoidSuperpositions(aFeatures[i]);
+        }
+    });
+
     // Lance updateInsertObjectFeature lors de chaque changement sur this.oOverlayFeatures_
     // si il n'y a pas eut de changements pendant 500ms
     var iTmpChanges = 0;
@@ -324,6 +337,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
 
         // Retire les anciennes features si on est pas en mode multi
         var sGeomType = $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') {
@@ -1244,7 +1258,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.setDiffGeo
             this_.setDiffGeom_(aSuperpositionBos, olFeature, opt_options);
         }
     }, function(err){
-        console.error('Cannot get the diff geom: ', err)
+        console.error('Cannot get the diff geom: ', err);
     });
 
 }
@@ -1282,11 +1296,11 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getDiffGeo
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0])) {
-                deferred.reject('response.data[0] not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0]['diff_geom'])) {
-                deferred.reject('response.data[0].diff_geom not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             deferred.resolve(response['data'][0]['diff_geom']);
diff --git a/module/javascript/app/vmap/tools/location.js b/module/javascript/app/vmap/tools/location.js
index 4cd96440..415bd9cb 100644
--- a/module/javascript/app/vmap/tools/location.js
+++ b/module/javascript/app/vmap/tools/location.js
@@ -197,12 +197,25 @@ nsVmap.nsToolsManager.Location.prototype.locationController = function ($scope,
 
 	        fHistoryDelayHandler = $timeout(function () {
 	        	if(this_['iHistoryOffset'] === 0){
-	        		this_["aLocationHistory"].push({
+
+                    var oNewLocation = {
 		        		center: this_.map_.getView().getCenter(),
 		        		zoom: this_.map_.getView().getZoom()
-		    		});
+		    		}
+
+                    var oLastLocation = this_['aLocationHistory'][this_['aLocationHistory'].length - 1];
+
+                    if (this_['aLocationHistory'].length > 0) {
+                        if (oNewLocation.zoom === oLastLocation.zoom &&
+                            oNewLocation.center[0] === oLastLocation.center[0] &&
+                            oNewLocation.center[1] === oLastLocation.center[1]) {
+                            return 0;
+                        }
+                    }
+
+	        		this_["aLocationHistory"].push(oNewLocation);
 	        	} else {
-	        		// splice 
+	        		// splice
 	        		var iHistoryPosition = this_['aLocationHistory'].length - (this_['iHistoryOffset']);
 	        		this_["aLocationHistory"].splice(iHistoryPosition, this_['iHistoryOffset'], {
 		        		center: this_.map_.getView().getCenter(),
diff --git a/module/javascript/app/vmap/tools/print.js b/module/javascript/app/vmap/tools/print.js
index efc99e6a..f2d041ca 100644
--- a/module/javascript/app/vmap/tools/print.js
+++ b/module/javascript/app/vmap/tools/print.js
@@ -161,11 +161,23 @@ nsVmap.nsToolsManager.Print.prototype.printController = function ($timeout, $com
     this.template_;
 
     /**
-     * Size of the printZone
+     * Size of the map printZone
      * @private
      */
     this.printedMapSize_;
 
+    /**
+     * Size of the compare map printZone
+     * @private
+     */
+    this.printedCompareMapSize_;
+
+    /**
+     * Size of the overview map printZone
+     * @private
+     */
+    this.printedOverviewMapSize_;
+
     /**
      * this.printedMapSize_ resize coeff
      * @private
@@ -363,10 +375,10 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelParmas2
     oVmap.log('nsVmap.nsToolsManager.Print.printController.loadModelParmas2');
 
     // Récupère la taille de la carte this.printedMapSize_ ainsi que le coefficient this.resizeCoeff_
-    oPrintMapSize = this.getPrintedMapSize(this.template_);
+    this.printedMapSize_ = this.getPrintedMapSize(this.template_, '#map1', '#map_image');
+    this.printedOverviewMapSize_ = this.getPrintedMapSize(this.template_, '#map1', '#map_overview');
 
-    this.printedMapSize_ = oPrintMapSize.printedMapSize;
-    this.resizeCoeff_ = oPrintMapSize.resizeCoeff;
+    this.resizeCoeff_ = this.printedMapSize_.resizeCoeff;
 
     // Pré-rempli le champ "Résolution"
     this['resolution'] = this.resizeCoeff_;
@@ -375,26 +387,29 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelParmas2
     this['currentScale'] = oVmap.getMap().getPrettyScale(oVmap.getMap().getScale() / this.resizeCoeff_);
 
     // Dessine un carré d'impression à chaque mouvement de la carte
-    this.printBox_.setSize(this.printedMapSize_);
+    this.printBox_.setSize(this.printedMapSize_.printedMapSize);
     this.printBox_.show();
 
     if(this.$scope_["$root"]["compare_enabled"]){
-        this.oComparePrintMapSize = this.getPrintedMapSize(this.template_,"#map1Compare","#map_image_compare");
-        if(this.oComparePrintMapSize !== 0){
+        this.printedCompareMapSize_ = this.getPrintedMapSize(this.template_, "#map1Compare", "#map_image_compare");
+
+        if(this.printedCompareMapSize_ !== 0){
             // Pré-rempli le champ "Résolution"
-            this['resolutionCompare'] = this.oComparePrintMapSize.resizeCoeff;
+            this['resolutionCompare'] = this.printedCompareMapSize_.resizeCoeff;
 
             // Ajuste l'échelle avec le niveau de détail
-            this['currentScaleCompare'] = oVmap.getMapCompare().getPrettyScale(oVmap.getMapCompare().getScale() / this.oComparePrintMapSize.resizeCoeff);
+            this['currentScaleCompare'] = oVmap.getMapCompare().getPrettyScale(oVmap.getMapCompare().getScale() / this.printedCompareMapSize_.resizeCoeff);
 
             // Dessine un carré d'impression à chaque mouvement de la carte
-            this.printBoxCompare_.setSize(this.oComparePrintMapSize.printedMapSize);
+            this.printBoxCompare_.setSize(this.printedCompareMapSize_.printedMapSize);
             this.printBoxCompare_.show();
         } else {
             this.printBoxCompare_.hide();
         }
     }
 
+    // Supprime le template du body de Vmap
+    $(this.template_).remove();
 };
 
 /**
@@ -420,11 +435,18 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.setTemplate = fu
         });
     }
 
+    this.$scope_['compare_mode'] = this.$scope_["$root"]["compare_enabled"];
+
     if (goog.isDefAndNotNull(oModel['definition'])) {
         var template = document.createElement("div");
         template.innerHTML = oModel['definition'];
+
+        this.$compile_(template)(this.$scope_);
         this_.template_ = template;
-        callback.call(this, [template]);
+
+        setTimeout(function () {
+            callback.call(this_, [template]);
+        });
     }
 };
 
@@ -450,6 +472,8 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getPrintedMapSiz
         return 0;
     }
 
+    oPrintScope = angular.element($(template).find(sPrintId)).scope();
+
     // Ajoute temporairement le template au body de Vmap
     $(template).addClass('print_template');
     $('body').append(template);
@@ -457,9 +481,6 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getPrintedMapSiz
     var mapHeight = imageDiv.height();
     var mapWidth = imageDiv.width();
 
-    // Supprime le template du body de Vmap
-    $(template).remove();
-
     // Vérifie si la taille de la carte est suppérieur à la taille de l'écran
     var resizeCoeff = 1;
     var tmpWidth = angular.copy(mapWidth);
@@ -472,6 +493,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getPrintedMapSiz
 
     return {
         printedMapSize: [mapWidth, mapHeight],
+        realSize: [imageDiv.width(), imageDiv.height()],
         resizeCoeff: resizeCoeff
     }
 };
@@ -575,7 +597,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.prepareAndLaunch
 
     // récupération des infos pour la carte de comparaison si le mode comparaison est actif
     if(this.$scope_['$root']["compare_enabled"]){
-        if(this.oComparePrintMapSize !== 0){
+        if(this.printedCompareMapSize_ !== 0){
             // Enregistre l'échelle actuelle
             this.currentScaleCompare_ = oVmap.getMapCompare().getScale({
                 'pretty': true
@@ -635,14 +657,22 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     var printStyleId = opt_options.printStyleId;
 
     // Set includesJSON
-    var includesJson = JSON.stringify([{
+    var aIncludes = [{
             'target': '#map_legend',
-            'html': this_.getLegendTemplate()
-        }]);
+            'html': this_.getLegendTemplate('#maplegend')
+        }];
+    if(this.$scope_["$root"]["compare_enabled"]){
+        aIncludes.push({
+            'target': '#map_legend_compare',
+            'html': this_.getLegendTemplate('#compare_maplegend')
+        });
+    }
+    var includesJson = JSON.stringify(aIncludes);
 
     // Set scope
     var oPrintScope = goog.isDefAndNotNull(opt_options.scope) ? opt_options.scope : {};
     oPrintScope['date'] = goog.isDefAndNotNull(oPrintScope['date']) ? oPrintScope['date'] : today;
+    oPrintScope['compare_mode'] = this.$scope_["$root"]["compare_enabled"] === true ? true : false;
     var sScope = JSON.stringify(oPrintScope);
 
     // Ouvre la fenêtre d'impression
@@ -687,12 +717,9 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
             var sFormat = response['data']['data'][0]['rt_format_id'];
             var sOrientation = response['data']['data'][0]['rt_orientation_id'];
 
-            var template = document.createElement("div");
-            template.innerHTML = response['data']['data'][0]['definition'];
-
-            var mapImageSize = this_.getTemplateTargetSize(template, '#map_image');
-            var mapImageSizeCompare = this_.getTemplateTargetSize(template, '#map_image_compare');
-            var overviewSize = this_.getTemplateTargetSize(template, '#map_overview');
+            var mapImageSize = this_.printedMapSize_.realSize;
+            var mapImageSizeCompare = this_.printedCompareMapSize_.realSize;
+            var overviewSize = this_.printedOverviewMapSize_.realSize;
 
             var oJsonDefOptions = {
                 mapId: opt_options.mapId,
@@ -780,6 +807,10 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     return 1;
 };
 
+/**
+ * Get the maps JSON defs
+ * @param  {object} opt_options
+ */
 nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef = function (opt_options) {
     oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef');
 
@@ -899,40 +930,14 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef =
     return mapsJson;
 }
 
-/**
- * Get the size of a target in a template
- * @param {string} template
- * @param {string} target
- * @returns {Array<Number>|undefined}
- */
-nsVmap.nsToolsManager.Print.prototype.printController.prototype.getTemplateTargetSize = function (template, target) {
-
-    var targetDiv = $(template).find(target);
-
-    // Vérifie la présence de '#map_image'
-    if (!goog.isDef(targetDiv.get(0))) {
-        oVmap.log('Aucune balise ' + target + ' trouvée dans le template');
-        return undefined;
-    }
-
-    $('body').append(template);
-
-    var targetHeight = targetDiv.height();
-    var targetWidth = targetDiv.width();
-
-    // Supprime le template du body de Vmap
-    $(template).remove();
-
-    return [targetWidth, targetHeight];
-};
-
 /**
  * Get the html definition of the template with base64 images
+ * @param  {string} sTarget
  * @returns {String}
  */
-nsVmap.nsToolsManager.Print.prototype.printController.prototype.getLegendTemplate = function () {
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getLegendTemplate = function (sTarget) {
 
-    var template = $('#maplegend').clone();
+    var template = $(sTarget).clone();
 
     // Transforme les images en base64
     template.find('img').each(function (index) {
diff --git a/module/javascript/app/vmap/tools/select/basicselect.js b/module/javascript/app/vmap/tools/select/basicselect.js
index f8d0af3c..200baf00 100755
--- a/module/javascript/app/vmap/tools/select/basicselect.js
+++ b/module/javascript/app/vmap/tools/select/basicselect.js
@@ -542,6 +542,7 @@ nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.repl
 nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displaySelectionPopup = function (aSelection, olPoint) {
     oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displaySelectionPopup');
 
+    var this_ = this;
     var scope = this.$scope_;
 
     for (var i = 0; i < aSelection.length; i++) {
@@ -659,6 +660,51 @@ nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.disp
                 }
             });
         }
+
+        aSelection[i]['mapPopup'].addAction({
+            'content': '<span class="icon-link_url"></span> Lien vers cet objet' ,
+            'event': angular.bind(this, function(i){
+                scope.$apply(function () {
+                    // generate url for this object;
+                    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 += "?mode_id=vmap&";
+
+                    var oMapCatalog = oVmap.getMapManager().getMapCatalog();
+                    var iMapId = oMapCatalog["maps"][oMapCatalog["usedMap"]]["map_id"];
+
+                    sUrl += "map_id=" + iMapId + "&";
+                    sUrl += "bo_id=" + aSelection[i]["bo_type"] + "&";
+                    sUrl += "ids=" + aSelection[i]["bo_id_value"];
+
+                    //copy url to clipboard
+                    var textArea = document.createElement("textarea");
+                    textArea.value = sUrl;
+                    document.body.appendChild(textArea);
+                    textArea.focus();
+                    textArea.select();
+
+                    try {
+                        var successful = document.execCommand('copy');
+                        if (successful){
+                            $.notify('L\'URL d\'accés à cette objet a été copié dans votre presse-papier : \n' + sUrl, 'success');
+                        } else {
+                            $.notify('L\'URL d\'accés à cette objet n\'a pas pu être copié dans votre presse-papier : \n' + sUrl, 'error');
+                        }
+                    } catch (err) {
+                        $.notify('L\'URL d\'accés à cette objet n\'a pas pu être copié dans votre presse-papier : \n' + sUrl, 'error');
+                        console.error('Fallback: Oops, unable to copy', err);
+                    }
+                    document.body.removeChild(textArea);
+                });
+            }, i)
+        });
     }
 
     // Ajoute les résultats
diff --git a/module/javascript/app/vmap/tools/select/select.js b/module/javascript/app/vmap/tools/select/select.js
index 9c89bc22..0944cee5 100755
--- a/module/javascript/app/vmap/tools/select/select.js
+++ b/module/javascript/app/vmap/tools/select/select.js
@@ -539,13 +539,14 @@ nsVmap.nsToolsManager.Select.prototype.selectController = function ($scope, $tim
         // Récupère la feature ajoutée
         var aFeatures = evt.features.getArray();
 
-        // Évite les superpositions avec les autres couches si besoin
         var j = 0;
         for (var i = 0; i < aFeatures.length; i++) {
+            // Évite les superpositions avec les autres couches si besoin
             this_.avoidSuperpositions(aFeatures[i]).then(function(){
                 j++;
                 if (!j < aFeatures.length) {
                     setTimeout(function () {
+                        // Enregistre les changements
                         this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
                     });
                 }
@@ -556,6 +557,7 @@ nsVmap.nsToolsManager.Select.prototype.selectController = function ($scope, $tim
         setTimeout(function () {
             if (j === 0) {
                 console.error('avoidSuperpositions never sents callback');
+                // Enregistre les changements
                 this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
             }
         }, 3000);
@@ -2332,11 +2334,11 @@ nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getDiffGeom_ =
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0])) {
-                deferred.reject('response.data[0] not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0]['diff_geom'])) {
-                deferred.reject('response.data[0].diff_geom not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             deferred.resolve(response['data'][0]['diff_geom']);
diff --git a/module/javascript/app/vmap/tools/urlexporter.js b/module/javascript/app/vmap/tools/urlexporter.js
index d89684f2..d531827e 100644
--- a/module/javascript/app/vmap/tools/urlexporter.js
+++ b/module/javascript/app/vmap/tools/urlexporter.js
@@ -68,35 +68,38 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController = function ($s
     /**
      * @type {string}
      */
-    this["urlToExport"] = "";
+    this["privateExportUrl"] = "";
+
     /**
-     * @type {boolean}
+     * @type {string}
      */
-    this["usePublicToken"] = false;
-
-    this["urlConstructor"]();
+    this["publicExportUrl"] = "";
 
     // recalcule l'url quand on change de carte
     oVmap['scope'].$on('mapChanged', function () {
-        this_["urlConstructor"]();
+        this_["privateExportUrl"] = this_.getExportUrl();
+        this_["publicExportUrl"] = this_.getExportUrl(true);
     });
 
-    $scope.$watch("ctrl.usePublicToken", function(){
-        this_["urlConstructor"]();
-    })
-
+    // recalcule l'url quand on bouge la  carte
     oVmap.getMap().getOLMap().on("moveend", function(event){
-        this_["urlConstructor"]();
+        this_["privateExportUrl"] = this_.getExportUrl();
+        this_["publicExportUrl"] = this_.getExportUrl(true);
     });
+
+    // Recalcule l'URL
+    this_["privateExportUrl"] = this_.getExportUrl();
+    this_["publicExportUrl"] = this_.getExportUrl(true);
 };
 
 /**
- * Display the user form in display mode
- * @returns {undefined}
+ * Generates and return the export URL
+ * @param  {boolean} bPublic
+ * @return {string}
  * @export
  */
-nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlConstructor = function () {
-    oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.urlConstructor");
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.getExportUrl = function (bPublic) {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.getExportUrl");
 
     var sUrl = this['properties']['web_server_name'] + "/" + this['properties']['application'];
 
@@ -106,7 +109,7 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlC
         }
     }
 
-    sUrl += "?";
+    sUrl += "?mode_id=vmap&";
 
     var oMapCatalog = oVmap.getMapManager().getMapCatalog();
     var iMapId = oMapCatalog["maps"][oMapCatalog["usedMap"]]["map_id"];
@@ -114,7 +117,7 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlC
     sUrl += "map_id=" + iMapId;
 
     // si public add token
-    if (this["usePublicToken"]){
+    if (bPublic === true){
         sUrl += "&token=" + this['properties']['public_token'];
     }
 
@@ -122,20 +125,23 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlC
     var sExtent = oVmap.getMap().getOLMap().getView().calculateExtent(oVmap.getMap().getOLMap().getSize()).join("|");
     sUrl += "&extent=" + encodeURI(sExtent);
 
-    this["urlToExport"] = sUrl;
+    return sUrl;
 };
 
-
 /**
  * Copy the generated URL on the clipboard
- *
+ * @param  {boolean} bPublic
  * @export
  */
-nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.copyUrl = function () {
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.copyUrl = function (bPublic) {
     oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.copyUrl");
 
     /* Get the text field */
-    var copyText = document.getElementById("urlExporterField");
+    if (bPublic === true) {
+        var copyText = document.getElementById("publicExportUrlField");
+    } else {
+        var copyText = document.getElementById("privateExportUrlField");
+    }
 
     /* Select the text field */
     copyText.select();
diff --git a/module/javascript/vitis/script_module.js b/module/javascript/vitis/script_module.js
index 00d7bea3..d740803e 100644
--- a/module/javascript/vitis/script_module.js
+++ b/module/javascript/vitis/script_module.js
@@ -3607,4 +3607,22 @@ vitisApp.on('appMainDrtvLoaded', function () {
             "sMessage": "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT"
         });
     };
+
+    /**
+     * Return true/false if the tool is avaliable for this user
+     * @param  {string} sTool
+     * @return {boolean}
+     */
+    angular.element(vitisApp.appMainDrtv).scope()["isVmapToolActive"] = function (sTool) {
+
+        var aTools;
+
+        if (propertiesSrvc['public_user']) {
+            aTools = propertiesSrvc['controls']['public_active_tools'].split('|');
+        } else {
+            aTools = propertiesSrvc['controls']['active_tools'].split('|');
+        }
+
+        return aTools.indexOf(sTool) !== -1 ? true : false;
+    }
 });
diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json
index 29d2d9f9..dfca19f9 100644
--- a/module/lang/lang-en.json
+++ b/module/lang/lang-en.json
@@ -251,19 +251,40 @@
     "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Printserver alias",
     "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Veremap API",
     "FORM_PROXY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Proxy",
+    "FORM_AVALIABLE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable controls",
+    "FORM_ACTIVE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Actives controls",
     "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable tools",
     "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Active tools",
-    "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attribution",
-    "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mouse position",
-    "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Current projection",
-    "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Map Name",
-    "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Numeric scale",
-    "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Overview map",
-    "FORM_TOOLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotate",
-    "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Scale line",
-    "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
-    "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom slider",
-    "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Refresh auto",
+    "FORM_AVALIABLE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable tools for public user",
+    "FORM_ACTIVE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Active tools for public user",
+    "FORM_CONTROLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attribution",
+    "FORM_CONTROLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mouse position",
+    "FORM_CONTROLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Current projection",
+    "FORM_CONTROLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Map Name",
+    "FORM_CONTROLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Numeric scale",
+    "FORM_CONTROLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Overview map",
+    "FORM_CONTROLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotate",
+    "FORM_CONTROLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Scale line",
+    "FORM_CONTROLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
+    "FORM_CONTROLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom slider",
+    "FORM_CONTROLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Refresh auto",
+    "FORM_TOOLS_MAP_MANAGER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Gestion des cartes",
+    "FORM_TOOLS_LOCATION_SEARCH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation recherche",
+    "FORM_TOOLS_LOCATION_HOME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position initiale",
+    "FORM_TOOLS_LOCATION_REFRESH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement carte",
+    "FORM_TOOLS_LOCATION_MAX_EXTENT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Étendue maximale",
+    "FORM_TOOLS_LOCATION_MY_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position GPS",
+    "FORM_TOOLS_LOCATION_XY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position XY",
+    "FORM_TOOLS_LOCATION_PREC_NEXT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Précédent/suivant",
+    "FORM_TOOLS_URL_GENERATOR_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "URL de la carte en cours",
+    "FORM_TOOLS_MAP_COMPARE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Comparaison de cartes",
+    "FORM_TOOLS_MESURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mesures",
+    "FORM_TOOLS_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation",
+    "FORM_TOOLS_ADVANCED_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation avancée",
+    "FORM_TOOLS_INSERT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Insertion",
+    "FORM_TOOLS_PRINT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Impressions",
+    "FORM_TOOLS_CONFIG_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Configuration contrôles",
+    "FORM_TOOLS_USER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Utilisateur en cours",
     "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Display",
     "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Tools",
     "TITLE_CONTROLS_KEEPLOADED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Keep tiles loaded when autorefreshing",
diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json
index 82fca25d..a1b1a7bb 100644
--- a/module/lang/lang-fr.json
+++ b/module/lang/lang-fr.json
@@ -251,19 +251,40 @@
     "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Alias pintserver",
     "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "API Veremap",
     "FORM_PROXY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Proxy",
+    "FORM_AVALIABLE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Contrôles disponibles",
+    "FORM_ACTIVE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Contrôles actifs",
     "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils disponibles",
-    "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs par défaut",
-    "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attributions",
-    "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position de la souris",
-    "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Projection en cours",
-    "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nom de la carte",
-    "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle numérique",
-    "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle graphique",
-    "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Carte de supervision",
-    "FORM_TOOLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotation",
-    "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
-    "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Slider de zoom",
-    "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement auto",
+    "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs",
+    "FORM_AVALIABLE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils disponibles pour l'utilisateur public",
+    "FORM_ACTIVE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs pour l'utilisateur public",
+    "FORM_CONTROLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attributions",
+    "FORM_CONTROLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position de la souris",
+    "FORM_CONTROLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Projection en cours",
+    "FORM_CONTROLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nom de la carte",
+    "FORM_CONTROLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle numérique",
+    "FORM_CONTROLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle graphique",
+    "FORM_CONTROLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Carte de supervision",
+    "FORM_CONTROLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotation",
+    "FORM_CONTROLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
+    "FORM_CONTROLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Slider de zoom",
+    "FORM_CONTROLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement auto",
+    "FORM_TOOLS_MAP_MANAGER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Gestion des cartes",
+    "FORM_TOOLS_LOCATION_SEARCH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation recherche",
+    "FORM_TOOLS_LOCATION_HOME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation position initiale",
+    "FORM_TOOLS_LOCATION_REFRESH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement couches",
+    "FORM_TOOLS_LOCATION_MAX_EXTENT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation étendue maximale",
+    "FORM_TOOLS_LOCATION_MY_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation GPS",
+    "FORM_TOOLS_LOCATION_XY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation XY",
+    "FORM_TOOLS_LOCATION_PREC_NEXT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation précédent/suivant",
+    "FORM_TOOLS_URL_GENERATOR_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "URL de la carte en cours",
+    "FORM_TOOLS_MAP_COMPARE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Comparaison de cartes",
+    "FORM_TOOLS_MESURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mesures",
+    "FORM_TOOLS_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation",
+    "FORM_TOOLS_ADVANCED_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation avancée",
+    "FORM_TOOLS_INSERT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Insertion",
+    "FORM_TOOLS_PRINT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Impressions",
+    "FORM_TOOLS_CONFIG_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Configuration contrôles",
+    "FORM_TOOLS_USER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Utilisateur en cours",
     "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Affichage",
     "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils",
     "TITLE_CONTROLS_KEEPLOADED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Garder les tuiles lors d'un rafraichissement automatique",
diff --git a/module/template/layers/layertree.html b/module/template/layers/layertree.html
index 5002135b..3141c44e 100644
--- a/module/template/layers/layertree.html
+++ b/module/template/layers/layertree.html
@@ -12,10 +12,20 @@
 </div>
 
 <div id="layertree" class="layers-tool" collapse="{{ctrl.layerstree_collapsed === true ? 'out' : 'in'}}">
+
+    <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>
+        </li>
+        <li ng-class="{'active' : activeMap == 2}">
+            <a href="#" ng-click="activeMap=2;ctrl.resize()">Carte 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>
     </div>
-    <ul class="tree">
+
+    <ul class="tree" ng-show="activeMap == 1 || !$root.compare_enabled">
         <div ng-repeat="node in tree.children| orderBy : 'name'" ng-if="node.view === undefined">
 
             <!-- Service -->
@@ -140,6 +150,108 @@
             </ul>
         </div>
     </ul>
+
+    <ul class="tree" ng-show="activeMap == 2 && $root.compare_enabled">
+        <div ng-repeat="node in compareTree.children| orderBy : 'name'" ng-if="node.view === undefined">
+
+            <!-- Service -->
+            <div class="layerstree-phather">
+                <div class="tree-father-collapse-btn service-name left" data-toggle="collapse" data-target="#comparetree_element_{{$id}}" onclick="setTimeout(function () {
+                                oVmap.resizeLayerTools(true)
+                            }, 500)" title="{{node.name}}">
+                    {{node.name}}
+                </div>
+                <div class="checkbox checkbox-info inline-checkbox right"
+                     ng-class="{'checkbox_indeterminate': node.visible === null}">
+                    <input id="compare_service_{{$id}}_visible"
+                           ng-init="node.visible = ctrl.isGroupVisible(node)"
+                           ng-model="node.visible"
+                           ng-model-options="{getterSetter: true}"
+                           ng-click="ctrl.setGroupVisible(node)"
+                           type="checkbox"
+                           style="cursor:pointer; position: absolute"
+                           title="Definit si le groupe est visible">
+                    <label for="compare_service_{{$id}}_visible"
+                           style="cursor:pointer"
+                           title="Definit si le groupe est visible"></label>
+                </div>
+            </div>
+
+            <!-- Calque -->
+            <ul id="comparetree_element_{{$id}}" class="collapse layers-tree-ul tree-element" ng-class="{'in': ctrl.layers_collapsed !== true}">
+                <div ng-repeat="layer in node.children">
+                    <li>
+                        <ul class="list-group-item layertree-item auto-height">
+
+                            <!-- Nom du calque -->
+                            <div class="layer-name layer-name-tree" title="{{layer.name}}">{{layer.name}}</div>
+                            <div class="layer-checkboxes">
+                                <button type="button"
+                                        class="btn btn-xs margin-sides-10 hidden"
+                                        ng-click="layer.olLayer.getSource().refreshWithTimestamp()">
+                                    <span class="glyphicon glyphicon-refresh"></span>
+                                </button>
+                                <div type="button" class="btn btn-xs layer-menu-button" ng-click="ctrl.toggleLayerMenu(layer, $event)">
+                                    <span ng-class="{'icon-filter': layer.olLayer.get('is_filtered'), 'icon-format_list_bulleted': !layer.olLayer.get('is_filtered')}"></span>
+                                </div>
+                                <!-- Checkbox visible -->
+                                <div class="checkbox checkbox-info inline-checkbox" style="z-index: 10;">
+                                    <input id="{{layer.$$hashKey}}_compare_visible_order_checkbox"
+                                           type="checkbox"
+                                           style="cursor:pointer; position: absolute"
+                                           title="Definit si le calque est visible"
+                                           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>
+                                </div>
+                            </div>
+                        </ul>
+                    </li>
+                    <div class="dropdown-menu layer-menu" ng-class="{'block': layer.displayedMenu === true}">
+                        <div class="layer-menu-list">
+                            <li ng-if="layer.olLayer.get('is_filtered')" ng-click="ctrl.displayFilterLayerModal(layer.olLayer)">
+                                <a href="#">
+                                    <span class="icon-filter"></span>
+                                    Filtre
+                                </a>
+                            </li>
+                            <li>
+                                <a href="#">
+                                    <div class="row">
+                                        <div class="col-xs-6">
+                                            <span class="icon-star-half"></span>
+                                            Transparence
+                                        </div>
+                                        <div class="col-xs-6">
+                                            <div class="layer-menu-list-slider">
+                                                <input data-app-layer-opacity-slider="" id="compare_slider_layer_form_{{layer.$$hashKey}}" type="text">
+                                            </div>
+                                        </div>
+                                    </div>
+                                </a>
+                            </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 visible -->
+                                    <div class="checkbox checkbox-info sublayer-checkbox inline-checkbox">
+                                        <input id="{{layer.$$hashKey}}_compare_sublayer_{{sublayer}}_visible_checkbox"
+                                               type="checkbox"
+                                               style="cursor:pointer; position: absolute"
+                                               title="Definit si la couche est visible"
+                                               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>
+                                    </div>
+                                </div>
+                            </li>
+                        </div>
+                    </div>
+                </div>
+            </ul>
+        </div>
+    </ul>
 </div>
 
 <!--Modale pour le filtrage-->
diff --git a/module/template/layers/maplegend.html b/module/template/layers/maplegend.html
index a82570aa..4c34eb49 100755
--- a/module/template/layers/maplegend.html
+++ b/module/template/layers/maplegend.html
@@ -1,9 +1,9 @@
 <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" 
+        <div class="list-group-item active pointer maplegend-button-content"
+             title="Légende de la carte"
              collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}"
-             data-target="#maplegendcontainer" 
+             data-target="#maplegendcontainer"
              onclick="oVmap.getMapManager().collapseElement(this)">
             <span class="icon-info list-group-icon"></span>
             <span>Légende</span>
@@ -12,7 +12,15 @@
         </div>
     </div>
     <div id="maplegendcontainer" class="layers-tool legend" collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}">
-        <div id="maplegend" class="tree legend">
+        <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>
+            </li>
+            <li ng-class="{'active' : activeMap == 2}">
+                <a href="#" ng-click="activeMap=2;ctrl.resize()">Carte 2</a>
+            </li>
+        </ul>
+        <div id="maplegend" class="tree legend" ng-show="activeMap == 1 || !$root.compare_enabled">
             <div ng-repeat="(sLayerName, layer) in ctrl.oUrls" class="layer-legend"
                  ng-show="ctrl.areLegendsLoaded(layer)">
                 <div id="legend_father{{$index}}" data-toggle="collapse" data-target="#legend_element_{{$index}}">
@@ -23,7 +31,26 @@
                 <div id="legend_element_{{$index}}" class="collapse in">
                     <ul class="list-group-item auto-height">
                         <div ng-repeat="node in layer"
-                             ng-show="node.legendBlobURL">                            
+                             ng-show="node.legendBlobURL">
+                            <img ng-src="{{node.legendBlobURL}}" class="legend-img" legend-image-node>
+                        </div>
+                    </ul>
+                </div>
+            </div>
+        </div>
+
+        <div id="compare_maplegend" class="tree legend" ng-show="activeMap == 2 && $root.compare_enabled">
+            <div ng-repeat="(sLayerName, layer) in ctrl.oCompareUrls" class="layer-legend"
+                 ng-show="ctrl.areLegendsLoaded(layer)">
+                <div id="compare_legend_father{{$index}}" data-toggle="collapse" data-target="#compere_legend_element_{{$index}}">
+                    <div style="display: inline-block; width:98%">
+                        <div class="legend_father_name" title="{{sLayerName}}">{{sLayerName}}</div>
+                    </div>
+                </div>
+                <div id="compare_legend_element_{{$index}}" class="collapse in">
+                    <ul class="list-group-item auto-height">
+                        <div ng-repeat="node in layer"
+                             ng-show="node.legendBlobURL">
                             <img ng-src="{{node.legendBlobURL}}" class="legend-img" legend-image-node>
                         </div>
                     </ul>
@@ -31,4 +58,4 @@
             </div>
         </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 1f829c66..d0ecff8d 100644
--- a/module/template/tools/basicselect.html
+++ b/module/template/tools/basicselect.html
@@ -1,6 +1,6 @@
 <div id="vmap-basicselect-tool"></div>
 
-<li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+<li role="presentation" style="position: inherit" class="basic-tools-dropdown"  ng-class="{'hidden': !$root.isVmapToolActive('Select')}">
     <a class="basic-tools-element pointer"
        id="basic-tools-dropdown-basicselect-btn"
        ng-show="ctrl.aBusinessObjectsList.length > 0 || (ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0)"
diff --git a/module/template/tools/basictools.html b/module/template/tools/basictools.html
index 03218712..8d42420c 100644
--- a/module/template/tools/basictools.html
+++ b/module/template/tools/basictools.html
@@ -5,12 +5,12 @@
                 <!-- Outils de localisation -->
                 <div app-location app-lang="ctrl.lang" app-map="ctrl.map"></div>
                 <!-- Outil d'export d'url -->
-                <div>
+                <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"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
-                            <span class="fa fa-link" aria-hidden="true"></span>
+                            <span class="icon-link_url" aria-hidden="true"></span>
                         </a>
                         <div app-url-exporter app-lang="ctrl.lang" app-map="ctrl.map"
                              id="basic-tools-dropdown-urlexporter"
@@ -20,7 +20,7 @@
                     </li>
                 </div>
                 <!-- Outil de comparaison -->
-                <div>
+                <div ng-class="{'hidden': !$root.isVmapToolActive('MapCompare')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            id="map-compare-tool-btn"
@@ -36,7 +36,7 @@
                     </li>
                 </div>
                 <!-- Login de l'utilisateur -->
-                <div class="right">
+                <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"
@@ -50,7 +50,7 @@
                     </li>
                 </div>
                 <!-- Contrôles -->
-                <div class="right">
+                <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"
@@ -64,7 +64,7 @@
                     </li>
                 </div>
                 <!-- Impression -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Print')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a id="print-select-btn"
                            class="basic-tools-element pointer"
@@ -79,7 +79,7 @@
                     </li>
                 </div>
                 <!-- Insertion -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Insert')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            id="basic-tools-dropdown-insert-btn"
@@ -96,7 +96,7 @@
                 <!--Outils de sélection-->
                 <div app-select app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction" class="right basic-tools-nav"></div>
                 <!-- Mesure -->
-                <div class="right">
+                <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"
diff --git a/module/template/tools/location.html b/module/template/tools/location.html
index a9f3e9bc..62e46ed3 100644
--- a/module/template/tools/location.html
+++ b/module/template/tools/location.html
@@ -1,16 +1,16 @@
 <!--location search-->
-<li id="location-search-tool" role="presentation">
+<li id="location-search-tool" role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationSearch')}">
     <form ng-submit="ctrl.searchLocation()" id="location-search-form" class="margin-sides-5 from-control">
         <!--Recherche-->
         <input id="location-search-input"
-               type="text" 
+               type="text"
                placeholder="Localiser.."
                ng-model="ctrl.locationSearch"
                ng-click="ctrl.searchLocation()">
         <!--Sélecteur-->
         <select id="location-search-api-select"
                 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>
@@ -26,7 +26,7 @@
         <!--Bandeau du haut-->
         <div style="margin: 10px">
             <label>Résultats de la recherche: </label>
-            <span class="glyphicon glyphicon-remove right pointer margin-sides-10" 
+            <span class="glyphicon glyphicon-remove right pointer margin-sides-10"
                   ng-click="ctrl.removeLocation()"></span>
         </div>
 
@@ -65,12 +65,12 @@
 
         <!-- Géocodeur -->
         <div ng-if="locationServiceType === 'geocoder'" class="location-search-dropdown-content">
-            <div class="location-search-dropdown-result" 
+            <div class="location-search-dropdown-result"
                  ng-repeat="node in ctrl.locationResults">
                 <div class="pointer opacity-hover"
                      ng-click="ctrl.locatePlace(node)">
                     <span>{{node.title}}</span>
-                </div>					
+                </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>
@@ -78,7 +78,7 @@
                 </div>
 
                 <div class="collapse" id="location-search-dropdown-result-infos-{{this['$index']}}">
-                    <div style="padding-bottom: 10px" ng-if="node.summary">	
+                    <div style="padding-bottom: 10px" ng-if="node.summary">
                         <ul>
                             <li ng-repeat="oSummaryElement in node.summary">{{oSummaryElement.label}}: {{oSummaryElement.value}}</li>
                         </ul>
@@ -91,13 +91,13 @@
         <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
-            </button>			
+            </button>
         </div>
     </div>
 </li>
 
 <!--Go home-->
-<li role="presentation">
+<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"
        ng-click="ctrl.goHome()">
@@ -106,7 +106,7 @@
 </li>
 
 <!--Refresh map-->
-<li role="presentation">
+<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"
        ng-click="ctrl.refreshMap()">
@@ -115,7 +115,7 @@
 </li>
 
 <!--Max extent-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationMaxExtent')}">
     <a class="basic-tools-element pointer" title="Centrer la carte à l’étendue maximale"
        ng-click="ctrl.maxExtent()">
         <span class="icon-language" aria-hidden="true"></span>
@@ -123,7 +123,7 @@
 </li>
 
 <!--Geolocate me-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationMyPosition')}">
     <a class="basic-tools-element pointer" title="Centrer la carte sur ma position"
        ng-click="ctrl.geolocateMe()">
         <span class="glyphicon glyphicon-map-marker" aria-hidden="true"></span>
@@ -131,7 +131,7 @@
 </li>
 
 <!--Go to-->
-<li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+<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"
@@ -148,7 +148,7 @@
                 <div class="input-group-sm">
                     <input type="number" class="form-control" placeholder="Y" ng-model="goToY">
                 </div>
-            </div>			
+            </div>
             <div class="col-md-5">
                 <b>Projection:</b>
                 <select class="form-control" ng-model="goToProj">
@@ -169,7 +169,7 @@
 </li>
 
 <!--Previous history-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationPrecNext')}">
     <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>
@@ -177,7 +177,7 @@
 </li>
 
 <!--Next history-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationPrecNext')}">
     <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>
diff --git a/module/template/tools/select.html b/module/template/tools/select.html
index 24ae5ca8..f801d83e 100644
--- a/module/template/tools/select.html
+++ b/module/template/tools/select.html
@@ -2,7 +2,7 @@
 <div id="vmap-select-tool"></div>
 
 <!-- Selection Avancée -->
-<div class="right" ng-if="!$root.is_mobile">
+<div class="right" ng-if="!$root.is_mobile" ng-class="{'hidden': !$root.isVmapToolActive('AdvancedSelect')}">
     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
         <a class="basic-tools-element pointer"
            id="basic-tools-dropdown-select-btn"
diff --git a/module/template/tools/urlexporter.html b/module/template/tools/urlexporter.html
index c10845a6..a1602e30 100644
--- a/module/template/tools/urlexporter.html
+++ b/module/template/tools/urlexporter.html
@@ -2,29 +2,29 @@
 <div class="row margin-sides-0 margin-10">
     <div class="col-md-12">
         <div class="left">
-            <label for="urlExporterField" class="control-label">Lien vers la carte en cours</label>
-        </div>
-        <div class="right" ng-if="ctrl.properties.allow_public_connection">
-            <div class="checkbox checkbox-info checkbox-inline">
-                <input id="publicAccountCheckbox"
-                        type="checkbox"
-                        style="cursor:pointer;"
-                        title=">Activer / Désactiver le mode public"
-                        ng-model="ctrl.usePublicToken">
-                <label for="publicAccountCheckbox"
-                       style="cursor:pointer"
-                       title="Activer / Désactiver le mode public">
-                    Public
-                </label>
-            </div>
+            <label for="privateExportUrlField" class="control-label">Lien vers la carte en cours</label>
         </div>
     </div>
     <div class="col-md-12">
         <div class="input-group">
-            <input type="text" class="form-control" ng-model="ctrl.urlToExport" id="urlExporterField">
+            <span class="input-group-btn">
+                <button type="button" class="btn btn-default" disabled><span class="fa fa-lock"></span></button>
+            </span>
+            <input type="text" class="form-control" ng-model="ctrl.privateExportUrl" id="privateExportUrlField">
             <span class="input-group-btn">
                 <button type="button" class="btn btn-default" ng-click="ctrl.copyUrl()"><span class="icon-copy"></span></button>
             </span>
         </div>
     </div>
+    <div class="col-md-12 margin-10" ng-if="ctrl.properties.allow_public_connection">
+        <div class="input-group">
+            <span class="input-group-btn">
+                <button type="button" class="btn btn-default" disabled><span class="fa fa-unlock"></span></button>
+            </span>
+            <input type="text" class="form-control" ng-model="ctrl.publicExportUrl" id="publicExportUrlField">
+            <span class="input-group-btn">
+                <button type="button" class="btn btn-default" ng-click="ctrl.copyUrl(true)"><span class="icon-copy"></span></button>
+            </span>
+        </div>
+    </div>
 </div>
diff --git a/module/template/vmap.html b/module/template/vmap.html
index 0b1b12f9..3dfe8e97 100755
--- a/module/template/vmap.html
+++ b/module/template/vmap.html
@@ -19,7 +19,7 @@
 
                 <app-maplistlitle app-lang="ctrl.lang" app-maplistlitle-map="ctrl.map"></app-maplistlitle>
 
-                <div id="map-manager-button-container" style="text-align: center">
+                <div id="map-manager-button-container" style="text-align: center" ng-class="{'hidden': !$root.isVmapToolActive('MapManager')}">
                     <button id="map-manager-button"
                             type="button"
                             class="btn btn-success btn-sm btn-modal margin-10"
diff --git a/web_service/conf/properties.inc b/web_service/conf/properties.inc
index f21d672f..14c81c89 100755
--- a/web_service/conf/properties.inc
+++ b/web_service/conf/properties.inc
@@ -10,6 +10,8 @@ $properties["vmap"]["layers_collapsed"] = false;
 $properties["vmap"]["layerstree_collapsed"] = false;
 $properties["vmap"]["layersorder_collapsed"] = true;
 $properties["vmap"]["legend_collapsed"] = false;
+$properties['controls']['active_tools'] = 'LocationMaxExtent|User|Print|Insert|AdvancedSelect|Select|Mesure|URLGenerator|MapManager|LocationSearch|LocationHome|LocationRefresh|LocationXY|MapCompare|LocationMyPosition';
+$properties['controls']['public_active_tools'] = 'User|Insert|AdvancedSelect|LocationXY|MapManager|LocationHome|MapCompare|Select|Print|LocationSearch|LocationMyPosition|Mesure';
 $properties['controls']['active_controls'] = 'Attribution|MousePosition|CurrentProjection|MapName|Scale|ScaleLine|OverviewMap|Zoom|ZoomSlider|RefreshSocket';
 $properties["selection"]["limit_popup"] = 1;
 $properties["selection"]["limit_list"] = 50;
-- 
GitLab