diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java
index def4fbc887b886ef0abcce359c77e7b2ea308ba3..96bc681dfb4643be61cea44c3d3128d5eff44e00 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/ImageGenerators.java
@@ -54,7 +54,7 @@ public class ImageGenerators {
 			generatorInstances = new ArrayList<>();
 			generatorInstances.add(new PngImageGenerator(params));
 			generatorInstances.add(new PdfImageGenerator(params));
-			// generatorInstances.add(new SvgImageGenerator(params));
+			generatorInstances.add(new SvgImageGenerator(params));
 			// generatorInstances.add(new JpgImageGenerator(params));
 			for (AbstractImageGenerator abstractImageGenerator : generatorInstances) {
 				availableGenerators
diff --git a/frontend-js/.idea/codeStyleSettings.xml b/frontend-js/.idea/codeStyleSettings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5555dd266682059e1b1fed89915c4ef70b2bba45
--- /dev/null
+++ b/frontend-js/.idea/codeStyleSettings.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectCodeStyleSettingsManager">
+    <option name="PER_PROJECT_SETTINGS">
+      <value />
+    </option>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/frontend-js/.idea/frontend-js.iml b/frontend-js/.idea/frontend-js.iml
index 69ef67a424b4d72230aac1a2e4ddc77c7a75b52b..b6d6506e8893d7574cd478c3f94f16a0d3a0f679 100644
--- a/frontend-js/.idea/frontend-js.iml
+++ b/frontend-js/.idea/frontend-js.iml
@@ -3,8 +3,8 @@
   <component name="NewModuleRootManager">
     <content url="file://$MODULE_DIR$">
       <excludeFolder url="file://$MODULE_DIR$/.tmp" />
-      <excludeFolder url="file://$MODULE_DIR$/dist" />
       <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/dist" />
       <excludeFolder url="file://$MODULE_DIR$/tmp" />
     </content>
     <orderEntry type="inheritedJdk" />
diff --git a/frontend-js/package.json b/frontend-js/package.json
index ebd32bd7c0666d3ad14e5bffc79a73d4123df629..f6835c3aa6fbc7e47cdfce0cc8f261720d330d01 100644
--- a/frontend-js/package.json
+++ b/frontend-js/package.json
@@ -37,7 +37,8 @@
   },
   "dependencies": {
     "del": "^3.0.0",
-    "dual-listbox": "^1.0.3",
+    "dual-listbox": "^1.0.7",
+    "file-saver": "^1.3.3",
     "http-status-codes": "^1.1.6",
     "js-cookie": "^2.1.3",
     "log4js": "0.6.38",
diff --git a/frontend-js/src/main/js/Export.js b/frontend-js/src/main/js/Export.js
index e425dbb06dd9c436840e07ad3b93aa501c9d48d9..d2233fc56f90e66111ccfa589b2337d247e69ff5 100644
--- a/frontend-js/src/main/js/Export.js
+++ b/frontend-js/src/main/js/Export.js
@@ -24,6 +24,7 @@ var Functions = require('./Functions');
 function Export(options) {
   var self = this;
   self._panels = [];
+  self._tabIdCount = 0;
   if (!(options instanceof CustomMapOptions)) {
     options = new CustomMapOptions(options);
   }
@@ -90,7 +91,7 @@ Export.prototype.addTab = function(params, navElement, contentElement) {
 
   var name = params.name;
 
-  var tabId = "left_panel_ab_" + this._tabIdCount;
+  var tabId = "export_panel_tab_" + this._tabIdCount;
   self._tabIdCount++;
 
   var navClass = '';
@@ -130,7 +131,7 @@ Export.prototype.addTab = function(params, navElement, contentElement) {
   this._panels.push(new params.panelClass({
     element : contentDiv,
     project : self.getProject(),
-    configuration: self.getConfiguration(),
+    configuration : self.getConfiguration(),
   }));
 };
 
diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js
index f89dd7c10d0586264413dd6af7eb1b8bb62be362..1e05d57715704904ae833534af9e89bb1f08c29a 100644
--- a/frontend-js/src/main/js/GuiConnector.js
+++ b/frontend-js/src/main/js/GuiConnector.js
@@ -4,6 +4,7 @@ var logger = require('./logger');
 
 var Functions = require('./Functions');
 var SecurityError = require('./SecurityError');
+var GuiMessageError = require('./gui/GuiMessageError');
 var NetworkError = require('./NetworkError');
 
 /**
@@ -177,6 +178,8 @@ GuiConnector.alert = function (error) {
   }
   var message = error;
   if (message instanceof SecurityError) {
+    message = error.message + "<p>Please <a href=\"login.xhtml\">login</a> to access this resuorce</p>";
+  } else if (message instanceof GuiMessageError) {
     message = error.message + "<p>Please <a href=\"login.xhtml\">login</a> to access this resource</p>";
   } else if (message instanceof NetworkError && (error.message === "XHR error" || error.message === "Failed to fetch")) {
     message = "File to big.<br>Please reduce file size or contact administrators.";
diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 36f7e29957cdaee875e669cf414dff08611abd30..b7454ef5074a92c0c1c33437a43a4ab95854b3e1 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -838,6 +838,12 @@ ServerConnector.getOverlayById = function (overlayId, projectId) {
 ServerConnector.getReactions = function (params) {
   var self = this;
   var queryParams = {};
+  if (params.ids === undefined) {
+    params.ids = [];
+  }
+  if (params.participantId === undefined) {
+    params.participantId = [];
+  }
   var filterParams = {
     id: params.ids,
     columns: params.columns,
@@ -845,7 +851,12 @@ ServerConnector.getReactions = function (params) {
   };
   return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
-    return self.readFile(self.getReactionsUrl(queryParams, filterParams));
+    if (filterParams.id.length > 100 || filterParams.participantId.length > 100) {
+      return self.sendPostRequest(self.getReactionsUrl(queryParams), filterParams);
+    } else {
+      return self.readFile(self.getReactionsUrl(queryParams, filterParams));
+    }
+
   }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
@@ -864,10 +875,19 @@ ServerConnector.getAliases = function (params) {
   if (params.ids === undefined) {
     params.ids = [];
   }
+  if (params.includedCompartmentIds === undefined) {
+    params.includedCompartmentIds = [];
+  }
+  if (params.excludedCompartmentIds === undefined) {
+    params.excludedCompartmentIds = [];
+  }
   var filterParams = {
     id: params.ids,
     columns: params.columns,
     type: params.type,
+    excludedCompartmentIds: params.excludedCompartmentIds,
+    includedCompartmentIds: params.includedCompartmentIds,
+
   };
   return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
diff --git a/frontend-js/src/main/js/gui/GuiMessageError.js b/frontend-js/src/main/js/gui/GuiMessageError.js
new file mode 100644
index 0000000000000000000000000000000000000000..52ccf03be23abafbcad02be87411e6aeea94734d
--- /dev/null
+++ b/frontend-js/src/main/js/gui/GuiMessageError.js
@@ -0,0 +1,15 @@
+"use strict";
+
+/* exported logger */
+
+var logger = require('../logger');
+
+function GuiMessageError(message) {
+  this.message = message;
+  this.stack = (new Error()).stack;
+}
+
+GuiMessageError.prototype = Object.create(Error.prototype);
+GuiMessageError.prototype.constructor = GuiMessageError;
+
+module.exports = GuiMessageError;
diff --git a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js
new file mode 100644
index 0000000000000000000000000000000000000000..c55f8063bcd6e589b72962ebd8e3cb77c07a7680
--- /dev/null
+++ b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js
@@ -0,0 +1,445 @@
+"use strict";
+
+/* exported logger */
+
+var Panel = require('../Panel');
+
+var GuiConnector = require('../../GuiConnector');
+var logger = require('../../logger');
+var Functions = require('../../Functions');
+var DualListbox = require('dual-listbox').DualListbox;
+var Promise = require("bluebird");
+
+function AbstractExportPanel(params) {
+  params.scrollable = true;
+  Panel.call(this, params);
+
+}
+
+AbstractExportPanel.prototype = Object.create(Panel.prototype);
+AbstractExportPanel.prototype.constructor = AbstractExportPanel;
+
+AbstractExportPanel.prototype.init = function() {
+
+};
+
+function compareSimple(val1, val2) {
+  if (val1 < val2) {
+    return -1;
+  } else if (val1 > val2) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+AbstractExportPanel.prototype._createMiriamTypeDiv = function(annotations) {
+  var self = this;
+  var typeDiv = Functions.createElement({
+    type : "div",
+    name : "miriamSelectDiv",
+    className : "minerva-export-dual-listbox-container",
+  });
+  typeDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : " Annotations:",
+  }));
+
+  var selectElement = Functions.createElement({
+    type : "select",
+    className : "minerva-multi-select",
+  });
+  typeDiv.appendChild(selectElement);
+
+  function compare(entry1, entry2) {
+    if ((entry1.count === 0 && entry2.count === 0) || (entry1.count !== 0 && entry2.count !== 0)) {
+      return compareSimple(entry1.miriamType.getCommonName(), entry2.miriamType.getCommonName());
+    } else {
+      return compareSimple(-entry1.count, -entry2.count);
+    }
+  }
+  annotations.sort(compare);
+
+  for (var i = 0; i < annotations.length; i++) {
+    var miriamType = annotations[i].miriamType;
+    var count = annotations[i].count;
+
+    var option = new Option();
+    option.value = miriamType.getName();
+    if (count > 0) {
+      option.innerHTML = "<div class='minerva-multi-select-special'>" + miriamType.getCommonName() + " (" + count
+          + ")</div>";
+    } else {
+      option.innerHTML = "<div >" + miriamType.getCommonName() + "</div>";
+    }
+    selectElement.appendChild(option);
+  }
+
+  self.setMiriamTypesDualListbox(self.createDualListbox(selectElement));
+  return typeDiv;
+};
+
+AbstractExportPanel.prototype.createDualListbox = function(selectElement) {
+  return new DualListbox(selectElement, {
+    availableTitle : 'Available',
+    selectedTitle : 'Used',
+    addButtonText : '>',
+    removeButtonText : '<',
+    addAllButtonText : '>>',
+    removeAllButtonText : '<<'
+  });
+};
+
+AbstractExportPanel.prototype._createSelectTypeDiv = function(elementTypes) {
+  var typeDiv = Functions.createElement({
+    type : "div",
+    name : "typeSelectDiv",
+  });
+  typeDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : " TYPE:",
+  }));
+  var choicesContainer = Functions.createElement({
+    type : "ul",
+    className : "minerva-checkbox-grid"
+  });
+  typeDiv.appendChild(choicesContainer);
+  for (var i = 0; i < elementTypes.length; i++) {
+    var elementType = elementTypes[i];
+    var row = Functions.createElement({
+      type : "li",
+      content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + elementType + "\" value=\""
+          + elementType + "\" />" + elementType + "</label></div>"
+    });
+    choicesContainer.appendChild(row);
+  }
+  choicesContainer.appendChild(Functions.createElement({
+    type : "li",
+    content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>"
+  }));
+  return typeDiv;
+};
+
+AbstractExportPanel.prototype.getSelectedTypes = function() {
+  var self = this;
+
+  var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0];
+  var result = [];
+  var selectedAll = false;
+  $(":checked", $(div)).each(function(index, element) {
+    if (element.value === "ALL") {
+      selectedAll = true;
+    }
+    result.push(element.value);
+  });
+  if (selectedAll) {
+    return ServerConnector.getConfiguration().then(function(configuration) {
+      return configuration.getElementTypes();
+    });
+  }
+
+  return Promise.resolve(result);
+};
+
+AbstractExportPanel.prototype.setMiriamTypesDualListbox = function(dualListbox) {
+  this._miriamTypesDualListbox = dualListbox;
+};
+AbstractExportPanel.prototype.getMiriamTypesDualListbox = function() {
+  return this._miriamTypesDualListbox;
+};
+
+AbstractExportPanel.prototype._createSelectColumnDiv = function(columnTypes) {
+  var columnDiv = Functions.createElement({
+    type : "div",
+    name : "columnSelectDiv",
+  });
+  columnDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : " COLUMN:",
+  }));
+  var choicesContainer = Functions.createElement({
+    type : "ul",
+    className : "minerva-checkbox-grid"
+  });
+
+  columnDiv.appendChild(choicesContainer);
+  for (var i = 0; i < columnTypes.length; i++) {
+    var columnType = columnTypes[i];
+    var row = Functions.createElement({
+      type : "li",
+      content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"column_" + columnType.columnName
+          + "\" value=\"" + columnType.columnName + "\" />" + columnType.name + "</label></div>"
+    });
+    choicesContainer.appendChild(row);
+  }
+  choicesContainer.appendChild(Functions.createElement({
+    type : "li",
+    content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>"
+  }));
+  return columnDiv;
+};
+
+AbstractExportPanel.prototype.getSelectedMiriamTypes = function() {
+  var self = this;
+  return ServerConnector.getConfiguration().then(function(configuration) {
+    var selected = self.getMiriamTypesDualListbox().selected;
+    var result = [];
+    for (var i = 0; i < selected.length; i++) {
+      var miriamType = configuration.getMiriamTypeByName(selected[i].dataset.id);
+      result.push(miriamType);
+    }
+    return result;
+  });
+};
+
+AbstractExportPanel.prototype.getSelectedColumns = function() {
+  var self = this;
+
+  var div = $("div[name='columnSelectDiv']", $(self.getElement()))[0];
+  var selectedColumnMap = [];
+  var selectedAll = false;
+  $(":checked", $(div)).each(function(index, element) {
+    if (element.value === "ALL") {
+      selectedAll = true;
+    }
+    selectedColumnMap[element.value] = true;
+  });
+  var columnTypes = self.getAllColumns();
+
+  if (selectedAll) {
+    return Promise.resolve(columnTypes);
+  }
+
+  var result = [];
+
+  for (var i = 0; i < columnTypes.length; i++) {
+    var columnType = columnTypes[i];
+    if (selectedColumnMap[columnType.columnName] === true) {
+      result.push(columnType);
+    }
+  }
+  return Promise.resolve(result);
+};
+
+AbstractExportPanel.prototype._getCompartmentNames = function() {
+  var self = this;
+  var compartments = [];
+  return self._getAllCompartments().then(function(result) {
+
+    var addedNames = [];
+    for (var i = 0; i < result.length; i++) {
+      if (addedNames[result[i].getName()] === undefined) {
+        compartments.push(result[i].getName());
+        addedNames[result[i].getName()] = true;
+      }
+    }
+    compartments.sort(compareSimple);
+    return compartments;
+  });
+};
+
+AbstractExportPanel.prototype.getModels = function() {
+  var self = this;
+  var models = [ self.getProject().getModel() ];
+  for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) {
+    models.push(self.getProject().getModel().getSubmodels()[i]);
+  }
+  return models;
+};
+
+AbstractExportPanel.prototype._getAllCompartments = function() {
+  var self = this;
+  var compartments = [];
+
+  var models = self.getModels();
+
+  var promises = [];
+  for (var i = 0; i < models.length; i++) {
+    promises.push(models[i].getCompartments());
+  }
+
+  return Promise.all(promises).then(function(result) {
+    for (var i = 0; i < result.length; i++) {
+      var modelCompartments = result[i];
+      for (var j = 0; j < modelCompartments.length; j++) {
+        compartments.push(modelCompartments[j]);
+      }
+    }
+    return compartments;
+  });
+};
+
+AbstractExportPanel.prototype._createDownloadButton = function() {
+  var self = this;
+  var downloadDiv = Functions.createElement({
+    type : "div",
+    name : "downloadDiv",
+    style : "clear:both; padding: 10px;",
+  });
+  var button = Functions.createElement({
+    type : "button",
+    name : "downloadButton",
+    content : " Download",
+    onclick : function() {
+      GuiConnector.showProcessing();
+      return self.createResponseString().then(function(result) {
+        var blob = new Blob([ result ], {
+          type : "text/plain;charset=utf-8"
+        });
+        var FileSaver = require("file-saver");
+        return FileSaver.saveAs(blob, self.getSaveFilename());
+      }).then(function() {
+        GuiConnector.hideProcessing();
+      }, function(error) {
+        GuiConnector.hideProcessing();
+        GuiConnector.alert(error);
+      });
+    },
+  });
+  downloadDiv.appendChild(button);
+
+  return downloadDiv;
+};
+
+AbstractExportPanel.prototype.getSaveFilename = function() {
+  var self = this;
+  return self.getProject().getProjectId() + "-" + self.getPanelName() + ".txt";
+};
+
+AbstractExportPanel.prototype._createSelectIncludedCompartmentDiv = function() {
+  var self = this;
+  var typeDiv = Functions.createElement({
+    type : "div",
+    name : "includedCompartmentSelectDiv",
+    className : "minerva-export-dual-listbox-container",
+  });
+  typeDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : " Included compartment/pathways:",
+  }));
+
+  return self._getCompartmentNames().then(function(compartmentNames) {
+
+    var selectElement = Functions.createElement({
+      type : "select",
+      className : "minerva-multi-select",
+    });
+    typeDiv.appendChild(selectElement);
+
+    for (var i = 0; i < compartmentNames.length; i++) {
+      var name = compartmentNames[i];
+
+      var option = new Option();
+      option.value = name;
+      option.innerHTML = "<div >" + name + "</div>";
+      selectElement.appendChild(option);
+    }
+    self.setIncludedCompartmentsDualListbox(self.createDualListbox(selectElement));
+    return typeDiv;
+  });
+};
+
+AbstractExportPanel.prototype._createSelectExcludedCompartmentDiv = function() {
+  var self = this;
+  var typeDiv = Functions.createElement({
+    type : "div",
+    name : "excludedCompartmentSelectDiv",
+    className : "minerva-export-dual-listbox-container",
+  });
+  typeDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : " Excluded compartment/pathways:",
+  }));
+
+  return self._getCompartmentNames().then(function(compartmentNames) {
+
+    var selectElement = Functions.createElement({
+      type : "select",
+      className : "minerva-multi-select",
+    });
+    typeDiv.appendChild(selectElement);
+
+    for (var i = 0; i < compartmentNames.length; i++) {
+      var name = compartmentNames[i];
+
+      var option = new Option();
+      option.value = name;
+      option.innerHTML = "<div >" + name + "</div>";
+      selectElement.appendChild(option);
+    }
+    self.setExcludedCompartmentsDualListbox(self.createDualListbox(selectElement));
+    return typeDiv;
+  });
+};
+
+AbstractExportPanel.prototype.setIncludedCompartmentsDualListbox = function(dualListbox) {
+  this._includedCompartmentsDualListbox = dualListbox;
+};
+AbstractExportPanel.prototype.getIncludedCompartmentsDualListbox = function() {
+  return this._includedCompartmentsDualListbox;
+};
+
+AbstractExportPanel.prototype.getSelectedIncludedCompartments = function() {
+  var self = this;
+  var list = self.getIncludedCompartmentsDualListbox().selected;
+  var names = [];
+  var result = [];
+  for (var i = 0; i < list.length; i++) {
+    var element = list[i];
+    names[element.dataset.id] = true;
+  }
+  return self._getAllCompartments().then(function(compartments) {
+    for (var i = 0; i < compartments.length; i++) {
+      var compartment = compartments[i];
+      if (names[compartment.getName()]) {
+        result.push(compartment);
+      }
+    }
+    return result;
+  });
+};
+
+AbstractExportPanel.prototype.setExcludedCompartmentsDualListbox = function(dualListbox) {
+  this._excludedCompartmentsDualListbox = dualListbox;
+};
+AbstractExportPanel.prototype.getExcludedCompartmentsDualListbox = function() {
+  return this._excludedCompartmentsDualListbox;
+};
+
+AbstractExportPanel.prototype.getSelectedExcludedCompartments = function() {
+  var self = this;
+  var list = self.getExcludedCompartmentsDualListbox().selected;
+  var names = [];
+  var result = [];
+  for (var i = 0; i < list.length; i++) {
+    var element = list[i];
+    names[element.dataset.id] = true;
+  }
+  return self._getAllCompartments().then(function(compartments) {
+    for (var i = 0; i < compartments.length; i++) {
+      var compartment = compartments[i];
+      if (names[compartment.getName()]) {
+        result.push(compartment);
+      }
+    }
+    return result;
+  });
+};
+
+AbstractExportPanel.prototype.createResponseHeader = function(columns, miriamTypes) {
+  var stringBuilder = [];
+  var i;
+  for (i = 0; i < columns.length; i++) {
+    var column = columns[i];
+    stringBuilder.push(column.name);
+  }
+  for (i = 0; i < miriamTypes.length; i++) {
+    var miriamType = miriamTypes[i];
+    stringBuilder.push(miriamType.getCommonName());
+  }
+  var result = stringBuilder.join("\t");
+  return result;
+
+};
+
+module.exports = AbstractExportPanel;
diff --git a/frontend-js/src/main/js/gui/export/ElementExportPanel.js b/frontend-js/src/main/js/gui/export/ElementExportPanel.js
index c38301e725da2fb0b0c9198502dcf3afd031cc4f..59868a6b1ba66ad71ef3c8ae2247ff815f027c4b 100644
--- a/frontend-js/src/main/js/gui/export/ElementExportPanel.js
+++ b/frontend-js/src/main/js/gui/export/ElementExportPanel.js
@@ -2,40 +2,21 @@
 
 /* exported logger */
 
-var Panel = require('../Panel');
+var AbstractExportPanel = require('./AbstractExportPanel');
+var GuiMessageError = require('../GuiMessageError');
 
-var DualListbox = require('dual-listbox').DualListbox;
 var logger = require('../../logger');
-var Functions = require('../../Functions');
 
 var Promise = require("bluebird");
 
 function ElementExportPanel(params) {
   params.panelName = "elementExport";
-  params.scrollable = true;
-  Panel.call(this, params);
-
-  var self = this;
-  self._createGui();
+  AbstractExportPanel.call(this, params);
 }
 
-ElementExportPanel.prototype = Object.create(Panel.prototype);
+ElementExportPanel.prototype = Object.create(AbstractExportPanel.prototype);
 ElementExportPanel.prototype.constructor = ElementExportPanel;
 
-function compareSimple(val1, val2) {
-  if (val1 < val2) {
-    return -1;
-  } else if (val1 > val2) {
-    return 1;
-  } else {
-    return 0;
-  }
-}
-
-ElementExportPanel.prototype._createGui = function() {
-
-};
-
 ElementExportPanel.prototype.init = function() {
   var self = this;
   var element = self.getElement();
@@ -44,148 +25,29 @@ ElementExportPanel.prototype.init = function() {
     configuration = result;
     var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes());
     element.appendChild(typeDiv);
-    element.appendChild(self._createSelectColumnDiv());
+    element.appendChild(self._createSelectColumnDiv(self.getAllColumns()));
     return ServerConnector.getProjectStatistics(self.getProject().getProjectId());
   }).then(function(statistics) {
-    var miriamDiv = self._createMiriamTypeDiv(statistics);
-    element.appendChild(miriamDiv);
-    self.setMiriamTypesDualListbox(new DualListbox("#miriamTypeSelect", {
-      availableTitle : 'Available',
-      selectedTitle : 'Used',
-      addButtonText : '>',
-      removeButtonText : '<',
-      addAllButtonText : '>>',
-      removeAllButtonText : '<<'
-    }));
-  }).then(function() {
+    return self._createMiriamTypeDiv(statistics.getElementAnnotations());
+  }).then(function(div) {
+    element.appendChild(div);
     return self._createSelectIncludedCompartmentDiv();
-  }).then(function(selectIncludedCompartmentDiv) {
-    element.appendChild(selectIncludedCompartmentDiv);
-    self.setIncludedCompartmentsDualListbox(new DualListbox("#includedCompartmentsSelect", {
-      availableTitle : 'Available',
-      selectedTitle : 'Used',
-      addButtonText : '>',
-      removeButtonText : '<',
-      addAllButtonText : '>>',
-      removeAllButtonText : '<<'
-    }));
+  }).then(function(div) {
+    element.appendChild(div);
     return self._createSelectExcludedCompartmentDiv();
-  }).then(function(selectExcludedCompartmentDiv) {
-    element.appendChild(selectExcludedCompartmentDiv);
-    self.setExcludedCompartmentsDualListbox(new DualListbox("#excludedCompartmentsSelect", {
-      availableTitle : 'Available',
-      selectedTitle : 'Used',
-      addButtonText : '>',
-      removeButtonText : '<',
-      addAllButtonText : '>>',
-      removeAllButtonText : '<<'
-    }));
+  }).then(function(div) {
+    element.appendChild(div);
     element.appendChild(self._createDownloadButton());
   }).then(function() {
     $(window).trigger('resize');
   });
 };
 
-ElementExportPanel.prototype._createSelectTypeDiv = function(elementTypes) {
-  var typeDiv = Functions.createElement({
-    type : "div",
-    name : "typeSelectDiv",
-  });
-  typeDiv.appendChild(Functions.createElement({
-    type : "h4",
-    content : " TYPE:",
-  }));
-  var choicesContainer = Functions.createElement({
-    type : "ul",
-    className : "minerva-checkbox-grid"
-  });
-  typeDiv.appendChild(choicesContainer);
-  for (var i = 0; i < elementTypes.length; i++) {
-    var elementType = elementTypes[i];
-    var row = Functions.createElement({
-      type : "li",
-      content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + elementType + "\" value=\""
-          + elementType + "\" />" + elementType + "</label></div>"
-    });
-    choicesContainer.appendChild(row);
-  }
-  choicesContainer.appendChild(Functions.createElement({
-    type : "li",
-    content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>"
-  }));
-  return typeDiv;
-};
-
-ElementExportPanel.prototype._createMiriamTypeDiv = function(statistics) {
-  var typeDiv = Functions.createElement({
-    type : "div",
-    name : "miriamSelectDiv",
-    className : "minerva-export-dual-listbox-container",
-  });
-  typeDiv.appendChild(Functions.createElement({
-    type : "h4",
-    content : " Annotations:",
-  }));
-
-  var annotations = statistics.getElementAnnotations();
-
-  var selectElement = Functions.createElement({
-    type : "select",
-    className : "minerva-multi-select",
-    id : "miriamTypeSelect",
-  });
-  typeDiv.appendChild(selectElement);
-
-  function compare(entry1, entry2) {
-    if ((entry1.count === 0 && entry2.count === 0) || (entry1.count !== 0 && entry2.count !== 0)) {
-      return compareSimple(entry1.miriamType.getCommonName(), entry2.miriamType.getCommonName());
-    } else {
-      return compareSimple(-entry1.count, -entry2.count);
-    }
-  }
-  annotations.sort(compare);
-
-  for (var i = 0; i < annotations.length; i++) {
-    var miriamType = annotations[i].miriamType;
-    var count = annotations[i].count;
-
-    var option = new Option();
-    option.value = miriamType.getName();
-    if (count > 0) {
-      option.innerHTML = "<div class='minerva-multi-select-special'>" + miriamType.getCommonName() + " (" + count
-          + ")</div>";
-    } else {
-      option.innerHTML = "<div >" + miriamType.getCommonName() + "</div>";
-    }
-    selectElement.appendChild(option);
-  }
-  return typeDiv;
-};
-
-ElementExportPanel.prototype._createDownloadButton = function() {
-  var self = this;
-  var downloadDiv = Functions.createElement({
-    type : "div",
-    name : "downloadDiv",
-    style : "clear:both; padding: 10px;",
-  });
-  var button = Functions.createElement({
-    type : "button",
-    content : " Download",
-    onclick : function() {
-      return self.createResponseString().then(function(result) {
-        logger.info(result);
-      });
-    },
-  });
-  downloadDiv.appendChild(button);
-
-  return downloadDiv;
-};
-
 ElementExportPanel.prototype.createResponseString = function() {
   var self = this;
-  var types;
+  var types, miriamTypes;
+  var includedCompartmentIds = [];
+  var excludedCompartmentIds = [];
   var models = [ self.getProject().getModel() ];
   for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) {
     models.push(self.getProject().getModel().getSubmodels()[i]);
@@ -193,12 +55,28 @@ ElementExportPanel.prototype.createResponseString = function() {
 
   var elements = [];
   return self.getSelectedTypes().then(function(result) {
+    if (result.length === 0) {
+      return Promise.reject(new GuiMessageError("You must select at least one type"));
+    }
     types = result;
+    return self.getSelectedIncludedCompartments();
+  }).then(function(result) {
+    result.forEach(function(compartment) {
+      includedCompartmentIds.push(compartment.getId());
+    });
+    return self.getSelectedExcludedCompartments();
+  }).then(function(result) {
+    result.forEach(function(compartment) {
+      excludedCompartmentIds.push(compartment.getId());
+    });
+
     var promises = [];
     for (var i = 0; i < models.length; i++) {
       promises.push(models[i].getAliases({
         type : types,
         complete : true,
+        includedCompartmentIds : includedCompartmentIds,
+        excludedCompartmentIds : excludedCompartmentIds,
       }));
     }
     return Promise.all(promises);
@@ -208,183 +86,53 @@ ElementExportPanel.prototype.createResponseString = function() {
         elements.push(aliasesByModel[i][j]);
       }
     }
+
+    return self.getSelectedMiriamTypes();
+  }).then(function(result) {
+    miriamTypes = result;
     return self.getSelectedColumns();
   }).then(function(selectedColumns) {
+    if (selectedColumns.length === 0) {
+      return Promise.reject(new GuiMessageError("You must select at least one column"));
+    }
 
     var rows = [];
-    rows.push(self.createResponseHeader(selectedColumns));
+    rows.push(self.createResponseHeader(selectedColumns, miriamTypes));
     for (var i = 0; i < elements.length; i++) {
-      rows.push(self.createResponseRow(elements[i], selectedColumns));
+      rows.push(self.createResponseRow(elements[i], selectedColumns, miriamTypes));
     }
     return rows.join("\n");
   });
 };
 
-ElementExportPanel.prototype.createResponseHeader = function(columns) {
+ElementExportPanel.prototype.createResponseRow = function(alias, columns, miriamTypes) {
   var stringBuilder = [];
-  for (var i = 0; i < columns.length; i++) {
+  var i, value;
+  for (i = 0; i < columns.length; i++) {
     var column = columns[i];
-    stringBuilder.push(column.name);
-  }
-  var result = stringBuilder.join("\t");
-  return result;
-
-};
-
-ElementExportPanel.prototype.createResponseRow = function(alias, columns) {
-  var stringBuilder = [];
-  for (var i = 0; i < columns.length; i++) {
-    var column = columns[i];
-    var value = alias[column.method]();
+    value = alias[column.method]();
     if (column.formatFunction !== undefined) {
       value = column.formatFunction(value);
     }
-    stringBuilder.push(value);
-
-  }
-  var result = stringBuilder.join("\t");
-  return result;
-};
-
-ElementExportPanel.prototype._createSelectIncludedCompartmentDiv = function() {
-  var self = this;
-  var typeDiv = Functions.createElement({
-    type : "div",
-    name : "includedCompartmentSelectDiv",
-    className : "minerva-export-dual-listbox-container",
-  });
-  typeDiv.appendChild(Functions.createElement({
-    type : "h4",
-    content : " Included compartment/pathways:",
-  }));
-
-  return self._getCompartmentNames().then(function(compartmentNames) {
-
-    var selectElement = Functions.createElement({
-      type : "select",
-      className : "minerva-multi-select",
-      id : "includedCompartmentsSelect",
-    });
-    typeDiv.appendChild(selectElement);
-
-    for (var i = 0; i < compartmentNames.length; i++) {
-      var name = compartmentNames[i];
-
-      var option = new Option();
-      option.value = name;
-      option.innerHTML = "<div >" + name + "</div>";
-      selectElement.appendChild(option);
-    }
-    return typeDiv;
-  });
-};
-
-ElementExportPanel.prototype._createSelectExcludedCompartmentDiv = function() {
-  var self = this;
-  var typeDiv = Functions.createElement({
-    type : "div",
-    name : "excludedCompartmentSelectDiv",
-    className : "minerva-export-dual-listbox-container",
-  });
-  typeDiv.appendChild(Functions.createElement({
-    type : "h4",
-    content : " Excluded compartment/pathways:",
-  }));
-
-  return self._getCompartmentNames().then(function(compartmentNames) {
-
-    var selectElement = Functions.createElement({
-      type : "select",
-      className : "minerva-multi-select",
-      id : "excludedCompartmentsSelect",
-    });
-    typeDiv.appendChild(selectElement);
-
-    for (var i = 0; i < compartmentNames.length; i++) {
-      var name = compartmentNames[i];
-
-      var option = new Option();
-      option.value = name;
-      option.innerHTML = "<div >" + name + "</div>";
-      selectElement.appendChild(option);
+    if (value instanceof String || typeof value === "string") {
+      value = value.replace(/[\n\r]/g, ' ');
     }
-    return typeDiv;
-  });
-};
-
-ElementExportPanel.prototype._getAllCompartments = function() {
-  var self = this;
-  var compartments = [];
-  var i;
-
-  var models = [ self.getProject().getModel() ];
-  for (i = 0; i < self.getProject().getModel().getSubmodels().length; i++) {
-    models.push(self.getProject().getModel().getSubmodels()[i]);
-  }
-
-  var promises = [];
-  for (i = 0; i < models.length; i++) {
-    promises.push(models[i].getCompartments());
+    stringBuilder.push(value);
   }
-
-  return Promise.all(promises).then(function(result) {
-    for (var i = 0; i < result.length; i++) {
-      var modelCompartments = result[i];
-      for (var j = 0; j < modelCompartments.length; j++) {
-        compartments.push(modelCompartments[j]);
+  for (i = 0; i < miriamTypes.length; i++) {
+    value = "";
+    var miriamType = miriamTypes[i];
+    var references = alias.getReferences();
+    for (var j = 0; j < references.length; j++) {
+      var reference = references[j];
+      if (reference.getType() === miriamType.getName()) {
+        value += reference.getResource() + ",";
       }
     }
-    return compartments;
-  });
-};
-ElementExportPanel.prototype._getCompartmentNames = function() {
-  var self = this;
-  var compartments = [];
-  return self._getAllCompartments().then(function(result) {
-
-    var addedNames = [];
-    for (var i = 0; i < result.length; i++) {
-      if (addedNames[result[i].getName()] === undefined) {
-        compartments.push(result[i].getName());
-        addedNames[result[i].getName()] = true;
-      }
-    }
-    compartments.sort(compareSimple);
-    return compartments;
-  });
-};
-
-ElementExportPanel.prototype._createSelectColumnDiv = function() {
-  var self = this;
-  var columnDiv = Functions.createElement({
-    type : "div",
-    name : "columnSelectDiv",
-  });
-  columnDiv.appendChild(Functions.createElement({
-    type : "h4",
-    content : " COLUMN:",
-  }));
-  var choicesContainer = Functions.createElement({
-    type : "ul",
-    className : "minerva-checkbox-grid"
-  });
-  var columnTypes = self.getAllColumns();
-
-  columnDiv.appendChild(choicesContainer);
-  for (var i = 0; i < columnTypes.length; i++) {
-    var columnType = columnTypes[i];
-    var row = Functions.createElement({
-      type : "li",
-      content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"column_" + columnType.columnName
-          + "\" value=\"" + columnType.columnName + "\" />" + columnType.name + "</label></div>"
-    });
-    choicesContainer.appendChild(row);
+    stringBuilder.push(value);
   }
-  choicesContainer.appendChild(Functions.createElement({
-    type : "li",
-    content : "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"ALL\" value=\"ALL\" />ALL</label></div>"
-  }));
-  return columnDiv;
+  var result = stringBuilder.join("\t");
+  return result;
 };
 
 ElementExportPanel.prototype.getAllColumns = function() {
@@ -467,128 +215,5 @@ ElementExportPanel.prototype.getAllColumns = function() {
   }, ];
 };
 
-ElementExportPanel.prototype.getSelectedTypes = function() {
-  var self = this;
-
-  var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0];
-  var result = [];
-  var selectedAll = false;
-  $(":checked", $(div)).each(function(index, element) {
-    if (element.value === "ALL") {
-      selectedAll = true;
-    }
-    result.push(element.value);
-  });
-  if (selectedAll) {
-    return ServerConnector.getConfiguration().then(function(configuration) {
-      return configuration.getElementTypes();
-    });
-  }
-
-  return Promise.resolve(result);
-};
-
-ElementExportPanel.prototype.setMiriamTypesDualListbox = function(dualListbox) {
-  this._miriamTypesDualListbox = dualListbox;
-};
-ElementExportPanel.prototype.getMiriamTypesDualListbox = function() {
-  return this._miriamTypesDualListbox;
-};
-
-ElementExportPanel.prototype.setIncludedCompartmentsDualListbox = function(dualListbox) {
-  this._includedCompartmentsDualListbox = dualListbox;
-};
-ElementExportPanel.prototype.getIncludedCompartmentsDualListbox = function() {
-  return this._includedCompartmentsDualListbox;
-};
-
-ElementExportPanel.prototype.getSelectedIncludedCompartments = function() {
-  var self = this;
-  var list = self.getIncludedCompartmentsDualListbox().selected;
-  var names = [];
-  var result = [];
-  for (var i = 0; i < list.length; i++) {
-    var element = list[i];
-    names[element.dataset.id] = true;
-  }
-  return self._getAllCompartments().then(function(compartments) {
-    for (var i = 0; i < compartments.length; i++) {
-      var compartment = compartments[i];
-      if (names[compartment.getName()]) {
-        result.push(compartment);
-      }
-    }
-    return result;
-  });
-};
-
-ElementExportPanel.prototype.setExcludedCompartmentsDualListbox = function(dualListbox) {
-  this._excludedCompartmentsDualListbox = dualListbox;
-};
-ElementExportPanel.prototype.getExcludedCompartmentsDualListbox = function() {
-  return this._excludedCompartmentsDualListbox;
-};
-
-ElementExportPanel.prototype.getSelectedExcludedCompartments = function() {
-  var self = this;
-  var list = self.getExcludedCompartmentsDualListbox().selected;
-  var names = [];
-  var result = [];
-  for (var i = 0; i < list.length; i++) {
-    var element = list[i];
-    names[element.dataset.id] = true;
-  }
-  return self._getAllCompartments().then(function(compartments) {
-    for (var i = 0; i < compartments.length; i++) {
-      var compartment = compartments[i];
-      if (names[compartment.getName()]) {
-        result.push(compartment);
-      }
-    }
-    return result;
-  });
-};
-
-ElementExportPanel.prototype.getSelectedMiriamTypes = function() {
-  var self = this;
-  return ServerConnector.getConfiguration().then(function(configuration) {
-    var selected = self.getMiriamTypesDualListbox().selected;
-    var result = [];
-    for (var i = 0; i < selected.length; i++) {
-      var miriamType = configuration.getMiriamTypeByName(selected[i].dataset.id);
-      result.push(miriamType);
-    }
-    return result;
-  });
-};
-
-ElementExportPanel.prototype.getSelectedColumns = function() {
-  var self = this;
-
-  var div = $("div[name='columnSelectDiv']", $(self.getElement()))[0];
-  var selectedColumnMap = [];
-  var selectedAll = false;
-  $(":checked", $(div)).each(function(index, element) {
-    if (element.value === "ALL") {
-      selectedAll = true;
-    }
-    selectedColumnMap[element.value] = true;
-  });
-  var columnTypes = self.getAllColumns();
-
-  if (selectedAll) {
-    return Promise.resolve(columnTypes);
-  }
-
-  var result = [];
-
-  for (var i = 0; i < columnTypes.length; i++) {
-    var columnType = columnTypes[i];
-    if (selectedColumnMap[columnType.columnName] === true) {
-      result.push(columnType);
-    }
-  }
-  return Promise.resolve(result);
-};
 
 module.exports = ElementExportPanel;
diff --git a/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js b/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js
index 6bf41a4246b1695a8bedde1007e23741acf6ad4c..4e2f7103a850a8a55e62ec42efbb08da47c9ba5c 100644
--- a/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js
+++ b/frontend-js/src/main/js/gui/export/GraphicsExportPanel.js
@@ -2,21 +2,156 @@
 
 /* exported logger */
 
-var Panel = require('../Panel');
+var AbstractExportPanel = require('./AbstractExportPanel');
+var Functions = require('../../Functions');
 
 var logger = require('../../logger');
 
 function GraphicsExportPanel(params) {
-  params.panelName = "elementExport";
-  params.scrollable = true;
-  Panel.call(this, params);
+  params.panelName = "graphicsExport";
+  AbstractExportPanel.call(this, params);
 }
 
-GraphicsExportPanel.prototype = Object.create(Panel.prototype);
+GraphicsExportPanel.prototype = Object.create(AbstractExportPanel.prototype);
 GraphicsExportPanel.prototype.constructor = GraphicsExportPanel;
 
 GraphicsExportPanel.prototype.init = function() {
+  var self = this;
+  var element = self.getElement();
+  var configuration;
+  element.appendChild(self._createSelectProjectDiv());
+  var configuration;
+  return ServerConnector.getConfiguration().then(function(result) {
+    configuration = result;
+    element.appendChild(self._createSelectGraphicsFormatDiv(configuration.getImageConverters()));
+    element.appendChild(self._createDownloadButton());
+  }).then(function() {
+    $(window).trigger('resize');
+  });
+};
+
+GraphicsExportPanel.prototype._createSelectProjectDiv = function(annotations) {
+  var self = this;
+  var project = self.getProject();
+  var typeDiv = Functions.createElement({
+    type : "div",
+    name : "modelSelectDiv",
+  });
+  typeDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : "(Sub)map:",
+  }));
+
+  var choicesContainer = Functions.createElement({
+    type : "ul",
+  });
+  typeDiv.appendChild(choicesContainer);
+
+  var models = self.getModels();
+
+  for (var i = 0; i < models.length; i++) {
+    var model = models[i];
+    var checkedString = "";
+    if (i === 0) {
+      checkedString = ' checked="checked" ';
+    }
+    var row = Functions.createElement({
+      type : "li",
+      content : '<div><label> <input type="radio" name="model" value="' + model.getId() + '"' + checkedString + '/>'
+          + model.getName() + '</label></div>',
+    });
+    choicesContainer.appendChild(row);
+  }
+
+  return typeDiv;
+};
+
+GraphicsExportPanel.prototype._createSelectGraphicsFormatDiv = function(formats) {
+  var self = this;
+  var project = self.getProject();
+  var typeDiv = Functions.createElement({
+    type : "div",
+    name : "formatSelectDiv",
+  });
+  typeDiv.appendChild(Functions.createElement({
+    type : "h4",
+    content : "Format:",
+  }));
+
+  var choicesContainer = Functions.createElement({
+    type : "ul",
+  });
+  typeDiv.appendChild(choicesContainer);
+
+  for (var i = 0; i < formats.length; i++) {
+    var format = formats[i];
+    var checkedString = "";
+    if (i === 0) {
+      checkedString = ' checked="checked" ';
+    }
+    var row = Functions.createElement({
+      type : "li",
+      content : '<div><label> <input type="radio" name="format" value="' + format.handler + '"' + checkedString + '/>'
+          + format.name + '</label></div>',
+    });
+    choicesContainer.appendChild(row);
+  }
+
+  return typeDiv;
+};
+
+GraphicsExportPanel.prototype.getSubmapId = function() {
+  var self = this;
+  var div = $("div[name='modelSelectDiv']", $(self.getElement()))[0];
+  var id = null;
+  $(":checked", $(div)).each(function(index, element) {
+    id = element.value;
+  });
+  return id;
+};
+GraphicsExportPanel.prototype.getFormatHandler = function() {
+  var self = this;
+  var div = $("div[name='formatSelectDiv']", $(self.getElement()))[0];
+  var format = null;
+  $(":checked", $(div)).each(function(index, element) {
+    format = element.value;
+  });
+  return format;
+};
+
+GraphicsExportPanel.prototype._createDownloadButton = function() {
+  var self = this;
+  var downloadDiv = Functions.createElement({
+    type : "div",
+    name : "downloadDiv",
+    style : "clear:both; padding: 10px;",
+  });
+  var button = Functions.createElement({
+    type : "button",
+    name : "downloadButton",
+    content : " Download",
+    onclick : function() {
+      var identifier = null;
+      var defaultOverlayName = "Network";
+      for (var i = 0; i < self.getProject().getModel().getLayouts().length; i++) {
+        var layout = self.getProject().getModel().getLayouts()[i];
+        if (identifier === null || layout.getName() === defaultOverlayName) {
+          identifier = layout.getId();
+        }
+      }
+
+      return ServerConnector.getImageDownloadUrl({
+        modelId : self.getSubmapId(),
+        backgroundOverlayId : identifier,
+        handlerClass : self.getFormatHandler(),
+      }).then(function(url) {
+        return self.downloadFile(url);
+      }).then(null, GuiConnector.alert);
+    },
+  });
+  downloadDiv.appendChild(button);
 
+  return downloadDiv;
 };
 
 module.exports = GraphicsExportPanel;
diff --git a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js
index 6f770c99ff870a433843a68a6208d5d8c7031689..d93fdebae2f51ca83c232a5cd181b5d0f5b342ad 100644
--- a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js
+++ b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js
@@ -2,22 +2,254 @@
 
 /* exported logger */
 
-var Panel = require('../Panel');
+var AbstractExportPanel = require('./AbstractExportPanel');
 
+var Promise = require("bluebird");
 var logger = require('../../logger');
+var GuiMessageError = require('../GuiMessageError');
 
-function NetworkExportPanel(params) {
-  params.panelName = "elementExport";
-  params.scrollable = true;
-  Panel.call(this, params);
 
+function NetworkExportPanel(params) {
+  params.panelName = "networkExport";
+  AbstractExportPanel.call(this, params);
 }
 
-NetworkExportPanel.prototype = Object.create(Panel.prototype);
+NetworkExportPanel.prototype = Object.create(AbstractExportPanel.prototype);
 NetworkExportPanel.prototype.constructor = NetworkExportPanel;
 
 NetworkExportPanel.prototype.init = function() {
 
+  var self = this;
+  var element = self.getElement();
+  var configuration;
+  return ServerConnector.getConfiguration().then(function(result) {
+    configuration = result;
+    var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes());
+    element.appendChild(typeDiv);
+    element.appendChild(self._createSelectColumnDiv(self.getAllColumns()));
+    return ServerConnector.getProjectStatistics(self.getProject().getProjectId());
+  }).then(function(statistics) {
+    return self._createMiriamTypeDiv(statistics.getReactionAnnotations());
+  }).then(function(div) {
+    element.appendChild(div);
+    return self._createSelectIncludedCompartmentDiv();
+  }).then(function(div) {
+    element.appendChild(div);
+    return self._createSelectExcludedCompartmentDiv();
+  }).then(function(div) {
+    element.appendChild(div);
+    element.appendChild(self._createDownloadButton());
+  }).then(function() {
+    $(window).trigger('resize');
+  });
+
+};
+
+NetworkExportPanel.prototype.getAllColumns = function() {
+  return [ {
+    "columnName" : "elements",
+    "method" : "getElements",
+    "name" : "Elements",
+    "formatFunction" : function(elements, reaction, elementIds) {
+      var stringBuilder = [];
+      var type;
+      var elementFormat = function(element) {
+        if (elementIds[element.getId()]) {
+          stringBuilder.push(type + ":" + element.getId());
+        }
+      };
+      type = "REACTANT";
+      reaction.getReactants().forEach(elementFormat);
+      type = "PRODUCT";
+      reaction.getProducts().forEach(elementFormat);
+      type = "MODIFIER";
+      reaction.getModifiers().forEach(elementFormat);
+
+      return stringBuilder.join(",");
+    },
+  }, {
+    "columnName" : "id",
+    "method" : "getId",
+    "name" : "Id",
+  }, {
+    "columnName" : "description",
+    "method" : "getDescription",
+    "name" : "Description",
+  }, {
+    "columnName" : "modelId",
+    "method" : "getModelId",
+    "name" : "Model",
+  }, {
+    "columnName" : "type",
+    "method" : "getType",
+    "name" : "Type",
+  }, {
+    "columnName" : "symbol",
+    "method" : "getSymbol",
+    "name" : "Symbol",
+  }, {
+    "columnName" : "abbreviation",
+    "method" : "getAbbreviation",
+    "name" : "Abbreviation",
+  }, {
+    "columnName" : "formula",
+    "method" : "getFormula",
+    "name" : "Formula",
+  }, {
+    "columnName" : "synonyms",
+    "method" : "getSynonyms",
+    "name" : "Synonyms",
+  }, {
+    "columnName" : "references",
+    "method" : "getReferences",
+    "name" : "References",
+    "formatFunction" : function(references) {
+      var stringBuilder = [];
+      for (var i = 0; i < references.length; i++) {
+        var reference = references[i];
+        stringBuilder.push(reference.getType() + ":" + reference.getResource());
+      }
+      return stringBuilder.join(",");
+    },
+  }, {
+    "columnName" : "reactionId",
+    "method" : "getReactionId",
+    "name" : "Element external id",
+  }, {
+    "columnName" : "mechanicalConfidenceScore",
+    "method" : "getMechanicalConfidenceScore",
+    "name" : "Mechanical Confidence Score",
+  }, {
+    "columnName" : "lowerBound",
+    "method" : "getLowerBound",
+    "name" : "Lower Bound",
+  }, {
+    "columnName" : "upperBound",
+    "method" : "getUpperBound",
+    "name" : "Upper Bound",
+  }, {
+    "columnName" : "geneProteinReaction",
+    "method" : "getGeneProteinReaction",
+    "name" : "Gene Protein Reaction",
+  }, {
+    "columnName" : "subsystem",
+    "method" : "getSubsystem",
+    "name" : "Subsystem",
+  }, ];
+};
+
+function matchReaction(reaction, elementIds) {
+  var count = 0;
+  reaction.getElements().forEach(function(element) {
+    if (elementIds[element.getId()]) {
+      count++;
+    }
+  });
+  return count > 1;
+}
+
+NetworkExportPanel.prototype.createResponseString = function() {
+  var self = this;
+  var types, miriamTypes;
+  var includedCompartmentIds = [];
+  var excludedCompartmentIds = [];
+  var models = [ self.getProject().getModel() ];
+  for (var i = 0; i < self.getProject().getModel().getSubmodels().length; i++) {
+    models.push(self.getProject().getModel().getSubmodels()[i]);
+  }
+
+  var elementIds = [];
+  var reactions = [];
+  return self.getSelectedTypes().then(function(result) {
+    if (result.length === 0) {
+      return Promise.reject(new GuiMessageError("You must select at least one type"));
+    }
+    types = result;
+    return self.getSelectedIncludedCompartments();
+  }).then(function(result) {
+    result.forEach(function(compartment) {
+      includedCompartmentIds.push(compartment.getId());
+    });
+    return self.getSelectedExcludedCompartments();
+  }).then(function(result) {
+    result.forEach(function(compartment) {
+      excludedCompartmentIds.push(compartment.getId());
+    });
+
+    var promises = [];
+    for (var i = 0; i < models.length; i++) {
+      promises.push(models[i].getAliases({
+        type : types,
+        complete : true,
+        includedCompartmentIds : includedCompartmentIds,
+        excludedCompartmentIds : excludedCompartmentIds,
+      }));
+    }
+    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++) {
+        elementIds[aliasesByModel[i][j].getId()] = true;
+      }
+    }
+    return Promise.all(promises);
+  }).then(function(reactionsByModel) {
+    for (var i = 0; i < models.length; i++) {
+      for (var j = 0; j < reactionsByModel[i].length; j++) {
+        var reaction = reactionsByModel[i][j];
+        if (matchReaction(reaction, elementIds)) {
+          reactions.push(reaction);
+        }
+      }
+    }
+    return self.getSelectedMiriamTypes();
+  }).then(function(result) {
+    miriamTypes = result;
+    return self.getSelectedColumns();
+  }).then(function(selectedColumns) {
+    if (selectedColumns.length === 0) {
+      return Promise.reject(new GuiMessageError("You must select at least one column"));
+    }
+
+    var rows = [];
+    rows.push(self.createResponseHeader(selectedColumns, miriamTypes));
+    for (var i = 0; i < reactions.length; i++) {
+      rows.push(self.createResponseRow(reactions[i], selectedColumns, miriamTypes, elementIds));
+    }
+    return rows.join("\n");
+  });
+};
+
+NetworkExportPanel.prototype.createResponseRow = function(reaction, columns, miriamTypes, elementIds) {
+  var stringBuilder = [];
+  var i, value;
+  for (i = 0; i < columns.length; i++) {
+    var column = columns[i];
+    value = reaction[column.method]();
+    if (column.formatFunction !== undefined) {
+      value = column.formatFunction(value, reaction, elementIds);
+    }
+    if (value instanceof String || typeof value === "string") {
+      value = value.replace(/[\n\r]/g, ' ');
+    }
+    stringBuilder.push(value);
+  }
+  for (i = 0; i < miriamTypes.length; i++) {
+    value = "";
+    var miriamType = miriamTypes[i];
+    var references = reaction.getReferences();
+    for (var j = 0; j < references.length; j++) {
+      var reference = references[j];
+      if (reference.getType() === miriamType.getName()) {
+        value += reference.getResource() + ",";
+      }
+    }
+    stringBuilder.push(value);
+  }
+  var result = stringBuilder.join("\t");
+  return result;
 };
 
 module.exports = NetworkExportPanel;
diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js
index fe059bcad1102b1473ec065ed0961fdd9d406226..2d921edb045e3224891e0b539096dec2c8102733 100644
--- a/frontend-js/src/main/js/map/data/MapModel.js
+++ b/frontend-js/src/main/js/map/data/MapModel.js
@@ -103,12 +103,15 @@ MapModel.prototype.getLayouts = function() {
 MapModel.prototype.getAliases = function(params) {
   var self = this;
   return ServerConnector.getAliases({
-    columns : "id,bounds,modelId",
+    columns : "id,modelId",
     type : params.type,
     modelId : self.getId(),
-  }).then(function(lightAliases){
+    includedCompartmentIds : params.includedCompartmentIds,
+    excludedCompartmentIds : params.excludedCompartmentIds,
+
+  }).then(function(lightAliases) {
     var identifiedElements = [];
-    for (var i=0;i<lightAliases.length;i++) {
+    for (var i = 0; i < lightAliases.length; i++) {
       self.addAlias(lightAliases[i]);
       identifiedElements.push(new IdentifiedElement(lightAliases[i]));
     }
@@ -180,45 +183,41 @@ MapModel.prototype.getReactionById = function(id, complete) {
   }
 };
 
+MapModel.prototype._getMissingReactionsElementIds = function(reactions) {
+  var self = this;
+  var result = [];
+  var ids = [];
+  for (var i = 0; i < reactions.length; i++) {
+    var reaction = reactions[i];
+    var elements = reaction.getElements();
+    for (var j = 0; j < elements.length; j++) {
+      var element = elements[j];
+      if (!(element instanceof Alias)) {
+        if (self._aliases[element] === undefined || !self._aliases[element].isComplete()) {
+          if (!ids[element]) {
+            ids[element] = true;
+            result.push(element);
+          }
+        }
+      }
+    }
+  }
+  return result;
+};
+
 MapModel.prototype.getCompleteReactionById = function(id) {
   var self = this;
   if (self._reactions[id] instanceof Reaction && self._reactions[id].isComplete()) {
     return Promise.resolve(self._reactions[id]);
   } else {
     var result;
-    return self.getReactionById(id).then(
-        function(result) {
-          var ids = [];
-          var i;
-          for (i = 0; i < result.getReactants().length; i++) {
-            if (!(result.getReactants()[i] instanceof Alias)) {
-              if (self._aliases[result.getReactants()[i]] === undefined
-                  || !self._aliases[result.getReactants()[i]].isComplete()) {
-                ids.push(result.getReactants()[i]);
-              }
-            }
-          }
-          for (i = 0; i < result.getProducts().length; i++) {
-            if (!(result.getProducts()[i] instanceof Alias)) {
-              if (self._aliases[result.getProducts()[i]] === undefined
-                  || !self._aliases[result.getProducts()[i]].isComplete()) {
-                ids.push(result.getProducts()[i]);
-              }
-            }
-          }
-          for (i = 0; i < result.getModifiers().length; i++) {
-            if (!(result.getModifiers()[i] instanceof Alias)) {
-              if (self._aliases[result.getModifiers()[i]] === undefined
-                  || !self._aliases[result.getModifiers()[i]].isComplete()) {
-                ids.push(result.getModifiers()[i]);
-              }
-            }
-          }
-          return self.getMissingElements({
-            aliasIds : ids,
-            complete : true
-          });
-        }).then(function() {
+    return self.getReactionById(id).then(function(result) {
+      var ids = self._getMissingReactionsElementIds([ result ]);
+      return self.getMissingElements({
+        aliasIds : ids,
+        complete : true
+      });
+    }).then(function() {
       var i;
       result = self._reactions[id];
       for (i = 0; i < result.getReactants().length; i++) {
@@ -308,16 +307,20 @@ MapModel.prototype.getMissingElements = function(elements) {
     }
   }
 
+  var result = [];
   return Promise.all([ reactionPromise, aliasPromise ]).then(function(values) {
-    var result = [], i;
+    var i;
     var reactions = values[0];
     var aliases = values[1];
+    var ids = [];
+
     if (reactions !== null) {
       for (i = 0; i < reactions.length; i++) {
         var reaction = reactions[i];
         self.addReaction(reaction);
         result.push(reaction);
       }
+      ids = self._getMissingReactionsElementIds(reactions);
     }
     if (aliases !== null) {
       for (i = 0; i < aliases.length; i++) {
@@ -326,6 +329,15 @@ MapModel.prototype.getMissingElements = function(elements) {
         result.push(alias);
       }
     }
+    if (ids.length > 0) {
+      return self.getMissingElements({
+        aliasIds : ids,
+        complete : true
+      });
+    } else {
+      return Promise.resolve([]);
+    }
+  }).then(function() {
     return result;
   });
 };
@@ -731,9 +743,13 @@ MapModel.prototype.getReactionsForElements = function(elements, complete) {
       return Promise.all(promises);
     }
   }
+
+  var result = [];
   return ServerConnector.getReactions({
     participantId : ids,
   }).then(function(reactions) {
+    result = reactions;
+
     var promises = [];
     for (var i = 0; i < reactions.length; i++) {
       var reaction = reactions[i];
@@ -743,7 +759,16 @@ MapModel.prototype.getReactionsForElements = function(elements, complete) {
       } else {
         self._reactions[id].update(reaction);
       }
-      promises.push(self.getReactionById(id, complete));
+    }
+    var ids = self._getMissingReactionsElementIds(reactions);
+    return self.getMissingElements({
+      aliasIds : ids,
+      complete : true
+    });
+  }).then(function() {
+    var promises = [];
+    for (var i=0;i<result.length;i++) {
+      promises.push(self.getCompleteReactionById(result[i].getId()));      
     }
     return Promise.all(promises);
   });
diff --git a/frontend-js/src/main/js/map/data/ProjectStatistics.js b/frontend-js/src/main/js/map/data/ProjectStatistics.js
index e30fe8b0cbb34f7021b6e3fabec5dd60cc5bda45..0e5cd484641a1a04e88b51e38391628854617a04 100644
--- a/frontend-js/src/main/js/map/data/ProjectStatistics.js
+++ b/frontend-js/src/main/js/map/data/ProjectStatistics.js
@@ -49,6 +49,9 @@ ProjectStatistics.prototype.setElementAnnotations = function(elementAnnotations,
 ProjectStatistics.prototype.getElementAnnotations = function() {
   return this._elementAnnotations;
 };
+ProjectStatistics.prototype.getReactionAnnotations = function() {
+  return this._reactionAnnotations;
+};
 
 ProjectStatistics.prototype.setPublicationCount = function(count) {
   this._publicationsCount = count;
diff --git a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js
index 05146b3859b76a192316df4e0eade26c6c238564..209fd20b97e369a40fdc584c867db855aa3be2b4 100644
--- a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js
+++ b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js
@@ -3,6 +3,7 @@
 /* exported logger */
 
 var ElementExportPanel = require('../../../../main/js/gui/export/ElementExportPanel');
+var GuiMessageError = require('../../../../main/js/gui/GuiMessageError');
 var MiriamType = require('../../../../main/js/map/data/MiriamType');
 var logger = require('../../logger');
 
@@ -217,6 +218,9 @@ describe('ElementExportPanel', function() {
         $("input[name='ALL']", $(testDiv)).each(function(index, element) {
           element.checked = true;
         });
+        var dlb = exportObject.getMiriamTypesDualListbox();
+        var listItem = dlb.available[0];
+        dlb.addSelected(listItem);
         return exportObject.createResponseString();
       }).then(function(result) {
         // protein id
@@ -224,6 +228,62 @@ describe('ElementExportPanel', function() {
         assert.ok(result.indexOf("329156") >= 0);
       });
     });
+    it('get invalid', function() {
+      var exportObject;
+      var project;
+      return ServerConnector.getProject().then(function(result) {
+        project = result;
+        return ServerConnector.getConfiguration();
+      }).then(function(configuration) {
+        exportObject = new ElementExportPanel({
+          element : testDiv,
+          project : project,
+          configuration : configuration,
+        });
+        return exportObject.init();
+      }).then(function() {
+        return exportObject.createResponseString();
+      }).then(null, function(error) {
+        assert.ok(error instanceof GuiMessageError);
+      });
+    });
+  });
+
+  it('download file', function() {
+    var exportObject;
+    var project;
+    return ServerConnector.getProject().then(function(result) {
+      project = result;
+      return ServerConnector.getConfiguration();
+    }).then(function(configuration) {
+      exportObject = new ElementExportPanel({
+        element : testDiv,
+        project : project,
+        configuration : configuration,
+      });
+      return exportObject.init();
+    }).then(function() {
+      $("input[name='ALL']", $(testDiv)).each(function(index, element) {
+        element.checked = true;
+      });
+      var element = $("[name='downloadButton']", $(testDiv))[0];
+      return element.onclick();
+    });
+  });
+
+  describe('createResponseRow', function() {
+    it('description with new line', function() {
+      var exportObject = new ElementExportPanel({
+        element : testDiv,
+        project : helper.createProject(),
+        configuration : helper.getConfiguration(),
+      });
+      var alias = helper.createAlias();
+      var desc = "test\ntest2\n";
+      alias.setDescription(desc);
+      var rowString = exportObject.createResponseRow(alias, exportObject.getAllColumns(), []);
+      assert.ok(rowString.indexOf("test\ntest2\n") === -1);
+    });
   });
 
 });
diff --git a/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js b/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a2b91b43d1f71c2c2ccae68098c6ed749fb6ee06
--- /dev/null
+++ b/frontend-js/src/test/js/gui/export/GraphicsExportPanel-test.js
@@ -0,0 +1,68 @@
+"use strict";
+
+/* exported logger */
+
+var GraphicsExportPanel = require('../../../../main/js/gui/export/GraphicsExportPanel');
+var logger = require('../../logger');
+var assert = require('assert');
+
+describe('GraphicsExportPanel', function() {
+
+  it('getModelId', function() {
+    var exportObject;
+    var project;
+    return ServerConnector.getProject().then(function(result) {
+      project = result;
+      return ServerConnector.getConfiguration();
+    }).then(function(configuration) {
+      exportObject = new GraphicsExportPanel({
+        element : testDiv,
+        project : project,
+        configuration : configuration,
+      });
+      return exportObject.init();
+    }).then(function() {
+      var id = exportObject.getSubmapId();
+      assert.ok(id);
+    });
+  });
+
+  it('getFormatHandler', function() {
+    var exportObject;
+    var project;
+    return ServerConnector.getProject().then(function(result) {
+      project = result;
+      return ServerConnector.getConfiguration();
+    }).then(function(configuration) {
+      exportObject = new GraphicsExportPanel({
+        element : testDiv,
+        project : project,
+        configuration : configuration,
+      });
+      return exportObject.init();
+    }).then(function() {
+      var format = exportObject.getFormatHandler();
+      assert.ok(format);
+    });
+  });
+
+  it('download file', function() {
+    var exportObject;
+    var project;
+    return ServerConnector.getProject().then(function(result) {
+      project = result;
+      return ServerConnector.getConfiguration();
+    }).then(function(configuration) {
+      exportObject = new GraphicsExportPanel({
+        element : testDiv,
+        project : project,
+        configuration : configuration,
+      });
+      return exportObject.init();
+    }).then(function() {
+      var element = $("[name='downloadButton']", $(testDiv))[0];
+      return element.onclick();
+    });
+  });
+
+});
diff --git a/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js b/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..1badab9af1c93d8f392d50ae969c9e3d34b91b29
--- /dev/null
+++ b/frontend-js/src/test/js/gui/export/NetworkExportPanel-test.js
@@ -0,0 +1,32 @@
+"use strict";
+
+/* exported logger */
+
+var NetworkExportPanel = require('../../../../main/js/gui/export/NetworkExportPanel');
+var logger = require('../../logger');
+
+describe('NetworkExportPanel', function() {
+
+  it('download file', function() {
+    var exportObject;
+    var project;
+    return ServerConnector.getProject().then(function(result) {
+      project = result;
+      return ServerConnector.getConfiguration();
+    }).then(function(configuration) {
+      exportObject = new NetworkExportPanel({
+        element : testDiv,
+        project : project,
+        configuration : configuration,
+      });
+      return exportObject.init();
+    }).then(function() {
+      $("input[name='ALL']", $(testDiv)).each(function(index, element) {
+        element.checked = true;
+      });
+      var element = $("[name='downloadButton']", $(testDiv))[0];
+      return element.onclick();
+    });
+  });
+
+});
diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js
index 4b4438049ae2ebac08f04cac10d1bc2716cb853a..fa68c112a618f9833c4ab9600a398ff92e48effd 100644
--- a/frontend-js/src/test/js/mocha-config.js
+++ b/frontend-js/src/test/js/mocha-config.js
@@ -24,6 +24,8 @@ global.window.$ = $;
 
 // additions to jsdom implementations:
 global.Option = window.Option;
+global.Blob = window.Blob;
+global.MouseEvent = window.MouseEvent;
 
 var originalCreateElement = document.createElement;
 document.createElement = function(arg) {
@@ -42,6 +44,9 @@ window.open = function() {
   };
   return result;
 };
+window.URL.createObjectURL = function(){
+  
+};
 
 // pileup is using heavily some browser defined javascript
 var pileup = require('pileup');
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..b6d21d318c262584cb47a6fa481b462fdfdec7ac
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/15781/bioEntities/elements/columns=id,modelId&type=Drug,Complex,Phenotype,Gene,RNA,Unknown,Degraded,Antisense RNA,Ion,Simple molecule,Protein,Compartment&token=MOCK_TOKEN_ID&	
@@ -0,0 +1 @@
+[{"modelId":15781,"id":329180},{"modelId":15781,"id":329166},{"modelId":15781,"id":329183},{"modelId":15781,"id":329158},{"modelId":15781,"id":329175},{"modelId":15781,"id":329160},{"modelId":15781,"id":329176},{"modelId":15781,"id":329161},{"modelId":15781,"id":329164},{"modelId":15781,"id":329171},{"modelId":15781,"id":329157},{"modelId":15781,"id":329181},{"modelId":15781,"id":329165},{"modelId":15781,"id":329184},{"modelId":15781,"id":329156},{"modelId":15781,"id":329185},{"modelId":15781,"id":329169},{"modelId":15781,"id":329162},{"modelId":15781,"id":329167},{"modelId":15781,"id":329178},{"modelId":15781,"id":329170},{"modelId":15781,"id":329163},{"modelId":15781,"id":329173},{"modelId":15781,"id":329168},{"modelId":15781,"id":329174},{"modelId":15781,"id":329182},{"modelId":15781,"id":329159},{"modelId":15781,"id":329172},{"modelId":15781,"id":329177},{"modelId":15781,"id":329179}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..ec53d5a3b9547671ae3a2d1bddac3b521d2664db
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/elements/id=329167,329168,329169,329172,329173,329179&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"elementId":"sa5","symbol":null,"formerSymbols":[],"other":{"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":"sa1","symbol":null,"formerSymbols":[],"other":{"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":"sa6","symbol":null,"formerSymbols":[],"other":{"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":"sa11","symbol":null,"formerSymbols":[],"other":{"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":"sa7","symbol":null,"formerSymbols":[],"other":{"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":"sa2","symbol":null,"formerSymbols":[],"other":{"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/reactions/participantId=329156,329157,329158,329159,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/reactions/participantId=329156,329157,329158,329159,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..90a3c4b7c4fa022979780b493c9d025900e264eb
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/bioEntities/reactions/participantId=329156,329157,329158,329159,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 @@
+[{"notes":"","references":[],"modelId":15781,"reactants":"329161","reactionId":"re20","id":153497,"type":"State transition","lines":[{"start":{"x":465.68408727882723,"y":173.00924235519662},"end":{"x":427.95591606364394,"y":159.05933030924652},"type":"START"},{"start":{"x":420.45240587887884,"y":156.28492318210644},"end":{"x":382.72423466369554,"y":142.33501113615634},"type":"END"}],"modifiers":"","centerPoint":{"x":424.2041609712614,"y":157.67212674567648},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re12","id":153522,"type":"State transition","lines":[{"start":{"x":282.92735502516456,"y":131.66828304872405},"end":{"x":349.0890546595849,"y":106.61676571141928},"type":"START"},{"start":{"x":356.5706947317768,"y":103.78391170350197},"end":{"x":422.7323943661972,"y":78.73239436619717},"type":"END"}],"modifiers":"","centerPoint":{"x":352.82987469568087,"y":105.20033870746062},"products":"329182","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329157","reactionId":"re14","id":153502,"type":"State transition","lines":[{"start":{"x":369.0,"y":60.84615384615386},"end":{"x":390.00425356060526,"y":61.8155809335664},"type":"START"},{"start":{"x":397.99574643939474,"y":62.18441906643361},"end":{"x":419.0,"y":63.15384615384615},"type":"END"}],"modifiers":"","centerPoint":{"x":394.0,"y":62.00000000000001},"products":"329182","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re11","id":153516,"type":"State transition","lines":[{"start":{"x":266.57142857142856,"y":128.0},"end":{"x":286.0544419422188,"y":106.46614311649508},"type":"START"},{"start":{"x":291.4217485339718,"y":100.53385688350491},"end":{"x":310.904761904762,"y":79.0},"type":"END"}],"modifiers":"","centerPoint":{"x":288.7380952380953,"y":103.5},"products":"329157","hierarchyVisibilityLevel":null},{"notes":"","references":[{"resource":"REACT_1493.4","link":null,"id":860354,"type":"REACTOME"}],"modelId":15781,"reactants":"329181","reactionId":"re29","id":153506,"type":"State transition","lines":[{"start":{"x":1065.943922652377,"y":210.4515058436089},"end":{"x":1076.3953582603178,"y":134.9622060910266},"type":"START"},{"start":{"x":1077.4924870444363,"y":127.03779390897431},"end":{"x":1087.943922652377,"y":51.548494156391996},"type":"END"},{"start":{"x":1225.7682370820664,"y":95.9386128624158},"end":{"x":1081.8966802661598,"y":131.68570549007447},"type":"MIDDLE"}],"modifiers":"329170","centerPoint":{"x":1076.943922652377,"y":131.00000000000045},"products":"329164","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329169","reactionId":"re8","id":153518,"type":"State transition","lines":[{"start":{"x":141.01308884552796,"y":203.5052375718217},"end":{"x":142.676524190943,"y":182.98953497836953},"type":"START"},{"start":{"x":143.32305114107143,"y":175.01570259345215},"end":{"x":144.98648648648648,"y":154.5},"type":"END"}],"modifiers":"","centerPoint":{"x":142.99978766600722,"y":179.00261878591084},"products":"329167","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329177","reactionId":"re6","id":153507,"type":"State transition","lines":[{"start":{"x":73.33333333333336,"y":205.99999999999997},"end":{"x":86.57623440706466,"y":207.9864351610597},"type":"START"},{"start":{"x":94.48772523001104,"y":209.17315878450162},"end":{"x":107.73062630374235,"y":211.15959394556134},"type":"END"}],"modifiers":"","centerPoint":{"x":90.53197981853785,"y":208.57979697278066},"products":"329169","hierarchyVisibilityLevel":null},{"notes":"","references":[{"resource":"REACT_631.3","link":null,"id":860356,"type":"REACTOME"}],"modelId":15781,"reactants":"329164,329163,329184","reactionId":"re28","id":153517,"type":"State transition","lines":[{"start":{"x":1141.5196031834896,"y":51.548494156391996},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1219.548247311565,"y":134.3979536254443},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1246.1690051005714,"y":32.36583419471002},"end":{"x":1132.7196031834897,"y":115.10969883127876},"type":"START"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1119.5196031834896,"y":210.4515058436089},"type":"END"},{"start":{"x":1270.6053791059244,"y":190.1518729146033},"end":{"x":1236.597255534866,"y":287.5959827975124},"type":"END"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1270.6053791059244,"y":190.1518729146033},"type":"MIDDLE"},{"start":{"x":1225.7682370820664,"y":100.0252191528203},"end":{"x":1135.4723607972724,"y":131.68570549007447},"type":"MIDDLE"},{"start":{"x":1132.7196031834897,"y":115.10969883127876},"end":{"x":1131.0681675755488,"y":127.03779390897431},"type":"MIDDLE"},{"start":{"x":1128.3196031834896,"y":146.89030116872215},"end":{"x":1129.9710387914304,"y":134.9622060910266},"type":"MIDDLE"}],"modifiers":"329170","centerPoint":{"x":1130.5196031834896,"y":131.00000000000045},"products":"329181,329185","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329167","reactionId":"re3","id":153504,"type":"State transition","lines":[{"start":{"x":155.9662162162162,"y":129.5},"end":{"x":169.67962640764847,"y":112.300129590407},"type":"START"},{"start":{"x":174.6668714987086,"y":106.04494083212823},"end":{"x":188.38028169014086,"y":88.84507042253522},"type":"END"}],"modifiers":"","centerPoint":{"x":172.17324895317853,"y":109.17253521126761},"products":"329179","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182,329158","reactionId":"re24","id":153501,"type":"Heterodimer association","lines":[{"start":{"x":483.0,"y":84.29763533176055},"end":{"x":533.8361728854625,"y":125.17338224867643},"type":"START"},{"start":{"x":533.8361728854625,"y":125.17338224867643},"end":{"x":570.5932207804386,"y":141.9996978678854},"type":"MIDDLE"},{"start":{"x":570.5932207804386,"y":141.9996978678854},"end":{"x":598.9999999999998,"y":233.5000000000009},"type":"MIDDLE"},{"start":{"x":372.0,"y":278.9000000000001},"end":{"x":598.9999999999998,"y":233.5000000000009},"type":"START"},{"start":{"x":534.1902877883472,"y":223.71375982660487},"end":{"x":502.38530409965,"y":193.69120244400173},"type":"END"},{"start":{"x":537.8602347616395,"y":200.9555550930127},"end":{"x":534.1902877883472,"y":223.71375982660487},"type":"MIDDLE"},{"start":{"x":598.9999999999998,"y":233.5000000000009},"end":{"x":560.730886628659,"y":215.4609444653865},"type":"MIDDLE"},{"start":{"x":560.730886628659,"y":215.4609444653865},"end":{"x":542.8037939212006,"y":170.29938150667186},"type":"MIDDLE"},{"start":{"x":542.8037939212006,"y":170.29938150667186},"end":{"x":539.1338469479083,"y":193.05758624026404},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":538.4970408547739,"y":197.00657066663837},"products":"329161","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329179","reactionId":"re13","id":153498,"type":"State transition","lines":[{"start":{"x":245.0,"y":65.09677419354836},"end":{"x":263.01049445505964,"y":63.78956088632629},"type":"START"},{"start":{"x":270.98950554494036,"y":63.210439113673665},"end":{"x":289.00000000000006,"y":61.9032258064516},"type":"END"}],"modifiers":"","centerPoint":{"x":267.0,"y":63.49999999999998},"products":"329157","hierarchyVisibilityLevel":null},{"notes":"asd","references":[],"modelId":15781,"reactants":"329183,329176","reactionId":"re27","id":153503,"type":"State transition","lines":[{"start":{"x":736.0,"y":62.0},"end":{"x":857.8666666666667,"y":65.99999999999984},"type":"START"},{"start":{"x":718.0,"y":157.0},"end":{"x":857.8666666666667,"y":65.99999999999984},"type":"START"},{"start":{"x":1036.7448052448904,"y":161.82878519089866},"end":{"x":695.0,"y":259.0},"type":"END"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":1040.6666666666667,"y":71.9999999999996},"type":"MIDDLE"},{"start":{"x":1040.6666666666667,"y":71.9999999999996},"end":{"x":1036.7448052448904,"y":161.82878519089866},"type":"MIDDLE"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":854.0,"y":159.0},"type":"END"},{"start":{"x":857.8666666666667,"y":65.99999999999984},"end":{"x":884.3354862606928,"y":66.86877963656522},"type":"MIDDLE"},{"start":{"x":918.8000000000001,"y":67.99999999999976},"end":{"x":892.3311804059739,"y":67.13122036343438},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":888.3333333333334,"y":66.9999999999998},"products":"329178,329160","hierarchyVisibilityLevel":null},{"notes":"notes for reaction","references":[{"resource":"123","link":"http://www.ncbi.nlm.nih.gov/pubmed/123","id":860355,"type":"PUBMED","article":{"title":"The importance of an innervated and intact antrum and pylorus in preventing postoperative duodenogastric reflux and gastritis.","authors":["Keighley MR"," Asquith P"," Edwards JA"," Alexander-Williams J."],"journal":"The British journal of surgery","year":1975,"link":"http://www.ncbi.nlm.nih.gov/pubmed/123","id":"123","citationCount":12,"stringAuthors":"Keighley MR,  Asquith P,  Edwards JA,  Alexander-Williams J."}}],"modelId":15781,"reactants":"329166","reactionId":"re21","id":153508,"type":"State transition","lines":[{"start":{"x":129.00000000000003,"y":269.9853478599471},"end":{"x":217.3857151822324,"y":271.4614610007049},"type":"START"},{"start":{"x":217.3857151822324,"y":271.4614610007049},"end":{"x":217.98919008325365,"y":297.73178548394236},"type":"MIDDLE"},{"start":{"x":218.17291548409574,"y":305.7296755167626},"end":{"x":218.77639038511697,"y":332.0},"type":"END"}],"modifiers":"","centerPoint":{"x":218.0810527836747,"y":301.7307305003525},"products":"329171","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329174,329180","reactionId":"re26","id":153515,"type":"State transition","lines":[{"start":{"x":792.0,"y":404.0},"end":{"x":868.3333333333338,"y":377.9999999999997},"type":"START"},{"start":{"x":868.3333333333338,"y":377.9999999999997},"end":{"x":893.6666666666671,"y":378.00000000000017},"type":"MIDDLE"},{"start":{"x":884.0,"y":334.0},"end":{"x":893.6666666666671,"y":378.00000000000017},"type":"START"},{"start":{"x":931.666666666667,"y":378.0000000000009},"end":{"x":918.0,"y":447.0},"type":"END"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":931.666666666667,"y":378.0000000000009},"type":"MIDDLE"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":994.0,"y":296.0},"type":"END"},{"start":{"x":893.6666666666671,"y":378.00000000000017},"end":{"x":896.0000000000005,"y":378.0000000000003},"type":"MIDDLE"},{"start":{"x":906.3333333333337,"y":378.00000000000045},"end":{"x":904.0000000000005,"y":378.0000000000004},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":900.0000000000005,"y":378.00000000000034},"products":"329162,329156","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329172","reactionId":"re19","id":153514,"type":"State transition","lines":[{"start":{"x":291.5480933063571,"y":141.36660621583232},"end":{"x":321.0332360186737,"y":140.1172357619206},"type":"START"},{"start":{"x":329.02606383097014,"y":139.7785566173318},"end":{"x":358.51120654328673,"y":138.52918616342006},"type":"END"}],"modifiers":"","centerPoint":{"x":325.0296499248219,"y":139.9478961896262},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182","reactionId":"re15","id":153520,"type":"State transition","lines":[{"start":{"x":464.2991452991452,"y":84.99999999999999},"end":{"x":474.4764759147595,"y":123.41121554925371},"type":"START"},{"start":{"x":476.52543302899414,"y":131.14437627071987},"end":{"x":486.7027636446084,"y":169.5555918199736},"type":"END"}],"modifiers":"","centerPoint":{"x":475.5009544718768,"y":127.27779590998679},"products":"329161","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329167","reactionId":"re10","id":153499,"type":"State transition","lines":[{"start":{"x":180.0362865221489,"y":142.31809613572102},"end":{"x":192.68309645382215,"y":142.43629062106376},"type":"START"},{"start":{"x":200.68274710121602,"y":142.5110537112263},"end":{"x":213.32955703288923,"y":142.62924819656908},"type":"END"}],"modifiers":"","centerPoint":{"x":196.68292177751908,"y":142.47367216614504},"products":"329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re9","id":153523,"type":"State transition","lines":[{"start":{"x":321.85186623410436,"y":207.00000000000003},"end":{"x":321.9270873884931,"y":189.4702285640532},"type":"START"},{"start":{"x":321.9270873884931,"y":189.4702285640532},"end":{"x":229.04799778942134,"y":218.492600831302},"type":"MIDDLE"},{"start":{"x":229.04799778942134,"y":218.492600831302},"end":{"x":237.43474907751033,"y":192.0589999282645},"type":"MIDDLE"},{"start":{"x":239.85410636945107,"y":184.4336009030375},"end":{"x":248.24085765754003,"y":158.0},"type":"END"}],"modifiers":"","centerPoint":{"x":238.6444277234807,"y":188.246300415651},"products":"329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329169","reactionId":"re7","id":153500,"type":"State transition","lines":[{"start":{"x":163.2392208530345,"y":225.3469042549395},"end":{"x":213.40853059287068,"y":245.52519412275237},"type":"START"},{"start":{"x":220.83069026016378,"y":248.51041536634685},"end":{"x":270.99999999999994,"y":268.6887052341597},"type":"END"}],"modifiers":"","centerPoint":{"x":217.11961042651723,"y":247.0178047445496},"products":"329158","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re18","id":153524,"type":"State transition","lines":[{"start":{"x":372.0,"y":268.1587301587302},"end":{"x":386.60500853172016,"y":262.1312663202425},"type":"START"},{"start":{"x":394.0,"y":259.0793650793651},"end":{"x":408.6050085317202,"y":253.05190124087738},"type":"END"}],"modifiers":"","centerPoint":{"x":390.3025042658601,"y":260.6053156998038},"products":"329175","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329158","reactionId":"re23","id":153521,"type":"Dissociation","lines":[{"start":{"x":371.99999999999994,"y":315.10161915826575},"end":{"x":411.64153465957406,"y":335.590891248036},"type":"START"},{"start":{"x":508.05348418531685,"y":279.95891320505365},"end":{"x":379.6820939222325,"y":146.9928441065957},"type":"END"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":508.05348418531685,"y":279.95891320505365},"type":"MIDDLE"},{"start":{"x":449.8434737629195,"y":307.88463901503604},"end":{"x":270.9073813308621,"y":158.0},"type":"END"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":546.6153123135401,"y":307.94923690478544},"type":"MIDDLE"},{"start":{"x":546.6153123135401,"y":307.94923690478544},"end":{"x":449.8434737629195,"y":307.88463901503604},"type":"MIDDLE"},{"start":{"x":543.7499999999999,"y":362.874999999999},"end":{"x":500.90979517443395,"y":356.00742559541567},"type":"MIDDLE"},{"start":{"x":500.90979517443395,"y":356.00742559541567},"end":{"x":458.3899053124841,"y":359.75342920945576},"type":"MIDDLE"},{"start":{"x":458.3899053124841,"y":359.75342920945576},"end":{"x":418.7483706529099,"y":339.2641571196856},"type":"MIDDLE"}],"modifiers":"","centerPoint":{"x":415.194952656242,"y":337.4275241838608},"products":"329165,329172","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329168","reactionId":"re4","id":153512,"type":"State transition","lines":[{"start":{"x":75.73715058611361,"y":134.3476104598738},"end":{"x":88.18325303297577,"y":135.7031265679479},"type":"START"},{"start":{"x":96.13622466620043,"y":136.56929179532878},"end":{"x":108.58232711306259,"y":137.92480790340286},"type":"END"}],"modifiers":"","centerPoint":{"x":92.15973884958811,"y":136.13620918163832},"products":"329167","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329168","reactionId":"re2","id":153511,"type":"State transition","lines":[{"start":{"x":45.833333333333336,"y":118.49999999999999},"end":{"x":47.983923957904906,"y":86.24114063142645},"type":"START"},{"start":{"x":48.516076042095094,"y":78.25885936857357},"end":{"x":50.666666666666664,"y":46.0},"type":"END"}],"modifiers":"","centerPoint":{"x":48.25,"y":82.25},"products":"329173","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329171","reactionId":"re22","id":153505,"type":"Positive influence","lines":[{"start":{"x":169.66666666666666,"y":332.0},"end":{"x":149.31765717927775,"y":319.13724818355684},"type":"START"},{"start":{"x":142.5553586937381,"y":314.86275181644316},"end":{"x":122.2063492063492,"y":302.0},"type":"END"}],"modifiers":"","centerPoint":{"x":145.93650793650792,"y":317.0},"products":"329166","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329177","reactionId":"re1","id":153519,"type":"State transition","lines":[{"start":{"x":41.07142857142857,"y":186.0},"end":{"x":42.30429751433407,"y":168.73983479932295},"type":"START"},{"start":{"x":42.87427391423735,"y":160.76016520067705},"end":{"x":44.107142857142854,"y":143.5},"type":"END"}],"modifiers":"","centerPoint":{"x":42.58928571428571,"y":164.75},"products":"329168","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329182","reactionId":"re16","id":153513,"type":"State transition","lines":[{"start":{"x":434.8904109589041,"y":85.0},"end":{"x":410.8341500923087,"y":104.95576185524392},"type":"START"},{"start":{"x":404.6769250286157,"y":110.06345991944379},"end":{"x":380.62066416202026,"y":130.0192217746877},"type":"END"}],"modifiers":"","centerPoint":{"x":407.7555375604622,"y":107.50961088734385},"products":"329165","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329165","reactionId":"re17","id":153509,"type":"State transition","lines":[{"start":{"x":375.66023326033917,"y":149.5988027812886},"end":{"x":392.8475673435525,"y":192.3761676106196},"type":"START"},{"start":{"x":395.8301166301696,"y":199.7994013906443},"end":{"x":413.0174507133829,"y":242.5767662199753},"type":"END"}],"modifiers":"","centerPoint":{"x":394.33884198686104,"y":196.08778450063195},"products":"329175","hierarchyVisibilityLevel":null},{"notes":"","references":[],"modelId":15781,"reactants":"329173","reactionId":"re5","id":153510,"type":"State transition","lines":[{"start":{"x":92.0,"y":36.98039215686274},"end":{"x":124.64269540833152,"y":45.94113207287532},"type":"START"},{"start":{"x":132.35730459166848,"y":48.05886792712468},"end":{"x":165.0,"y":57.01960784313726},"type":"END"},{"start":{"x":144.03021943732247,"y":129.5},"end":{"x":131.99804583067973,"y":53.145215648491444},"type":"MIDDLE"}],"modifiers":"329167","centerPoint":{"x":128.5,"y":47.0},"products":"329179","hierarchyVisibilityLevel":null}]
\ No newline at end of file
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java b/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java
index 5df367d06fe0e9da343d11e186252eaea20c8f03..9b09e2708b9244f8798fef693184859756ec2ccc 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/model/Model.java
@@ -389,7 +389,7 @@ public interface Model {
 	 *          element database identifier ({@link Element#id})
 	 * @return {@link Element} for a given id
 	 */
-	Element getElementByDbId(Integer dbId);
+	<T extends Element> T getElementByDbId(Integer dbId);
 
 	/**
 	 * Returns {@link Reaction} for given database identifier.
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
index 668985f097cfc601ef841129dfc8aa372df3eaff..843edf209d9f71f8ea1c36e93041eab82f99ed15 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java
@@ -91,12 +91,14 @@ public class ConfigurationRestImpl {
 		userService.getToken(token);
 
 		List<Map<String, Object>> result = new ArrayList<>();
-		List<Pair<String, Class<? extends AbstractImageGenerator>>> imageGenerators = new ImageGenerators().getAvailableImageGenerators();
+		ImageGenerators imageGenerators = new ImageGenerators();
+		List<Pair<String, Class<? extends AbstractImageGenerator>>> imageGeneratorList = imageGenerators.getAvailableImageGenerators();
 
-		for (Pair<String, Class<? extends AbstractImageGenerator>> element : imageGenerators) {
+		for (Pair<String, Class<? extends AbstractImageGenerator>> element : imageGeneratorList) {
 			Map<String, Object> row = new HashMap<>();
 			row.put("name", element.getLeft());
 			row.put("handler", element.getRight().getCanonicalName());
+			row.put("extension", imageGenerators.getExtension(element.getRight()));
 			result.add(row);
 		}
 		return result;
@@ -114,6 +116,7 @@ public class ConfigurationRestImpl {
 			Map<String, Object> row = new HashMap<>();
 			row.put("name", converter.getCommonName());
 			row.put("handler", converter.getClass().getCanonicalName());
+			row.put("extension", converter.getFileExtension());
 			result.add(row);
 		}
 		return result;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java
index 21b5336199ad0f71bc68dd588c58abfa50d53081..d7bdf466830f02f9d5ee3b8f61d96fe0981415da 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsController.java
@@ -29,9 +29,11 @@ public class ElementsController extends BaseController {
 			@RequestParam(value = "id", defaultValue = "") String id, //
 			@RequestParam(value = "type", defaultValue = "") String type, //
 			@RequestParam(value = "columns", defaultValue = "") String columns, //
+			@RequestParam(value = "includedCompartmentIds", defaultValue = "") String includedCompartmentIds, //
+			@RequestParam(value = "excludedCompartmentIds", defaultValue = "") String excludedCompartmentIds, //
 			@CookieValue(value = Configuration.AUTH_TOKEN) String token//
 	) throws SecurityException {
-		return projectController.getElements(projectId, id, columns, modelId, token, type);
+		return projectController.getElements(projectId, id, columns, modelId, token, type, includedCompartmentIds, excludedCompartmentIds);
 	}
 
 }
\ No newline at end of file
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java
index c30f92abc8903929a1c1ddabb55d9fca647f7acf..9348dc68691f9a30029e51ad2e5a5934b8459939 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementsRestImpl.java
@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.api.BaseRestImpl;
+import lcsb.mapviewer.model.map.compartment.Compartment;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.species.AntisenseRna;
 import lcsb.mapviewer.model.map.species.Element;
@@ -35,8 +36,8 @@ public class ElementsRestImpl extends BaseRestImpl {
 	@Autowired
 	private OverviewImageViewFactory factory;
 
-	public List<Map<String, Object>> getElements(String projectId, String id, String columns, String modelId, String token, String type)
-			throws UserAccessException, SecurityException {
+	public List<Map<String, Object>> getElements(String projectId, String id, String columns, String modelId, String token, String type,
+			String includedCompartmentIds, String excludedCompartmentIds) throws UserAccessException, SecurityException {
 		Set<Integer> ids = new HashSet<>();
 		if (!id.equals("")) {
 			for (String str : id.split(",")) {
@@ -49,18 +50,21 @@ public class ElementsRestImpl extends BaseRestImpl {
 				types.add(str.toLowerCase());
 			}
 		}
+		List<Model> models = getModels(projectId, modelId, token);
 
+		Set<Compartment> includedCompartments = getCompartments(includedCompartmentIds, models);
+		Set<Compartment> excludedCompartments = getCompartments(excludedCompartmentIds, models);
 		Set<String> columnsSet = createElementColumnSet(columns);
 
 		List<Map<String, Object>> result = new ArrayList<>();
 
-		List<Model> models = getModels(projectId, modelId, token);
-
 		for (Model model2 : models) {
 			for (Element element : model2.getElements()) {
 				if (ids.size() == 0 || ids.contains(element.getId())) {
 					if (types.size() == 0 || types.contains(element.getStringType().toLowerCase())) {
-						result.add(preparedElement(element, columnsSet));
+						if (matchIncludedExcludedCompartments(element, includedCompartments, excludedCompartments)) {
+							result.add(preparedElement(element, columnsSet));
+						}
 					}
 				}
 			}
@@ -69,6 +73,53 @@ public class ElementsRestImpl extends BaseRestImpl {
 		return result;
 	}
 
+	private boolean matchIncludedExcludedCompartments(Element element, Set<Compartment> includedCompartments, Set<Compartment> excludedCompartments) {
+		boolean matchIncluded = true;
+		boolean matchExcluded = false;
+
+		if (includedCompartments.size() > 0) {
+			matchIncluded = matchCompartments(element, includedCompartments);
+		}
+		if (excludedCompartments.size() > 0) {
+			matchExcluded = matchCompartments(element, excludedCompartments);
+		}
+
+		return matchIncluded && !matchExcluded;
+	}
+
+	private boolean matchCompartments(Element element, Set<Compartment> compartmentList) {
+		boolean isInside = false;
+		if (element != null) {
+			for (Compartment compartment : compartmentList) {
+				if (compartment.contains(element) && element.getModel().getId().equals(compartment.getModel().getId())) {
+					isInside = true;
+				}
+			}
+		}
+		return isInside;
+	}
+
+	private Set<Compartment> getCompartments(String includedCompartmentIds, List<Model> models) {
+		Set<Compartment> includedCompartments = new HashSet<>();
+		int count = 0;
+		if (!includedCompartmentIds.isEmpty()) {
+			for (String compartmentId : includedCompartmentIds.split(",")) {
+				Integer integerId = Integer.valueOf(compartmentId);
+				for (Model model : models) {
+					Compartment compartment = model.getElementByDbId(integerId);
+					if (compartment != null) {
+						includedCompartments.add(compartment);
+					}
+				}
+				count++;
+			}
+			if (count > 0 && includedCompartments.size() == 0) {
+				includedCompartments.add(new Compartment("empty_comp_to_reject_all_elements"));
+			}
+		}
+		return includedCompartments;
+	}
+
 	private Map<String, Object> preparedElement(Element element, Set<String> columnsSet) {
 		Map<String, Object> result = new HashMap<>();
 		for (String string : columnsSet) {
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
index 0d3e0349126edced91c82d2ad674c564cbd97505..44257fd6b443e375a2b1f6321cb44f8212392170 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
@@ -29,9 +29,7 @@ import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.services.SecurityException;
-import lcsb.mapviewer.services.interfaces.IModelService;
 import lcsb.mapviewer.services.interfaces.ISearchService;
-import lcsb.mapviewer.services.interfaces.IUserService;
 import lcsb.mapviewer.services.view.OverviewImageViewFactory;
 
 @Transactional(value = "txManager")
@@ -42,12 +40,6 @@ public class PublicationsRestImpl extends BaseRestImpl {
 	 */
 	private Logger									 logger	= Logger.getLogger(PublicationsRestImpl.class);
 
-	@Autowired
-	private IUserService						 userService;
-
-	@Autowired
-	private IModelService						 modelService;
-
 	@Autowired
 	private ISearchService					 searchService;
 
@@ -89,40 +81,6 @@ public class PublicationsRestImpl extends BaseRestImpl {
 		return publications;
 	}
 
-	/**
-	 * @return the userService
-	 * @see #userService
-	 */
-	public IUserService getUserService() {
-		return userService;
-	}
-
-	/**
-	 * @param userService
-	 *          the userService to set
-	 * @see #userService
-	 */
-	public void setUserService(IUserService userService) {
-		this.userService = userService;
-	}
-
-	/**
-	 * @return the modelService
-	 * @see #modelService
-	 */
-	public IModelService getModelService() {
-		return modelService;
-	}
-
-	/**
-	 * @param modelService
-	 *          the modelService to set
-	 * @see #modelService
-	 */
-	public void setModelService(IModelService modelService) {
-		this.modelService = modelService;
-	}
-
 	/**
 	 * @return the searchService
 	 * @see #searchService
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java
index 60e3837712d839ffd77e188018a37d6f166f3601..d6b904ceb9dfadc1c4f8b52b554efe6cb6b5d19d 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java
@@ -8,14 +8,12 @@ import lcsb.mapviewer.api.projects.chemicals.AllChemicalTests;
 import lcsb.mapviewer.api.projects.drugs.AllDrugTests;
 import lcsb.mapviewer.api.projects.mirnas.AllMiRnaTests;
 import lcsb.mapviewer.api.projects.models.AllModelsTests;
-import lcsb.mapviewer.api.projects.overlays.AllOverlaysTests;
 
 @RunWith(Suite.class)
 @SuiteClasses({ AllChemicalTests.class, //
 		AllDrugTests.class, //
 		AllMiRnaTests.class, //
 		AllModelsTests.class, //
-		AllOverlaysTests.class, //
 		ModelMetaDataTest.class, //
 		ProjectRestImplTest.class })
 public class AllProjectTests {
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java
index 12a789d393bd4674120a9568735b6ac54bae29e6..0699aadfa0bbbe9acec86e910789e83bb1382c4d 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ProjectRestImplTest.java
@@ -24,6 +24,7 @@ import lcsb.mapviewer.api.RestTestFunctions;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.converter.graphics.PdfImageGenerator;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
+import lcsb.mapviewer.model.cache.FileEntry;
 import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.services.interfaces.IModelService;
@@ -50,7 +51,7 @@ public class ProjectRestImplTest extends RestTestFunctions {
 	}
 
 	@Test
-	public void testGetModelAsImage() throws Exception {
+	public void testGetModelAsImageForInvalidConverter() throws Exception {
 		try {
 			ProjectRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml");
 			projectRest.getModelAsImage(token.getId(), "sample", "0", "", "", "", "", "");
@@ -62,6 +63,18 @@ public class ProjectRestImplTest extends RestTestFunctions {
 		}
 	}
 
+	@Test
+	public void testGetModelAsImage() throws Exception {
+		try {
+			ProjectRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml");
+			FileEntry result = projectRest.getModelAsImage(token.getId(), "sample", "0", PdfImageGenerator.class.getCanonicalName(), "", "", "", "");
+			assertNotNull(result);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw e;
+		}
+	}
+
 	@Test(expected = ObjectNotFoundException.class)
 	public void testGetInvalidMetaData() throws Exception {
 		_projectRestImpl.getMetaData("unknown_model_id", token.getId());
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
index 7da42635f993dc74e3cbeed463dec330876ce993..19cc3a66c98d2cc2f09e10d94d8709cf6831b841 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/models/bioEntities/elements/ElementRestImplTest.java
@@ -55,7 +55,7 @@ public class ElementRestImplTest extends RestTestFunctions {
 	public void testGetElementsProcessAllColumns() throws Exception {
 		try {
 			ElementsRestImpl projectRest = createMockElementRest("testFiles/model/sample.xml");
-			List<Map<String, Object>> result = projectRest.getElements("sample", "", "", "*", token.getId(), "");
+			List<Map<String, Object>> result = projectRest.getElements("sample", "", "", "*", token.getId(), "", "", "");
 			for (Map<String, Object> element : result) {
 				for (String paramName : element.keySet()) {
 					Object val = element.get(paramName);
@@ -80,7 +80,7 @@ public class ElementRestImplTest extends RestTestFunctions {
 		try {
 			String proteinType = new GenericProtein("1").getStringType();
 			ElementsRestImpl elementRest = createMockElementRest("testFiles/model/sample.xml");
-			List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), proteinType);
+			List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), proteinType, "", "");
 			assertEquals(12, result.size());
 
 		} catch (Exception e) {
@@ -93,7 +93,7 @@ public class ElementRestImplTest extends RestTestFunctions {
 	public void testGetElementsVisibility() throws Exception {
 		try {
 			ElementsRestImpl elementRest = createMockElementRest("testFiles/model/sample.xml");
-			List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), "");
+			List<Map<String, Object>> result = elementRest.getElements("sample", "", "", "*", token.getId(), "", "", "");
 			for (Map<String, Object> map : result) {
 				assertTrue(map.get("hierarchyVisibilityLevel") instanceof String);
 			}
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java
deleted file mode 100644
index daf60c8088672175d23a5947536c5a6f62a42f8d..0000000000000000000000000000000000000000
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package lcsb.mapviewer.api.projects.overlays;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-import org.junit.runners.Suite.SuiteClasses;
-
-@RunWith(Suite.class)
-@SuiteClasses({  })
-public class AllOverlaysTests {
-
-}