diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index cb419086e9453c8bf57c7d7fa59b4e24ade3c2f5..19c3339fd9c9915eb5b8554c578e0d88288d3f06 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -11,6 +11,7 @@ var request = require('request');
 var HttpStatus = require('http-status-codes');
 
 var Alias = require('./map/data/Alias');
+var Annotation = require('./map/data/Annotation');
 var Chemical = require('./map/data/Chemical');
 var Comment = require('./map/data/Comment');
 var Configuration = require('./Configuration');
@@ -619,6 +620,49 @@ ServerConnector.getProject = function(projectId) {
   });
 };
 
+ServerConnector.updateProject = function(project) {
+  var self = this;
+  var queryParams = {
+    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()),
+    },
+  };
+  return self.sendPatchRequest(self.getProjectUrl(queryParams), filterParams).then(function(content) {
+    var downloadedProject = new Project(content);
+    project.update(downloadedProject);
+    return project;
+  }).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.serialize = function(object) {
+  var result = {};
+  if (object instanceof Annotation) {
+    result.type = object.getType();
+    result.resource = object.getResource();
+  } else {
+    throw new Error("Unhandled object type: " + (typeof object));
+  }
+  return result;
+};
+
 ServerConnector.getProjects = function(reload) {
   var self = this;
   if (self._projects.length > 0 && !reload) {
diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
index 1c70a7d3bdf5b0133d1fc094e838adcc2be7b4c1..543276cac52382101e7e19df5f4de3ff3b2b0947 100644
--- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
@@ -3,6 +3,7 @@
 /* exported logger */
 
 var AbstractGuiElement = require('../AbstractGuiElement');
+var Annotation = require('../../map/data/Annotation');
 var GuiConnector = require('../../GuiConnector');
 
 var Functions = require('../../functions');
@@ -125,7 +126,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() {
   nameRow.appendChild(new Functions.createElement({
     type : "div",
     style : "display:table-cell",
-    content : "<input value='" + project.getName() + "'/>",
+    content : "<input name='projectName' value='" + project.getName() + "'/>",
   }));
 
   var versionRow = new Functions.createElement({
@@ -141,7 +142,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() {
   versionRow.appendChild(new Functions.createElement({
     type : "div",
     style : "display:table-cell",
-    content : "<input value='" + project.getVersion() + "'/>",
+    content : "<input name='projectVersion' value='" + project.getVersion() + "'/>",
   }));
 
   var diseaseRow = new Functions.createElement({
@@ -161,7 +162,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() {
   diseaseRow.appendChild(new Functions.createElement({
     type : "div",
     style : "display:table-cell",
-    content : "<input value='" + disease + "'/>",
+    content : "<input name='projectDisease' value='" + disease + "'/>",
   }));
 
   var organismRow = new Functions.createElement({
@@ -181,7 +182,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() {
   organismRow.appendChild(new Functions.createElement({
     type : "div",
     style : "display:table-cell",
-    content : "<input value='" + organism + "'/>",
+    content : "<input name='projectOrganism' value='" + organism + "'/>",
   }));
 
   var emailRow = new Functions.createElement({
@@ -201,7 +202,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() {
   emailRow.appendChild(new Functions.createElement({
     type : "div",
     style : "display:table-cell",
-    content : "<input value='" + email + "'/>",
+    content : "<input name='projectNotifyEmail' value='" + email + "'/>",
   }));
 
   var menuRow = Functions.createElement({
@@ -216,7 +217,9 @@ EditProjectDialog.prototype.createGeneralTabContent = function() {
     name : "saveProject",
     content : '<span class="ui-icon ui-icon-disk"></span>&nbsp;SAVE',
     onclick : function() {
-      return self.onSaveClicked().then(null, GuiConnector.alert);
+      return self.onSaveClicked().then(function() {
+        return self.close();
+      }, GuiConnector.alert);
     },
   });
   var cancelButton = Functions.createElement({
@@ -289,6 +292,30 @@ EditProjectDialog.prototype.open = function() {
   $(div).dialog("open");
 };
 
+var prepareMiriamData = function(type, resource) {
+  if (resource === "" || resource === undefined || resource === null) {
+    return null;
+  } else {
+    return new Annotation({
+      type : type,
+      resource : resource
+    });
+  }
+}
+
+EditProjectDialog.prototype.onSaveClicked = function() {
+  var self = this;
+  var project = self.getProject();
+  var element = self.getElement();
+  project.setName($("[name='projectName']", element)[0].value);
+  project.setVersion($("[name='projectVersion']", element)[0].value);
+  project.setNotifyEmail($("[name='projectNotifyEmail']", element)[0].value);
+  var organism = prepareMiriamData("TAXONOMY", $("[name='projectOrganism']", element)[0].value);
+  project.setOrganism(organism);
+  var disease = prepareMiriamData("MESH_2012", $("[name='projectDisease']", element)[0].value);
+  project.setDisease(disease);
+  return ServerConnector.updateProject(project);
+};
 EditProjectDialog.prototype.close = function() {
   $(this.getElement()).dialog("close");
 };
diff --git a/frontend-js/src/test/js/ServerConnector-test.js b/frontend-js/src/test/js/ServerConnector-test.js
index 3bf7e2c47e3b1407a384d80d39a66a689d7f65b8..7397a0351b677d352806465f5a574e38429145ae 100644
--- a/frontend-js/src/test/js/ServerConnector-test.js
+++ b/frontend-js/src/test/js/ServerConnector-test.js
@@ -45,6 +45,21 @@ describe('ServerConnector', function() {
     });
   });
 
+  describe('updateProject', function() {
+    it('default', function() {
+      var project;
+      var newVersion = "2.01";
+      return ServerConnector.getProject().then(function(result) {
+        project = result;
+        project.setVersion(newVersion);
+        return ServerConnector.updateProject(project);
+      }).then(function(result) {
+        assert.ok(project === result);
+        assert.equal(newVersion, result.getVersion());
+      });
+    });
+  });
+
   it('getModels', function() {
     return ServerConnector.getModels("sample").then(function(models) {
       assert.equal(1, models.length);
diff --git a/frontend-js/src/test/js/gui/admin/EditProjectDialog.js b/frontend-js/src/test/js/gui/admin/EditProjectDialog.js
index b60c090763b4177374ea1616914d3f21fd1d5946..78ffb0c1eab810bb32810584141cbccc512ad4b2 100644
--- a/frontend-js/src/test/js/gui/admin/EditProjectDialog.js
+++ b/frontend-js/src/test/js/gui/admin/EditProjectDialog.js
@@ -26,4 +26,21 @@ describe('EditProjectDialog', function() {
     });
   });
 
+  it('onSaveClicked', function() {
+    var dialog;
+    var project;
+    return ServerConnector.getProject().then(function(result) {
+      project = result;
+      project.setVersion("2.01");
+      dialog = new EditProjectDialog({
+        element : testDiv,
+        project : project,
+        customMap : null,
+      });
+      return dialog.onSaveClicked();
+    }).then(function(result) {
+      assert.ok(project === result);
+    });
+  });
+
 });
diff --git a/frontend-js/testFiles/apiCalls/projects/sample/PATCH_project.disease.resource=D010300&project.disease.type=MESH_2012&project.name=UNKNOWN DISEASE MAP&project.organism.resource=1570291&project.organism.type=TAXONOMY&project.version=2.01&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/PATCH_project.disease.resource=D010300&project.disease.type=MESH_2012&project.name=UNKNOWN DISEASE MAP&project.organism.resource=1570291&project.organism.type=TAXONOMY&project.version=2.01&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000000000000000000000000000000000..559ba91e6805e1a77b91b716b6c59dfbd8e15586
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/projects/sample/PATCH_project.disease.resource=D010300&project.disease.type=MESH_2012&project.name=UNKNOWN DISEASE MAP&project.organism.resource=1570291&project.organism.type=TAXONOMY&project.version=2.01&token=MOCK_TOKEN_ID&	
@@ -0,0 +1 @@
+{"version":"2.01","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