diff --git a/CHANGELOG b/CHANGELOG
index 309805f5fa9a0b621a22b1647ef74175854ff34d..903e067c1df6858cb4664e9fc76c094f19cb0bcf 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,8 @@ minerva (12.2.0~alpha.0) stable; urgency=medium
   * Bug fix: export/import to/from SBML handles Heterodimer Association
     reaction properly
   * Small improvement: export to SBML includes unit factors
+  * Feature: url GET parameters support all kind of search and selected overlays
+    highligh
 
 
 minerva (12.1.3) stable; urgency=medium
diff --git a/frontend-js/src/main/css/global.css b/frontend-js/src/main/css/global.css
index c4707dce0155faf7e80eb3b38537e0092c22be97..d6566bc39c280ae8ea4504d5c7799f35e9471938 100644
--- a/frontend-js/src/main/css/global.css
+++ b/frontend-js/src/main/css/global.css
@@ -36,6 +36,20 @@
     transition: background-color 0.4s ease-in-out 0s;
 }
 
+.minerva-header .minerva-loading-div {
+    display: none;
+    float: right;
+}
+
+.minerva-header .minerva-loading-div img {
+    height: 35px;
+}
+
+.minerva-header .minerva-menu-link {
+    padding-right: 5px;
+    float: right;
+}
+
 .minerva-checkbox-grid li {
     display: block;
     float: left;
diff --git a/frontend-js/src/main/js/Export.js b/frontend-js/src/main/js/Export.js
index fa7484677ee79c57857590a742b91cf751e81a46..fd8dd9261c316b1709123354c0142eded1389dda 100644
--- a/frontend-js/src/main/js/Export.js
+++ b/frontend-js/src/main/js/Export.js
@@ -55,7 +55,8 @@ Export.prototype._createGui = function () {
     element: headerDiv,
     customMap: null,
     project: self.getProject(),
-    configuration: self.getConfiguration()
+    configuration: self.getConfiguration(),
+    serverConnector: self.getServerConnector()
   });
   self.getElement().appendChild(headerDiv);
 
diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js
index b15a812aaf317e9537f6f26afa06b8b32de0b8df..e3bc805638c1c8c823601d0abb0b20576ef198f8 100644
--- a/frontend-js/src/main/js/GuiConnector.js
+++ b/frontend-js/src/main/js/GuiConnector.js
@@ -8,7 +8,6 @@ var Functions = require('./Functions');
 var SecurityError = require('./SecurityError');
 var ValidationError = require('./ValidationError');
 var GuiMessageError = require('./gui/GuiMessageError');
-var NetworkError = require('./NetworkError');
 
 /**
  * This static global object contains set of functions that returns/set data in
@@ -51,7 +50,7 @@ GuiConnector.prototype.init = function () {
       return d >= 0 && this.lastIndexOf(pattern) === d;
     };
   }
-  // noinspection PointlessBooleanExpressionJS
+  // noinspection PointlessBooleanExpressionJS,JSUnresolvedVariable
   var isIE = /* @cc_on!@ */false || !!document.documentMode;
 
   if (isIE) {
@@ -107,6 +106,44 @@ GuiConnector.prototype.init = function () {
       }
     };
   }
+  newUrl = "";
+};
+
+
+var newUrl = "";
+
+setInterval(function () {
+  if (global.window !== undefined && newUrl !== "") {
+    if (!global.window.location.href.endsWith(newUrl)) {
+      global.window.history.replaceState(null, null, newUrl);
+    }
+  }
+}, 250);
+
+
+/**
+ *
+ * @param {string} key
+ * @param {string} value
+ */
+GuiConnector.prototype.setUrlParam = function (key, value) {
+  var self = this;
+  if (value === null || value === "") {
+    value = undefined;
+  }
+  if (self.getParams[key] !== value) {
+    self.getParams[key] = value;
+    var url = window.location.pathname + '?';
+    for (var getParamKey in self.getParams) {
+      if (self.getParams.hasOwnProperty(getParamKey)) {
+        var getParamValue = self.getParams[getParamKey];
+        if (getParamValue !== undefined) {
+          url += getParamKey + "=" + getParamValue + "&";
+        }
+      }
+    }
+    newUrl = url;
+  }
 };
 
 /**
@@ -351,6 +388,7 @@ GuiConnector.prototype.destroy = function () {
   }
   if (self._warnDialog !== undefined) {
     $(self._warnDialog).dialog("destroy").remove();
+    self._warnDialog = undefined;
   }
   if (self._processingDialog !== undefined) {
     $(self._processingDialog).dialog("destroy").remove();
@@ -371,7 +409,7 @@ GuiConnector.prototype.destroy = function () {
  * @param {string} message
  */
 GuiConnector.prototype.warn = function (message) {
-  var self = GuiConnector;
+  var self = returnThisOrSingleton(this);
   logger.warn(message);
   if (self._warnDialog === undefined) {
     self._warnDialog = document.createElement("div");
diff --git a/frontend-js/src/main/js/ObjectWithListeners.js b/frontend-js/src/main/js/ObjectWithListeners.js
index 219b102584047cffa147a2700984cd134a2cb59b..ce215052b81963637019ccfa8ef6b18fda616414 100644
--- a/frontend-js/src/main/js/ObjectWithListeners.js
+++ b/frontend-js/src/main/js/ObjectWithListeners.js
@@ -16,8 +16,12 @@ function ObjectWithListeners() {
 
 /**
  * @callback ListenerCallback
- * @param event
+ * @param {Object} event
+ * @param {string} event.type
+ * @param {ObjectWithListeners} event.object
+ * @param {Object} event.arg
  */
+
 /**
  * Adds a listener function to the object.
  *
diff --git a/frontend-js/src/main/js/gui/Header.js b/frontend-js/src/main/js/gui/Header.js
index d0b472d0785c53cbb61b8b96d4c5f5c9ca0c6acd..da36929e10484acbb8465a18826c1d1cca3a91d7 100644
--- a/frontend-js/src/main/js/gui/Header.js
+++ b/frontend-js/src/main/js/gui/Header.js
@@ -3,7 +3,6 @@
 /* exported logger */
 
 var AbstractGuiElement = require('./AbstractGuiElement');
-var GuiConnector = require('../GuiConnector');
 var PanelControlElementType = require('./PanelControlElementType');
 var Functions = require('../Functions');
 var OptionsMenu = require('./OptionsMenu');
@@ -18,8 +17,9 @@ var xss = require('xss');
  * @param {Object} params
  * @param {HTMLElement} params.element
  * @param {CustomMap} params.customMap
+ * @param {boolean} [params.optionsMenu=false]
  * @param {Configuration} params.configuration
- * @param {Project} params.project
+ * @param {Project} [params.project]
  * @param {ServerConnector} [params.serverConnector]
  *
  * @constructor
@@ -31,12 +31,8 @@ function Header(params) {
   var self = this;
 
   var guiParams = {
-    adminLink: true,
     optionsMenu: params.optionsMenu
   };
-  if (params.adminLink !== undefined) {
-    guiParams.adminLink = params.adminLink;
-  }
 
   self._createHeaderGui(guiParams);
 }
@@ -47,7 +43,6 @@ Header.prototype.constructor = Header;
 /**
  *
  * @param {Object} guiParams
- * @param {boolean} guiParams.adminLink
  * @param {boolean} guiParams.optionsMenu
  * @private
  */
@@ -60,28 +55,24 @@ Header.prototype._createHeaderGui = function (guiParams) {
 
   var loadingDiv = Functions.createElement({
     type: "div",
-    style: "display:none; "
+    className: "minerva-loading-div"
   });
-  loadingDiv.style.float = "right";
 
   var loadingImg = Functions.createElement({
     type: "img",
     src: 'resources/images/icons/ajax-loader.gif'
   });
-  loadingImg.style.height = "35px";
   loadingDiv.appendChild(loadingImg);
   this.setControlElement(PanelControlElementType.FOOTER_LOADING_DIV, loadingDiv);
 
-  if (guiParams.adminLink) {
-    var link = Functions.createElement({
-      type: "a",
-      style: "padding-right:15px; float:right",
-      content: '<i class="fa fa-lock" style="font-size:17px"></i>&nbsp;',
-      xss: false
-    });
-    link.href = ServerConnector.getServerBaseUrl() + "admin.xhtml?id=" + projectId;
-    self.getElement().appendChild(link);
-  }
+  var link = Functions.createElement({
+    type: "a",
+    style: "padding-right:15px; float:right",
+    content: '<i class="fa fa-lock" style="font-size:17px"></i>&nbsp;',
+    xss: false
+  });
+  link.href = self.getServerConnector().getServerBaseUrl() + "admin.xhtml?id=" + projectId;
+  self.getElement().appendChild(link);
 
   if (guiParams.optionsMenu) {
     var optionsElement = Functions.createElement({type: "ul"});
@@ -94,10 +85,10 @@ Header.prototype._createHeaderGui = function (guiParams) {
 
     var menuLink = Functions.createElement({
       type: "a",
-      style: "padding-right:5px; float:right",
+      className: "minerva-menu-link",
       content: '<i class="fa fa-bars" style="font-size:17px"></i>&nbsp;',
       href: "#",
-      onclick: function (e) {
+      onclick: function () {
         var link = $(menuLink);
         var offset = link.offset();
 
@@ -120,7 +111,7 @@ Header.prototype._createHeaderGui = function (guiParams) {
     content: '<i class="fa fa-home" style="font-size:17px"></i> ' + projectName,
     xss: false
   });
-  homeLink.href = ServerConnector.getServerBaseUrl() + "?id=" + projectId;
+  homeLink.href = self.getServerConnector().getServerBaseUrl() + "?id=" + projectId;
   self.getElement().appendChild(homeLink);
 };
 
@@ -158,7 +149,7 @@ Header.prototype.init = function () {
     self._loadMessages = [];
     self._onDataLoadStart = function (e) {
       self.addLoadMessage(e.arg);
-      div.style.display = "block";
+      $(div).show();
       div.title = e.arg;
     };
 
@@ -167,11 +158,11 @@ Header.prototype.init = function () {
       if (self._loadMessages.length > 0) {
         div.title = self._loadMessages[0];
       } else {
-        div.style.display = "none";
+        $(div).hide();
       }
     };
-    ServerConnector.addListener("onDataLoadStart", self._onDataLoadStart);
-    ServerConnector.addListener("onDataLoadStop", self._onDataLoadStop);
+    self.getServerConnector().addListener("onDataLoadStart", self._onDataLoadStart);
+    self.getServerConnector().addListener("onDataLoadStop", self._onDataLoadStop);
     resolve();
   });
 };
@@ -182,8 +173,8 @@ Header.prototype.init = function () {
 Header.prototype.destroy = function () {
   var self = this;
   if (self._onDataLoadStart) {
-    ServerConnector.removeListener("onDataLoadStart", self._onDataLoadStart);
-    ServerConnector.removeListener("onDataLoadStop", self._onDataLoadStop);
+    self.getServerConnector().removeListener("onDataLoadStart", self._onDataLoadStart);
+    self.getServerConnector().removeListener("onDataLoadStop", self._onDataLoadStop);
   }
   if (self._optionsMenu !== undefined) {
     document.body.removeChild(self._optionsMenu.getElement());
diff --git a/frontend-js/src/main/js/gui/OptionsMenu.js b/frontend-js/src/main/js/gui/OptionsMenu.js
index 959335c3f2c6e37523f4a527e289f6d6efafb3e7..7155aacd73f9fc7b689a6af231617fea4a76a900 100644
--- a/frontend-js/src/main/js/gui/OptionsMenu.js
+++ b/frontend-js/src/main/js/gui/OptionsMenu.js
@@ -10,7 +10,7 @@ var Promise = require('bluebird');
  * @param {HTMLElement} params.element
  * @param {CustomMap} params.customMap
  * @param {Configuration} params.configuration
- * @param {Project} params.project
+ * @param {Project} [params.project]
  * @param {ServerConnector} [params.serverConnector]
  *
  * @constructor
diff --git a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
index 77cde470d08e121e9e8ffebcb1f98ccd9e442c49..2f1266695f14b3a9a7f32dd625394eb43d8bc345 100644
--- a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
@@ -18,6 +18,7 @@ var SearchPanel = require('./SearchPanel');
 var SubmapPanel = require('./SubmapPanel');
 
 var Functions = require('../../Functions');
+// noinspection JSUnusedLocalSymbols
 var logger = require('../../logger');
 
 /**
diff --git a/frontend-js/src/main/js/gui/topMenu/TopMenu.js b/frontend-js/src/main/js/gui/topMenu/TopMenu.js
index 713ea5cbc2161f165f2af1bba5b8199f1e8354ac..a1ccf8e4bfe0b0908c0e15f57d05062755aef473 100644
--- a/frontend-js/src/main/js/gui/topMenu/TopMenu.js
+++ b/frontend-js/src/main/js/gui/topMenu/TopMenu.js
@@ -31,6 +31,7 @@ function TopMenu(params) {
   AbstractGuiElement.call(this, params);
   var self = this;
 
+  self.registerListenerType("onShowCommentsToggle");
   self._createGui();
 
   self._cronFunction = function () {
@@ -195,7 +196,9 @@ TopMenu.prototype.init = function () {
     } else {
       $(refreshCommentButton).css("display", "none");
     }
-    return self.getMap().refreshComments().then(null, GuiConnector.alert);
+    return self.getMap().refreshComments().then(function () {
+      return self.callListeners("onShowCommentsToggle", commentCheckbox.checked);
+    }).catch(GuiConnector.alert);
   };
   refreshCommentButton.onclick = (function () {
     return function () {
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 4209da61ba51c7513b497764a73ae3f79db68773..bfc79ed439828157436e634882804b352972d56c 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -45,6 +45,7 @@ function CustomMap(options) {
   this.registerListenerType("onShowOverlay");
   this.registerListenerType("onHideOverlay");
   this.registerListenerType("onBackgroundOverlayChange");
+  this.registerListenerType("onSubmapOpen");
 
   // @type {boolean[]}
   this._selectedOverlays = [];
@@ -479,11 +480,12 @@ CustomMap.prototype.openSubmap = function (id) {
           return self.refreshMarkers();
         });
       }
+    }).then(function (value) {
+      return self.callListeners("onSubmapOpen", {mapId: id});
     });
   } else {
     return Promise.resolve();
   }
-
 };
 
 /**
@@ -1218,26 +1220,26 @@ CustomMap.prototype.getDistance = function (params) {
         if (element.getY() <= y && element.getY() + element.getHeight() >= y) {
           return 0;
         } else {
-          return Math.min( 
-            Math.abs(element.getY() - y), 
-            Math.abs(element.getY() + element.getHeight() - y) 
+          return Math.min(
+            Math.abs(element.getY() - y),
+            Math.abs(element.getY() + element.getHeight() - y)
           );
         }
       } else if (element.getY() <= y && element.getY() + element.getHeight() >= y) {
-        return Math.min( 
-          Math.abs(element.getX() - x), 
-          Math.abs(element.getX() + element.getWidth() - x) 
+        return Math.min(
+          Math.abs(element.getX() - x),
+          Math.abs(element.getX() + element.getWidth() - x)
         );
       } else {
         var elementX = element.getX();
         var elementY = element.getY();
         var elementWidth = element.getWidth();
         var elementHeight = element.getHeight();
-        return Math.min( 
-          Functions.distance(p1, new Point(elementX, y)), 
-          Functions.distance(p1, new Point(elementX + elementWidth, elementY)), 
-          Functions.distance(p1, new Point(elementX, elementY + elementHeight)), 
-          Functions.distance(p1, new Point(elementX + elementWidth, elementY + elementHeight)) 
+        return Math.min(
+          Functions.distance(p1, new Point(elementX, y)),
+          Functions.distance(p1, new Point(elementX + elementWidth, elementY)),
+          Functions.distance(p1, new Point(elementX, elementY + elementHeight)),
+          Functions.distance(p1, new Point(elementX + elementWidth, elementY + elementHeight))
         );
       }
     } else if (element instanceof Reaction) {
diff --git a/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js b/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js
index 46e8a6d43509b3c1f1253e1d6daaddb5b2c8fa2d..9be86716daf868493c5aa935da9ca52f34e476e9 100644
--- a/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js
+++ b/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js
@@ -169,7 +169,8 @@ AbstractDbOverlay.prototype.searchByQuery = function (originalQuery, perfect, fi
     return self.callListeners('onSearch', {
       fitBounds: fitBounds,
       identifiedElements: res,
-      type: AbstractDbOverlay.QueryType.SEARCH_BY_QUERY
+      type: AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
+      query: originalQuery
     });
   }).then(function () {
     return res;
diff --git a/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js b/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js
index 68c15f0929562f79e611c9f576ee69f54d96edf6..4dd244a74b572cc3e706c62c0a24acfcf6d260fa 100644
--- a/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js
+++ b/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js
@@ -237,12 +237,16 @@ SearchDbOverlay.prototype.searchByCoordinates = function (params) {
 
   ServerConnector.getSessionData().setSearchQuery(query);
 
+  console.log(zoom);
   if (self._elementsByQuery[query] !== undefined) {
     self.setQueries([query]);
     return self.callListeners('onSearch', {
       fitBounds: false,
       identifiedElements: [self._elementsByQuery[query]],
-      type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES
+      type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES,
+      coordinates: coordinates,
+      modelId: modelId,
+      zoom: zoom
     }).then(function () {
       return Promise.resolve(self._elementsByQuery[query]);
     });
@@ -311,7 +315,10 @@ SearchDbOverlay.prototype.searchByCoordinates = function (params) {
       return self.callListeners('onSearch', {
         fitBounds: params.fitBounds,
         identifiedElements: [self._elementsByQuery[query]],
-        type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES
+        type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES,
+        coordinates: params.coordinates,
+        modelId: modelId,
+        zoom: zoom
       });
     }).then(function () {
       return self._elementsByQuery[query];
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 9a82fd917fd643cd9e60c9eea3a9818b8cf4f5d2..547a64bb24b20eeeba4d0c4e4e4b5d5c1cddbc88 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -57,14 +57,48 @@ function processUrlGetParams(params) {
     sessionData.setZoomLevel(model, GuiConnector.getParams["zoom"]);
   }
 
+  if (GuiConnector.getParams["background"] !== undefined) {
+    sessionData.setSelectedBackgroundOverlay(GuiConnector.getParams["background"]);
+  }
+
+  if (GuiConnector.getParams["overlays"] !== undefined) {
+    sessionData.setVisibleOverlays(GuiConnector.getParams["overlays"].split(","));
+  }
+
   if (GuiConnector.getParams["comments"] === "on") {
     sessionData.setShowComments(true);
   }
+  var query;
   if (GuiConnector.getParams["search"] !== undefined) {
-    var query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
+    query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
       GuiConnector.getParams["search"]);
     sessionData.setSearchQuery(query);
   }
+  if (GuiConnector.getParams["drugSearch"] !== undefined) {
+    query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
+      GuiConnector.getParams["drugSearch"]);
+    sessionData.setDrugQuery(query);
+  }
+  if (GuiConnector.getParams["chemicalSearch"] !== undefined) {
+    query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
+      GuiConnector.getParams["chemicalSearch"]);
+    sessionData.setChemicalQuery(query);
+  }
+  if (GuiConnector.getParams["mirnaSearch"] !== undefined) {
+    query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
+      GuiConnector.getParams["mirnaSearch"]);
+    sessionData.setMiRnaQuery(query);
+  }
+  if (GuiConnector.getParams["searchCoordinates"] !== undefined) {
+    var array = GuiConnector.getParams["searchCoordinates"].split(",");
+    var x = parseInt(array[0]);
+    var y = parseInt(array[1]);
+    var searchModelId = parseInt(array[2]);
+    var searchZoom = parseInt(array[3]);
+    query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES,
+      searchModelId, new Point(x, y), searchZoom);
+    sessionData.setSearchQuery(query);
+  }
 
 }
 
@@ -317,6 +351,107 @@ function assignSplitBarHandler(customMap, pluginManager) {
   });
 }
 
+/**
+ *
+ * @param {CustomMap} customMap
+ */
+function addUrlChangeListenersToCustomMap(customMap) {
+  customMap.addListener("onSubmapOpen", function (event) {
+    GuiConnector.setUrlParam("submap", event.arg.mapId.toString());
+  });
+  var onCenterChangedHandler = function (event) {
+    if (event.object.getId() !== customMap.getId()) {
+      GuiConnector.setUrlParam("submap", event.object.getId().toString());
+    } else {
+      GuiConnector.setUrlParam("submap", "");
+    }
+    GuiConnector.setUrlParam("x", Math.round(event.arg.x).toString());
+    // noinspection JSSuspiciousNameCombination
+    GuiConnector.setUrlParam("y", Math.round(event.arg.y).toString());
+  };
+
+  var onZoomChangedHandler = function (event) {
+    if (event.object.getId() !== customMap.getId()) {
+      GuiConnector.setUrlParam("submap", event.object.getId().toString());
+    } else {
+      GuiConnector.setUrlParam("submap", "");
+    }
+    GuiConnector.setUrlParam("zoom", event.arg.toString());
+  };
+
+  customMap.addListener("onCenterChanged", onCenterChangedHandler);
+  customMap.addListener("onZoomChanged", onZoomChangedHandler);
+
+  customMap.getSubmaps().forEach(function (submap) {
+    submap.addListener("onCenterChanged", onCenterChangedHandler);
+    submap.addListener("onZoomChanged", onZoomChangedHandler);
+  });
+
+  customMap.getOverlayByName("search").addListener("onSearch", function (e) {
+    GuiConnector.setUrlParam("search", undefined);
+    GuiConnector.setUrlParam("searchCoordinates", undefined);
+    if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES) {
+      // noinspection JSSuspiciousNameCombination
+      GuiConnector.setUrlParam("searchCoordinates", Math.round(e.arg.coordinates.x) + "," + Math.round(e.arg.coordinates.y) + "," +
+        e.arg.modelId + "," + e.arg.zoom);
+    } else if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) {
+      GuiConnector.setUrlParam("search", e.arg.query);
+    }
+  });
+
+  customMap.getOverlayByName("drug").addListener("onSearch", function (e) {
+    if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) {
+      GuiConnector.setUrlParam("drugSearch", e.arg.query);
+    }
+  });
+
+  customMap.getOverlayByName("mirna").addListener("onSearch", function (e) {
+    if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) {
+      GuiConnector.setUrlParam("mirnaSearch", e.arg.query);
+    }
+  });
+
+  customMap.getOverlayByName("chemical").addListener("onSearch", function (e) {
+    if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) {
+      GuiConnector.setUrlParam("chemicalSearch", e.arg.query);
+    }
+  });
+
+
+  var onOverlaysChangedHandler = function () {
+    return customMap.getVisibleDataOverlays().then(function (dataOverlays) {
+      var ids = [];
+      for (var i = 0; i < dataOverlays.length; i++) {
+        ids.push(dataOverlays[i].getId());
+      }
+      GuiConnector.setUrlParam("overlays", ids.join(","));
+    })
+  };
+
+  customMap.addListener("onShowOverlay", onOverlaysChangedHandler);
+  customMap.addListener("onHideOverlay", onOverlaysChangedHandler);
+
+  customMap.addListener("onBackgroundOverlayChange", function (event) {
+    GuiConnector.setUrlParam("background", event.arg);
+  });
+
+
+}
+
+/**
+ *
+ * @param {TopMenu} topMenu
+ */
+function addUrlChangeListenersToTopMenu(topMenu) {
+  topMenu.addListener("onShowCommentsToggle", function (event) {
+    if (event.arg) {
+      GuiConnector.setUrlParam("comments", "on");
+    } else {
+      GuiConnector.setUrlParam("comments", "");
+    }
+  });
+}
+
 /**
  *
  * @param {CustomMapOptions|*} params
@@ -417,7 +552,7 @@ function create(params) {
 
     return customMap.init();
   }).then(function () {
-    return insertGoogleAnalyticsCode(customMap);
+    return insertGoogleAnalyticsCode();
   }).then(function () {
     return leftPanel.init();
   }).then(function () {
@@ -429,11 +564,16 @@ function create(params) {
   }).then(function () {
     return mapContextMenu.init();
   }).then(function () {
+    addUrlChangeListenersToCustomMap(customMap);
+    addUrlChangeListenersToTopMenu(topMenu);
+
     if (GuiConnector.getParams["layout"] !== undefined) {
       var overlays = params.getProject().getDataOverlays();
       for (var j = 0; j < overlays.length; j++) {
         var overlay = overlays[j];
         if (overlay.getName() === GuiConnector.getParams["layout"]) {
+          GuiConnector.warn("'layout' GET parameter in url is deprecated. Please use 'overlays' GET param instead (take a look at current url)");
+          GuiConnector.setUrlParam("layout", undefined);
           return customMap.openDataOverlay(overlay);
         }
       }
@@ -464,6 +604,8 @@ function create(params) {
         return leftPanel.destroy().then(function () {
           customMap.destroy();
           return topMenu.destroy();
+        }).then(function () {
+          return GuiConnector.destroy();
         });
       },
       getProject: function () {
diff --git a/frontend-js/src/test/js/gui/Header-test.js b/frontend-js/src/test/js/gui/Header-test.js
index 090b9a3870f5755c9cb86e33106b1a95009def81..eb76c462261d10ba821f3a89102a43db25eb4a2c 100644
--- a/frontend-js/src/test/js/gui/Header-test.js
+++ b/frontend-js/src/test/js/gui/Header-test.js
@@ -16,27 +16,18 @@ describe('Header', function () {
 
       new Header({
         element: testDiv,
+        configuration: helper.getConfiguration(),
         customMap: map
       });
       assert.equal(logger.getWarnings().length, 0);
       assert.equal(1, $(".fa-lock", $(testDiv)).length);
     });
-    it('without admin-link', function () {
-      var map = helper.createCustomMap();
-
-      new Header({
-        element: testDiv,
-        customMap: map,
-        adminLink: false
-      });
-      assert.equal(logger.getWarnings().length, 0);
-      assert.equal(0, $(".fa-lock", $(testDiv)).length);
-    });
     it('with options-link', function () {
       var map = helper.createCustomMap();
 
       var header = new Header({
         element: testDiv,
+        configuration: helper.getConfiguration(),
         customMap: map,
         optionsMenu: true
       });
@@ -51,6 +42,7 @@ describe('Header', function () {
 
     var header = new Header({
       element: testDiv,
+      configuration: helper.getConfiguration(),
       customMap: map
     });
 
@@ -59,4 +51,24 @@ describe('Header', function () {
     });
   });
 
+  it('open menu', function () {
+    var map = helper.createCustomMap();
+
+    var header = new Header({
+      element: testDiv,
+      configuration: helper.getConfiguration(),
+      customMap: map,
+      optionsMenu: true
+    });
+
+    return header.init().then(function () {
+      assert.ok($(".dropdown-menu").css('display') === 'none');
+      return $(".minerva-menu-link", testDiv)[0].onclick();
+    }).then(function () {
+      assert.notOk($(".dropdown-menu").css('display') === 'none');
+      return header.destroy();
+    });
+  });
+
+
 });
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index 5d5ba8387b15c92e3dd9fa6a1d7a67194a6be827..166feb4183022a2f435f83609dbd0e3bcfdca5b9 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -7,7 +7,7 @@ var Promise = require("bluebird");
 var minerva = require('../../main/js/minerva');
 var SecurityError = require('../../main/js/SecurityError');
 var ServerConnectorMock = require('./ServerConnector-mock');
-var Point= require('../../main/js/map/canvas/Point');
+var Point = require('../../main/js/map/canvas/Point');
 var ProxyAccessPlugin = require('./plugin/ProxyAccessPlugin');
 
 var chai = require('chai');
@@ -126,31 +126,67 @@ describe('minerva global', function () {
     });
   });
 
-  it('create with overlay', function () {
-    var overlay, project, plugin, map;
-    return ServerConnectorMock.getProject().then(function (result) {
-      project = result;
-      var options = helper.createCustomMapOptions(project);
+  describe('create with overlay', function () {
+    it('background as layout param in URL', function () {
+      var overlay, project, plugin, map;
+      return ServerConnectorMock.getProject().then(function (result) {
+        project = result;
+        var options = helper.createCustomMapOptions(project);
 
-      plugin = new ProxyAccessPlugin({});
-      options.getPlugins().push(plugin);
+        plugin = new ProxyAccessPlugin({});
+        options.getPlugins().push(plugin);
 
-      overlay = project.getDataOverlays()[1];
+        overlay = project.getDataOverlays()[1];
 
-      helper.setUrl("http://test/?layout=" + overlay.getName());
+        helper.setUrl("http://test/?layout=" + overlay.getName());
 
-      return minerva.create(options);
-    }).then(function (result) {
-      map = result;
-      assert.ok(result);
-      // input file is not available so it's the background
-      return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
-    }).then(function (visibleDataOverlays) {
-      // input file is available so it's not the background file but overlay
-      assert.equal(visibleDataOverlays.length, 0);
-      assert.equal(ServerConnectorMock.getSessionData(project).getSelectedBackgroundOverlay(), overlay.getId());
-      assert.equal(logger.getWarnings().length, 0);
-      return map.destroy();
+        return minerva.create(options);
+      }).then(function (result) {
+        map = result;
+        assert.ok(result);
+        // input file is not available so it's the background
+        return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
+      }).then(function (visibleDataOverlays) {
+        // input file is available so it's not the background file but overlay
+        assert.equal(visibleDataOverlays.length, 0);
+        assert.equal(ServerConnectorMock.getSessionData(project).getSelectedBackgroundOverlay(), overlay.getId());
+        assert.equal(logger.getWarnings().length, 1);
+        return map.destroy();
+      });
+    });
+    it('overlay as layout param in URL', function () {
+      helper.setUrl("http://test/?layout=xxx");
+      var globalObject, plugin;
+      return ServerConnectorMock.getProject().then(function (project) {
+        var options = helper.createCustomMapOptions(project);
+        plugin = new ProxyAccessPlugin();
+        options.getPlugins().push(plugin);
+        return minerva.create(options);
+      }).then(function (result) {
+        globalObject = result;
+        assert.ok(result);
+        return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
+      }).then(function (visibleDataOverlays) {
+        // input file is available so it's not the background file but overlay
+        assert.equal(visibleDataOverlays.length, 1);
+        assert.equal(logger.getWarnings().length, 1);
+        return globalObject.destroy();
+      });
+    });
+    it('layout from session data', function () {
+      var layout;
+      return ServerConnectorMock.getProject().then(function (project) {
+        var options = helper.createCustomMapOptions(project);
+
+        layout = project.getDataOverlays()[1];
+
+        ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId());
+
+        return minerva.create(options);
+      }).then(function (result) {
+        assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), layout.getId());
+        return result.destroy();
+      });
     });
   });
 
@@ -175,41 +211,6 @@ describe('minerva global', function () {
     });
   });
 
-  it('create with layout from session data', function () {
-    var layout;
-    return ServerConnectorMock.getProject().then(function (project) {
-      var options = helper.createCustomMapOptions(project);
-
-      layout = project.getDataOverlays()[1];
-
-      ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId());
-
-      return minerva.create(options);
-    }).then(function (result) {
-      assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), layout.getId());
-      return result.destroy();
-    });
-  });
-
-  it('create with layout 2', function () {
-    helper.setUrl("http://test/?layout=xxx");
-    var globalObject, plugin;
-    return ServerConnectorMock.getProject().then(function (project) {
-      var options = helper.createCustomMapOptions(project);
-      plugin = new ProxyAccessPlugin();
-      options.getPlugins().push(plugin);
-      return minerva.create(options);
-    }).then(function (result) {
-      globalObject = result;
-      assert.ok(result);
-      return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
-    }).then(function (visibleDataOverlays) {
-      // input file is available so it's not the background file but overlay
-      assert.equal(visibleDataOverlays.length, 1);
-      assert.equal(logger.getWarnings().length, 0);
-      return globalObject.destroy();
-    });
-  });
 
   it('create with search overlay and GET search param', function () {
     helper.setUrl("http://test/?search=s1");
diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js
index c4bc6e3a92b212f3c54ab8511b16afd9c774fdd9..72f180aafbd82593ad38a86d65fd54c52d177b2a 100644
--- a/frontend-js/src/test/js/mocha-config.js
+++ b/frontend-js/src/test/js/mocha-config.js
@@ -199,6 +199,7 @@ before(function () {
 });
 
 beforeEach(function () {
+  Helper.prototype.setUrl.call(this, "http://test/");
 
   window.onresize = undefined;
 
@@ -219,8 +220,6 @@ beforeEach(function () {
 
   return ServerConnector.getConfiguration().then(function (configuration) {
     global.helper = new Helper(configuration);
-    helper.setUrl("http://test/");
-    GuiConnector.init();
   }).catch(function (error) {
     logger.error(error);
     throw error;