From 285364d54de16cf22ac190c25aa23240d052971c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 24 Aug 2017 13:30:15 +0200
Subject: [PATCH] unit test clean html after finishing

---
 frontend-js/src/main/js/gui/Header.js         |  174 +-
 frontend-js/src/main/js/gui/LoginDialog.js    |   98 +-
 frontend-js/src/main/js/gui/Panel.js          |  427 +++--
 .../src/main/js/gui/admin/AddProjectDialog.js |    2 +-
 .../main/js/gui/admin/EditProjectDialog.js    | 1139 +++++------
 .../src/main/js/gui/admin/MapsAdminPanel.js   |  432 ++---
 .../main/js/gui/leftPanel/ChemicalPanel.js    |   34 +-
 .../src/main/js/gui/leftPanel/DrugPanel.js    |    4 +
 .../src/main/js/gui/leftPanel/LeftPanel.js    |  442 ++---
 .../src/main/js/gui/leftPanel/MiRnaPanel.js   |    4 +
 .../src/main/js/gui/leftPanel/OverlayPanel.js |  640 ++++---
 .../main/js/gui/leftPanel/ProjectInfoPanel.js |  551 +++---
 .../src/main/js/gui/leftPanel/SearchPanel.js  |    5 +
 .../src/main/js/gui/leftPanel/SubmapPanel.js  |  212 ++-
 .../src/main/js/gui/topMenu/TopMenu.js        |  383 ++--
 frontend-js/src/main/js/map/CustomMap.js      |    4 +
 frontend-js/src/main/js/map/Submap.js         |  155 +-
 frontend-js/src/main/js/minerva.js            | 1095 +++++------
 frontend-js/src/test/js/GuiConnector-mock.js  |   23 +-
 .../src/test/js/gui/AddOverlayDialog-test.js  |    3 +-
 frontend-js/src/test/js/gui/Panel-test.js     |   31 +-
 .../js/gui/admin/EditProjectDialog-test.js    |   13 +-
 .../test/js/gui/admin/MapsAdminPanel-test.js  |  110 +-
 .../test/js/gui/leftPanel/LeftPanel-test.js   |  125 +-
 .../js/gui/leftPanel/OverlayPanel-test.js     |  159 +-
 .../js/gui/leftPanel/ProjectInfoPanel-test.js |  109 +-
 frontend-js/src/test/js/map/CustomMap-test.js | 1682 +++++++++--------
 frontend-js/src/test/js/minerva-test.js       |  821 ++++----
 frontend-js/src/test/js/mocha-config.js       |  118 +-
 29 files changed, 4579 insertions(+), 4416 deletions(-)

diff --git a/frontend-js/src/main/js/gui/Header.js b/frontend-js/src/main/js/gui/Header.js
index 0c5b50f08f..318906298f 100644
--- a/frontend-js/src/main/js/gui/Header.js
+++ b/frontend-js/src/main/js/gui/Header.js
@@ -11,107 +11,109 @@ var Promise = require("bluebird");
 var logger = require('../logger');
 
 function Header(params) {
-  AbstractGuiElement.call(this, params);
-  var self = this;
+    AbstractGuiElement.call(this, params);
+    var self = this;
 
-  var guiParams = {
-    adminLink : true,
-  };
-  if (params.adminLink !== undefined) {
-    guiParams.adminLink = params.adminLink;
-  }
+    var guiParams = {
+        adminLink: true,
+    };
+    if (params.adminLink !== undefined) {
+        guiParams.adminLink = params.adminLink;
+    }
 
-  self._createHeaderGui(guiParams);
+    self._createHeaderGui(guiParams);
 }
 
 Header.prototype = Object.create(AbstractGuiElement.prototype);
 Header.prototype.constructor = Header;
 
-Header.prototype._createHeaderGui = function(guiParams) {
-  var self = this;
-  self.getElement().className = "minerva-header";
-
-  var projectId = self.getProject().getProjectId();
-  var projectName = self.getProject().getName();
-
-  var loadingDiv = Functions.createElement({
-    type : "div",
-    style : "display:none; ",
-  });
-  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;',
+Header.prototype._createHeaderGui = function (guiParams) {
+    var self = this;
+    self.getElement().className = "minerva-header";
+
+    var projectId = self.getProject().getProjectId();
+    var projectName = self.getProject().getName();
+
+    var loadingDiv = Functions.createElement({
+        type: "div",
+        style: "display:none; ",
+    });
+    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;',
+        });
+        link.href = ServerConnector.getServerBaseUrl() + "admin.xhtml?id=" + projectId;
+        self.getElement().appendChild(link);
+    }
+
+    self.getElement().appendChild(loadingDiv);
+
+    var homeLink = Functions.createElement({
+        type: "a",
+        content: '<i class="fa fa-home" style="font-size:17px"></i> ' + projectName,
     });
-    link.href = ServerConnector.getServerBaseUrl() + "admin.xhtml?id=" + projectId;
-    self.getElement().appendChild(link);
-  }
-
-  self.getElement().appendChild(loadingDiv);
-
-  var homeLink = Functions.createElement({
-    type : "a",
-    content : '<i class="fa fa-home" style="font-size:17px"></i> ' + projectName,
-  });
-  homeLink.href = ServerConnector.getServerBaseUrl() + "?id=" + projectId;
-  self.getElement().appendChild(homeLink);
+    homeLink.href = ServerConnector.getServerBaseUrl() + "?id=" + projectId;
+    self.getElement().appendChild(homeLink);
 };
 
-Header.prototype.addLoadMessage = function(message) {
-  var self = this;
-  self._loadMessages.push(message);
+Header.prototype.addLoadMessage = function (message) {
+    var self = this;
+    self._loadMessages.push(message);
 };
-Header.prototype.removeLoadMessage = function(message) {
-  var self = this;
-  var index = self._loadMessages.indexOf(message);
-  if (index > -1) {
-    self._loadMessages.splice(index, 1);
-  } else {
-    logger.debug("Removing message that is not there: " + message);
-  }
+Header.prototype.removeLoadMessage = function (message) {
+    var self = this;
+    var index = self._loadMessages.indexOf(message);
+    if (index > -1) {
+        self._loadMessages.splice(index, 1);
+    } else {
+        logger.debug("Removing message that is not there: " + message);
+    }
 };
 
-Header.prototype.init = function() {
-  var self = this;
-  return new Promise(function(resolve) {
-    var div = self.getControlElement(PanelControlElementType.FOOTER_LOADING_DIV);
-
-    self._loadMessages = [];
-    self._onDataLoadStart = function(e) {
-      self.addLoadMessage(e.arg);
-      div.style.display = "block";
-      div.title = e.arg;
-    };
-
-    self._onDataLoadStop = function(e) {
-      self.removeLoadMessage(e.arg);
-      if (self._loadMessages.length > 0) {
-        div.title = self._loadMessages[0];
-      } else {
-        div.style.display = "none";
-      }
-    };
-    ServerConnector.addListener("onDataLoadStart", self._onDataLoadStart);
-    ServerConnector.addListener("onDataLoadStop", self._onDataLoadStop);
-    resolve();
-  });
+Header.prototype.init = function () {
+    var self = this;
+    return new Promise(function (resolve) {
+        var div = self.getControlElement(PanelControlElementType.FOOTER_LOADING_DIV);
+
+        self._loadMessages = [];
+        self._onDataLoadStart = function (e) {
+            self.addLoadMessage(e.arg);
+            div.style.display = "block";
+            div.title = e.arg;
+        };
+
+        self._onDataLoadStop = function (e) {
+            self.removeLoadMessage(e.arg);
+            if (self._loadMessages.length > 0) {
+                div.title = self._loadMessages[0];
+            } else {
+                div.style.display = "none";
+            }
+        };
+        ServerConnector.addListener("onDataLoadStart", self._onDataLoadStart);
+        ServerConnector.addListener("onDataLoadStop", self._onDataLoadStop);
+        resolve();
+    });
 };
 
-Header.prototype.destroy = function() {
-  var self = this;
-  ServerConnector.removeListener("onDataLoadStart", self._onDataLoadStart);
-  ServerConnector.removeListener("onDataLoadStop", self._onDataLoadStop);
+Header.prototype.destroy = function () {
+    var self = this;
+    if (self._onDataLoadStart) {
+        ServerConnector.removeListener("onDataLoadStart", self._onDataLoadStart);
+        ServerConnector.removeListener("onDataLoadStop", self._onDataLoadStop);
+    }
 };
 
 module.exports = Header;
diff --git a/frontend-js/src/main/js/gui/LoginDialog.js b/frontend-js/src/main/js/gui/LoginDialog.js
index 3df04cffff..9898081494 100644
--- a/frontend-js/src/main/js/gui/LoginDialog.js
+++ b/frontend-js/src/main/js/gui/LoginDialog.js
@@ -16,18 +16,18 @@ function LoginDialog(params) {
   var self = this;
   self._createLoginTab();
   $(self.getElement()).dialog({
-    autoOpen: false,
-    resizable: false,
+    autoOpen : false,
+    resizable : false,
   });
 
   var loginButton = self.getControlElement(PanelControlElementType.USER_TAB_LOGIN_BUTTON);
-  loginButton.onclick = function () {
+  loginButton.onclick = function() {
     var login = self.getControlElement(PanelControlElementType.USER_TAB_LOGIN_INPUT_TEXT).value;
     var password = self.getControlElement(PanelControlElementType.USER_TAB_PASSOWRD_INPUT_TEXT).value;
 
-    return ServerConnector.login(login, password).then(function () {
+    return ServerConnector.login(login, password).then(function() {
       window.location.reload(false);
-    }).then(null, function (error) {
+    }).then(null, function(error) {
       if (error instanceof InvalidCredentialsError) {
         GuiConnector.alert("invalid credentials");
       } else {
@@ -42,15 +42,15 @@ LoginDialog.prototype = Object.create(AbstractGuiElement.prototype);
 LoginDialog.prototype.constructor = LoginDialog;
 
 LoginDialog.prototype.createTableRow = function (elements) {
-  var row = Functions.createElement({
-    type: "div",
-    style: "display: table-row;"
-  });
+    var row = Functions.createElement({
+        type: "div",
+        style: "display: table-row;"
+    });
 
   for (var i = 0; i < elements.length; i++) {
     var cell = Functions.createElement({
-      type: "div",
-      style: "display: table-cell;"
+      type : "div",
+      style : "display: table-cell;"
     });
     cell.appendChild(elements[i]);
     row.appendChild(cell);
@@ -59,46 +59,46 @@ LoginDialog.prototype.createTableRow = function (elements) {
 };
 
 LoginDialog.prototype._createLoginTab = function () {
-  var self = this;
+    var self = this;
 
-  var authorizationFormTab = Functions.createElement({
-    type: "div",
-    style: "width:100%;display: table;border-spacing: 10px;"
-  });
-  this.getElement().appendChild(authorizationFormTab);
+    var authorizationFormTab = Functions.createElement({
+        type: "div",
+        style: "width:100%;display: table;border-spacing: 10px;"
+    });
+    this.getElement().appendChild(authorizationFormTab);
 
-  var loginLabel = Functions.createElement({
-    type: "div",
-    content: "LOGIN:"
-  });
-  var loginInput = Functions.createElement({
-    type: "input",
-    inputType: "text",
-    style: "width:100%",
-    name: "loginText"
-  });
-  this.setControlElement(PanelControlElementType.USER_TAB_LOGIN_INPUT_TEXT, loginInput);
+    var loginLabel = Functions.createElement({
+        type: "div",
+        content: "LOGIN:"
+    });
+    var loginInput = Functions.createElement({
+        type: "input",
+        inputType: "text",
+        style: "width:100%",
+        name: "loginText"
+    });
+    this.setControlElement(PanelControlElementType.USER_TAB_LOGIN_INPUT_TEXT, loginInput);
 
-  authorizationFormTab.appendChild(self.createTableRow([loginLabel, loginInput]));
+    authorizationFormTab.appendChild(self.createTableRow([loginLabel, loginInput]));
 
-  var passwordLabel = Functions.createElement({
-    type: "div",
-    content: "PASSWORD:"
-  });
-  var passwordInput = Functions.createElement({
-    type: "input",
-    inputType: "password",
-    style: "width:100%",
-    name: "passwordText"
-  });
-  this.setControlElement(PanelControlElementType.USER_TAB_PASSOWRD_INPUT_TEXT, passwordInput);
+    var passwordLabel = Functions.createElement({
+        type: "div",
+        content: "PASSWORD:"
+    });
+    var passwordInput = Functions.createElement({
+        type: "input",
+        inputType: "password",
+        style: "width:100%",
+        name: "passwordText"
+    });
+    this.setControlElement(PanelControlElementType.USER_TAB_PASSOWRD_INPUT_TEXT, passwordInput);
 
-  authorizationFormTab.appendChild(self.createTableRow([passwordLabel, passwordInput]));
+    authorizationFormTab.appendChild(self.createTableRow([passwordLabel, passwordInput]));
 
-  var centerTag = Functions.createElement({
-    type: "center"
-  });
-  this.getElement().appendChild(centerTag);
+    var centerTag = Functions.createElement({
+        type: "center"
+    });
+    this.getElement().appendChild(centerTag);
 
   var loginButton = Functions.createElement({
     type: "button",
@@ -127,13 +127,13 @@ LoginDialog.prototype.init = function () {
 };
 
 LoginDialog.prototype.open = function () {
-  var self = this;
-  $(self.getElement()).dialog('option', 'title', 'AUTHORIZATION FORM');
-  $(self.getElement()).dialog("open");
+    var self = this;
+    $(self.getElement()).dialog('option', 'title', 'AUTHORIZATION FORM');
+    $(self.getElement()).dialog("open");
 };
 
 LoginDialog.prototype.destroy = function () {
-  $(this.getElement()).dialog("destroy");
+    $(this.getElement()).dialog("destroy");
 };
 
 module.exports = LoginDialog;
diff --git a/frontend-js/src/main/js/gui/Panel.js b/frontend-js/src/main/js/gui/Panel.js
index d4c85402ef..4daa6ce710 100644
--- a/frontend-js/src/main/js/gui/Panel.js
+++ b/frontend-js/src/main/js/gui/Panel.js
@@ -11,280 +11,291 @@ var Functions = require('../Functions');
 var logger = require('../logger');
 
 function Panel(params) {
-  AbstractGuiElement.call(this, params);
-
-  var self = this;
-
-  self.setParent(params.parent);
-  var configuration = params.configuration;
-  if (params.configuration === undefined) {
-    configuration = self.getMap().getConfiguration();
-  }
-  var guiUtils = new GuiUtils(configuration);
-  self.setGuiUtils(guiUtils);
-  if (self.getMap() !== undefined) {
-    this.getGuiUtils().setMap(self.getMap());
-  }
-  self.setPanelName(params.panelName);
-
-  if (params.scrollable) {
-    $(self.getElement()).addClass("pre-scrollable");
-  } else {
-    $(self.getElement()).css("overflow-y", "auto");
-  }
-
-  $(self.getElement()).css("position", "relative");
-  if (params.helpTip !== undefined) {
-    self.createHelpButton();
-    self.setHelpTip(params.helpTip);
-  }
-
-  GuiConnector.addWindowResizeEvent(function() {
-    self.onresize();
-  });
-
-  $("a[href='#" + self.getElement().id + "']").on('shown.bs.tab', function() {
-    self.onresize();
-  });
+    AbstractGuiElement.call(this, params);
+
+    var self = this;
+
+    self.setParent(params.parent);
+    var configuration = params.configuration;
+    if (params.configuration === undefined) {
+        configuration = self.getMap().getConfiguration();
+    }
+    var guiUtils = new GuiUtils(configuration);
+    self.setGuiUtils(guiUtils);
+    if (self.getMap() !== undefined) {
+        this.getGuiUtils().setMap(self.getMap());
+    }
+    self.setPanelName(params.panelName);
+
+    if (params.scrollable) {
+        $(self.getElement()).addClass("pre-scrollable");
+    } else {
+        $(self.getElement()).css("overflow-y", "auto");
+    }
+
+    $(self.getElement()).css("position", "relative");
+    if (params.helpTip !== undefined) {
+        self.createHelpButton();
+        self.setHelpTip(params.helpTip);
+    }
+
+    GuiConnector.addWindowResizeEvent(function () {
+        self.onresize();
+    });
+
+    $("a[href='#" + self.getElement().id + "']").on('shown.bs.tab', function () {
+        self.onresize();
+    });
 
 }
 
 Panel.prototype = Object.create(AbstractGuiElement.prototype);
 Panel.prototype.constructor = Panel;
 
-Panel.prototype.createHelpButton = function() {
-  var self = this;
-  var helpTipButton = Functions.createElement({
-    type : "button",
-    className : "minerva-help-button",
-    content : '<span class="ui-icon ui-icon-help" style="margin-left: -0.5em;"/>',
-  });
-  helpTipButton.onclick = function() {
-    var helpDialogDiv = Functions.createElement({
-      type : "div",
-      content : self.getHelpTip(),
+Panel.prototype.createHelpButton = function () {
+    var self = this;
+    var helpTipButton = Functions.createElement({
+        type: "button",
+        className: "minerva-help-button",
+        content: '<span class="ui-icon ui-icon-help" style="margin-left: -0.5em;"/>',
     });
-    $(helpDialogDiv).dialog({
-      close : function() {
-        $(this).dialog('destroy').remove();
-      },
-      position : {
-        my : "left top",
-        at : "left bottom",
-        of : helpTipButton
-      },
-    });
-    $('.ui-dialog').find("a").blur();
-  };
-  self.getElement().appendChild(helpTipButton);
+    helpTipButton.onclick = function () {
+        var helpDialogDiv = Functions.createElement({
+            type: "div",
+            content: self.getHelpTip(),
+        });
+        $(helpDialogDiv).dialog({
+            close: function () {
+                $(this).dialog('destroy').remove();
+            },
+            position: {
+                my: "left top",
+                at: "left bottom",
+                of: helpTipButton
+            },
+        });
+        $('.ui-dialog').find("a").blur();
+    };
+    self.getElement().appendChild(helpTipButton);
 };
 
-Panel.prototype.disablePanel = function(message) {
-  var self = this;
+Panel.prototype.disablePanel = function (message) {
+    var self = this;
 
-  var searchQueryElement = self.getControlElement(PanelControlElementType.SEARCH_DIV);
-  var searchResultsElement = self.getControlElement(PanelControlElementType.SEARCH_RESULTS_DIV);
+    var searchQueryElement = self.getControlElement(PanelControlElementType.SEARCH_DIV);
+    var searchResultsElement = self.getControlElement(PanelControlElementType.SEARCH_RESULTS_DIV);
 
-  searchQueryElement.style.visibility = "hidden";
-  searchResultsElement.style.visibility = "hidden";
-  var hideReasonDiv = document.createElement("div");
-  hideReasonDiv.className = "searchPanel";
+    searchQueryElement.style.visibility = "hidden";
+    searchResultsElement.style.visibility = "hidden";
+    var hideReasonDiv = document.createElement("div");
+    hideReasonDiv.className = "searchPanel";
 
-  var center = document.createElement("center");
-  var messageDiv = document.createElement("h4");
-  messageDiv.innerHTML = message;
-  center.appendChild(messageDiv);
-  hideReasonDiv.appendChild(center);
+    var center = document.createElement("center");
+    var messageDiv = document.createElement("h4");
+    messageDiv.innerHTML = message;
+    center.appendChild(messageDiv);
+    hideReasonDiv.appendChild(center);
 
-  self.getElement().insertBefore(hideReasonDiv, searchQueryElement);
+    self.getElement().insertBefore(hideReasonDiv, searchQueryElement);
 };
 
-Panel.prototype.isDisbaled = function() {
-  var self = this;
-  var searchQueryElement = self.getControlElement(PanelControlElementType.SEARCH_DIV);
-  return searchQueryElement.style.visibility === "hidden";
+Panel.prototype.isDisbaled = function () {
+    var self = this;
+    var searchQueryElement = self.getControlElement(PanelControlElementType.SEARCH_DIV);
+    return searchQueryElement.style.visibility === "hidden";
 };
-Panel.prototype.setMap = function(map) {
-  this._map = map;
+Panel.prototype.setMap = function (map) {
+    this._map = map;
 };
 
-Panel.prototype.getMap = function() {
-  return this._map;
+Panel.prototype.getMap = function () {
+    return this._map;
 };
 
-Panel.prototype.setPanelName = function(panelName) {
-  this._panelName = panelName;
+Panel.prototype.setPanelName = function (panelName) {
+    this._panelName = panelName;
 };
 
-Panel.prototype.getPanelName = function() {
-  return this._panelName;
+Panel.prototype.getPanelName = function () {
+    return this._panelName;
 };
 
-Panel.prototype.setElement = function(element) {
-  if (element === undefined || element === null) {
-    throw new Error("DOM Element must be defined");
-  }
-  this._element = element;
+Panel.prototype.setElement = function (element) {
+    if (element === undefined || element === null) {
+        throw new Error("DOM Element must be defined");
+    }
+    this._element = element;
 };
 
-Panel.prototype.getElement = function() {
-  return this._element;
+Panel.prototype.getElement = function () {
+    return this._element;
 };
 
-Panel.prototype.getElementByName = function(element, name) {
-  if (element !== undefined) {
-    if (element.getAttribute("name") === name) {
-      return element;
-    }
-    var children = element.children;
-    for (var i = 0; i < children.length; i++) {
-      var child = children[i];
-      var res = this.getElementByName(child, name);
-      if (res !== undefined) {
-        return res;
-      }
+Panel.prototype.getElementByName = function (element, name) {
+    if (element !== undefined) {
+        if (element.getAttribute("name") === name) {
+            return element;
+        }
+        var children = element.children;
+        for (var i = 0; i < children.length; i++) {
+            var child = children[i];
+            var res = this.getElementByName(child, name);
+            if (res !== undefined) {
+                return res;
+            }
+        }
     }
-  }
-  return undefined;
+    return undefined;
 };
 
-Panel.prototype.getDialogDiv = function(id) {
-  var dialogs = this.getElementByName(this.getElement(), "dialogs");
-  if (dialogs === undefined) {
-    dialogs = document.createElement("div");
-    dialogs.setAttribute("name", "dialogs");
-    this.getElement().appendChild(dialogs);
+Panel.prototype.getDialogDiv = function (id) {
+    var dialogs = this.getElementByName(this.getElement(), "dialogs");
+    if (dialogs === undefined) {
+        dialogs = document.createElement("div");
+        dialogs.setAttribute("name", "dialogs");
+        this.getElement().appendChild(dialogs);
 
-    this._dialogs = [];
-  }
+        this._dialogs = [];
+    }
 
-  var dialogDiv = this._dialogs[id];
+    var dialogDiv = this._dialogs[id];
 
-  if (dialogDiv === undefined) {
-    dialogDiv = document.createElement("div");
-    dialogDiv.className = "ui-widget";
-    dialogDiv.setAttribute("name", "dialog-" + id);
+    if (dialogDiv === undefined) {
+        dialogDiv = document.createElement("div");
+        dialogDiv.className = "ui-widget";
+        dialogDiv.setAttribute("name", "dialog-" + id);
 
-    var contentDiv = document.createElement("div");
-    contentDiv.setAttribute("name", "content");
-    dialogDiv.appendChild(contentDiv);
+        var contentDiv = document.createElement("div");
+        contentDiv.setAttribute("name", "content");
+        dialogDiv.appendChild(contentDiv);
 
-    dialogs.appendChild(dialogDiv);
+        dialogs.appendChild(dialogDiv);
 
-    this._dialogs[id] = dialogDiv;
-  }
-  return dialogDiv;
+        this._dialogs[id] = dialogDiv;
+    }
+    return dialogDiv;
 };
 
-Panel.prototype.assignDialogOptions = function(div, params) {
-  var dialog = $(div);
-  for ( var key in params) {
-    if (params.hasOwnProperty(key)) {
-      if (key === "id") {
-        div.setAttribute("name", "dialog-" + params[key]);
-      } else if (key === "modal") {
-        dialog.dialog('option', 'modal', params[key]);
-      } else if (key === "buttons") {
-        dialog.dialog('option', 'buttons', params[key]);
-      } else if (key === "className") {
-        dialog.dialog('option', 'dialogClass', params[key]);
-      } else if (key === "title") {
-        dialog.dialog('option', 'title', params[key]);
-      } else {
-        throw new Error("Unknown dialog param: " + key + " - " + params[key]);
-      }
+Panel.prototype.assignDialogOptions = function (div, params) {
+    var dialog = $(div);
+    for (var key in params) {
+        if (params.hasOwnProperty(key)) {
+            if (key === "id") {
+                div.setAttribute("name", "dialog-" + params[key]);
+            } else if (key === "modal") {
+                dialog.dialog('option', 'modal', params[key]);
+            } else if (key === "buttons") {
+                dialog.dialog('option', 'buttons', params[key]);
+            } else if (key === "className") {
+                dialog.dialog('option', 'dialogClass', params[key]);
+            } else if (key === "title") {
+                dialog.dialog('option', 'title', params[key]);
+            } else {
+                throw new Error("Unknown dialog param: " + key + " - " + params[key]);
+            }
+        }
     }
-  }
 };
 
-Panel.prototype.openDialog = function(content, options) {
-  if (options === undefined) {
-    options = {};
-  }
-
-  if (options.id === undefined) {
-    logger.warn("Id of dialog is not defined");
-  }
+Panel.prototype.openDialog = function (content, options) {
+    if (options === undefined) {
+        options = {};
+    }
 
-  var div = this.getDialogDiv(options.id);
+    if (options.id === undefined) {
+        logger.warn("Id of dialog is not defined");
+    }
 
-  var contentDiv = this.getElementByName(div, "content");
-  while (contentDiv.hasChildNodes()) {
-    contentDiv.removeChild(contentDiv.lastChild);
-  }
-  contentDiv.appendChild(content);
-  contentDiv.style.display = "block";
+    var div = this.getDialogDiv(options.id);
 
-  $(div).dialog({
-    close : function() {
-      contentDiv.style.display = "none";
-      $(this).dialog('destroy');
-    },
-    dialogClass : options.className,
-  });
+    var contentDiv = this.getElementByName(div, "content");
+    while (contentDiv.hasChildNodes()) {
+        contentDiv.removeChild(contentDiv.lastChild);
+    }
+    contentDiv.appendChild(content);
+    contentDiv.style.display = "block";
+
+    $(div).dialog({
+        close: function () {
+            contentDiv.style.display = "none";
+            $(this).dialog('destroy');
+        },
+        dialogClass: options.className,
+    });
 
-  this.assignDialogOptions(div, options);
+    this.assignDialogOptions(div, options);
 
-  $(div).dialog("open");
+    $(div).dialog("open");
 };
 
-Panel.prototype.init = function() {
-  throw new Error(this.getPanelName() + " Not implemented");
+Panel.prototype.init = function () {
+    throw new Error(this.getPanelName() + " Not implemented");
 };
 
-Panel.prototype.setParent = function(parent) {
-  this._parent = parent;
+Panel.prototype.setParent = function (parent) {
+    this._parent = parent;
 };
 
-Panel.prototype.getParent = function() {
-  return this._parent;
+Panel.prototype.getParent = function () {
+    return this._parent;
 };
 
-Panel.prototype.setGuiUtils = function(guiUtils) {
-  this._guiUtils = guiUtils;
+Panel.prototype.setGuiUtils = function (guiUtils) {
+    this._guiUtils = guiUtils;
 };
 
-Panel.prototype.getGuiUtils = function() {
-  return this._guiUtils;
+Panel.prototype.getGuiUtils = function () {
+    return this._guiUtils;
 };
 
-Panel.prototype.setHelpTip = function(helpTip) {
-  this._helpTip = helpTip;
+Panel.prototype.setHelpTip = function (helpTip) {
+    this._helpTip = helpTip;
 };
 
-Panel.prototype.getHelpTip = function() {
-  return this._helpTip;
+Panel.prototype.getHelpTip = function () {
+    return this._helpTip;
 };
 
-Panel.prototype.onresize = function() {
-  var self = this;
-  var footerPosition = window.innerHeight;
-
-  // compute the width (we can only compute it for visible elements)
-  var size = 100000;
+Panel.prototype.onresize = function () {
+    var self = this;
+    var footerPosition = window.innerHeight;
+
+    // compute the width (we can only compute it for visible elements)
+    var size = 100000;
+
+    if ($(self.getElement()).is(":visible")) {
+
+        $(".pre-scrollable", self.getElement()).each(function (index, element) {
+            if ($(element).is(":visible")) {
+                size = Math.min(size, footerPosition - $(element).offset().top);
+            }
+        });
+        if ($(self.getElement()).hasClass("pre-scrollable") && $(self.getElement()).is(":visible")) {
+            size = Math.min(size, footerPosition - $(self.getElement()).offset().top);
+        }
+        if (size !== 100000) {
+            $(".pre-scrollable", self.getElement()).each(function (index, element) {
+                $(element).css('max-height', size);
+                $(element).css('height', size);
+            });
+        }
+        if ($(self.getElement()).hasClass("pre-scrollable") && $(self.getElement()).is(":visible")) {
+            $(self.getElement()).css('max-height', size);
+            $(self.getElement()).css('height', size);
+        }
+    }
 
-  if ($(self.getElement()).is(":visible")) {
+};
 
-    $(".pre-scrollable", self.getElement()).each(function(index, element) {
-      if ($(element).is(":visible")) {
-        size = Math.min(size, footerPosition - $(element).offset().top);
-      }
-    });
-    if ($(self.getElement()).hasClass("pre-scrollable") && $(self.getElement()).is(":visible")) {
-      size = Math.min(size, footerPosition - $(self.getElement()).offset().top);
+Panel.prototype.destroy = function () {
+    for (var id in this._dialogs) {
+        if (this._dialogs.hasOwnProperty(id)) {
+            var div = this._dialogs[id];
+            if ($(div).hasClass("ui-dialog-content")) {
+                $(div).dialog("destroy");
+            }
+        }
     }
-    if (size !== 100000) {
-      $(".pre-scrollable", self.getElement()).each(function(index, element) {
-        $(element).css('max-height', size);
-        $(element).css('height', size);
-      });
-    }
-    if ($(self.getElement()).hasClass("pre-scrollable") && $(self.getElement()).is(":visible")) {
-      $(self.getElement()).css('max-height', size);
-      $(self.getElement()).css('height', size);
-    }
-  }
-
 };
 
 module.exports = Panel;
diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index b795684725..8abb8cd323 100644
--- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -6,7 +6,7 @@ var Promise = require("bluebird");
 var AbstractGuiElement = require('../AbstractGuiElement');
 var GuiConnector = require('../../GuiConnector');
 
-var Functions = require('../../functions');
+var Functions = require('../../Functions');
 var logger = require('../../logger');
 
 var guiUtils = new (require('../leftPanel/GuiUtils'))();
diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
index 702f796670..461428927b 100644
--- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
@@ -14,644 +14,655 @@ var logger = require('../../logger');
 var guiUtils = new (require('../leftPanel/GuiUtils'))();
 
 function EditProjectDialog(params) {
-  AbstractGuiElement.call(this, params);
-  var self = this;
-  $(self.getElement()).addClass("minerva-edit-project-dialog");
+    AbstractGuiElement.call(this, params);
+    var self = this;
+    $(self.getElement()).addClass("minerva-edit-project-dialog");
 
-  self.createGui();
+    self.createGui();
 }
 
 EditProjectDialog.prototype = Object.create(AbstractGuiElement.prototype);
 EditProjectDialog.prototype.constructor = EditProjectDialog;
 
-EditProjectDialog.prototype.createGui = function() {
-  var self = this;
-  var element = self.getElement();
-
-  var tabDiv = Functions.createElement({
-    type : "div",
-    name : "tabView",
-    className : "tabbable boxed parentTabs"
-  });
-  element.appendChild(tabDiv);
-
-  var tabMenuDiv = Functions.createElement({
-    type : "ul",
-    className : "nav nav-tabs"
-  });
-  tabDiv.appendChild(tabMenuDiv);
-
-  var tabContentDiv = Functions.createElement({
-    type : "div",
-    className : "tab-content"
-  });
-  tabDiv.appendChild(tabContentDiv);
-
-  self.createGeneralTab(tabMenuDiv, tabContentDiv);
-  self.createOverlaysTab(tabMenuDiv, tabContentDiv);
-  self.createUsersTab(tabMenuDiv, tabContentDiv);
+EditProjectDialog.prototype.createGui = function () {
+    var self = this;
+    var element = self.getElement();
+
+    var tabDiv = Functions.createElement({
+        type: "div",
+        name: "tabView",
+        className: "tabbable boxed parentTabs"
+    });
+    element.appendChild(tabDiv);
+
+    var tabMenuDiv = Functions.createElement({
+        type: "ul",
+        className: "nav nav-tabs"
+    });
+    tabDiv.appendChild(tabMenuDiv);
+
+    var tabContentDiv = Functions.createElement({
+        type: "div",
+        className: "tab-content"
+    });
+    tabDiv.appendChild(tabContentDiv);
+
+    self.createGeneralTab(tabMenuDiv, tabContentDiv);
+    self.createOverlaysTab(tabMenuDiv, tabContentDiv);
+    self.createUsersTab(tabMenuDiv, tabContentDiv);
 };
 
-EditProjectDialog.prototype.createGeneralTab = function(tabMenuDiv, tabContentDiv) {
-  var self = this;
-  self.addTab({
-    tabMenuDiv : tabMenuDiv,
-    tabContentDiv : tabContentDiv,
-    name : "GENERAL",
-    id : self.getProject().getProjectId() + "_general_tab",
-    content : self.createGeneralTabContent(),
-  });
+EditProjectDialog.prototype.createGeneralTab = function (tabMenuDiv, tabContentDiv) {
+    var self = this;
+    self.addTab({
+        tabMenuDiv: tabMenuDiv,
+        tabContentDiv: tabContentDiv,
+        name: "GENERAL",
+        id: self.getProject().getProjectId() + "_general_tab",
+        content: self.createGeneralTabContent(),
+    });
 
 };
 
-EditProjectDialog.prototype.addTab = function(params) {
-  var navLi = guiUtils.createTabMenuObject({
-    id : params.id,
-    name : params.name,
-    navigationBar : params.tabMenuDiv
-  });
-  params.tabMenuDiv.appendChild(navLi);
-
-  var contentDiv = guiUtils.createTabContentObject({
-    id : params.id,
-    navigationObject : navLi,
-    navigationBar : params.tabMenuDiv
-  });
-
-  if (params.content !== undefined) {
-    contentDiv.appendChild(params.content);
-  }
-
-  params.tabContentDiv.appendChild(contentDiv);
+EditProjectDialog.prototype.addTab = function (params) {
+    var navLi = guiUtils.createTabMenuObject({
+        id: params.id,
+        name: params.name,
+        navigationBar: params.tabMenuDiv
+    });
+    params.tabMenuDiv.appendChild(navLi);
+
+    var contentDiv = guiUtils.createTabContentObject({
+        id: params.id,
+        navigationObject: navLi,
+        navigationBar: params.tabMenuDiv
+    });
+
+    if (params.content !== undefined) {
+        contentDiv.appendChild(params.content);
+    }
+
+    params.tabContentDiv.appendChild(contentDiv);
 };
 
-EditProjectDialog.prototype.createGeneralTabContent = function() {
-  var self = this;
-  var project = self.getProject();
-
-  var result = new Functions.createElement({
-    type : "div",
-  });
-
-  var table = new Functions.createElement({
-    type : "div",
-    style : "display:table"
-  });
-  result.appendChild(table);
-
-  var projectIdRow = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  table.appendChild(projectIdRow);
-  projectIdRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "ProjectId",
-  }));
-  projectIdRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : project.getProjectId(),
-  }));
-
-  var nameRow = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  table.appendChild(nameRow);
-  nameRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "Name",
-  }));
-  nameRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "<input name='projectName' value='" + project.getName() + "'/>",
-  }));
-
-  var versionRow = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  table.appendChild(versionRow);
-  versionRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "Version",
-  }));
-  versionRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "<input name='projectVersion' value='" + project.getVersion() + "'/>",
-  }));
-
-  var diseaseRow = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  table.appendChild(diseaseRow);
-  diseaseRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "Disease",
-  }));
-  var disease = "";
-  if (project.getDisease() !== undefined) {
-    disease = project.getDisease().getResource();
-  }
-  diseaseRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "<input name='projectDisease' value='" + disease + "'/>",
-  }));
-
-  var organismRow = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  table.appendChild(organismRow);
-  organismRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "Organism",
-  }));
-  var organism = "";
-  if (project.getOrganism() !== undefined) {
-    organism = project.getOrganism().getResource();
-  }
-  organismRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "<input name='projectOrganism' value='" + organism + "'/>",
-  }));
-
-  var emailRow = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  table.appendChild(emailRow);
-  emailRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "Notify email",
-  }));
-  var email = "";
-  if (project.getNotifyEmail() !== undefined) {
-    email = project.getNotifyEmail();
-  }
-  emailRow.appendChild(new Functions.createElement({
-    type : "div",
-    style : "display:table-cell",
-    content : "<input name='projectNotifyEmail' value='" + email + "'/>",
-  }));
-
-  var menuRow = Functions.createElement({
-    type : "div",
-    className : "minerva-menu-row",
-    style : "display:table-row; margin:10px",
-  });
-  result.appendChild(menuRow);
-
-  var saveProjectButton = Functions.createElement({
-    type : "button",
-    name : "saveProject",
-    content : '<span class="ui-icon ui-icon-disk"></span>&nbsp;SAVE',
-    onclick : function() {
-      return self.onSaveClicked().then(function() {
-        return self.close();
-      }, GuiConnector.alert);
-    },
-  });
-  var cancelButton = Functions.createElement({
-    type : "button",
-    name : "cancelProject",
-    content : '<span class="ui-icon ui-icon-cancel"></span>&nbsp;CANCEL',
-    onclick : function() {
-      return self.close();
-    },
-  });
-  menuRow.appendChild(saveProjectButton);
-  menuRow.appendChild(cancelButton);
-
-  return result;
+EditProjectDialog.prototype.createGeneralTabContent = function () {
+    var self = this;
+    var project = self.getProject();
+
+    var result = new Functions.createElement({
+        type: "div",
+    });
+
+    var table = new Functions.createElement({
+        type: "div",
+        style: "display:table"
+    });
+    result.appendChild(table);
+
+    var projectIdRow = new Functions.createElement({
+        type: "div",
+        style: "display:table-row"
+    });
+    table.appendChild(projectIdRow);
+    projectIdRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "ProjectId",
+    }));
+    projectIdRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: project.getProjectId(),
+    }));
+
+    var nameRow = new Functions.createElement({
+        type: "div",
+        style: "display:table-row"
+    });
+    table.appendChild(nameRow);
+    nameRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "Name",
+    }));
+    nameRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "<input name='projectName' value='" + project.getName() + "'/>",
+    }));
+
+    var versionRow = new Functions.createElement({
+        type: "div",
+        style: "display:table-row"
+    });
+    table.appendChild(versionRow);
+    versionRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "Version",
+    }));
+    versionRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "<input name='projectVersion' value='" + project.getVersion() + "'/>",
+    }));
+
+    var diseaseRow = new Functions.createElement({
+        type: "div",
+        style: "display:table-row"
+    });
+    table.appendChild(diseaseRow);
+    diseaseRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "Disease",
+    }));
+    var disease = "";
+    if (project.getDisease() !== undefined) {
+        disease = project.getDisease().getResource();
+    }
+    diseaseRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "<input name='projectDisease' value='" + disease + "'/>",
+    }));
+
+    var organismRow = new Functions.createElement({
+        type: "div",
+        style: "display:table-row"
+    });
+    table.appendChild(organismRow);
+    organismRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "Organism",
+    }));
+    var organism = "";
+    if (project.getOrganism() !== undefined) {
+        organism = project.getOrganism().getResource();
+    }
+    organismRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "<input name='projectOrganism' value='" + organism + "'/>",
+    }));
+
+    var emailRow = new Functions.createElement({
+        type: "div",
+        style: "display:table-row"
+    });
+    table.appendChild(emailRow);
+    emailRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "Notify email",
+    }));
+    var email = "";
+    if (project.getNotifyEmail() !== undefined) {
+        email = project.getNotifyEmail();
+    }
+    emailRow.appendChild(new Functions.createElement({
+        type: "div",
+        style: "display:table-cell",
+        content: "<input name='projectNotifyEmail' value='" + email + "'/>",
+    }));
+
+    var menuRow = Functions.createElement({
+        type: "div",
+        className: "minerva-menu-row",
+        style: "display:table-row; margin:10px",
+    });
+    result.appendChild(menuRow);
+
+    var saveProjectButton = Functions.createElement({
+        type: "button",
+        name: "saveProject",
+        content: '<span class="ui-icon ui-icon-disk"></span>&nbsp;SAVE',
+        onclick: function () {
+            return self.onSaveClicked().then(function () {
+                return self.close();
+            }, GuiConnector.alert);
+        },
+    });
+    var cancelButton = Functions.createElement({
+        type: "button",
+        name: "cancelProject",
+        content: '<span class="ui-icon ui-icon-cancel"></span>&nbsp;CANCEL',
+        onclick: function () {
+            return self.close();
+        },
+    });
+    menuRow.appendChild(saveProjectButton);
+    menuRow.appendChild(cancelButton);
+
+    return result;
 
 };
 
-EditProjectDialog.prototype.createOverlaysTab = function(tabMenuDiv, tabContentDiv) {
-  var self = this;
-  self.addTab({
-    tabMenuDiv : tabMenuDiv,
-    tabContentDiv : tabContentDiv,
-    name : "OVERLAYS",
-    id : self.getProject().getProjectId() + "_overlays_tab",
-    content : self.createOverlaysTabContent(),
-  });
+EditProjectDialog.prototype.createOverlaysTab = function (tabMenuDiv, tabContentDiv) {
+    var self = this;
+    self.addTab({
+        tabMenuDiv: tabMenuDiv,
+        tabContentDiv: tabContentDiv,
+        name: "OVERLAYS",
+        id: self.getProject().getProjectId() + "_overlays_tab",
+        content: self.createOverlaysTabContent(),
+    });
 };
 
-EditProjectDialog.prototype.createOverlaysTabContent = function() {
-  var self = this;
-  var result = Functions.createElement({
-    type : "div",
-  });
-  result.appendChild(self._createOverlayTable());
-  return result;
+EditProjectDialog.prototype.createOverlaysTabContent = function () {
+    var self = this;
+    var result = Functions.createElement({
+        type: "div",
+    });
+    result.appendChild(self._createOverlayTable());
+    return result;
 };
 
-EditProjectDialog.prototype._createOverlayTable = function() {
-  var self = this;
-
-  var result = Functions.createElement({
-    type : "div",
-    style : "margin-top:10px;",
-  });
-
-  var overlaysTable = Functions.createElement({
-    type : "table",
-    name : "overlaysTable",
-    className : "display",
-    style : "width:100%",
-  });
-  result.appendChild(overlaysTable);
-
-  $(overlaysTable).DataTable({
-    fnRowCallback : function(nRow, aData) {
-      nRow.setAttribute('id', "overlay-" + aData[0]);
-    },
-    columns : [ {
-      title : 'Id',
-    }, {
-      title : 'Name',
-    }, {
-      title : 'Description',
-    }, {
-      title : 'Public',
-    }, {
-      title : 'Owner',
-    }, {
-      title : 'Data',
-    }, {
-      title : 'Update',
-    }, {
-      title : 'Remove',
-    }, ],
-    dom : '<"minerva-datatable-toolbar">frtip',
-    initComplete : function() {
-      $("div.minerva-datatable-toolbar", $(result)).html('<button name="addOverlay">Add overlay</button>');
-    },
-
-  });
-
-  $(overlaysTable).on("click", "[name='removeOverlay']", function() {
-    var button = this;
-    return self.removeOverlay($(button).attr("data")).then(null, GuiConnector.alert);
-  });
-
-  $(overlaysTable).on("click", "[name='saveOverlay']", function() {
-    var button = this;
-    GuiConnector.showProcessing("Updating");
-    return self.saveOverlay($(button).attr("data")).then(function() {
-      GuiConnector.hideProcessing();
-      GuiConnector.info("Overlay updated successfully");
-    }, function(error) {
-      GuiConnector.hideProcessing();
-      GuiConnector.alert(error);
-    });
-  });
-
-  $(overlaysTable).on("click", "[name='downloadSource']", function() {
-    var button = this;
-    return ServerConnector.getOverlaySourceDownloadUrl({
-      overlayId : $(button).attr("data")
-    }).then(function(url) {
-      return self.downloadFile(url);
-    }).then(null, GuiConnector.alert);
-  });
-
-  $(result).on("click", "[name='addOverlay']", function() {
-    return self.openAddOverlayDialog();
-  });
-
-  return result;
+EditProjectDialog.prototype._createOverlayTable = function () {
+    var self = this;
+
+    var result = Functions.createElement({
+        type: "div",
+        style: "margin-top:10px;",
+    });
+
+    var overlaysTable = Functions.createElement({
+        type: "table",
+        name: "overlaysTable",
+        className: "display",
+        style: "width:100%",
+    });
+    result.appendChild(overlaysTable);
+
+    $(overlaysTable).DataTable({
+        fnRowCallback: function (nRow, aData) {
+            nRow.setAttribute('id', "overlay-" + aData[0]);
+        },
+        columns: [{
+            title: 'Id',
+        }, {
+            title: 'Name',
+        }, {
+            title: 'Description',
+        }, {
+            title: 'Public',
+        }, {
+            title: 'Owner',
+        }, {
+            title: 'Data',
+        }, {
+            title: 'Update',
+        }, {
+            title: 'Remove',
+        },],
+        dom: '<"minerva-datatable-toolbar">frtip',
+        initComplete: function () {
+            $("div.minerva-datatable-toolbar", $(result)).html('<button name="addOverlay">Add overlay</button>');
+        },
+
+    });
+
+    $(overlaysTable).on("click", "[name='removeOverlay']", function () {
+        var button = this;
+        return self.removeOverlay($(button).attr("data")).then(null, GuiConnector.alert);
+    });
+
+    $(overlaysTable).on("click", "[name='saveOverlay']", function () {
+        var button = this;
+        GuiConnector.showProcessing("Updating");
+        return self.saveOverlay($(button).attr("data")).then(function () {
+            GuiConnector.hideProcessing();
+            GuiConnector.info("Overlay updated successfully");
+        }, function (error) {
+            GuiConnector.hideProcessing();
+            GuiConnector.alert(error);
+        });
+    });
+
+    $(overlaysTable).on("click", "[name='downloadSource']", function () {
+        var button = this;
+        return ServerConnector.getOverlaySourceDownloadUrl({
+            overlayId: $(button).attr("data")
+        }).then(function (url) {
+            return self.downloadFile(url);
+        }).then(null, GuiConnector.alert);
+    });
+
+    $(result).on("click", "[name='addOverlay']", function () {
+        return self.openAddOverlayDialog();
+    });
+
+    return result;
 };
 
-EditProjectDialog.prototype.createUsersTab = function(tabMenuDiv, tabContentDiv) {
-  var self = this;
-  self.addTab({
-    tabMenuDiv : tabMenuDiv,
-    tabContentDiv : tabContentDiv,
-    name : "USERS",
-    id : self.getProject().getProjectId() + "_users_tab",
-    content : self.createUsersTabContent(),
-  });
+EditProjectDialog.prototype.createUsersTab = function (tabMenuDiv, tabContentDiv) {
+    var self = this;
+    self.addTab({
+        tabMenuDiv: tabMenuDiv,
+        tabContentDiv: tabContentDiv,
+        name: "USERS",
+        id: self.getProject().getProjectId() + "_users_tab",
+        content: self.createUsersTabContent(),
+    });
 };
 
-EditProjectDialog.prototype.createUsersTabContent = function() {
-  var self = this;
-
-  var result = Functions.createElement({
-    type : "div",
-    style : "margin-top:10px;",
-  });
-
-  var usersTable = Functions.createElement({
-    type : "table",
-    name : "usersTable",
-    className : "display",
-    style : "width:100%",
-  });
-  result.appendChild(usersTable);
-
-  $(usersTable).on("click", "[name='saveUser']", function() {
-    var button = this;
-    GuiConnector.showProcessing("Updating");
-    return self.saveUser($(button).attr("data")).then(function() {
-      GuiConnector.hideProcessing();
-      GuiConnector.info("User updated successfully");
-    }, function(error) {
-      GuiConnector.hideProcessing();
-      GuiConnector.alert(error);
-    });
-  });
-
-  return result;
+EditProjectDialog.prototype.createUsersTabContent = function () {
+    var self = this;
+
+    var result = Functions.createElement({
+        type: "div",
+        style: "margin-top:10px;",
+    });
+
+    var usersTable = Functions.createElement({
+        type: "table",
+        name: "usersTable",
+        className: "display",
+        style: "width:100%",
+    });
+    result.appendChild(usersTable);
+
+    $(usersTable).on("click", "[name='saveUser']", function () {
+        var button = this;
+        GuiConnector.showProcessing("Updating");
+        return self.saveUser($(button).attr("data")).then(function () {
+            GuiConnector.hideProcessing();
+            GuiConnector.info("User updated successfully");
+        }, function (error) {
+            GuiConnector.hideProcessing();
+            GuiConnector.alert(error);
+        });
+    });
+
+    return result;
 };
 
-EditProjectDialog.prototype.createUserPrivilegeColumns = function() {
-  var self = this;
-
-  if (self._userPrivilegeColumns !== undefined) {
-    return Promise.resolve(self._userPrivilegeColumns);
-  }
-
-  return ServerConnector.getConfiguration().then(function(configuration) {
-    self._userPrivilegeColumns = [ {
-      title : "Name"
-    } ];
-    var privilegeTypes = configuration.getPrivilegeTypes();
-    for (var i = 0; i < privilegeTypes.length; i++) {
-      var type = privilegeTypes[i];
-      if (type.getObjectType() === "Project") {
+EditProjectDialog.prototype.createUserPrivilegeColumns = function () {
+    var self = this;
+
+    if (self._userPrivilegeColumns !== undefined) {
+        return Promise.resolve(self._userPrivilegeColumns);
+    }
+
+    return ServerConnector.getConfiguration().then(function (configuration) {
+        self._userPrivilegeColumns = [{
+            title: "Name"
+        }];
+        var privilegeTypes = configuration.getPrivilegeTypes();
+        for (var i = 0; i < privilegeTypes.length; i++) {
+            var type = privilegeTypes[i];
+            if (type.getObjectType() === "Project") {
+                self._userPrivilegeColumns.push({
+                    "title": type.getCommonName(),
+                    privilegeType: type,
+                });
+            }
+        }
         self._userPrivilegeColumns.push({
-          "title" : type.getCommonName(),
-          privilegeType : type,
+            "title": "Update"
         });
-      }
-    }
-    self._userPrivilegeColumns.push({
-      "title" : "Update"
+        return self._userPrivilegeColumns;
     });
-    return self._userPrivilegeColumns;
-  });
 
 };
 
-EditProjectDialog.prototype.init = function() {
-  var self = this;
-  return self.initUsersTab().then(function() {
-    return self.refreshUsers();
-  }).then(function() {
-    return self.refreshOverlays();
-  }).then(function() {
-    $(window).trigger('resize');
-  });
+EditProjectDialog.prototype.init = function () {
+    var self = this;
+    return self.initUsersTab().then(function () {
+        return self.refreshUsers();
+    }).then(function () {
+        return self.refreshOverlays();
+    }).then(function () {
+        $(window).trigger('resize');
+    });
 };
 
-EditProjectDialog.prototype.initUsersTab = function() {
-  var self = this;
+EditProjectDialog.prototype.initUsersTab = function () {
+    var self = this;
 
-  var usersTable = $("[name=usersTable]", self.getElement())[0];
+    var usersTable = $("[name=usersTable]", self.getElement())[0];
 
-  return self.createUserPrivilegeColumns().then(function(columns) {
-    $(usersTable).DataTable({
-      columns : columns,
+    return self.createUserPrivilegeColumns().then(function (columns) {
+        $(usersTable).DataTable({
+            columns: columns,
+        });
     });
-  });
 };
 
-EditProjectDialog.prototype.refreshOverlays = function() {
-  var self = this;
-  return ServerConnector.getOverlays({
-    projectId : self.getProject().getProjectId()
-  }).then(function(overlays) {
-    return self.setOverlays(overlays);
-  });
+EditProjectDialog.prototype.refreshOverlays = function () {
+    var self = this;
+    return ServerConnector.getOverlays({
+        projectId: self.getProject().getProjectId()
+    }).then(function (overlays) {
+        return self.setOverlays(overlays);
+    });
 };
 
-EditProjectDialog.prototype.refreshUsers = function() {
-  var self = this;
-  return ServerConnector.getUsers().then(function(users) {
-    return self.setUsers(users);
-  });
+EditProjectDialog.prototype.refreshUsers = function () {
+    var self = this;
+    return ServerConnector.getUsers().then(function (users) {
+        return self.setUsers(users);
+    });
 };
 
-EditProjectDialog.prototype.setOverlays = function(overlays) {
-  var self = this;
-  self._overlayById = [];
-  return ServerConnector.getUsers().then(function(users) {
-    var dataTable = $($("[name='overlaysTable']", self.getElement())[0]).DataTable();
-    var data = [];
-    for (var i = 0; i < overlays.length; i++) {
-      var overlay = overlays[i];
-      self._overlayById[overlay.getId()] = overlay;
-      var rowData = self.overlayToTableRow(overlay, users);
-      data.push(rowData);
-    }
-    dataTable.clear().rows.add(data).draw();
-  });
+EditProjectDialog.prototype.setOverlays = function (overlays) {
+    var self = this;
+    self._overlayById = [];
+    return ServerConnector.getUsers().then(function (users) {
+        var dataTable = $($("[name='overlaysTable']", self.getElement())[0]).DataTable();
+        var data = [];
+        for (var i = 0; i < overlays.length; i++) {
+            var overlay = overlays[i];
+            self._overlayById[overlay.getId()] = overlay;
+            var rowData = self.overlayToTableRow(overlay, users);
+            data.push(rowData);
+        }
+        dataTable.clear().rows.add(data).draw();
+    });
 };
 
-EditProjectDialog.prototype.setUsers = function(users) {
-  var self = this;
-  self._userByLogin = [];
-  return self.createUserPrivilegeColumns().then(function(columns) {
-    var dataTable = $($("[name='usersTable']", self.getElement())[0]).DataTable();
-    var data = [];
-    for (var i = 0; i < users.length; i++) {
-      var user = users[i];
-      self._userByLogin[user.getLogin()] = user;
-      var rowData = self.userToTableRow(user, columns);
-      data.push(rowData);
-    }
-    dataTable.clear().rows.add(data).draw();
-  });
+EditProjectDialog.prototype.setUsers = function (users) {
+    var self = this;
+    self._userByLogin = [];
+    return self.createUserPrivilegeColumns().then(function (columns) {
+        var dataTable = $($("[name='usersTable']", self.getElement())[0]).DataTable();
+        var data = [];
+        for (var i = 0; i < users.length; i++) {
+            var user = users[i];
+            self._userByLogin[user.getLogin()] = user;
+            var rowData = self.userToTableRow(user, columns);
+            data.push(rowData);
+        }
+        dataTable.clear().rows.add(data).draw();
+    });
 };
 
-EditProjectDialog.prototype.userToTableRow = function(user, columns) {
-  var self = this;
-  var row = [];
-  var login = user.getLogin();
-
-  row[0] = user.getName() + " " + user.getSurname() + " (" + login + ")";
-  for (var i = 1; i < columns.length; i++) {
-    var column = columns[i];
-    if (column.privilegeType !== undefined) {
-      if (column.privilegeType.getValueType() === "boolean") {
-        var checked = '';
-        if (user.hasPrivilege(column.privilegeType, self.getProject().getId())) {
-          checked = 'checked';
+EditProjectDialog.prototype.userToTableRow = function (user, columns) {
+    var self = this;
+    var row = [];
+    var login = user.getLogin();
+
+    row[0] = user.getName() + " " + user.getSurname() + " (" + login + ")";
+    for (var i = 1; i < columns.length; i++) {
+        var column = columns[i];
+        if (column.privilegeType !== undefined) {
+            if (column.privilegeType.getValueType() === "boolean") {
+                var checked = '';
+                if (user.hasPrivilege(column.privilegeType, self.getProject().getId())) {
+                    checked = 'checked';
+                }
+                row[i] = "<input type='checkbox' name='privilege-" + login + "' data='" + column.privilegeType.getName() + "' "
+                    + checked + "/>";
+            } else {
+                throw new Error("Unsupported type: " + column.privilegeType.getValueType());
+            }
         }
-        row[i] = "<input type='checkbox' name='privilege-" + login + "' data='" + column.privilegeType.getName() + "' "
-            + checked + "/>";
-      } else {
-        throw new Error("Unsupported type: " + column.privilegeType.getValueType());
-      }
     }
-  }
 
-  row.push("<button name='saveUser' data='" + login + "'>SAVE</button>");
+    row.push("<button name='saveUser' data='" + login + "'>SAVE</button>");
 
-  return row;
+    return row;
 };
 
-EditProjectDialog.prototype.overlayToTableRow = function(overlay, users) {
-  var row = [];
-  var id = overlay.getId();
-  var creatorSelect;
-  if (overlay.getCreator() === "") {
-    creatorSelect = "<select name='creator-" + id + "' value=''>";
-  } else {
-    creatorSelect = "<select name='creator-" + id + "'>";
-  }
-
-  creatorSelect += "<option value='' >---</option>";
-  for (var i = 0; i < users.length; i++) {
-    var selected = "";
-    var user = users[i];
-    if (overlay.getCreator() === user.getLogin()) {
-      selected = "selected";
+EditProjectDialog.prototype.overlayToTableRow = function (overlay, users) {
+    var row = [];
+    var id = overlay.getId();
+    var creatorSelect;
+    if (overlay.getCreator() === "") {
+        creatorSelect = "<select name='creator-" + id + "' value=''>";
+    } else {
+        creatorSelect = "<select name='creator-" + id + "'>";
+    }
+
+    creatorSelect += "<option value='' >---</option>";
+    for (var i = 0; i < users.length; i++) {
+        var selected = "";
+        var user = users[i];
+        if (overlay.getCreator() === user.getLogin()) {
+            selected = "selected";
+        } else {
+            selected = "";
+        }
+
+        creatorSelect += "<option value='" + user.getLogin() + "' " + selected + ">" + user.getLogin() + "("
+            + user.getName() + " " + user.getSurname() + ")</option>";
+    }
+    creatorSelect += "</select>";
+
+    var checked = '';
+    if (overlay.getPublicOverlay()) {
+        checked = "checked";
+    }
+    var publicOverlayCheckbox = "<input type='checkbox' name='publicOverlay-" + id + "' " + checked + "/>";
+
+    var downloadSourceButton;
+    if (overlay.getInputDataAvailable()) {
+        downloadSourceButton = "<button name='downloadSource' data='" + id + "'>"
+            + "<span class='ui-icon ui-icon-arrowthickstop-1-s'></span>" + "</button>";
     } else {
-      selected = "";
+        downloadSourceButton = "N/A";
     }
 
-    creatorSelect += "<option value='" + user.getLogin() + "' " + selected + ">" + user.getLogin() + "("
-        + user.getName() + " " + user.getSurname() + ")</option>";
-  }
-  creatorSelect += "</select>";
-
-  var checked = '';
-  if (overlay.getPublicOverlay()) {
-    checked = "checked";
-  }
-  var publicOverlayCheckbox = "<input type='checkbox' name='publicOverlay-" + id + "' " + checked + "/>";
-
-  var downloadSourceButton;
-  if (overlay.getInputDataAvailable()) {
-    downloadSourceButton = "<button name='downloadSource' data='" + id + "'>"
-        + "<span class='ui-icon ui-icon-arrowthickstop-1-s'></span>" + "</button>";
-  } else {
-    downloadSourceButton = "N/A";
-  }
-
-  row[0] = id;
-  row[1] = "<input name='name-" + id + "' value='" + overlay.getName() + "'/>";
-  row[2] = "<input name='description-" + id + "' value='" + overlay.getDescription() + "'/>";
-  row[3] = publicOverlayCheckbox;
-  row[4] = creatorSelect;
-  row[5] = downloadSourceButton;
-  row[6] = "<button name='saveOverlay' data='" + id + "'>SAVE</button>";
-  row[7] = "<button name='removeOverlay' data='" + id + "'>REMOVE</button>";
-
-  return row;
+    row[0] = id;
+    row[1] = "<input name='name-" + id + "' value='" + overlay.getName() + "'/>";
+    row[2] = "<input name='description-" + id + "' value='" + overlay.getDescription() + "'/>";
+    row[3] = publicOverlayCheckbox;
+    row[4] = creatorSelect;
+    row[5] = downloadSourceButton;
+    row[6] = "<button name='saveOverlay' data='" + id + "'>SAVE</button>";
+    row[7] = "<button name='removeOverlay' data='" + id + "'>REMOVE</button>";
+
+    return row;
 };
 
-EditProjectDialog.prototype.destroy = function() {
-  $(this.getElement()).dialog("destroy");
+EditProjectDialog.prototype.destroy = function () {
+    var self = this;
+    var div = self.getElement();
+    if ($(div).hasClass("ui-dialog-content")) {
+        $(div).dialog("destroy");
+    }
+    if (self._addOverlayDialog !== undefined) {
+        self._addOverlayDialog.destroy();
+        delete self._addOverlayDialog;
+    }
 };
 
-EditProjectDialog.prototype.open = function() {
-  var self = this;
-  var div = self.getElement();
-  if (!$(div).hasClass("ui-dialog-content")) {
-    $(div).dialog({
-      title : self.getProject().getProjectId(),
-      width : window.innerWidth / 2,
-      height : window.innerHeight / 2,
-    });
-  }
-  $(div).dialog("open");
+EditProjectDialog.prototype.open = function () {
+    var self = this;
+    var div = self.getElement();
+    if (!$(div).hasClass("ui-dialog-content")) {
+        $(div).dialog({
+            title: self.getProject().getProjectId(),
+            width: window.innerWidth / 2,
+            height: window.innerHeight / 2,
+        });
+    }
+    $(div).dialog("open");
 };
 
-var prepareMiriamData = function(type, resource) {
-  if (resource === "" || resource === undefined || resource === null) {
-    return null;
-  } else {
-    return new Annotation({
-      type : type,
-      resource : resource
-    });
-  }
+var prepareMiriamData = function (type, resource) {
+    if (resource === "" || resource === undefined || resource === null) {
+        return null;
+    } else {
+        return new Annotation({
+            type: type,
+            resource: resource
+        });
+    }
 };
 
-EditProjectDialog.prototype.onSaveClicked = function() {
-  var self = this;
-  var project = self.getProject();
-  var element = self.getElement();
-  project.setName($("[name='projectName']", element)[0].value);
-  project.setVersion($("[name='projectVersion']", element)[0].value);
-  project.setNotifyEmail($("[name='projectNotifyEmail']", element)[0].value);
-  var organism = prepareMiriamData("TAXONOMY", $("[name='projectOrganism']", element)[0].value);
-  project.setOrganism(organism);
-  var disease = prepareMiriamData("MESH_2012", $("[name='projectDisease']", element)[0].value);
-  project.setDisease(disease);
-  return ServerConnector.updateProject(project);
+EditProjectDialog.prototype.onSaveClicked = function () {
+    var self = this;
+    var project = self.getProject();
+    var element = self.getElement();
+    project.setName($("[name='projectName']", element)[0].value);
+    project.setVersion($("[name='projectVersion']", element)[0].value);
+    project.setNotifyEmail($("[name='projectNotifyEmail']", element)[0].value);
+    var organism = prepareMiriamData("TAXONOMY", $("[name='projectOrganism']", element)[0].value);
+    project.setOrganism(organism);
+    var disease = prepareMiriamData("MESH_2012", $("[name='projectDisease']", element)[0].value);
+    project.setDisease(disease);
+    return ServerConnector.updateProject(project);
 };
-EditProjectDialog.prototype.close = function() {
-  var self = this;
-  $(self.getElement()).dialog("close");
+EditProjectDialog.prototype.close = function () {
+    var self = this;
+    $(self.getElement()).dialog("close");
 };
 
-EditProjectDialog.prototype.saveOverlay = function(overlayId) {
-  var self = this;
-  var overlay = self._overlayById[overlayId];
-  overlay.setName($("[name='name-" + overlayId + "']", self.getElement())[0].value);
-  overlay.setDescription($("[name='description-" + overlayId + "']", self.getElement())[0].value);
-  overlay.setPublicOverlay($("[name='publicOverlay-" + overlayId + "']", self.getElement())[0].checked);
-  overlay.setCreator($("[name='creator-" + overlayId + "']", self.getElement())[0].value);
+EditProjectDialog.prototype.saveOverlay = function (overlayId) {
+    var self = this;
+    var overlay = self._overlayById[overlayId];
+    overlay.setName($("[name='name-" + overlayId + "']", self.getElement())[0].value);
+    overlay.setDescription($("[name='description-" + overlayId + "']", self.getElement())[0].value);
+    overlay.setPublicOverlay($("[name='publicOverlay-" + overlayId + "']", self.getElement())[0].checked);
+    overlay.setCreator($("[name='creator-" + overlayId + "']", self.getElement())[0].value);
 
-  return ServerConnector.updateOverlay(overlay);
+    return ServerConnector.updateOverlay(overlay);
 };
 
-EditProjectDialog.prototype.saveUser = function(login) {
-  var self = this;
-  var checkboxes = $("[name='privilege-" + login + "']", self.getElement());
-  var privileges = {};
-  for (var i = 0; i < checkboxes.length; i++) {
-    var checkbox = checkboxes[i];
-    var privilege = {};
-    privilege[self.getProject().getId()] =  checkbox.checked;
-    privileges[$(checkbox).attr("data")]= privilege;
-  }
-
-  return ServerConnector.updateUserPrivileges({
-    user : self._userByLogin[login],
-    privileges : privileges
-  });
+EditProjectDialog.prototype.saveUser = function (login) {
+    var self = this;
+    var checkboxes = $("[name='privilege-" + login + "']", self.getElement());
+    var privileges = {};
+    for (var i = 0; i < checkboxes.length; i++) {
+        var checkbox = checkboxes[i];
+        var privilege = {};
+        privilege[self.getProject().getId()] = checkbox.checked;
+        privileges[$(checkbox).attr("data")] = privilege;
+    }
+
+    return ServerConnector.updateUserPrivileges({
+        user: self._userByLogin[login],
+        privileges: privileges
+    });
 };
 
-EditProjectDialog.prototype.removeOverlay = function(overlayId) {
-  var self = this;
-  return ServerConnector.removeOverlay({
-    overlayId : overlayId
-  }).then(function() {
-    return self.refreshOverlays();
-  });
+EditProjectDialog.prototype.removeOverlay = function (overlayId) {
+    var self = this;
+    return ServerConnector.removeOverlay({
+        overlayId: overlayId
+    }).then(function () {
+        return self.refreshOverlays();
+    });
 };
 
-EditProjectDialog.prototype.openAddOverlayDialog = function() {
-  var self = this;
-  var addOverlayDialog = new AddOverlayDialog({
-    project : self.getProject(),
-    customMap : null,
-    element : document.createElement("div"),
-  });
-  addOverlayDialog.addListener("onAddOverlay", function() {
-    return self.refreshOverlays();
-  });
-  return addOverlayDialog.init().then(function() {
-    return addOverlayDialog.open();
-  });
+EditProjectDialog.prototype.openAddOverlayDialog = function () {
+    var self = this;
+    if (self._addOverlayDialog !== undefined) {
+        self._addOverlayDialog.destroy();
+    }
+    self._addOverlayDialog = new AddOverlayDialog({
+        project: self.getProject(),
+        customMap: null,
+        element: document.createElement("div"),
+    });
+    self._addOverlayDialog.addListener("onAddOverlay", function () {
+        return self.refreshOverlays();
+    });
+    return self._addOverlayDialog.init().then(function () {
+        return self._addOverlayDialog.open();
+    });
 };
 
 module.exports = EditProjectDialog;
diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
index 47c4e2ce94..29efb960b4 100644
--- a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
@@ -13,257 +13,265 @@ var GuiConnector = require('../../GuiConnector');
 var Promise = require("bluebird");
 
 function MapsAdminPanel(params) {
-  var self = this;
-  AbstractAdminPanel.call(self, params);
-  self._createGui();
+    var self = this;
+    AbstractAdminPanel.call(self, params);
+    self._createGui();
 
-  $(self.getElement()).addClass("minerva-projects-tab");
+    $(self.getElement()).addClass("minerva-projects-tab");
 
 }
 
 MapsAdminPanel.prototype = Object.create(AbstractAdminPanel.prototype);
 MapsAdminPanel.prototype.constructor = MapsAdminPanel;
 
-MapsAdminPanel.prototype._createGui = function() {
-  var self = this;
-  var projectsDiv = Functions.createElement({
-    type : "div",
-  });
-  self.getElement().appendChild(projectsDiv);
+MapsAdminPanel.prototype._createGui = function () {
+    var self = this;
+    var projectsDiv = Functions.createElement({
+        type: "div",
+    });
+    self.getElement().appendChild(projectsDiv);
 
-  var dataDiv = Functions.createElement({
-    type : "div",
-    style : "display:table; width:100%",
-  });
-  projectsDiv.appendChild(dataDiv);
+    var dataDiv = Functions.createElement({
+        type: "div",
+        style: "display:table; width:100%",
+    });
+    projectsDiv.appendChild(dataDiv);
 
-  dataDiv.appendChild(self._createMenuRow());
-  dataDiv.appendChild(self._createProjectTableRow());
-  dataDiv.appendChild(self._createMenuRow());
+    dataDiv.appendChild(self._createMenuRow());
+    dataDiv.appendChild(self._createProjectTableRow());
+    dataDiv.appendChild(self._createMenuRow());
 
 };
 
-MapsAdminPanel.prototype._createMenuRow = function() {
-  var self = this;
-  var menuRow = Functions.createElement({
-    type : "div",
-    className : "minerva-menu-row",
-    style : "display:table-row; margin:10px",
-  });
-
-  var addProjectButton = Functions.createElement({
-    type : "button",
-    name : "addProject",
-    content : '<span class="ui-icon ui-icon-circle-plus"></span>&nbsp;ADD PROJECT',
-    onclick : function() {
-      return self.onAddClicked().then(null, GuiConnector.alert);
-    },
-  });
-  var refreshButton = Functions.createElement({
-    type : "button",
-    name : "refreshProject",
-    content : '<span class="ui-icon ui-icon-refresh"></span>&nbsp;REFRESH',
-    onclick : function() {
-      return self.onRefreshClicked().then(null, GuiConnector.alert);
-    },
-  });
-  menuRow.appendChild(addProjectButton);
-  menuRow.appendChild(refreshButton);
-  return menuRow;
+MapsAdminPanel.prototype._createMenuRow = function () {
+    var self = this;
+    var menuRow = Functions.createElement({
+        type: "div",
+        className: "minerva-menu-row",
+        style: "display:table-row; margin:10px",
+    });
+
+    var addProjectButton = Functions.createElement({
+        type: "button",
+        name: "addProject",
+        content: '<span class="ui-icon ui-icon-circle-plus"></span>&nbsp;ADD PROJECT',
+        onclick: function () {
+            return self.onAddClicked().then(null, GuiConnector.alert);
+        },
+    });
+    var refreshButton = Functions.createElement({
+        type: "button",
+        name: "refreshProject",
+        content: '<span class="ui-icon ui-icon-refresh"></span>&nbsp;REFRESH',
+        onclick: function () {
+            return self.onRefreshClicked().then(null, GuiConnector.alert);
+        },
+    });
+    menuRow.appendChild(addProjectButton);
+    menuRow.appendChild(refreshButton);
+    return menuRow;
 };
 
-MapsAdminPanel.prototype._createProjectTableRow = function() {
-  var self = this;
-  var projectsRow = Functions.createElement({
-    type : "div",
-    style : "display:table-row; width:100%",
-  });
-
-  var projectsTable = Functions.createElement({
-    type : "table",
-    name : "projectsTable",
-    className : "display",
-    style : "width:100%",
-  });
-  projectsRow.appendChild(projectsTable);
-
-  $(projectsTable).DataTable({
-    fnRowCallback : function(nRow, aData) {
-      nRow.setAttribute('id', aData[0]);
-    },
-    columns : [ {
-      title : 'ProjectId',
-    }, {
-      title : 'Name',
-    }, {
-      title : 'Disease',
-    }, {
-      title : 'Organism',
-    }, {
-      title : 'Status',
-    }, {
-      title : 'Edit',
-    }, {
-      title : 'Remove',
-    }, ],
-  });
-  $(projectsTable).on("click", "[name='removeProject']", function() {
-    var button = this;
-    return self.removeProject($(button).attr("data")).then(null, GuiConnector.alert);
-  });
-
-  $(projectsTable).on("click", "[name='showEditDialog']", function() {
-    var button = this;
-    return self.showEditDialog($(button).attr("data")).then(null, GuiConnector.alert);
-  });
-
-  return projectsRow;
+MapsAdminPanel.prototype._createProjectTableRow = function () {
+    var self = this;
+    var projectsRow = Functions.createElement({
+        type: "div",
+        style: "display:table-row; width:100%",
+    });
+
+    var projectsTable = Functions.createElement({
+        type: "table",
+        name: "projectsTable",
+        className: "display",
+        style: "width:100%",
+    });
+    projectsRow.appendChild(projectsTable);
+
+    $(projectsTable).DataTable({
+        fnRowCallback: function (nRow, aData) {
+            nRow.setAttribute('id', aData[0]);
+        },
+        columns: [{
+            title: 'ProjectId',
+        }, {
+            title: 'Name',
+        }, {
+            title: 'Disease',
+        }, {
+            title: 'Organism',
+        }, {
+            title: 'Status',
+        }, {
+            title: 'Edit',
+        }, {
+            title: 'Remove',
+        },],
+    });
+    $(projectsTable).on("click", "[name='removeProject']", function () {
+        var button = this;
+        return self.removeProject($(button).attr("data")).then(null, GuiConnector.alert);
+    });
+
+    $(projectsTable).on("click", "[name='showEditDialog']", function () {
+        var button = this;
+        return self.showEditDialog($(button).attr("data")).then(null, GuiConnector.alert);
+    });
+
+    return projectsRow;
 };
 
-MapsAdminPanel.prototype.init = function() {
-  var self = this;
-  return ServerConnector.getProjects().then(function(projects) {
-    return self.setProjects(projects);
-  }).then(function() {
-    $(window).trigger('resize');
-  });
+MapsAdminPanel.prototype.init = function () {
+    var self = this;
+    return ServerConnector.getProjects().then(function (projects) {
+        return self.setProjects(projects);
+    }).then(function () {
+        $(window).trigger('resize');
+    });
 };
 
-MapsAdminPanel.prototype.projectToTableRow = function(project, row) {
-  var self = this;
-  var disease = self.getHtmlStringLink(project.getDisease());
-  var organism = self.getHtmlStringLink(project.getOrganism());
-
-  if (row === undefined) {
-    row = [];
-  }
-  row[0] = project.getProjectId();
-  row[1] = project.getName();
-  row[2] = disease;
-  row[3] = organism;
-  row[4] = project.getStatus();
-  row[5] = "<button name='showEditDialog' data='" + project.getProjectId() + "'>EDIT</button>";
-  row[6] = "<button name='removeProject' data='" + project.getProjectId() + "'>REMOVE</button>";
-
-  return row;
+MapsAdminPanel.prototype.projectToTableRow = function (project, row) {
+    var self = this;
+    var disease = self.getHtmlStringLink(project.getDisease());
+    var organism = self.getHtmlStringLink(project.getOrganism());
+
+    if (row === undefined) {
+        row = [];
+    }
+    row[0] = project.getProjectId();
+    row[1] = project.getName();
+    row[2] = disease;
+    row[3] = organism;
+    row[4] = project.getStatus();
+    row[5] = "<button name='showEditDialog' data='" + project.getProjectId() + "'>EDIT</button>";
+    row[6] = "<button name='removeProject' data='" + project.getProjectId() + "'>REMOVE</button>";
+
+    return row;
 };
 
-MapsAdminPanel.prototype.getHtmlStringLink = function(annotation) {
-  var self = this;
-  if (annotation !== undefined && annotation !== null) {
-    var link = self.getGuiUtils().createAnnotationLink(annotation, true);
-    var tmp = document.createElement("div");
-    tmp.appendChild(link);
-    return tmp.innerHTML;
-  } else {
-    return "N/A";
-  }
+MapsAdminPanel.prototype.getHtmlStringLink = function (annotation) {
+    var self = this;
+    if (annotation !== undefined && annotation !== null) {
+        var link = self.getGuiUtils().createAnnotationLink(annotation, true);
+        var tmp = document.createElement("div");
+        tmp.appendChild(link);
+        return tmp.innerHTML;
+    } else {
+        return "N/A";
+    }
 
 };
 
-MapsAdminPanel.prototype.setProjects = function(projects) {
-  var self = this;
-  var dataTable = $($("[name='projectsTable']", self.getElement())[0]).DataTable();
-  var data = [];
-  for (var i = 0; i < projects.length; i++) {
-    var project = projects[i];
-    var rowData = self.projectToTableRow(project);
-    self.addUpdateListener(project, rowData);
-    data.push(rowData);
-  }
-  dataTable.clear().rows.add(data).draw();
+MapsAdminPanel.prototype.setProjects = function (projects) {
+    var self = this;
+    var dataTable = $($("[name='projectsTable']", self.getElement())[0]).DataTable();
+    var data = [];
+    for (var i = 0; i < projects.length; i++) {
+        var project = projects[i];
+        var rowData = self.projectToTableRow(project);
+        self.addUpdateListener(project, rowData);
+        data.push(rowData);
+    }
+    dataTable.clear().rows.add(data).draw();
 };
 
-MapsAdminPanel.prototype.addUpdateListener = function(project, dataTableRow) {
-  var self = this;
+MapsAdminPanel.prototype.addUpdateListener = function (project, dataTableRow) {
+    var self = this;
 
-  var listenerName = "PROJECT_LIST_LISTENER";
-  var listeners = project.getListeners("onreload");
-  for (var i = 0; i < listeners.length; i++) {
-    if (listeners[i].listenerName === listenerName) {
-      project.removeListener("onreload", listeners[i]);
+    var listenerName = "PROJECT_LIST_LISTENER";
+    var listeners = project.getListeners("onreload");
+    for (var i = 0; i < listeners.length; i++) {
+        if (listeners[i].listenerName === listenerName) {
+            project.removeListener("onreload", listeners[i]);
+        }
     }
-  }
-  var listener = function() {
-    self.projectToTableRow(project, dataTableRow);
-    var row = $($("[name='projectsTable']", self.getElement())[0]).DataTable().row("#" + project.getProjectId());
-    if (row.length > 0) {
-      row.data(dataTableRow).draw();
+    var listener = function () {
+        self.projectToTableRow(project, dataTableRow);
+        var row = $($("[name='projectsTable']", self.getElement())[0]).DataTable().row("#" + project.getProjectId());
+        if (row.length > 0) {
+            row.data(dataTableRow).draw();
+        }
+
+    };
+    listener.listenerName = listenerName;
+    project.addListener("onreload", listener);
+};
+
+MapsAdminPanel.prototype.onAddClicked = function () {
+    var self = this;
+    var dialog = self._addDialog;
+    if (dialog === undefined) {
+        dialog = new AddProjectDialog({
+            element: Functions.createElement({
+                type: "div"
+            }),
+            customMap: null,
+        });
+        self._addDialog = dialog;
+        return dialog.init().then(function () {
+            return dialog.open();
+        });
+    } else {
+        dialog.clear();
+        dialog.open();
+        return Promise.resolve();
     }
+};
 
-  };
-  listener.listenerName = listenerName;
-  project.addListener("onreload", listener);
+MapsAdminPanel.prototype.destroy = function () {
+    var self = this;
+    var dialog = self._addDialog;
+    if (dialog !== undefined) {
+        dialog.destroy();
+    }
 };
 
-MapsAdminPanel.prototype.onAddClicked = function() {
-  var self = this;
-  var dialog = self._addDialog;
-  if (dialog === undefined) {
-    dialog = new AddProjectDialog({
-      element : Functions.createElement({
-        type : "div"
-      }),
-      customMap : null,
-    });
-    self._addDialog = dialog;
-    return dialog.init().then(function() {
-      return dialog.open();
+MapsAdminPanel.prototype.onRefreshClicked = function () {
+    var self = this;
+    return ServerConnector.getProjects(true).then(function (projects) {
+        return self.setProjects(projects);
     });
-  } else {
-    dialog.clear();
-    dialog.open();
-    return Promise.resolve();
-  }
 };
 
-MapsAdminPanel.prototype.onRefreshClicked = function() {
-  var self = this;
-  return ServerConnector.getProjects(true).then(function(projects) {
-    return self.setProjects(projects);
-  });
+MapsAdminPanel.prototype.getDialog = function (project) {
+    var self = this;
+    if (self._dialogs === undefined) {
+        self._dialogs = [];
+    }
+    var dialog = self._dialogs[project.getProjectId()];
+    if (dialog === undefined) {
+        dialog = new EditProjectDialog({
+            element: Functions.createElement({
+                type: "div"
+            }),
+            project: project,
+            customMap: null,
+        });
+        self._dialogs[project.getProjectId()] = dialog;
+        return dialog.init().then(function () {
+            return dialog;
+        });
+    } else {
+        return Promise.resolve(dialog);
+    }
 };
 
-MapsAdminPanel.prototype.getDialog = function(project) {
-  var self = this;
-  if (self._dialogs === undefined) {
-    self._dialogs = [];
-  }
-  var dialog = self._dialogs[project.getProjectId()];
-  if (dialog === undefined) {
-    dialog = new EditProjectDialog({
-      element : Functions.createElement({
-        type : "div"
-      }),
-      project : project,
-      customMap : null,
+MapsAdminPanel.prototype.showEditDialog = function (id) {
+    var self = this;
+    GuiConnector.showProcessing();
+    return ServerConnector.getProject(id).then(function (project) {
+        return self.getDialog(project);
+    }).then(function (dialog) {
+
+        dialog.open();
+        GuiConnector.hideProcessing();
+    }).then(null, function (error) {
+        GuiConnector.hideProcessing();
+        return Promise.reject(error);
     });
-    self._dialogs[project.getProjectId()] = dialog;
-    return dialog.init().then(function() {
-      return dialog;
-    });
-  } else {
-    return Promise.resolve(dialog);
-  }
-};
-
-MapsAdminPanel.prototype.showEditDialog = function(id) {
-  var self = this;
-  GuiConnector.showProcessing();
-  return ServerConnector.getProject(id).then(function(project) {
-    return self.getDialog(project);
-  }).then(function(dialog) {
-
-    dialog.open();
-    GuiConnector.hideProcessing();
-  }).then(null, function(error) {
-    GuiConnector.hideProcessing();
-    return Promise.reject(error);
-  });
 };
 
-MapsAdminPanel.prototype.removeProject = function(id) {
-  return Promise.reject(new Error("Not implemented"));
+MapsAdminPanel.prototype.removeProject = function (id) {
+    return Promise.reject(new Error("Not implemented"));
 };
 
 module.exports = MapsAdminPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js b/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js
index b927d2f85c..ef5fafe663 100644
--- a/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js
@@ -18,12 +18,11 @@ function ChemicalPanel(params) {
     + '<p>separate multiple search by semicolon';
   params.placeholder = "full chemical name (CTD)";
 
+    AbstractDbPanel.call(this, params);
 
-  AbstractDbPanel.call(this, params);
-
-  if (this.getMap().getProject().getDisease() === undefined) {
-    this.disablePanel("DISEASE NOT DEFINED FOR PROJECT. PLEASE, DEFINE IT IN THE ADMIN SECTION.");
-  }
+    if (this.getMap().getProject().getDisease() === undefined) {
+        this.disablePanel("DISEASE NOT DEFINED FOR PROJECT. PLEASE, DEFINE IT IN THE ADMIN SECTION.");
+    }
 }
 
 ChemicalPanel.prototype = Object.create(AbstractDbPanel.prototype);
@@ -45,27 +44,30 @@ ChemicalPanel.prototype.createPreamble = function (chemical) {
     result.appendChild(guiUtils.createNewLine());
   }
 
-  return result;
+    return result;
 };
 
 ChemicalPanel.prototype.createTableElement = function (target, icon) {
-  return this.createTargetRow(target, icon);
+    return this.createTargetRow(target, icon);
 };
 
 ChemicalPanel.prototype.searchByQuery = function () {
-  var self = this;
-  var query = self.getControlElement(PanelControlElementType.SEARCH_INPUT).value;
+    var self = this;
+    var query = self.getControlElement(PanelControlElementType.SEARCH_INPUT).value;
 
-  return self.getOverlayDb().searchByQuery(query);
+    return self.getOverlayDb().searchByQuery(query);
 };
 
 ChemicalPanel.prototype.init = function () {
-  var query = ServerConnector.getSessionData().getChemicalQuery();
-  if (query !== undefined) {
-    return this.getOverlayDb().searchByEncodedQuery(query);
-  } else {
-    return Promise.resolve();
-  }
+    var query = ServerConnector.getSessionData().getChemicalQuery();
+    if (query !== undefined) {
+        return this.getOverlayDb().searchByEncodedQuery(query);
+    } else {
+        return Promise.resolve();
+    }
 };
 
+ChemicalPanel.prototype.destroy = function () {
+    return Promise.resolve();
+};
 module.exports = ChemicalPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js b/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js
index a5f84ab26d..1b67a5116e 100644
--- a/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js
@@ -58,4 +58,8 @@ DrugPanel.prototype.init = function() {
   }
 };
 
+DrugPanel.prototype.destroy = function () {
+    return Promise.resolve();
+};
+
 module.exports = DrugPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
index a8ae7a7e41..4c8be9c50c 100644
--- a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
@@ -21,121 +21,121 @@ var Functions = require('../../Functions');
 var logger = require('../../logger');
 
 function LeftPanel(params) {
-  AbstractGuiElement.call(this, params);
-  var self = this;
+    AbstractGuiElement.call(this, params);
+    var self = this;
 
-  this._tabIdCount = 0;
-  this._panels = [];
+    this._tabIdCount = 0;
+    this._panels = [];
 
-  self._createPanelGui();
+    self._createPanelGui();
 
 }
 
 LeftPanel.prototype = Object.create(AbstractGuiElement.prototype);
 LeftPanel.prototype.constructor = LeftPanel;
 
-LeftPanel.prototype._createPanelGui = function() {
-  var self = this;
-  var panels = self.getPanelsDefinition();
+LeftPanel.prototype._createPanelGui = function () {
+    var self = this;
+    var panels = self.getPanelsDefinition();
 
-  var headerDiv = Functions.createElement({
-    type : "div",
-    id : "headerPanel"
-  });
-  var header = new Header({
-    element : headerDiv,
-    customMap : self.getMap(),
-  });
-  self.getElement().appendChild(headerDiv);
+    var headerDiv = Functions.createElement({
+        type: "div",
+        id: "headerPanel"
+    });
+    var header = new Header({
+        element: headerDiv,
+        customMap: self.getMap(),
+    });
+    self.getElement().appendChild(headerDiv);
 
-  var loginDialogDiv = Functions.createElement({
-    type : "div",
-    name : "loginDialog",
-    style : "display:none",
-  });
-  self.getElement().appendChild(loginDialogDiv);
-  this.setLoginDialog(new LoginDialog({
-    element : loginDialogDiv,
-    customMap : self.getMap(),
-  }));
-
-  var tabDiv = Functions.createElement({
-    type : "div",
-    name : "tabView",
-    className : "tabbable boxed parentTabs"
-  });
-  self.getElement().appendChild(tabDiv);
+    var loginDialogDiv = Functions.createElement({
+        type: "div",
+        name: "loginDialog",
+        style: "display:none",
+    });
+    self.getElement().appendChild(loginDialogDiv);
+    this.setLoginDialog(new LoginDialog({
+        element: loginDialogDiv,
+        customMap: self.getMap(),
+    }));
+
+    var tabDiv = Functions.createElement({
+        type: "div",
+        name: "tabView",
+        className: "tabbable boxed parentTabs"
+    });
+    self.getElement().appendChild(tabDiv);
 
-  var tabMenuDiv = Functions.createElement({
-    type : "ul",
-    className : "nav nav-tabs"
-  });
-  tabDiv.appendChild(tabMenuDiv);
+    var tabMenuDiv = Functions.createElement({
+        type: "ul",
+        className: "nav nav-tabs"
+    });
+    tabDiv.appendChild(tabMenuDiv);
 
-  var tabContentDiv = Functions.createElement({
-    type : "div",
-    className : "tab-content"
-  });
-  tabDiv.appendChild(tabContentDiv);
+    var tabContentDiv = Functions.createElement({
+        type: "div",
+        className: "tab-content"
+    });
+    tabDiv.appendChild(tabContentDiv);
 
-  self.setHeader(header);
+    self.setHeader(header);
 
-  var elementInfoDiv = Functions.createElement({
-    name : "elementInfoDiv",
-    type : "div",
-    style : "background-color:#f3f3f3",
-    className : "minerva-element-info-div",
-  });
-  self.elementInfoDiv = elementInfoDiv;
+    var elementInfoDiv = Functions.createElement({
+        name: "elementInfoDiv",
+        type: "div",
+        style: "background-color:#f3f3f3",
+        className: "minerva-element-info-div",
+    });
+    self.elementInfoDiv = elementInfoDiv;
 
-  for (var i = 0; i < panels.length; i++) {
-    self.addTab(panels[i], tabMenuDiv, tabContentDiv);
-  }
+    for (var i = 0; i < panels.length; i++) {
+        self.addTab(panels[i], tabMenuDiv, tabContentDiv);
+    }
 };
 
-LeftPanel.prototype.getPanelsDefinition = function() {
-  return [ {
-    name : "SEARCH",
-    className : "fa-search",
-    panelClass : SearchPanel,
-  }, {
-    name : "OVERLAYS",
-    className : "fa-th-list",
-    panelClass : OverlayPanel,
-  }, {
-    name : "SUBMAPS",
-    className : "fa-sitemap",
-    panelClass : SubmapPanel,
-  }, {
-    name : "INFO",
-    className : "fa-info",
-    panelClass : ProjectInfoPanel,
-  } ];
+LeftPanel.prototype.getPanelsDefinition = function () {
+    return [{
+        name: "SEARCH",
+        className: "fa-search",
+        panelClass: SearchPanel,
+    }, {
+        name: "OVERLAYS",
+        className: "fa-th-list",
+        panelClass: OverlayPanel,
+    }, {
+        name: "SUBMAPS",
+        className: "fa-sitemap",
+        panelClass: SubmapPanel,
+    }, {
+        name: "INFO",
+        className: "fa-info",
+        panelClass: ProjectInfoPanel,
+    }];
 };
 
-LeftPanel.prototype.hideTab = function(panel) {
-  var self = this;
-  var panelDeifinitions = self.getPanelsDefinition();
-  for (var i = 0; i < panelDeifinitions.length; i++) {
-    if (panel instanceof panelDeifinitions[i].panelClass) {
-      var liElement = $("li:has(a[href='#left_panel_tab_" + i + "'])", $(self.getElement()))[0];
-      if (liElement !== undefined) {
-        liElement.style.display = "none";
-      } else {
-        logger.warn("Cannot find tab link for panel: " + panel.getPanelName());
-      }
+LeftPanel.prototype.hideTab = function (panel) {
+    var self = this;
+    var panelDeifinitions = self.getPanelsDefinition();
+    for (var i = 0; i < panelDeifinitions.length; i++) {
+        if (panel instanceof panelDeifinitions[i].panelClass) {
+            var liElement = $("li:has(a[href='#left_panel_tab_" + i + "'])", $(self.getElement()))[0];
+            if (liElement !== undefined) {
+                liElement.style.display = "none";
+            } else {
+                logger.warn("Cannot find tab link for panel: " + panel.getPanelName());
+            }
+        }
     }
-  }
 };
 
-LeftPanel.prototype.init = function() {
-  var self = this;
+LeftPanel.prototype.init = function () {
+    var self = this;
 
-  var promises = [];
-  for (var i = 0; i < self._panels.length; i++) {
-    promises.push(self._panels[i].init());
-  }
-  promises.push(self.getHeader().init());
+    var promises = [];
+    for (var i = 0; i < self._panels.length; i++) {
+        promises.push(self._panels[i].init());
+    }
+    promises.push(self.getHeader().init());
 
   var initEvents = new Promise(function(resolve) {
     self.getMap().addListener("onBioEntityClick", function(e) {
@@ -155,33 +155,33 @@ LeftPanel.prototype.init = function() {
   return Promise.all(promises);
 };
 
-LeftPanel.prototype.showElementDetails = function(element) {
-  var self = this;
-  var div = self.elementInfoDiv;
-  if (!$(div).hasClass("ui-dialog-content")) {
-    $(div).dialog({
-      resizable : false,
-      width : $(self.getElement()).width(),
-      height : 200,
-      beforeclose : function() {
-        $(this).dialog('option', 'position', [ $(this).offset().left, $(this).offset().top ]);
-        $(this).dialog('option', 'width', $(this).width());
-        $(this).dialog('option', 'height', $(this).height());
-      },
-      position : {
-        my : "left bottom",
-        at : "left bottom",
-        of : $(self.getElement()),
-      },
-    }).siblings('.ui-dialog-titlebar').css("background", "gray");
-  }
+LeftPanel.prototype.showElementDetails = function (element) {
+    var self = this;
+    var div = self.elementInfoDiv;
+    if (!$(div).hasClass("ui-dialog-content")) {
+        $(div).dialog({
+            resizable: false,
+            width: $(self.getElement()).width(),
+            height: 200,
+            beforeclose: function () {
+                $(this).dialog('option', 'position', [$(this).offset().left, $(this).offset().top]);
+                $(this).dialog('option', 'width', $(this).width());
+                $(this).dialog('option', 'height', $(this).height());
+            },
+            position: {
+                my: "left bottom",
+                at: "left bottom",
+                of: $(self.getElement()),
+            },
+        }).siblings('.ui-dialog-titlebar').css("background", "gray");
+    }
 
-  var openTabName = $("[name='tabView'] > ul li.active a > .maintabdiv")[0].innerHTML;
-  var searchTabName = $("[name='tabView'] > ul li.active a > .maintabdiv")[1].innerHTML;
-  var isPanelHidden = (self.getElement().style.display === "none");
-  if (isPanelHidden) {
-    openTabName = undefined;
-  }
+    var openTabName = $("[name='tabView'] > ul li.active a > .maintabdiv")[0].innerHTML;
+    var searchTabName = $("[name='tabView'] > ul li.active a > .maintabdiv")[1].innerHTML;
+    var isPanelHidden = (self.getElement().style.display === "none");
+    if (isPanelHidden) {
+        openTabName = undefined;
+    }
 
   if (element !== undefined && (openTabName.indexOf("SEARCH") === -1 || searchTabName !== "GENERIC")) {
     var model = self.getMap().getSubmapById(element.getModelId()).getModel();
@@ -198,130 +198,134 @@ LeftPanel.prototype.showElementDetails = function(element) {
   }
 };
 
-LeftPanel.prototype.prepareElementDetailsContent = function(bioEntity) {
-  var guiUtils = new GuiUtils(this.getMap().getConfiguration());
-  guiUtils.setMap(this.getMap());
-  if (bioEntity instanceof Reaction) {
-    return guiUtils.createReactionElement({
-      reaction : bioEntity,
-      showTitle : false,
-    });
-  } else if (bioEntity instanceof Alias) {
-    return guiUtils.createAliasElement({
-      alias : bioEntity,
-      showTitle : false,
-    });
-  } else if (bioEntity instanceof PointData) {
-    return Functions.createElement({
-      type : "div"
-    });
-  } else {
-    throw new Error("Unknown element type:" + bioEntity);
-  }
+LeftPanel.prototype.prepareElementDetailsContent = function (bioEntity) {
+    var guiUtils = new GuiUtils(this.getMap().getConfiguration());
+    guiUtils.setMap(this.getMap());
+    if (bioEntity instanceof Reaction) {
+        return guiUtils.createReactionElement({
+            reaction: bioEntity,
+            showTitle: false,
+        });
+    } else if (bioEntity instanceof Alias) {
+        return guiUtils.createAliasElement({
+            alias: bioEntity,
+            showTitle: false,
+        });
+    } else if (bioEntity instanceof PointData) {
+        return Functions.createElement({
+            type: "div"
+        });
+    } else {
+        throw new Error("Unknown element type:" + bioEntity);
+    }
 };
-LeftPanel.prototype.getElementTitle = function(bioEntity) {
-  if (bioEntity instanceof Reaction) {
-    return bioEntity.getType() + ": " + bioEntity.getReactionId();
-  } else if (bioEntity instanceof Alias) {
-    return bioEntity.getType() + ": " + bioEntity.getName();
-  } else if (bioEntity instanceof PointData) {
-    return "POINT: " + bioEntity.getId();
-  } else {
-    throw new Error("Unknown element type:" + bioEntity);
-  }
+LeftPanel.prototype.getElementTitle = function (bioEntity) {
+    if (bioEntity instanceof Reaction) {
+        return bioEntity.getType() + ": " + bioEntity.getReactionId();
+    } else if (bioEntity instanceof Alias) {
+        return bioEntity.getType() + ": " + bioEntity.getName();
+    } else if (bioEntity instanceof PointData) {
+        return "POINT: " + bioEntity.getId();
+    } else {
+        throw new Error("Unknown element type:" + bioEntity);
+    }
 };
 
-LeftPanel.prototype.addTab = function(params, navElement, contentElement) {
-  var self = this;
-
-  var name = params.name;
+LeftPanel.prototype.addTab = function (params, navElement, contentElement) {
+    var self = this;
 
-  var tabId = "left_panel_tab_" + this._tabIdCount;
-  self._tabIdCount++;
+    var name = params.name;
 
-  var navClass = '';
-  var contentClass = 'tab-pane';
-  if (navElement.children.length === 0) {
-    navClass = "active";
-    contentClass = "tab-pane active";
-  }
+    var tabId = "left_panel_tab_" + this._tabIdCount;
+    self._tabIdCount++;
 
-  var navLi = document.createElement("li");
-  navLi.className = navClass;
+    var navClass = '';
+    var contentClass = 'tab-pane';
+    if (navElement.children.length === 0) {
+        navClass = "active";
+        contentClass = "tab-pane active";
+    }
 
-  var navLink = document.createElement("a");
-  navLink.href = "#" + tabId;
-  if (name !== undefined) {
-    if (name.length > 12) {
-      name = name.substring(0, 10) + "...";
+    var navLi = document.createElement("li");
+    navLi.className = navClass;
+
+    var navLink = document.createElement("a");
+    navLink.href = "#" + tabId;
+    if (name !== undefined) {
+        if (name.length > 12) {
+            name = name.substring(0, 10) + "...";
+        }
+    } else {
+        name = "";
     }
-  } else {
-    name = "";
-  }
-  // add this when we want to have triangle below
-  // '<div class="tngContainer"><div class="tng"></div></div>'
-
-  navLink.innerHTML = '<div class="maintabdiv"><i class="fa ' + params.className + ' maintab"></i><br>' + name
-      + '</div>';
-
-  navLink.onclick = function() {
-    $(this).tab('show');
-  };
-  navLi.appendChild(navLink);
-  navElement.appendChild(navLi);
-
-  var contentDiv = document.createElement("div");
-  contentDiv.style.height = "100%";
-  contentDiv.className = contentClass;
-  contentDiv.id = tabId;
-
-  contentElement.appendChild(contentDiv);
-
-  this._panels.push(new params.panelClass({
-    element : contentDiv,
-    customMap : self.getMap(),
-    parent : self,
-  }));
+    // add this when we want to have triangle below
+    // '<div class="tngContainer"><div class="tng"></div></div>'
+
+    navLink.innerHTML = '<div class="maintabdiv"><i class="fa ' + params.className + ' maintab"></i><br>' + name
+        + '</div>';
+
+    navLink.onclick = function () {
+        $(this).tab('show');
+    };
+    navLi.appendChild(navLink);
+    navElement.appendChild(navLi);
+
+    var contentDiv = document.createElement("div");
+    contentDiv.style.height = "100%";
+    contentDiv.className = contentClass;
+    contentDiv.id = tabId;
+
+    contentElement.appendChild(contentDiv);
+
+    this._panels.push(new params.panelClass({
+        element: contentDiv,
+        customMap: self.getMap(),
+        parent: self,
+    }));
 };
 
-LeftPanel.prototype.hide = function() {
-  this.getElement().style.display = "none";
+LeftPanel.prototype.hide = function () {
+    this.getElement().style.display = "none";
 };
-LeftPanel.prototype.show = function() {
-  this.getElement().style.display = "block";
+LeftPanel.prototype.show = function () {
+    this.getElement().style.display = "block";
 };
 
-LeftPanel.prototype.setHeader = function(header) {
-  this._header = header;
+LeftPanel.prototype.setHeader = function (header) {
+    this._header = header;
 };
 
-LeftPanel.prototype.getHeader = function() {
-  return this._header;
+LeftPanel.prototype.getHeader = function () {
+    return this._header;
 };
 
-LeftPanel.prototype.setLoginDialog = function(loginDialog) {
-  this._loginDialog = loginDialog;
+LeftPanel.prototype.setLoginDialog = function (loginDialog) {
+    this._loginDialog = loginDialog;
 };
 
-LeftPanel.prototype.getLoginDialog = function() {
-  return this._loginDialog;
+LeftPanel.prototype.getLoginDialog = function () {
+    return this._loginDialog;
 };
 
-LeftPanel.prototype.destroy = function() {
-  var self = this;
-  var promises = [];
-  promises.push(self.getHeader().destroy());
-  var div = self.elementInfoDiv;
-
-  var destroyPanel = new Promise(function(resolve) {
-    if ($(div).hasClass("ui-dialog-content")) {
-      $(div).dialog("destroy");
+LeftPanel.prototype.destroy = function () {
+    var self = this;
+    var promises = [];
+    promises.push(self.getHeader().destroy());
+    var div = self.elementInfoDiv;
+
+    var destroyPanel = new Promise(function (resolve) {
+        if ($(div).hasClass("ui-dialog-content")) {
+            $(div).dialog("destroy");
+        }
+        resolve();
+    });
+    promises.push(destroyPanel);
+    promises.push(self.getLoginDialog().destroy());
+    for (var i = 0; i < self._panels.length; i++) {
+        promises.push(self._panels[i].destroy());
     }
-    resolve();
-  });
-  promises.push(destroyPanel);
 
-  return Promise.all(promises);
+    return Promise.all(promises);
 };
 
 module.exports = LeftPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/MiRnaPanel.js b/frontend-js/src/main/js/gui/leftPanel/MiRnaPanel.js
index f3ea0d84c5..040c905beb 100644
--- a/frontend-js/src/main/js/gui/leftPanel/MiRnaPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/MiRnaPanel.js
@@ -58,4 +58,8 @@ MiRnaPanel.prototype.init = function() {
   }
 };
 
+MiRnaPanel.prototype.destroy = function () {
+    return Promise.resolve();
+};
+
 module.exports = MiRnaPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
index f4c13ff149..64259fe14b 100644
--- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
@@ -11,364 +11,378 @@ var logger = require('../../logger');
 var Functions = require('../../Functions');
 
 function OverlayPanel(params) {
-  params.panelName = "overlays";
-  params.scrollable = true;
-  params.helpTip = "<p>Overlays tab allows to display or generate custom coloring of elements and interactions in the map.</p>"
-      + "<p>General overlays are overlays accessible for every user viewing the content.</p>"
-      + "<p>Custom overlays are user-provided overlays, this menu becomes available upon login (see below).</p>";
-  Panel.call(this, params);
+    params.panelName = "overlays";
+    params.scrollable = true;
+    params.helpTip = "<p>Overlays tab allows to display or generate custom coloring of elements and interactions in the map.</p>"
+        + "<p>General overlays are overlays accessible for every user viewing the content.</p>"
+        + "<p>Custom overlays are user-provided overlays, this menu becomes available upon login (see below).</p>";
+    Panel.call(this, params);
 
-  var self = this;
+    var self = this;
 
-  self._createOverlayPanelGui();
+    self._createOverlayPanelGui();
 
-  var addButton = this.getControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON);
+    var addButton = this.getControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON);
 
-  addButton.onclick = function() {
-    self.openAddOverlayDialog();
-  };
+    addButton.onclick = function () {
+        return self.openAddOverlayDialog();
+    };
 
-  var titleElement = this.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE);
-  self.setCustomOverlaysMessage(titleElement.innerHTML);
+    var titleElement = this.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE);
+    self.setCustomOverlaysMessage(titleElement.innerHTML);
 
 }
 
 OverlayPanel.prototype = Object.create(Panel.prototype);
 OverlayPanel.prototype.constructor = OverlayPanel;
 
-OverlayPanel.prototype._createOverlayPanelGui = function() {
-  var generalOverlaysDiv = Functions.createElement({
-    type : "div",
-    name : "generalOverlays",
-    className : "searchPanel"
-  });
-  this.getElement().appendChild(generalOverlaysDiv);
-  this.setControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_DIV, generalOverlaysDiv);
-
-  var generalOverlaysTitle = Functions.createElement({
-    type : "h5",
-    content : "GENERAL OVERLAYS:"
-  });
-  generalOverlaysDiv.appendChild(generalOverlaysTitle);
-
-  var generalOverlaysTableDiv = Functions.createElement({
-    type : "table",
-    name : "generalOverlaysTab",
-    className : "table table-bordered",
-    style : "width:100%"
-  });
-  generalOverlaysDiv.appendChild(generalOverlaysTableDiv);
-  this.setControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE, generalOverlaysTableDiv);
-
-  var customOverlaysDiv = Functions.createElement({
-    type : "div",
-    name : "customOverlays",
-    className : "searchPanel"
-  });
-  this.getElement().appendChild(customOverlaysDiv);
-  this.setControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_DIV, customOverlaysDiv);
-
-  var customOverlaysTitle = Functions.createElement({
-    type : "h5",
-    name : "customOverlaysTitle",
-    content : "USER-PROVIDED OVERLAYS:"
-  });
-  customOverlaysDiv.appendChild(customOverlaysTitle);
-  this.setControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE, customOverlaysTitle);
-
-  var customOverlaysTableDiv = Functions.createElement({
-    type : "table",
-    name : "customOverlaysTab",
-    className : "table table-bordered",
-    style : "width:100%"
-  });
-  customOverlaysDiv.appendChild(customOverlaysTableDiv);
-  this.setControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE, customOverlaysTableDiv);
-
-  var centerTag = Functions.createElement({
-    type : "center"
-  });
-  customOverlaysDiv.appendChild(centerTag);
-
-  var addOverlayButton = Functions.createElement({
-    type : "button",
-    name : "addOverlay",
-    content : "Add overlay"
-  });
-  centerTag.appendChild(addOverlayButton);
-  this.setControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON, addOverlayButton);
+OverlayPanel.prototype._createOverlayPanelGui = function () {
+    var generalOverlaysDiv = Functions.createElement({
+        type: "div",
+        name: "generalOverlays",
+        className: "searchPanel"
+    });
+    this.getElement().appendChild(generalOverlaysDiv);
+    this.setControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_DIV, generalOverlaysDiv);
+
+    var generalOverlaysTitle = Functions.createElement({
+        type: "h5",
+        content: "GENERAL OVERLAYS:"
+    });
+    generalOverlaysDiv.appendChild(generalOverlaysTitle);
+
+    var generalOverlaysTableDiv = Functions.createElement({
+        type: "table",
+        name: "generalOverlaysTab",
+        className: "table table-bordered",
+        style: "width:100%"
+    });
+    generalOverlaysDiv.appendChild(generalOverlaysTableDiv);
+    this.setControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE, generalOverlaysTableDiv);
+
+    var customOverlaysDiv = Functions.createElement({
+        type: "div",
+        name: "customOverlays",
+        className: "searchPanel"
+    });
+    this.getElement().appendChild(customOverlaysDiv);
+    this.setControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_DIV, customOverlaysDiv);
+
+    var customOverlaysTitle = Functions.createElement({
+        type: "h5",
+        name: "customOverlaysTitle",
+        content: "USER-PROVIDED OVERLAYS:"
+    });
+    customOverlaysDiv.appendChild(customOverlaysTitle);
+    this.setControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE, customOverlaysTitle);
+
+    var customOverlaysTableDiv = Functions.createElement({
+        type: "table",
+        name: "customOverlaysTab",
+        className: "table table-bordered",
+        style: "width:100%"
+    });
+    customOverlaysDiv.appendChild(customOverlaysTableDiv);
+    this.setControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE, customOverlaysTableDiv);
+
+    var centerTag = Functions.createElement({
+        type: "center"
+    });
+    customOverlaysDiv.appendChild(centerTag);
+
+    var addOverlayButton = Functions.createElement({
+        type: "button",
+        name: "addOverlay",
+        content: "Add overlay"
+    });
+    centerTag.appendChild(addOverlayButton);
+    this.setControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON, addOverlayButton);
 };
 
-OverlayPanel.prototype.clear = function() {
-  var table = this.getControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE);
-  while (table.firstChild) {
-    table.removeChild(table.firstChild);
-  }
+OverlayPanel.prototype.clear = function () {
+    var table = this.getControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE);
+    while (table.firstChild) {
+        table.removeChild(table.firstChild);
+    }
 
-  table = this.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE);
-  while (table.firstChild) {
-    table.removeChild(table.firstChild);
-  }
+    table = this.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE);
+    while (table.firstChild) {
+        table.removeChild(table.firstChild);
+    }
 
 };
 
-OverlayPanel.prototype.createTableHeader = function(edit) {
-  var result = document.createElement("thead");
+OverlayPanel.prototype.createTableHeader = function (edit) {
+    var result = document.createElement("thead");
 
-  var row = document.createElement("tr");
+    var row = document.createElement("tr");
 
-  var nameTd = document.createElement("th");
-  nameTd.innerHTML = "Name";
-  row.appendChild(nameTd);
+    var nameTd = document.createElement("th");
+    nameTd.innerHTML = "Name";
+    row.appendChild(nameTd);
 
-  var viewTd = document.createElement("th");
-  viewTd.innerHTML = "View";
-  row.appendChild(viewTd);
+    var viewTd = document.createElement("th");
+    viewTd.innerHTML = "View";
+    row.appendChild(viewTd);
 
-  var dataTd = document.createElement("th");
-  dataTd.innerHTML = "Data";
-  row.appendChild(dataTd);
+    var dataTd = document.createElement("th");
+    dataTd.innerHTML = "Data";
+    row.appendChild(dataTd);
 
-  if (edit) {
-    var editTd = document.createElement("th");
-    editTd.innerHTML = "Edit";
-    row.appendChild(editTd);
-  }
+    if (edit) {
+        var editTd = document.createElement("th");
+        editTd.innerHTML = "Edit";
+        row.appendChild(editTd);
+    }
 
-  result.appendChild(row);
-  return result;
+    result.appendChild(row);
+    return result;
 };
 
-OverlayPanel.prototype.createOverlayRow = function(overlay, checked) {
-  var self = this;
-  var guiUtils = self.getGuiUtils();
-  var result = document.createElement("tr");
-
-  if (checked) {
-    result.className = "active";
-  }
-
-  var nameTd = document.createElement("td");
-  nameTd.innerHTML = overlay.getName();
-  result.appendChild(nameTd);
-
-  var viewTd = document.createElement("td");
-  if (overlay.getInputDataAvailable()) {
-    var checkbox = document.createElement("input");
-    checkbox.type = "checkbox";
-    checkbox.checked = checked;
-    checkbox.onclick = function() {
-      if (this.checked) {
-        return self.getMap().openDataOverlay(overlay.getId()).then(null, GuiConnector.alert);
-      } else {
-        return self.getMap().removeSelectedLayout(overlay.getId()).then(null, GuiConnector.alert);
-      }
-    };
-    viewTd.appendChild(checkbox);
-  } else {
-    var img = guiUtils.createIcon("icons/search.png");
-    var link = document.createElement("a");
-    link.href = "#";
-    link.onclick = function() {
-      self.getMap().openDataOverlay(overlay.getId());
-      $(result).addClass('active').siblings().removeClass('active');
-    };
-    link.appendChild(img);
-    viewTd.appendChild(link);
-  }
-  result.appendChild(viewTd);
-
-  var dataTd = document.createElement("td");
-  if (overlay.getInputDataAvailable()) {
-    var button = document.createElement("button");
-    button.setAttribute("name", "download-overlay-" + overlay.getId());
-    button.onclick = function() {
-      return ServerConnector.getOverlaySourceDownloadUrl({
-        overlayId : overlay.getId()
-      }).then(function(url) {
-        return self.downloadFile(url);
-      }).then(null, GuiConnector.alert);
-    };
-    button.innerHTML = "<span class='ui-icon ui-icon-arrowthickstop-1-s'></span>";
-    dataTd.appendChild(button);
-  }
-
-  result.appendChild(dataTd);
-
-  if (overlay.getCreator() !== "" && overlay.getCreator() !== undefined) {
-    var editTd = document.createElement("td");
-    var editButton = document.createElement("button");
-    editButton.setAttribute("name", "editButton");
-    editButton.onclick = function() {
-      self.openEditOverlayDialog(overlay);
-    };
-    editButton.innerHTML = "<span class='ui-icon ui-icon-document'></span>";
-    editTd.appendChild(editButton);
-    result.appendChild(editTd);
-  }
-  result.title = overlay.getDescription();
-  return result;
-};
+OverlayPanel.prototype.createOverlayRow = function (overlay, checked) {
+    var self = this;
+    var guiUtils = self.getGuiUtils();
+    var result = document.createElement("tr");
 
-OverlayPanel.prototype.openEditOverlayDialog = function(overlay) {
-  var self = this;
-  var guiUtils = self.getGuiUtils();
-  var content = document.createElement("fieldset");
-  var nameInput = guiUtils.createInputText(overlay.getName());
-  var row = guiUtils.createTableRow([ guiUtils.createLabel("Name: "), nameInput ]);
-  content.appendChild(row);
-
-  var descriptionInput = guiUtils.createTextArea(overlay.getDescription());
-  row = guiUtils.createTableRow([ guiUtils.createLabel("Description: "), descriptionInput ]);
-  content.appendChild(row);
-
-  var buttons = [ {
-    text : "SAVE",
-    click : function() {
-      var windowSelf = this;
-      overlay.setName(nameInput.value);
-      overlay.setDescription(descriptionInput.value);
-      return ServerConnector.updateOverlay(overlay).then(function() {
-        return self.refresh();
-      }).then(function() {
-        $(windowSelf).dialog("close");
-      }).then(null, GuiConnector.alert);
+    if (checked) {
+        result.className = "active";
     }
-  }, {
-    text : "REMOVE",
-    click : function() {
-      self.getMap().removeSelectedLayout(overlay.getId());
-
-      var windowSelf = this;
-      return ServerConnector.removeOverlay({
-        overlayId : overlay.getId()
-      }).then(function() {
-        return self.refresh();
-      }).then(function() {
-        $(windowSelf).dialog("close");
-      }).then(null, GuiConnector.alert);
+
+    var nameTd = document.createElement("td");
+    nameTd.innerHTML = overlay.getName();
+    result.appendChild(nameTd);
+
+    var viewTd = document.createElement("td");
+    if (overlay.getInputDataAvailable()) {
+        var checkbox = document.createElement("input");
+        checkbox.type = "checkbox";
+        checkbox.checked = checked;
+        checkbox.onclick = function () {
+            if (this.checked) {
+                return self.getMap().openDataOverlay(overlay.getId()).then(null, GuiConnector.alert);
+            } else {
+                return self.getMap().removeSelectedLayout(overlay.getId()).then(null, GuiConnector.alert);
+            }
+        };
+        viewTd.appendChild(checkbox);
+    } else {
+        var img = guiUtils.createIcon("icons/search.png");
+        var link = document.createElement("a");
+        link.href = "#";
+        link.onclick = function () {
+            self.getMap().openDataOverlay(overlay.getId());
+            $(result).addClass('active').siblings().removeClass('active');
+        };
+        link.appendChild(img);
+        viewTd.appendChild(link);
     }
-  }, {
-    text : "CANCEL",
-    click : function() {
-      $(this).dialog("close");
+    result.appendChild(viewTd);
+
+    var dataTd = document.createElement("td");
+    if (overlay.getInputDataAvailable()) {
+        var button = document.createElement("button");
+        button.setAttribute("name", "download-overlay-" + overlay.getId());
+        button.onclick = function () {
+            return ServerConnector.getOverlaySourceDownloadUrl({
+                overlayId: overlay.getId()
+            }).then(function (url) {
+                return self.downloadFile(url);
+            }).then(null, GuiConnector.alert);
+        };
+        button.innerHTML = "<span class='ui-icon ui-icon-arrowthickstop-1-s'></span>";
+        dataTd.appendChild(button);
     }
-  } ];
-  self.openDialog(content, {
-    id : overlay.getId(),
-    buttons : buttons,
-    title : "Data overlay: " + overlay.getName(),
-    className : "minerva-overlay-dialog",
-  });
-};
 
-OverlayPanel.prototype.refresh = function() {
-  var self = this;
-  var user = null;
-
-  var overlayTypes = [];
-  var selectedOverlay = [];
-
-  return ServerConnector.getOverlayTypes().then(function(types) {
-    overlayTypes = types;
-    return ServerConnector.getLoggedUser();
-  }).then(function(loggedUser) {
-    user = loggedUser;
-    return self.getMap().getVisibleDataOverlays();
-  }).then(function(visibleDataOverlays) {
-    for (var j = 0; j < visibleDataOverlays.length; j++) {
-      selectedOverlay[visibleDataOverlays[j].getId()] = true;
+    result.appendChild(dataTd);
+
+    if (overlay.getCreator() !== "" && overlay.getCreator() !== undefined) {
+        var editTd = document.createElement("td");
+        var editButton = document.createElement("button");
+        editButton.setAttribute("name", "editButton");
+        editButton.onclick = function () {
+            return self.openEditOverlayDialog(overlay);
+        };
+        editButton.innerHTML = "<span class='ui-icon ui-icon-document'></span>";
+        editTd.appendChild(editButton);
+        result.appendChild(editTd);
     }
+    result.title = overlay.getDescription();
+    return result;
+};
 
-    return ServerConnector.getOverlays({
-      publicOverlay : false,
-      creator : user.getLogin(),
-    });
-  }).then(
-      function(customOverlays) {
-
-        var id = self.getMap().getGoogleMap().getMapTypeId().substring(2);
-        selectedOverlay[id] = true;
-
-        self.clear();
-
-        var generalOverlays = [];
-        var overlay;
-
-        var overlays = self.getMap().getLayouts();
-        for (var i = 0; i < overlays.length; i++) {
-          overlay = overlays[i];
-          if (overlay.getCreator() === undefined || overlay.getCreator() === "") {
-            generalOverlays.push(overlay);
-          }
+OverlayPanel.prototype.openEditOverlayDialog = function (overlay) {
+    var self = this;
+    var guiUtils = self.getGuiUtils();
+    var content = document.createElement("fieldset");
+    var nameInput = guiUtils.createInputText(overlay.getName());
+    var row = guiUtils.createTableRow([guiUtils.createLabel("Name: "), nameInput]);
+    content.appendChild(row);
+
+    var descriptionInput = guiUtils.createTextArea(overlay.getDescription());
+    row = guiUtils.createTableRow([guiUtils.createLabel("Description: "), descriptionInput]);
+    content.appendChild(row);
+
+    var buttons = [{
+        text: "SAVE",
+        click: function () {
+            var windowSelf = this;
+            overlay.setName(nameInput.value);
+            overlay.setDescription(descriptionInput.value);
+            return ServerConnector.updateOverlay(overlay).then(function () {
+                return self.refresh();
+            }).then(function () {
+                $(windowSelf).dialog("close");
+            }).then(null, GuiConnector.alert);
         }
-
-        var table = self.getControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE);
-        table.appendChild(self.createTableHeader());
-
-        var body = document.createElement("tbody");
-        table.appendChild(body);
-        for (i = 0; i < generalOverlays.length; i++) {
-          overlay = generalOverlays[i];
-          body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()]));
+    }, {
+        text: "REMOVE",
+        click: function () {
+            self.getMap().removeSelectedLayout(overlay.getId());
+
+            var windowSelf = this;
+            return ServerConnector.removeOverlay({
+                overlayId: overlay.getId()
+            }).then(function () {
+                return self.refresh();
+            }).then(function () {
+                $(windowSelf).dialog("close");
+            }).then(null, GuiConnector.alert);
+        }
+    }, {
+        text: "CANCEL",
+        click: function () {
+            $(this).dialog("close");
         }
+    }];
+    self.openDialog(content, {
+        id: overlay.getId(),
+        buttons: buttons,
+        title: "Data overlay: " + overlay.getName(),
+        className: "minerva-overlay-dialog",
+    });
+};
 
-        var title = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE);
-        var addButton = self.getControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON);
-        if (user.getLogin() === "anonymous") {
-          title.innerHTML = 'YOU ARE NOT LOGGED IN. PLEASE, <a href="#">LOG IN</a>'
-              + 'TO UPLOAD AND VIEW CUSTOM OVERLAYS<br/><center><button>LOGIN</button></center>';
-          var openLoginDialog = function() {
-            return self.getParent().getLoginDialog().open();
-          };
-          $(title).find("a")[0].onclick = openLoginDialog;
-          $(title).find("button")[0].onclick = openLoginDialog;
-          addButton.style.display = "none";
-        } else {
-          title.innerHTML = self.getCustomOverlaysMessage();
-          addButton.style.display = "block";
-
-          table = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE);
-          table.appendChild(self.createTableHeader(true));
-
-          body = document.createElement("tbody");
-          table.appendChild(body);
-          for (i = 0; i < customOverlays.length; i++) {
-            overlay = customOverlays[i];
-            body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()]));
-          }
+OverlayPanel.prototype.refresh = function () {
+    var self = this;
+    var user = null;
+
+    var overlayTypes = [];
+    var selectedOverlay = [];
+
+    return ServerConnector.getOverlayTypes().then(function (types) {
+        overlayTypes = types;
+        return ServerConnector.getLoggedUser();
+    }).then(function (loggedUser) {
+        user = loggedUser;
+        return self.getMap().getVisibleDataOverlays();
+    }).then(function (visibleDataOverlays) {
+        for (var j = 0; j < visibleDataOverlays.length; j++) {
+            selectedOverlay[visibleDataOverlays[j].getId()] = true;
         }
 
-        self.onresize();
-      });
+        return ServerConnector.getOverlays({
+            publicOverlay: false,
+            creator: user.getLogin(),
+        });
+    }).then(
+        function (customOverlays) {
+
+            var id = self.getMap().getGoogleMap().getMapTypeId().substring(2);
+            selectedOverlay[id] = true;
+
+            self.clear();
+
+            var generalOverlays = [];
+            var overlay;
+
+            var overlays = self.getMap().getLayouts();
+            for (var i = 0; i < overlays.length; i++) {
+                overlay = overlays[i];
+                if (overlay.getCreator() === undefined || overlay.getCreator() === "") {
+                    generalOverlays.push(overlay);
+                }
+            }
+
+            var table = self.getControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE);
+            table.appendChild(self.createTableHeader());
+
+            var body = document.createElement("tbody");
+            table.appendChild(body);
+            for (i = 0; i < generalOverlays.length; i++) {
+                overlay = generalOverlays[i];
+                body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()]));
+            }
+
+            var title = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE);
+            var addButton = self.getControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON);
+            if (user.getLogin() === "anonymous") {
+                title.innerHTML = 'YOU ARE NOT LOGGED IN. PLEASE, <a href="#">LOG IN</a>'
+                    + 'TO UPLOAD AND VIEW CUSTOM OVERLAYS<br/><center><button>LOGIN</button></center>';
+                var openLoginDialog = function () {
+                    return self.getParent().getLoginDialog().open();
+                };
+                $(title).find("a")[0].onclick = openLoginDialog;
+                $(title).find("button")[0].onclick = openLoginDialog;
+                addButton.style.display = "none";
+            } else {
+                title.innerHTML = self.getCustomOverlaysMessage();
+                addButton.style.display = "block";
+
+                table = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE);
+                table.appendChild(self.createTableHeader(true));
+
+                body = document.createElement("tbody");
+                table.appendChild(body);
+                for (i = 0; i < customOverlays.length; i++) {
+                    overlay = customOverlays[i];
+                    body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()]));
+                }
+            }
+
+            self.onresize();
+        });
 };
 
-OverlayPanel.prototype.setCustomOverlaysMessage = function(customOverlaysMessage) {
-  this._customOverlaysMessage = customOverlaysMessage;
+OverlayPanel.prototype.setCustomOverlaysMessage = function (customOverlaysMessage) {
+    this._customOverlaysMessage = customOverlaysMessage;
 };
 
-OverlayPanel.prototype.getCustomOverlaysMessage = function() {
-  return this._customOverlaysMessage;
+OverlayPanel.prototype.getCustomOverlaysMessage = function () {
+    return this._customOverlaysMessage;
 };
 
 
-OverlayPanel.prototype.openAddOverlayDialog = function() {
-  var self = this;
-  var addOverlayDialog = new AddOverlayDialog({
-    project : self.getProject(),
-    customMap : self.getMap(),
-    element : document.createElement("div"),
-  });
-  addOverlayDialog.addListener("onAddOverlay", function(e) {
-    self.getMap().getModel().addLayout(e.arg);
-    return self.refresh();
-  });
-  return addOverlayDialog.init().then(function() {
-    return addOverlayDialog.open();
-  });
+OverlayPanel.prototype.openAddOverlayDialog = function () {
+    var self = this;
+    if (self._addOverlayDialog !== undefined) {
+        self._addOverlayDialog.destroy();
+    }
+    self._addOverlayDialog = new AddOverlayDialog({
+        project: self.getProject(),
+        customMap: self.getMap(),
+        element: document.createElement("div"),
+    });
+    self._addOverlayDialog.addListener("onAddOverlay", function (e) {
+        self.getMap().getModel().addLayout(e.arg);
+        return self.refresh();
+    });
+    return self._addOverlayDialog.init().then(function () {
+        return self._addOverlayDialog.open();
+    });
 };
 
-OverlayPanel.prototype.init = function() {
-  return this.refresh();
+OverlayPanel.prototype.init = function () {
+    return this.refresh();
 };
+
+OverlayPanel.prototype.destroy = function () {
+    var self = this;
+    Panel.prototype.destroy.call(this);
+    if (self._addOverlayDialog !== undefined) {
+        return self._addOverlayDialog.destroy();
+    } else {
+        return Promise.resolve();
+    }
+};
+
 module.exports = OverlayPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js b/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js
index 7de49eae84..4971bba90c 100644
--- a/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/ProjectInfoPanel.js
@@ -11,21 +11,21 @@ var logger = require('../../logger');
 var Functions = require('../../Functions');
 
 function ProjectInfoPanel(params) {
-  params.panelName = "info";
-  params.scrollable = true;
-  Panel.call(this, params);
-  var self = this;
-  self._createInfoPanelGui();
-  self._createInfoPanelLogic();
-
-  self._createUserDataTab();
-  var logoutButton = self.getControlElement(PanelControlElementType.USER_TAB_LOGOUT_BUTTON);
-
-  logoutButton.onclick = function () {
-    return ServerConnector.logout().then(function () {
-      window.location.reload(false);
-    }).then(null, GuiConnector.alert);
-  };
+    params.panelName = "info";
+    params.scrollable = true;
+    Panel.call(this, params);
+    var self = this;
+    self._createInfoPanelGui();
+    self._createInfoPanelLogic();
+
+    self._createUserDataTab();
+    var logoutButton = self.getControlElement(PanelControlElementType.USER_TAB_LOGOUT_BUTTON);
+
+    logoutButton.onclick = function () {
+        return ServerConnector.logout().then(function () {
+            window.location.reload(false);
+        }).then(null, GuiConnector.alert);
+    };
 
 }
 
@@ -33,281 +33,281 @@ ProjectInfoPanel.prototype = Object.create(Panel.prototype);
 ProjectInfoPanel.prototype.constructor = ProjectInfoPanel;
 
 ProjectInfoPanel.prototype._createInfoPanelGui = function () {
-  var self = this;
-  var guiUtils = self.getGuiUtils();
-  var projectId = self.getMap().getProject().getProjectId();
-
-  var infoDiv = Functions.createElement({
-    type: "div",
-    name: "infoDiv",
-    className: "searchPanel"
-  });
-  this.getElement().appendChild(infoDiv);
-  this.setControlElement(PanelControlElementType.INFO_DIV, infoDiv);
+    var self = this;
+    var guiUtils = self.getGuiUtils();
+    var projectId = self.getMap().getProject().getProjectId();
+
+    var infoDiv = Functions.createElement({
+        type: "div",
+        name: "infoDiv",
+        className: "searchPanel"
+    });
+    this.getElement().appendChild(infoDiv);
+    this.setControlElement(PanelControlElementType.INFO_DIV, infoDiv);
 
-  var infoTitle = Functions.createElement({
-    type: "h4",
-    content: "PROJECT INFO:"
-  });
-  infoDiv.appendChild(infoTitle);
+    var infoTitle = Functions.createElement({
+        type: "h4",
+        content: "PROJECT INFO:"
+    });
+    infoDiv.appendChild(infoTitle);
 
-  var dataTab = Functions.createElement({
-    type: "div",
-    style: "width:100%;display: table;border-spacing: 10px;"
-  });
-  infoDiv.appendChild(dataTab);
+    var dataTab = Functions.createElement({
+        type: "div",
+        style: "width:100%;display: table;border-spacing: 10px;"
+    });
+    infoDiv.appendChild(dataTab);
 
-  var projectNameLabel = Functions.createElement({
-    type: "div",
-    content: "Name:"
-  });
-  var projectNameText = Functions.createElement({
-    type: "div",
-    style: "width:100%",
-    name: "projectNameText"
-  });
-  this.setControlElement(PanelControlElementType.INFO_PROJECT_NAME_TEXT, projectNameText);
-  dataTab.appendChild(guiUtils.createTableRow([projectNameLabel, projectNameText]));
+    var projectNameLabel = Functions.createElement({
+        type: "div",
+        content: "Name:"
+    });
+    var projectNameText = Functions.createElement({
+        type: "div",
+        style: "width:100%",
+        name: "projectNameText"
+    });
+    this.setControlElement(PanelControlElementType.INFO_PROJECT_NAME_TEXT, projectNameText);
+    dataTab.appendChild(guiUtils.createTableRow([projectNameLabel, projectNameText]));
 
-  var projectVersionLabel = Functions.createElement({
-    type: "div",
-    content: "Version:"
-  });
-  var projectVersionText = Functions.createElement({
-    type: "div",
-    style: "width:100%",
-    name: "projectVersionText"
-  });
-  this.setControlElement(PanelControlElementType.INFO_PROJECT_VERSION_TEXT, projectVersionText);
-  dataTab.appendChild(guiUtils.createTableRow([projectVersionLabel, projectVersionText]));
+    var projectVersionLabel = Functions.createElement({
+        type: "div",
+        content: "Version:"
+    });
+    var projectVersionText = Functions.createElement({
+        type: "div",
+        style: "width:100%",
+        name: "projectVersionText"
+    });
+    this.setControlElement(PanelControlElementType.INFO_PROJECT_VERSION_TEXT, projectVersionText);
+    dataTab.appendChild(guiUtils.createTableRow([projectVersionLabel, projectVersionText]));
 
-  infoTitle = Functions.createElement({
-    type: "h4",
-    content: "Data:"
-  });
-  infoDiv.appendChild(infoTitle);
+    infoTitle = Functions.createElement({
+        type: "h4",
+        content: "Data:"
+    });
+    infoDiv.appendChild(infoTitle);
 
-  var dialogDiv = Functions.createElement({
-    type: "div",
-  });
+    var dialogDiv = Functions.createElement({
+        type: "div",
+    });
 
-  this.publicationListDialog = new PublicationListDialog({
-    customMap: self.getMap(),
-    element: dialogDiv,
-  });
+    this.publicationListDialog = new PublicationListDialog({
+        customMap: self.getMap(),
+        element: dialogDiv,
+    });
 
-  dataTab = Functions.createElement({
-    type: "ul",
-  });
-  infoDiv.appendChild(dataTab);
+    dataTab = Functions.createElement({
+        type: "ul",
+    });
+    infoDiv.appendChild(dataTab);
 
-  var projectPublicationsText = Functions.createElement({
-    type: "span",
-    name: "projectPublicationsText",
-    style: "font-family:FontAwesome; font-weight: normal;font-style: normal;cursor: pointer",
-  });
-  this.setControlElement(PanelControlElementType.INFO_PROJECT_PUBLICATIONS_TEXT, projectPublicationsText);
+    var projectPublicationsText = Functions.createElement({
+        type: "span",
+        name: "projectPublicationsText",
+        style: "font-family:FontAwesome; font-weight: normal;font-style: normal;cursor: pointer",
+    });
+    this.setControlElement(PanelControlElementType.INFO_PROJECT_PUBLICATIONS_TEXT, projectPublicationsText);
 
-  var projectPublicationsButton = Functions.createElement({
-    type: "a",
-    name: "projectPublicationsButton",
-  });
-  projectPublicationsButton.appendChild(Functions.createElement({
-    type: "span",
-    content: "<i class='fa fa-list'>&nbsp;",
-  }));
-
-  projectPublicationsButton.appendChild(projectPublicationsText);
-  projectPublicationsButton.appendChild(Functions.createElement({
-    type: "span",
-    style: "font-family:FontAwesome; font-weight: normal;font-style: normal;cursor: pointer",
-    content: "&nbsp;publication(s)",
-  }));
-  this.setControlElement(PanelControlElementType.INFO_PROJECT_SHOW_PUBLICATIONS_BUTTON, projectPublicationsButton);
-
-  var liElement = Functions.createElement({
-    type: "li",
-    style: "line-height: 30px;",
-  });
-  liElement.appendChild(projectPublicationsButton);
-  dataTab.appendChild(liElement);
-
-  var projectOriginalFileButton = Functions.createElement({
-    type: "a",
-    name: "projectOriginalFileButton",
-    href: "#",
-    content: "<i class='fa fa-files-o'>&nbsp;source file",
-  });
-  this.setControlElement(PanelControlElementType.INFO_PROJECT_GET_ORIGINAL_FILE_BUTTON, projectOriginalFileButton);
-  liElement = Functions.createElement({
-    type: "li",
-    style: "line-height: 30px",
-  });
-  liElement.appendChild(projectOriginalFileButton);
-  dataTab.appendChild(liElement);
+    var projectPublicationsButton = Functions.createElement({
+        type: "a",
+        name: "projectPublicationsButton",
+    });
+    projectPublicationsButton.appendChild(Functions.createElement({
+        type: "span",
+        content: "<i class='fa fa-list'>&nbsp;",
+    }));
+
+    projectPublicationsButton.appendChild(projectPublicationsText);
+    projectPublicationsButton.appendChild(Functions.createElement({
+        type: "span",
+        style: "font-family:FontAwesome; font-weight: normal;font-style: normal;cursor: pointer",
+        content: "&nbsp;publication(s)",
+    }));
+    this.setControlElement(PanelControlElementType.INFO_PROJECT_SHOW_PUBLICATIONS_BUTTON, projectPublicationsButton);
+
+    var liElement = Functions.createElement({
+        type: "li",
+        style: "line-height: 30px;",
+    });
+    liElement.appendChild(projectPublicationsButton);
+    dataTab.appendChild(liElement);
+
+    var projectOriginalFileButton = Functions.createElement({
+        type: "a",
+        name: "projectOriginalFileButton",
+        href: "#",
+        content: "<i class='fa fa-files-o'>&nbsp;source file",
+    });
+    this.setControlElement(PanelControlElementType.INFO_PROJECT_GET_ORIGINAL_FILE_BUTTON, projectOriginalFileButton);
+    liElement = Functions.createElement({
+        type: "li",
+        style: "line-height: 30px",
+    });
+    liElement.appendChild(projectOriginalFileButton);
+    dataTab.appendChild(liElement);
 
-  var exportButton = Functions.createElement({
-    type: "a",
-    href: ServerConnector.getServerBaseUrl() + "/export.xhtml?id=" + projectId,
-    content: '<i class="fa fa-mail-forward">&nbsp;EXPORT',
-  });
-  liElement = Functions.createElement({
-    type: "li",
-    style: "line-height: 30px",
-  });
-  liElement.appendChild(exportButton);
-  dataTab.appendChild(liElement);
+    var exportButton = Functions.createElement({
+        type: "a",
+        href: ServerConnector.getServerBaseUrl() + "/export.xhtml?id=" + projectId,
+        content: '<i class="fa fa-mail-forward">&nbsp;EXPORT',
+    });
+    liElement = Functions.createElement({
+        type: "li",
+        style: "line-height: 30px",
+    });
+    liElement.appendChild(exportButton);
+    dataTab.appendChild(liElement);
 
-  var manualButton = Functions.createElement({
-    type: "a",
-    name: "manualLink",
-    content: '<i class="fa fa-file">&nbsp;MANUAL',
-  });
-  manualButton.href = "#";
-  manualButton.onclick = function () {
-    return ServerConnector.getConfigurationParam(ConfigurationType.USER_MANUAL_FILE).then(function (manualFileUrl) {
-      var win = window.open(manualFileUrl, '_user_manual_');
-      win.focus();
+    var manualButton = Functions.createElement({
+        type: "a",
+        name: "manualLink",
+        content: '<i class="fa fa-file">&nbsp;MANUAL',
     });
-  };
-  liElement = Functions.createElement({
-    type: "li",
-    style: "line-height: 30px",
-  });
-  liElement.appendChild(manualButton);
-  dataTab.appendChild(liElement);
+    manualButton.href = "#";
+    manualButton.onclick = function () {
+        return ServerConnector.getConfigurationParam(ConfigurationType.USER_MANUAL_FILE).then(function (manualFileUrl) {
+            var win = window.open(manualFileUrl, '_user_manual_');
+            win.focus();
+        });
+    };
+    liElement = Functions.createElement({
+        type: "li",
+        style: "line-height: 30px",
+    });
+    liElement.appendChild(manualButton);
+    dataTab.appendChild(liElement);
 
 };
 
 ProjectInfoPanel.prototype._createInfoPanelLogic = function () {
-  var self = this;
+    var self = this;
 
-  var downloadSourceButton = self.getControlElement(PanelControlElementType.INFO_PROJECT_GET_ORIGINAL_FILE_BUTTON);
-  var showPublicationsButton = self.getControlElement(PanelControlElementType.INFO_PROJECT_SHOW_PUBLICATIONS_BUTTON);
+    var downloadSourceButton = self.getControlElement(PanelControlElementType.INFO_PROJECT_GET_ORIGINAL_FILE_BUTTON);
+    var showPublicationsButton = self.getControlElement(PanelControlElementType.INFO_PROJECT_SHOW_PUBLICATIONS_BUTTON);
 
-  downloadSourceButton.onclick = function () {
-    return self.downloadSourceFile();
-  };
-  showPublicationsButton.onclick = function () {
-    return self.showPublicationListDialog();
-  };
+    downloadSourceButton.onclick = function () {
+        return self.downloadSourceFile();
+    };
+    showPublicationsButton.onclick = function () {
+        return self.showPublicationListDialog();
+    };
 };
 
 ProjectInfoPanel.prototype.downloadSourceFile = function () {
-  var self = this;
-  return ServerConnector.getProjectSourceDownloadUrl().then(function (url) {
-    return self.downloadFile(url);
-  }).then(null, GuiConnector.alert);
+    var self = this;
+    return ServerConnector.getProjectSourceDownloadUrl().then(function (url) {
+        return self.downloadFile(url);
+    }).then(null, GuiConnector.alert);
 };
 
 ProjectInfoPanel.prototype.showPublicationListDialog = function () {
-  return this.publicationListDialog.show();
+    return this.publicationListDialog.show();
 };
 
 ProjectInfoPanel.prototype.refresh = function () {
-  var self = this;
-
-  var projectNameText = self.getControlElement(PanelControlElementType.INFO_PROJECT_NAME_TEXT);
-  var projectVersionText = self.getControlElement(PanelControlElementType.INFO_PROJECT_VERSION_TEXT);
-  var projectPublicationsText = self.getControlElement(PanelControlElementType.INFO_PROJECT_PUBLICATIONS_TEXT);
-
-  return ServerConnector.getProject().then(function (project) {
-    projectNameText.innerHTML = project.getName();
-    projectVersionText.innerHTML = project.getVersion();
-    return ServerConnector.getProjectStatistics();
-  }).then(function (statistics) {
-    projectPublicationsText.innerHTML = statistics.getPublicationCount();
-    return ServerConnector.getLoggedUser();
-  }).then(function (user) {
-    self.showUserProfilePage(user);
-  });
+    var self = this;
+
+    var projectNameText = self.getControlElement(PanelControlElementType.INFO_PROJECT_NAME_TEXT);
+    var projectVersionText = self.getControlElement(PanelControlElementType.INFO_PROJECT_VERSION_TEXT);
+    var projectPublicationsText = self.getControlElement(PanelControlElementType.INFO_PROJECT_PUBLICATIONS_TEXT);
+
+    return ServerConnector.getProject().then(function (project) {
+        projectNameText.innerHTML = project.getName();
+        projectVersionText.innerHTML = project.getVersion();
+        return ServerConnector.getProjectStatistics();
+    }).then(function (statistics) {
+        projectPublicationsText.innerHTML = statistics.getPublicationCount();
+        return ServerConnector.getLoggedUser();
+    }).then(function (user) {
+        self.showUserProfilePage(user);
+    });
 };
 
 ProjectInfoPanel.prototype._createUserDataTab = function () {
-  var self = this;
-  var guiUtils = self.getGuiUtils();
-  var userDataDiv = Functions.createElement({
-    type: "div",
-    name: "userDataTab",
-    className: "searchPanel",
-    style: "display:none"
-  });
-  this.getElement().appendChild(userDataDiv);
-  this.setControlElement(PanelControlElementType.USER_TAB_USER_DIV, userDataDiv);
+    var self = this;
+    var guiUtils = self.getGuiUtils();
+    var userDataDiv = Functions.createElement({
+        type: "div",
+        name: "userDataTab",
+        className: "searchPanel",
+        style: "display:none"
+    });
+    this.getElement().appendChild(userDataDiv);
+    this.setControlElement(PanelControlElementType.USER_TAB_USER_DIV, userDataDiv);
 
-  var userDataTitle = Functions.createElement({
-    type: "h3",
-    content: '<img src="./resources/images/profile.png" border="0" align="left"/><br/>User data<br/>'
-  });
-  userDataDiv.appendChild(userDataTitle);
+    var userDataTitle = Functions.createElement({
+        type: "h3",
+        content: '<img src="./resources/images/profile.png" border="0" align="left"/><br/>User data<br/>'
+    });
+    userDataDiv.appendChild(userDataTitle);
 
-  var userDataFormTab = Functions.createElement({
-    type: "div",
-    style: "width:100%;display: table;border-spacing: 10px;"
-  });
-  userDataDiv.appendChild(userDataFormTab);
+    var userDataFormTab = Functions.createElement({
+        type: "div",
+        style: "width:100%;display: table;border-spacing: 10px;"
+    });
+    userDataDiv.appendChild(userDataFormTab);
 
-  var loginLabel = Functions.createElement({
-    type: "span",
-    content: "LOGIN:",
-    style: "color:#999999"
-  });
-  var loginText = Functions.createElement({
-    type: "span",
-    name: "loginValue"
-  });
-  this.setControlElement(PanelControlElementType.USER_TAB_LOGIN_TEXT, loginText);
-  userDataDiv.appendChild(guiUtils.createTableRow([loginLabel, loginText]));
+    var loginLabel = Functions.createElement({
+        type: "span",
+        content: "LOGIN:",
+        style: "color:#999999"
+    });
+    var loginText = Functions.createElement({
+        type: "span",
+        name: "loginValue"
+    });
+    this.setControlElement(PanelControlElementType.USER_TAB_LOGIN_TEXT, loginText);
+    userDataDiv.appendChild(guiUtils.createTableRow([loginLabel, loginText]));
 
-  var nameLabel = Functions.createElement({
-    type: "span",
-    content: "NAME:",
-    style: "color:#999999"
-  });
-  var nameText = Functions.createElement({
-    type: "span",
-    name: "nameValue"
-  });
-  this.setControlElement(PanelControlElementType.USER_TAB_NAME_TEXT, nameText);
-  userDataDiv.appendChild(guiUtils.createTableRow([nameLabel, nameText]));
+    var nameLabel = Functions.createElement({
+        type: "span",
+        content: "NAME:",
+        style: "color:#999999"
+    });
+    var nameText = Functions.createElement({
+        type: "span",
+        name: "nameValue"
+    });
+    this.setControlElement(PanelControlElementType.USER_TAB_NAME_TEXT, nameText);
+    userDataDiv.appendChild(guiUtils.createTableRow([nameLabel, nameText]));
 
-  var surnameLabel = Functions.createElement({
-    type: "span",
-    content: "SURNAME:",
-    style: "color:#999999"
-  });
-  var surnameText = Functions.createElement({
-    type: "span",
-    name: "surnameValue"
-  });
-  this.setControlElement(PanelControlElementType.USER_TAB_SURNAME_TEXT, surnameText);
-  userDataDiv.appendChild(guiUtils.createTableRow([surnameLabel, surnameText]));
+    var surnameLabel = Functions.createElement({
+        type: "span",
+        content: "SURNAME:",
+        style: "color:#999999"
+    });
+    var surnameText = Functions.createElement({
+        type: "span",
+        name: "surnameValue"
+    });
+    this.setControlElement(PanelControlElementType.USER_TAB_SURNAME_TEXT, surnameText);
+    userDataDiv.appendChild(guiUtils.createTableRow([surnameLabel, surnameText]));
 
-  var emailLabel = Functions.createElement({
-    type: "span",
-    content: "EMAIL:",
-    style: "color:#999999"
-  });
-  var emailText = Functions.createElement({
-    type: "span",
-    name: "emailValue"
-  });
-  self.setControlElement(PanelControlElementType.USER_TAB_EMAIL_TEXT, emailText);
-  userDataDiv.appendChild(guiUtils.createTableRow([emailLabel, emailText]));
+    var emailLabel = Functions.createElement({
+        type: "span",
+        content: "EMAIL:",
+        style: "color:#999999"
+    });
+    var emailText = Functions.createElement({
+        type: "span",
+        name: "emailValue"
+    });
+    self.setControlElement(PanelControlElementType.USER_TAB_EMAIL_TEXT, emailText);
+    userDataDiv.appendChild(guiUtils.createTableRow([emailLabel, emailText]));
 
-  var centerTag = Functions.createElement({
-    type: "center"
-  });
-  userDataDiv.appendChild(centerTag);
+    var centerTag = Functions.createElement({
+        type: "center"
+    });
+    userDataDiv.appendChild(centerTag);
 
-  var logoutButton = Functions.createElement({
-    type: "button",
-    name: "logoutButton",
-    content: "LOGOUT"
-  });
-  centerTag.appendChild(logoutButton);
-  self.setControlElement(PanelControlElementType.USER_TAB_LOGOUT_BUTTON, logoutButton);
-  self.setControlElement(PanelControlElementType.USER_TAB_USER_DIV, userDataDiv);
+    var logoutButton = Functions.createElement({
+        type: "button",
+        name: "logoutButton",
+        content: "LOGOUT"
+    });
+    centerTag.appendChild(logoutButton);
+    self.setControlElement(PanelControlElementType.USER_TAB_LOGOUT_BUTTON, logoutButton);
+    self.setControlElement(PanelControlElementType.USER_TAB_USER_DIV, userDataDiv);
 
   var loginTabDiv = Functions.createElement({
     type: "div",
@@ -322,34 +322,34 @@ ProjectInfoPanel.prototype._createUserDataTab = function () {
     return self.getParent().getLoginDialog().open();
   };
 
-  self.getElement().appendChild(loginTabDiv);
-  self.setControlElement(PanelControlElementType.USER_TAB_LOGIN_DIV, loginTabDiv);
+    self.getElement().appendChild(loginTabDiv);
+    self.setControlElement(PanelControlElementType.USER_TAB_LOGIN_DIV, loginTabDiv);
 
 };
 
 ProjectInfoPanel.prototype.showUserProfilePage = function (user) {
 
-  var self = this;
-  var userDataTabDiv = self.getControlElement(PanelControlElementType.USER_TAB_USER_DIV);
-  var userLoginTabDiv = self.getControlElement(PanelControlElementType.USER_TAB_LOGIN_DIV);
-  if (user.getLogin() !== "anonymous") {
-    var loginText = self.getControlElement(PanelControlElementType.USER_TAB_LOGIN_TEXT);
-    var nameText = self.getControlElement(PanelControlElementType.USER_TAB_NAME_TEXT);
-    var surnameText = self.getControlElement(PanelControlElementType.USER_TAB_SURNAME_TEXT);
-    var emailText = self.getControlElement(PanelControlElementType.USER_TAB_EMAIL_TEXT);
-
-    userLoginTabDiv.style.display = "none";
-    userDataTabDiv.style.display = "block";
-
-    loginText.innerHTML = user.getLogin();
-    nameText.innerHTML = user.getName();
-    surnameText.innerHTML = user.getSurname();
-    emailText.innerHTML = user.getEmail();
-  } else {
-
-    userLoginTabDiv.style.display = "block";
-    userDataTabDiv.style.display = "none";
-  }
+    var self = this;
+    var userDataTabDiv = self.getControlElement(PanelControlElementType.USER_TAB_USER_DIV);
+    var userLoginTabDiv = self.getControlElement(PanelControlElementType.USER_TAB_LOGIN_DIV);
+    if (user.getLogin() !== "anonymous") {
+        var loginText = self.getControlElement(PanelControlElementType.USER_TAB_LOGIN_TEXT);
+        var nameText = self.getControlElement(PanelControlElementType.USER_TAB_NAME_TEXT);
+        var surnameText = self.getControlElement(PanelControlElementType.USER_TAB_SURNAME_TEXT);
+        var emailText = self.getControlElement(PanelControlElementType.USER_TAB_EMAIL_TEXT);
+
+        userLoginTabDiv.style.display = "none";
+        userDataTabDiv.style.display = "block";
+
+        loginText.innerHTML = user.getLogin();
+        nameText.innerHTML = user.getName();
+        surnameText.innerHTML = user.getSurname();
+        emailText.innerHTML = user.getEmail();
+    } else {
+
+        userLoginTabDiv.style.display = "block";
+        userDataTabDiv.style.display = "none";
+    }
 };
 
 ProjectInfoPanel.prototype.init = function () {
@@ -361,4 +361,7 @@ ProjectInfoPanel.prototype.init = function () {
   });
 };
 
+ProjectInfoPanel.prototype.destroy = function () {
+    return this.publicationListDialog.destroy();
+}
 module.exports = ProjectInfoPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/SearchPanel.js b/frontend-js/src/main/js/gui/leftPanel/SearchPanel.js
index fd9775099d..5726cba066 100644
--- a/frontend-js/src/main/js/gui/leftPanel/SearchPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/SearchPanel.js
@@ -152,4 +152,9 @@ SearchPanel.prototype.addTab = function(params, navElement, contentElement) {
   }));
 };
 
+SearchPanel.prototype.destroy = function () {
+    return Promise.resolve();
+};
+
+
 module.exports = SearchPanel;
diff --git a/frontend-js/src/main/js/gui/leftPanel/SubmapPanel.js b/frontend-js/src/main/js/gui/leftPanel/SubmapPanel.js
index 2cc077f69f..bf20da848a 100644
--- a/frontend-js/src/main/js/gui/leftPanel/SubmapPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/SubmapPanel.js
@@ -11,132 +11,136 @@ var logger = require('../../logger');
 var Functions = require('../../Functions');
 
 function SubmapPanel(params) {
-  params.panelName = "submap";
-  params.helpTip = "The Submaps tab summarizes all the submap networks uploaded together and linked to the main network of <b>'"
-      + params.parent.getMap().getProject().getName() + "'</b> project.";
-  Panel.call(this, params);
+    params.panelName = "submap";
+    params.helpTip = "The Submaps tab summarizes all the submap networks uploaded together and linked to the main network of <b>'"
+        + params.parent.getMap().getProject().getName() + "'</b> project.";
+    Panel.call(this, params);
 
-  var self = this;
-  self._createSubmapGui();
+    var self = this;
+    self._createSubmapGui();
 }
 
 SubmapPanel.prototype = Object.create(Panel.prototype);
 SubmapPanel.prototype.constructor = SubmapPanel;
 
-SubmapPanel.prototype._createSubmapGui = function() {
-  var submapDiv = Functions.createElement({
-    type : "div",
-    name : "submapDiv",
-    className : "searchPanel"
-  });
-  this.getElement().appendChild(submapDiv);
-  this.setControlElement(PanelControlElementType.SUBMAP_DIV, submapDiv);
+SubmapPanel.prototype._createSubmapGui = function () {
+    var submapDiv = Functions.createElement({
+        type: "div",
+        name: "submapDiv",
+        className: "searchPanel"
+    });
+    this.getElement().appendChild(submapDiv);
+    this.setControlElement(PanelControlElementType.SUBMAP_DIV, submapDiv);
 
 };
 
-SubmapPanel.prototype.createRow = function(model) {
-  var self = this;
-  var guiUtils = self.getGuiUtils();
-  var result = document.createElement("tr");
-
-  var nameTd = document.createElement("td");
-  nameTd.innerHTML = model.getName();
-  result.appendChild(nameTd);
-
-  var openTd = document.createElement("td");
-
-  if (model.getId() !== self.getMap().getId()) {
-    var img = guiUtils.createIcon("icons/search.png");
-    var link = document.createElement("a");
-    link.href = "#";
-    link.onclick = function() {
-      self.getMap().openSubmap(model.getId());
-    };
-    link.appendChild(img);
-    openTd.appendChild(link);
-  }
+SubmapPanel.prototype.createRow = function (model) {
+    var self = this;
+    var guiUtils = self.getGuiUtils();
+    var result = document.createElement("tr");
+
+    var nameTd = document.createElement("td");
+    nameTd.innerHTML = model.getName();
+    result.appendChild(nameTd);
+
+    var openTd = document.createElement("td");
+
+    if (model.getId() !== self.getMap().getId()) {
+        var img = guiUtils.createIcon("icons/search.png");
+        var link = document.createElement("a");
+        link.href = "#";
+        link.onclick = function () {
+            self.getMap().openSubmap(model.getId());
+        };
+        link.appendChild(img);
+        openTd.appendChild(link);
+    }
 
-  result.appendChild(openTd);
+    result.appendChild(openTd);
 
-  return result;
+    return result;
 };
 
-SubmapPanel.prototype.createTableHeader = function() {
-  var result = document.createElement("thead");
+SubmapPanel.prototype.createTableHeader = function () {
+    var result = document.createElement("thead");
 
-  var row = document.createElement("tr");
+    var row = document.createElement("tr");
 
-  var nameTd = document.createElement("th");
-  nameTd.innerHTML = "Name";
-  row.appendChild(nameTd);
+    var nameTd = document.createElement("th");
+    nameTd.innerHTML = "Name";
+    row.appendChild(nameTd);
 
-  row.appendChild(Functions.createElement({
-    type : "th",
-    style : "width: 60px;",
-    content : "View"
-  }));
+    row.appendChild(Functions.createElement({
+        type: "th",
+        style: "width: 60px;",
+        content: "View"
+    }));
 
-  result.appendChild(row);
-  return result;
+    result.appendChild(row);
+    return result;
 };
 
-SubmapPanel.prototype.init = function() {
-  var self = this;
-  return new Promise(function(resolve) {
-    var div = self.getControlElement(PanelControlElementType.SUBMAP_DIV);
-    div.innerHTML = "";
-    var models = self.getMap().getProject().getModel().getSubmodels();
-    var modelsByType = [];
-    var types = [];
-    var i;
-    for (i = 0; i < models.length; i++) {
-      var model = models[i];
-      if (modelsByType[model.getSubmodelType()] === undefined) {
-        modelsByType[model.getSubmodelType()] = [];
-        types.push(model.getSubmodelType());
-      }
-      modelsByType[model.getSubmodelType()].push(model);
-    }
-    for (i = 0; i < types.length; i++) {
-      var type = types[i];
-      div.appendChild(self.createTable(modelsByType[type], type + " submaps"));
-    }
-    if (models.length === 0) {
-      self.getParent().hideTab(self);
+SubmapPanel.prototype.init = function () {
+    var self = this;
+    return new Promise(function (resolve) {
+        var div = self.getControlElement(PanelControlElementType.SUBMAP_DIV);
+        div.innerHTML = "";
+        var models = self.getMap().getProject().getModel().getSubmodels();
+        var modelsByType = [];
+        var types = [];
+        var i;
+        for (i = 0; i < models.length; i++) {
+            var model = models[i];
+            if (modelsByType[model.getSubmodelType()] === undefined) {
+                modelsByType[model.getSubmodelType()] = [];
+                types.push(model.getSubmodelType());
+            }
+            modelsByType[model.getSubmodelType()].push(model);
+        }
+        for (i = 0; i < types.length; i++) {
+            var type = types[i];
+            div.appendChild(self.createTable(modelsByType[type], type + " submaps"));
+        }
+        if (models.length === 0) {
+            self.getParent().hideTab(self);
+        }
+        return resolve();
+    });
+};
+
+SubmapPanel.prototype.createTable = function (models, type) {
+    var self = this;
+    var result = Functions.createElement({
+        type: "div",
+    });
+
+    var title = Functions.createElement({
+        type: "h5",
+        content: type
+    });
+    result.appendChild(title);
+
+    var table = Functions.createElement({
+        type: "table",
+        className: "table table-bordered",
+        style: "width:100%"
+    });
+    result.appendChild(table);
+
+    table.appendChild(self.createTableHeader());
+    var tableBody = Functions.createElement({
+        type: "tbody",
+    });
+    table.appendChild(tableBody);
+
+    for (var i = 0; i < models.length; i++) {
+        tableBody.appendChild(self.createRow(models[i]));
     }
-    return resolve();
-  });
+    return result;
 };
 
-SubmapPanel.prototype.createTable = function(models, type) {
-  var self = this;
-  var result = Functions.createElement({
-    type : "div",
-  });
-
-  var title = Functions.createElement({
-    type : "h5",
-    content : type
-  });
-  result.appendChild(title);
-
-  var table = Functions.createElement({
-    type : "table",
-    className : "table table-bordered",
-    style : "width:100%"
-  });
-  result.appendChild(table);
-
-  table.appendChild(self.createTableHeader());
-  var tableBody = Functions.createElement({
-    type : "tbody",
-  });
-  table.appendChild(tableBody);
-
-  for (var i = 0; i < models.length; i++) {
-    tableBody.appendChild(self.createRow(models[i]));
-  }
-  return result;
+SubmapPanel.prototype.destroy = function () {
+    return Promise.resolve();
 };
 
 module.exports = SubmapPanel;
diff --git a/frontend-js/src/main/js/gui/topMenu/TopMenu.js b/frontend-js/src/main/js/gui/topMenu/TopMenu.js
index cd80bd94f6..062a1d4cae 100644
--- a/frontend-js/src/main/js/gui/topMenu/TopMenu.js
+++ b/frontend-js/src/main/js/gui/topMenu/TopMenu.js
@@ -12,218 +12,223 @@ var Functions = require('../../Functions');
 var logger = require('../../logger');
 
 function TopMenu(params) {
-  AbstractGuiElement.call(this, params);
-  var self = this;
+    AbstractGuiElement.call(this, params);
+    var self = this;
 
-  self._createGui();
+    self._createGui();
 }
 
 TopMenu.prototype = Object.create(AbstractGuiElement.prototype);
 TopMenu.prototype.constructor = TopMenu;
 
-TopMenu.prototype._createGui = function() {
-  var self = this;
-
-  var overviewDialogDiv = Functions.createElement({
-    type : "div",
-    name : "overviewDialog"
-  });
-  self.getElement().appendChild(overviewDialogDiv);
-  self.setControlElement(PanelControlElementType.OVERVIEW_DIALOG_DIV, overviewDialogDiv);
-
-  var hideButtonDiv = Functions.createElement({
-    type : "div",
-    className : "headerHideDivButton"
-  });
-  self.getElement().appendChild(hideButtonDiv);
-
-  var hideButton = Functions.createElement({
-    type : "button",
-    className : "headerHideButton",
-    name : "hideButton",
-  });
-  hideButtonDiv.appendChild(hideButton);
-  self.setControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON, hideButton);
-
-  var hideButtonIcon = Functions.createElement({
-    type : "i",
-    className : "fa fa-chevron-left",
-    name : "hideButtonIcon",
-  });
-  hideButton.appendChild(hideButtonIcon);
-  self.setControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON_ICON, hideButtonIcon);
-
-  var versionDiv = Functions.createElement({
-    type : "div",
-    className : "headerTextBold",
-    name : "versionDiv"
-  });
-  self.getElement().appendChild(versionDiv);
-  self.setControlElement(PanelControlElementType.MENU_VERSION_DIV, versionDiv);
-
-  var showOverviewDiv = Functions.createElement({
-    type : "div",
-    style : "float: left;",
-  });
-  self.getElement().appendChild(showOverviewDiv);
-
-  var showOverviewButton = Functions.createElement({
-    type : "button",
-    className : "minerva-overview-button",
-    name : "showOverviewButton",
-    content : "<i class='fa fa-sitemap' style='font-size:18px; font-weight:400; padding-right:10px;'></i><span >SHOW OVERVIEW</span>",
-    style : "display:none",
-  });
-  showOverviewDiv.appendChild(showOverviewButton);
-  self.setControlElement(PanelControlElementType.MENU_SHOW_OVERVIEW_BUTTON, showOverviewButton);
-
-  var rightHeaderMenuDiv = Functions.createElement({
-    type : "div",
-    className : "rightHeaderMenu",
-  });
-  self.getElement().appendChild(rightHeaderMenuDiv);
-
-  var div4checkboxes = Functions.createElement({
-    type : "div",
-    className : "minerva-top-checkbox-div",
-  });
-  rightHeaderMenuDiv.appendChild(div4checkboxes);
-
-  var legendCheckbox = Functions.createElement({
-    type : "input",
-    inputType : "checkbox",
-    name : "legendCheckbox",
-  });
-  div4checkboxes.appendChild(legendCheckbox);
-  self.setControlElement(PanelControlElementType.MENU_LEGEND_CHECKBOX, legendCheckbox);
-
-  div4checkboxes.appendChild(Functions.createElement({
-    type : "label",
-    content : "LEGEND",
-  }));
-
-  var commentCheckbox = Functions.createElement({
-    type : "input",
-    inputType : "checkbox",
-    name : "commentCheckbox",
-  });
-  div4checkboxes.appendChild(commentCheckbox);
-  self.setControlElement(PanelControlElementType.MENU_COMMENTS_CHECKBOX, commentCheckbox);
-
-  div4checkboxes.appendChild(Functions.createElement({
-    type : "label",
-    content : "COMMENTS",
-  }));
-
-  var refreshCommentButton = Functions.createElement({
-    type : "button",
-    className : "minerva-overview-button",
-    name : "refreshCommentButton",
-    content : "<i class='fa fa-refresh' style='font-size:21px; font-weight:400;'></i>",
-    style : "display:none",
-  });
-  div4checkboxes.appendChild(refreshCommentButton);
-  self.setControlElement(PanelControlElementType.MENU_REFRESH_COMMENTS_BUTTON, refreshCommentButton);
-
-  var clearButton = Functions.createElement({
-    type : "button",
-    className : "minerva-overview-button",
-    name : "clearButton",
-    content : "<i class='fa fa-times' style='font-size:18px; font-weight:300; padding-right:10px;'></i>CLEAR",
-  });
-  rightHeaderMenuDiv.appendChild(clearButton);
-  self.setControlElement(PanelControlElementType.MENU_CLEAR_BUTTON, clearButton);
+TopMenu.prototype._createGui = function () {
+    var self = this;
+
+    var overviewDialogDiv = Functions.createElement({
+        type: "div",
+        name: "overviewDialog"
+    });
+    self.getElement().appendChild(overviewDialogDiv);
+    self.setControlElement(PanelControlElementType.OVERVIEW_DIALOG_DIV, overviewDialogDiv);
+
+    var hideButtonDiv = Functions.createElement({
+        type: "div",
+        className: "headerHideDivButton"
+    });
+    self.getElement().appendChild(hideButtonDiv);
+
+    var hideButton = Functions.createElement({
+        type: "button",
+        className: "headerHideButton",
+        name: "hideButton",
+    });
+    hideButtonDiv.appendChild(hideButton);
+    self.setControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON, hideButton);
+
+    var hideButtonIcon = Functions.createElement({
+        type: "i",
+        className: "fa fa-chevron-left",
+        name: "hideButtonIcon",
+    });
+    hideButton.appendChild(hideButtonIcon);
+    self.setControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON_ICON, hideButtonIcon);
+
+    var versionDiv = Functions.createElement({
+        type: "div",
+        className: "headerTextBold",
+        name: "versionDiv"
+    });
+    self.getElement().appendChild(versionDiv);
+    self.setControlElement(PanelControlElementType.MENU_VERSION_DIV, versionDiv);
+
+    var showOverviewDiv = Functions.createElement({
+        type: "div",
+        style: "float: left;",
+    });
+    self.getElement().appendChild(showOverviewDiv);
+
+    var showOverviewButton = Functions.createElement({
+        type: "button",
+        className: "minerva-overview-button",
+        name: "showOverviewButton",
+        content: "<i class='fa fa-sitemap' style='font-size:18px; font-weight:400; padding-right:10px;'></i><span >SHOW OVERVIEW</span>",
+        style: "display:none",
+    });
+    showOverviewDiv.appendChild(showOverviewButton);
+    self.setControlElement(PanelControlElementType.MENU_SHOW_OVERVIEW_BUTTON, showOverviewButton);
+
+    var rightHeaderMenuDiv = Functions.createElement({
+        type: "div",
+        className: "rightHeaderMenu",
+    });
+    self.getElement().appendChild(rightHeaderMenuDiv);
+
+    var div4checkboxes = Functions.createElement({
+        type: "div",
+        className: "minerva-top-checkbox-div",
+    });
+    rightHeaderMenuDiv.appendChild(div4checkboxes);
+
+    var legendCheckbox = Functions.createElement({
+        type: "input",
+        inputType: "checkbox",
+        name: "legendCheckbox",
+    });
+    div4checkboxes.appendChild(legendCheckbox);
+    self.setControlElement(PanelControlElementType.MENU_LEGEND_CHECKBOX, legendCheckbox);
+
+    div4checkboxes.appendChild(Functions.createElement({
+        type: "label",
+        content: "LEGEND",
+    }));
+
+    var commentCheckbox = Functions.createElement({
+        type: "input",
+        inputType: "checkbox",
+        name: "commentCheckbox",
+    });
+    div4checkboxes.appendChild(commentCheckbox);
+    self.setControlElement(PanelControlElementType.MENU_COMMENTS_CHECKBOX, commentCheckbox);
+
+    div4checkboxes.appendChild(Functions.createElement({
+        type: "label",
+        content: "COMMENTS",
+    }));
+
+    var refreshCommentButton = Functions.createElement({
+        type: "button",
+        className: "minerva-overview-button",
+        name: "refreshCommentButton",
+        content: "<i class='fa fa-refresh' style='font-size:21px; font-weight:400;'></i>",
+        style: "display:none",
+    });
+    div4checkboxes.appendChild(refreshCommentButton);
+    self.setControlElement(PanelControlElementType.MENU_REFRESH_COMMENTS_BUTTON, refreshCommentButton);
+
+    var clearButton = Functions.createElement({
+        type: "button",
+        className: "minerva-overview-button",
+        name: "clearButton",
+        content: "<i class='fa fa-times' style='font-size:18px; font-weight:300; padding-right:10px;'></i>CLEAR",
+    });
+    rightHeaderMenuDiv.appendChild(clearButton);
+    self.setControlElement(PanelControlElementType.MENU_CLEAR_BUTTON, clearButton);
 
 };
 
-TopMenu.prototype.init = function() {
-  var self = this;
-  self.getControlElement(PanelControlElementType.MENU_LEGEND_CHECKBOX).onclick = function() {
-    var legend = self.getLegend();
-    if (this.checked) {
-      legend.show();
-    } else {
-      legend.hide();
-    }
-  };
-  var hideButton = self.getControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON);
-  var icon = self.getControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON_ICON);
-  hideButton.onclick = function() {
-    if (icon.className.indexOf("fa-chevron-left") >= 0) {
-      icon.className = "fa fa-chevron-right";
-      self.getLeftPanel().hide();
-    } else {
-      icon.className = "fa fa-chevron-left";
-      self.getLeftPanel().show();
-    }
-    google.maps.event.trigger(self.getMap().getGoogleMap(), 'resize');
-  };
-
-  var project = self.getMap().getProject();
-  self.getControlElement(PanelControlElementType.MENU_VERSION_DIV).innerHTML = project.getVersion();
-
-  var commentCheckbox = self.getControlElement(PanelControlElementType.MENU_COMMENTS_CHECKBOX);
-  var refreshCommentButton = self.getControlElement(PanelControlElementType.MENU_REFRESH_COMMENTS_BUTTON);
-  commentCheckbox.onclick = function() {
-    ServerConnector.getSessionData(project).setShowComments(commentCheckbox.checked);
-    if (commentCheckbox.checked) {
-      refreshCommentButton.style.display = 'inline';
-    } else {
-      refreshCommentButton.style.display = 'none';
-    }
-    return self.getMap().refreshComments().then(null, GuiConnector.alert);
-  };
-  refreshCommentButton.onclick = (function() {
-    return function() {
-      self.getMap().refreshComments();
-      return false;
+TopMenu.prototype.init = function () {
+    var self = this;
+    self.getControlElement(PanelControlElementType.MENU_LEGEND_CHECKBOX).onclick = function () {
+        var legend = self.getLegend();
+        if (this.checked) {
+            legend.show();
+        } else {
+            legend.hide();
+        }
+    };
+    var hideButton = self.getControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON);
+    var icon = self.getControlElement(PanelControlElementType.MENU_HIDE_LEFT_PANEL_BUTTON_ICON);
+    hideButton.onclick = function () {
+        if (icon.className.indexOf("fa-chevron-left") >= 0) {
+            icon.className = "fa fa-chevron-right";
+            self.getLeftPanel().hide();
+        } else {
+            icon.className = "fa fa-chevron-left";
+            self.getLeftPanel().show();
+        }
+        google.maps.event.trigger(self.getMap().getGoogleMap(), 'resize');
     };
-  })();
 
-  var clearButton = self.getControlElement(PanelControlElementType.MENU_CLEAR_BUTTON);
-  clearButton.onclick = (function() {
-    return function() {
-      return self.getMap().clearDbOverlays();
+    var project = self.getMap().getProject();
+    self.getControlElement(PanelControlElementType.MENU_VERSION_DIV).innerHTML = project.getVersion();
+
+    var commentCheckbox = self.getControlElement(PanelControlElementType.MENU_COMMENTS_CHECKBOX);
+    var refreshCommentButton = self.getControlElement(PanelControlElementType.MENU_REFRESH_COMMENTS_BUTTON);
+    commentCheckbox.onclick = function () {
+        ServerConnector.getSessionData(project).setShowComments(commentCheckbox.checked);
+        if (commentCheckbox.checked) {
+            refreshCommentButton.style.display = 'inline';
+        } else {
+            refreshCommentButton.style.display = 'none';
+        }
+        return self.getMap().refreshComments().then(null, GuiConnector.alert);
     };
-  })();
+    refreshCommentButton.onclick = (function () {
+        return function () {
+            self.getMap().refreshComments();
+            return false;
+        };
+    })();
 
-  if (project.getTopOverviewImage() !== undefined && project.getTopOverviewImage() !== null) {
-    var overviewDialog = new OverviewDialog({
-      customMap : self.getMap(),
-      element : self.getControlElement(PanelControlElementType.OVERVIEW_DIALOG_DIV)
-    });
-    var showOverviewButton = self.getControlElement(PanelControlElementType.MENU_SHOW_OVERVIEW_BUTTON);
-    showOverviewButton.onclick = (function() {
-      return function() {
-        overviewDialog.showOverview();
-        return false;
-      };
+    var clearButton = self.getControlElement(PanelControlElementType.MENU_CLEAR_BUTTON);
+    clearButton.onclick = (function () {
+        return function () {
+            return self.getMap().clearDbOverlays();
+        };
     })();
-    showOverviewButton.style.display = "";
-  }
 
-  if (ServerConnector.getSessionData().getShowComments()) {
-    self.getControlElement(PanelControlElementType.MENU_COMMENTS_CHECKBOX).checked = true;
-    return self.getMap().refreshComments();
-  } else {
-    return Promise.resolve();
-  }
+    if (project.getTopOverviewImage() !== undefined && project.getTopOverviewImage() !== null) {
+        self._overviewDialog = new OverviewDialog({
+            customMap: self.getMap(),
+            element: self.getControlElement(PanelControlElementType.OVERVIEW_DIALOG_DIV)
+        });
+        var showOverviewButton = self.getControlElement(PanelControlElementType.MENU_SHOW_OVERVIEW_BUTTON);
+        showOverviewButton.onclick = function () {
+            return self._overviewDialog.showOverview();
+        };
+        showOverviewButton.style.display = "";
+    }
+
+    if (ServerConnector.getSessionData().getShowComments()) {
+        self.getControlElement(PanelControlElementType.MENU_COMMENTS_CHECKBOX).checked = true;
+        return self.getMap().refreshComments();
+    } else {
+        return Promise.resolve();
+    }
+};
+
+TopMenu.prototype.setLegend = function (legend) {
+    this._legend = legend;
 };
 
-TopMenu.prototype.setLegend = function(legend) {
-  this._legend = legend;
+TopMenu.prototype.getLegend = function () {
+    return this._legend;
 };
 
-TopMenu.prototype.getLegend = function() {
-  return this._legend;
+TopMenu.prototype.setLeftPanel = function (leftPanel) {
+    this._leftPanel = leftPanel;
 };
 
-TopMenu.prototype.setLeftPanel = function(leftPanel) {
-  this._leftPanel = leftPanel;
+TopMenu.prototype.getLeftPanel = function () {
+    return this._leftPanel;
 };
 
-TopMenu.prototype.getLeftPanel = function() {
-  return this._leftPanel;
+TopMenu.prototype.destroy = function () {
+    var self = this;
+    if (self._overviewDialog !== undefined) {
+        self._overviewDialog.destroy();
+    }
+    return Promise.resolve();
 };
 
 module.exports = TopMenu;
\ No newline at end of file
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 9d55d00fe1..5af13d335a 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -1238,6 +1238,10 @@ CustomMap.prototype.destroy = function () {
   if (commentDialog !== undefined) {
     commentDialog.destroy();
   }
+  var submaps = self.getSubmaps();
+  for (var i=0;i<submaps.length;i++) {
+    submaps[i].destroy();
+  }
 };
 
 CustomMap.prototype.getVisibleDataOverlays = function () {
diff --git a/frontend-js/src/main/js/map/Submap.js b/frontend-js/src/main/js/map/Submap.js
index ea36bbea10..4ce6afb62c 100644
--- a/frontend-js/src/main/js/map/Submap.js
+++ b/frontend-js/src/main/js/map/Submap.js
@@ -10,25 +10,25 @@ var TouchMap = require('./TouchMap');
 /**
  * Constructor of a submap. Submaps are created on application start. But dialog
  * (popup window) is initialized on demand using init function.
- * 
+ *
  * @param customMap
  *          parent CustomMap
  * @param id
  *          identifier of the submap
  */
 function Submap(customMap, model) {
-  this.setCustomMap(customMap);
-
-  AbstractCustomMap.call(this, model, new CustomMapOptions({
-    element : customMap.getGoogleMap().getDiv(),
-    markerOptimization : customMap.isMarkerOptimization(),
-    bigLogo : customMap.isBigLogo(),
-    customTouchInterface : customMap.isCustomTouchInterface(),
-    project : null,
-    debug : customMap.isDebug()
-  }));
-
-  this.initialized = false;
+    this.setCustomMap(customMap);
+
+    AbstractCustomMap.call(this, model, new CustomMapOptions({
+        element: customMap.getGoogleMap().getDiv(),
+        markerOptimization: customMap.isMarkerOptimization(),
+        bigLogo: customMap.isBigLogo(),
+        customTouchInterface: customMap.isCustomTouchInterface(),
+        project: null,
+        debug: customMap.isDebug()
+    }));
+
+    this.initialized = false;
 }
 
 // implementation of object inheritance
@@ -38,100 +38,107 @@ Submap.prototype.constructor = Submap;
 /**
  * This method initializes submap with gui component. Before this point submap
  * is created and contains data, but cannot be visualized in the broswer.
- * 
+ *
  * @param htmlTag
  *          html div tag where google map should be placed
  * @param jsVar
  *          javascript component of primefaces popup dialog where submap will be
  *          visualized
  */
-Submap.prototype.open = function(htmlTag) {
-  var self = this;
+Submap.prototype.open = function (htmlTag) {
+    var self = this;
 
-  if (!this.initialized) {
-    self.htmlTag = htmlTag;
+    if (!this.initialized) {
+        self.htmlTag = htmlTag;
 
-    var mapOptions = self.creatMapOptions(self.getLayouts().length);
+        var mapOptions = self.creatMapOptions(self.getLayouts().length);
 
-    var contentDiv = document.createElement("div");
-    contentDiv.setAttribute("name", "submap-div-" + self.getId());
-    contentDiv.style.width = "100%";
-    contentDiv.style.height = "100%";
-    htmlTag.appendChild(contentDiv);
+        var contentDiv = document.createElement("div");
+        contentDiv.setAttribute("name", "submap-div-" + self.getId());
+        contentDiv.style.width = "100%";
+        contentDiv.style.height = "100%";
+        htmlTag.appendChild(contentDiv);
 
-    var mapDiv = document.createElement("div");
-    mapDiv.style.width = "100%";
-    mapDiv.style.height = "100%";
-    contentDiv.appendChild(mapDiv);
+        var mapDiv = document.createElement("div");
+        mapDiv.style.width = "100%";
+        mapDiv.style.height = "100%";
+        contentDiv.appendChild(mapDiv);
 
-    $(self.htmlTag).dialog({
-      title : self.getModel().getName(),
-      width : Math.floor(window.innerWidth * 2 / 3),
-      height : Math.floor(window.innerHeight * 2 / 3),
-      position : {
-        my : "center",
-        at : "center",
-        of : $(self.getTopMap().getElement()),
-      },
-    });
+        $(self.htmlTag).dialog({
+            title: self.getModel().getName(),
+            width: Math.floor(window.innerWidth * 2 / 3),
+            height: Math.floor(window.innerHeight * 2 / 3),
+            position: {
+                my: "center",
+                at: "center",
+                of: $(self.getTopMap().getElement()),
+            },
+        });
 
-    $(self.htmlTag).dialog("open");
+        $(self.htmlTag).dialog("open");
 
-    self.setGoogleMap(new google.maps.Map(mapDiv, mapOptions));
-    self._createMapChangedCallbacks();
+        self.setGoogleMap(new google.maps.Map(mapDiv, mapOptions));
+        self._createMapChangedCallbacks();
 
-    $(self.htmlTag).bind("resize", function() {
-      google.maps.event.trigger(self.getGoogleMap(), 'resize');
-    });
+        $(self.htmlTag).bind("resize", function () {
+            google.maps.event.trigger(self.getGoogleMap(), 'resize');
+        });
 
-    google.maps.event.trigger(self.getGoogleMap(), 'resize');
+        google.maps.event.trigger(self.getGoogleMap(), 'resize');
 
-    if (self.isCustomTouchInterface()) {
-      self._touchInterface = new TouchMap(self);
-    }
+        if (self.isCustomTouchInterface()) {
+            self._touchInterface = new TouchMap(self);
+        }
+
+        self.setupLayouts();
 
-    self.setupLayouts();
+        self.registerMapClickEvents();
 
-    self.registerMapClickEvents();
+        var centerPoint = self.getModel().getCenterLatLng();
+        self.getGoogleMap().setCenter(centerPoint);
 
-    var centerPoint = self.getModel().getCenterLatLng();
-    self.getGoogleMap().setCenter(centerPoint);
+        var sessionData = ServerConnector.getSessionData(this.getProject());
+        // and now send the zoom level to the client side
+        google.maps.event.addListener(self.getGoogleMap(), 'zoom_changed', function () {
+            sessionData.setZoomLevel(self.getModel(), self.getGoogleMap().getZoom());
+        });
 
-    var sessionData = ServerConnector.getSessionData(this.getProject());
-    // and now send the zoom level to the client side
-    google.maps.event.addListener(self.getGoogleMap(), 'zoom_changed', function() {
-      sessionData.setZoomLevel(self.getModel(), self.getGoogleMap().getZoom());
-    });
+        sessionData.setZoomLevel(self.getModel(), self.getGoogleMap().getZoom());
 
-    sessionData.setZoomLevel(self.getModel(), self.getGoogleMap().getZoom());
+        self.initialized = true;
+    } else {
+        $(self.htmlTag).dialog("open");
+    }
 
-    self.initialized = true;
-  } else {
-    $(self.htmlTag).dialog("open");
-  }
+};
 
+Submap.prototype.openDataOverlay = function (identifier) {
+    if (this.initialized) {
+        this.getGoogleMap().setMapTypeId(identifier.toString());
+    }
 };
 
-Submap.prototype.openDataOverlay = function(identifier) {
-  if (this.initialized) {
-    this.getGoogleMap().setMapTypeId(identifier.toString());
-  }
+Submap.prototype.getTopMap = function () {
+    return this.getCustomMap();
 };
 
-Submap.prototype.getTopMap = function() {
-  return this.getCustomMap();
+Submap.prototype.getCustomMap = function () {
+    return this._customMap;
 };
 
-Submap.prototype.getCustomMap = function() {
-  return this._customMap;
+Submap.prototype.setCustomMap = function (customMap) {
+    this._customMap = customMap;
 };
 
-Submap.prototype.setCustomMap = function(customMap) {
-  this._customMap = customMap;
+Submap.prototype.getProject = function () {
+    return this.getCustomMap().getProject();
 };
 
-Submap.prototype.getProject = function() {
-  return this.getCustomMap().getProject();
+Submap.prototype.destroy = function () {
+    var self = this;
+    if (self.initialized) {
+        $(self.htmlTag).dialog("destroy");
+    }
 };
 
 module.exports = Submap;
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index d6aa160a57..85dea4e3fd 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -29,628 +29,631 @@ var logger = require('./logger');
 var customMap, leftPanel, topMenu, legend, mapContextMenu, selectionContextMenu;
 
 function processUrlGetParams(params) {
-  var project = params.getProject();
-  var sessionData = ServerConnector.getSessionData(project);
-
-  var modelId = project.getModel().getId();
-  if (GuiConnector.getParams["submap"] !== undefined) {
-    modelId = parseInt(GuiConnector.getParams["submap"]);
-  }
-
-  var model = project.getModel().getSubmodelById(modelId);
-
-  if (GuiConnector.getParams["x"] !== undefined && GuiConnector.getParams["y"] !== undefined) {
-    var point = new google.maps.Point(GuiConnector.getParams["x"], GuiConnector.getParams["y"]);
-    sessionData.setCenter(model, point);
-  }
-  if (GuiConnector.getParams["zoom"] !== undefined) {
-    sessionData.setZoomLevel(model, GuiConnector.getParams["zoom"]);
-  }
-
-  if (GuiConnector.getParams["comments"] === "on") {
-    sessionData.setShowComments(true);
-  }
-  if (GuiConnector.getParams["search"] !== undefined) {
-    var query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
-        GuiConnector.getParams["search"]);
-    sessionData.setSearchQuery(query);
-  }
+    var project = params.getProject();
+    var sessionData = ServerConnector.getSessionData(project);
+
+    var modelId = project.getModel().getId();
+    if (GuiConnector.getParams["submap"] !== undefined) {
+        modelId = parseInt(GuiConnector.getParams["submap"]);
+    }
+
+    var model = project.getModel().getSubmodelById(modelId);
+
+    if (GuiConnector.getParams["x"] !== undefined && GuiConnector.getParams["y"] !== undefined) {
+        var point = new google.maps.Point(GuiConnector.getParams["x"], GuiConnector.getParams["y"]);
+        sessionData.setCenter(model, point);
+    }
+    if (GuiConnector.getParams["zoom"] !== undefined) {
+        sessionData.setZoomLevel(model, GuiConnector.getParams["zoom"]);
+    }
+
+    if (GuiConnector.getParams["comments"] === "on") {
+        sessionData.setShowComments(true);
+    }
+    if (GuiConnector.getParams["search"] !== undefined) {
+        var query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY,
+            GuiConnector.getParams["search"]);
+        sessionData.setSearchQuery(query);
+    }
 
 }
 
 function insertGoogleAnalyticsCode() {
-  return ServerConnector.getConfigurationParam(ConfigurationType.GOOGLE_ANALYTICS_IDENTIFIER).then(
-      function(identifier) {
-        if (identifier === "" || identifier === undefined || identifier === null) {
-          return;
-        } else {
-          global._gaq = global._gaq || [];
-          global._gaq.push([ '_setAccount', identifier ]);
-          global._gaq.push([ '_trackPageview' ]);
-
-          (function() {
-            var ga = document.createElement('script');
-            ga.type = 'text/javascript';
-            ga.async = true;
-            ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www')
-                + '.google-analytics.com/ga.js';
-            var s = document.getElementsByTagName('script')[0];
-            s.parentNode.insertBefore(ga, s);
-          })();
-          return;
-        }
-      });
+    return ServerConnector.getConfigurationParam(ConfigurationType.GOOGLE_ANALYTICS_IDENTIFIER).then(
+        function (identifier) {
+            if (identifier === "" || identifier === undefined || identifier === null) {
+                return;
+            } else {
+                global._gaq = global._gaq || [];
+                global._gaq.push(['_setAccount', identifier]);
+                global._gaq.push(['_trackPageview']);
+
+                (function () {
+                    var ga = document.createElement('script');
+                    ga.type = 'text/javascript';
+                    ga.async = true;
+                    ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www')
+                        + '.google-analytics.com/ga.js';
+                    var s = document.getElementsByTagName('script')[0];
+                    s.parentNode.insertBefore(ga, s);
+                })();
+                return;
+            }
+        });
 }
+
 function createDivStructure(element) {
-  var leftPanelDiv = functions.createElement({
-    type : "div",
-    name : "leftPanelDiv",
-    className : "minerva-left-panel",
-  });
-  element.appendChild(leftPanelDiv);
-  var rightPanelDiv = functions.createElement({
-    type : "div",
-    style : "display: table-cell;height:100%;width:100%;",
-  });
-  element.appendChild(rightPanelDiv);
-
-  var rightPanelContainerDiv = functions.createElement({
-    type : "div",
-    style : "height:100%;width:100%;position:relative",
-  });
-  rightPanelDiv.appendChild(rightPanelContainerDiv);
-
-  var menuDiv = functions.createElement({
-    type : "div",
-    name : "menuDiv",
-    className : "menuBelt",
-  });
-  rightPanelContainerDiv.appendChild(menuDiv);
-
-  var mapDiv = functions.createElement({
-    type : "div",
-    name : "mapDiv",
-    className : "mapClass",
-  });
-  rightPanelContainerDiv.appendChild(mapDiv);
-
-  var legendDiv = functions.createElement({
-    type : "div",
-    name : "legendDiv",
-    className : "minerva-legend",
-    style : "display:none",
-  });
-  rightPanelContainerDiv.appendChild(legendDiv);
-
-  var contextMenu = functions.createElement({
-    type : "ul",
-    name : "contextMenu",
-  });
-  element.appendChild(contextMenu);
-  var selectionContextMenu = functions.createElement({
-    type : "ul",
-    name : "selectionContextMenu",
-  });
-  element.appendChild(selectionContextMenu);
+    var leftPanelDiv = functions.createElement({
+        type: "div",
+        name: "leftPanelDiv",
+        className: "minerva-left-panel",
+    });
+    element.appendChild(leftPanelDiv);
+    var rightPanelDiv = functions.createElement({
+        type: "div",
+        style: "display: table-cell;height:100%;width:100%;",
+    });
+    element.appendChild(rightPanelDiv);
+
+    var rightPanelContainerDiv = functions.createElement({
+        type: "div",
+        style: "height:100%;width:100%;position:relative",
+    });
+    rightPanelDiv.appendChild(rightPanelContainerDiv);
+
+    var menuDiv = functions.createElement({
+        type: "div",
+        name: "menuDiv",
+        className: "menuBelt",
+    });
+    rightPanelContainerDiv.appendChild(menuDiv);
+
+    var mapDiv = functions.createElement({
+        type: "div",
+        name: "mapDiv",
+        className: "mapClass",
+    });
+    rightPanelContainerDiv.appendChild(mapDiv);
+
+    var legendDiv = functions.createElement({
+        type: "div",
+        name: "legendDiv",
+        className: "minerva-legend",
+        style: "display:none",
+    });
+    rightPanelContainerDiv.appendChild(legendDiv);
+
+    var contextMenu = functions.createElement({
+        type: "ul",
+        name: "contextMenu",
+    });
+    element.appendChild(contextMenu);
+    var selectionContextMenu = functions.createElement({
+        type: "ul",
+        name: "selectionContextMenu",
+    });
+    element.appendChild(selectionContextMenu);
 }
 
 function getFullElements(customMap, identifiedElements) {
-  var result = [];
-  return Promise.each(
-      identifiedElements,
-      function(item) {
-        if (item.length === undefined) {
-          return customMap.getSubmapById(item.getModelId()).getModel().getByIdentifiedElement(item, true).then(
-              function(fullElement) {
-                result.push(fullElement);
-              });
-        } else {
-          return getFullElements(customMap, item).then(function(resultRow) {
-            result.push(resultRow);
-          });
-        }
-      }).then(function() {
-    return result;
-  });
+    var result = [];
+    return Promise.each(
+        identifiedElements,
+        function (item) {
+            if (item.length === undefined) {
+                return customMap.getSubmapById(item.getModelId()).getModel().getByIdentifiedElement(item, true).then(
+                    function (fullElement) {
+                        result.push(fullElement);
+                    });
+            } else {
+                return getFullElements(customMap, item).then(function (resultRow) {
+                    result.push(resultRow);
+                });
+            }
+        }).then(function () {
+        return result;
+    });
 }
+
 function getOverlayByName(customMap, dbOverlayName) {
-  var dbOverlay = customMap.getOverlayByName(dbOverlayName);
-  if (dbOverlay === null) {
-    var validOverlays = "";
-    var overlays = customMap.getDbOverlays();
-    for ( var overlay in overlays) {
-      if (overlays.hasOwnProperty(overlay)) {
-        validOverlays += overlay.getName() + ", ";
-      }
+    var dbOverlay = customMap.getOverlayByName(dbOverlayName);
+    if (dbOverlay === null) {
+        var validOverlays = "";
+        var overlays = customMap.getDbOverlays();
+        for (var overlay in overlays) {
+            if (overlays.hasOwnProperty(overlay)) {
+                validOverlays += overlay.getName() + ", ";
+            }
+        }
+        throw new Error("Invalid DbOverlay: " + dbOverlayName + ". Valid DbOverlays: " + validOverlays);
+    } else {
+        return dbOverlay;
     }
-    throw new Error("Invalid DbOverlay: " + dbOverlayName + ". Valid DbOverlays: " + validOverlays);
-  } else {
-    return dbOverlay;
-  }
 }
 
 function createMarkerElements(options) {
-  var params = options.params;
-  var filteredType = options.filteredType;
-  var isDefault = options.isDefault;
-
-  var markerElements = [];
-  if (params.length === undefined) {
-    params = [ params ];
-  }
-  for (var i = 0; i < params.length; i++) {
-    var elementParam = params[i];
-    if (elementParam.type === undefined && isDefault) {
-      markerElements.push({
-        element : elementParam.element,
-      });
-    } else if (elementParam.type === filteredType) {
-      markerElements.push({
-        element : elementParam.element,
-        options : elementParam.options,
-      });
-    } else if (elementParam.type !== "ICON" && elementParam.type !== "SURFACE") {
-      throw new Error("Unknown type:" + elementParam.type);
+    var params = options.params;
+    var filteredType = options.filteredType;
+    var isDefault = options.isDefault;
+
+    var markerElements = [];
+    if (params.length === undefined) {
+        params = [params];
     }
-  }
-  return markerElements;
+    for (var i = 0; i < params.length; i++) {
+        var elementParam = params[i];
+        if (elementParam.type === undefined && isDefault) {
+            markerElements.push({
+                element: elementParam.element,
+            });
+        } else if (elementParam.type === filteredType) {
+            markerElements.push({
+                element: elementParam.element,
+                options: elementParam.options,
+            });
+        } else if (elementParam.type !== "ICON" && elementParam.type !== "SURFACE") {
+            throw new Error("Unknown type:" + elementParam.type);
+        }
+    }
+    return markerElements;
 }
 
 function getElements(elementIdentifiers, customMap) {
-  var identifiedElements = [];
+    var identifiedElements = [];
 
-  var elementsByModelId = [];
-  for (var i = 0; i < elementIdentifiers.length; i++) {
-    var identifiedElement = new IdentifiedElement(elementIdentifiers[i]);
-    if (elementsByModelId[identifiedElement.getModelId()] === undefined) {
-      elementsByModelId[identifiedElement.getModelId()] = [];
-    }
-    elementsByModelId[identifiedElement.getModelId()].push(identifiedElement);
-    identifiedElements.push(identifiedElement);
-  }
-
-  var modelScopePromises = [];
-  for ( var key in elementsByModelId) {
-    if (elementsByModelId.hasOwnProperty(key)) {
-      var model = customMap.getModel().getSubmodelById(parseInt(key));
-      modelScopePromises.push(model.getByIdentifiedElements(elementsByModelId[key], true));
+    var elementsByModelId = [];
+    for (var i = 0; i < elementIdentifiers.length; i++) {
+        var identifiedElement = new IdentifiedElement(elementIdentifiers[i]);
+        if (elementsByModelId[identifiedElement.getModelId()] === undefined) {
+            elementsByModelId[identifiedElement.getModelId()] = [];
+        }
+        elementsByModelId[identifiedElement.getModelId()].push(identifiedElement);
+        identifiedElements.push(identifiedElement);
     }
-  }
-  // first promise fetch all data
-  return Promise.all(modelScopePromises).then(function() {
-    // this promise return result in the right order
-    var elementPromises = [];
-    for (var i = 0; i < identifiedElements.length; i++) {
-      var element = identifiedElements[i];
-      var model = customMap.getModel().getSubmodelById(element.getModelId());
-      var promise = model.getByIdentifiedElement(element, true);
-      elementPromises.push(promise);
+
+    var modelScopePromises = [];
+    for (var key in elementsByModelId) {
+        if (elementsByModelId.hasOwnProperty(key)) {
+            var model = customMap.getModel().getSubmodelById(parseInt(key));
+            modelScopePromises.push(model.getByIdentifiedElements(elementsByModelId[key], true));
+        }
     }
-    return Promise.all(elementPromises);
-  });
+    // first promise fetch all data
+    return Promise.all(modelScopePromises).then(function () {
+        // this promise return result in the right order
+        var elementPromises = [];
+        for (var i = 0; i < identifiedElements.length; i++) {
+            var element = identifiedElements[i];
+            var model = customMap.getModel().getSubmodelById(element.getModelId());
+            var promise = model.getByIdentifiedElement(element, true);
+            elementPromises.push(promise);
+        }
+        return Promise.all(elementPromises);
+    });
 }
 
 function getReactionsForElements(elementIdentifiers, customMap) {
-  var elementsByModelId = [];
-  for (var i = 0; i < elementIdentifiers.length; i++) {
-    var identifiedElement = new IdentifiedElement(elementIdentifiers[i]);
-    if (elementsByModelId[identifiedElement.getModelId()] === undefined) {
-      elementsByModelId[identifiedElement.getModelId()] = [];
-    }
-    elementsByModelId[identifiedElement.getModelId()].push(identifiedElement);
-  }
-
-  var modelScopePromises = [];
-  for ( var key in elementsByModelId) {
-    if (elementsByModelId.hasOwnProperty(key)) {
-      var model = customMap.getModel().getSubmodelById(parseInt(key));
-      var promise = model.getReactionsForElements(elementsByModelId[key], true);
-      modelScopePromises.push(promise);
+    var elementsByModelId = [];
+    for (var i = 0; i < elementIdentifiers.length; i++) {
+        var identifiedElement = new IdentifiedElement(elementIdentifiers[i]);
+        if (elementsByModelId[identifiedElement.getModelId()] === undefined) {
+            elementsByModelId[identifiedElement.getModelId()] = [];
+        }
+        elementsByModelId[identifiedElement.getModelId()].push(identifiedElement);
     }
-  }
 
-  // first promise fetch all data
-  return Promise.all(modelScopePromises).then(function(reactionResult) {
-    var result = [];
-    for (var i = 0; i < reactionResult.length; i++) {
-      result = result.concat(reactionResult[i]);
+    var modelScopePromises = [];
+    for (var key in elementsByModelId) {
+        if (elementsByModelId.hasOwnProperty(key)) {
+            var model = customMap.getModel().getSubmodelById(parseInt(key));
+            var promise = model.getReactionsForElements(elementsByModelId[key], true);
+            modelScopePromises.push(promise);
+        }
     }
-    return result;
-  });
-}
 
-function createResult(customMap) {
-  return {
-    getVisibleDataOverlays : function() {
-      return customMap.getVisibleDataOverlays();
-    },
-    addListener : function(param) {
-      var dbOverlay = getOverlayByName(customMap, param.dbOverlayName);
-      dbOverlay.addListener(param.type, function(e) {
-        return getFullElements(customMap, e.arg.identifiedElements).then(function(result) {
-          return param.callback(result);
-        });
-      });
-    },
-    getHighlightedBioEntities : function(dbOverlayName) {
-      if (dbOverlayName === undefined) {
-        dbOverlayName = "user";
-      }
-      var dbOverlay = getOverlayByName(customMap, dbOverlayName);
-      var identifiedElements;
-      return dbOverlay.getIdentifiedElements().then(function(result) {
-        identifiedElements = result;
-        return getFullElements(customMap, identifiedElements);
-      }).then(function(fullElements) {
+    // first promise fetch all data
+    return Promise.all(modelScopePromises).then(function (reactionResult) {
         var result = [];
-        for (var i = 0; i < identifiedElements.length; i++) {
-          var type;
-          if (identifiedElements[i].getIcon() !== undefined) {
-            type = "ICON";
-          } else {
-            type = "SURFACE";
-          }
-          var row = {
-            element : fullElements[i],
-            type : type,
-            options : {
-              icon : identifiedElements[i].getIcon(),
-              color : identifiedElements[i].getColor(),
-              opacity : identifiedElements[i].getOpacity(),
-            }
-          };
-          result.push(row);
-        }
-        return result;
-      });
-    },
-    getProject : function() {
-      return customMap.getProject();
-    },
-    getConfiguration : function() {
-      return ServerConnector.getConfiguration();
-    },
-    getBioEntityById : function(param) {
-      var isArray = true;
-      if (param.length === undefined) {
-        param = [ param ];
-        isArray = false;
-      }
-      return getElements(param, customMap).then(function(result) {
-        if (!isArray) {
-          return result[0];
-        } else {
-          return result;
-        }
-      });
-    },
-    getAllBioEntities : function() {
-      var models = [ customMap.getModel() ];
-      var result = [];
-      for (var i = 0; i < customMap.getModel().getSubmodels().length; i++) {
-        models.push(customMap.getModel().getSubmodels()[i]);
-      }
-      var promises = [];
-      for (var i = 0; i < models.length; i++) {
-        promises.push(models[i].getAliases({
-          type : customMap.getConfiguration().getElementTypes(),
-          complete : true,
-        }));
-      }
-      return Promise.all(promises).then(function(aliasesByModel) {
-        var promises = [];
-        for (var i = 0; i < models.length; i++) {
-          promises.push(models[i].getReactionsForElements(aliasesByModel[i], true));
-          for (var j = 0; j < aliasesByModel[i].length; j++) {
-            result.push(aliasesByModel[i][j]);
-          }
-        }
-        return Promise.all(promises);
-      }).then(function(reactionsByModel) {
-        for (var i = 0; i < models.length; i++) {
-          for (var j = 0; j < reactionsByModel[i].length; j++) {
-            result.push(reactionsByModel[i][j]);
-          }
+        for (var i = 0; i < reactionResult.length; i++) {
+            result = result.concat(reactionResult[i]);
         }
         return result;
-      });
-    },
-    getReactionsWithElement : function(param) {
-      if (param.length === undefined) {
-        param = [ param ];
-      }
-      return getReactionsForElements(param, customMap);
-    },
-    destroy : function() {
-      return leftPanel.destroy().then(function() {
-        customMap.destroy();
-      });
-    },
-    showBioEntity : function(params) {
-      var iconElements = createMarkerElements({
-        params : params,
-        filteredType : "ICON",
-        isDefault : true
-      });
-      var surfaceElements = createMarkerElements({
-        params : params,
-        filteredType : "SURFACE",
-        isDefault : false
-      });
-      return customMap.getOverlayByName("user").addMarker(iconElements).then(function() {
-        return customMap.getOverlayByName("user").addSurface(surfaceElements);
-      });
-    },
-    hideBioEntity : function(params) {
-      var iconElements = createMarkerElements({
-        params : params,
-        filteredType : "ICON",
-        isDefault : true
-      });
-      var surfaceElements = createMarkerElements({
-        params : params,
-        filteredType : "SURFACE",
-        isDefault : false
-      });
-      return customMap.getOverlayByName("user").removeMarker(iconElements).then(function() {
-        return customMap.getOverlayByName("user").removeSurface(surfaceElements);
-      });
-    },
-    setCenter : function(params) {
-      var submap = customMap.getSubmapById(params.modelId);
-      if (submap === null) {
-        throw new Error("Unknown modelId: " + params.modelId);
-      }
-      return submap.setCenter(new google.maps.Point(params.x, params.y));
-    },
-    fitBounds : function(params) {
-      var submap = customMap.getSubmapById(params.modelId);
-      if (submap === null) {
-        throw new Error("Unknown modelId: " + params.modelId);
-      }
-      var p1 = new google.maps.Point(params.x1, params.y1);
-      var p2 = new google.maps.Point(params.x2, params.y2);
-      var latLng1 = submap.fromPointToLatLng(p1);
-      var latLng2 = submap.fromPointToLatLng(p2);
-      var bounds = new google.maps.LatLngBounds();
-      bounds.extend(latLng1);
-      bounds.extend(latLng2);
-      return submap.getGoogleMap().fitBounds(bounds);
-    },
-    setZoom : function(params) {
-      var submap = customMap.getSubmapById(params.modelId);
-      if (submap === null) {
-        throw new Error("Unknown modelId: " + params.modelId);
-      }
-      return submap.setZoom(params.zoom);
-    },
-  };
+    });
+}
+
+function createResult(customMap) {
+    return {
+        getVisibleDataOverlays: function () {
+            return customMap.getVisibleDataOverlays();
+        },
+        addListener: function (param) {
+            var dbOverlay = getOverlayByName(customMap, param.dbOverlayName);
+            dbOverlay.addListener(param.type, function (e) {
+                return getFullElements(customMap, e.arg.identifiedElements).then(function (result) {
+                    return param.callback(result);
+                });
+            });
+        },
+        getHighlightedBioEntities: function (dbOverlayName) {
+            if (dbOverlayName === undefined) {
+                dbOverlayName = "user";
+            }
+            var dbOverlay = getOverlayByName(customMap, dbOverlayName);
+            var identifiedElements;
+            return dbOverlay.getIdentifiedElements().then(function (result) {
+                identifiedElements = result;
+                return getFullElements(customMap, identifiedElements);
+            }).then(function (fullElements) {
+                var result = [];
+                for (var i = 0; i < identifiedElements.length; i++) {
+                    var type;
+                    if (identifiedElements[i].getIcon() !== undefined) {
+                        type = "ICON";
+                    } else {
+                        type = "SURFACE";
+                    }
+                    var row = {
+                        element: fullElements[i],
+                        type: type,
+                        options: {
+                            icon: identifiedElements[i].getIcon(),
+                            color: identifiedElements[i].getColor(),
+                            opacity: identifiedElements[i].getOpacity(),
+                        }
+                    };
+                    result.push(row);
+                }
+                return result;
+            });
+        },
+        getProject: function () {
+            return customMap.getProject();
+        },
+        getConfiguration: function () {
+            return ServerConnector.getConfiguration();
+        },
+        getBioEntityById: function (param) {
+            var isArray = true;
+            if (param.length === undefined) {
+                param = [param];
+                isArray = false;
+            }
+            return getElements(param, customMap).then(function (result) {
+                if (!isArray) {
+                    return result[0];
+                } else {
+                    return result;
+                }
+            });
+        },
+        getAllBioEntities: function () {
+            var models = [customMap.getModel()];
+            var result = [];
+            for (var i = 0; i < customMap.getModel().getSubmodels().length; i++) {
+                models.push(customMap.getModel().getSubmodels()[i]);
+            }
+            var promises = [];
+            for (var i = 0; i < models.length; i++) {
+                promises.push(models[i].getAliases({
+                    type: customMap.getConfiguration().getElementTypes(),
+                    complete: true,
+                }));
+            }
+            return Promise.all(promises).then(function (aliasesByModel) {
+                var promises = [];
+                for (var i = 0; i < models.length; i++) {
+                    promises.push(models[i].getReactionsForElements(aliasesByModel[i], true));
+                    for (var j = 0; j < aliasesByModel[i].length; j++) {
+                        result.push(aliasesByModel[i][j]);
+                    }
+                }
+                return Promise.all(promises);
+            }).then(function (reactionsByModel) {
+                for (var i = 0; i < models.length; i++) {
+                    for (var j = 0; j < reactionsByModel[i].length; j++) {
+                        result.push(reactionsByModel[i][j]);
+                    }
+                }
+                return result;
+            });
+        },
+        getReactionsWithElement: function (param) {
+            if (param.length === undefined) {
+                param = [param];
+            }
+            return getReactionsForElements(param, customMap);
+        },
+        destroy: function () {
+            return leftPanel.destroy().then(function () {
+                customMap.destroy();
+                return topMenu.destroy();
+            });
+        },
+        showBioEntity: function (params) {
+            var iconElements = createMarkerElements({
+                params: params,
+                filteredType: "ICON",
+                isDefault: true
+            });
+            var surfaceElements = createMarkerElements({
+                params: params,
+                filteredType: "SURFACE",
+                isDefault: false
+            });
+            return customMap.getOverlayByName("user").addMarker(iconElements).then(function () {
+                return customMap.getOverlayByName("user").addSurface(surfaceElements);
+            });
+        },
+        hideBioEntity: function (params) {
+            var iconElements = createMarkerElements({
+                params: params,
+                filteredType: "ICON",
+                isDefault: true
+            });
+            var surfaceElements = createMarkerElements({
+                params: params,
+                filteredType: "SURFACE",
+                isDefault: false
+            });
+            return customMap.getOverlayByName("user").removeMarker(iconElements).then(function () {
+                return customMap.getOverlayByName("user").removeSurface(surfaceElements);
+            });
+        },
+        setCenter: function (params) {
+            var submap = customMap.getSubmapById(params.modelId);
+            if (submap === null) {
+                throw new Error("Unknown modelId: " + params.modelId);
+            }
+            return submap.setCenter(new google.maps.Point(params.x, params.y));
+        },
+        fitBounds: function (params) {
+            var submap = customMap.getSubmapById(params.modelId);
+            if (submap === null) {
+                throw new Error("Unknown modelId: " + params.modelId);
+            }
+            var p1 = new google.maps.Point(params.x1, params.y1);
+            var p2 = new google.maps.Point(params.x2, params.y2);
+            var latLng1 = submap.fromPointToLatLng(p1);
+            var latLng2 = submap.fromPointToLatLng(p2);
+            var bounds = new google.maps.LatLngBounds();
+            bounds.extend(latLng1);
+            bounds.extend(latLng2);
+            return submap.getGoogleMap().fitBounds(bounds);
+        },
+        setZoom: function (params) {
+            var submap = customMap.getSubmapById(params.modelId);
+            if (submap === null) {
+                throw new Error("Unknown modelId: " + params.modelId);
+            }
+            return submap.setZoom(params.zoom);
+        },
+    };
 }
 
 function initGlobals(params) {
-  if (global.GuiConnector === undefined) {
-    global.GuiConnector = OriginalGuiConnector;
-    global.ServerConnector = OriginalServerConnector;
-    if (params.isDebug()) {
-      logger.setLevel("debug");
+    if (global.GuiConnector === undefined) {
+        global.GuiConnector = OriginalGuiConnector;
+        global.ServerConnector = OriginalServerConnector;
+        if (params.isDebug()) {
+            logger.setLevel("debug");
+        } else {
+            logger.setLevel("info");
+        }
+        GuiConnector.init();
+        if (GuiConnector.getParams['debug'] !== undefined) {
+            logger.setLevel("debug");
+        }
     } else {
-      logger.setLevel("info");
-    }
-    GuiConnector.init();
-    if (GuiConnector.getParams['debug'] !== undefined) {
-      logger.setLevel("debug");
+        logger.warn("global GuiConnector found");
     }
-  } else {
-    logger.warn("global GuiConnector found");
-  }
 
 }
 
 function verifyBrowser() {
 
-  var browser = functions.browser;
-  if (browser.name === "IE") {
-    if (browser.version <= 8 || browser.compatibilityMode) {
-      var message = "This webpage works only with Internet Explorer version 9 or greater.\n"
-          + "If you have Internet Explorer version 9 or greater and still see this message, please, turn the 'Compatibility modeoff:\n"
-          + "Open Internet Explorer and press the Alt key on your keyboard.\n"
-          + "Select 'Tools' menu item. \n"
-          + "Select the 'Compatibility View' settings option. \n"
-          + "Make sure the 'Display all websites in Compatibility View' check box is unchecked and that the 'Compatibility View; list of websites is cleared.\n"
-          + "\n" + "Alternatively, please, use other browsers: Chrome, Firefox or Safari.";
-      GuiConnector.alert(message);
+    var browser = functions.browser;
+    if (browser.name === "IE") {
+        if (browser.version <= 8 || browser.compatibilityMode) {
+            var message = "This webpage works only with Internet Explorer version 9 or greater.\n"
+                + "If you have Internet Explorer version 9 or greater and still see this message, please, turn the 'Compatibility modeoff:\n"
+                + "Open Internet Explorer and press the Alt key on your keyboard.\n"
+                + "Select 'Tools' menu item. \n"
+                + "Select the 'Compatibility View' settings option. \n"
+                + "Make sure the 'Display all websites in Compatibility View' check box is unchecked and that the 'Compatibility View; list of websites is cleared.\n"
+                + "\n" + "Alternatively, please, use other browsers: Chrome, Firefox or Safari.";
+            GuiConnector.alert(message);
+        }
     }
-  }
 }
 
 function getProject(params) {
-  if (params.getProject() !== undefined) {
-    return Promise.resolve(params.getProject());
-  } else {
-    return ServerConnector.getProject(params.getProjectId());
-  }
+    if (params.getProject() !== undefined) {
+        return Promise.resolve(params.getProject());
+    } else {
+        return ServerConnector.getProject(params.getProjectId());
+    }
 }
 
 function modifyParamsForTouchInterface(params) {
-  if (params.markerOptimization === undefined && params.bigLogo === undefined
-      && params.customTouchInterface === undefined) {
-    var windowsTouchInterface = ((navigator.appVersion.indexOf("Win") > -1) && ('ontouchstart' in document.documentElement));
-    params.markerOptimization = !windowsTouchInterface;
-    params.bigLogo = windowsTouchInterface;
-    params.customTouchInterface = windowsTouchInterface;
-  }
-  return params;
+    if (params.markerOptimization === undefined && params.bigLogo === undefined
+        && params.customTouchInterface === undefined) {
+        var windowsTouchInterface = ((navigator.appVersion.indexOf("Win") > -1) && ('ontouchstart' in document.documentElement));
+        params.markerOptimization = !windowsTouchInterface;
+        params.bigLogo = windowsTouchInterface;
+        params.customTouchInterface = windowsTouchInterface;
+    }
+    return params;
 }
 
 function create(params) {
-  params = modifyParamsForTouchInterface(params);
-  if (!(params instanceof CustomMapOptions)) {
-    params = new CustomMapOptions(params);
-  }
-  initGlobals(params);
-  params.getElement().style.display = "table";
-  params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
-      + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
-
-  // make sure that we are logged in
-  return ServerConnector.getToken().then(function() {
-    return ServerConnector.getConfiguration();
-  }).then(function(configuration) {
-    params.setConfiguration(configuration);
-    return getProject(params);
-  }).then(function(project) {
-    if (project === null) {
-      var message = "Project with given id doesn't exist.";
-      message += "<p>Please go to <a href='" + ServerConnector.getServerBaseUrl() + "'>default map</a>";
-      return Promise.reject(new Error(message));
+    params = modifyParamsForTouchInterface(params);
+    if (!(params instanceof CustomMapOptions)) {
+        params = new CustomMapOptions(params);
     }
-    params.setProject(project);
-    var element = params.getElement();
+    initGlobals(params);
+    params.getElement().style.display = "table";
+    params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
+        + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
+
+    // make sure that we are logged in
+    return ServerConnector.getToken().then(function () {
+        return ServerConnector.getConfiguration();
+    }).then(function (configuration) {
+        params.setConfiguration(configuration);
+        return getProject(params);
+    }).then(function (project) {
+        if (project === null) {
+            var message = "Project with given id doesn't exist.";
+            message += "<p>Please go to <a href='" + ServerConnector.getServerBaseUrl() + "'>default map</a>";
+            return Promise.reject(new Error(message));
+        }
+        params.setProject(project);
+        var element = params.getElement();
 
-    verifyBrowser();
+        verifyBrowser();
 
-    processUrlGetParams(params);
+        processUrlGetParams(params);
 
-    params.getElement().innerHTML = "";
-    createDivStructure(element);
-    params.setElement(functions.getElementByName(element, "mapDiv"));
+        params.getElement().innerHTML = "";
+        createDivStructure(element);
+        params.setElement(functions.getElementByName(element, "mapDiv"));
 
-    customMap = new CustomMap(params);
+        customMap = new CustomMap(params);
 
-    new DbOverlayCollection({
-      map : customMap
-    });
+        new DbOverlayCollection({
+            map: customMap
+        });
 
-    leftPanel = new LeftPanel({
-      element : functions.getElementByName(element, "leftPanelDiv"),
-      customMap : customMap
-    });
+        leftPanel = new LeftPanel({
+            element: functions.getElementByName(element, "leftPanelDiv"),
+            customMap: customMap
+        });
 
-    topMenu = new TopMenu({
-      element : functions.getElementByName(element, "menuDiv"),
-      customMap : customMap
-    });
+        topMenu = new TopMenu({
+            element: functions.getElementByName(element, "menuDiv"),
+            customMap: customMap
+        });
 
-    legend = new Legend({
-      element : functions.getElementByName(element, "legendDiv"),
-      customMap : customMap
-    });
+        legend = new Legend({
+            element: functions.getElementByName(element, "legendDiv"),
+            customMap: customMap
+        });
 
-    mapContextMenu = new MapContextMenu({
-      element : functions.getElementByName(element, "contextMenu"),
-      customMap : customMap
-    });
-    customMap.setContextMenu(mapContextMenu);
+        mapContextMenu = new MapContextMenu({
+            element: functions.getElementByName(element, "contextMenu"),
+            customMap: customMap
+        });
+        customMap.setContextMenu(mapContextMenu);
 
-    selectionContextMenu = new SelectionContextMenu({
-      element : functions.getElementByName(element, "selectionContextMenu"),
-      customMap : customMap
-    });
-    customMap.setSelectionContextMenu(selectionContextMenu);
-
-    topMenu.setLegend(legend);
-    topMenu.setLeftPanel(leftPanel);
-
-    return customMap.init();
-  }).then(function() {
-    return insertGoogleAnalyticsCode(customMap);
-  }).then(function() {
-    return leftPanel.init();
-  }).then(function() {
-    return legend.init();
-  }).then(function() {
-    return topMenu.init();
-  }).then(function() {
-    return selectionContextMenu.init();
-  }).then(function() {
-    return mapContextMenu.init();
-  }).then(function() {
-    if (GuiConnector.getParams["layout"] !== undefined) {
-      var layouts = params.getProject().getModel().getLayouts();
-      for (var j = 0; j < layouts.length; j++) {
-        var layout = layouts[j];
-        if (layout.getName() === GuiConnector.getParams["layout"]) {
-          return customMap.openDataOverlay(layout);
+        selectionContextMenu = new SelectionContextMenu({
+            element: functions.getElementByName(element, "selectionContextMenu"),
+            customMap: customMap
+        });
+        customMap.setSelectionContextMenu(selectionContextMenu);
+
+        topMenu.setLegend(legend);
+        topMenu.setLeftPanel(leftPanel);
+
+        return customMap.init();
+    }).then(function () {
+        return insertGoogleAnalyticsCode(customMap);
+    }).then(function () {
+        return leftPanel.init();
+    }).then(function () {
+        return legend.init();
+    }).then(function () {
+        return topMenu.init();
+    }).then(function () {
+        return selectionContextMenu.init();
+    }).then(function () {
+        return mapContextMenu.init();
+    }).then(function () {
+        if (GuiConnector.getParams["layout"] !== undefined) {
+            var layouts = params.getProject().getModel().getLayouts();
+            for (var j = 0; j < layouts.length; j++) {
+                var layout = layouts[j];
+                if (layout.getName() === GuiConnector.getParams["layout"]) {
+                    return customMap.openDataOverlay(layout);
+                }
+            }
         }
-      }
-    }
-  }).then(function() {
+    }).then(function () {
 
-    var submapId = GuiConnector.getParams["submap"];
-    if (submapId !== undefined) {
-      return customMap.openSubmap(submapId);
-    }
-  }).then(function() {
-    var result = createResult(customMap);
+        var submapId = GuiConnector.getParams["submap"];
+        if (submapId !== undefined) {
+            return customMap.openSubmap(submapId);
+        }
+    }).then(function () {
+        var result = createResult(customMap);
 
-    if (params.isDebug()) {
-      result.leftPanel = leftPanel;
-      result.customMap = customMap;
-    }
-    return result;
-  });
+        if (params.isDebug()) {
+            result.leftPanel = leftPanel;
+            result.customMap = customMap;
+        }
+        return result;
+    });
 
 }
 
 function createExport(params) {
-  params = modifyParamsForTouchInterface(params);
-  if (!(params instanceof CustomMapOptions)) {
-    params = new CustomMapOptions(params);
-  }
-  initGlobals(params);
-  params.getElement().style.display = "table";
-  params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
-      + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
-
-  var result;
-  // make sure that we are logged in
-  return ServerConnector.getToken().then(function() {
-    return ServerConnector.getConfiguration();
-  }).then(function(configuration) {
-    params.setConfiguration(configuration);
-    return getProject(params);
-  }).then(function(project) {
-    params.setProject(project);
-    result = new Export(params);
-    return result.init();
-  }).then(function() {
-    return result;
-  });
+    params = modifyParamsForTouchInterface(params);
+    if (!(params instanceof CustomMapOptions)) {
+        params = new CustomMapOptions(params);
+    }
+    initGlobals(params);
+    params.getElement().style.display = "table";
+    params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
+        + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
+
+    var result;
+    // make sure that we are logged in
+    return ServerConnector.getToken().then(function () {
+        return ServerConnector.getConfiguration();
+    }).then(function (configuration) {
+        params.setConfiguration(configuration);
+        return getProject(params);
+    }).then(function (project) {
+        params.setProject(project);
+        result = new Export(params);
+        return result.init();
+    }).then(function () {
+        return result;
+    });
 }
 
 function createAdmin(params) {
-  params = modifyParamsForTouchInterface(params);
-  if (!(params instanceof CustomMapOptions)) {
-    params = new CustomMapOptions(params);
-  }
-  initGlobals(params);
-  params.getElement().style.display = "table";
-  params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
-      + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
-
-  var result;
-  // make sure that we are logged in
-  return ServerConnector.getToken().then(function() {
-    return ServerConnector.getConfiguration();
-  }).then(function(configuration) {
-    params.setConfiguration(configuration);
-    return getProject(params);
-  }).then(function(project) {
-    params.setProject(project);
-    result = new Admin(params);
-    return result.init();
-  }).then(function() {
-    return result;
-  });
+    params = modifyParamsForTouchInterface(params);
+    if (!(params instanceof CustomMapOptions)) {
+        params = new CustomMapOptions(params);
+    }
+    initGlobals(params);
+    params.getElement().style.display = "table";
+    params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
+        + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>";
+
+    var result;
+    // make sure that we are logged in
+    return ServerConnector.getToken().then(function () {
+        return ServerConnector.getConfiguration();
+    }).then(function (configuration) {
+        params.setConfiguration(configuration);
+        return getProject(params);
+    }).then(function (project) {
+        params.setProject(project);
+        result = new Admin(params);
+        return result.init();
+    }).then(function () {
+        return result;
+    });
 }
 
 var minerva = {
-  create : create,
-  createExport : createExport,
-  createAdmin: createAdmin,
-  ServerConnector : OriginalServerConnector,
-  GuiConnector : OriginalGuiConnector,
-  DualListbox : require('dual-listbox').DualListbox,
+    create: create,
+    createExport: createExport,
+    createAdmin: createAdmin,
+    ServerConnector: OriginalServerConnector,
+    GuiConnector: OriginalGuiConnector,
+    DualListbox: require('dual-listbox').DualListbox,
 };
 
 module.exports = minerva;
diff --git a/frontend-js/src/test/js/GuiConnector-mock.js b/frontend-js/src/test/js/GuiConnector-mock.js
index 1297fdc3fa..986dea4d0f 100644
--- a/frontend-js/src/test/js/GuiConnector-mock.js
+++ b/frontend-js/src/test/js/GuiConnector-mock.js
@@ -8,12 +8,23 @@ var OriginalGuiConnector = require('../../main/js/GuiConnector');
 
 var GuiConnectorMock = OriginalGuiConnector;
 
-GuiConnectorMock.alert = function(error) {
-  if (error instanceof Error) {
-    throw error;
-  } else {
-    throw new Error(error);
-  }
+GuiConnectorMock.alert = function (error) {
+    if (error instanceof Error) {
+        throw error;
+    } else {
+        throw new Error(error);
+    }
+};
+
+GuiConnectorMock.showProcessing = function (message) {
+    if (message === undefined) {
+        message = "";
+    }
+    logger.debug("[PROCESSING STARTED] " + message);
+};
+
+GuiConnectorMock.hideProcessing = function () {
+    logger.debug("[PROCESSING STOPPED]");
 };
 
 module.exports = GuiConnectorMock;
diff --git a/frontend-js/src/test/js/gui/AddOverlayDialog-test.js b/frontend-js/src/test/js/gui/AddOverlayDialog-test.js
index 4dae00c29d..b9700d844d 100644
--- a/frontend-js/src/test/js/gui/AddOverlayDialog-test.js
+++ b/frontend-js/src/test/js/gui/AddOverlayDialog-test.js
@@ -30,8 +30,9 @@ describe('AddOverlayDialog', function() {
   });
 
   it('addOverlay', function() {
+    var dialog;
     return ServerConnector.getProject().then(function(project) {
-      var dialog = new AddOverlayDialog({
+      dialog = new AddOverlayDialog({
         element : testDiv,
         project : project,
         customMap : null
diff --git a/frontend-js/src/test/js/gui/Panel-test.js b/frontend-js/src/test/js/gui/Panel-test.js
index d17b2096c2..bd7a34c78a 100644
--- a/frontend-js/src/test/js/gui/Panel-test.js
+++ b/frontend-js/src/test/js/gui/Panel-test.js
@@ -10,26 +10,27 @@ var chai = require('chai');
 var assert = chai.assert;
 var logger = require('../logger');
 
-describe('Panel', function() {
+describe('Panel', function () {
 
-  it('openDialog', function() {
-    var map = helper.createCustomMap();
+    it('openDialog', function () {
+        var map = helper.createCustomMap();
 
-    var panel = new Panel({
-      element : testDiv,
-      customMap : map
-    });
+        var panel = new Panel({
+            element: testDiv,
+            customMap: map
+        });
 
-    var content = document.createElement("div");
-    content.innerHTML = "some content";
+        var content = document.createElement("div");
+        content.innerHTML = "some content";
 
-    var id = 1;
-    panel.openDialog(content, {
-      id : id
-    });
+        var id = 1;
+        panel.openDialog(content, {
+            id: id
+        });
 
-    assert.ok(panel.getDialogDiv(id).innerHTML.indexOf("some content") >= 0);
+        assert.ok(panel.getDialogDiv(id).innerHTML.indexOf("some content") >= 0);
+        panel.destroy();
 
-  });
+    });
 
 });
diff --git a/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
index 520cb09ec8..f1d6da1d77 100644
--- a/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
+++ b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
@@ -54,7 +54,7 @@ describe('EditProjectDialog', function() {
       return dialog.saveOverlay(14081);
     });
   });
-  
+
   it('saveUser', function() {
     var dialog;
     var project;
@@ -70,7 +70,7 @@ describe('EditProjectDialog', function() {
       return dialog.saveUser("anonymous");
     });
   });
-  
+
 
   it('onSaveClicked', function() {
     var dialog;
@@ -88,16 +88,19 @@ describe('EditProjectDialog', function() {
       assert.ok(project === result);
     });
   });
-  
+
   it('openAddOverlayDialog', function() {
-    return ServerConnector.getProject().then(function(result) {
+      var dialog;
+      return ServerConnector.getProject().then(function(result) {
       var project = result;
-      var dialog = new EditProjectDialog({
+      dialog= new EditProjectDialog({
         element : testDiv,
         project : project,
         customMap : null,
       });
       return dialog.openAddOverlayDialog();
+    }).then(function() {
+      dialog.destroy();
     });
   });
 
diff --git a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
index 3d55123783..8de9f0087e 100644
--- a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
+++ b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
@@ -8,64 +8,68 @@ var logger = require('../../logger');
 
 var assert = require('assert');
 
-describe('MapsAdminPanel', function() {
+describe('MapsAdminPanel', function () {
 
-  it('refresh', function() {
-    var mapTab;
-    var project;
-    return ServerConnector.getProject().then(function(result) {
-      project = result;
-      return ServerConnector.getConfiguration();
-    }).then(function(configuration) {
-      mapTab = new MapsAdminPanel({
-        element : testDiv,
-        project : project,
-        configuration : configuration,
-      });
-      return mapTab.init();
-    }).then(function() {
-      return mapTab.onRefreshClicked();
+    it('refresh', function () {
+        var mapTab;
+        var project;
+        return ServerConnector.getProject().then(function (result) {
+            project = result;
+            return ServerConnector.getConfiguration();
+        }).then(function (configuration) {
+            mapTab = new MapsAdminPanel({
+                element: testDiv,
+                project: project,
+                configuration: configuration,
+            });
+            return mapTab.init();
+        }).then(function () {
+            return mapTab.onRefreshClicked();
+        });
     });
-  });
 
-  describe('onAddClicked', function() {
-    it('default', function() {
-      var mapTab;
-      var project;
-      return ServerConnector.getProject().then(function(result) {
-        project = result;
-        return ServerConnector.getConfiguration();
-      }).then(function(configuration) {
-        mapTab = new MapsAdminPanel({
-          element : testDiv,
-          project : project,
-          configuration : configuration,
+    describe('onAddClicked', function () {
+        it('default', function () {
+            var mapTab;
+            var project;
+            return ServerConnector.getProject().then(function (result) {
+                project = result;
+                return ServerConnector.getConfiguration();
+            }).then(function (configuration) {
+                mapTab = new MapsAdminPanel({
+                    element: testDiv,
+                    project: project,
+                    configuration: configuration,
+                });
+                return mapTab.init();
+            }).then(function () {
+                return mapTab.onAddClicked();
+            }).then(function () {
+                return mapTab.destroy();
+            });
         });
-        return mapTab.init();
-      }).then(function() {
-        return mapTab.onAddClicked();
-      });
-    });
-    it('close and reopen', function() {
-      var mapTab;
-      var project;
-      return ServerConnector.getProject().then(function(result) {
-        project = result;
-        return ServerConnector.getConfiguration();
-      }).then(function(configuration) {
-        mapTab = new MapsAdminPanel({
-          element : testDiv,
-          project : project,
-          configuration : configuration,
+        it('close and reopen', function () {
+            var mapTab;
+            var project;
+            return ServerConnector.getProject().then(function (result) {
+                project = result;
+                return ServerConnector.getConfiguration();
+            }).then(function (configuration) {
+                mapTab = new MapsAdminPanel({
+                    element: testDiv,
+                    project: project,
+                    configuration: configuration,
+                });
+                return mapTab.init();
+            }).then(function () {
+                return mapTab.onAddClicked();
+            }).then(function () {
+                mapTab._addDialog.close();
+                return mapTab.onAddClicked();
+            }).then(function () {
+                return mapTab.destroy();
+            });
         });
-        return mapTab.init();
-      }).then(function() {
-        return mapTab.onAddClicked();
-      }).then(function() {
-        mapTab._addDialog.close();
-        return mapTab.onAddClicked();
-      });
     });
-  });
 
 });
diff --git a/frontend-js/src/test/js/gui/leftPanel/LeftPanel-test.js b/frontend-js/src/test/js/gui/leftPanel/LeftPanel-test.js
index 16e19770d0..95051feab6 100644
--- a/frontend-js/src/test/js/gui/leftPanel/LeftPanel-test.js
+++ b/frontend-js/src/test/js/gui/leftPanel/LeftPanel-test.js
@@ -11,79 +11,82 @@ var chai = require('chai');
 var assert = chai.assert;
 var logger = require('../../logger');
 
-describe('LeftPanel', function() {
-
-  it('constructor', function() {
-    var map = helper.createCustomMap();
-    helper.createSearchDbOverlay(map);
-    helper.createDrugDbOverlay(map);
-    helper.createChemicalDbOverlay(map);
-    helper.createMiRnaDbOverlay(map);
-
-    new LeftPanel({
-      element : testDiv,
-      customMap : map
-    });
-
-    assert.equal(logger.getWarnings().length, 0);
-
-  });
-
-  describe('prepareElementDetailsContent', function() {
-    it('for element', function() {
-      var map;
-      var panel;
-      return ServerConnector.getProject().then(function(project) {
-        map = helper.createCustomMap(project);
+describe('LeftPanel', function () {
 
+    it('constructor', function () {
+        var map = helper.createCustomMap();
         helper.createSearchDbOverlay(map);
         helper.createDrugDbOverlay(map);
         helper.createChemicalDbOverlay(map);
         helper.createMiRnaDbOverlay(map);
 
-        panel = new LeftPanel({
-          element : testDiv,
-          customMap : map
+        var panel = new LeftPanel({
+            element: testDiv,
+            customMap: map
         });
 
-        var element = new IdentifiedElement({
-          id : 329163,
-          type : "ALIAS",
-          modelId : map.getId()
-        });
-        return map.getModel().getByIdentifiedElement(element, true);
-      }).then(function(alias) {
-        var div = panel.prepareElementDetailsContent(alias);
-        assert.ok(div);
-      });
-    });
-    it('for point', function() {
-      var map;
-      var panel;
-      return ServerConnector.getProject().then(function(project) {
-        map = helper.createCustomMap(project);
+        assert.equal(logger.getWarnings().length, 0);
 
-        helper.createSearchDbOverlay(map);
-        helper.createDrugDbOverlay(map);
-        helper.createChemicalDbOverlay(map);
-        helper.createMiRnaDbOverlay(map);
+        return panel.destroy();
+    });
 
-        panel = new LeftPanel({
-          element : testDiv,
-          customMap : map
+    describe('prepareElementDetailsContent', function () {
+        it('for element', function () {
+            var map;
+            var panel;
+            return ServerConnector.getProject().then(function (project) {
+                map = helper.createCustomMap(project);
+
+                helper.createSearchDbOverlay(map);
+                helper.createDrugDbOverlay(map);
+                helper.createChemicalDbOverlay(map);
+                helper.createMiRnaDbOverlay(map);
+
+                panel = new LeftPanel({
+                    element: testDiv,
+                    customMap: map
+                });
+
+                var element = new IdentifiedElement({
+                    id: 329163,
+                    type: "ALIAS",
+                    modelId: map.getId()
+                });
+                return map.getModel().getByIdentifiedElement(element, true);
+            }).then(function (alias) {
+                var div = panel.prepareElementDetailsContent(alias);
+                assert.ok(div);
+                return panel.destroy();
+            });
         });
-
-        var element = new IdentifiedElement({
-          id : "(1.00,2.00)",
-          type : "POINT",
-          modelId : map.getId()
+        it('for point', function () {
+            var map;
+            var panel;
+            return ServerConnector.getProject().then(function (project) {
+                map = helper.createCustomMap(project);
+
+                helper.createSearchDbOverlay(map);
+                helper.createDrugDbOverlay(map);
+                helper.createChemicalDbOverlay(map);
+                helper.createMiRnaDbOverlay(map);
+
+                panel = new LeftPanel({
+                    element: testDiv,
+                    customMap: map
+                });
+
+                var element = new IdentifiedElement({
+                    id: "(1.00,2.00)",
+                    type: "POINT",
+                    modelId: map.getId()
+                });
+                return map.getModel().getByIdentifiedElement(element, true);
+            }).then(function (point) {
+                var div = panel.prepareElementDetailsContent(point);
+                assert.ok(div);
+                return panel.destroy();
+            });
         });
-        return map.getModel().getByIdentifiedElement(element, true);
-      }).then(function(point) {
-        var div = panel.prepareElementDetailsContent(point);
-        assert.ok(div);
-      });
     });
-  });
 
 });
diff --git a/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js b/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js
index 0620bc0ac0..fc269f8492 100644
--- a/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js
+++ b/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js
@@ -8,98 +8,101 @@ var chai = require('chai');
 var assert = chai.assert;
 var logger = require('../../logger');
 
-describe('OverlayPanel', function() {
+describe('OverlayPanel', function () {
 
-  it('contructor', function() {
-    var map = helper.createCustomMap();
+    it('constructor', function () {
+        var map = helper.createCustomMap();
 
-    new OverlayPanel({
-      element : testDiv,
-      customMap : map
+        new OverlayPanel({
+            element: testDiv,
+            customMap: map
+        });
+        assert.equal(logger.getWarnings().length, 0);
     });
-    assert.equal(logger.getWarnings().length, 0);
-  });
 
-  it('refresh', function() {
-    var map = helper.createCustomMap();
+    it('refresh', function () {
+        var map = helper.createCustomMap();
 
-    var panel = new OverlayPanel({
-      element : testDiv,
-      customMap : map
-    });
+        var panel = new OverlayPanel({
+            element: testDiv,
+            customMap: map
+        });
 
-    return panel.refresh().then(function() {
-      assert.ok(panel.getElement().innerHTML.indexOf("testLayout") >= 0);
-      assert.ok(panel.getElement().innerHTML.indexOf("YOU ARE NOT LOGGED") >= 0);
+        return panel.refresh().then(function () {
+            assert.ok(panel.getElement().innerHTML.indexOf("testLayout") >= 0);
+            assert.ok(panel.getElement().innerHTML.indexOf("YOU ARE NOT LOGGED") >= 0);
+        });
     });
-  });
-
-  it('createRow', function() {
-    var map = helper.createCustomMap();
 
-    var overlay = helper.createLayout();
-    overlay.setInputDataAvailable(true);
-    overlay.setCreator("me");
-    map.getModel().addLayout(overlay);
-
-    var panel = new OverlayPanel({
-      element : testDiv,
-      customMap : map
+    it('createRow', function () {
+        var map = helper.createCustomMap();
+
+        var overlay = helper.createLayout();
+        overlay.setInputDataAvailable(true);
+        overlay.setCreator("me");
+        map.getModel().addLayout(overlay);
+
+        var panel = new OverlayPanel({
+            element: testDiv,
+            customMap: map
+        });
+
+        var row = panel.createOverlayRow(overlay);
+        assert.ok(row);
+
+        var buttons = row.getElementsByTagName("button");
+        var openButton = null;
+        for (var i = 0; i < buttons.length; i++) {
+            var name = buttons[i].getAttribute("name");
+            if (name !== undefined && name.indexOf("editButton") >= 0) {
+                openButton = buttons[i];
+            }
+        }
+        assert.ok(openButton);
+        openButton.onclick();
+        return panel.destroy();
     });
-
-    var row = panel.createOverlayRow(overlay);
-    assert.ok(row);
-
-    var buttons = row.getElementsByTagName("button");
-    var openButton = null;
-    for (var i = 0; i < buttons.length; i++) {
-      var name = buttons[i].getAttribute("name");
-      if (name !== undefined && name.indexOf("editButton") >= 0) {
-        openButton = buttons[i];
-      }
-    }
-    assert.ok(openButton);
-    openButton.onclick();
-  });
-  it('download', function() {
-    var map = helper.createCustomMap();
-
-    var overlay = helper.createLayout();
-    overlay.setInputDataAvailable(true);
-    map.getModel().addLayout(overlay);
-
-    var panel = new OverlayPanel({
-      element : testDiv,
-      customMap : map
+    it('download', function () {
+        var map = helper.createCustomMap();
+
+        var overlay = helper.createLayout();
+        overlay.setInputDataAvailable(true);
+        map.getModel().addLayout(overlay);
+
+        var panel = new OverlayPanel({
+            element: testDiv,
+            customMap: map
+        });
+
+        return panel.refresh().then(function () {
+            var buttons = panel.getElement().getElementsByTagName("button");
+            var downloadButton;
+            for (var i = 0; i < buttons.length; i++) {
+                var name = buttons[i].getAttribute("name");
+                if (name !== undefined && name !== null && name.indexOf("download-overlay") >= 0) {
+                    downloadButton = buttons[i];
+                }
+            }
+            assert.ok(downloadButton);
+            assert.notOk(panel.getLastDownloadUrl());
+            return downloadButton.onclick();
+        }).then(function () {
+            assert.ok(panel.getLastDownloadUrl());
+        });
     });
 
-    return panel.refresh().then(function() {
-      var buttons = panel.getElement().getElementsByTagName("button");
-      var downloadButton;
-      for (var i = 0; i < buttons.length; i++) {
-        var name = buttons[i].getAttribute("name");
-        if (name !== undefined && name !== null && name.indexOf("download-overlay") >= 0) {
-          downloadButton = buttons[i];
-        }
-      }
-      assert.ok(downloadButton);
-      assert.notOk(panel.getLastDownloadUrl());
-      return downloadButton.onclick();
-    }).then(function() {
-      assert.ok(panel.getLastDownloadUrl());
-    });
-  });
+    it('openAddOverlayDialog', function () {
+        var map = helper.createCustomMap();
 
-  it('openAddOverlayDialog', function() {
-    var map = helper.createCustomMap();
+        var panel = new OverlayPanel({
+            element: testDiv,
+            customMap: map
+        });
 
-    var panel = new OverlayPanel({
-      element : testDiv,
-      customMap : map
+        return panel.openAddOverlayDialog().then(function () {
+            return panel.destroy();
+        });
     });
 
-    return panel.openAddOverlayDialog();
-  });
-
 
 });
diff --git a/frontend-js/src/test/js/gui/leftPanel/ProjectInfoPanel-test.js b/frontend-js/src/test/js/gui/leftPanel/ProjectInfoPanel-test.js
index c51f90c162..a8257cf7e4 100644
--- a/frontend-js/src/test/js/gui/leftPanel/ProjectInfoPanel-test.js
+++ b/frontend-js/src/test/js/gui/leftPanel/ProjectInfoPanel-test.js
@@ -8,70 +8,79 @@ var chai = require('chai');
 var assert = chai.assert;
 var logger = require('../../logger');
 
-describe('ProjectInfoPanel', function() {
+describe('ProjectInfoPanel', function () {
 
-  it('contructor', function() {
-    var div = testDiv;
+    it('constructor', function () {
+        var div = testDiv;
 
-    var map = helper.createCustomMap();
+        var map = helper.createCustomMap();
 
-    new ProjectInfoPanel({
-      element : div,
-      customMap : map
+        var panel = new ProjectInfoPanel({
+            element: div,
+            customMap: map
+        });
+        assert.equal(logger.getWarnings().length, 0);
+        panel.destroy();
     });
-    assert.equal(logger.getWarnings().length, 0);
-  });
 
-  it('refresh', function() {
-    var div = testDiv;
-    var panel = new ProjectInfoPanel({
-      element : div,
-      customMap : helper.createCustomMap(),
+    it('refresh', function () {
+        var div = testDiv;
+        var panel = new ProjectInfoPanel({
+            element: div,
+            customMap: helper.createCustomMap(),
+        });
+        return panel.refresh().then(function () {
+            assert.ok(div.innerHTML.indexOf("UNKNOWN DISEASE MAP") >= 0);
+            return panel.destroy();
+        });
     });
-    return panel.refresh().then(function() {
-      assert.ok(div.innerHTML.indexOf("UNKNOWN DISEASE MAP") >= 0);
-    });
-  });
 
-  it('download source', function() {
-    var div = testDiv;
-    var panel = new ProjectInfoPanel({
-      element : div,
-      customMap : helper.createCustomMap(),
+    it('download source', function () {
+        var div = testDiv;
+        var panel = new ProjectInfoPanel({
+            element: div,
+            customMap: helper.createCustomMap(),
+        });
+        return panel.downloadSourceFile().then(function () {
+            return panel.destroy();
+        });
     });
-    return panel.downloadSourceFile();
-  });
 
-  it('open manual', function() {
-    var div = testDiv;
-    new ProjectInfoPanel({
-      element : div,
-      customMap : helper.createCustomMap(),
+    it('open manual', function () {
+        var div = testDiv;
+        var panel = new ProjectInfoPanel({
+            element: div,
+            customMap: helper.createCustomMap(),
+        });
+        return $("[name='manualLink']", $(div))[0].onclick().then(function () {
+            return panel.destroy();
+        });
     });
-    return $("[name='manualLink']", $(div))[0].onclick();
-  });
 
-  it('show publication list', function() {
-    return ServerConnector.getProject().then(function(project) {
-      var div = testDiv;
-      var panel = new ProjectInfoPanel({
-        element : div,
-        customMap : helper.createCustomMap(project),
-      });
-      return panel.showPublicationListDialog();
+    it('show publication list', function () {
+        var panel;
+        return ServerConnector.getProject().then(function (project) {
+            panel = new ProjectInfoPanel({
+                element: testDiv,
+                customMap: helper.createCustomMap(project),
+            });
+            return panel.showPublicationListDialog();
+        }).then(function () {
+            return panel.destroy();
+        });
     });
-  });
 
-  it('show profile', function() {
-    var map = helper.createCustomMap();
+    it('show profile', function () {
+        var map = helper.createCustomMap();
+
+        var panel = new ProjectInfoPanel({
+            element: testDiv,
+            customMap: map
+        });
 
-    var panel = new ProjectInfoPanel({
-      element : testDiv,
-      customMap : map
+        var user = helper.createUser();
+        panel.showUserProfilePage(user);
+        panel.destroy();
     });
-    
-    var user = helper.createUser();
-    panel.showUserProfilePage(user);
-  });
 
 });
diff --git a/frontend-js/src/test/js/map/CustomMap-test.js b/frontend-js/src/test/js/map/CustomMap-test.js
index ccef0aab0a..0a8be442dd 100644
--- a/frontend-js/src/test/js/map/CustomMap-test.js
+++ b/frontend-js/src/test/js/map/CustomMap-test.js
@@ -21,98 +21,98 @@ var logger = require('./../logger');
 var chai = require('chai');
 var assert = chai.assert;
 
-describe('CustomMap', function() {
-  describe("constructor", function() {
-    it("default", function() {
-      var options = helper.createCustomMapOptions();
-      var map = new CustomMap(options);
-      assert.ok(map);
-    });
+describe('CustomMap', function () {
+    describe("constructor", function () {
+        it("default", function () {
+            var options = helper.createCustomMapOptions();
+            var map = new CustomMap(options);
+            assert.ok(map);
+        });
+
+        it("with submaps", function () {
+            var options = helper.createCustomMapOptions();
 
-    it("with submaps", function() {
-      var options = helper.createCustomMapOptions();
+            options.getProject().getModel().addSubmodel(helper.createModel());
+
+            var map = new CustomMap(options);
+            assert.ok(map);
+        });
 
-      options.getProject().getModel().addSubmodel(helper.createModel());
+        it("with session data pointing to not existing overlay", function () {
+            var options = helper.createCustomMapOptions();
 
-      var map = new CustomMap(options);
-      assert.ok(map);
+            ServerConnector.getSessionData(options.getProject()).setSelectedBackgroundOverlay("-1");
+
+            var map = new CustomMap(options);
+            assert.ok(map);
+        });
     });
 
-    it("with session data pointing to not existing overlay", function() {
-      var options = helper.createCustomMapOptions();
+    it("getSubmapById", function () {
+        var map = helper.createCustomMap();
+        assert.ok(map.getSubmapById(map.getId()));
+    });
 
-      ServerConnector.getSessionData(options.getProject()).setSelectedBackgroundOverlay("-1");
+    it("getSubmapById (invalid)", function () {
+        var map = helper.createCustomMap();
+        assert.equal(map.getSubmapById(-1), null);
+    });
 
-      var map = new CustomMap(options);
-      assert.ok(map);
+    it("getSubmapById (string id)", function () {
+        var map = helper.createCustomMap();
+        assert.ok(map.getSubmapById(map.getId() + ""));
     });
-  });
 
-  it("getSubmapById", function() {
-    var map = helper.createCustomMap();
-    assert.ok(map.getSubmapById(map.getId()));
-  });
+    describe("openDataOverlay", function () {
+        it("for not existing id", function () {
+            var map = helper.createCustomMap();
+            try {
+                map.openDataOverlay(-1);
+                assert.ok(false);
+            } catch (exception) {
+                assert.ok(exception.message.indexOf("You have no privileges") >= 0);
+            }
+        });
 
-  it("getSubmapById (invalid)", function() {
-    var map = helper.createCustomMap();
-    assert.equal(map.getSubmapById(-1), null);
-  });
+        it("for int id", function () {
+            var options = helper.createCustomMapOptions();
+            var model = options.getProject().getModel();
+            var layout = model.getLayouts()[0];
+            var map = new CustomMap(options);
+            map.openDataOverlay(layout.getId());
+            assert.equal(logger.getErrors().length, 0);
+        });
 
-  it("getSubmapById (string id)", function() {
-    var map = helper.createCustomMap();
-    assert.ok(map.getSubmapById(map.getId() + ""));
-  });
+        it("for overlay object", function () {
+            var options = helper.createCustomMapOptions();
+            var model = options.getProject().getModel();
+            var layout = model.getLayouts()[0];
+            var map = new CustomMap(options);
+            map.openDataOverlay(layout);
+            assert.equal(logger.getErrors().length, 0);
+        });
 
-  describe("openDataOverlay", function() {
-    it("for not existing id", function() {
-      var map = helper.createCustomMap();
-      try {
-        map.openDataOverlay(-1);
-        assert.ok(false);
-      } catch (exception) {
-        assert.ok(exception.message.indexOf("You have no privileges") >= 0);
-      }
-    });
-
-    it("for int id", function() {
-      var options = helper.createCustomMapOptions();
-      var model = options.getProject().getModel();
-      var layout = model.getLayouts()[0];
-      var map = new CustomMap(options);
-      map.openDataOverlay(layout.getId());
-      assert.equal(logger.getErrors().length, 0);
-    });
-
-    it("for overlay object", function() {
-      var options = helper.createCustomMapOptions();
-      var model = options.getProject().getModel();
-      var layout = model.getLayouts()[0];
-      var map = new CustomMap(options);
-      map.openDataOverlay(layout);
-      assert.equal(logger.getErrors().length, 0);
-    });
-
-    it("for string id", function() {
-      var options = helper.createCustomMapOptions();
-      var model = options.getProject().getModel();
-      var layout = model.getLayouts()[0];
-      var map = new CustomMap(options);
-      map.openDataOverlay(layout.getId() + "");
-      assert.equal(logger.getErrors().length, 0);
-    });
-
-    it("with background overlay", function() {
-      var map = helper.createCustomMap();
-      var layout = helper.createLayout();
-      layout.setInitialized(true);
-      layout.setInputDataAvailable(false);
-      map.getModel().addLayout(layout);
+        it("for string id", function () {
+            var options = helper.createCustomMapOptions();
+            var model = options.getProject().getModel();
+            var layout = model.getLayouts()[0];
+            var map = new CustomMap(options);
+            map.openDataOverlay(layout.getId() + "");
+            assert.equal(logger.getErrors().length, 0);
+        });
 
-      return map.openDataOverlay(layout.getId()).then(function() {
-        var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
-        assert.equal(0, vLayouts.length);
-      });
-    });
+        it("with background overlay", function () {
+            var map = helper.createCustomMap();
+            var layout = helper.createLayout();
+            layout.setInitialized(true);
+            layout.setInputDataAvailable(false);
+            map.getModel().addLayout(layout);
+
+            return map.openDataOverlay(layout.getId()).then(function () {
+                var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
+                assert.equal(0, vLayouts.length);
+            });
+        });
 
     it("simple", function() {
       var map = helper.createCustomMap();
@@ -131,846 +131,852 @@ describe('CustomMap', function() {
       var layoutReaction = helper.createLayoutReaction(reaction);
       layout.addReaction(layoutReaction);
 
-      map.getModel().addLayout(layout);
+            map.getModel().addLayout(layout);
+
+            return map.openDataOverlay(layout.getId()).then(function () {
+                return map._showSelectedLayout(layout.getId(), 0, 1);
+            }).then(function () {
+                var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
+                assert.equal(1, vLayouts.length);
+                assert.equal(layout.getId(), vLayouts[0]);
 
-      return map.openDataOverlay(layout.getId()).then(function() {
-        return map._showSelectedLayout(layout.getId(), 0, 1);
-      }).then(function() {
-        var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
-        assert.equal(1, vLayouts.length);
-        assert.equal(layout.getId(), vLayouts[0]);
+                assert.equal(2, map.selectedLayoutOverlays[layout.getId()].length);
+                assert.ok(map.selectedLayoutOverlays[layout.getId()][0] instanceof AliasSurface);
+                assert.ok(map.selectedLayoutOverlays[layout.getId()][1] instanceof ReactionSurface);
 
-        assert.equal(2, map.selectedLayoutOverlays[layout.getId()].length);
-        assert.ok(map.selectedLayoutOverlays[layout.getId()][0] instanceof AliasSurface);
-        assert.ok(map.selectedLayoutOverlays[layout.getId()][1] instanceof ReactionSurface);
+                // now hide the layout
+                map._hideSelectedLayout(layout.getId());
+                assert.ok(map.selectedLayoutOverlays[layout.getId()]);
+                assert.equal(0, map.selectedLayoutOverlays[layout.getId()].length);
+            });
 
-        // now hide the layout
-        map._hideSelectedLayout(layout.getId());
-        assert.ok(map.selectedLayoutOverlays[layout.getId()]);
-        assert.equal(0, map.selectedLayoutOverlays[layout.getId()].length);
-      });
+        });
+
+        it("with submaps", function () {
+            var projectId = "complex_model_with_submaps";
+            helper.setUrl("http://test/?id=" + projectId);
+            GuiConnector.getParams["id"] = projectId;
+            var customMap;
+            var emptySubmodelId = 16730;
+            var filledSubmodelId = 16731;
+            var overlayId = 18083;
+
+            return ServerConnector.getProject(projectId).then(function (project) {
+                var options = helper.createCustomMapOptions(project);
+                customMap = new CustomMap(options);
+
+                return customMap.openSubmap(emptySubmodelId);
+            }).then(function () {
+                return customMap.openSubmap(filledSubmodelId);
+            }).then(function () {
+
+                var emptySubmap = customMap.getSubmapById(emptySubmodelId);
+                var filledSubmap = customMap.getSubmapById(filledSubmodelId);
+
+                return customMap.openDataOverlay(overlayId).then(function () {
+
+                    assert.equal(1, customMap.selectedLayoutOverlays[overlayId].length);
+                    assert.equal(1, filledSubmap.selectedLayoutOverlays[overlayId].length);
+                    assert.equal(0, emptySubmap.selectedLayoutOverlays[overlayId].length);
+
+                    // now hide the layout
+                    customMap.hideSelectedLayout(overlayId);
+                    assert.equal(0, customMap.selectedLayoutOverlays[overlayId].length);
+                    assert.equal(0, filledSubmap.selectedLayoutOverlays[overlayId].length);
+                    assert.equal(0, emptySubmap.selectedLayoutOverlays[overlayId].length);
+                });
+
+            }).then(function () {
+                return customMap.destroy();
+            });
+        });
 
     });
 
-    it("with submaps", function() {
-      var projectId = "complex_model_with_submaps";
-      helper.setUrl("http://test/?id=" + projectId);
-      GuiConnector.getParams["id"] = projectId;
-      var customMap;
-      var emptySubmodelId = 16730;
-      var filledSubmodelId = 16731;
-      var overlayId = 18083;
+    it("removeSelectedLayout", function () {
+        var map = helper.createCustomMap();
+        var layout = helper.createLayout();
+        layout.setInitialized(true);
+        layout.setInputDataAvailable(true);
+        map.getModel().addLayout(layout);
 
-      return ServerConnector.getProject(projectId).then(function(project) {
-        var options = helper.createCustomMapOptions(project);
-        customMap = new CustomMap(options);
+        return map.openDataOverlay(layout.getId()).then(function () {
+            return map.removeSelectedLayout(layout.getId());
+        }).then(function () {
+            var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
+            assert.equal(0, vLayouts.length);
+        });
+    });
 
-        return customMap.openSubmap(emptySubmodelId);
-      }).then(function() {
-        return customMap.openSubmap(filledSubmodelId);
-      }).then(function() {
+    describe("openInfoWindowForAlias", function () {
+        it("default", function () {
+            var map = helper.createCustomMap();
+            var layout = helper.createLayout();
+            var alias = helper.createAlias();
+            alias.setModelId(map.getId());
+            var layoutAlias = helper.createLayoutAlias();
+            layoutAlias.setId(alias.getId());
 
-        var emptySubmap = customMap.getSubmapById(emptySubmodelId);
-        var filledSubmap = customMap.getSubmapById(filledSubmodelId);
+            layout.addAlias(layoutAlias);
 
-        return customMap.openDataOverlay(overlayId).then(function() {
+            // create layout
+            map.getModel().addLayout(layout);
+            map.getModel().addAlias(alias);
 
-          assert.equal(1, customMap.selectedLayoutOverlays[overlayId].length);
-          assert.equal(1, filledSubmap.selectedLayoutOverlays[overlayId].length);
-          assert.equal(0, emptySubmap.selectedLayoutOverlays[overlayId].length);
+            return map.openInfoWindowForAlias(alias).then(function () {
+                assert.ok(map.getAliasInfoWindowById(alias.getId()));
+                assert.ok(map.getAliasInfoWindowById(alias.getId()).isOpened());
+            });
+        });
 
-          // now hide the layout
-          customMap.hideSelectedLayout(overlayId);
-          assert.equal(0, customMap.selectedLayoutOverlays[overlayId].length);
-          assert.equal(0, filledSubmap.selectedLayoutOverlays[overlayId].length);
-          assert.equal(0, emptySubmap.selectedLayoutOverlays[overlayId].length);
+        it("for incomplete alias", function () {
+            var map, alias;
+            return ServerConnector.getProject().then(function (project) {
+                var options = helper.createCustomMapOptions(project);
+                map = new CustomMap(options);
+
+                return map.getModel().getAliasById(329171, false);
+            }).then(function (result) {
+                alias = result;
+                assert.notOk(alias.isComplete());
+                return map.openInfoWindowForAlias(alias);
+            }).then(function () {
+                assert.ok(map.getAliasInfoWindowById(alias.getId()));
+                assert.ok(map.getAliasInfoWindowById(alias.getId()).isOpened());
+            });
         });
+    });
 
-      });
+    it("getSearchAutocomplete", function () {
+        var map = helper.createCustomMap();
+
+        var t = map.getSearchAutocomplete("s");
+        assert.ok(t);
+        assert.equal(t.length, 0);
     });
 
-  });
+    it("getSearchAutocomplete 2", function () {
+        var map = helper.createCustomMap();
 
-  it("removeSelectedLayout", function() {
-    var map = helper.createCustomMap();
-    var layout = helper.createLayout();
-    layout.setInitialized(true);
-    layout.setInputDataAvailable(true);
-    map.getModel().addLayout(layout);
+        return map.refreshSearchAutocomplete("s").then(function () {
+            var t = map.getSearchAutocomplete("s");
+            assert.ok(t);
+            assert.ok(t.length > 0);
+        });
+    });
+
+    describe("renderOverlayCollection", function () {
+        it("for alias", function () {
+            var map = helper.createCustomMap();
+            var reaction = helper.createReaction();
+            var alias = helper.createAlias();
+            map.getModel().addAlias(alias);
+            map.getModel().addReaction(reaction);
+
+            var oc = helper.createDbOverlay(map);
+
+            oc.getIdentifiedElements = function () {
+                return Promise.resolve([new IdentifiedElement({
+                    objectId: alias.getId(),
+                    icon: "empty.png",
+                    modelId: map.getId(),
+                    type: "Alias"
+                })]);
+            };
+            return map.renderOverlayCollection({
+                overlayCollection: oc
+            }).then(function () {
+                var aliasMarkerCount = 0;
+                var markers = oc.markers["ALIAS"];
+                for (var id in markers) {
+                    if (markers.hasOwnProperty(id)) {
+                        aliasMarkerCount++;
+                    }
+                }
+                assert.equal(1, aliasMarkerCount);
+            });
+        });
+
+        it("alias re-rendering with different icon", function () {
+            var map = helper.createCustomMap();
+            var reaction = helper.createReaction(map);
+            var alias = helper.createAlias(map);
+            map.getModel().addAlias(alias);
+            map.getModel().addReaction(reaction);
+
+            var marker;
+            var oc = helper.createDbOverlay(map);
+
+            oc.getIdentifiedElements = function () {
+                return Promise.resolve([new IdentifiedElement({
+                    objectId: alias.getId(),
+                    icon: "empty.png",
+                    modelId: map.getId(),
+                    type: "Alias"
+                }), new IdentifiedElement(reaction)]);
+            };
+            return map.renderOverlayCollection({
+                overlayCollection: oc
+            }).then(function () {
+                marker = oc.markers["ALIAS"][alias.getId()];
+                oc.getIdentifiedElements = function () {
+                    return Promise.resolve([new IdentifiedElement({
+                        objectId: alias.getId(),
+                        icon: "new_icon.png",
+                        modelId: map.getId(),
+                        type: "Alias"
+                    })]);
+                };
+                assert.ok(oc.mapOverlays["REACTION"][reaction.getId()]);
+
+                return map.renderOverlayCollection({
+                    overlayCollection: oc
+                });
+            }).then(function () {
+                assert.equal(marker.getIcon(), "new_icon.png");
+
+                assert.notOk(oc.mapOverlays["REACTION"][reaction.getId()]);
+            });
+        });
+
+        it("for set of aliases", function () {
+            var map = helper.createCustomMap();
+
+            var oc = helper.createDbOverlay(map);
+
+            var identifiedElements = [];
+            for (var i = 0; i < 3; i++) {
+                var alias = helper.createAlias(map);
+                map.getModel().addAlias(alias);
+                var ie = helper.createIdentifiedElement(alias);
+                ie.setIcon("");
+                identifiedElements.push(ie);
+            }
+
+            oc.getIdentifiedElements = function () {
+                return Promise.resolve(identifiedElements);
+            };
+
+            return map.renderOverlayCollection({
+                overlayCollection: oc
+            }).then(function () {
+                var aliasMarkerCount = 0;
+                var markers = oc.markers["ALIAS"];
+                for (var id in markers) {
+                    if (markers.hasOwnProperty(id)) {
+                        aliasMarkerCount++;
+                    }
+                }
+
+                assert.equal(aliasMarkerCount, 3);
+            });
+        });
 
-    return map.openDataOverlay(layout.getId()).then(function() {
-      return map.removeSelectedLayout(layout.getId());
-    }).then(function() {
-      var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays();
-      assert.equal(0, vLayouts.length);
+        it("for point", function () {
+            var map = helper.createCustomMap();
+
+            var oc = helper.createDbOverlay(map);
+
+            var javaObj = {
+                objectId: "Point2D.Double[117.685546875, 204.6923828125001]",
+                modelId: map.getId(),
+                type: "POINT",
+                icon: "marker/empty.png"
+            };
+
+            oc.getIdentifiedElements = function () {
+                return Promise.resolve([new IdentifiedElement(javaObj)]);
+            };
+
+            return map.renderOverlayCollection({
+                overlayCollection: oc
+            }).then(function () {
+                var markerCount = 0;
+                var markers = oc.markers["POINT"];
+                for (var id in markers) {
+                    if (markers.hasOwnProperty(id)) {
+                        markerCount++;
+                    }
+                }
+                assert.equal(1, markerCount);
+            });
+        });
+
+        it("for reaction", function () {
+            var map = helper.createCustomMap();
+            var reaction = helper.createReaction();
+            map.getModel().addReaction(reaction);
+
+            var oc = helper.createDbOverlay(map);
+
+            var javaObj = {
+                objectId: reaction.getId(),
+                modelId: map.getId(),
+                type: "Reaction",
+            };
+
+            oc.getIdentifiedElements = function () {
+                return Promise.resolve([new IdentifiedElement(javaObj)]);
+            };
+
+            return map.renderOverlayCollection({
+                overlayCollection: oc
+            }).then(function () {
+                var markerCount = 0;
+                var markers = oc.mapOverlays["REACTION"];
+                for (var id in markers) {
+                    if (markers.hasOwnProperty(id)) {
+                        markerCount++;
+                    }
+                }
+                assert.equal(1, markerCount);
+            });
+        });
     });
-  });
 
-  describe("openInfoWindowForAlias", function() {
-    it("default", function() {
-      var map = helper.createCustomMap();
-      var layout = helper.createLayout();
-      var alias = helper.createAlias();
-      alias.setModelId(map.getId());
-      var layoutAlias = helper.createLayoutAlias();
-      layoutAlias.setId(alias.getId());
+    it("clearDbOverlays", function () {
+        var map = helper.createCustomMap();
 
-      layout.addAlias(layoutAlias);
+        var oc = helper.createDbOverlay(map);
 
-      // create layout
-      map.getModel().addLayout(layout);
-      map.getModel().addAlias(alias);
+        var javaObj = {
+            objectId: "Point2D.Double[117.685546875, 204.6923828125001]",
+            modelId: map.getId(),
+            type: "POINT",
+            icon: "marker/empty.png"
+        };
+        var searchResults = [new IdentifiedElement(javaObj)];
+
+        oc.getIdentifiedElements = function () {
+            return Promise.resolve(searchResults);
+        };
+        oc.clear = function () {
+            searchResults = [];
+            return this.callListeners("onSearch", searchResults);
+        };
+
+        return map.renderOverlayCollection({
+            overlayCollection: oc
+        }).then(function () {
+
+            return map.clearDbOverlays();
+        }).then(function () {
+            var markerCount = 0;
+            for (var id in oc.pointMarkers) {
+                if (oc.pointMarkers.hasOwnProperty(id)) {
+                    markerCount++;
+                }
+            }
+
+            assert.equal(0, markerCount);
+        });
 
-      return map.openInfoWindowForAlias(alias).then(function() {
-        assert.ok(map.getAliasInfoWindowById(alias.getId()));
-        assert.ok(map.getAliasInfoWindowById(alias.getId()).isOpened());
-      });
     });
 
-    it("for incomplete alias", function() {
-      var map, alias;
-      return ServerConnector.getProject().then(function(project) {
-        var options = helper.createCustomMapOptions(project);
-        map = new CustomMap(options);
+    it("getInfoWindowForIdentifiedElement ( reaction)", function () {
+        var map = helper.createCustomMap();
+        var reaction = helper.createReaction(map);
+        map.getModel().addReaction(reaction);
+
+        var ie = helper.createIdentifiedElement(reaction);
+
+        var infoWindow = map.getInfoWindowForIdentifiedElement(ie);
+
+        assert.equal(null, infoWindow);
+        return map._openInfoWindowForReaction(reaction).then(function () {
+            infoWindow = map.getInfoWindowForIdentifiedElement(ie);
+
+            assert.ok(infoWindow);
+        });
 
-        return map.getModel().getAliasById(329171, false);
-      }).then(function(result) {
-        alias = result;
-        assert.notOk(alias.isComplete());
-        return map.openInfoWindowForAlias(alias);
-      }).then(function() {
-        assert.ok(map.getAliasInfoWindowById(alias.getId()));
-        assert.ok(map.getAliasInfoWindowById(alias.getId()).isOpened());
-      });
     });
-  });
 
-  it("getSearchAutocomplete", function() {
-    var map = helper.createCustomMap();
+    it("right click on map", function () {
+        var map = helper.createCustomMap();
+        map.setContextMenu(new MapContextMenu({
+            customMap: map,
+            element: testDiv
+        }));
 
-    var t = map.getSearchAutocomplete("s");
-    assert.ok(t);
-    assert.equal(t.length, 0);
-  });
+        var mev = {
+            stop: null,
+            latLng: new google.maps.LatLng(40.0, -90.0)
+        };
 
-  it("getSearchAutocomplete 2", function() {
-    var map = helper.createCustomMap();
+        assert.notOk(map.getActiveSubmapId());
+        google.maps.event.trigger(map.getGoogleMap(), 'rightclick', mev);
+        assert.equal(map.getId(), map.getActiveSubmapId());
 
-    return map.refreshSearchAutocomplete("s").then(function() {
-      var t = map.getSearchAutocomplete("s");
-      assert.ok(t);
-      assert.ok(t.length > 0);
     });
-  });
 
-  describe("renderOverlayCollection", function() {
-    it("for alias", function() {
-      var map = helper.createCustomMap();
-      var reaction = helper.createReaction();
-      var alias = helper.createAlias();
-      map.getModel().addAlias(alias);
-      map.getModel().addReaction(reaction);
+    it("left click on map", function () {
+        var map;
+        var searchOverlay;
+        return ServerConnector.getProject().then(function (project) {
+            map = helper.createCustomMap(project);
+            searchOverlay = helper.createSearchDbOverlay(map);
+
+            var mev = {
+                stop: null,
+                latLng: new google.maps.LatLng(82.32061703407554, -167.25586206896548),
+            };
+            map.getGoogleMap().setZoom(4);
+            // latLng : new google.maps.LatLng(82.40238643645326, -148.44758620689652)
+
+            assert.notOk(map.getActiveSubmapId());
+            return google.maps.event.trigger(map.getGoogleMap(), 'click', mev);
+
+        }).then(function () {
+            assert.equal(map.getId(), map.getActiveSubmapId());
+            assert.ok(searchOverlay.markers["ALIAS"][329171]);
+        });
 
-      var oc = helper.createDbOverlay(map);
-
-      oc.getIdentifiedElements = function() {
-        return Promise.resolve([ new IdentifiedElement({
-          objectId : alias.getId(),
-          icon : "empty.png",
-          modelId : map.getId(),
-          type : "Alias"
-        }) ]);
-      };
-      return map.renderOverlayCollection({
-        overlayCollection : oc
-      }).then(function() {
-        var aliasMarkerCount = 0;
-        var markers = oc.markers["ALIAS"];
-        for ( var id in markers) {
-          if (markers.hasOwnProperty(id)) {
-            aliasMarkerCount++;
-          }
-        }
-        assert.equal(1, aliasMarkerCount);
-      });
     });
 
-    it("alias re-rendering with different icon", function() {
-      var map = helper.createCustomMap();
-      var reaction = helper.createReaction(map);
-      var alias = helper.createAlias(map);
-      map.getModel().addAlias(alias);
-      map.getModel().addReaction(reaction);
+    it("left click on reaction", function () {
+        var map;
+        var searchOverlay;
+        return ServerConnector.getProject().then(function (project) {
+            map = helper.createCustomMap(project);
+            searchOverlay = helper.createSearchDbOverlay(map);
 
-      var marker;
-      var oc = helper.createDbOverlay(map);
-
-      oc.getIdentifiedElements = function() {
-        return Promise.resolve([ new IdentifiedElement({
-          objectId : alias.getId(),
-          icon : "empty.png",
-          modelId : map.getId(),
-          type : "Alias"
-        }), new IdentifiedElement(reaction) ]);
-      };
-      return map.renderOverlayCollection({
-        overlayCollection : oc
-      }).then(function() {
-        marker = oc.markers["ALIAS"][alias.getId()];
-        oc.getIdentifiedElements = function() {
-          return Promise.resolve([ new IdentifiedElement({
-            objectId : alias.getId(),
-            icon : "new_icon.png",
-            modelId : map.getId(),
-            type : "Alias"
-          }) ]);
+            var mev = {
+                stop: null,
+                latLng: new google.maps.LatLng(82.40238643645326, -148.44758620689652)
+            };
+            map.getGoogleMap().setZoom(4);
+
+            assert.notOk(map.getActiveSubmapId());
+            return google.maps.event.trigger(map.getGoogleMap(), 'click', mev);
+        }).then(function () {
+            assert.equal(map.getId(), map.getActiveSubmapId());
+            assert.ok(searchOverlay.mapOverlays["REACTION"][153521]);
+            assert.ok(searchOverlay.mapOverlays["REACTION"][153521].isShown());
+            assert.ok(searchOverlay.markers["ALIAS"][329165]);
+        });
+    });
+
+    it("create polygon through drawingManager", function () {
+        var map = helper.createCustomMap();
+
+        map.setSelectionContextMenu(new SelectionContextMenu({
+            customMap: map,
+            element: testDiv
+        }));
+
+        map.turnOnDrawing();
+
+        var triangleCoords = [new google.maps.LatLng(25.774, -80.190), new google.maps.LatLng(18.466, -66.118),
+            new google.maps.LatLng(32.321, -64.757), new google.maps.LatLng(25.774, -80.190),];
+
+        // Construct the polygon.
+        var bermudaTriangle = new google.maps.Polygon({
+            paths: triangleCoords,
+            strokeColor: '#FF0000',
+            strokeOpacity: 0.8,
+            strokeWeight: 2,
+            fillColor: '#FF0000',
+            fillOpacity: 0.35
+        });
+        bermudaTriangle.setMap(map.getGoogleMap());
+
+        var eventParam = {
+            type: google.maps.drawing.OverlayType.POLYGON,
+            overlay: bermudaTriangle,
         };
-        assert.ok(oc.mapOverlays["REACTION"][reaction.getId()]);
 
-        return map.renderOverlayCollection({
-          overlayCollection : oc
+        // check creation complete behaviour
+        assert.ok(map.isDrawingOn());
+        assert.equal(google.maps.drawing.OverlayType.POLYGON, map._drawingManager.getDrawingMode());
+        google.maps.event.trigger(map._drawingManager, 'overlaycomplete', eventParam);
+        assert.ok(map.isDrawingOn());
+        assert.equal(null, map._drawingManager.getDrawingMode());
+
+        // and now check how it behaves when we wiught click on the polygon
+        var clickEventParam = {
+            stop: null,
+            latLng: new google.maps.LatLng(40.0, -90.0)
+        };
+
+        assert.notOk(map.getSelectedPolygon());
+
+        assert.notOk(map.getActiveSubmapId());
+        assert.notOk(map.getSelectedArea());
+        google.maps.event.trigger(bermudaTriangle, 'rightclick', clickEventParam);
+        assert.ok(map.getSelectedArea());
+        assert.equal(map.getId(), map.getActiveSubmapId());
+
+        assert.ok(map.getSelectedPolygon());
+
+    });
+
+    it("getAliasVisibleLayoutsData", function () {
+        var mockObject = helper.createCustomMap();
+
+        var alias = helper.createAlias();
+        mockObject.getModel().addAlias(alias);
+
+        var layout = helper.createLayout();
+        layout.setInputDataAvailable(true);
+        layout.setInitialized(true);
+        mockObject.getModel().addLayout(layout);
+
+        return mockObject.openDataOverlay(layout.getId()).then(function () {
+            return mockObject.getAliasVisibleLayoutsData(alias.getId());
+        }).then(function (layoutAliases) {
+            assert.equal(layoutAliases.length, 1);
         });
-      }).then(function() {
-        assert.equal(marker.getIcon(), "new_icon.png");
+    });
+
+    it("changed coords in map", function () {
+        var map = helper.createCustomMap();
+        var oldCenter = map.getGoogleMap().getCenter();
+        var newCenter = new google.maps.LatLng(3, 87);
+        map.getGoogleMap().setCenter(newCenter);
+        google.maps.event.trigger(map.getGoogleMap(), "center_changed");
 
-        assert.notOk(oc.mapOverlays["REACTION"][reaction.getId()]);
-      });
+        var center = ServerConnector.getSessionData(map.getProject()).getCenter(map.getModel());
+        assert.ok(center !== oldCenter);
+        assert.ok(center instanceof google.maps.Point);
     });
 
-    it("for set of aliases", function() {
-      var map = helper.createCustomMap();
+    it("refreshComments", function () {
+        var map = helper.createCustomMap();
+        map.getModel().setId(15781);
+        var commentsOverlay = helper.createCommentDbOverlay(map);
+
+        ServerConnector.getSessionData().setShowComments(true);
+        return map.refreshComments().then(function () {
+            assert.notOk(commentsOverlay.markers["POINT"]['(241.01,372.35)']);
+            assert.ok(commentsOverlay.markers["POINT"]['(643.96,144.09)']);
+            assert.notOk(commentsOverlay.markers["POINT"]['(216.65,370.00)']);
+            assert.notOk(commentsOverlay.markers["POINT"]['unkId']);
+        });
+    });
+
+    it("hide comments", function () {
+        var map = helper.createCustomMap();
+        map.getModel().setId(15781);
+        var commentsOverlay = helper.createCommentDbOverlay(map);
+
+        ServerConnector.getSessionData().setShowComments(true);
+        return map.refreshComments().then(function () {
+            ServerConnector.getSessionData().setShowComments(false);
+            return map.refreshComments();
+        }).then(function () {
+            assert.notOk(commentsOverlay.markers["POINT"]['(241.01, 372.35)']);
+        });
+    });
+
+    it("openCommentDialog", function () {
+        var map = helper.createCustomMap();
+        map.getModel().setId(15781);
+        map.setActiveSubmapId(15781);
+        map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
+        return map.openCommentDialog().then(function () {
+            var types = map.getCommentDialog().getTypes();
+            assert.equal(types.length, 6);
+            var selected = map.getCommentDialog().getSelectedType();
+            assert.ok(selected === "<General>");
+
+            map.getCommentDialog().setSelectedType(1);
+            selected = map.getCommentDialog().getSelectedType();
+            assert.notOk(selected === "<General>");
+
+            map.getCommentDialog().setSelectedType(2);
+            selected = map.getCommentDialog().getSelectedType();
+            assert.notOk(selected === "<General>");
+        }).then(function () {
+            map.getCommentDialog().destroy();
+        });
+    });
+
+    it("addComment", function () {
+        var map;
+        return ServerConnector.getProject().then(function (project) {
+            map = helper.createCustomMap(project);
+            helper.createCommentDbOverlay(map);
+            map.setActiveSubmapId(map.getId());
+            map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
+            return map.openCommentDialog();
+        }).then(function () {
+            return map.getCommentDialog().addComment();
+        }).then(function () {
+            map.getCommentDialog().destroy();
+        });
+    });
 
-      var oc = helper.createDbOverlay(map);
+    it("addComment for protein", function () {
+        var map;
+        return ServerConnector.getProject().then(function (project) {
+            map = helper.createCustomMap(project);
+            helper.createCommentDbOverlay(map);
+            map.setActiveSubmapId(map.getId());
+            map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
+            return map.openCommentDialog();
+        }).then(function () {
+            var dialog = map.getCommentDialog();
+            dialog.setSelectedType(1);
+            return dialog.addComment();
+        }).then(function () {
+            map.getCommentDialog().destroy();
+        });
+    });
+
+    it("retrieveOverlayDetailDataForElement for comment", function () {
+        var map = helper.createCustomMap();
+        helper.createCommentDbOverlay(map);
 
-      var identifiedElements = [];
-      for (var i = 0; i < 3; i++) {
         var alias = helper.createAlias(map);
+        alias.setId(329158);
         map.getModel().addAlias(alias);
-        var ie = helper.createIdentifiedElement(alias);
-        ie.setIcon("");
-        identifiedElements.push(ie);
-      }
-
-      oc.getIdentifiedElements = function() {
-        return Promise.resolve(identifiedElements);
-      };
-
-      return map.renderOverlayCollection({
-        overlayCollection : oc
-      }).then(function() {
-        var aliasMarkerCount = 0;
-        var markers = oc.markers["ALIAS"];
-        for ( var id in markers) {
-          if (markers.hasOwnProperty(id)) {
-            aliasMarkerCount++;
-          }
-        }
 
-        assert.equal(aliasMarkerCount, 3);
-      });
+        var ie = new IdentifiedElement(alias);
+
+        return map.retrieveOverlayDetailDataForElement(ie, {
+            comment: true
+        }).then(function (details) {
+            assert.ok(details);
+            assert.equal(details.length, 1);
+            assert.equal(details[0].length, 1);
+            assert.ok(details[0][0] instanceof Comment);
+        });
     });
 
-    it("for point", function() {
-      var map = helper.createCustomMap();
+    it("getOverlayDataForIdentifiedElement", function () {
+        var map = helper.createCustomMap();
+        var commentOverlay = helper.createCommentDbOverlay(map);
 
-      var oc = helper.createDbOverlay(map);
-
-      var javaObj = {
-        objectId : "Point2D.Double[117.685546875, 204.6923828125001]",
-        modelId : map.getId(),
-        type : "POINT",
-        icon : "marker/empty.png"
-      };
-
-      oc.getIdentifiedElements = function() {
-        return Promise.resolve([ new IdentifiedElement(javaObj) ]);
-      };
-
-      return map.renderOverlayCollection({
-        overlayCollection : oc
-      }).then(function() {
-        var markerCount = 0;
-        var markers = oc.markers["POINT"];
-        for ( var id in markers) {
-          if (markers.hasOwnProperty(id)) {
-            markerCount++;
-          }
-        }
-        assert.equal(1, markerCount);
-      });
+        var alias = helper.createAlias(map);
+        alias.setId(329158);
+        map.getModel().addAlias(alias);
+
+        var ie = new IdentifiedElement(alias);
+
+        return map.getOverlayDataForIdentifiedElement(ie, {
+            comment: true
+        }).then(function (details) {
+            assert.equal(details.length, 1);
+
+            var overlayData = details[0];
+            assert.equal(overlayData.overlay, commentOverlay);
+            assert.ok(overlayData.data);
+            assert.equal(overlayData.data.length, 1);
+            assert.ok(overlayData.data[0] instanceof Comment);
+        });
     });
 
-    it("for reaction", function() {
-      var map = helper.createCustomMap();
-      var reaction = helper.createReaction();
-      map.getModel().addReaction(reaction);
+    it("openSubmap", function () {
+        var options = helper.createCustomMapOptions();
 
-      var oc = helper.createDbOverlay(map);
-
-      var javaObj = {
-        objectId : reaction.getId(),
-        modelId : map.getId(),
-        type : "Reaction",
-      };
-
-      oc.getIdentifiedElements = function() {
-        return Promise.resolve([ new IdentifiedElement(javaObj) ]);
-      };
-
-      return map.renderOverlayCollection({
-        overlayCollection : oc
-      }).then(function() {
-        var markerCount = 0;
-        var markers = oc.mapOverlays["REACTION"];
-        for ( var id in markers) {
-          if (markers.hasOwnProperty(id)) {
-            markerCount++;
-          }
-        }
-        assert.equal(1, markerCount);
-      });
-    });
-  });
-
-  it("clearDbOverlays", function() {
-    var map = helper.createCustomMap();
-
-    var oc = helper.createDbOverlay(map);
-
-    var javaObj = {
-      objectId : "Point2D.Double[117.685546875, 204.6923828125001]",
-      modelId : map.getId(),
-      type : "POINT",
-      icon : "marker/empty.png"
-    };
-    var searchResults = [ new IdentifiedElement(javaObj) ];
-
-    oc.getIdentifiedElements = function() {
-      return Promise.resolve(searchResults);
-    };
-    oc.clear = function() {
-      searchResults = [];
-      return this.callListeners("onSearch", searchResults);
-    };
-
-    return map.renderOverlayCollection({
-      overlayCollection : oc
-    }).then(function() {
-
-      return map.clearDbOverlays();
-    }).then(function() {
-      var markerCount = 0;
-      for ( var id in oc.pointMarkers) {
-        if (oc.pointMarkers.hasOwnProperty(id)) {
-          markerCount++;
-        }
-      }
+        var submodel = helper.createModel();
+        options.getProject().getModel().addSubmodel(submodel);
 
-      assert.equal(0, markerCount);
+        var map = new CustomMap(options);
+
+        map.openSubmap(submodel.getId());
+        map.destroy();
     });
 
-  });
+    describe("setCenter", function () {
+        it("default", function () {
+            var options = helper.createCustomMapOptions();
 
-  it("getInfoWindowForIdentifiedElement ( reaction)", function() {
-    var map = helper.createCustomMap();
-    var reaction = helper.createReaction(map);
-    map.getModel().addReaction(reaction);
+            var map = new CustomMap(options);
 
-    var ie = helper.createIdentifiedElement(reaction);
+            map.setCenter(new google.maps.LatLng(10, 20));
+            assert.ok(ServerConnector.getSessionData().getCenter(map.getModel()));
+        });
 
-    var infoWindow = map.getInfoWindowForIdentifiedElement(ie);
+        it("on submap", function () {
+            var options = helper.createCustomMapOptions();
 
-    assert.equal(null, infoWindow);
-    return map._openInfoWindowForReaction(reaction).then(function() {
-      infoWindow = map.getInfoWindowForIdentifiedElement(ie);
+            var submodel = helper.createModel();
+            options.getProject().getModel().addSubmodel(submodel);
 
-      assert.ok(infoWindow);
+            var map = new CustomMap(options);
+            map.openSubmap(submodel.getId());
+            map.setCenter(new google.maps.LatLng(10, 20));
+            assert.ok(ServerConnector.getSessionData().getCenter(submodel));
+            map.destroy();
+        });
     });
 
-  });
+    it("setZoom", function () {
+        var options = helper.createCustomMapOptions();
 
-  it("right click on map", function() {
-    var map = helper.createCustomMap();
-    map.setContextMenu(new MapContextMenu({
-      customMap : map,
-      element : testDiv
-    }));
+        var map = new CustomMap(options);
 
-    var mev = {
-      stop : null,
-      latLng : new google.maps.LatLng(40.0, -90.0)
-    };
+        map.setZoom(3);
+        assert.equal(3, ServerConnector.getSessionData().getZoomLevel(map.getModel()));
+    });
 
-    assert.notOk(map.getActiveSubmapId());
-    google.maps.event.trigger(map.getGoogleMap(), 'rightclick', mev);
-    assert.equal(map.getId(), map.getActiveSubmapId());
+    it("removeSelection when invalid model selected", function () {
+        var options = helper.createCustomMapOptions();
 
-  });
+        var map = new CustomMap(options);
+        map.setActiveSubmapId(-1);
 
-  it("left click on map", function() {
-    var map;
-    var searchOverlay;
-    return ServerConnector.getProject().then(function(project) {
-      map = helper.createCustomMap(project);
-      searchOverlay = helper.createSearchDbOverlay(map);
+        try {
+            map.removeSelection();
+            assert.ok(false);
+        } catch (e) {
+            assert.ok(e.message.indexOf("Cannot find submap") >= 0);
+        }
+    });
 
-      var mev = {
-        stop : null,
-        latLng : new google.maps.LatLng(82.32061703407554, -167.25586206896548),
-      };
-      map.getGoogleMap().setZoom(4);
-      // latLng : new google.maps.LatLng(82.40238643645326, -148.44758620689652)
+    it("removeSelection", function () {
+        var options = helper.createCustomMapOptions();
+
+        var map = new CustomMap(options);
+        map.setActiveSubmapId(map.getId());
+        map.setSelectedArea(new google.maps.Rectangle({}));
+
+        map.removeSelection();
+        assert.equal(map.getSelectedArea(), null);
+    });
+
+    describe("createMarkerForDbOverlay", function () {
+        it("update marker", function () {
+            var map;
+            var marker1, marker2;
+            var element = new IdentifiedElement({
+                id: 329159,
+                modelId: 15781,
+                type: "ALIAS"
+            });
+            var overlay;
+            return ServerConnector.getProject().then(function (project) {
+                var options = helper.createCustomMapOptions(project);
+                map = new CustomMap(options);
+                overlay = helper.createDbOverlay(map);
+                return map.createMarkerForDbOverlay(element, overlay);
+            }).then(function (result) {
+                marker1 = result;
+                element.setIcon("another.png");
+                return map.createMarkerForDbOverlay(element, overlay);
+            }).then(function (result) {
+                marker2 = result;
+                assert.equal(marker1, marker2);
+            });
+        });
 
-      assert.notOk(map.getActiveSubmapId());
-      return google.maps.event.trigger(map.getGoogleMap(), 'click', mev);
+        it("update surface", function () {
+            var map;
+            var marker1, marker2;
+            var element = new IdentifiedElement({
+                id: 329159,
+                modelId: 15781,
+                type: "ALIAS"
+            });
+            var overlay;
+            return ServerConnector.getProject().then(function (project) {
+                var options = helper.createCustomMapOptions(project);
+                map = new CustomMap(options);
+                overlay = helper.createDbOverlay(map);
+                return map.createSurfaceForDbOverlay(element, overlay);
+            }).then(function (result) {
+                marker1 = result;
+                element.setColor("another.png");
+                return map.createSurfaceForDbOverlay(element, overlay);
+            }).then(function (result) {
+                marker2 = result;
+                assert.equal(marker1, marker2);
+            });
+        });
+
+        it("reaction marker", function () {
+            var map;
+            var element = new IdentifiedElement({
+                id: 153508,
+                modelId: 15781,
+                type: "REACTION"
+            });
+            var overlay;
+            return ServerConnector.getProject().then(function (project) {
+                var options = helper.createCustomMapOptions(project);
+                map = new CustomMap(options);
+                overlay = helper.createDbOverlay(map);
+                return map.createMarkerForDbOverlay(element, overlay);
+            }).then(function (result) {
+                assert.ok(result.getReactionData());
+            });
+        });
 
-    }).then(function() {
-      assert.equal(map.getId(), map.getActiveSubmapId());
-      assert.ok(searchOverlay.markers["ALIAS"][329171]);
     });
 
-  });
+    describe("_openInfoWindowForIdentifiedElement", function () {
+        it("for AliasMarker", function () {
+            var map;
+            var alias, marker;
+            return ServerConnector.getProject().then(function (project) {
+                map = helper.createCustomMap(project);
+                return map.getModel().getAliasById(329171);
+            }).then(function (result) {
+                alias = result;
 
-  it("left click on reaction", function() {
-    var map;
-    var searchOverlay;
-    return ServerConnector.getProject().then(function(project) {
-      map = helper.createCustomMap(project);
-      searchOverlay = helper.createSearchDbOverlay(map);
+                var identifiedElement = new IdentifiedElement(alias);
+                identifiedElement.setIcon("empty.png");
 
-      var mev = {
-        stop : null,
-        latLng : new google.maps.LatLng(82.40238643645326, -148.44758620689652)
-      };
-      map.getGoogleMap().setZoom(4);
+                marker = new AliasMarker({
+                    element: identifiedElement,
+                    map: map
+                });
 
-      assert.notOk(map.getActiveSubmapId());
-      return google.maps.event.trigger(map.getGoogleMap(), 'click', mev);
-    }).then(function() {
-      assert.equal(map.getId(), map.getActiveSubmapId());
-      assert.ok(searchOverlay.mapOverlays["REACTION"][153521]);
-      assert.ok(searchOverlay.mapOverlays["REACTION"][153521].isShown());
-      assert.ok(searchOverlay.markers["ALIAS"][329165]);
-    });
-  });
+                return marker.init();
+            }).then(function () {
+                assert.equal(null, map.getAliasInfoWindowById(alias.getId()));
+                return map._openInfoWindowForIdentifiedElement(marker).then(function () {
+                    assert.ok(map.getAliasInfoWindowById(alias.getId()));
+                });
+            });
+
+        });
+        it("for ReactionMarker", function () {
+            var map;
+            var reaction, marker;
+            return ServerConnector.getProject().then(function (project) {
+                map = helper.createCustomMap(project);
+                return map.getModel().getReactionById(153510);
+            }).then(function (result) {
+                reaction = result;
+
+                marker = new ReactionMarker({
+                    element: new IdentifiedElement(reaction),
+                    map: map
+                });
+                return marker.init();
+            }).then(function () {
+                assert.equal(null, map.getReactionInfoWindowById(reaction.getId()));
+                return map._openInfoWindowForIdentifiedElement(marker);
+            }).then(function () {
+                assert.ok(map.getReactionInfoWindowById(reaction.getId()));
+            });
 
-  it("create polygon through drawingManager", function() {
-    var map = helper.createCustomMap();
+        });
+        it("for PointMarker", function () {
+
+            var mockObject = helper.createCustomMap();
 
-    map.setSelectionContextMenu(new SelectionContextMenu({
-      customMap : map,
-      element : testDiv
-    }));
+            mockObject.getOverlayDataForPoint = function () {
+                return Promise.resolve([]);
+            };
 
-    map.turnOnDrawing();
+            var point = new google.maps.Point(2, 3.45);
+            var pointData = new PointData(point, mockObject.getId());
 
-    var triangleCoords = [ new google.maps.LatLng(25.774, -80.190), new google.maps.LatLng(18.466, -66.118),
-        new google.maps.LatLng(32.321, -64.757), new google.maps.LatLng(25.774, -80.190), ];
+            var pointMarker = new PointMarker({
+                element: new IdentifiedElement(pointData),
+                map: mockObject
+            });
 
-    // Construct the polygon.
-    var bermudaTriangle = new google.maps.Polygon({
-      paths : triangleCoords,
-      strokeColor : '#FF0000',
-      strokeOpacity : 0.8,
-      strokeWeight : 2,
-      fillColor : '#FF0000',
-      fillOpacity : 0.35
-    });
-    bermudaTriangle.setMap(map.getGoogleMap());
-
-    var eventParam = {
-      type : google.maps.drawing.OverlayType.POLYGON,
-      overlay : bermudaTriangle,
-    };
-
-    // check creation complete behaviour
-    assert.ok(map.isDrawingOn());
-    assert.equal(google.maps.drawing.OverlayType.POLYGON, map._drawingManager.getDrawingMode());
-    google.maps.event.trigger(map._drawingManager, 'overlaycomplete', eventParam);
-    assert.ok(map.isDrawingOn());
-    assert.equal(null, map._drawingManager.getDrawingMode());
-
-    // and now check how it behaves when we wiught click on the polygon
-    var clickEventParam = {
-      stop : null,
-      latLng : new google.maps.LatLng(40.0, -90.0)
-    };
-
-    assert.notOk(map.getSelectedPolygon());
-
-    assert.notOk(map.getActiveSubmapId());
-    assert.notOk(map.getSelectedArea());
-    google.maps.event.trigger(bermudaTriangle, 'rightclick', clickEventParam);
-    assert.ok(map.getSelectedArea());
-    assert.equal(map.getId(), map.getActiveSubmapId());
-
-    assert.ok(map.getSelectedPolygon());
-
-  });
-
-  it("getAliasVisibleLayoutsData", function() {
-    var mockObject = helper.createCustomMap();
-
-    var alias = helper.createAlias();
-    mockObject.getModel().addAlias(alias);
-
-    var layout = helper.createLayout();
-    layout.setInputDataAvailable(true);
-    layout.setInitialized(true);
-    mockObject.getModel().addLayout(layout);
-
-    return mockObject.openDataOverlay(layout.getId()).then(function() {
-      return mockObject.getAliasVisibleLayoutsData(alias.getId());
-    }).then(function(layoutAliases) {
-      assert.equal(layoutAliases.length, 1);
-    });
-  });
-
-  it("changed coords in map", function() {
-    var map = helper.createCustomMap();
-    var oldCenter = map.getGoogleMap().getCenter();
-    var newCenter = new google.maps.LatLng(3, 87);
-    map.getGoogleMap().setCenter(newCenter);
-    google.maps.event.trigger(map.getGoogleMap(), "center_changed");
-
-    var center = ServerConnector.getSessionData(map.getProject()).getCenter(map.getModel());
-    assert.ok(center !== oldCenter);
-    assert.ok(center instanceof google.maps.Point);
-  });
-
-  it("refreshComments", function() {
-    var map = helper.createCustomMap();
-    map.getModel().setId(15781);
-    var commentsOverlay = helper.createCommentDbOverlay(map);
-
-    ServerConnector.getSessionData().setShowComments(true);
-    return map.refreshComments().then(function() {
-      assert.notOk(commentsOverlay.markers["POINT"]['(241.01,372.35)']);
-      assert.ok(commentsOverlay.markers["POINT"]['(643.96,144.09)']);
-      assert.notOk(commentsOverlay.markers["POINT"]['(216.65,370.00)']);
-      assert.notOk(commentsOverlay.markers["POINT"]['unkId']);
-    });
-  });
-
-  it("hide comments", function() {
-    var map = helper.createCustomMap();
-    map.getModel().setId(15781);
-    var commentsOverlay = helper.createCommentDbOverlay(map);
-
-    ServerConnector.getSessionData().setShowComments(true);
-    return map.refreshComments().then(function() {
-      ServerConnector.getSessionData().setShowComments(false);
-      return map.refreshComments();
-    }).then(function() {
-      assert.notOk(commentsOverlay.markers["POINT"]['(241.01, 372.35)']);
-    });
-  });
-
-  it("openCommentDialog", function() {
-    var map = helper.createCustomMap();
-    map.getModel().setId(15781);
-    map.setActiveSubmapId(15781);
-    map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
-    return map.openCommentDialog().then(function() {
-      var types = map.getCommentDialog().getTypes();
-      assert.equal(types.length, 6);
-      var selected = map.getCommentDialog().getSelectedType();
-      assert.ok(selected === "<General>");
-
-      map.getCommentDialog().setSelectedType(1);
-      selected = map.getCommentDialog().getSelectedType();
-      assert.notOk(selected === "<General>");
-
-      map.getCommentDialog().setSelectedType(2);
-      selected = map.getCommentDialog().getSelectedType();
-      assert.notOk(selected === "<General>");
-    }).then(function() {
-      map.getCommentDialog().destroy();
-    });
-  });
-
-  it("addComment", function() {
-    var map;
-    return ServerConnector.getProject().then(function(project) {
-      map = helper.createCustomMap(project);
-      helper.createCommentDbOverlay(map);
-      map.setActiveSubmapId(map.getId());
-      map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
-      return map.openCommentDialog();
-    }).then(function() {
-      return map.getCommentDialog().addComment();
-    }).then(function() {
-      map.getCommentDialog().destroy();
-    });
-  });
-
-  it("addComment for protein", function() {
-    var map;
-    return ServerConnector.getProject().then(function(project) {
-      map = helper.createCustomMap(project);
-      helper.createCommentDbOverlay(map);
-      map.setActiveSubmapId(map.getId());
-      map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12));
-      return map.openCommentDialog();
-    }).then(function() {
-      var dialog = map.getCommentDialog();
-      dialog.setSelectedType(1);
-      return dialog.addComment();
-    }).then(function() {
-      map.getCommentDialog().destroy();
-    });
-  });
-
-  it("retrieveOverlayDetailDataForElement for comment", function() {
-    var map = helper.createCustomMap();
-    helper.createCommentDbOverlay(map);
-
-    var alias = helper.createAlias(map);
-    alias.setId(329158);
-    map.getModel().addAlias(alias);
-
-    var ie = new IdentifiedElement(alias);
-
-    return map.retrieveOverlayDetailDataForElement(ie, {
-      comment : true
-    }).then(function(details) {
-      assert.ok(details);
-      assert.equal(details.length, 1);
-      assert.equal(details[0].length, 1);
-      assert.ok(details[0][0] instanceof Comment);
-    });
-  });
-
-  it("getOverlayDataForIdentifiedElement", function() {
-    var map = helper.createCustomMap();
-    var commentOverlay = helper.createCommentDbOverlay(map);
-
-    var alias = helper.createAlias(map);
-    alias.setId(329158);
-    map.getModel().addAlias(alias);
-
-    var ie = new IdentifiedElement(alias);
-
-    return map.getOverlayDataForIdentifiedElement(ie, {
-      comment : true
-    }).then(function(details) {
-      assert.equal(details.length, 1);
-
-      var overlayData = details[0];
-      assert.equal(overlayData.overlay, commentOverlay);
-      assert.ok(overlayData.data);
-      assert.equal(overlayData.data.length, 1);
-      assert.ok(overlayData.data[0] instanceof Comment);
-    });
-  });
-
-  it("openSubmap", function() {
-    var options = helper.createCustomMapOptions();
-
-    var submodel = helper.createModel();
-    options.getProject().getModel().addSubmodel(submodel);
-
-    var map = new CustomMap(options);
-
-    map.openSubmap(submodel.getId());
-  });
-
-  it("setCenter", function() {
-    var options = helper.createCustomMapOptions();
-
-    var map = new CustomMap(options);
-
-    map.setCenter(new google.maps.LatLng(10, 20));
-    assert.ok(ServerConnector.getSessionData().getCenter(map.getModel()));
-  });
-
-  it("setCenter on submap", function() {
-    var options = helper.createCustomMapOptions();
-
-    var submodel = helper.createModel();
-    options.getProject().getModel().addSubmodel(submodel);
-
-    var map = new CustomMap(options);
-    map.openSubmap(submodel.getId());
-    map.setCenter(new google.maps.LatLng(10, 20));
-    assert.ok(ServerConnector.getSessionData().getCenter(submodel));
-  });
-
-  it("setZoom", function() {
-    var options = helper.createCustomMapOptions();
-
-    var map = new CustomMap(options);
-
-    map.setZoom(3);
-    assert.equal(3, ServerConnector.getSessionData().getZoomLevel(map.getModel()));
-  });
-
-  it("removeSelection when invalid model selected", function() {
-    var options = helper.createCustomMapOptions();
-
-    var map = new CustomMap(options);
-    map.setActiveSubmapId(-1);
-
-    try {
-      map.removeSelection();
-      assert.ok(false);
-    } catch (e) {
-      assert.ok(e.message.indexOf("Cannot find submap") >= 0);
-    }
-  });
-
-  it("removeSelection", function() {
-    var options = helper.createCustomMapOptions();
-
-    var map = new CustomMap(options);
-    map.setActiveSubmapId(map.getId());
-    map.setSelectedArea(new google.maps.Rectangle({}));
-
-    map.removeSelection();
-    assert.equal(map.getSelectedArea(), null);
-  });
-
-  describe("createMarkerForDbOverlay", function() {
-    it("update marker", function() {
-      var map;
-      var marker1, marker2;
-      var element = new IdentifiedElement({
-        id : 329159,
-        modelId : 15781,
-        type : "ALIAS"
-      });
-      var overlay;
-      return ServerConnector.getProject().then(function(project) {
-        var options = helper.createCustomMapOptions(project);
-        map = new CustomMap(options);
-        overlay = helper.createDbOverlay(map);
-        return map.createMarkerForDbOverlay(element, overlay);
-      }).then(function(result) {
-        marker1 = result;
-        element.setIcon("another.png");
-        return map.createMarkerForDbOverlay(element, overlay);
-      }).then(function(result) {
-        marker2 = result;
-        assert.equal(marker1, marker2);
-      });
-    });
-
-    it("update surface", function() {
-      var map;
-      var marker1, marker2;
-      var element = new IdentifiedElement({
-        id : 329159,
-        modelId : 15781,
-        type : "ALIAS"
-      });
-      var overlay;
-      return ServerConnector.getProject().then(function(project) {
-        var options = helper.createCustomMapOptions(project);
-        map = new CustomMap(options);
-        overlay = helper.createDbOverlay(map);
-        return map.createSurfaceForDbOverlay(element, overlay);
-      }).then(function(result) {
-        marker1 = result;
-        element.setColor("another.png");
-        return map.createSurfaceForDbOverlay(element, overlay);
-      }).then(function(result) {
-        marker2 = result;
-        assert.equal(marker1, marker2);
-      });
-    });
-
-    it("reaction marker", function() {
-      var map;
-      var element = new IdentifiedElement({
-        id : 153508,
-        modelId : 15781,
-        type : "REACTION"
-      });
-      var overlay;
-      return ServerConnector.getProject().then(function(project) {
-        var options = helper.createCustomMapOptions(project);
-        map = new CustomMap(options);
-        overlay = helper.createDbOverlay(map);
-        return map.createMarkerForDbOverlay(element, overlay);
-      }).then(function(result) {
-        assert.ok(result.getReactionData());
-      });
-    });
-
-  });
-
-  describe("_openInfoWindowForIdentifiedElement", function() {
-    it("for AliasMarker", function() {
-      var map;
-      var alias, marker;
-      return ServerConnector.getProject().then(function(project) {
-        map = helper.createCustomMap(project);
-        return map.getModel().getAliasById(329171);
-      }).then(function(result) {
-        alias = result;
-
-        var identifiedElement = new IdentifiedElement(alias);
-        identifiedElement.setIcon("empty.png");
-
-        marker = new AliasMarker({
-          element : identifiedElement,
-          map : map
-        });
-
-        return marker.init();
-      }).then(function() {
-        assert.equal(null, map.getAliasInfoWindowById(alias.getId()));
-        return map._openInfoWindowForIdentifiedElement(marker).then(function() {
-          assert.ok(map.getAliasInfoWindowById(alias.getId()));
-        });
-      });
-
-    });
-    it("for ReactionMarker", function() {
-      var map;
-      var reaction, marker;
-      return ServerConnector.getProject().then(function(project) {
-        map = helper.createCustomMap(project);
-        return map.getModel().getReactionById(153510);
-      }).then(function(result) {
-        reaction = result;
-
-        marker = new ReactionMarker({
-          element : new IdentifiedElement(reaction),
-          map : map
-        });
-        return marker.init();
-      }).then(function() {
-        assert.equal(null, map.getReactionInfoWindowById(reaction.getId()));
-        return map._openInfoWindowForIdentifiedElement(marker);
-      }).then(function() {
-        assert.ok(map.getReactionInfoWindowById(reaction.getId()));
-      });
-
-    });
-    it("for PointMarker", function() {
-
-      var mockObject = helper.createCustomMap();
-
-      mockObject.getOverlayDataForPoint = function() {
-        return Promise.resolve([]);
-      };
-
-      var point = new google.maps.Point(2, 3.45);
-      var pointData = new PointData(point, mockObject.getId());
-
-      var pointMarker = new PointMarker({
-        element : new IdentifiedElement(pointData),
-        map : mockObject
-      });
-
-      return pointMarker.init().then(function() {
-        assert.equal(null, mockObject.getPointInfoWindowById(pointData.getId()));
-        return mockObject._openInfoWindowForIdentifiedElement(pointMarker.getIdentifiedElement());
-      }).then(function() {
-        assert.ok(mockObject.getPointInfoWindowById(pointData.getId()));
-      });
-    });
-  });
+            return pointMarker.init().then(function () {
+                assert.equal(null, mockObject.getPointInfoWindowById(pointData.getId()));
+                return mockObject._openInfoWindowForIdentifiedElement(pointMarker.getIdentifiedElement());
+            }).then(function () {
+                assert.ok(mockObject.getPointInfoWindowById(pointData.getId()));
+            });
+        });
+    });
 
 });
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index 9def5a5e31..6f041dace4 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -12,382 +12,403 @@ var chai = require('chai');
 var assert = chai.assert;
 var logger = require('./logger');
 
-describe('minerva global', function() {
-  beforeEach(function() {
-    global.scriptDiv = document.createElement("script");
-    global.GuiConnector = undefined;
-    global.ServerConnector = undefined;
-    document.body.appendChild(global.scriptDiv);
-  });
-
-  afterEach(function() {
-    document.body.removeChild(global.scriptDiv);
-    global.GuiConnector = GuiConnectorMock;
-    global.ServerConnector = ServerConnectorMock;
-  });
-
-  describe('create', function() {
-    it('default', function() {
-      var options = null;
-      return ServerConnectorMock.getProject().then(function(project) {
-        options = helper.createCustomMapOptions(project);
-
-        return minerva.create(options);
-      }).then(function(result) {
-        assert.ok(result);
-        assert.equal(logger.getWarnings().length, 0);
-      });
+describe('minerva global', function () {
+    beforeEach(function () {
+        global.scriptDiv = document.createElement("script");
+        global.GuiConnector = undefined;
+        global.ServerConnector = undefined;
+        document.body.appendChild(global.scriptDiv);
     });
-    it('invalid projectId', function() {
-      var options = {
-        projectId : "unknownId",
-        element : testDiv,
-      };
-      return minerva.create(options).then(function() {
-        assert.ok(false);
-      }, function(error) {
-        assert.ok(error.message.indexOf("Project with given id doesn't exist") >= 0);
-      });
-    });
-  });
 
-  it('create with overview', function() {
-    helper.setUrl("http://test/?id=complex_model_with_images");
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createOptions(project);
-
-      return minerva.create(options);
-    }).then(function(result) {
-      assert.ok(result);
-      assert.equal(logger.getWarnings().length, 0);
-      var showOverviewButton = document.getElementsByName("showOverviewButton")[0];
-      showOverviewButton.onclick();
+    afterEach(function () {
+        document.body.removeChild(global.scriptDiv);
+        global.GuiConnector = GuiConnectorMock;
+        global.ServerConnector = ServerConnectorMock;
     });
-  });
 
-  it("showComments", function() {
-    var options = null;
-    return ServerConnectorMock.getProject().then(function(project) {
-      options = helper.createCustomMapOptions(project);
-      return minerva.create(options);
-    }).then(function() {
-      var commentCheckbox = document.getElementsByName("commentCheckbox")[0];
-      commentCheckbox.checked = true;
-      return commentCheckbox.onclick();
-    }).then(function() {
-      assert.ok(ServerConnectorMock.getSessionData(options.getProject()).getShowComments());
+    describe('create', function () {
+        it('default', function () {
+            var options = null;
+            return ServerConnectorMock.getProject().then(function (project) {
+                options = helper.createCustomMapOptions(project);
+
+                return minerva.create(options);
+            }).then(function (result) {
+                assert.ok(result);
+                assert.equal(logger.getWarnings().length, 0);
+                return result.destroy();
+            });
+        });
+        it('invalid projectId', function () {
+            var options = {
+                projectId: "unknownId",
+                element: testDiv,
+            };
+            return minerva.create(options).then(function () {
+                assert.ok(false);
+            }, function (error) {
+                assert.ok(error.message.indexOf("Project with given id doesn't exist") >= 0);
+            });
+        });
+        it('with overview', function () {
+            helper.setUrl("http://test/?id=complex_model_with_images");
+            var customMap;
+            return ServerConnectorMock.getProject().then(function (project) {
+                var options = helper.createOptions(project);
+
+                return minerva.create(options);
+            }).then(function (result) {
+                customMap = result;
+                assert.ok(result);
+                assert.equal(logger.getWarnings().length, 0);
+                var showOverviewButton = document.getElementsByName("showOverviewButton")[0];
+                return showOverviewButton.onclick();
+            }).then(function () {
+                return customMap.destroy();
+            });
+        });
     });
-  });
 
-  it("contructor with GET zoom param", function() {
-    helper.setUrl("http://test/?zoom=5");
-    var options;
-    return ServerConnectorMock.getProject().then(function(project) {
-      options = helper.createCustomMapOptions(project);
-      return minerva.create(options);
-    }).then(function() {
-      var sessionData = ServerConnectorMock.getSessionData(options.getProject());
-      assert.equal(sessionData.getZoomLevel(options.getProject().getModel()), 5);
-    });
-  });
 
-  it("contructor with GET coord param", function() {
-    helper.setUrl("http://test/?x=5&y=6");
-    var options;
-    return ServerConnectorMock.getProject().then(function(project) {
-      options = helper.createCustomMapOptions(project);
-      return minerva.create(options);
-    }).then(function() {
-      var center = ServerConnectorMock.getSessionData(options.getProject()).getCenter(options.getProject().getModel());
-      assert.ok(center instanceof google.maps.Point);
-      assert.equal(center.x, 5);
-      assert.equal(center.y, 6);
+    it("showComments", function () {
+        var options = null;
+        var customMap;
+        return ServerConnectorMock.getProject().then(function (project) {
+            options = helper.createCustomMapOptions(project);
+            return minerva.create(options);
+        }).then(function (result) {
+            customMap = result;
+            var commentCheckbox = document.getElementsByName("commentCheckbox")[0];
+            commentCheckbox.checked = true;
+            return commentCheckbox.onclick();
+        }).then(function () {
+            assert.ok(ServerConnectorMock.getSessionData(options.getProject()).getShowComments());
+            return customMap.destroy();
+        });
     });
-  });
-
-  it('create with layout', function() {
-    var layout;
-    var project;
-    return ServerConnectorMock.getProject().then(function(result) {
-      project = result;
-      var options = helper.createCustomMapOptions(project);
 
-      layout = project.getModel().getLayouts()[1];
+    it("constructor with GET zoom param", function () {
+        helper.setUrl("http://test/?zoom=5");
+        var options;
+        return ServerConnectorMock.getProject().then(function (project) {
+            options = helper.createCustomMapOptions(project);
+            return minerva.create(options);
+        }).then(function (result) {
+            var sessionData = ServerConnectorMock.getSessionData(options.getProject());
+            assert.equal(sessionData.getZoomLevel(options.getProject().getModel()), 5);
+            return result.destroy();
+        });
+    });
 
-      helper.setUrl("http://test/?layout=" + layout.getName());
+    it("constructor with GET coord param", function () {
+        helper.setUrl("http://test/?x=5&y=6");
+        var options;
+        return ServerConnectorMock.getProject().then(function (project) {
+            options = helper.createCustomMapOptions(project);
+            return minerva.create(options);
+        }).then(function (result) {
+            var center = ServerConnectorMock.getSessionData(options.getProject()).getCenter(options.getProject().getModel());
+            assert.ok(center instanceof google.maps.Point);
+            assert.equal(center.x, 5);
+            assert.equal(center.y, 6);
+            return result.destroy();
+        });
+    });
 
-      return minerva.create(options);
-    }).then(function(result) {
-      assert.ok(result);
-      // input file is not available so it's the background
-      return result.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(), layout.getId());
-      assert.equal(logger.getWarnings().length, 0);
+    it('create with layout', function () {
+        var layout;
+        var project;
+        var customMap;
+        return ServerConnectorMock.getProject().then(function (result) {
+            project = result;
+            var options = helper.createCustomMapOptions(project);
+
+            layout = project.getModel().getLayouts()[1];
+
+            helper.setUrl("http://test/?layout=" + layout.getName());
+
+            return minerva.create(options);
+        }).then(function (result) {
+            customMap = result;
+            assert.ok(result);
+            // input file is not available so it's the background
+            return result.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(), layout.getId());
+            assert.equal(logger.getWarnings().length, 0);
+            return customMap.destroy();
+        });
     });
-  });
 
-  it('create with layout from session data', function() {
-    var layout;
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
+    it('create with layout from session data', function () {
+        var layout;
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
 
-      layout = project.getModel().getLayouts()[1];
+            layout = project.getModel().getLayouts()[1];
 
-      ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId());
+            ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId());
 
-      return minerva.create(options);
-    }).then(function() {
-      assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), 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");
-
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
-      return minerva.create(options);
-    }).then(function(result) {
-      assert.ok(result);
-      return result.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);
+    it('create with layout 2', function () {
+        helper.setUrl("http://test/?layout=xxx");
+        var globalObject;
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
+            return minerva.create(options);
+        }).then(function (result) {
+            globalObject = result;
+            assert.ok(result);
+            return result.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");
-
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
-      return minerva.create(options);
-    }).then(function(result) {
-      return result.getHighlightedBioEntities("search");
-    }).then(function(elements) {
-      assert.ok(elements.length > 0);
+    it('create with search overlay and GET search param', function () {
+        helper.setUrl("http://test/?search=s1");
+
+        var globalObject;
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
+            return minerva.create(options);
+        }).then(function (result) {
+            globalObject = result;
+            return result.getHighlightedBioEntities("search");
+        }).then(function (elements) {
+            assert.ok(elements.length > 0);
+            return globalObject.destroy();
+        });
     });
-  });
 
-  it('create with show sumbodel GET param', function() {
-    helper.setUrl("http://test/?submap=15781");
+    it('create with show sumbodel GET param', function () {
+        helper.setUrl("http://test/?submap=15781");
 
-    var project = helper.createProject();
-    project.getModel().setId(15781);
+        var project = helper.createProject();
+        project.getModel().setId(15781);
 
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
 
-      return minerva.create(options);
+            return minerva.create(options);
+        }).then(function(result){
+            return result.destroy();
+        });
     });
-  });
 
-  it("contructor with touch enabled", function() {
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
-      options.setCustomTouchInterface(true);
-      return minerva.create(options).then(function(result) {
-        assert.ok(result);
-      });
+    it("constructor with touch enabled", function () {
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
+            options.setCustomTouchInterface(true);
+            return minerva.create(options).then(function (result) {
+                assert.ok(result);
+                return result.destroy();
+            });
+        });
     });
-  });
-
-  it('add search listener', function() {
-    var callbackOk = false;
-    var globalResult;
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
-      options.setDebug(true);
-      return minerva.create(options);
-    }).then(function(result) {
-      globalResult = result;
 
-      result.addListener({
-        dbOverlayName : "search",
-        type : "onSearch",
-        callback : function(elements) {
-          assert.ok(elements.length > 0);
-          assert.ok(elements[0].length !== undefined, "Array of arrays expected as onSearch result");
-          callbackOk = true;
-        }
-      });
-      return result.customMap.getOverlayByName("search").searchByQuery("s1");
-    }).then(function() {
-      assert.ok(callbackOk);
-      callbackOk = false;
-      return globalResult.customMap.getOverlayByName("search").searchByQuery("s1");
-    }).then(function() {
-      assert.ok(callbackOk);
-      callbackOk = false;
-      var params = {
-        coordinates : new google.maps.Point(184.79, 365.76),
-        zoom : 2,
-        modelId : globalResult.getProject().getModel().getId(),
-      };
-      return globalResult.customMap.getOverlayByName("search").searchByCoordinates(params);
-    }).then(function() {
-      assert.ok(callbackOk);
+    it('add search listener', function () {
+        var callbackOk = false;
+        var globalResult;
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
+            options.setDebug(true);
+            return minerva.create(options);
+        }).then(function (result) {
+            globalResult = result;
+
+            result.addListener({
+                dbOverlayName: "search",
+                type: "onSearch",
+                callback: function (elements) {
+                    assert.ok(elements.length > 0);
+                    assert.ok(elements[0].length !== undefined, "Array of arrays expected as onSearch result");
+                    callbackOk = true;
+                }
+            });
+            return result.customMap.getOverlayByName("search").searchByQuery("s1");
+        }).then(function () {
+            assert.ok(callbackOk);
+            callbackOk = false;
+            return globalResult.customMap.getOverlayByName("search").searchByQuery("s1");
+        }).then(function () {
+            assert.ok(callbackOk);
+            callbackOk = false;
+            var params = {
+                coordinates: new google.maps.Point(184.79, 365.76),
+                zoom: 2,
+                modelId: globalResult.getProject().getModel().getId(),
+            };
+            return globalResult.customMap.getOverlayByName("search").searchByCoordinates(params);
+        }).then(function () {
+            assert.ok(callbackOk);
+            return globalResult.destroy();
+        });
     });
-  });
 
-  it('getProject', function() {
-    return ServerConnectorMock.getProject().then(function(project) {
-      var options = helper.createCustomMapOptions(project);
-      return minerva.create(options);
-    }).then(function(result) {
-      assert.equal(result.getProject().getProjectId(), "sample");
+    it('getProject', function () {
+        return ServerConnectorMock.getProject().then(function (project) {
+            var options = helper.createCustomMapOptions(project);
+            return minerva.create(options);
+        }).then(function (result) {
+            assert.equal(result.getProject().getProjectId(), "sample");
+            return result.destroy();
+        });
     });
-  });
 
-  it("simple contructor", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      assert.ok(result);
-    }).then(function() {
-      globalResult.destroy();
+    it("simple constructor", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        return minerva.create(options).then(function (result) {
+            assert.ok(result);
+            result.destroy();
+        });
     });
-  });
 
-  it("getBioEntityById", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      return result.getBioEntityById({
-        id : 329177,
-        modelId : 15781,
-        type : "ALIAS"
-      });
-    }).then(function(result) {
-      assert.ok(result);
-    }).then(function() {
-      globalResult.destroy();
+    it("getBioEntityById", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            return result.getBioEntityById({
+                id: 329177,
+                modelId: 15781,
+                type: "ALIAS"
+            });
+        }).then(function (result) {
+            assert.ok(result);
+        }).then(function () {
+            globalResult.destroy();
+        });
     });
-  });
 
-  it("getBioEntityById for reaction", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      return result.getBioEntityById({
-        id : 153508,
-        modelId : 15781,
-        type : "REACTION"
-      });
-    }).then(function(result) {
-      assert.ok(result);
-      assert.ok(result.getReactants()[0] instanceof Alias);
-    }).then(function() {
-      globalResult.destroy();
+    it("getBioEntityById for reaction", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            return result.getBioEntityById({
+                id: 153508,
+                modelId: 15781,
+                type: "REACTION"
+            });
+        }).then(function (result) {
+            assert.ok(result);
+            assert.ok(result.getReactants()[0] instanceof Alias);
+        }).then(function () {
+            globalResult.destroy();
+        });
     });
-  });
 
-  it("showElement", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    var elementToShow = {
-      element : {
-        id : 329171,
-        modelId : 15781,
-        type : "ALIAS"
-      },
-      type : "ICON",
-    };
-
-    var elementToShow2 = {
-      element : {
-        id : 329171,
-        modelId : 15781,
-        type : "ALIAS"
-      },
-      type : "SURFACE",
-      options : {
-        color : "#FF0000",
-      }
-    };
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      return globalResult.showBioEntity(elementToShow);
-    }).then(function() {
-      return globalResult.getHighlightedBioEntities();
-    }).then(function(elements) {
-      assert.equal(elements.length, 1);
-      return globalResult.showBioEntity(elementToShow2);
-    }).then(function() {
-      return globalResult.getHighlightedBioEntities();
-    }).then(function(elements) {
-      assert.equal(elements.length, 2);
-      return globalResult.hideBioEntity(elementToShow);
-    }).then(function() {
-      return globalResult.getHighlightedBioEntities();
-    }).then(function(elements) {
-      assert.equal(elements.length, 1);
-      return globalResult.hideBioEntity(elementToShow2);
-    }).then(function() {
-      return globalResult.getHighlightedBioEntities();
-    }).then(function(elements) {
-      assert.equal(elements.length, 0);
-      globalResult.destroy();
+    it("showElement", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        var elementToShow = {
+            element: {
+                id: 329171,
+                modelId: 15781,
+                type: "ALIAS"
+            },
+            type: "ICON",
+        };
+
+        var elementToShow2 = {
+            element: {
+                id: 329171,
+                modelId: 15781,
+                type: "ALIAS"
+            },
+            type: "SURFACE",
+            options: {
+                color: "#FF0000",
+            }
+        };
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            return globalResult.showBioEntity(elementToShow);
+        }).then(function () {
+            return globalResult.getHighlightedBioEntities();
+        }).then(function (elements) {
+            assert.equal(elements.length, 1);
+            return globalResult.showBioEntity(elementToShow2);
+        }).then(function () {
+            return globalResult.getHighlightedBioEntities();
+        }).then(function (elements) {
+            assert.equal(elements.length, 2);
+            return globalResult.hideBioEntity(elementToShow);
+        }).then(function () {
+            return globalResult.getHighlightedBioEntities();
+        }).then(function (elements) {
+            assert.equal(elements.length, 1);
+            return globalResult.hideBioEntity(elementToShow2);
+        }).then(function () {
+            return globalResult.getHighlightedBioEntities();
+        }).then(function (elements) {
+            assert.equal(elements.length, 0);
+            globalResult.destroy();
+        });
     });
-  });
 
-  it("showElement twice", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    var elementToShow = {
-      element : {
-        id : 329171,
-        modelId : 15781,
-        type : "ALIAS"
-      },
-      type : "ICON",
-    };
-    var elementToShow2 = {
-      element : {
-        id : 329171,
-        modelId : 15781,
-        type : "ALIAS"
-      },
-      type : "SURFACE",
-      options : {
-        color : "#FF0000",
-      }
-    };
-
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      globalResult.showBioEntity(elementToShow);
-      return globalResult.showBioEntity(elementToShow2);
-    }).then(function() {
-      globalResult.destroy();
-      assert.ok(false, "Should be rejected due to fact that there is show in progress");
-    }, function(error) {
-      assert.ok(error.message.indexOf("wait until previous Promise for showBioEntity/hideBioEntity is resolved") >= 0);
-      globalResult.destroy();
+    it("showElement twice", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        var elementToShow = {
+            element: {
+                id: 329171,
+                modelId: 15781,
+                type: "ALIAS"
+            },
+            type: "ICON",
+        };
+        var elementToShow2 = {
+            element: {
+                id: 329171,
+                modelId: 15781,
+                type: "ALIAS"
+            },
+            type: "SURFACE",
+            options: {
+                color: "#FF0000",
+            }
+        };
+
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            globalResult.showBioEntity(elementToShow);
+            return globalResult.showBioEntity(elementToShow2);
+        }).then(function () {
+            globalResult.destroy();
+            assert.ok(false, "Should be rejected due to fact that there is show in progress");
+        }, function (error) {
+            assert.ok(error.message.indexOf("wait until previous Promise for showBioEntity/hideBioEntity is resolved") >= 0);
+            globalResult.destroy();
+        });
     });
-  });
 
   it("setCenter", function() {
     var options = {
@@ -413,82 +434,82 @@ describe('minerva global', function() {
     });
   });
 
-  it("setZoom", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      return result.setZoom({
-        modelId : 15781,
-        zoom : 10,
-      });
-    }).then(function() {
-      var sessionData = ServerConnectorMock.getSessionData(globalResult.getProject());
-      var zoom = sessionData.getZoomLevel(globalResult.getProject().getModel());
-      assert.equal(zoom, 10);
-    }).then(function() {
-      globalResult.destroy();
+    it("setZoom", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            return result.setZoom({
+                modelId: 15781,
+                zoom: 10,
+            });
+        }).then(function () {
+            var sessionData = ServerConnectorMock.getSessionData(globalResult.getProject());
+            var zoom = sessionData.getZoomLevel(globalResult.getProject().getModel());
+            assert.equal(zoom, 10);
+        }).then(function () {
+            globalResult.destroy();
+        });
     });
-  });
 
-  it("getConfiguration", function() {
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      return result.getConfiguration();
-    }).then(function(conf) {
-      assert.ok(conf.getElementTypes().length > 0);
-    }).then(function() {
-      globalResult.destroy();
+    it("getConfiguration", function () {
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            return result.getConfiguration();
+        }).then(function (conf) {
+            assert.ok(conf.getElementTypes().length > 0);
+        }).then(function () {
+            globalResult.destroy();
+        });
     });
-  });
 
-  it("getReactionByParticipantId", function() {
-    var ie = {
-      modelId : 15781,
-      type : "ALIAS",
-      id : 329167
-    };
+    it("getReactionByParticipantId", function () {
+        var ie = {
+            modelId: 15781,
+            type: "ALIAS",
+            id: 329167
+        };
+
+        var options = {
+            projectId: "sample",
+            element: testDiv
+        };
+        var globalResult;
+        return minerva.create(options).then(function (result) {
+            globalResult = result;
+            return result.getReactionsWithElement(ie);
+        }).then(function (reactions) {
+            assert.equal(reactions.length, 5);
+        }).then(function () {
+            globalResult.destroy();
+        });
 
-    var options = {
-      projectId : "sample",
-      element : testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function(result) {
-      globalResult = result;
-      return result.getReactionsWithElement(ie);
-    }).then(function(reactions) {
-      assert.equal(reactions.length, 5);
-    }).then(function() {
-      globalResult.destroy();
     });
 
-  });
-
-  it('create Export', function() {
-    var options = null;
-    return ServerConnectorMock.getProject().then(function(project) {
-      options = helper.createCustomMapOptions(project);
+    it('create Export', function () {
+        var options = null;
+        return ServerConnectorMock.getProject().then(function (project) {
+            options = helper.createCustomMapOptions(project);
 
-      return minerva.createExport(options);
-    }).then(function(result) {
-      assert.ok(result);
-      assert.equal(logger.getWarnings().length, 0);
+            return minerva.createExport(options);
+        }).then(function (result) {
+            assert.ok(result);
+            assert.equal(logger.getWarnings().length, 0);
+        });
     });
-  });
 
-  it('create Admin', function() {
-    var options = null;
-    return ServerConnectorMock.getProject().then(function(project) {
-      options = helper.createCustomMapOptions(project);
+    it('create Admin', function () {
+        var options = null;
+        return ServerConnectorMock.getProject().then(function (project) {
+            options = helper.createCustomMapOptions(project);
 
       return minerva.createAdmin(options);
     }).then(function(result) {
diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js
index 2386f2d30d..ea9699eb20 100644
--- a/frontend-js/src/test/js/mocha-config.js
+++ b/frontend-js/src/test/js/mocha-config.js
@@ -3,13 +3,16 @@
 var Promise = require("bluebird");
 var Cookies = require('js-cookie');
 
+var chai = require('chai');
+var assert = chai.assert;
+
 var Helper = require('./helper');
 
 // GLOBAL configuration
 global.navigator = {
-  userAgent : 'node.js',
-  appName : 'MinervaUnitTest',
-  appVersion : '0.0.1',
+    userAgent: 'node.js',
+    appName: 'MinervaUnitTest',
+    appVersion: '0.0.1',
 
 };
 
@@ -29,39 +32,39 @@ global.MouseEvent = window.MouseEvent;
 global.FileReader = window.FileReader;
 
 var originalCreateElement = document.createElement;
-document.createElement = function(arg) {
-  var result = originalCreateElement.call(this, arg);
-  // woraround for: https://github.com/tmpvar/jsdom/issues/961
-  if ("li" === arg) {
-    result.dataset = [];
-  }
-  return result;
+document.createElement = function (arg) {
+    var result = originalCreateElement.call(this, arg);
+    // woraround for: https://github.com/tmpvar/jsdom/issues/961
+    if ("li" === arg) {
+        result.dataset = [];
+    }
+    return result;
 };
 
-window.open = function() {
-  var result = {};
-  result.focus = function() {
+window.open = function () {
+    var result = {};
+    result.focus = function () {
 
-  };
-  return result;
+    };
+    return result;
 };
-window.URL.createObjectURL = function(){
-  
+window.URL.createObjectURL = function () {
+
 };
 
 // pileup is using heavily some browser defined javascript
 var pileup = require('pileup');
-pileup.create = function() {
-  return {
-    destroy : function() {
-    }
-  };
+pileup.create = function () {
+    return {
+        destroy: function () {
+        }
+    };
 };
-pileup.formats.twoBit = function() {
-  return {};
+pileup.formats.twoBit = function () {
+    return {};
 };
-pileup.formats.bigBed = function() {
-  return {};
+pileup.formats.bigBed = function () {
+    return {};
 };
 // ---
 
@@ -81,50 +84,57 @@ global.ServerConnector = require('./ServerConnector-mock');
 var logger = require('./logger');
 
 function removeCookies() {
-  var cookies = Cookies.get();
-  for ( var cookie in cookies) {
-    Cookies.remove(cookie);
-  }
+    var cookies = Cookies.get();
+    for (var cookie in cookies) {
+        Cookies.remove(cookie);
+    }
 }
 
 function mockBootstrap() {
-  $.fn.typeahead = function() {
-    logger.debug("Mock typeahead function call");
-  };
+    $.fn.typeahead = function () {
+        logger.debug("Mock typeahead function call");
+    };
 }
 
-before(function() {
-  Promise.longStackTraces();
+before(function () {
+    Promise.longStackTraces();
 
-  mockBootstrap();
+    mockBootstrap();
 });
 
-beforeEach(function() {
-  window.onresize = undefined;
+beforeEach(function () {
+    window.onresize = undefined;
 
-  logger.flushBuffer();
+    logger.flushBuffer();
 
-  removeCookies();
+    removeCookies();
 
-  ServerConnector.init();
+    ServerConnector.init();
 
-  ServerConnector.getSessionData(null).setToken("MOCK_TOKEN_ID");
-  ServerConnector.getSessionData(null).setLogin("anonymous");
+    ServerConnector.getSessionData(null).setToken("MOCK_TOKEN_ID");
+    ServerConnector.getSessionData(null).setLogin("anonymous");
 
 
-  global.testDiv = document.createElement("div");
-  global.testDiv.id = "test";
-  document.body.appendChild(testDiv);
+    global.testDiv = document.createElement("div");
+    global.testDiv.id = "test";
+    document.body.appendChild(testDiv);
 
-  return ServerConnector.getConfiguration().then(function(configuration) {
-    global.helper = new Helper(configuration);
-    helper.setUrl("http://test/");
-    GuiConnector.init();
-  });
+    return ServerConnector.getConfiguration().then(function (configuration) {
+        global.helper = new Helper(configuration);
+        helper.setUrl("http://test/");
+        GuiConnector.init();
+    });
 
 });
 
-afterEach(function() {
-  document.body.removeChild(global.testDiv);
-  delete global.testDiv;
+afterEach(function () {
+    document.body.removeChild(global.testDiv);
+    delete global.testDiv;
+    if (document.body.hasChildNodes()) {
+        var content = document.body.innerHTML;
+        document.body.innerHTML = "";
+        if (this.currentTest.state !== 'failed') {
+            this.test.error(new Error("Test didn't left clean document. Found: " + content));
+        }
+    }
 });
-- 
GitLab