diff --git a/frontend-js/.jshintrc b/frontend-js/.jshintrc
index 2f8265693747dda3830ef61b6310b8da13284152..f4cf0adf392e6f0e75a3c844a0116af4c9e9b232 100644
--- a/frontend-js/.jshintrc
+++ b/frontend-js/.jshintrc
@@ -49,8 +49,12 @@
 
     /* jQuery */
     "$"  : false,
-    "jQuery"  : false
-    
-  }
+    "jQuery"  : false,
+
+    /* bluebird promise */
+    "Promise"  : true
+
+  },
+  "predef": [ "-Promise" ]
     
 }
diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 64753855ee6eb8cbb1afea85cf5de7dd68b4f9c6..e8e70b8eb4098e7584760c60a7be2173e1be79e2 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -782,7 +782,6 @@ ServerConnector.updateUserPrivileges = function(params) {
   var queryParams = {
     login : params.user.getLogin(),
   };
-  var filterParams = {};
 
   return self.sendPatchRequest(self.getUpdateUserPrivilegesUrl(queryParams), {
     privileges : params.privileges
@@ -800,8 +799,6 @@ ServerConnector.updateUserPrivileges = function(params) {
 
 ServerConnector.getUsers = function(forceRefresh) {
   var self = this;
-  var queryParams = {};
-  var filterParams = {};
 
   if (self._users.length > 0 && !forceRefresh) {
     return Promise.resolve(self._users);
diff --git a/frontend-js/src/main/js/gui/AddOverlayDialog.js b/frontend-js/src/main/js/gui/AddOverlayDialog.js
index 05e6116d1d63f47f65458c26a215eaebc16d76a3..0dd06950a04a5c6cfe930bd8ed4edf8e320b6817 100644
--- a/frontend-js/src/main/js/gui/AddOverlayDialog.js
+++ b/frontend-js/src/main/js/gui/AddOverlayDialog.js
@@ -3,7 +3,6 @@
 /* exported logger */
 
 var AbstractGuiElement = require('./AbstractGuiElement');
-var Annotation = require('../map/data/Annotation');
 var GuiConnector = require('../GuiConnector');
 var GuiUtils = require('./leftPanel/GuiUtils');
 var LayoutData = require('../map/data/LayoutData');
@@ -13,7 +12,7 @@ var Functions = require('../Functions');
 var logger = require('../logger');
 var HttpStatus = require('http-status-codes');
 
-var guiUtils = new (require('./leftPanel/GuiUtils'))();
+var Promise = require("bluebird");
 
 function AddOverlayDialog(params) {
   AbstractGuiElement.call(this, params);
@@ -28,7 +27,6 @@ AddOverlayDialog.prototype.constructor = AddOverlayDialog;
 AddOverlayDialog.prototype.createGui = function() {
   var self = this;
   var guiUtils = new GuiUtils();
-  var fileContent = null;
   var content = document.createElement("div");
   content.style.width = "100%";
   content.style.height = "100%";
diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b07c1e37de27420d9edee7601a5062a976b4cd9
--- /dev/null
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -0,0 +1,281 @@
+"use strict";
+
+/* exported logger */
+var Promise = require("bluebird");
+
+var AbstractGuiElement = require('../AbstractGuiElement');
+var GuiConnector = require('../../GuiConnector');
+
+var Functions = require('../../functions');
+var logger = require('../../logger');
+
+var guiUtils = new (require('../leftPanel/GuiUtils'))();
+
+function AddProjectDialog(params) {
+  AbstractGuiElement.call(this, params);
+  var self = this;
+  $(self.getElement()).addClass("minerva-edit-project-dialog");
+
+  self.createGui();
+}
+
+AddProjectDialog.prototype = Object.create(AbstractGuiElement.prototype);
+AddProjectDialog.prototype.constructor = AddProjectDialog;
+
+AddProjectDialog.prototype.createGui = function() {
+  var self = this;
+  var element = self.getElement();
+
+  var tabDiv = Functions.createElement({
+    type : "div",
+    name : "tabView",
+    className : "tabbable boxed parentTabs"
+  });
+  element.appendChild(tabDiv);
+
+  var tabMenuDiv = Functions.createElement({
+    type : "ul",
+    className : "nav nav-tabs"
+  });
+  tabDiv.appendChild(tabMenuDiv);
+
+  var tabContentDiv = Functions.createElement({
+    type : "div",
+    className : "tab-content"
+  });
+  tabDiv.appendChild(tabContentDiv);
+
+  self.createGeneralTab(tabMenuDiv, tabContentDiv);
+  self.createOverlaysTab(tabMenuDiv, tabContentDiv);
+  self.createSubmapsTab(tabMenuDiv, tabContentDiv);
+  self.createOverviewImagesTab(tabMenuDiv, tabContentDiv);
+};
+
+AddProjectDialog.prototype.createGeneralTab = function(tabMenuDiv, tabContentDiv) {
+  var self = this;
+  self.addTab({
+    tabMenuDiv : tabMenuDiv,
+    tabContentDiv : tabContentDiv,
+    name : "GENERAL",
+    id : "add_project_general_tab",
+    content : self.createGeneralTabContent(),
+  });
+
+};
+
+AddProjectDialog.prototype.addTab = function(params) {
+  var navLi = guiUtils.createTabMenuObject({
+    id : params.id,
+    name : params.name,
+    navigationBar : params.tabMenuDiv
+  });
+  params.tabMenuDiv.appendChild(navLi);
+
+  var contentDiv = guiUtils.createTabContentObject({
+    id : params.id,
+    navigationObject : navLi,
+    navigationBar : params.tabMenuDiv
+  });
+
+  if (params.content !== undefined) {
+    contentDiv.appendChild(params.content);
+  }
+
+  params.tabContentDiv.appendChild(contentDiv);
+};
+
+AddProjectDialog.prototype.createGeneralTabContent = function() {
+  var self = this;
+
+  var result = new Functions.createElement({
+    type : "div",
+  });
+
+  var table = new Functions.createElement({
+    type : "div",
+    style : "display:table"
+  });
+  result.appendChild(table);
+
+  table.appendChild(self.createInputRow("ProjectId:", "id", "project-id"));
+  table.appendChild(self.createInputRow("Project name:", "UNKNOWN DISEASE MAP", "project-name"));
+  table.appendChild(self.createInputRow("Project Disease:", "", "project-disease"));
+  table.appendChild(self.createInputRow("Organism:", "", "project-organism"));
+  table.appendChild(self.createInputRow("Version:", "", "project-version"));
+
+  table.appendChild(self.createCheckboxRow("Annotate model automatically:", false, "project-annotate-automatically"));
+  table.appendChild(self.createCheckboxRow("Verify manual annotations:", false, "project-verify-annotations"));
+  table.appendChild(self.createCheckboxRow("Cache data:", false, "project-cache-data"));
+  table.appendChild(self.createCheckboxRow("Auto margin:", true, "project-auto-margin"));
+  table.appendChild(self.createCheckboxRow("Display as SBGN:", false, "project-sbgn-visualization"));
+  table.appendChild(self.createCheckboxRow("Semantic zooming:", false, "project-semantic-zooming"));
+
+  var saveProjectButton = Functions.createElement({
+    type : "button",
+    name : "saveProject",
+    content : '<span class="ui-icon ui-icon-disk"></span>&nbsp;SAVE',
+    onclick : function() {
+      return self.onSaveClicked().then(function() {
+        return self.close();
+      }, GuiConnector.alert);
+    },
+  });
+  var cancelButton = Functions.createElement({
+    type : "button",
+    name : "cancelProject",
+    content : '<span class="ui-icon ui-icon-cancel"></span>&nbsp;CANCEL',
+    onclick : function() {
+      return self.close();
+    },
+  });
+  var menuRow = Functions.createElement({
+    type : "div",
+    className : "minerva-menu-row",
+    style : "display:table-row; margin:10px",
+  });
+  result.appendChild(menuRow);
+  menuRow.appendChild(saveProjectButton);
+  menuRow.appendChild(cancelButton);
+
+  return result;
+};
+AddProjectDialog.prototype.createInputRow = function(labelName, defaultValue, inputName) {
+  var result = new Functions.createElement({
+    type : "div",
+    style : "display:table-row"
+  });
+  result.appendChild(new Functions.createElement({
+    type : "div",
+    style : "display:table-cell",
+    content : labelName,
+  }));
+  result.appendChild(new Functions.createElement({
+    type : "div",
+    style : "display:table-cell",
+    content : "<input name='" + inputName + "' value='" + defaultValue + "'/>",
+  }));
+  return result;
+};
+
+AddProjectDialog.prototype.createCheckboxRow = function(labelName, defaultValue, inputName) {
+  var result = new Functions.createElement({
+    type : "div",
+    style : "display:table-row"
+  });
+  result.appendChild(new Functions.createElement({
+    type : "div",
+    style : "display:table-cell",
+    content : labelName,
+  }));
+  var checked = "";
+  if (defaultValue) {
+    checked = "checked";
+  }
+  result.appendChild(new Functions.createElement({
+    type : "div",
+    style : "display:table-cell",
+    content : "<checkbox name='" + inputName + "' " + checked + "/>",
+  }));
+  return result;
+};
+
+AddProjectDialog.prototype.createOverlaysTab = function(tabMenuDiv, tabContentDiv) {
+  var self = this;
+  self.addTab({
+    tabMenuDiv : tabMenuDiv,
+    tabContentDiv : tabContentDiv,
+    name : "OVERLAYS",
+    id : "project_overlays_tab",
+    content : self.createOverlaysTabContent(),
+  });
+};
+
+AddProjectDialog.prototype.createOverlaysTabContent = function() {
+  var self = this;
+  var result = Functions.createElement({
+    type : "div",
+  });
+  result.appendChild(self._createOverlayTable());
+  return result;
+};
+
+AddProjectDialog.prototype._createOverlayTable = function() {
+  var result = Functions.createElement({
+    type : "div",
+    style : "margin-top:10px;",
+  });
+
+  return result;
+};
+
+AddProjectDialog.prototype.createSubmapsTab = function(tabMenuDiv, tabContentDiv) {
+  var self = this;
+  self.addTab({
+    tabMenuDiv : tabMenuDiv,
+    tabContentDiv : tabContentDiv,
+    name : "USERS",
+    id : "project_submaps_tab",
+    content : self.createSubmapsTabContent(),
+  });
+};
+
+AddProjectDialog.prototype.createSubmapsTabContent = function() {
+  var result = Functions.createElement({
+    type : "div",
+    style : "margin-top:10px;",
+  });
+  return result;
+};
+
+AddProjectDialog.prototype.createOverviewImagesTab = function(tabMenuDiv, tabContentDiv) {
+  var self = this;
+  self.addTab({
+    tabMenuDiv : tabMenuDiv,
+    tabContentDiv : tabContentDiv,
+    name : "USERS",
+    id : "project_overview_images_tab",
+    content : self.createOverviewImagesTabContent(),
+  });
+};
+
+AddProjectDialog.prototype.createOverviewImagesTabContent = function() {
+  var result = Functions.createElement({
+    type : "div",
+    style : "margin-top:10px;",
+  });
+  return result;
+};
+
+AddProjectDialog.prototype.init = function() {
+  return Promise.resolve();
+};
+
+AddProjectDialog.prototype.destroy = function() {
+  $(this.getElement()).dialog("destroy");
+};
+
+AddProjectDialog.prototype.open = function() {
+  var self = this;
+  var div = self.getElement();
+  if (!$(div).hasClass("ui-dialog-content")) {
+    $(div).dialog({
+      title : "ADD PROJECT",
+      width : window.innerWidth / 2,
+      height : window.innerHeight / 2,
+    });
+  }
+  $(div).dialog("open");
+};
+
+AddProjectDialog.prototype.close = function() {
+  var self = this;
+  $(self.getElement()).dialog("close");
+};
+
+AddProjectDialog.prototype.clear = function() {
+  var self = this;
+  $("input", self.getElement()).val("");
+  return Promise.resolve();
+};
+
+module.exports = AddProjectDialog;
diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
index 344d41b2adac69a932646977fa3dc8901101fb80..702f7966703c8d059dcccdb674a105b29b56ef46 100644
--- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
@@ -1,6 +1,7 @@
 "use strict";
 
 /* exported logger */
+var Promise = require("bluebird");
 
 var AbstractGuiElement = require('../AbstractGuiElement');
 var AddOverlayDialog = require('../AddOverlayDialog');
@@ -275,7 +276,7 @@ EditProjectDialog.prototype._createOverlayTable = function() {
   result.appendChild(overlaysTable);
 
   $(overlaysTable).DataTable({
-    fnRowCallback : function(nRow, aData, iDisplayIndex) {
+    fnRowCallback : function(nRow, aData) {
       nRow.setAttribute('id', "overlay-" + aData[0]);
     },
     columns : [ {
@@ -454,7 +455,7 @@ EditProjectDialog.prototype.setOverlays = function(overlays) {
     for (var i = 0; i < overlays.length; i++) {
       var overlay = overlays[i];
       self._overlayById[overlay.getId()] = overlay;
-      var rowData = self.overlayToTableRow(overlay, users)
+      var rowData = self.overlayToTableRow(overlay, users);
       data.push(rowData);
     }
     dataTable.clear().rows.add(data).draw();
@@ -581,7 +582,7 @@ var prepareMiriamData = function(type, resource) {
       resource : resource
     });
   }
-}
+};
 
 EditProjectDialog.prototype.onSaveClicked = function() {
   var self = this;
@@ -645,9 +646,9 @@ EditProjectDialog.prototype.openAddOverlayDialog = function() {
     customMap : null,
     element : document.createElement("div"),
   });
-  addOverlayDialog.addListener("onAddOverlay", function(e) {
+  addOverlayDialog.addListener("onAddOverlay", function() {
     return self.refreshOverlays();
-  })
+  });
   return addOverlayDialog.init().then(function() {
     return addOverlayDialog.open();
   });
diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
index c57b9203403199c8b7b5a4562191dc01d2cbc796..47c4e2ce945fb967a4febeff4712e59f91e5bbce 100644
--- a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
@@ -3,6 +3,7 @@
 /* exported logger */
 
 var AbstractAdminPanel = require('./AbstractAdminPanel');
+var AddProjectDialog = require('./AddProjectDialog');
 var EditProjectDialog = require('./EditProjectDialog');
 
 var logger = require('../../logger');
@@ -87,7 +88,7 @@ MapsAdminPanel.prototype._createProjectTableRow = function() {
   projectsRow.appendChild(projectsTable);
 
   $(projectsTable).DataTable({
-    fnRowCallback : function(nRow, aData, iDisplayIndex) {
+    fnRowCallback : function(nRow, aData) {
       nRow.setAttribute('id', aData[0]);
     },
     columns : [ {
@@ -166,7 +167,7 @@ MapsAdminPanel.prototype.setProjects = function(projects) {
   var data = [];
   for (var i = 0; i < projects.length; i++) {
     var project = projects[i];
-    var rowData = self.projectToTableRow(project)
+    var rowData = self.projectToTableRow(project);
     self.addUpdateListener(project, rowData);
     data.push(rowData);
   }
@@ -196,8 +197,26 @@ MapsAdminPanel.prototype.addUpdateListener = function(project, dataTableRow) {
 };
 
 MapsAdminPanel.prototype.onAddClicked = function() {
-  return Promise.reject(new Error("Not implemented"));
+  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.onRefreshClicked = function() {
   var self = this;
   return ServerConnector.getProjects(true).then(function(projects) {
@@ -231,7 +250,6 @@ MapsAdminPanel.prototype.getDialog = function(project) {
 MapsAdminPanel.prototype.showEditDialog = function(id) {
   var self = this;
   GuiConnector.showProcessing();
-  var dialog;
   return ServerConnector.getProject(id).then(function(project) {
     return self.getDialog(project);
   }).then(function(dialog) {
@@ -243,6 +261,7 @@ MapsAdminPanel.prototype.showEditDialog = function(id) {
     return Promise.reject(error);
   });
 };
+
 MapsAdminPanel.prototype.removeProject = function(id) {
   return Promise.reject(new Error("Not implemented"));
 };
diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
index b0582070f9c6dd29f17f5fafccf7d5d071782c0c..f4c13ff1493d3f8bb8b227c609d95552cd32779a 100644
--- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
@@ -9,9 +9,6 @@ var PanelControlElementType = require('../PanelControlElementType');
 var GuiConnector = require('../../GuiConnector');
 var logger = require('../../logger');
 var Functions = require('../../Functions');
-var NetworkError = require('../../NetworkError');
-
-var HttpStatus = require('http-status-codes');
 
 function OverlayPanel(params) {
   params.panelName = "overlays";
@@ -365,7 +362,7 @@ OverlayPanel.prototype.openAddOverlayDialog = function() {
   addOverlayDialog.addListener("onAddOverlay", function(e) {
     self.getMap().getModel().addLayout(e.arg);
     return self.refresh();
-  })
+  });
   return addOverlayDialog.init().then(function() {
     return addOverlayDialog.open();
   });
diff --git a/frontend-js/src/test/js/gui/AddOverlayDialog-test.js b/frontend-js/src/test/js/gui/AddOverlayDialog-test.js
index dd4759e57766b0034c5ac447ecc6ad26d1bc06f9..4dae00c29dd138ecfa65297cb6ccb66cbf27d562 100644
--- a/frontend-js/src/test/js/gui/AddOverlayDialog-test.js
+++ b/frontend-js/src/test/js/gui/AddOverlayDialog-test.js
@@ -25,7 +25,7 @@ describe('AddOverlayDialog', function() {
         return dialog.processFile(file).then(function(content) {
           assert.ok(content !== null);
         });
-      })
+      });
     });
   });
 
@@ -39,7 +39,7 @@ describe('AddOverlayDialog', function() {
 
       dialog.setFileContent("s1\n");
       return dialog.addOverlay();
-    })
+    });
   });
 
   
diff --git a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf366e75917f41b0cdf2de7e22b8b5ada5478581
--- /dev/null
+++ b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
@@ -0,0 +1,19 @@
+"use strict";
+
+/* exported assert */
+/* exported logger */
+
+var AddProjectDialog = require('../../../../main/js/gui/admin/AddProjectDialog');
+var logger = require('../../logger');
+
+var assert = require('assert');
+
+describe('AddProjectDialog', function() {
+  it('init', function() {
+    var dialog = new AddProjectDialog({
+      element : testDiv,
+      customMap : null,
+    });
+    return dialog.init();
+  });
+});
diff --git a/frontend-js/src/test/js/gui/admin/EditProjectDialog.js b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
similarity index 100%
rename from frontend-js/src/test/js/gui/admin/EditProjectDialog.js
rename to frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
diff --git a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
index 22da3cd520ba40299f377a70987b53fdb4ebcacb..3d55123783e2dea53023b90d153392fcc1e23722 100644
--- a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
+++ b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
@@ -28,4 +28,44 @@ describe('MapsAdminPanel', function() {
     });
   });
 
+  describe('onAddClicked', function() {
+    it('default', function() {
+      var mapTab;
+      var project;
+      return ServerConnector.getProject().then(function(result) {
+        project = result;
+        return ServerConnector.getConfiguration();
+      }).then(function(configuration) {
+        mapTab = new MapsAdminPanel({
+          element : testDiv,
+          project : project,
+          configuration : configuration,
+        });
+        return mapTab.init();
+      }).then(function() {
+        return mapTab.onAddClicked();
+      });
+    });
+    it('close and reopen', function() {
+      var mapTab;
+      var project;
+      return ServerConnector.getProject().then(function(result) {
+        project = result;
+        return ServerConnector.getConfiguration();
+      }).then(function(configuration) {
+        mapTab = new MapsAdminPanel({
+          element : testDiv,
+          project : project,
+          configuration : configuration,
+        });
+        return mapTab.init();
+      }).then(function() {
+        return mapTab.onAddClicked();
+      }).then(function() {
+        mapTab._addDialog.close();
+        return mapTab.onAddClicked();
+      });
+    });
+  });
+
 });