diff --git a/annotation/.classpath b/annotation/.classpath
index fae1a2b37d5e3386c9651caedb78b9bd107715bd..71a86ecfe6e0f3ee403397c37963606b5852c085 100644
--- a/annotation/.classpath
+++ b/annotation/.classpath
@@ -30,6 +30,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/commons/.classpath b/commons/.classpath
index ace82666f2f113cdb835230548bb1c0ddf6ca559..08d7a50f5bdeedd3895bec12935a95bb700fbf77 100644
--- a/commons/.classpath
+++ b/commons/.classpath
@@ -25,6 +25,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
diff --git a/converter-SBGNML/.classpath b/converter-SBGNML/.classpath
index dfd0043c35667ac6def2c25153c043b5476272e0..92bb54b5c51bf9344817d79b583a9898fc4f14c1 100644
--- a/converter-SBGNML/.classpath
+++ b/converter-SBGNML/.classpath
@@ -30,6 +30,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/converter/.classpath b/converter/.classpath
index 22c865221bbb05b20a9c038d748db0cbf2129ff6..9286345950a83ddef30dfbb238997075a4dd44d8 100644
--- a/converter/.classpath
+++ b/converter/.classpath
@@ -20,6 +20,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
diff --git a/frontend-js/.classpath b/frontend-js/.classpath
index af1430be15836d78425a795565a49fcd23d562b4..b10870e6cf001a6629a2e0743fd65e1956d3f1e1 100644
--- a/frontend-js/.classpath
+++ b/frontend-js/.classpath
@@ -20,6 +20,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/frontend-js/src/main/js/Configuration.js b/frontend-js/src/main/js/Configuration.js
index daaf26bfd41bb04e27b80a3300ecf1afa4ea98fc..e89327f10177eaa8b690146b290ac4242158357f 100644
--- a/frontend-js/src/main/js/Configuration.js
+++ b/frontend-js/src/main/js/Configuration.js
@@ -14,46 +14,51 @@ var ModificationStateType = require('./map/data/ModificationStateType');
 
 function Configuration(json) {
   var self = this;
-  var i;
 
-  self._options = [];
+  if (json instanceof Configuration) {
+    self.update(json);
+  } else {
+    var i;
 
-  for (i = 0; i < json.options.length; i++) {
-    var conf = json.options[i];
-    var type = conf.type;
-    self.setOption(type, new ConfigurationOption(conf));
-  }
+    self._options = [];
 
-  var legendFiles = [];
-  if (self.getOption("LEGEND_FILE_1") !== undefined) {
-    legendFiles.push(self.getOption("LEGEND_FILE_1"));
-  }
-  if (self.getOption("LEGEND_FILE_2") !== undefined) {
-    legendFiles.push(self.getOption("LEGEND_FILE_2"));
-  }
-  if (self.getOption("LEGEND_FILE_3") !== undefined) {
-    legendFiles.push(self.getOption("LEGEND_FILE_3"));
-  }
-  if (self.getOption("LEGEND_FILE_4") !== undefined) {
-    legendFiles.push(self.getOption("LEGEND_FILE_4"));
-  }
-  self.setOption(ConfigurationType.LEGEND_FILES, legendFiles);
+    for (i = 0; i < json.options.length; i++) {
+      var conf = json.options[i];
+      var type = conf.type;
+      self.setOption(type, new ConfigurationOption(conf));
+    }
+
+    var legendFiles = [];
+    if (self.getOption("LEGEND_FILE_1") !== undefined) {
+      legendFiles.push(self.getOption("LEGEND_FILE_1"));
+    }
+    if (self.getOption("LEGEND_FILE_2") !== undefined) {
+      legendFiles.push(self.getOption("LEGEND_FILE_2"));
+    }
+    if (self.getOption("LEGEND_FILE_3") !== undefined) {
+      legendFiles.push(self.getOption("LEGEND_FILE_3"));
+    }
+    if (self.getOption("LEGEND_FILE_4") !== undefined) {
+      legendFiles.push(self.getOption("LEGEND_FILE_4"));
+    }
+    self.setOption(ConfigurationType.LEGEND_FILES, legendFiles);
+
+    var overlayTypes = [];
+    for (i = 0; i < json.overlayTypes.length; i++) {
+      overlayTypes.push(json.overlayTypes[i].name);
+    }
+    self.setOverlayTypes(overlayTypes);
 
-  var overlayTypes = [];
-  for (i = 0; i < json.overlayTypes.length; i++) {
-    overlayTypes.push(json.overlayTypes[i].name);
+    self.setImageConverters(json.imageFormats);
+    self.setModelConverters(json.modelFormats);
+    self.setElementTypes(json.elementTypes);
+    self.setReactionTypes(json.reactionTypes);
+    self.setMiriamTypes(json.miriamTypes);
+    self.setMapTypes(json.mapTypes);
+    self.setModificationStateTypes(json.modificationStateTypes);
+    self.setPrivilegeTypes(json.privilegeTypes);
+    self.setAnnotators(json.annotators);
   }
-  self.setOverlayTypes(overlayTypes);
-
-  self.setImageConverters(json.imageFormats);
-  self.setModelConverters(json.modelFormats);
-  self.setElementTypes(json.elementTypes);
-  self.setReactionTypes(json.reactionTypes);
-  self.setMiriamTypes(json.miriamTypes);
-  self.setMapTypes(json.mapTypes);
-  self.setModificationStateTypes(json.modificationStateTypes);
-  self.setPrivilegeTypes(json.privilegeTypes);
-  self.setAnnotators(json.annotators);
 }
 
 Configuration.prototype.setOption = function (type, value) {
@@ -210,6 +215,9 @@ Configuration.prototype.setModificationStateTypes = function (modificationStateT
     }
   }
 };
+Configuration.prototype.getModificationStateTypes = function () {
+  return this._modificationStateTypes;
+};
 Configuration.prototype.getModificationStateTypeByName = function (name) {
   var self = this;
   for (var i = 0; i < self._modificationStateTypes.length; i++) {
@@ -231,6 +239,10 @@ Configuration.prototype.setAnnotators = function (annotators) {
   }
 };
 
+Configuration.prototype.getAnnotators = function () {
+  return this._annotators;
+};
+
 Configuration.prototype.getElementAnnotators = function (type) {
   if (type === undefined) {
     return this._annotators;
@@ -259,4 +271,57 @@ Configuration.prototype.getElementAnnotators = function (type) {
   return result;
 };
 
+function createCopy(original) {
+  if (Object.prototype.toString.call(original) === '[object Array]') {
+    var result = [];
+    for (var i = 0; i < original.length; i++) {
+      result.push(createCopy(original[i]));
+    }
+    return result;
+  } else {
+    return jQuery.extend({}, original);
+  }
+}
+
+Configuration.prototype.update = function (original) {
+  var self = this;
+  var i;
+  self._options = [];
+  for (i = 0; i < original.getOptions().length; i++) {
+    var conf = original.getOptions()[i];
+    var type = conf.getType();
+    self.setOption(type, new ConfigurationOption(conf));
+  }
+
+  var legendFiles = [];
+  if (self.getOption("LEGEND_FILE_1") !== undefined) {
+    legendFiles.push(self.getOption("LEGEND_FILE_1"));
+  }
+  if (self.getOption("LEGEND_FILE_2") !== undefined) {
+    legendFiles.push(self.getOption("LEGEND_FILE_2"));
+  }
+  if (self.getOption("LEGEND_FILE_3") !== undefined) {
+    legendFiles.push(self.getOption("LEGEND_FILE_3"));
+  }
+  if (self.getOption("LEGEND_FILE_4") !== undefined) {
+    legendFiles.push(self.getOption("LEGEND_FILE_4"));
+  }
+  self.setOption(ConfigurationType.LEGEND_FILES, legendFiles);
+
+  self.setOverlayTypes(createCopy(original.getOverlayTypes()));
+
+  self.setImageConverters(createCopy(original.getImageConverters()));
+  self.setModelConverters(createCopy(original.getModelConverters()));
+  self.setElementTypes(createCopy(original.getElementTypes()));
+  self.setReactionTypes(createCopy(original.getReactionTypes()));
+  self.setMiriamTypes(createCopy(original.getMiriamTypes()));
+  self.setMapTypes(createCopy(original.getMapTypes()));
+  self.setModificationStateTypes(createCopy(original.getModificationStateTypes()));
+  self.setPrivilegeTypes(createCopy(original.getPrivilegeTypes()));
+  self._annotators = [];
+  for (i = 0; i < original.getAnnotators(); i++) {
+    self._annotators.push(new Annotator(original.getAnnotators()[i]));
+  }
+};
+
 module.exports = Configuration;
diff --git a/frontend-js/src/main/js/ConfigurationOption.js b/frontend-js/src/main/js/ConfigurationOption.js
index 41059c1a8fa2f155fab5893313139b43786082af..57f5b1dd5680fc6cb93e51aa3bf93b28129325db 100644
--- a/frontend-js/src/main/js/ConfigurationOption.js
+++ b/frontend-js/src/main/js/ConfigurationOption.js
@@ -9,10 +9,17 @@ function ConfigurationOption(data) {
   ObjectWithListeners.call(this);
 
   var self = this;
-  self.setType(data.type);
-  self.setCommonName(data.commonName);
-  self.setValue(data.value);
-  self.setValueType(data.valueType);
+  if (data instanceof ConfigurationOption) {
+    self.setType(data.getType());
+    self.setCommonName(data.getCommonName());
+    self.setValue(data.getValue());
+    self.setValueType(data.getValueType());
+  } else {
+    self.setType(data.type);
+    self.setCommonName(data.commonName);
+    self.setValue(data.value);
+    self.setValueType(data.valueType);
+  }
 }
 
 ConfigurationOption.prototype = Object.create(ObjectWithListeners.prototype);
diff --git a/frontend-js/src/main/js/gui/Legend.js b/frontend-js/src/main/js/gui/Legend.js
index 860f60cc7905ff1f170f54a2b798fd98c662f4f0..6d584ea45e3686296bef6da7f6e670c185e5706c 100644
--- a/frontend-js/src/main/js/gui/Legend.js
+++ b/frontend-js/src/main/js/gui/Legend.js
@@ -93,7 +93,7 @@ function createLegendSlide(file, index) {
     result.className = "item";
   }
   var img = document.createElement("img");
-  img.src = file;
+  img.src = file.getValue();
   result.appendChild(img);
   return result;
 }
diff --git a/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js b/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js
index 5ce556159b468e99eed2e403db839f87131446f2..e397c75dea2a3e64c6fe29f6e4d6e581aaba8c7c 100644
--- a/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js
+++ b/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js
@@ -8,10 +8,11 @@ var Functions = require('../../Functions');
 
 var logger = require('../../logger');
 
+var tabIdCounter = 0;
+
 function GuiUtils(configuration) {
   var self = this;
   self.setConfiguration(configuration);
-  self._tabIdCounter = 0;
 }
 
 GuiUtils.prototype = Object.create(AbstractGuiElement.prototype);
@@ -496,8 +497,8 @@ GuiUtils.prototype.createTab = function (params) {
   var self = this;
   var tabData = params.tabData;
 
-  var tabId = tabData.tabId + "_tab_" + self._tabIdCounter;
-  self._tabIdCounter++;
+  var tabId = tabData.tabId + "_tab_" + tabIdCounter;
+  tabIdCounter++;
 
   var navClass = '';
   var contentClass = 'tab-pane';
diff --git a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
index 6e87c331574d71621b4d26703621d2c3cc3245f9..768b172362a75ea2f6f9d83df5976ec0de6f9c66 100644
--- a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js
@@ -105,7 +105,7 @@ LeftPanel.prototype.hideTab = function (panel) {
   var panelDefinitions = self.getPanelsDefinition();
   for (var i = 0; i < panelDefinitions.length; i++) {
     if (panel instanceof panelDefinitions[i].panelClass) {
-      var liElement = $("li:has(a[href='#left_panel_tab_" + i + "'])", $(self.getElement()))[0];
+      var liElement = $("li:has(a[data='left_tab_" + i + "'])", $(self.getElement()))[0];
       if (liElement !== undefined) {
         liElement.style.display = "none";
       } else {
@@ -248,6 +248,8 @@ LeftPanel.prototype.addTab = function (params, tabData) {
     content: ""
   });
 
+  $(data.title).attr("data", "left_tab_" + this._panels.length);
+
   this._panels.push(new params.panelClass({
     element: data.content,
     customMap: self.getMap(),
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 9ccbc98e5b15e0b9f8d4a4a4e8fbc775c6d8f64e..6a5f9e5d47e7e78847d06badd4899f3a55596478 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -29,7 +29,7 @@ var TouchMap = require('./TouchMap');
 
 /**
  * Default constructor.
- * 
+ *
  * @param options
  *          CustomMapOptions object representing all parameters needed for map
  *          creation
@@ -76,12 +76,12 @@ CustomMap.prototype.constructor = CustomMap;
 /**
  * This code must be run after the object is created. It requires to download
  * some data via promises.
- * 
+ *
  * @return promise with empty result
  */
-CustomMap.prototype.init = function() {
+CustomMap.prototype.init = function () {
   var self = this;
-  return ServerConnector.getLogoImg().then(function(url) {
+  return ServerConnector.getLogoImg().then(function (url) {
     var logo2 = self.getControl(ControlType.LOGO_2_IMG);
     if (!/^(f|ht)tps?:\/\//i.test(url)) {
       url = GuiConnector.getImgPrefix() + url;
@@ -93,7 +93,7 @@ CustomMap.prototype.init = function() {
 /**
  * Create submaps.
  */
-CustomMap.prototype.createSubmaps = function() {
+CustomMap.prototype.createSubmaps = function () {
   this.submaps = [];
   for (var i = 0; i < this.getModel().getSubmodels().length; i++) {
     this.submaps.push(new Submap(this, this.getModel().getSubmodels()[i]));
@@ -103,7 +103,7 @@ CustomMap.prototype.createSubmaps = function() {
 /**
  * Creates logo and put it on the google map.
  */
-CustomMap.prototype.createLogo = function() {
+CustomMap.prototype.createLogo = function () {
   var logoControlDiv2 = document.createElement('DIV');
   var logo2 = document.createElement('IMG');
   logo2.style.cursor = 'pointer';
@@ -112,8 +112,8 @@ CustomMap.prototype.createLogo = function() {
   this.addControl(logo2);
 
   logoControlDiv2.appendChild(logo2);
-  google.maps.event.addDomListener(logo2, 'click', function() {
-    return ServerConnector.getLogoLink().then(function(url) {
+  google.maps.event.addDomListener(logo2, 'click', function () {
+    return ServerConnector.getLogoLink().then(function (url) {
       var win = window.open(url, '_blank');
       win.focus();
     });
@@ -131,7 +131,7 @@ CustomMap.prototype.createLogo = function() {
   this.addControl(logo);
 
   logoControlDiv.appendChild(logo);
-  google.maps.event.addDomListener(logo, 'click', function() {
+  google.maps.event.addDomListener(logo, 'click', function () {
     var win = window.open('http://wwwen.uni.lu/lcsb/', '_blank');
     win.focus();
   });
@@ -254,45 +254,47 @@ CustomMap.prototype.registerDbOverlay = function (dbOverlay) {
     POINT: []
   };
 
-  if (dbOverlay.getName() === "search" || dbOverlay.getName() === "user") {
-    dbOverlay.addListener("onSearch", function (e) {
-      return self.renderOverlayCollection({
-        overlayCollection: dbOverlay,
-        fitBounds: e.arg.fitBounds
+  if (dbOverlay.getName() !== undefined) {
+    if (dbOverlay.getName() === "search" || dbOverlay.getName().startsWith("plugin")) {
+      dbOverlay.addListener("onSearch", function (e) {
+        return self.renderOverlayCollection({
+          overlayCollection: dbOverlay,
+          fitBounds: e.arg.fitBounds
+        });
       });
-    });
-  }
-  if (dbOverlay.getName() === "drug" || dbOverlay.getName() === "chemical" || dbOverlay.getName() === "mirna") {
-    dbOverlay.addListener("onSearch", function (e) {
-      return self.renderOverlayCollection({
-        overlayCollection: dbOverlay,
-        fitBounds: e.arg.fitBounds
+    }
+    if (dbOverlay.getName() === "drug" || dbOverlay.getName() === "chemical" || dbOverlay.getName() === "mirna") {
+      dbOverlay.addListener("onSearch", function (e) {
+        return self.renderOverlayCollection({
+          overlayCollection: dbOverlay,
+          fitBounds: e.arg.fitBounds
+        });
       });
-    });
 
-    dbOverlay.addListener("onTargetVisibilityChange", function () {
-      return self.renderOverlayCollection({
-        overlayCollection: dbOverlay,
-        fitBounds: false
-      });
-    });
-  }
-  if (dbOverlay.getName() === "comment") {
-    var listener = function () {
-      return self.renderOverlayCollection({
-        overlayCollection: dbOverlay,
-        fitBounds: false
+      dbOverlay.addListener("onTargetVisibilityChange", function () {
+        return self.renderOverlayCollection({
+          overlayCollection: dbOverlay,
+          fitBounds: false
+        });
       });
-    };
-    dbOverlay.addListener("onRefresh", listener);
-    dbOverlay.addListener("onClear", listener);
+    }
+    if (dbOverlay.getName() === "comment") {
+      var listener = function () {
+        return self.renderOverlayCollection({
+          overlayCollection: dbOverlay,
+          fitBounds: false
+        });
+      };
+      dbOverlay.addListener("onRefresh", listener);
+      dbOverlay.addListener("onClear", listener);
+    }
   }
 
 };
 
 /**
  * Refresh comment list.
- * 
+ *
  * @return promise that is resolved when comment list is refreshed
  */
 CustomMap.prototype.refreshComments = function () {
@@ -697,10 +699,11 @@ CustomMap.prototype.renderOverlayCollection = function (params) {
   return overlayCollection.getIdentifiedElements().then(function (identifiedElements) {
     elements = identifiedElements;
 
-    return Promise.each(elements, function(element) {
+    return Promise.each(elements, function (element) {
       var icon = element.getIcon();
       if (icon !== null && icon !== undefined) {
         return self.createMarkerForDbOverlay(element, overlayCollection).then(function (marker) {
+
           markers.push(marker);
         });
       } else {
@@ -1266,7 +1269,7 @@ CustomMap.prototype.createMarkerForDbOverlay = function (element, dbOverlay) {
       return self._openInfoWindowForIdentifiedElement(element, result.getGoogleMarker());
     }, function () {
       return self.callListeners("onBioEntityClick", element);
-    },]
+    }]
   });
   return result.init().then(function () {
     dbOverlay.markers[element.getType()][element.getId()] = result;
diff --git a/frontend-js/src/main/js/map/CustomMapOptions.js b/frontend-js/src/main/js/map/CustomMapOptions.js
index e5a6997f593642d6e5237054ecf3e7003a922208..090246c7dd12b575327306ceff1993f5a82eecb3 100644
--- a/frontend-js/src/main/js/map/CustomMapOptions.js
+++ b/frontend-js/src/main/js/map/CustomMapOptions.js
@@ -49,44 +49,56 @@ function CustomMapOptions(params) {
   }
 
   this.setDebug(params.debug);
+  this.setPlugins(params.plugins);
+
 }
 
-CustomMapOptions.prototype.isMarkerOptimization = function() {
+CustomMapOptions.prototype.isMarkerOptimization = function () {
   return this._markerOptimization;
 };
 
-CustomMapOptions.prototype.isBigLogo = function() {
+CustomMapOptions.prototype.isBigLogo = function () {
   return this._bigLogo;
 };
-CustomMapOptions.prototype.isCustomTouchInterface = function() {
+CustomMapOptions.prototype.isCustomTouchInterface = function () {
   return this._customTouchInterface;
 };
 
-CustomMapOptions.prototype.getProject = function() {
+CustomMapOptions.prototype.getProject = function () {
   return this._project;
 };
-CustomMapOptions.prototype.setProject = function(project) {
+CustomMapOptions.prototype.setProject = function (project) {
   this._project = project;
 };
 
-CustomMapOptions.prototype.getConfiguration = function() {
+CustomMapOptions.prototype.getPlugins = function () {
+  return this._plugins;
+};
+CustomMapOptions.prototype.setPlugins = function (plugins) {
+  if (plugins === undefined) {
+    plugins = [];
+  }
+  this._plugins = plugins;
+};
+
+CustomMapOptions.prototype.getConfiguration = function () {
   return this._configuration;
 };
-CustomMapOptions.prototype.setConfiguration = function(configuration) {
+CustomMapOptions.prototype.setConfiguration = function (configuration) {
   this._configuration = configuration;
 };
 
-CustomMapOptions.prototype.getProjectId = function() {
+CustomMapOptions.prototype.getProjectId = function () {
   if (this.getProject() !== undefined) {
     return this.getProject().getProjectId();
   } else {
     return this._projectId;
   }
 };
-CustomMapOptions.prototype.setProjectId = function(projectId) {
+CustomMapOptions.prototype.setProjectId = function (projectId) {
   this._projectId = projectId;
 };
-CustomMapOptions.prototype.setDebug = function(debug) {
+CustomMapOptions.prototype.setDebug = function (debug) {
   if (debug !== undefined) {
     if (typeof debug !== "boolean") {
       logger.warn("Params must be boolean");
@@ -95,18 +107,18 @@ CustomMapOptions.prototype.setDebug = function(debug) {
   }
 };
 
-CustomMapOptions.prototype.setCustomTouchInterface = function(customTouchInterface) {
+CustomMapOptions.prototype.setCustomTouchInterface = function (customTouchInterface) {
   this._customTouchInterface = customTouchInterface;
 };
 
-CustomMapOptions.prototype.isDebug = function() {
+CustomMapOptions.prototype.isDebug = function () {
   return this._debug === true;
 };
 
-CustomMapOptions.prototype.setElement = function(element) {
+CustomMapOptions.prototype.setElement = function (element) {
   this._element = element;
 };
-CustomMapOptions.prototype.getElement = function() {
+CustomMapOptions.prototype.getElement = function () {
   return this._element;
 };
 
diff --git a/frontend-js/src/main/js/map/data/Alias.js b/frontend-js/src/main/js/map/data/Alias.js
index d785c3dc6b5ee87114f25bd0dc8f2a95d7fea458..a813a5ba24c25ec4300d1ea8d1a5aeabb71fba5f 100644
--- a/frontend-js/src/main/js/map/data/Alias.js
+++ b/frontend-js/src/main/js/map/data/Alias.js
@@ -2,9 +2,11 @@
 
 var BioEntity = require("./BioEntity");
 
+var logger = require('../../logger');
+
 /**
  * Class representing alias data.
- * 
+ *
  * @param javaObject
  *          object de-serialized ajax query to the server side
  */
@@ -40,11 +42,11 @@ Alias.prototype.constructor = Alias;
 /**
  * Updates alias with full data information. This function should be called when
  * full information about alias is retrieved from server.
- * 
+ *
  * @param javaObject
  *          object representing data from server side
  */
-Alias.prototype.update = function(javaObject) {
+Alias.prototype.update = function (javaObject) {
   if (javaObject instanceof Alias) {
     if (javaObject.getName() === undefined) {
       return;
@@ -66,6 +68,12 @@ Alias.prototype.update = function(javaObject) {
     this.setComplexId(javaObject.getComplexId());
     this.setLinkedSubmodelId(javaObject.getLinkedSubmodelId());
     this.setCompartmentId(javaObject.getCompartmentId());
+    this.setDescription(javaObject.getDescription());
+
+    this.setX(javaObject.getX());
+    this.setY(javaObject.getY());
+    this.setWidth(javaObject.getWidth());
+    this.setHeight(javaObject.getHeight());
     this.setIsComplete(true);
   } else {
     if (javaObject.name === undefined) {
@@ -88,95 +96,111 @@ Alias.prototype.update = function(javaObject) {
     this.setComplexId(javaObject.complexId);
     this.setLinkedSubmodelId(javaObject.linkedSubmodel);
     this.setCompartmentId(javaObject.compartmentId);
+
+
+    if (javaObject.bounds !== undefined) {
+      this.setX(javaObject.bounds.x);
+      this.setY(javaObject.bounds.y);
+      this.setWidth(javaObject.bounds.width);
+      this.setHeight(javaObject.bounds.height);
+    }
     this.setIsComplete(true);
   }
 };
 
-Alias.prototype.getCharge = function() {
+Alias.prototype.getCharge = function () {
   return this.charge;
 };
 
-Alias.prototype.setCharge = function(charge) {
+Alias.prototype.setCharge = function (charge) {
   this.charge = charge;
 };
 
-Alias.prototype.getFormerSymbols = function() {
+Alias.prototype.getFormerSymbols = function () {
   return this.formerSymbols;
 };
 
-Alias.prototype.setFormerSymbols = function(formerSymbols) {
+Alias.prototype.setFormerSymbols = function (formerSymbols) {
   this.formerSymbols = formerSymbols;
 };
 
-Alias.prototype.getX = function() {
+Alias.prototype.getX = function () {
   return this.x;
 };
 
-Alias.prototype.setX = function(x) {
-  this.x = x;
+Alias.prototype.setX = function (x) {
+  if (x !== undefined) {
+    this.x = x;
+  }
 };
 
-Alias.prototype.setY = function(y) {
-  this.y = y;
+Alias.prototype.setY = function (y) {
+  if (y !== undefined) {
+    this.y = y;
+  }
 };
 
-Alias.prototype.getY = function() {
+Alias.prototype.getY = function () {
   return this.y;
 };
 
-Alias.prototype.setElementId = function(elementId) {
+Alias.prototype.setElementId = function (elementId) {
   this._elementId = elementId;
 };
 
-Alias.prototype.getElementId = function() {
+Alias.prototype.getElementId = function () {
   return this._elementId;
 };
 
-Alias.prototype.setWidth = function(width) {
-  this.width = width;
+Alias.prototype.setWidth = function (width) {
+  if (width !== undefined) {
+    this.width = width;
+  }
 };
 
-Alias.prototype.setHeight = function(height) {
-  this.height = height;
+Alias.prototype.setHeight = function (height) {
+  if (height !== undefined) {
+    this.height = height;
+  }
 };
-Alias.prototype.getWidth = function() {
+Alias.prototype.getWidth = function () {
   return this.width;
 };
 
-Alias.prototype.getHeight = function() {
+Alias.prototype.getHeight = function () {
   return this.height;
 };
 
-Alias.prototype.getName = function() {
+Alias.prototype.getName = function () {
   return this.name;
 };
 
-Alias.prototype.setName = function(name) {
+Alias.prototype.setName = function (name) {
   this.name = name;
 };
 
-Alias.prototype.getFullName = function() {
+Alias.prototype.getFullName = function () {
   return this.fullName;
 };
 
-Alias.prototype.setFullName = function(fullName) {
+Alias.prototype.setFullName = function (fullName) {
   this.fullName = fullName;
 };
 
-Alias.prototype.getCompartmentId = function() {
+Alias.prototype.getCompartmentId = function () {
   return this._compartmentId;
 };
 
-Alias.prototype.setCompartmentId = function(compartmentId) {
+Alias.prototype.setCompartmentId = function (compartmentId) {
   if (compartmentId !== null) {
     this._compartmentId = compartmentId;
   }
 };
-Alias.prototype.getComplexId = function() {
+Alias.prototype.getComplexId = function () {
   return this._complexId;
 };
 
-Alias.prototype.setComplexId = function(complexId) {
+Alias.prototype.setComplexId = function (complexId) {
   if (complexId !== null) {
     this._complexId = complexId;
   }
diff --git a/frontend-js/src/main/js/map/data/Annotator.js b/frontend-js/src/main/js/map/data/Annotator.js
index e7cf07f4db736568d2f445918a5643d125d0ccfe..9b821d8e3899a86552c914e0216959afc8dc5578 100644
--- a/frontend-js/src/main/js/map/data/Annotator.js
+++ b/frontend-js/src/main/js/map/data/Annotator.js
@@ -8,10 +8,17 @@ var logger = require('../../logger');
 
 function Annotator(javaObject, configuration) {
   var self = this;
-  self.setClassName(javaObject.className);
-  self.setElementTypes(javaObject.elementClassNames, configuration);
-  self.setName(javaObject.name);
-  self.setUrl(javaObject.url);
+  if (javaObject instanceof Annotator) {
+    self.setClassName(javaObject.getClassName());
+    this._elementTypes = javaObject.getElementTypes();
+    self.setName(javaObject.getName());
+    self.setUrl(javaObject.getUrl());
+  } else {
+    self.setClassName(javaObject.className);
+    self.setElementTypes(javaObject.elementClassNames, configuration);
+    self.setName(javaObject.name);
+    self.setUrl(javaObject.url);
+  }
 }
 
 Annotator.prototype.setClassName = function (className) {
diff --git a/frontend-js/src/main/js/map/marker/AliasMarker.js b/frontend-js/src/main/js/map/marker/AliasMarker.js
index 7fb256fde07527a0391f11b4817072738f190d4b..2b6c66c608c0770241c06a2e7d822462e787033b 100644
--- a/frontend-js/src/main/js/map/marker/AliasMarker.js
+++ b/frontend-js/src/main/js/map/marker/AliasMarker.js
@@ -2,6 +2,8 @@
 
 var AbstractMarker = require('./AbstractMarker');
 
+var logger = require('../../logger');
+
 /**
  * This class describes Google maps marker (connected to {@link Alias}) that is
  * visualized on the map.
@@ -9,45 +11,46 @@ var AbstractMarker = require('./AbstractMarker');
 function AliasMarker(params) {
   AbstractMarker.call(this, params);
 }
+
 AliasMarker.prototype = Object.create(AbstractMarker.prototype);
 AliasMarker.prototype.constructor = AliasMarker;
 
 /**
  * Returns {@link Alias} data for this marker.
- * 
+ *
  * @returns {@link Alias} data for this marker
  */
-AliasMarker.prototype.getAliasData = function() {
+AliasMarker.prototype.getAliasData = function () {
   return this._aliasData;
 };
 
 /**
  * Sets {@link Alias} data for this marker.
- * 
+ *
  * @param data
  *          {@link Alias} data for this marker
  */
-AliasMarker.prototype.setAliasData = function(data) {
+AliasMarker.prototype.setAliasData = function (data) {
   this._aliasData = data;
 };
 
 /**
  * Returns coordinates where marker is pointing.
- * 
+ *
  * @returns {google.maps.Point} - coordinates where marker is pointing
  */
-AliasMarker.prototype.getCoordinates = function() {
+AliasMarker.prototype.getCoordinates = function () {
   return new google.maps.Point(this._aliasData.x + this._aliasData.width / 2, this._aliasData.y
-      + this._aliasData.height / 2);
+    + this._aliasData.height / 2);
 };
 
-AliasMarker.prototype.init = function() {
+AliasMarker.prototype.init = function () {
   var self = this;
   var model = self.getCustomMap().getModel();
-  return model.getByIdentifiedElement(self.getIdentifiedElement()).then(function(aliasData) {
+  return model.getByIdentifiedElement(self.getIdentifiedElement()).then(function (aliasData) {
     self.setAliasData(aliasData);
     return self._init();
-  }).then(function() {
+  }).then(function () {
     self.show();
   });
 };
diff --git a/frontend-js/src/main/js/map/overlay/DbOverlayCollection.js b/frontend-js/src/main/js/map/overlay/DbOverlayCollection.js
index 0780b6585cbf95cc6d39627b17b18ea237a90a22..5b1111971cc110275a58cfb8fec574b930032ce7 100644
--- a/frontend-js/src/main/js/map/overlay/DbOverlayCollection.js
+++ b/frontend-js/src/main/js/map/overlay/DbOverlayCollection.js
@@ -10,7 +10,6 @@ var CommentDbOverlay = require('./CommentDbOverlay');
 var DrugDbOverlay = require('./DrugDbOverlay');
 var MiRnaDbOverlay = require('./MiRnaDbOverlay');
 var SearchDbOverlay = require('./SearchDbOverlay');
-var UserDbOverlay = require('./UserDbOverlay');
 
 function DbOverlayCollection(params) {
   // call super constructor
@@ -20,8 +19,6 @@ function DbOverlayCollection(params) {
 
   var dataCollections = [ {
     name : "search"
-  }, {
-    name : "user"
   }, {
     name : "drug",
     allowSearchById : true,
@@ -50,8 +47,6 @@ function DbOverlayCollection(params) {
       collection = new CommentDbOverlay(collectionParams);
     } else if (collectionParams.name === "search") {
       collection = new SearchDbOverlay(collectionParams);
-    } else if (collectionParams.name === "user") {
-      collection = new UserDbOverlay(collectionParams);
     } else if (collectionParams.name === "drug") {
       collection = new DrugDbOverlay(collectionParams);
     } else if (collectionParams.name === "mirna") {
diff --git a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js
index af871760aefdfc74c55e7a2a2abe025787e57224..c78b6c3aace33c669d1b13fe59ac779fceb186f3 100644
--- a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js
+++ b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js
@@ -18,21 +18,21 @@ function UserDbOverlay(params) {
   AbstractDbOverlay.call(this, params);
 
   this._markerIdentifiedElements = {
-    ALIAS : [],
-    REACTION : [],
-    POINT : []
+    ALIAS: [],
+    REACTION: [],
+    POINT: []
   };
   this._surfaceIdentifiedElements = {
-    ALIAS : [],
-    REACTION : [],
-    POINT : []
+    ALIAS: [],
+    REACTION: [],
+    POINT: []
   };
 }
 
 UserDbOverlay.prototype = Object.create(AbstractDbOverlay.prototype);
 UserDbOverlay.prototype.constructor = UserDbOverlay;
 
-UserDbOverlay.prototype.getDetailDataByIdentifiedElement = function(element) {
+UserDbOverlay.prototype.getDetailDataByIdentifiedElement = function (element) {
   if (element.getType() === "POINT") {
     return Promise.resolve(null);
   }
@@ -40,7 +40,7 @@ UserDbOverlay.prototype.getDetailDataByIdentifiedElement = function(element) {
   return model.getByIdentifiedElement(element, true);
 };
 
-UserDbOverlay.prototype._createIdentifiedElements = function(params, sourceArray, mustBeUndefined) {
+UserDbOverlay.prototype._createIdentifiedElements = function (params, sourceArray, mustBeUndefined) {
   var self = this;
   var result = [];
   var promises = [];
@@ -48,7 +48,9 @@ UserDbOverlay.prototype._createIdentifiedElements = function(params, sourceArray
   for (var i = 0; i < params.length; i++) {
     var singleElementParam = params[i];
     var element = new IdentifiedElement(singleElementParam.element);
-    element.setIcon(singleElementParam.icon);
+    if (singleElementParam.icon !== undefined) {
+      element.setIcon(singleElementParam.icon);
+    }
     if (singleElementParam.options !== undefined) {
       element.setColor(singleElementParam.options.color);
       element.setOpacity(singleElementParam.options.opacity);
@@ -69,7 +71,7 @@ UserDbOverlay.prototype._createIdentifiedElements = function(params, sourceArray
     }
     promises.push(submap.getModel().getByIdentifiedElement(element));
   }
-  return Promise.all(promises).then(function(elementsFromModel) {
+  return Promise.all(promises).then(function (elementsFromModel) {
     for (var i = 0; i < elementsFromModel.length; i++) {
       if (elementsFromModel[i] === undefined || elementsFromModel[i] === null) {
         return Promise.reject(new InvalidArgumentError("Element doesn't exist: " + result[i].getId()));
@@ -79,118 +81,118 @@ UserDbOverlay.prototype._createIdentifiedElements = function(params, sourceArray
   });
 };
 
-UserDbOverlay.prototype.addMarker = function(params) {
+UserDbOverlay.prototype.addMarker = function (params) {
   var self = this;
   self.disableAddRemoveElements();
 
   if (params.length === undefined) {
-    params = [ params ];
+    params = [params];
   }
-  return self._createIdentifiedElements(params, self._markerIdentifiedElements, true).then(function(elements) {
+  return self._createIdentifiedElements(params, self._markerIdentifiedElements, true).then(function (elements) {
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
       self._markerIdentifiedElements[element.getType()][element.getId()] = element;
     }
     return self.getIdentifiedElements();
-  }).then(function(elements) {
+  }).then(function (elements) {
     self.enableAddRemoveElements();
     return self.callListeners("onSearch", {
-      fitBounds : false,
-      identifiedElements : elements,
+      fitBounds: false,
+      identifiedElements: elements
     });
-  }).then(null, function(error) {
+  }).then(null, function (error) {
     self.enableAddRemoveElements();
     return Promise.reject(error);
   });
 };
 
-UserDbOverlay.prototype.addSurface = function(params) {
+UserDbOverlay.prototype.addSurface = function (params) {
   var self = this;
   self.disableAddRemoveElements();
 
   if (params.length === undefined) {
-    params = [ params ];
+    params = [params];
   }
 
-  return self._createIdentifiedElements(params, self._surfaceIdentifiedElements, true).then(function(elements) {
+  return self._createIdentifiedElements(params, self._surfaceIdentifiedElements, true).then(function (elements) {
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
       self._surfaceIdentifiedElements[element.getType()][element.getId()] = element;
     }
     return self.getIdentifiedElements();
-  }).then(function(elements) {
+  }).then(function (elements) {
     self.enableAddRemoveElements();
     return self.callListeners("onSearch", {
-      fitBounds : false,
-      identifiedElements : elements,
+      fitBounds: false,
+      identifiedElements: elements,
     });
-  }).then(null, function(error) {
+  }).then(null, function (error) {
     self.enableAddRemoveElements();
     return Promise.reject(error);
   });
 };
 
-UserDbOverlay.prototype.removeMarker = function(params) {
+UserDbOverlay.prototype.removeMarker = function (params) {
   var self = this;
   self.disableAddRemoveElements();
 
   if (params.length === undefined) {
-    params = [ params ];
+    params = [params];
   }
 
-  return self._createIdentifiedElements(params, self._markerIdentifiedElements, false).then(function(elements) {
+  return self._createIdentifiedElements(params, self._markerIdentifiedElements, false).then(function (elements) {
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
       self._markerIdentifiedElements[element.getType()][element.getId()] = undefined;
       delete self._markerIdentifiedElements[element.getType()][element.getId()];
     }
     return self.getIdentifiedElements();
-  }).then(function(elements) {
+  }).then(function (elements) {
     self.enableAddRemoveElements();
     return self.callListeners("onSearch", {
-      fitBounds : false,
-      identifiedElements : elements,
+      fitBounds: false,
+      identifiedElements: elements,
     });
-  }).then(null, function(error) {
+  }).then(null, function (error) {
     self.enableAddRemoveElements();
     return Promise.reject(error);
   });
 };
 
-UserDbOverlay.prototype.removeSurface = function(params) {
+UserDbOverlay.prototype.removeSurface = function (params) {
   var self = this;
   self.disableAddRemoveElements();
 
   if (params.length === undefined) {
-    params = [ params ];
+    params = [params];
   }
-  return self._createIdentifiedElements(params, self._surfaceIdentifiedElements, false).then(function(elements) {
+  return self._createIdentifiedElements(params, self._surfaceIdentifiedElements, false).then(function (elements) {
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
       self._surfaceIdentifiedElements[element.getType()][element.getId()] = undefined;
       delete self._surfaceIdentifiedElements[element.getType()][element.getId()];
     }
     return self.getIdentifiedElements();
-  }).then(function(elements) {
+  }).then(function (elements) {
     self.enableAddRemoveElements();
     return self.callListeners("onSearch", {
-      fitBounds : false,
-      identifiedElements : elements,
+      fitBounds: false,
+      identifiedElements: elements,
     });
-  }).then(null, function(error) {
+  }).then(null, function (error) {
     self.enableAddRemoveElements();
     return Promise.reject(error);
   });
 };
 
-UserDbOverlay.prototype.disableAddRemoveElements = function() {
+UserDbOverlay.prototype.disableAddRemoveElements = function () {
   if (this._addRemoveElementsDisabled) {
     throw new Error("wait until previous Promise for showBioEntity/hideBioEntity is resolved");
   } else {
     this._addRemoveElementsDisabled = true;
   }
 };
-UserDbOverlay.prototype.enableAddRemoveElements = function() {
+UserDbOverlay.prototype.enableAddRemoveElements = function () {
   if (this._addRemoveElementsDisabled) {
     this._addRemoveElementsDisabled = false;
   } else {
@@ -198,7 +200,7 @@ UserDbOverlay.prototype.enableAddRemoveElements = function() {
   }
 };
 
-UserDbOverlay.prototype.getIdentifiedElements = function() {
+UserDbOverlay.prototype.getIdentifiedElements = function () {
   var result = [];
   var markerType, key, markers;
   for (markerType in this._markerIdentifiedElements) {
@@ -230,16 +232,16 @@ UserDbOverlay.prototype.getIdentifiedElements = function() {
   return Promise.resolve(result);
 };
 
-UserDbOverlay.prototype.clear = function() {
+UserDbOverlay.prototype.clear = function () {
   var self = this;
   self._markerIdentifiedElements = {
-    ALIAS : [],
-    REACTION : [],
-    POINT : []
+    ALIAS: [],
+    REACTION: [],
+    POINT: []
   };
   return self.callListeners("onSearch", {
-    fitBounds : false,
-    identifiedElements : [],
+    fitBounds: false,
+    identifiedElements: [],
   });
 };
 
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index fa515ec945176bdf6eb100ea0a3b7711d09d8383..82321956aa4f51b53ff7f933974532a10c318d92 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -2,8 +2,6 @@
 
 var functions = require('./Functions');
 
-var IdentifiedElement = require('./map/data/IdentifiedElement');
-
 var AbstractDbOverlay = require('./map/overlay/AbstractDbOverlay');
 var Admin = require('./Admin');
 var DbOverlayCollection = require('./map/overlay/DbOverlayCollection');
@@ -60,45 +58,44 @@ function processUrlGetParams(params) {
 }
 
 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 Promise.resolve();
+    } 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 Promise.resolve();
+    }
+  });
 }
 
 function createDivStructure(element) {
   var leftPanelDiv = functions.createElement({
     type: "div",
     name: "leftPanelDiv",
-    className: "minerva-left-panel",
+    className: "minerva-left-panel"
   });
   element.appendChild(leftPanelDiv);
   var middlePanelDiv = functions.createElement({
     type: "div",
-    style: "display: table-cell;height:100%;width:100%;",
+    style: "display: table-cell;height:100%;width:100%;"
   });
   element.appendChild(middlePanelDiv);
 
   var rightPanelContainerDiv = functions.createElement({
     type: "div",
-    style: "height:100%;width:100%;position:relative",
+    style: "height:100%;width:100%;position:relative"
   });
   middlePanelDiv.appendChild(rightPanelContainerDiv);
 
@@ -112,14 +109,14 @@ function createDivStructure(element) {
   var menuDiv = functions.createElement({
     type: "div",
     name: "menuDiv",
-    className: "menuBelt",
+    className: "menuBelt"
   });
   rightPanelContainerDiv.appendChild(menuDiv);
 
   var mapDiv = functions.createElement({
     type: "div",
     name: "mapDiv",
-    className: "mapClass",
+    className: "mapClass"
   });
   rightPanelContainerDiv.appendChild(mapDiv);
 
@@ -127,317 +124,22 @@ function createDivStructure(element) {
     type: "div",
     name: "legendDiv",
     className: "minerva-legend",
-    style: "display:none",
+    style: "display:none"
   });
   rightPanelContainerDiv.appendChild(legendDiv);
 
   var contextMenu = functions.createElement({
     type: "ul",
-    name: "contextMenu",
+    name: "contextMenu"
   });
   element.appendChild(contextMenu);
   var selectionContextMenu = functions.createElement({
     type: "ul",
-    name: "selectionContextMenu",
+    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;
-  });
-}
-
-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() + ", ";
-      }
-    }
-    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);
-    }
-  }
-  return markerElements;
-}
-
-function getElements(elementIdentifiers, customMap) {
-  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));
-    }
-  }
-  // 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);
-    }
-  }
-
-  // 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]);
-    }
-    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) {
-        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 = [];
-      var i;
-      for (i = 0; i < customMap.getModel().getSubmodels().length; i++) {
-        models.push(customMap.getModel().getSubmodels()[i]);
-      }
-      var promises = [];
-      for (i = 0; i < models.length; i++) {
-        promises.push(models[i].getAliases({
-          type: customMap.getConfiguration().getSimpleElementTypeNames(),
-          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.ServerConnector === undefined) {
@@ -600,7 +302,23 @@ function create(params) {
       return customMap.openSubmap(submapId);
     }
   }).then(function () {
-    var result = createResult(customMap);
+    var promises = [];
+    for (var i = 0; i < params.getPlugins().length; i++) {
+      promises.push(leftPanel.getPluginManager().addPlugin(params.getPlugins()[i]))
+    }
+    return Promise.all(promises);
+  }).then(function () {
+    var result = {
+      destroy: function () {
+        return leftPanel.destroy().then(function () {
+          customMap.destroy();
+          return topMenu.destroy();
+        });
+      },
+      getProject: function () {
+        return customMap.getProject();
+      }
+    };
 
     if (params.isDebug()) {
       result.leftPanel = leftPanel;
@@ -669,7 +387,7 @@ var minerva = {
   createAdmin: createAdmin,
   ServerConnector: OriginalServerConnector,
   GuiConnector: GuiConnector,
-  DualListbox: require('dual-listbox').DualListbox,
+  DualListbox: require('dual-listbox').DualListbox
 };
 
 module.exports = minerva;
diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
index 0ea647889c7eb2df4a144fda49aff7e1ab0b6aec..ebe1fe64980963f0d7894433ad28c3b5910e7e93 100644
--- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
+++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
@@ -1,6 +1,9 @@
 "use strict";
 
+var IdentifiedElement = require('../map/data/IdentifiedElement');
 var ObjectWithListeners = require('../ObjectWithListeners');
+var UserDbOverlay = require('../map/overlay/UserDbOverlay');
+var Configuration = require('../Configuration');
 
 var Promise = require("bluebird");
 
@@ -9,12 +12,333 @@ var Functions = require('../Functions');
 
 var id = 0;
 
+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() + ", ";
+      }
+    }
+    throw new Error("Invalid DbOverlay: " + dbOverlayName + ". Valid DbOverlays: " + validOverlays);
+  } else {
+    return dbOverlay;
+  }
+}
+
+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;
+  });
+}
+
+function getElements(elementIdentifiers, customMap) {
+  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));
+    }
+  }
+  // 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 createProjectData(options) {
+  var map = options.map;
+  return {
+    getBioEntityById: function (param) {
+      var isArray = true;
+      if (param.length === undefined) {
+        param = [param];
+        isArray = false;
+      }
+      return getElements(param, map).then(function (result) {
+        if (!isArray) {
+          return result[0];
+        } else {
+          return result;
+        }
+      });
+    },
+    getAllBioEntities: function () {
+      var models = [map.getModel()];
+      var result = [];
+      var i;
+      for (i = 0; i < map.getModel().getSubmodels().length; i++) {
+        models.push(map.getModel().getSubmodels()[i]);
+      }
+      var promises = [];
+      for (i = 0; i < models.length; i++) {
+        promises.push(models[i].getAliases({
+          type: map.getConfiguration().getSimpleElementTypeNames(),
+          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, map);
+    }
+  };
+}
+
+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);
+    }
+  }
+
+  // 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]);
+    }
+    return result;
+  });
+}
+
+
+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);
+    }
+  }
+  return markerElements;
+}
+
+function createProjectMap(options) {
+  var map = options.map;
+  var pluginId = options.pluginId;
+
+  map.registerDbOverlay(new UserDbOverlay({name: pluginId, map: map}));
+
+  return {
+    getVisibleDataOverlays: function () {
+      return map.getVisibleDataOverlays();
+    },
+    addListener: function (param) {
+      var dbOverlay = getOverlayByName(map, param.dbOverlayName);
+      dbOverlay.addListener(param.type, function (e) {
+        return getFullElements(map, e.arg.identifiedElements).then(function (result) {
+          return param.callback(result);
+        });
+      });
+    },
+    getHighlightedBioEntities: function (dbOverlayName) {
+      if (dbOverlayName === undefined) {
+        dbOverlayName = pluginId;
+      }
+      var dbOverlay = getOverlayByName(map, dbOverlayName);
+      var identifiedElements;
+      return dbOverlay.getIdentifiedElements().then(function (result) {
+        identifiedElements = result;
+        return getFullElements(map, 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;
+      });
+    },
+    showBioEntity: function (params) {
+      var iconElements = createMarkerElements({
+        params: params,
+        filteredType: "ICON",
+        isDefault: true
+      });
+      var surfaceElements = createMarkerElements({
+        params: params,
+        filteredType: "SURFACE",
+        isDefault: false
+      });
+      var promise = Promise.resolve();
+      if (iconElements.length > 0) {
+        promise = map.getOverlayByName(pluginId).addMarker(iconElements);
+      }
+      return promise.then(function () {
+        if (surfaceElements.length > 0) {
+          return map.getOverlayByName(pluginId).addSurface(surfaceElements);
+        } else {
+          return Promise.resolve();
+        }
+      });
+    },
+    hideBioEntity: function (params) {
+      var iconElements = createMarkerElements({
+        params: params,
+        filteredType: "ICON",
+        isDefault: true
+      });
+      var surfaceElements = createMarkerElements({
+        params: params,
+        filteredType: "SURFACE",
+        isDefault: false
+      });
+      return map.getOverlayByName(pluginId).removeMarker(iconElements).then(function () {
+        return map.getOverlayByName(pluginId).removeSurface(surfaceElements);
+      });
+    },
+    setCenter: function (params) {
+      var submap = map.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 = map.getSubmapById(params.modelId);
+      if (submap === null) {
+        throw new Error("Unknown modelId: " + params.modelId);
+      }
+      return submap.setZoom(params.zoom);
+    }
+  }
+}
+
 function createProject(options) {
-  return {};
+  return {
+    data: createProjectData(options),
+    map: createProjectMap(options)
+  };
 }
 
 function createConfiguration(options) {
-  return {};
+  var configuration = new Configuration(options.configuration);
+  return {
+    options: configuration.getOptions(),
+    overlayTypes: configuration.getOverlayTypes(),
+    imageConverters: configuration.getImageConverters(),
+    modelConverters: configuration.getModelConverters(),
+    elementTypes: configuration.getElementTypes(),
+    reactionTypes: configuration.getReactionTypes(),
+    miriamTypes: configuration.getMiriamTypes(),
+    mapTypes: configuration.getMapTypes(),
+    modificationStateTypes: configuration.getModificationStateTypes(),
+    privilegeTypes: configuration.getPrivilegeTypes(),
+    annotators: configuration.getAnnotators()
+  };
 }
 
 function MinervaPluginProxy(options) {
diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js
index a0652a669739af66f342c0b76fe1834e47921078..8bc1f7f2c3a62c3703f963574a4005e4c63ebee7 100644
--- a/frontend-js/src/main/js/plugin/Plugin.js
+++ b/frontend-js/src/main/js/plugin/Plugin.js
@@ -64,6 +64,8 @@ Plugin.prototype.load = function () {
 
         var minervaPluginProxy = new MinervaPluginProxy({
           map: options.map,
+          configuration: options.configuration,
+          element: options.element,
           pluginId: "plugin" + (pluginId++)
         });
         self.setLoadedPluginData(pluginData);
diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js
index 076bb0679230a1fd63b5c2a5b10457f6e39c5b85..631daa46732ded4e52c15efe1fbdf77d4ada1ddf 100644
--- a/frontend-js/src/main/js/plugin/PluginManager.js
+++ b/frontend-js/src/main/js/plugin/PluginManager.js
@@ -54,12 +54,22 @@ PluginManager.prototype.getPlugins = function () {
 PluginManager.prototype.addPlugin = function (options) {
   var self = this;
   var tabData = self.createTabForPlugin();
-  var plugin = new Plugin({
-    url: options.url,
-    element: tabData.content,
-    configuration: self.getConfiguration(),
-    map: self.getMap()
-  });
+  var plugin;
+  if (options instanceof Plugin) {
+    plugin = options;
+    plugin.setOptions({
+      element: tabData.content,
+      configuration: self.getConfiguration(),
+      map: self.getMap()
+    });
+  } else {
+    plugin = new Plugin({
+      url: options.url,
+      element: tabData.content,
+      configuration: self.getConfiguration(),
+      map: self.getMap()
+    });
+  }
   self._plugins.push(plugin);
   return plugin.load().then(function () {
     tabData.title.innerHTML = plugin.getName();
diff --git a/frontend-js/src/test/js/Configuration-test.js b/frontend-js/src/test/js/Configuration-test.js
index fbd8280b294f9e763ad78448008af5e73efe025e..2a8afc46006870b45d07c24ef825601127b858c4 100644
--- a/frontend-js/src/test/js/Configuration-test.js
+++ b/frontend-js/src/test/js/Configuration-test.js
@@ -12,22 +12,33 @@ var logger = require('./logger');
 var assert = require('assert');
 
 describe('Configuration', function () {
-  it('constructor', function () {
-    var configuration = new Configuration({
-      options: {},
-      overlayTypes: {},
-      imageFormats: {},
-      modelFormats: {},
-      elementTypes: {},
-      reactionTypes: {},
-      miriamTypes: {},
-      mapTypes: {},
-      modificationStateTypes: {},
-      privilegeTypes: {},
-      annotators: {}
+  describe('constructor', function () {
+    it('default', function () {
+      var configuration = new Configuration({
+        options: {},
+        overlayTypes: {},
+        imageFormats: {},
+        modelFormats: {},
+        elementTypes: {},
+        reactionTypes: {},
+        miriamTypes: {},
+        mapTypes: {},
+        modificationStateTypes: {},
+        privilegeTypes: {},
+        annotators: {}
+      });
+      assert.ok(configuration);
+      assert.equal(0, logger.getWarnings().length);
+    });
+    it('copy', function () {
+      return ServerConnector.getConfiguration().then(function (configuration) {
+        logger.debug(configuration.getOption(ConfigurationType.LEGEND_FILES));
+        var copy = new Configuration(configuration);
+        logger.debug(copy.getOption(ConfigurationType.LEGEND_FILES));
+
+        assert.equal(configuration.getElementTypes().length, copy.getElementTypes().length)
+      });
     });
-    assert.ok(configuration);
-    assert.equal(0, logger.getWarnings().length);
   });
 
   describe('getParentType', function () {
diff --git a/frontend-js/src/test/js/map/data/MapModel-test.js b/frontend-js/src/test/js/map/data/MapModel-test.js
index 8a69ce7909bcdb0f4258fe927bb3059a5bdfab90..267e598a481881805dfd6bb0ae5f51010faa8658 100644
--- a/frontend-js/src/test/js/map/data/MapModel-test.js
+++ b/frontend-js/src/test/js/map/data/MapModel-test.js
@@ -1,5 +1,7 @@
 "use strict";
 
+require("../../mocha-config.js");
+
 var IdentifiedElement = require('../../../../main/js/map/data/IdentifiedElement');
 var LayoutData = require('../../../../main/js/map/data/LayoutData');
 var MapModel = require('../../../../main/js/map/data/MapModel');
diff --git a/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js b/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js
index ec99abe76743e1a75947a58e16aa8635e93e8353..4a89b3d057a239868395ee6b9871bd49431fcc9a 100644
--- a/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js
+++ b/frontend-js/src/test/js/map/overlay/UserDbOverlay-test.js
@@ -1,6 +1,7 @@
 "use strict";
 
 var logger = require('../../logger');
+require("../../mocha-config");
 
 var CustomMap = require('../../../../main/js/map//CustomMap');
 var InvalidArgumentError = require('../../../../main/js/InvalidArgumentError');
diff --git a/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js b/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js
index 190e315a162473236eb95b89c2efaf9c2d399a07..fda6cba7e906ee73638c3317a55294ca654c840a 100644
--- a/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js
+++ b/frontend-js/src/test/js/map/window/AliasInfoWindow-test.js
@@ -208,6 +208,7 @@ describe('AliasInfoWindow', function () {
       return win.init();
     }).then(function () {
       win.layoutAliases = [layoutAlias];
+      win.layoutNames = ["xxx"];
       return win.createGenomicDiv();
     }).then(function (div) {
       assert.ok(div);
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index fb1152a76f8bc55fadca05d49e3a12a0e700b2ed..f08fc415327a52465d3215757227d6db33e6ae25 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -2,9 +2,9 @@
 
 require("./mocha-config");
 
-var Alias = require('../../main/js/map/data/Alias');
 var minerva = require('../../main/js/minerva');
 var ServerConnectorMock = require('./ServerConnector-mock');
+var ProxyAccessPlugin = require('./plugin/ProxyAccessPlugin');
 
 var chai = require('chai');
 var assert = chai.assert;
@@ -35,7 +35,7 @@ describe('minerva global', function () {
     it('invalid projectId', function () {
       var options = {
         projectId: "unknownId",
-        element: testDiv,
+        element: testDiv
       };
       return minerva.create(options).then(function () {
         assert.ok(false);
@@ -77,39 +77,55 @@ describe('minerva global', function () {
     });
   });
 
-  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 () {
-      var sessionData = ServerConnectorMock.getSessionData(options.getProject());
-      assert.equal(sessionData.getZoomLevel(options.getProject().getModel()), 5);
+  describe("constructor", function () {
+
+    it("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("constructor with GET coordinates 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("with GET coordinates 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("simple", function () {
+      var options = {
+        projectId: "sample",
+        element: testDiv
+      };
+      return minerva.create(options).then(function (result) {
+        assert.ok(result);
+        result.destroy();
+      });
     });
   });
 
   it('create with layout', function () {
-    var layout;
-    var project;
+    var layout, project, plugin;
     return ServerConnectorMock.getProject().then(function (result) {
       project = result;
       var options = helper.createCustomMapOptions(project);
 
+      plugin = new ProxyAccessPlugin();
+      options.getPlugins().push(plugin);
+
       layout = project.getModel().getLayouts()[1];
 
       helper.setUrl("http://test/?layout=" + layout.getName());
@@ -118,7 +134,7 @@ describe('minerva global', function () {
     }).then(function (result) {
       assert.ok(result);
       // input file is not available so it's the background
-      return result.getVisibleDataOverlays();
+      return plugin.getProxy().project.map.getVisibleDataOverlays();
     }).then(function (visibleDataOverlays) {
       // input file is available so it's not the background file but overlay
       assert.equal(visibleDataOverlays.length, 0);
@@ -145,14 +161,16 @@ describe('minerva global', function () {
 
   it('create with layout 2', function () {
     helper.setUrl("http://test/?layout=xxx");
-    var globalObject;
+    var globalObject, plugin;
     return ServerConnectorMock.getProject().then(function (project) {
       var options = helper.createCustomMapOptions(project);
+      plugin = new ProxyAccessPlugin();
+      options.getPlugins().push(plugin);
       return minerva.create(options);
     }).then(function (result) {
       globalObject = result;
       assert.ok(result);
-      return result.getVisibleDataOverlays();
+      return plugin.getProxy().project.map.getVisibleDataOverlays();
     }).then(function (visibleDataOverlays) {
       // input file is available so it's not the background file but overlay
       assert.equal(visibleDataOverlays.length, 1);
@@ -164,13 +182,15 @@ describe('minerva global', function () {
   it('create with search overlay and GET search param', function () {
     helper.setUrl("http://test/?search=s1");
 
-    var globalObject;
+    var globalObject, plugin;
     return ServerConnectorMock.getProject().then(function (project) {
       var options = helper.createCustomMapOptions(project);
+      plugin = new ProxyAccessPlugin();
+      options.getPlugins().push(plugin);
       return minerva.create(options);
     }).then(function (result) {
       globalObject = result;
-      return result.getHighlightedBioEntities("search");
+      return plugin.getProxy().project.map.getHighlightedBioEntities("search");
     }).then(function (elements) {
       assert.ok(elements.length > 0);
       return globalObject.destroy();
@@ -203,281 +223,6 @@ describe('minerva global', function () {
     });
   });
 
-  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");
-      return result.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 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 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 = {
-      projectId: "sample",
-      element: testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function (result) {
-      globalResult = result;
-      return result.setCenter({
-        modelId: 15781,
-        x: 10,
-        y: 20,
-      });
-    }).then(function () {
-      var sessionData = ServerConnectorMock.getSessionData(globalResult.getProject());
-      var center = sessionData.getCenter(globalResult.getProject().getModel());
-      assert.ok(center instanceof google.maps.Point);
-      assert.closeTo(parseFloat(center.x), 10, helper.EPSILON);
-      assert.closeTo(parseFloat(center.y), 20, helper.EPSILON);
-    }).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("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();
-    });
-
-  });
 
   it('create Export', function () {
     var options = null;
@@ -503,20 +248,13 @@ describe('minerva global', function () {
       result.destroy();
     });
   });
-  it("getAllBioEntities", function () {
-    var options = {
-      projectId: "sample",
-      element: testDiv
-    };
-    var globalResult;
-    return minerva.create(options).then(function (result) {
-      globalResult = result;
-      return result.getAllBioEntities();
+  it('getProject', function () {
+    return ServerConnectorMock.getProject().then(function (project) {
+      var options = helper.createCustomMapOptions(project);
+      return minerva.create(options);
     }).then(function (result) {
-      assert.ok(result);
-      assert.ok(result.length > 0);
-    }).then(function () {
-      globalResult.destroy();
+      assert.equal(result.getProject().getProjectId(), "sample");
+      return result.destroy();
     });
   });
 
diff --git a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
index 97acbd9403c77e19fc0758d30a025295c402952c..9f9800c390533027fde9453ac589ffbc5119974d 100644
--- a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
+++ b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
@@ -5,10 +5,22 @@
 
 require("../mocha-config");
 
+var Alias = require('../../../main/js/map/data/Alias');
 var MinervaPluginProxy = require('../../../main/js/plugin/MinervaPluginProxy');
 
 var logger = require('../logger');
-var assert = require('assert');
+
+var chai = require('chai');
+var assert = chai.assert;
+
+function createProxy(map) {
+  return new MinervaPluginProxy({
+    map: map,
+    element: testDiv,
+    pluginId: "xx",
+    configuration: helper.getConfiguration()
+  });
+}
 
 describe('MinervaPluginProxy', function () {
   it('constructor', function () {
@@ -25,4 +37,251 @@ describe('MinervaPluginProxy', function () {
     assert.ok(proxy.project);
     assert.ok(proxy.configuration);
   });
+
+  it('add search listener', function () {
+    var callbackOk = false;
+    var map;
+    return ServerConnector.getProject().then(function (project) {
+      map = helper.createCustomMap(project);
+      helper.createSearchDbOverlay(map);
+      var proxy = createProxy(map);
+
+      proxy.project.map.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 map.getOverlayByName("search").searchByQuery("s1");
+    }).then(function () {
+      assert.ok(callbackOk);
+      callbackOk = false;
+      return map.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: map.getProject().getModel().getId()
+      };
+      return map.getOverlayByName("search").searchByCoordinates(params);
+    }).then(function () {
+      assert.ok(callbackOk);
+      return map.destroy();
+    });
+  });
+
+  describe("getBioEntityById", function () {
+    it("for alias", function () {
+      var map, proxy;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        proxy = createProxy(map);
+        return proxy.project.data.getBioEntityById({
+          id: 329177,
+          modelId: 15781,
+          type: "ALIAS"
+        });
+      }).then(function (result) {
+        assert.ok(result);
+      }).then(function () {
+        map.destroy();
+      });
+    });
+
+    it("for reaction", function () {
+      var map, proxy;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        proxy = createProxy(map);
+        return proxy.project.data.getBioEntityById({
+          id: 153508,
+          modelId: 15781,
+          type: "REACTION"
+        });
+      }).then(function (result) {
+        assert.ok(result);
+        assert.ok(result.getReactants()[0] instanceof Alias);
+      }).then(function () {
+        map.destroy();
+      });
+    });
+  });
+
+  describe("showElement", function () {
+    it("alias", function () {
+      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"
+        }
+      };
+      var map, proxy;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        proxy = createProxy(map);
+        return proxy.project.map.showBioEntity(elementToShow);
+      }).then(function () {
+        return proxy.project.map.getHighlightedBioEntities();
+      }).then(function (elements) {
+        assert.equal(elements.length, 1);
+        return proxy.project.map.showBioEntity(elementToShow2);
+      }).then(function () {
+        return proxy.project.map.getHighlightedBioEntities();
+      }).then(function (elements) {
+        assert.equal(elements.length, 2);
+        return proxy.project.map.hideBioEntity(elementToShow);
+      }).then(function () {
+        return proxy.project.map.getHighlightedBioEntities();
+      }).then(function (elements) {
+        assert.equal(elements.length, 1);
+        return proxy.project.map.hideBioEntity(elementToShow2);
+      }).then(function () {
+        return proxy.project.map.getHighlightedBioEntities();
+      }).then(function (elements) {
+        assert.equal(elements.length, 0);
+        map.destroy();
+      });
+    });
+
+    it("show twice", function () {
+      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"
+        }
+      };
+
+      var map, proxy;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        proxy = createProxy(map);
+        proxy.project.map.showBioEntity(elementToShow);
+        return proxy.project.map.showBioEntity(elementToShow2);
+      }).then(function () {
+        map.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);
+        map.destroy();
+      });
+    });
+  });
+
+  it("setCenter", function () {
+    var map, proxy;
+    return ServerConnector.getProject().then(function (project) {
+      map = helper.createCustomMap(project);
+      proxy = createProxy(map);
+      return proxy.project.map.setCenter({
+        modelId: 15781,
+        x: 10,
+        y: 20
+      });
+    }).then(function () {
+      var sessionData = ServerConnector.getSessionData(map.getProject());
+      var center = sessionData.getCenter(map.getProject().getModel());
+      assert.ok(center instanceof google.maps.Point);
+      assert.closeTo(parseFloat(center.x), 10, helper.EPSILON);
+      assert.closeTo(parseFloat(center.y), 20, helper.EPSILON);
+    }).then(function () {
+      map.destroy();
+    });
+  });
+
+  it("setZoom", function () {
+    var map, proxy;
+    return ServerConnector.getProject().then(function (project) {
+      map = helper.createCustomMap(project);
+      proxy = createProxy(map);
+      return proxy.project.map.setZoom({
+        modelId: 15781,
+        zoom: 10
+      });
+    }).then(function () {
+      var sessionData = ServerConnector.getSessionData(map.getProject());
+      var zoom = sessionData.getZoomLevel(map.getProject().getModel());
+      assert.equal(zoom, 10);
+    }).then(function () {
+      map.destroy();
+    });
+  });
+
+  it("getReactionByParticipantId", function () {
+    var ie = {
+      modelId: 15781,
+      type: "ALIAS",
+      id: 329167
+    };
+
+    var map, proxy;
+    return ServerConnector.getProject().then(function (project) {
+      map = helper.createCustomMap(project);
+      proxy = createProxy(map);
+      return proxy.project.data.getReactionsWithElement(ie);
+    }).then(function (reactions) {
+      assert.equal(reactions.length, 5);
+    }).then(function () {
+      map.destroy();
+    });
+
+  });
+
+  it("getAllBioEntities", function () {
+    var map, proxy;
+    return ServerConnector.getProject().then(function (project) {
+      map = helper.createCustomMap(project);
+      proxy = createProxy(map);
+      return proxy.project.data.getAllBioEntities();
+    }).then(function (result) {
+      assert.ok(result);
+      assert.ok(result.length > 0);
+    }).then(function () {
+      map.destroy();
+    });
+  });
+
+  describe("configuration", function () {
+    it("elementTypes", function () {
+      var map, proxy;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        proxy = createProxy(map);
+        assert.ok(proxy.configuration.elementTypes.length > 0);
+        map.destroy();
+      });
+    });
+  });
+
 });
diff --git a/frontend-js/src/test/js/plugin/Plugin-test.js b/frontend-js/src/test/js/plugin/Plugin-test.js
index 5aa485d681ff3e3d57161e7f3af9ec310908219c..bc4ccddc3c93fc33e13cded40ad50bfa357cee1c 100644
--- a/frontend-js/src/test/js/plugin/Plugin-test.js
+++ b/frontend-js/src/test/js/plugin/Plugin-test.js
@@ -10,18 +10,46 @@ var Plugin = require('../../../main/js/plugin/Plugin');
 var logger = require('../logger');
 var assert = require('assert');
 
-describe('PluginManager', function () {
+var fs = require('fs');
+
+describe('Plugin', function () {
   it('constructor', function () {
-    var plugin = new Plugin({url: "./testFiles/plugin/empty.js"});
+    var plugin = new Plugin({
+      url: "./testFiles/plugin/empty.js",
+      configuration: helper.getConfiguration()
+    });
     assert.ok(plugin);
   });
   it('load', function () {
-    var plugin = new Plugin({url: "./testFiles/plugin/empty.js"});
+    var map = helper.createCustomMap();
+
+    var plugin = new Plugin({
+      url: "./testFiles/plugin/empty.js",
+      map: map,
+      configuration: helper.getConfiguration()
+    });
     return plugin.load().then(function () {
       assert.equal("test plugin", plugin.getName());
       assert.equal("0.0.1", plugin.getVersion());
       assert.equal(0, logger.getWarnings().length);
+    });
+  });
+
+  it('test plugins', function () {
+    var map = helper.createCustomMap();
+    var promises = [];
 
+    fs.readdirSync('./testFiles/plugin/').forEach(function (file) {
+      var element = document.createElement("div");
+      testDiv.appendChild(element);
+      var plugin = new Plugin({
+        url: "./testFiles/plugin/" + file,
+        map: map,
+        element: element,
+        configuration: helper.getConfiguration()
+      });
+      promises.push(plugin.load());
     });
+    return Promise.all(promises);
   });
 });
diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js
index bd8430290b1c3c2b16cc6cfa19a287980298e0b7..8a726b453bd0bde35fbcf6cc4f881eccc06761df 100644
--- a/frontend-js/src/test/js/plugin/PluginManager-test.js
+++ b/frontend-js/src/test/js/plugin/PluginManager-test.js
@@ -15,6 +15,7 @@ describe('PluginManager', function () {
     var map = helper.createCustomMap();
     return {
       map: map,
+      configuration: helper.getConfiguration(),
       element: testDiv
     };
   };
diff --git a/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js b/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js
new file mode 100644
index 0000000000000000000000000000000000000000..e1dc9b28261d0124924263fe7fe5c3cbfc116e56
--- /dev/null
+++ b/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js
@@ -0,0 +1,36 @@
+"use strict";
+
+var Plugin = require('../../../main/js/plugin/Plugin');
+var MinervaPluginProxy = require('../../../main/js/plugin/MinervaPluginProxy');
+
+var Promise = require('bluebird');
+
+function ProxyAccessPlugin() {
+}
+
+ProxyAccessPlugin.prototype = Object.create(Plugin.prototype);
+ProxyAccessPlugin.prototype.constructor = ProxyAccessPlugin;
+
+ProxyAccessPlugin.prototype.setOptions = function (options) {
+  this._proxy = new MinervaPluginProxy(options);
+};
+
+ProxyAccessPlugin.prototype.getProxy = function () {
+  return this._proxy;
+};
+ProxyAccessPlugin.prototype.load = function () {
+  this.setLoadedPluginData({
+    getName: function () {
+      return "ProxyAccessPlugin"
+    },
+    getVersion: function () {
+      return "0.0.1";
+    },
+    unregister: function () {
+    },
+    register: function () {
+    }
+  });
+  return Promise.resolve();
+};
+module.exports = ProxyAccessPlugin;
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329156&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329156&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..ff99326ade22c39b78dfac9b0f2000be3592a07e
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329156&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa25","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"GDP","bounds":{"x":959.0,"width":70.0,"y":271.0,"height":25.0},"formula":null,"id":329156,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329156,329157,329158,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329156,329157,329158,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..04a4d0de8b8378336dfba1d382e24229aa3c422d
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329156,329157,329158,329160,329161,329162,329163,329164,329165,329166,329167,329168,329169,329170,329171,329172,329173,329174,329175,329176,329177,329178,329179,329180,329181,329182,329183,329184,329185&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa7","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Phenotype","abbreviation":null,"compartmentId":null,"name":"s7","bounds":{"x":213.0,"width":80.0,"y":128.0,"height":30.0},"formula":null,"id":329172,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa27","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s23","bounds":{"x":695.0,"width":80.0,"y":239.0,"height":40.0},"formula":null,"id":329178,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa30","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"D-beta hydroxybutyrate","bounds":{"x":1022.7317629179333,"width":140.0,"y":209.5,"height":25.0},"formula":null,"id":329181,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa8","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Ion","abbreviation":null,"compartmentId":null,"name":"s8","bounds":{"x":358.5,"width":25.0,"y":125.5,"height":25.0},"formula":null,"id":329165,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa22","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s22","bounds":{"x":712.0,"width":80.0,"y":384.0,"height":40.0},"formula":null,"id":329174,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa24","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"GTP","bounds":{"x":849.0,"width":70.0,"y":309.0,"height":25.0},"formula":null,"id":329180,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa33","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[{"resource":"REACT_5847.1","link":"http://reactome.org/content/detail/REACT_5847.1","id":860353,"type":"REACTOME"}],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Ion","abbreviation":null,"compartmentId":null,"name":"H+","bounds":{"x":1243.7682370820667,"width":25.0,"y":12.50000000000091,"height":25.0},"formula":null,"id":329184,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa11","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Unknown","abbreviation":null,"compartmentId":null,"name":"s11","bounds":{"x":105.0,"width":70.0,"y":203.5,"height":25.0},"formula":null,"id":329169,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa15","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"gfsdhj","bounds":{"x":160.0,"width":119.0,"y":332.0,"height":63.0},"formula":null,"id":329171,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa2","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s2","bounds":{"x":165.0,"width":80.0,"y":43.0,"height":50.0},"formula":null,"id":329179,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa1","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"description of S1\r\nthird line","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s1","bounds":{"x":12.0,"width":80.0,"y":6.0,"height":40.0},"formula":null,"id":329173,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa14","symbol":"CNC","formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"ymbol: CNC\r\nghfjkghfdjkghkdf\r\nfdghjkfdhgjkdfgjhdf\r\njdsfkljsdklfjsdf\r\nsjdkfjsdklfjkl\r\ndsjfkjl\r\nsdfkkjfskldjfkls\r\n\nRecName: Full=Sodium/calcium exchanger 1; AltName: Full=Na(+)/Ca(2+)-exchange protein 1; Flags: Precursor;","references":[{"resource":"REACT_20130","link":"http://reactome.org/content/detail/REACT_20130","id":860342,"type":"REACTOME"},{"resource":"2141","link":"http://www.genenames.org/cgi-bin/gene_symbol_report?hgnc_id=2141","id":860343,"type":"HGNC"},{"resource":"6546","link":null,"id":860344,"type":"KEGG_GENES"},{"resource":"NP_001106272.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001106272.1","id":860345,"type":"REFSEQ"},{"resource":"NP_001106271.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001106271.1","id":860346,"type":"REFSEQ"},{"resource":"NP_001106273.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001106273.1","id":860347,"type":"REFSEQ"},{"resource":"NP_001239553.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001239553.1","id":860348,"type":"REFSEQ"},{"resource":"PA314","link":"http://www.pharmgkb.org/pathway/PA314","id":860349,"type":"PHARM"},{"resource":"NP_066920.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_066920.1","id":860350,"type":"REFSEQ"},{"resource":"6546","link":"http://www.ncbi.nlm.nih.gov/gene/6546","id":860351,"type":"ENTREZ"}],"modelId":15781,"synonyms":["CNC","NCX1"],"fullName":"Carney complex, multiple neoplasia and lentiginosis","complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"CNC","bounds":{"x":11.0,"width":118.0,"y":236.0,"height":66.0},"formula":null,"id":329166,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa32","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[{"resource":"622","link":"http://www.ncbi.nlm.nih.gov/gene/622","id":860352,"type":"ENTREZ"}],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"BDH1","bounds":{"x":1225.7682370820667,"width":80.0,"y":66.0,"height":40.0},"formula":null,"id":329170,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa23","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s22","bounds":{"x":918.0,"width":80.0,"y":427.0,"height":40.0},"formula":null,"id":329162,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa28","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"ATP","bounds":{"x":683.0,"width":70.0,"y":132.0,"height":25.0},"formula":null,"id":329176,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa26","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s23","bounds":{"x":656.0,"width":80.0,"y":42.0,"height":40.0},"formula":null,"id":329183,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"csa1","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Complex","abbreviation":null,"compartmentId":null,"name":"s12","bounds":{"x":271.0,"width":101.0,"y":207.0,"height":164.0},"formula":null,"id":329158,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa9","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"s9","bounds":{"x":455.0,"width":70.0,"y":169.5,"height":25.0},"formula":null,"id":329161,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa35","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[{"resource":"REACT_5224.1","link":"http://reactome.org/content/detail/REACT_5224.1","id":860341,"type":"REACTOME"}],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"acetoacetate","bounds":{"x":1044.7317629179333,"width":140.0,"y":27.50000000000091,"height":25.0},"formula":null,"id":329164,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa31","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"NAD+","bounds":{"x":1197.2682370820667,"width":70.0,"y":287.5,"height":25.0},"formula":null,"id":329185,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa4","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s4","bounds":{"x":419.0,"width":80.0,"y":45.0,"height":40.0},"formula":null,"id":329182,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa12","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Degraded","abbreviation":null,"compartmentId":null,"name":"s13","bounds":{"x":401.0,"width":30.0,"y":235.0,"height":30.0},"formula":null,"id":329175,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa25","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"GDP","bounds":{"x":959.0,"width":70.0,"y":271.0,"height":25.0},"formula":null,"id":329156,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa29","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"ADP","bounds":{"x":819.0,"width":70.0,"y":134.0,"height":25.0},"formula":null,"id":329160,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa3","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s3","bounds":{"x":289.0,"width":80.0,"y":39.0,"height":40.0},"formula":null,"id":329157,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa34","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[{"resource":"REACT_2390.1","link":"http://reactome.org/content/detail/REACT_2390.1","id":860340,"type":"REACTOME"}],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"NADH","bounds":{"x":1214.2682370820667,"width":70.0,"y":128.5000000000009,"height":25.0},"formula":null,"id":329163,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa6","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Antisense RNA","abbreviation":null,"compartmentId":null,"name":"s6","bounds":{"x":101.0,"width":90.0,"y":129.5,"height":25.0},"formula":null,"id":329167,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa5","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"RNA","abbreviation":null,"compartmentId":null,"name":"s5","bounds":{"x":0.0,"width":90.0,"y":118.5,"height":25.0},"formula":null,"id":329168,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa10","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Drug","abbreviation":null,"compartmentId":null,"name":"s10","bounds":{"x":0.0,"width":80.0,"y":186.0,"height":30.0},"formula":null,"id":329177,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329157&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329157&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..5d6bdca33abe5e0c3a5b6232f93d9687d2eecdbb
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329157&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa3","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s3","bounds":{"x":289.0,"width":80.0,"y":39.0,"height":40.0},"formula":null,"id":329157,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329160&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329160&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..970295398d48af1ba84be3b92159c9fe18b38620
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329160&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa29","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"ADP","bounds":{"x":819.0,"width":70.0,"y":134.0,"height":25.0},"formula":null,"id":329160,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329161&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329161&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..373d229dcfc4483b108f21ddf4731cb1f5972a96
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329161&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa9","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"s9","bounds":{"x":455.0,"width":70.0,"y":169.5,"height":25.0},"formula":null,"id":329161,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329161,329165&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329161,329165&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..cc5b6b23bbc867d3cbba9125f0c3d7f8e9fafd97
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329161,329165&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa8","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Ion","abbreviation":null,"compartmentId":null,"name":"s8","bounds":{"x":358.5,"width":25.0,"y":125.5,"height":25.0},"formula":null,"id":329165,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"},{"elementId":"sa9","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"s9","bounds":{"x":455.0,"width":70.0,"y":169.5,"height":25.0},"formula":null,"id":329161,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329162&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329162&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..9b30811ddd796aa9ce4ee6c91de56522f5d34139
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329162&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa23","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s22","bounds":{"x":918.0,"width":80.0,"y":427.0,"height":40.0},"formula":null,"id":329162,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329164&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329164&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..06044ccc7c0d3d40be16e8a411eed1103eb22cec
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329164&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa35","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[{"resource":"REACT_5224.1","link":"http://reactome.org/content/detail/REACT_5224.1","id":860341,"type":"REACTOME"}],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"acetoacetate","bounds":{"x":1044.7317629179333,"width":140.0,"y":27.50000000000091,"height":25.0},"formula":null,"id":329164,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329165&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329165&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..d7df659aec9667af0dd003afb0548fdff1d8087e
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329165&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa8","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Ion","abbreviation":null,"compartmentId":null,"name":"s8","bounds":{"x":358.5,"width":25.0,"y":125.5,"height":25.0},"formula":null,"id":329165,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329166&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329166&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..fb2666769a6927f06ecb3c5284b552b7118cf934
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329166&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa14","symbol":"CNC","formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"ymbol: CNC\r\nghfjkghfdjkghkdf\r\nfdghjkfdhgjkdfgjhdf\r\njdsfkljsdklfjsdf\r\nsjdkfjsdklfjkl\r\ndsjfkjl\r\nsdfkkjfskldjfkls\r\n\nRecName: Full=Sodium/calcium exchanger 1; AltName: Full=Na(+)/Ca(2+)-exchange protein 1; Flags: Precursor;","references":[{"resource":"REACT_20130","link":"http://reactome.org/content/detail/REACT_20130","id":860342,"type":"REACTOME"},{"resource":"2141","link":"http://www.genenames.org/cgi-bin/gene_symbol_report?hgnc_id=2141","id":860343,"type":"HGNC"},{"resource":"6546","link":null,"id":860344,"type":"KEGG_GENES"},{"resource":"NP_001106272.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001106272.1","id":860345,"type":"REFSEQ"},{"resource":"NP_001106271.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001106271.1","id":860346,"type":"REFSEQ"},{"resource":"NP_001106273.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001106273.1","id":860347,"type":"REFSEQ"},{"resource":"NP_001239553.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_001239553.1","id":860348,"type":"REFSEQ"},{"resource":"PA314","link":"http://www.pharmgkb.org/pathway/PA314","id":860349,"type":"PHARM"},{"resource":"NP_066920.1","link":"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val=NP_066920.1","id":860350,"type":"REFSEQ"},{"resource":"6546","link":"http://www.ncbi.nlm.nih.gov/gene/6546","id":860351,"type":"ENTREZ"}],"modelId":15781,"synonyms":["CNC","NCX1"],"fullName":"Carney complex, multiple neoplasia and lentiginosis","complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"CNC","bounds":{"x":11.0,"width":118.0,"y":236.0,"height":66.0},"formula":null,"id":329166,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..8da6308347acd8d2a3ca09aaeb5d20e193348085
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa6","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":"usual","modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Antisense RNA","abbreviation":null,"compartmentId":null,"name":"s6","bounds":{"x":101.0,"width":90.0,"y":129.5,"height":25.0},"formula":null,"id":329167,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329169&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329169&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..fa8d2534d579fd097ba16874e51752e7407bb8a0
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329169&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa11","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Unknown","abbreviation":null,"compartmentId":null,"name":"s11","bounds":{"x":105.0,"width":70.0,"y":203.5,"height":25.0},"formula":null,"id":329169,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329172&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329172&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..04a782d90289d19b49bba760f95c5be43ed1a43f
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329172&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa7","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Phenotype","abbreviation":null,"compartmentId":null,"name":"s7","bounds":{"x":213.0,"width":80.0,"y":128.0,"height":30.0},"formula":null,"id":329172,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329174&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329174&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..c04722da2a6d74eaa6ed4818b1433a941c6758f4
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329174&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa22","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s22","bounds":{"x":712.0,"width":80.0,"y":384.0,"height":40.0},"formula":null,"id":329174,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329175&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329175&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..2f5cbc35e3215e6871a202a80d200c3210f6d00b
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329175&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa12","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Degraded","abbreviation":null,"compartmentId":null,"name":"s13","bounds":{"x":401.0,"width":30.0,"y":235.0,"height":30.0},"formula":null,"id":329175,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329176&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329176&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..8a611dd24eb22148390bfca6987ffcd8cfeac30d
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329176&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa28","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"ATP","bounds":{"x":683.0,"width":70.0,"y":132.0,"height":25.0},"formula":null,"id":329176,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329178&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329178&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..118defe433e6195ebb4e2275f255ea7767be2dc4
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329178&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa27","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s23","bounds":{"x":695.0,"width":80.0,"y":239.0,"height":40.0},"formula":null,"id":329178,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329179&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329179&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..1434621e490b03635f58f4a53317010b00c58d38
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329179&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa2","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s2","bounds":{"x":165.0,"width":80.0,"y":43.0,"height":50.0},"formula":null,"id":329179,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329180&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329180&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..a4cf822d52b3112a2904833830c45a1853c0edb6
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329180&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa24","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"GTP","bounds":{"x":849.0,"width":70.0,"y":309.0,"height":25.0},"formula":null,"id":329180,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329181&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329181&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..5d6bdca33abe5e0c3a5b6232f93d9687d2eecdbb
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329181&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa3","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s3","bounds":{"x":289.0,"width":80.0,"y":39.0,"height":40.0},"formula":null,"id":329157,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329182&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329182&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..36b428665cea0b4e9d94be04934d4d339f914dc6
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329182&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa4","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s4","bounds":{"x":419.0,"width":80.0,"y":45.0,"height":40.0},"formula":null,"id":329182,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329183&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329183&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..0d08312409d3bf7471acbfccd18f28f9b9ffad68
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329183&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa26","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Protein","abbreviation":null,"compartmentId":null,"name":"s23","bounds":{"x":656.0,"width":80.0,"y":42.0,"height":40.0},"formula":null,"id":329183,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329184&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329184&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..0b35bab1f9a91bcad76f7d1f0cdb67e10a380583
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329184&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa33","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[{"resource":"REACT_5847.1","link":"http://reactome.org/content/detail/REACT_5847.1","id":860353,"type":"REACTOME"}],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Ion","abbreviation":null,"compartmentId":null,"name":"H+","bounds":{"x":1243.7682370820667,"width":25.0,"y":12.50000000000091,"height":25.0},"formula":null,"id":329184,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329185&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329185&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..f79f02efe989fb831ea2954ee504fc6df2e9435a
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329185&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa31","symbol":null,"formerSymbols":[],"other":{"structures":{},"structuralState":null,"modifications":[]},"notes":"","references":[],"modelId":15781,"synonyms":[],"fullName":null,"complexId":null,"type":"Simple molecule","abbreviation":null,"compartmentId":null,"name":"NAD+","bounds":{"x":1197.2682370820667,"width":70.0,"y":287.5,"height":25.0},"formula":null,"id":329185,"linkedSubmodel":null,"hierarchyVisibilityLevel":"0"}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/plugin/highlight-something.js b/frontend-js/testFiles/plugin/highlight-something.js
new file mode 100644
index 0000000000000000000000000000000000000000..985dec3860a6168245a2aa536fc3c15870438d95
--- /dev/null
+++ b/frontend-js/testFiles/plugin/highlight-something.js
@@ -0,0 +1,25 @@
+define(function () {
+  return {
+    register: function (minervaObject) {
+      minervaObject.element.innerHTML = "<div><button id='show'>highlight something</button></div>";
+      $("#show", minervaObject.element).on("click", function () {
+        console.log("button clicked");
+        console.log(minervaObject);
+        return minervaObject.project.data.getAllBioEntities().then(function (bioEntities) {
+          console.log("found " + bioEntities.length + " elements");
+          console.log("SHOW: ", bioEntities[0]);
+          return minervaObject.project.map.showBioEntity({element: bioEntities[0], type: "ICON"});
+        });
+      });
+    },
+    unregister: function () {
+      console.log("unregistering test plugin");
+    },
+    getName: function () {
+      return "high test";
+    },
+    getVersion: function () {
+      return "0.0.1";
+    }
+  };
+});
\ No newline at end of file
diff --git a/model-command/.classpath b/model-command/.classpath
index ace82666f2f113cdb835230548bb1c0ddf6ca559..08d7a50f5bdeedd3895bec12935a95bb700fbf77 100644
--- a/model-command/.classpath
+++ b/model-command/.classpath
@@ -25,6 +25,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
diff --git a/model/.classpath b/model/.classpath
index ace82666f2f113cdb835230548bb1c0ddf6ca559..08d7a50f5bdeedd3895bec12935a95bb700fbf77 100644
--- a/model/.classpath
+++ b/model/.classpath
@@ -25,6 +25,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
diff --git a/persist/.classpath b/persist/.classpath
index ace82666f2f113cdb835230548bb1c0ddf6ca559..08d7a50f5bdeedd3895bec12935a95bb700fbf77 100644
--- a/persist/.classpath
+++ b/persist/.classpath
@@ -25,6 +25,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
diff --git a/rest-api/.classpath b/rest-api/.classpath
index ec5c30a80e0515905ae05019444910628e0743e6..3783d3d93c885fcd1b40df6fe49f64d056876503 100644
--- a/rest-api/.classpath
+++ b/rest-api/.classpath
@@ -30,6 +30,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/service/.classpath b/service/.classpath
index ace82666f2f113cdb835230548bb1c0ddf6ca559..08d7a50f5bdeedd3895bec12935a95bb700fbf77 100644
--- a/service/.classpath
+++ b/service/.classpath
@@ -25,6 +25,7 @@
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
diff --git a/web/.settings/org.eclipse.wst.common.component b/web/.settings/org.eclipse.wst.common.component
index a43617e524ad51c00cc84611bdbf4122d9a5e86f..2c2e2c8b85f16344550cbaac6ff5482a76560f0d 100644
--- a/web/.settings/org.eclipse.wst.common.component
+++ b/web/.settings/org.eclipse.wst.common.component
@@ -1,46 +1,46 @@
-<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
-    <wb-module deploy-name="MapViewer-web">
-        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
-        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
-        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
-        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
-        <dependent-module archiveName="service-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-service/MapViewer-service">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="model-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-model/MapViewer-model">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="commons-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-commons/MapViewer-commons">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="persist-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-persist/MapViewer-persist">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="model-command-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-model-command/MapViewer-model-command">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="annotation-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-annotation/MapViewer-annotation">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="converter-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-converter/MapViewer-converter">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="converter-CellDesigner-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-converter-CellDesigner/MapViewer-converter-CellDesigner">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="converter-SBGNML-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-converter-SBGNML/MapViewer-converter-SBGNML">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="converter-graphics-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-converter-graphics/MapViewer-converter-graphics">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="rest-api-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MapViewer-rest-api/MapViewer-rest-api">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <dependent-module archiveName="frontend-js-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/frontend-js/frontend-js">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
-        <property name="java-output-path" value="/MapViewer-web/target/classes"/>
-        <property name="context-root" value="web"/>
-    </wb-module>
-</project-modules>
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="MapViewer-web">
+        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
+        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+        <dependent-module archiveName="service-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/service/service">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="model-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/model/model">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="commons-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/commons/commons">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="persist-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/persist/persist">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="model-command-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/model-command/model-command">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="annotation-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/annotation/annotation">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="converter-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/converter/converter">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="converter-CellDesigner-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/converter-CellDesigner/converter-CellDesigner">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="converter-SBGNML-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/converter-SBGNML/converter-SBGNML">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="converter-graphics-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/converter-graphics/converter-graphics">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="rest-api-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/rest-api/rest-api">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <dependent-module archiveName="frontend-js-1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/frontend-js/frontend-js">
+            <dependency-type>uses</dependency-type>
+        </dependent-module>
+        <property name="java-output-path" value="/MapViewer-web/target/classes"/>
+        <property name="context-root" value="web"/>
+    </wb-module>
+</project-modules>
diff --git a/web/src/main/webapp/index.xhtml b/web/src/main/webapp/index.xhtml
index 15e033cd63a3a9f9a5aafbc156a8ef2bdc10994d..7dd60ad0c641af31c616d06de5529e70948704bd 100644
--- a/web/src/main/webapp/index.xhtml
+++ b/web/src/main/webapp/index.xhtml
@@ -19,7 +19,6 @@
 
   <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
   <script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
-  <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.js"></script>
 
 	<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css"/>	
 	<link rel="stylesheet" type="text/css" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"/>