From f9caf97b0c94b829ba1535c6ccbc82b1f8ae798d Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 25 Aug 2017 17:02:13 +0200
Subject: [PATCH] removing projects from frontend

---
 frontend-js/src/main/js/ServerConnector.js    | 745 +++++++++---------
 .../src/main/js/gui/admin/MapsAdminPanel.js   | 430 +++++-----
 .../src/test/js/ServerConnector-test.js       |  11 +
 .../sample/DELETE_token=MOCK_TOKEN_ID&        |   1 +
 .../api/projects/ProjectController.java       |   9 +
 .../api/projects/ProjectRestImpl.java         |   7 +
 .../services/impl/ProjectServiceTest.java     |   3 +-
 .../java/lcsb/mapviewer/bean/ProjectBean.java |   5 +-
 8 files changed, 639 insertions(+), 572 deletions(-)
 create mode 100644 frontend-js/testFiles/apiCalls/projects/sample/DELETE_token=MOCK_TOKEN_ID&

diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 530faf20ef..d96f861c4c 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -41,7 +41,7 @@ var ObjectWithListeners = require('./ObjectWithListeners');
  * This object contains methods that will communicate with server.
  */
 var ServerConnector = new ObjectWithListeners();
-ServerConnector.init = function() {
+ServerConnector.init = function () {
   var self = this;
 
   self._configurationParam = [];
@@ -73,16 +73,16 @@ ServerConnector.registerListenerType("onDataLoadStart");
 ServerConnector.registerListenerType("onDataLoadStop");
 ServerConnector.init();
 
-ServerConnector.getMinOverlayColorInt = function() {
+ServerConnector.getMinOverlayColorInt = function () {
   var self = this;
-  return self.getLoggedUser().then(function(user) {
+  return self.getLoggedUser().then(function (user) {
     var userColor = user.getMinColor();
     return self.returnUserOrSystemColor(userColor, self.getConfigurationParam(ConfigurationType.MIN_COLOR_VAL));
   });
 };
 
-ServerConnector.returnUserOrSystemColor = function(userColor, systemPromisedColor) {
-  return systemPromisedColor.then(function(systemColor) {
+ServerConnector.returnUserOrSystemColor = function (userColor, systemPromisedColor) {
+  return systemPromisedColor.then(function (systemColor) {
     var color = userColor;
     if (userColor === null || userColor === undefined || userColor === "") {
       color = systemColor;
@@ -94,31 +94,31 @@ ServerConnector.returnUserOrSystemColor = function(userColor, systemPromisedColo
   });
 };
 
-ServerConnector.getSimpleOverlayColorInt = function() {
+ServerConnector.getSimpleOverlayColorInt = function () {
   var self = this;
-  return self.getLoggedUser().then(function(user) {
+  return self.getLoggedUser().then(function (user) {
     var userColor = user.getSimpleColor();
     return self.returnUserOrSystemColor(userColor, self.getConfigurationParam(ConfigurationType.SIMPLE_COLOR_VAL));
   });
 };
 
-ServerConnector.getMaxOverlayColorInt = function() {
+ServerConnector.getMaxOverlayColorInt = function () {
   var self = this;
-  return self.getLoggedUser().then(function(user) {
+  return self.getLoggedUser().then(function (user) {
     var userColor = user.getMaxColor();
     return self.returnUserOrSystemColor(userColor, self.getConfigurationParam(ConfigurationType.MAX_COLOR_VAL));
   });
 };
 
-ServerConnector.sendGetRequest = function(url, description) {
+ServerConnector.sendGetRequest = function (url, description) {
   return this.sendRequest({
-    url : url,
-    description : description,
-    method : "GET"
+    url: url,
+    description: description,
+    method: "GET"
   });
 };
 
-ServerConnector.sendRequest = function(params) {
+ServerConnector.sendRequest = function (params) {
   var self = this;
   if (arguments.length > 1) {
     return Promise.reject(new Error("Only two arguments are supported"));
@@ -136,31 +136,31 @@ ServerConnector.sendRequest = function(params) {
   }
 
   var content;
-  return self.callListeners("onDataLoadStart", description).then(function() {
+  return self.callListeners("onDataLoadStart", description).then(function () {
     return self._sendRequest(params);
-  }).then(function(result) {
+  }).then(function (result) {
     content = result;
     return self.callListeners("onDataLoadStop", description);
-  }, function(error) {
-    return self.callListeners("onDataLoadStop", description).then(function() {
+  }, function (error) {
+    return self.callListeners("onDataLoadStop", description).then(function () {
       return Promise.reject(error);
     });
-  }).then(function() {
+  }).then(function () {
     return content;
   });
 
 };
 
-ServerConnector._sendRequest = function(params) {
-  return new Promise(function(resolve, reject) {
-    request(params, function(error, response, body) {
+ServerConnector._sendRequest = function (params) {
+  return new Promise(function (resolve, reject) {
+    request(params, function (error, response, body) {
       if (error) {
         reject(error);
       } else if (response.statusCode !== 200) {
         reject(new NetworkError(params.url + " rejected with status code: " + response.statusCode, {
-          content : body,
-          url : params.url,
-          statusCode : response.statusCode
+          content: body,
+          url: params.url,
+          statusCode: response.statusCode
         }));
       } else {
         // for some reason sometimes result is an object not a string
@@ -174,31 +174,31 @@ ServerConnector._sendRequest = function(params) {
   });
 };
 
-ServerConnector.sendPostRequest = function(url, params) {
+ServerConnector.sendPostRequest = function (url, params) {
   return this.sendRequest({
-    method : "POST",
-    url : url,
-    form : params
+    method: "POST",
+    url: url,
+    form: params
   });
 };
 
-ServerConnector.sendDeleteRequest = function(url, json) {
+ServerConnector.sendDeleteRequest = function (url, json) {
   return this.sendRequest({
-    method : "DELETE",
-    url : url,
-    json : json,
+    method: "DELETE",
+    url: url,
+    json: json,
   });
 };
 
-ServerConnector.sendPatchRequest = function(url, json) {
+ServerConnector.sendPatchRequest = function (url, json) {
   return this.sendRequest({
-    method : "PATCH",
-    url : url,
-    json : json,
+    method: "PATCH",
+    url: url,
+    json: json,
   });
 };
 
-ServerConnector.getToken = function() {
+ServerConnector.getToken = function () {
   var self = this;
 
   var token = self.getSessionData(null).getToken();
@@ -208,11 +208,11 @@ ServerConnector.getToken = function() {
     // if the project is not initialized then check if we can download data
     // using current token
     if (self.getSessionData().getProject() === null) {
-      return self.getConfiguration().then(function() {
+      return self.getConfiguration().then(function () {
         return token;
         // if there was an error accessing configuration it means our token is
         // invalid
-      }, function() {
+      }, function () {
         return self.login();
       });
     } else {
@@ -221,11 +221,11 @@ ServerConnector.getToken = function() {
   }
 };
 
-ServerConnector.getApiBaseUrl = function() {
+ServerConnector.getApiBaseUrl = function () {
   return this.getServerBaseUrl() + "/api/";
 };
 
-ServerConnector.getServerBaseUrl = function() {
+ServerConnector.getServerBaseUrl = function () {
   if (this._serverBaseUrl === undefined) {
     var url = "" + window.location.href;
     if (url.indexOf("?")>=0) {
@@ -239,7 +239,7 @@ ServerConnector.getServerBaseUrl = function() {
   return this._serverBaseUrl;
 };
 
-ServerConnector.createGetParams = function(params, prefix) {
+ServerConnector.createGetParams = function (params, prefix) {
   var sorted = [], key;
 
   for (key in params) {
@@ -275,7 +275,7 @@ ServerConnector.createGetParams = function(params, prefix) {
   return result;
 };
 
-ServerConnector.getApiUrl = function(paramObj) {
+ServerConnector.getApiUrl = function (paramObj) {
   var type = paramObj.type;
   var params = this.createGetParams(paramObj.params);
 
@@ -289,51 +289,51 @@ ServerConnector.getApiUrl = function(paramObj) {
   return result;
 };
 
-ServerConnector.getProjectsUrl = function(queryParams, filterParams) {
+ServerConnector.getProjectsUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    type : "projects/",
-    params : filterParams,
+    type: "projects/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getProjectUrl = function(queryParams, filterParams) {
+ServerConnector.getProjectUrl = function (queryParams, filterParams) {
   var id = this.getIdOrAsterisk(queryParams.projectId);
   return this.getApiUrl({
-    url : this.getProjectsUrl(queryParams) + id + "/",
-    params : filterParams,
+    url: this.getProjectsUrl(queryParams) + id + "/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getProjectStatisticsUrl = function(queryParams, filterParams) {
+ServerConnector.getProjectStatisticsUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "statistics/",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "statistics/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getPublicationsUrl = function(queryParams, filterParams) {
+ServerConnector.getPublicationsUrl = function (queryParams, filterParams) {
   filterParams.start = filterParams.start || 0;
   filterParams.length = filterParams.length || 10;
 
   return this.getApiUrl({
-    url : this.getModelsUrl(queryParams) + "publications/",
-    params : filterParams,
+    url: this.getModelsUrl(queryParams) + "publications/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getReferenceGenomeUrl = function(queryParams, filterParams) {
+ServerConnector.getReferenceGenomeUrl = function (queryParams, filterParams) {
   var version = this.getIdOrAsterisk(queryParams.version);
 
   return this.getApiUrl({
-    type : "genomics/taxonomies/" + queryParams.organism + "/genomeTypes/" + queryParams.type + "/versions/" + version
-        + "/",
-    params : filterParams
+    type: "genomics/taxonomies/" + queryParams.organism + "/genomeTypes/" + queryParams.type + "/versions/" + version
+    + "/",
+    params: filterParams
   });
 };
 
-ServerConnector.loginUrl = function() {
+ServerConnector.loginUrl = function () {
   return this.getApiUrl({
-    type : "/doLogin",
+    type: "/doLogin",
   });
 };
 
@@ -345,49 +345,49 @@ ServerConnector.logoutUrl = function () {
 
 ServerConnector.getSuggestedQueryListUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getBioEntitiesUrl(queryParams) + "suggestedQueryList/",
-    params : filterParams,
+    url: this.getBioEntitiesUrl(queryParams) + "suggestedQueryList/",
+    params: filterParams,
   });
 };
 
-ServerConnector.addCommentUrl = function(queryParams) {
+ServerConnector.addCommentUrl = function (queryParams) {
   return this.getApiUrl({
-    url : this.getCommentsUrl(queryParams)
+    url: this.getCommentsUrl(queryParams)
   });
 };
 
-ServerConnector.addOverlayUrl = function(queryParams) {
+ServerConnector.addOverlayUrl = function (queryParams) {
   return this.getApiUrl({
-    url : this.getOverlaysUrl(queryParams)
+    url: this.getOverlaysUrl(queryParams)
   });
 };
 
-ServerConnector.updateOverlayUrl = function(queryParams) {
+ServerConnector.updateOverlayUrl = function (queryParams) {
   return this.getApiUrl({
-    url : this.getOverlayByIdUrl(queryParams)
+    url: this.getOverlayByIdUrl(queryParams)
   });
 };
 
-ServerConnector.deleteOverlayUrl = function(queryParams) {
+ServerConnector.deleteOverlayUrl = function (queryParams) {
   return this.getApiUrl({
-    url : this.getOverlayByIdUrl(queryParams),
+    url: this.getOverlayByIdUrl(queryParams),
   });
 };
 
-ServerConnector.deleteCommentUrl = function(queryParams) {
+ServerConnector.deleteCommentUrl = function (queryParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "comments/" + queryParams.commentId + "/",
+    url: this.getProjectUrl(queryParams) + "comments/" + queryParams.commentId + "/",
   });
 };
 
-ServerConnector.getOverlaysUrl = function(queryParams, filterParams) {
+ServerConnector.getOverlaysUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "overlays/",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "overlays/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getCommentsUrl = function(queryParams, filterParams) {
+ServerConnector.getCommentsUrl = function (queryParams, filterParams) {
   var modelId = this.getIdOrAsterisk(queryParams.modelId);
   var url = this.getProjectUrl(queryParams) + "comments/models/" + modelId + "/";
   if (queryParams.elementType !== undefined) {
@@ -402,41 +402,41 @@ ServerConnector.getCommentsUrl = function(queryParams, filterParams) {
     }
   }
   return this.getApiUrl({
-    url : url,
-    params : filterParams,
+    url: url,
+    params: filterParams,
   });
 };
 
-ServerConnector.getOverlayByIdUrl = function(queryParams, filterParams) {
+ServerConnector.getOverlayByIdUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getOverlaysUrl(queryParams) + queryParams.overlayId + "/",
-    params : filterParams,
+    url: this.getOverlaysUrl(queryParams) + queryParams.overlayId + "/",
+    params: filterParams,
   });
 
 };
 
-ServerConnector.getOverlayElementsUrl = function(queryParams, filterParams) {
+ServerConnector.getOverlayElementsUrl = function (queryParams, filterParams) {
 
   return this.getApiUrl({
-    url : this.getModelsUrl(queryParams) + "bioEntities/",
-    params : filterParams,
+    url: this.getModelsUrl(queryParams) + "bioEntities/",
+    params: filterParams,
   });
 
 };
 
-ServerConnector.getFullOverlayElementUrl = function(queryParams, filterParams) {
+ServerConnector.getFullOverlayElementUrl = function (queryParams, filterParams) {
 
   return this.getApiUrl({
-    url : this.getAliasesUrl(queryParams) + queryParams.id + "/",
-    params : filterParams,
+    url: this.getAliasesUrl(queryParams) + queryParams.id + "/",
+    params: filterParams,
   });
 
 };
 
-ServerConnector.idsToString = function(ids) {
+ServerConnector.idsToString = function (ids) {
   var result = "";
   if (ids !== undefined) {
-    ids.sort(function(a, b) {
+    ids.sort(function (a, b) {
       return a - b;
     });
     for (var i = 0; i < ids.length; i++) {
@@ -452,11 +452,11 @@ ServerConnector.idsToString = function(ids) {
   return result;
 };
 
-ServerConnector.pointToString = function(point) {
+ServerConnector.pointToString = function (point) {
   return point.x.toFixed(2) + "," + point.y.toFixed(2);
 };
 
-ServerConnector.getModelsUrl = function(queryParams) {
+ServerConnector.getModelsUrl = function (queryParams) {
   var modelId = this.getIdOrAsterisk(queryParams.modelId);
   var overlayId = queryParams.overlayId;
   var url = this.getProjectUrl(queryParams);
@@ -465,17 +465,17 @@ ServerConnector.getModelsUrl = function(queryParams) {
   }
 
   return this.getApiUrl({
-    url : url + "models/" + modelId + "/",
+    url: url + "models/" + modelId + "/",
   });
 };
 
-ServerConnector.getBioEntitiesUrl = function(queryParams) {
+ServerConnector.getBioEntitiesUrl = function (queryParams) {
   return this.getApiUrl({
-    url : this.getModelsUrl(queryParams) + "bioEntities/",
+    url: this.getModelsUrl(queryParams) + "bioEntities/",
   });
 };
 
-ServerConnector.getIdOrAsterisk = function(id) {
+ServerConnector.getIdOrAsterisk = function (id) {
   if (id === undefined || id === "" || id === null) {
     return "*";
   } else {
@@ -483,112 +483,112 @@ ServerConnector.getIdOrAsterisk = function(id) {
   }
 };
 
-ServerConnector.getReactionsUrl = function(queryParams, filterParams) {
+ServerConnector.getReactionsUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getBioEntitiesUrl(queryParams) + "reactions/",
-    params : filterParams,
+    url: this.getBioEntitiesUrl(queryParams) + "reactions/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getAliasesUrl = function(queryParams, filterParams) {
+ServerConnector.getAliasesUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getBioEntitiesUrl(queryParams) + "elements/",
-    params : filterParams,
+    url: this.getBioEntitiesUrl(queryParams) + "elements/",
+    params: filterParams,
   });
 };
 
-ServerConnector.getConfigurationUrl = function(queryParams, filterParams) {
+ServerConnector.getConfigurationUrl = function (queryParams, filterParams) {
   var result = this.getApiUrl({
-    type : "configuration/",
-    params : filterParams
+    type: "configuration/",
+    params: filterParams
   });
   return result;
 };
 
-ServerConnector.getSearchUrl = function(queryParams, filterParams) {
+ServerConnector.getSearchUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getModelsUrl(queryParams) + "bioEntities:search",
-    params : filterParams,
+    url: this.getModelsUrl(queryParams) + "bioEntities:search",
+    params: filterParams,
   });
 };
 
-ServerConnector.getSearchDrugsUrl = function(queryParams, filterParams) {
+ServerConnector.getSearchDrugsUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "drugs:search",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "drugs:search",
+    params: filterParams,
   });
 };
 
-ServerConnector.getSearchMiRnasUrl = function(queryParams, filterParams) {
+ServerConnector.getSearchMiRnasUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "miRnas:search",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "miRnas:search",
+    params: filterParams,
   });
 };
 
-ServerConnector.getSearchChemicalsUrl = function(queryParams, filterParams) {
+ServerConnector.getSearchChemicalsUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "chemicals:search",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "chemicals:search",
+    params: filterParams,
   });
 };
 
-ServerConnector.getOverlaySourceUrl = function(queryParams, filterParams) {
+ServerConnector.getOverlaySourceUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getOverlaysUrl(queryParams) + queryParams.overlayId + ":downloadSource",
-    params : filterParams
+    url: this.getOverlaysUrl(queryParams) + queryParams.overlayId + ":downloadSource",
+    params: filterParams
   });
 };
 
-ServerConnector.getImageUrl = function(queryParams, filterParams) {
+ServerConnector.getImageUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "models/" + queryParams.modelId + ":downloadImage",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "models/" + queryParams.modelId + ":downloadImage",
+    params: filterParams,
   });
 };
 
-ServerConnector.getModelPartUrl = function(queryParams, filterParams) {
+ServerConnector.getModelPartUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getProjectUrl(queryParams) + "models/" + queryParams.modelId + ":downloadModel",
-    params : filterParams,
+    url: this.getProjectUrl(queryParams) + "models/" + queryParams.modelId + ":downloadModel",
+    params: filterParams,
   });
 };
 
-ServerConnector.getProjectSourceUrl = function(queryParams, filterParams) {
+ServerConnector.getProjectSourceUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    type : "projects/" + queryParams.projectId + ":downloadSource",
-    params : filterParams
+    type: "projects/" + queryParams.projectId + ":downloadSource",
+    params: filterParams
   });
 };
 
-ServerConnector.getUsersUrl = function(queryParams, filterParams) {
+ServerConnector.getUsersUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    type : "users/",
-    params : filterParams
+    type: "users/",
+    params: filterParams
   });
 };
 
-ServerConnector.getUserUrl = function(queryParams, filterParams) {
+ServerConnector.getUserUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getUsersUrl() + queryParams.login,
-    params : filterParams,
+    url: this.getUsersUrl() + queryParams.login,
+    params: filterParams,
   });
 };
 
-ServerConnector.getUpdateUserPrivilegesUrl = function(queryParams, filterParams) {
+ServerConnector.getUpdateUserPrivilegesUrl = function (queryParams, filterParams) {
   return this.getApiUrl({
-    url : this.getUserUrl(queryParams) + ":updatePrivileges",
-    params : filterParams,
+    url: this.getUserUrl(queryParams) + ":updatePrivileges",
+    params: filterParams,
   });
 };
 
-ServerConnector.getConfiguration = function(params) {
+ServerConnector.getConfiguration = function (params) {
   if (params === undefined) {
     params = {};
   }
   var self = this;
   if (this._configuration === undefined) {
-    return self.sendGetRequest(self.getConfigurationUrl()).then(function(content) {
+    return self.sendGetRequest(self.getConfigurationUrl()).then(function (content) {
       self._configuration = new Configuration(JSON.parse(content));
       return Promise.resolve(self._configuration);
     });
@@ -602,19 +602,19 @@ ServerConnector.getConfigurationParam = function (paramId) {
     return Promise.reject(new Error("Unknown param type"));
   }
   var self = this;
-  return self.getConfiguration().then(function(configuration) {
+  return self.getConfiguration().then(function (configuration) {
     return configuration.getOption(paramId);
   });
 };
 
-ServerConnector.getModels = function(projectId) {
+ServerConnector.getModels = function (projectId) {
   var queryParams = {};
   var filterParams = {};
   var self = this;
-  return self.getProjectId(projectId).then(function(result) {
+  return self.getProjectId(projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getModelsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var models = [];
     var parsedJson = JSON.parse(content);
     for (var i = 0; i < parsedJson.length; i++) {
@@ -624,15 +624,16 @@ ServerConnector.getModels = function(projectId) {
   });
 };
 
-ServerConnector.getProject = function(projectId) {
+ServerConnector.getProject = function (projectId) {
   var queryParams = {};
   var filterParams = {};
   var project;
   var self = this;
-  return self.getProjectId(projectId).then(function(result) {
+  return self.getProjectId(projectId).then(function (result) {
+    projectId = result;
     queryParams.projectId = result;
     return self.sendGetRequest(self.getProjectUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var downloadedProject = new Project(content);
     if (self._projectsById[projectId] !== undefined) {
       self._projectsById[projectId].update(downloadedProject);
@@ -641,27 +642,27 @@ ServerConnector.getProject = function(projectId) {
     }
     project = self._projectsById[projectId];
     return self.getModels(projectId);
-  }).then(function(models) {
+  }).then(function (models) {
     project.setModel(models[0]);
     return self.getLoggedUser();
-  }).then(function(user) {
+  }).then(function (user) {
     return self.getOverlays({
-      projectId : projectId,
-      creator : user.getLogin(),
-      publicOverlay : false,
+      projectId: projectId,
+      creator: user.getLogin(),
+      publicOverlay: false,
     });
-  }).then(function(overlays) {
+  }).then(function (overlays) {
     project.getModel().addLayouts(overlays);
     return project;
-  }).then(null, function(error) {
+  }).then(null, function (error) {
     if ((error instanceof NetworkError)) {
       switch (error.statusCode) {
-      case HttpStatus.NOT_FOUND:
-        return null;
-      case HttpStatus.FORBIDDEN:
-        return Promise.reject(new SecurityError("Access denied."));
-      default:
-        return Promise.reject(error);
+        case HttpStatus.NOT_FOUND:
+          return null;
+        case HttpStatus.FORBIDDEN:
+          return Promise.reject(new SecurityError("Access denied."));
+        default:
+          return Promise.reject(error);
       }
     } else {
       return Promise.reject(error);
@@ -669,25 +670,53 @@ ServerConnector.getProject = function(projectId) {
   });
 };
 
-ServerConnector.updateProject = function(project) {
+ServerConnector.updateProject = function (project) {
   var self = this;
   var queryParams = {
-    projectId : project.getProjectId()
+    projectId: project.getProjectId()
   };
   var filterParams = {
-    project : {
-      name : project.getName(),
-      version : project.getVersion(),
-      notifyEmail : project.getNotifyEmail(),
-      organism : self.serialize(project.getOrganism()),
-      disease : self.serialize(project.getDisease()),
+    project: {
+      name: project.getName(),
+      version: project.getVersion(),
+      notifyEmail: project.getNotifyEmail(),
+      organism: self.serialize(project.getOrganism()),
+      disease: self.serialize(project.getDisease()),
     },
   };
-  return self.sendPatchRequest(self.getProjectUrl(queryParams), filterParams).then(function(content) {
+  return self.sendPatchRequest(self.getProjectUrl(queryParams), filterParams).then(function (content) {
     var downloadedProject = new Project(content);
     project.update(downloadedProject);
     return project;
-  }).then(null, function(error) {
+  }).then(null, function (error) {
+    if ((error instanceof NetworkError)) {
+      switch (error.statusCode) {
+        case HttpStatus.FORBIDDEN:
+          return Promise.reject(new SecurityError("Access denied."));
+        default:
+          return Promise.reject(error);
+      }
+    } else {
+      return Promise.reject(error);
+    }
+  });
+};
+
+ServerConnector.removeProject = function (projectId) {
+  var self = this;
+  var queryParams = {
+    projectId: projectId
+  };
+  return self.sendDeleteRequest(self.getProjectUrl(queryParams)).then(function (content) {
+    var project = new Project(content);
+    if (self._projectsById[project.getProjectId()] !== undefined) {
+      self._projectsById[project.getProjectId()].update(project);
+    } else {
+      throw new Error();
+      self._projectsById[project.getProjectId()] = project;
+    }
+    return self._projectsById[project.getProjectId()];
+  }).then(null, function (error) {
     if ((error instanceof NetworkError)) {
       switch (error.statusCode) {
         case HttpStatus.FORBIDDEN:
@@ -701,12 +730,12 @@ ServerConnector.updateProject = function(project) {
   });
 };
 
-ServerConnector.addProject = function(options) {
+ServerConnector.addProject = function (options) {
   var self = this;
   var queryParams = {
-    projectId : options.projectId
+    projectId: options.projectId
   };
-  return self.sendPostRequest(self.getProjectUrl(queryParams), options).then(function(content) {
+  return self.sendPostRequest(self.getProjectUrl(queryParams), options).then(function (content) {
     var project = new Project(content);
     if (self._projectsById[project.getProjectId()] !== undefined) {
       self._projectsById[project.getProjectId()].update(project);
@@ -714,7 +743,7 @@ ServerConnector.addProject = function(options) {
       self._projectsById[project.getProjectId()] = project;
     }
     return project;
-  }).then(null, function(error) {
+  }).then(null, function (error) {
     if ((error instanceof NetworkError)) {
       switch (error.statusCode) {
         case HttpStatus.FORBIDDEN:
@@ -728,7 +757,7 @@ ServerConnector.addProject = function(options) {
   });
 };
 
-ServerConnector.serialize = function(object) {
+ServerConnector.serialize = function (object) {
   var result = {};
   if (object instanceof Annotation) {
     result.type = object.getType();
@@ -739,12 +768,12 @@ ServerConnector.serialize = function(object) {
   return result;
 };
 
-ServerConnector.getProjects = function(reload) {
+ServerConnector.getProjects = function (reload) {
   var self = this;
   if (self._projects.length > 0 && !reload) {
     return Promise.resolve(self._projects);
   } else {
-    return self.sendGetRequest(self.getProjectsUrl()).then(function(content) {
+    return self.sendGetRequest(self.getProjectsUrl()).then(function (content) {
       var parsedData = JSON.parse(content);
       self._projects.length = 0;
       for (var i = 0; i < parsedData.length; i++) {
@@ -761,42 +790,42 @@ ServerConnector.getProjects = function(reload) {
   }
 };
 
-ServerConnector.getProjectStatistics = function(projectId) {
+ServerConnector.getProjectStatistics = function (projectId) {
   var queryParams = {};
   var filterParams = {};
   var self = this;
   var content;
-  return self.getProjectId(projectId).then(function(result) {
+  return self.getProjectId(projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getProjectStatisticsUrl(queryParams, filterParams));
-  }).then(function(result) {
+  }).then(function (result) {
     content = JSON.parse(result);
     return self.getConfiguration();
-  }).then(function(configuration) {
+  }).then(function (configuration) {
     return new ProjectStatistics(content, configuration);
   });
 };
 
-ServerConnector.getLoggedUser = function() {
+ServerConnector.getLoggedUser = function () {
   var self = this;
   if (self._loggedUser !== undefined) {
     return Promise.resolve(self._loggedUser);
   } else {
-    return self.getUser(self.getSessionData().getLogin()).then(function(user) {
+    return self.getUser(self.getSessionData().getLogin()).then(function (user) {
       self._loggedUser = user;
       return self._loggedUser;
     });
   }
 };
 
-ServerConnector.getUser = function(login) {
+ServerConnector.getUser = function (login) {
   var self = this;
   var queryParams = {
-    login : login,
+    login: login,
   };
   var filterParams = {};
 
-  return self.sendGetRequest(self.getUserUrl(queryParams, filterParams)).then(function(content) {
+  return self.sendGetRequest(self.getUserUrl(queryParams, filterParams)).then(function (content) {
     var obj = JSON.parse(content);
     var user = new User(obj);
     if (self._usersByLogin[user.getLogin()] !== undefined) {
@@ -808,15 +837,15 @@ ServerConnector.getUser = function(login) {
   });
 };
 
-ServerConnector.updateUserPrivileges = function(params) {
+ServerConnector.updateUserPrivileges = function (params) {
   var self = this;
   var queryParams = {
-    login : params.user.getLogin(),
+    login: params.user.getLogin(),
   };
 
   return self.sendPatchRequest(self.getUpdateUserPrivilegesUrl(queryParams), {
-    privileges : params.privileges
-  }).then(function(content) {
+    privileges: params.privileges
+  }).then(function (content) {
     var obj = JSON.parse(content);
     var user = new User(obj);
     if (self._usersByLogin[user.getLogin()] !== undefined) {
@@ -828,13 +857,13 @@ ServerConnector.updateUserPrivileges = function(params) {
   });
 };
 
-ServerConnector.getUsers = function(forceRefresh) {
+ServerConnector.getUsers = function (forceRefresh) {
   var self = this;
 
   if (self._users.length > 0 && !forceRefresh) {
     return Promise.resolve(self._users);
   } else {
-    return self.sendGetRequest(self.getUsersUrl()).then(function(content) {
+    return self.sendGetRequest(self.getUsersUrl()).then(function (content) {
       var parsedData = JSON.parse(content);
       self._users.length = 0;
       for (var i = 0; i < parsedData.length; i++) {
@@ -852,21 +881,21 @@ ServerConnector.getUsers = function(forceRefresh) {
 
 };
 
-ServerConnector.getOverlays = function(params) {
+ServerConnector.getOverlays = function (params) {
   var self = this;
   if (params === undefined) {
     params = {};
   }
   var queryParams = {};
   var filterParams = {
-    creator : params.creator,
-    publicOverlay : params.publicOverlay,
+    creator: params.creator,
+    publicOverlay: params.publicOverlay,
   };
-  return new Promise(function(resolve, reject) {
-    self.getProjectId(params.projectId).then(function(result) {
+  return new Promise(function (resolve, reject) {
+    self.getProjectId(params.projectId).then(function (result) {
       queryParams.projectId = result;
       return self.sendGetRequest(self.getOverlaysUrl(queryParams, filterParams));
-    }).then(function(content) {
+    }).then(function (content) {
       var arr = JSON.parse(content);
       var result = [];
       for (var i = 0; i < arr.length; i++) {
@@ -878,20 +907,20 @@ ServerConnector.getOverlays = function(params) {
   });
 };
 
-ServerConnector.getOverlayElements = function(overlayId, projectId) {
+ServerConnector.getOverlayElements = function (overlayId, projectId) {
   var self = this;
   if (overlayId === undefined) {
     throw new Error("Layout id must be defined");
   }
   var queryParams = {
-    overlayId : overlayId,
-    modelId : "*",
+    overlayId: overlayId,
+    modelId: "*",
   };
   var filterParams = {};
-  return self.getProjectId(projectId).then(function(result) {
+  return self.getProjectId(projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getOverlayElementsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var arr = JSON.parse(content);
     var result = [];
     for (var i = 0; i < arr.length; i++) {
@@ -908,20 +937,20 @@ ServerConnector.getOverlayElements = function(overlayId, projectId) {
   });
 };
 
-ServerConnector.getFullOverlayElement = function(params) {
+ServerConnector.getFullOverlayElement = function (params) {
   var self = this;
 
   var queryParams = {
-    overlayId : params.overlay.getId(),
-    modelId : params.element.getModelId(),
-    id : params.element.getId(),
+    overlayId: params.overlay.getId(),
+    modelId: params.element.getModelId(),
+    id: params.element.getId(),
   };
   var filterParams = {};
 
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getFullOverlayElementUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var element = JSON.parse(content);
     var result = null;
     if (element.type === "REACTION") {
@@ -935,7 +964,7 @@ ServerConnector.getFullOverlayElement = function(params) {
   });
 };
 
-ServerConnector.getProjectId = function(projectId) {
+ServerConnector.getProjectId = function (projectId) {
   var self = this;
   if (projectId !== undefined && projectId !== null && projectId !== "") {
     return Promise.resolve(projectId);
@@ -946,33 +975,33 @@ ServerConnector.getProjectId = function(projectId) {
   }
 };
 
-ServerConnector.getLogoImg = function() {
+ServerConnector.getLogoImg = function () {
   return this.getConfigurationParam(ConfigurationType.LOGO_IMG);
 };
 
-ServerConnector.getLogoLink = function() {
+ServerConnector.getLogoLink = function () {
   return this.getConfigurationParam(ConfigurationType.LOGO_LINK);
 };
 
-ServerConnector.getMaxSearchDistance = function() {
+ServerConnector.getMaxSearchDistance = function () {
   return this.getConfigurationParam(ConfigurationType.SEARCH_DISTANCE);
 };
 
-ServerConnector.getOverlayById = function(overlayId, projectId) {
+ServerConnector.getOverlayById = function (overlayId, projectId) {
   var self = this;
   var queryParams = {
-    overlayId : overlayId
+    overlayId: overlayId
   };
   var filterParams = {};
-  return self.getProjectId(projectId).then(function(data) {
+  return self.getProjectId(projectId).then(function (data) {
     queryParams.projectId = data;
     return self.sendGetRequest(self.getOverlayByIdUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     return new LayoutData(JSON.parse(content));
   });
 };
 
-ServerConnector.getReactions = function(params) {
+ServerConnector.getReactions = function (params) {
   var self = this;
   var queryParams = {};
   if (params.ids === undefined) {
@@ -982,11 +1011,11 @@ ServerConnector.getReactions = function(params) {
     params.participantId = [];
   }
   var filterParams = {
-    id : params.ids,
-    columns : params.columns,
-    participantId : params.participantId,
+    id: params.ids,
+    columns: params.columns,
+    participantId: params.participantId,
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     if (filterParams.id.length > 100 || filterParams.participantId.length > 100) {
       return self.sendPostRequest(self.getReactionsUrl(queryParams), filterParams);
@@ -994,7 +1023,7 @@ ServerConnector.getReactions = function(params) {
       return self.sendGetRequest(self.getReactionsUrl(queryParams, filterParams));
     }
 
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1004,10 +1033,10 @@ ServerConnector.getReactions = function(params) {
   });
 };
 
-ServerConnector.getAliases = function(params) {
+ServerConnector.getAliases = function (params) {
   var self = this;
   var queryParams = {
-    modelId : params.modelId,
+    modelId: params.modelId,
   };
   if (params.ids === undefined) {
     params.ids = [];
@@ -1019,21 +1048,21 @@ ServerConnector.getAliases = function(params) {
     params.excludedCompartmentIds = [];
   }
   var filterParams = {
-    id : params.ids,
-    columns : params.columns,
-    type : params.type,
-    excludedCompartmentIds : params.excludedCompartmentIds,
-    includedCompartmentIds : params.includedCompartmentIds,
+    id: params.ids,
+    columns: params.columns,
+    type: params.type,
+    excludedCompartmentIds: params.excludedCompartmentIds,
+    includedCompartmentIds: params.includedCompartmentIds,
 
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     if (filterParams.id.length > 100) {
       return self.sendPostRequest(self.getAliasesUrl(queryParams), filterParams);
     } else {
       return self.sendGetRequest(self.getAliasesUrl(queryParams, filterParams));
     }
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1043,25 +1072,25 @@ ServerConnector.getAliases = function(params) {
   });
 };
 
-ServerConnector.getLightComments = function(params) {
-  params.columns = [ "id", "elementId", "modelId", "type", "icon", "removed", "pinned" ];
+ServerConnector.getLightComments = function (params) {
+  params.columns = ["id", "elementId", "modelId", "type", "icon", "removed", "pinned"];
   return this.getComments(params);
 };
 
-ServerConnector.getComments = function(params) {
+ServerConnector.getComments = function (params) {
   var self = this;
   var queryParams = {
-    elementId : params.elementId,
-    elementType : params.elementType,
-    coordinates : params.coordinates,
+    elementId: params.elementId,
+    elementType: params.elementType,
+    coordinates: params.coordinates,
   };
   var filterParams = {
-    columns : params.columns
+    columns: params.columns
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getCommentsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1071,7 +1100,7 @@ ServerConnector.getComments = function(params) {
   });
 };
 
-ServerConnector.getSessionData = function(project) {
+ServerConnector.getSessionData = function (project) {
   if (this._sessionData === undefined) {
     this._sessionData = new SessionData(project);
   }
@@ -1081,19 +1110,19 @@ ServerConnector.getSessionData = function(project) {
   return this._sessionData;
 };
 
-ServerConnector.getClosestElementsByCoordinates = function(params) {
+ServerConnector.getClosestElementsByCoordinates = function (params) {
   var self = this;
   var queryParams = {
-    modelId : params.modelId
+    modelId: params.modelId
   };
   var filterParams = {
-    coordinates : params.coordinates,
-    count : params.count,
+    coordinates: params.coordinates,
+    count: params.count,
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1103,7 +1132,7 @@ ServerConnector.getClosestElementsByCoordinates = function(params) {
   });
 };
 
-ServerConnector.login = function(login, password) {
+ServerConnector.login = function (login, password) {
   var self = this;
   var params = {};
   if (login !== undefined && login !== "") {
@@ -1113,10 +1142,10 @@ ServerConnector.login = function(login, password) {
     params.login = "anonymous";
   }
   self.getSessionData().setToken("");
-  return self.sendPostRequest(self.loginUrl(), params).then(function() {
+  return self.sendPostRequest(self.loginUrl(), params).then(function () {
     self.getSessionData().setLogin(params.login);
     return Promise.resolve(self.getSessionData().getToken());
-  }, function(error) {
+  }, function (error) {
     if (error instanceof NetworkError && error.statusCode === HttpStatus.FORBIDDEN) {
       throw new InvalidCredentialsError("Invalid credentials");
     } else {
@@ -1125,27 +1154,27 @@ ServerConnector.login = function(login, password) {
   });
 };
 
-ServerConnector.logout = function() {
+ServerConnector.logout = function () {
   var self = this;
   self.getSessionData().setToken(undefined);
   self.getSessionData().setLogin(undefined);
   return self.sendGetRequest(self.logoutUrl());
 };
 
-ServerConnector.getElementsByQuery = function(params) {
+ServerConnector.getElementsByQuery = function (params) {
   var self = this;
   var queryParams = {
-    modelId : params.modelId
+    modelId: params.modelId
   };
   var filterParams = {
-    query : params.query,
-    perfectMatch : params.perfectMatch,
+    query: params.query,
+    perfectMatch: params.perfectMatch,
   };
 
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1155,16 +1184,16 @@ ServerConnector.getElementsByQuery = function(params) {
   });
 };
 
-ServerConnector.getDrugsByQuery = function(params) {
+ServerConnector.getDrugsByQuery = function (params) {
   var self = this;
   var queryParams = {};
   var filterParams = {
-    query : params.query
+    query: params.query
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchDrugsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1174,16 +1203,16 @@ ServerConnector.getDrugsByQuery = function(params) {
   });
 };
 
-ServerConnector.getMiRnasByQuery = function(params) {
+ServerConnector.getMiRnasByQuery = function (params) {
   var self = this;
   var queryParams = {};
   var filterParams = {
-    query : params.query
+    query: params.query
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchMiRnasUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1193,16 +1222,16 @@ ServerConnector.getMiRnasByQuery = function(params) {
   });
 };
 
-ServerConnector.getChemicalsByQuery = function(params) {
+ServerConnector.getChemicalsByQuery = function (params) {
   var self = this;
   var queryParams = {};
   var filterParams = {
-    query : params.query
+    query: params.query
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchChemicalsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var array = JSON.parse(content);
     var result = [];
     for (var i = 0; i < array.length; i++) {
@@ -1212,96 +1241,96 @@ ServerConnector.getChemicalsByQuery = function(params) {
   });
 };
 
-ServerConnector.getOverlaySourceDownloadUrl = function(params) {
+ServerConnector.getOverlaySourceDownloadUrl = function (params) {
   var self = this;
   var queryParams = {
-    overlayId : params.overlayId
+    overlayId: params.overlayId
   };
   var filterParams = {};
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.getOverlaySourceUrl(queryParams, filterParams);
   });
 };
 
-ServerConnector.getImageDownloadUrl = function(params) {
+ServerConnector.getImageDownloadUrl = function (params) {
   var self = this;
   var queryParams = {
-    projectId : params.projectId,
-    modelId : params.modelId,
+    projectId: params.projectId,
+    modelId: params.modelId,
   };
   var filterParams = {
-    token : params.token,
-    polygonString : params.polygonString,
-    handlerClass : params.handlerClass,
-    backgroundOverlayId : params.backgroundOverlayId,
-    zoomLevel : params.zoomLevel,
-    overlayIds : this.idsToString(params.overlayIds),
+    token: params.token,
+    polygonString: params.polygonString,
+    handlerClass: params.handlerClass,
+    backgroundOverlayId: params.backgroundOverlayId,
+    zoomLevel: params.zoomLevel,
+    overlayIds: this.idsToString(params.overlayIds),
   };
 
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.getImageUrl(queryParams, filterParams);
   });
 };
 
-ServerConnector.getModelDownloadUrl = function(params) {
+ServerConnector.getModelDownloadUrl = function (params) {
   var self = this;
   var queryParams = {
-    projectId : params.projectId,
-    modelId : params.modelId,
+    projectId: params.projectId,
+    modelId: params.modelId,
   };
   var filterParams = {
-    token : params.token,
-    polygonString : params.polygonString,
-    handlerClass : params.handlerClass,
-    backgroundOverlayId : params.backgroundOverlayId,
-    zoomLevel : params.zoomLevel,
-    overlayIds : this.idsToString(params.overlayIds),
+    token: params.token,
+    polygonString: params.polygonString,
+    handlerClass: params.handlerClass,
+    backgroundOverlayId: params.backgroundOverlayId,
+    zoomLevel: params.zoomLevel,
+    overlayIds: this.idsToString(params.overlayIds),
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.getModelPartUrl(queryParams, filterParams);
   });
 };
 
-ServerConnector.getImageConverters = function() {
+ServerConnector.getImageConverters = function () {
   var self = this;
-  return self.getConfiguration().then(function(configuration) {
+  return self.getConfiguration().then(function (configuration) {
     return configuration.getImageConverters();
   });
 };
-ServerConnector.getModelConverters = function() {
+ServerConnector.getModelConverters = function () {
   var self = this;
-  return self.getConfiguration().then(function(configuration) {
+  return self.getConfiguration().then(function (configuration) {
     return configuration.getModelConverters();
   });
 };
 
-ServerConnector.getProjectSourceDownloadUrl = function(params) {
+ServerConnector.getProjectSourceDownloadUrl = function (params) {
   if (params === undefined) {
     params = {};
   }
   var queryParams = {};
   var filterParams = {};
   var self = this;
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.getProjectSourceUrl(queryParams, filterParams);
   });
 };
 
-ServerConnector.getDrugNamesByTarget = function(params) {
+ServerConnector.getDrugNamesByTarget = function (params) {
   var self = this;
   var queryParams = {};
   var filterParams = {
-    columns : [ "name" ],
-    target : params.target.getType() + ":" + params.target.getId()
+    columns: ["name"],
+    target: params.target.getType() + ":" + params.target.getId()
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchDrugsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var result = [];
     var object = JSON.parse(content);
     for (var i = 0; i < object.length; i++) {
@@ -1311,17 +1340,17 @@ ServerConnector.getDrugNamesByTarget = function(params) {
   });
 };
 
-ServerConnector.getMiRnaNamesByTarget = function(params) {
+ServerConnector.getMiRnaNamesByTarget = function (params) {
   var self = this;
   var queryParams = {};
   var filterParams = {
-    columns : [ "name" ],
-    target : params.target.getType() + ":" + params.target.getId()
+    columns: ["name"],
+    target: params.target.getType() + ":" + params.target.getId()
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchMiRnasUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var result = [];
     var object = JSON.parse(content);
     for (var i = 0; i < object.length; i++) {
@@ -1331,17 +1360,17 @@ ServerConnector.getMiRnaNamesByTarget = function(params) {
   });
 };
 
-ServerConnector.getChemicalNamesByTarget = function(params) {
+ServerConnector.getChemicalNamesByTarget = function (params) {
   var self = this;
   var queryParams = {};
   var filterParams = {
-    columns : [ "name" ],
-    target : params.target.getType() + ":" + params.target.getId()
+    columns: ["name"],
+    target: params.target.getType() + ":" + params.target.getId()
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getSearchChemicalsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     var result = [];
     var object = JSON.parse(content);
     for (var i = 0; i < object.length; i++) {
@@ -1351,13 +1380,13 @@ ServerConnector.getChemicalNamesByTarget = function(params) {
   });
 };
 
-ServerConnector.addComment = function(params) {
+ServerConnector.addComment = function (params) {
   var self = this;
   var queryParams = {
-    elementId : params.elementId,
-    elementType : params.elementType,
-    coordinates : self.pointToString(params.coordinates),
-    modelId : params.modelId,
+    elementId: params.elementId,
+    elementType: params.elementType,
+    coordinates: self.pointToString(params.coordinates),
+    modelId: params.modelId,
   };
   var filterParams = params;
   delete filterParams.elementId;
@@ -1368,16 +1397,16 @@ ServerConnector.addComment = function(params) {
     filterParams.coordinates = self.pointToString(params.coordinates);
   }
   delete filterParams.modelId;
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendPostRequest(self.addCommentUrl(queryParams), filterParams);
-  }).then(function(content) {
+  }).then(function (content) {
     var response = JSON.parse(content);
     return new Comment(response);
   });
 };
 
-ServerConnector.addOverlay = function(params) {
+ServerConnector.addOverlay = function (params) {
   var overlay = params.overlay;
   if (!(overlay instanceof LayoutData)) {
     throw new Error("Invalid overlay: " + overlay);
@@ -1385,79 +1414,79 @@ ServerConnector.addOverlay = function(params) {
   var self = this;
   var queryParams = {};
   var data = {
-    name : overlay.getName(),
-    description : overlay.getDescription(),
-    content : overlay.getContent(),
-    filename : overlay.getFilename(),
+    name: overlay.getName(),
+    description: overlay.getDescription(),
+    content: overlay.getContent(),
+    filename: overlay.getFilename(),
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendPostRequest(self.addOverlayUrl(queryParams), data);
-  }).then(function(content) {
+  }).then(function (content) {
     return new LayoutData(JSON.parse(content));
   });
 };
 
-ServerConnector.updateOverlay = function(overlay) {
+ServerConnector.updateOverlay = function (overlay) {
   var self = this;
   var queryParams = {
-    overlayId : overlay.getId(),
+    overlayId: overlay.getId(),
   };
   var filterParams = {
-    overlay : {
-      name : overlay.getName(),
-      description : overlay.getDescription(),
-      creator : overlay.getCreator(),
-      publicOverlay : overlay.getPublicOverlay(),
+    overlay: {
+      name: overlay.getName(),
+      description: overlay.getDescription(),
+      creator: overlay.getCreator(),
+      publicOverlay: overlay.getPublicOverlay(),
     }
   };
   return self.sendPatchRequest(self.updateOverlayUrl(queryParams), filterParams);
 };
 
-ServerConnector.removeOverlay = function(params) {
+ServerConnector.removeOverlay = function (params) {
   var self = this;
   var queryParams = {
-    overlayId : params.overlayId
+    overlayId: params.overlayId
   };
   var filterParams = {};
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendDeleteRequest(self.deleteOverlayUrl(queryParams), filterParams);
   });
 };
 
-ServerConnector.removeComment = function(params) {
+ServerConnector.removeComment = function (params) {
   var self = this;
   var queryParams = {
-    commentId : params.commentId
+    commentId: params.commentId
   };
   var filterParams = {};
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendDeleteRequest(self.deleteCommentUrl(queryParams), filterParams);
   });
 };
 
-ServerConnector.getSuggestedQueryList = function(projectId) {
+ServerConnector.getSuggestedQueryList = function (projectId) {
   var self = this;
-  return self.getProjectId(projectId).then(function(result) {
+  return self.getProjectId(projectId).then(function (result) {
     projectId = result;
     return self.sendGetRequest(self.getSuggestedQueryListUrl({
-      projectId : projectId
+      projectId: projectId
     }));
-  }).then(function(content) {
+  }).then(function (content) {
     return JSON.parse(content);
   });
 };
 
-ServerConnector.getOverlayTypes = function() {
+ServerConnector.getOverlayTypes = function () {
   var self = this;
-  return self.getConfiguration().then(function(configuration) {
+  return self.getConfiguration().then(function (configuration) {
     return configuration.getOverlayTypes();
   });
 };
 
-ServerConnector.getPublications = function(params) {
+ServerConnector.getPublications = function (params) {
   var self = this;
   if (params === undefined) {
     params = {};
@@ -1465,24 +1494,24 @@ ServerConnector.getPublications = function(params) {
 
   var queryParams = {};
   var filterParams = {
-    start : params.start,
-    length : params.length,
-    sortColumn : params.sortColumn,
-    sortOrder : params.sortOrder,
-    search : params.search,
+    start: params.start,
+    length: params.length,
+    sortColumn: params.sortColumn,
+    sortOrder: params.sortOrder,
+    search: params.search,
   };
-  return self.getProjectId(params.projectId).then(function(result) {
+  return self.getProjectId(params.projectId).then(function (result) {
     queryParams.projectId = result;
     return self.sendGetRequest(self.getPublicationsUrl(queryParams, filterParams));
-  }).then(function(content) {
+  }).then(function (content) {
     return JSON.parse(content);
   });
 };
 
-ServerConnector.getReferenceGenome = function(params) {
+ServerConnector.getReferenceGenome = function (params) {
   var self = this;
   var filterParams = {};
-  return self.sendGetRequest(self.getReferenceGenomeUrl(params, filterParams)).then(function(content) {
+  return self.sendGetRequest(self.getReferenceGenomeUrl(params, filterParams)).then(function (content) {
     return new ReferenceGenome(JSON.parse(content));
   });
 };
diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
index fbc215fbe7..7bc7d1d163 100644
--- a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
@@ -13,11 +13,11 @@ var GuiConnector = require('../../GuiConnector');
 var Promise = require("bluebird");
 
 function MapsAdminPanel(params) {
-    var self = this;
-    AbstractAdminPanel.call(self, params);
-    self._createGui();
+  var self = this;
+  AbstractAdminPanel.call(self, params);
+  self._createGui();
 
-    $(self.getElement()).addClass("minerva-projects-tab");
+  $(self.getElement()).addClass("minerva-projects-tab");
 
 }
 
@@ -25,256 +25,264 @@ MapsAdminPanel.prototype = Object.create(AbstractAdminPanel.prototype);
 MapsAdminPanel.prototype.constructor = MapsAdminPanel;
 
 MapsAdminPanel.prototype._createGui = function () {
-    var self = this;
-    var projectsDiv = Functions.createElement({
-        type: "div",
-    });
-    self.getElement().appendChild(projectsDiv);
-
-    var dataDiv = Functions.createElement({
-        type: "div",
-        style: "display:table; width:100%",
-    });
-    projectsDiv.appendChild(dataDiv);
-
-    dataDiv.appendChild(self._createMenuRow());
-    dataDiv.appendChild(self._createProjectTableRow());
-    dataDiv.appendChild(self._createMenuRow());
+  var self = this;
+  var projectsDiv = Functions.createElement({
+    type: "div",
+  });
+  self.getElement().appendChild(projectsDiv);
+
+  var dataDiv = Functions.createElement({
+    type: "div",
+    style: "display:table; width:100%",
+  });
+  projectsDiv.appendChild(dataDiv);
+
+  dataDiv.appendChild(self._createMenuRow());
+  dataDiv.appendChild(self._createProjectTableRow());
+  dataDiv.appendChild(self._createMenuRow());
 
 };
 
 MapsAdminPanel.prototype._createMenuRow = function () {
-    var self = this;
-    var menuRow = Functions.createElement({
-        type: "div",
-        className: "minerva-menu-row",
-        style: "display:table-row; margin:10px",
-    });
-
-    var addProjectButton = Functions.createElement({
-        type: "button",
-        name: "addProject",
-        content: '<span class="ui-icon ui-icon-circle-plus"></span>&nbsp;ADD PROJECT',
-        onclick: function () {
-            return self.onAddClicked().then(null, GuiConnector.alert);
-        },
-    });
-    var refreshButton = Functions.createElement({
-        type: "button",
-        name: "refreshProject",
-        content: '<span class="ui-icon ui-icon-refresh"></span>&nbsp;REFRESH',
-        onclick: function () {
-            return self.onRefreshClicked().then(null, GuiConnector.alert);
-        },
-    });
-    menuRow.appendChild(addProjectButton);
-    menuRow.appendChild(refreshButton);
-    return menuRow;
+  var self = this;
+  var menuRow = Functions.createElement({
+    type: "div",
+    className: "minerva-menu-row",
+    style: "display:table-row; margin:10px",
+  });
+
+  var addProjectButton = Functions.createElement({
+    type: "button",
+    name: "addProject",
+    content: '<span class="ui-icon ui-icon-circle-plus"></span>&nbsp;ADD PROJECT',
+    onclick: function () {
+      return self.onAddClicked().then(null, GuiConnector.alert);
+    },
+  });
+  var refreshButton = Functions.createElement({
+    type: "button",
+    name: "refreshProject",
+    content: '<span class="ui-icon ui-icon-refresh"></span>&nbsp;REFRESH',
+    onclick: function () {
+      return self.onRefreshClicked().then(null, GuiConnector.alert);
+    },
+  });
+  menuRow.appendChild(addProjectButton);
+  menuRow.appendChild(refreshButton);
+  return menuRow;
 };
 
 MapsAdminPanel.prototype._createProjectTableRow = function () {
-    var self = this;
-    var projectsRow = Functions.createElement({
-        type: "div",
-        style: "display:table-row; width:100%",
-    });
-
-    var projectsTable = Functions.createElement({
-        type: "table",
-        name: "projectsTable",
-        className: "display",
-        style: "width:100%",
-    });
-    projectsRow.appendChild(projectsTable);
-
-    $(projectsTable).DataTable({
-        fnRowCallback: function (nRow, aData) {
-            nRow.setAttribute('id', aData[0]);
-        },
-        columns: [{
-            title: 'ProjectId',
-        }, {
-            title: 'Name',
-        }, {
-            title: 'Disease',
-        }, {
-            title: 'Organism',
-        }, {
-            title: 'Status',
-        }, {
-            title: 'Edit',
-        }, {
-            title: 'Remove',
-        },],
-    });
-    $(projectsTable).on("click", "[name='removeProject']", function () {
-        var button = this;
-        return self.removeProject($(button).attr("data")).then(null, GuiConnector.alert);
-    });
-
-    $(projectsTable).on("click", "[name='showEditDialog']", function () {
-        var button = this;
-        return self.showEditDialog($(button).attr("data")).then(null, GuiConnector.alert);
-    });
-
-    return projectsRow;
+  var self = this;
+  var projectsRow = Functions.createElement({
+    type: "div",
+    style: "display:table-row; width:100%",
+  });
+
+  var projectsTable = Functions.createElement({
+    type: "table",
+    name: "projectsTable",
+    className: "display",
+    style: "width:100%",
+  });
+  projectsRow.appendChild(projectsTable);
+
+  $(projectsTable).DataTable({
+    fnRowCallback: function (nRow, aData) {
+      nRow.setAttribute('id', aData[0]);
+    },
+    columns: [{
+      title: 'ProjectId',
+    }, {
+      title: 'Name',
+    }, {
+      title: 'Disease',
+    }, {
+      title: 'Organism',
+    }, {
+      title: 'Status',
+    }, {
+      title: 'Edit',
+    }, {
+      title: 'Remove',
+    },],
+  });
+  $(projectsTable).on("click", "[name='removeProject']", function () {
+    var button = this;
+    return self.removeProject($(button).attr("data")).then(null, GuiConnector.alert);
+  });
+
+  $(projectsTable).on("click", "[name='showEditDialog']", function () {
+    var button = this;
+    return self.showEditDialog($(button).attr("data")).then(null, GuiConnector.alert);
+  });
+
+  return projectsRow;
 };
 
 MapsAdminPanel.prototype.init = function () {
-    var self = this;
-    return ServerConnector.getProjects().then(function (projects) {
-        return self.setProjects(projects);
-    });
+  var self = this;
+  return ServerConnector.getProjects().then(function (projects) {
+    return self.setProjects(projects);
+  });
 };
 
 MapsAdminPanel.prototype.projectToTableRow = function (project, row) {
-    var self = this;
-    var disease = self.getHtmlStringLink(project.getDisease());
-    var organism = self.getHtmlStringLink(project.getOrganism());
-
-    if (row === undefined) {
-        row = [];
-    }
-    row[0] = project.getProjectId();
-    row[1] = project.getName();
-    row[2] = disease;
-    row[3] = organism;
-    row[4] = project.getStatus();
-    row[5] = "<button name='showEditDialog' data='" + project.getProjectId() + "'>EDIT</button>";
-    row[6] = "<button name='removeProject' data='" + project.getProjectId() + "'>REMOVE</button>";
-
-    return row;
+  var self = this;
+  var disease = self.getHtmlStringLink(project.getDisease());
+  var organism = self.getHtmlStringLink(project.getOrganism());
+
+  if (row === undefined) {
+    row = [];
+  }
+  var projectId = project.getProjectId();
+  var formattedProjectId;
+  if (project.getStatus().toLowerCase() === "ok") {
+    formattedProjectId = "<a href='" + "index.xhtml?id=" + projectId + "' target='" + projectId + "'>" + projectId + "</a>";
+  } else {
+    formattedProjectId = projectId
+  }
+
+  row[0] = formattedProjectId;
+  row[1] = project.getName();
+  row[2] = disease;
+  row[3] = organism;
+  row[4] = project.getStatus();
+  row[5] = "<button name='showEditDialog' data='" + project.getProjectId() + "'>EDIT</button>";
+  row[6] = "<button name='removeProject' data='" + project.getProjectId() + "'>REMOVE</button>";
+
+  return row;
 };
 
 MapsAdminPanel.prototype.getHtmlStringLink = function (annotation) {
-    var self = this;
-    if (annotation !== undefined && annotation !== null) {
-        var link = self.getGuiUtils().createAnnotationLink(annotation, true);
-        var tmp = document.createElement("div");
-        tmp.appendChild(link);
-        return tmp.innerHTML;
-    } else {
-        return "N/A";
-    }
+  var self = this;
+  if (annotation !== undefined && annotation !== null) {
+    var link = self.getGuiUtils().createAnnotationLink(annotation, true);
+    var tmp = document.createElement("div");
+    tmp.appendChild(link);
+    return tmp.innerHTML;
+  } else {
+    return "N/A";
+  }
 
 };
 
 MapsAdminPanel.prototype.setProjects = function (projects) {
-    var self = this;
-    var dataTable = $($("[name='projectsTable']", self.getElement())[0]).DataTable();
-    var data = [];
-    for (var i = 0; i < projects.length; i++) {
-        var project = projects[i];
-        var rowData = self.projectToTableRow(project);
-        self.addUpdateListener(project, rowData);
-        data.push(rowData);
-    }
-    dataTable.clear().rows.add(data).draw();
+  var self = this;
+  var dataTable = $($("[name='projectsTable']", self.getElement())[0]).DataTable();
+  var data = [];
+  for (var i = 0; i < projects.length; i++) {
+    var project = projects[i];
+    var rowData = self.projectToTableRow(project);
+    self.addUpdateListener(project, rowData);
+    data.push(rowData);
+  }
+  dataTable.clear().rows.add(data).draw();
 };
 
 MapsAdminPanel.prototype.addUpdateListener = function (project, dataTableRow) {
-    var self = this;
-
-    var listenerName = "PROJECT_LIST_LISTENER";
-    var listeners = project.getListeners("onreload");
-    for (var i = 0; i < listeners.length; i++) {
-        if (listeners[i].listenerName === listenerName) {
-            project.removeListener("onreload", listeners[i]);
-        }
+  var self = this;
+
+  var listenerName = "PROJECT_LIST_LISTENER";
+  var listeners = project.getListeners("onreload");
+  for (var i = 0; i < listeners.length; i++) {
+    if (listeners[i].listenerName === listenerName) {
+      project.removeListener("onreload", listeners[i]);
+    }
+  }
+  var listener = function () {
+    self.projectToTableRow(project, dataTableRow);
+    var row = $($("[name='projectsTable']", self.getElement())[0]).DataTable().row("#" + project.getProjectId());
+    if (row.length > 0) {
+      row.data(dataTableRow).draw();
     }
-    var listener = function () {
-        self.projectToTableRow(project, dataTableRow);
-        var row = $($("[name='projectsTable']", self.getElement())[0]).DataTable().row("#" + project.getProjectId());
-        if (row.length > 0) {
-            row.data(dataTableRow).draw();
-        }
-
-    };
-    listener.listenerName = listenerName;
-    project.addListener("onreload", listener);
+
+  };
+  listener.listenerName = listenerName;
+  project.addListener("onreload", listener);
 };
 
 MapsAdminPanel.prototype.onAddClicked = function () {
-    var self = this;
-    var dialog = self._addDialog;
-    if (dialog === undefined) {
-        dialog = new AddProjectDialog({
-            element: Functions.createElement({
-                type: "div"
-            }),
-            customMap: null,
-        });
-        self._addDialog = dialog;
-        return dialog.init().then(function () {
-            return dialog.open();
-        });
-    } else {
-        dialog.clear();
-        dialog.open();
-        return Promise.resolve();
-    }
+  var self = this;
+  var dialog = self._addDialog;
+  if (dialog === undefined) {
+    dialog = new AddProjectDialog({
+      element: Functions.createElement({
+        type: "div"
+      }),
+      customMap: null,
+    });
+    self._addDialog = dialog;
+    return dialog.init().then(function () {
+      return dialog.open();
+    });
+  } else {
+    dialog.clear();
+    dialog.open();
+    return Promise.resolve();
+  }
 };
 
 MapsAdminPanel.prototype.destroy = function () {
-    var self = this;
-    var dialog = self._addDialog;
-    if (dialog !== undefined) {
-        dialog.destroy();
-    }
-    var table = $("[name='projectsTable']", self.getElement())[0];
-    if ($.fn.DataTable.isDataTable(table)) {
-        $(table).DataTable().destroy();
-    }
+  var self = this;
+  var dialog = self._addDialog;
+  if (dialog !== undefined) {
+    dialog.destroy();
+  }
+  var table = $("[name='projectsTable']", self.getElement())[0];
+  if ($.fn.DataTable.isDataTable(table)) {
+    $(table).DataTable().destroy();
+  }
 
 };
 
 MapsAdminPanel.prototype.onRefreshClicked = function () {
-    var self = this;
-    return ServerConnector.getProjects(true).then(function (projects) {
-        return self.setProjects(projects);
-    });
+  var self = this;
+  return ServerConnector.getProjects(true).then(function (projects) {
+    return self.setProjects(projects);
+  });
 };
 
 MapsAdminPanel.prototype.getDialog = function (project) {
-    var self = this;
-    if (self._dialogs === undefined) {
-        self._dialogs = [];
-    }
-    var dialog = self._dialogs[project.getProjectId()];
-    if (dialog === undefined) {
-        dialog = new EditProjectDialog({
-            element: Functions.createElement({
-                type: "div"
-            }),
-            project: project,
-            customMap: null,
-        });
-        self._dialogs[project.getProjectId()] = dialog;
-        return dialog.init().then(function () {
-            return dialog;
-        });
-    } else {
-        return Promise.resolve(dialog);
-    }
+  var self = this;
+  if (self._dialogs === undefined) {
+    self._dialogs = [];
+  }
+  var dialog = self._dialogs[project.getProjectId()];
+  if (dialog === undefined) {
+    dialog = new EditProjectDialog({
+      element: Functions.createElement({
+        type: "div"
+      }),
+      project: project,
+      customMap: null,
+    });
+    self._dialogs[project.getProjectId()] = dialog;
+    return dialog.init().then(function () {
+      return dialog;
+    });
+  } else {
+    return Promise.resolve(dialog);
+  }
 };
 
 MapsAdminPanel.prototype.showEditDialog = function (id) {
-    var self = this;
-    GuiConnector.showProcessing();
-    return ServerConnector.getProject(id).then(function (project) {
-        return self.getDialog(project);
-    }).then(function (dialog) {
-
-        dialog.open();
-        GuiConnector.hideProcessing();
-    }).then(null, function (error) {
-        GuiConnector.hideProcessing();
-        return Promise.reject(error);
-    });
+  var self = this;
+  GuiConnector.showProcessing();
+  return ServerConnector.getProject(id).then(function (project) {
+    return self.getDialog(project);
+  }).then(function (dialog) {
+
+    dialog.open();
+    GuiConnector.hideProcessing();
+  }).then(null, function (error) {
+    GuiConnector.hideProcessing();
+    return Promise.reject(error);
+  });
 };
 
 MapsAdminPanel.prototype.removeProject = function (id) {
-    return Promise.reject(new Error("Not implemented"));
+  return ServerConnector.removeProject(id);
 };
 
 module.exports = MapsAdminPanel;
diff --git a/frontend-js/src/test/js/ServerConnector-test.js b/frontend-js/src/test/js/ServerConnector-test.js
index 0b35b2445c..d5f88e3e4e 100644
--- a/frontend-js/src/test/js/ServerConnector-test.js
+++ b/frontend-js/src/test/js/ServerConnector-test.js
@@ -60,6 +60,17 @@ describe('ServerConnector', function() {
       });
     });
   });
+  describe('removeProject', function() {
+    it('default', function() {
+      var project;
+      return ServerConnector.getProject().then(function(result) {
+        project = result;
+        return ServerConnector.removeProject(project.getProjectId());
+      }).then(function(result) {
+        assert.ok(project === result);
+      });
+    });
+  });
 
   it('getModels', function() {
     return ServerConnector.getModels("sample").then(function(models) {
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/DELETE_token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/DELETE_token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000..d8aff0348e
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/DELETE_token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+{"version":"0","disease":{"resource":"D010300","link":"http://bioportal.bioontology.org/ontologies/1351?p=terms&conceptid=D010300","id":1104479,"type":"MESH_2012"},"organism":{"resource":"1570291","link":"http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=1570291","id":1104480,"type":"TAXONOMY"},"idObject":14898,"status":"Ok","progress":100.0,"name":"UNKNOWN DISEASE MAP","projectId":"sample","overviewImageViews":[],"topOverviewImage":null}
\ No newline at end of file
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
index eb4bfd9d6c..793084e98a 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
@@ -71,6 +71,15 @@ public class ProjectController extends BaseController {
 
 	}
 
+	@RequestMapping(value = "/projects/{projectId:.+}", method = { RequestMethod.DELETE }, produces = { MediaType.APPLICATION_JSON_VALUE })
+	public ProjectMetaData removeProject(//
+			@PathVariable(value = "projectId") String projectId, //
+			@CookieValue(value = Configuration.AUTH_TOKEN) String token //
+	) throws SecurityException, IOException, QueryException {
+		return projectController.removeProject(token, projectId, context.getRealPath("/"));
+
+	}
+
 	@RequestMapping(value = "/projects/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
 	public List<ProjectMetaData> getProjects(//
 			@CookieValue(value = Configuration.AUTH_TOKEN) String token //
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
index 265fb97e79..652a49ce9e 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
@@ -544,4 +544,11 @@ public class ProjectRestImpl extends BaseRestImpl {
 		return null;
 	}
 
+	public ProjectMetaData removeProject(String token, String projectId, String path) throws ObjectNotFoundException, SecurityException {
+		AuthenticationToken authenticationToken = getUserService().getToken(token);
+		Project project = getProjectService().getProjectByProjectId(projectId, authenticationToken);
+		getProjectService().removeProject(project, path, true, authenticationToken);
+		return getProject(projectId, token);
+	}
+
 }
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
index 21ccc3f302..173b6102c2 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
@@ -50,6 +50,7 @@ import lcsb.mapviewer.model.user.UserAnnotationSchema;
 import lcsb.mapviewer.model.user.UserClassAnnotators;
 import lcsb.mapviewer.model.user.UserClassValidAnnotations;
 import lcsb.mapviewer.persist.dao.map.species.ElementDao;
+import lcsb.mapviewer.services.SecurityException;
 import lcsb.mapviewer.services.ServiceTestFunctions;
 import lcsb.mapviewer.services.UserAccessException;
 import lcsb.mapviewer.services.overlay.AnnotatedObjectTreeRow;
@@ -692,7 +693,7 @@ public class ProjectServiceTest extends ServiceTestFunctions {
 		}
 	}
 
-	protected Project createComplexProject(String projectId, String filename) throws IOException, UserAccessException {
+	protected Project createComplexProject(String projectId, String filename) throws IOException, SecurityException {
 		CreateProjectParams params = new CreateProjectParams();
 
 		ZipFile zipFile = new ZipFile(filename);
diff --git a/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java b/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java
index 4f3bf0c8d8..2dc3e22ad0 100644
--- a/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java
+++ b/web/src/main/java/lcsb/mapviewer/bean/ProjectBean.java
@@ -54,6 +54,7 @@ import lcsb.mapviewer.model.map.model.SubmodelType;
 import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
+import lcsb.mapviewer.services.SecurityException;
 import lcsb.mapviewer.services.UserAccessException;
 import lcsb.mapviewer.services.interfaces.IConfigurationService;
 import lcsb.mapviewer.services.interfaces.IModelService;
@@ -623,9 +624,9 @@ public class ProjectBean extends AbstractManagedBean implements Serializable {
 	 * 
 	 * @param file
 	 *          file with the model in CellDesigner format
-	 * @throws UserAccessException
+	 * @throws SecurityException 
 	 */
-	protected void generateProject(final File file) throws UserAccessException {
+	protected void generateProject(final File file) throws SecurityException {
 		// if project with this name already exists then add random suffix
 		String projectId = getNewProjectId();
 		if (projectService.projectExists(getNewProjectId())) {
-- 
GitLab