diff --git a/Kieker.WebGUI/bin/Kieker.WebGUI.bat b/Kieker.WebGUI/bin/Kieker.WebGUI.bat
index 69dc07c7857d890a40eb09f7cb52295bc0c47f47..99ace6e5106b0d69aacbbc5ba811a7609a8d98b7 100644
--- a/Kieker.WebGUI/bin/Kieker.WebGUI.bat
+++ b/Kieker.WebGUI/bin/Kieker.WebGUI.bat
@@ -6,7 +6,7 @@ set BIN_PATH_ABS=%~dp0
 
 cd %BIN_PATH_ABS% 
 
-java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled  -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war
+java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled  -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war
 
 @echo on
 
diff --git a/Kieker.WebGUI/bin/Kieker.WebGUI.sh b/Kieker.WebGUI/bin/Kieker.WebGUI.sh
index d22b765670084e13207f9ae652db9a42597d6121..229a11e5609f647b3a4c681faa8fc44e50582b37 100644
--- a/Kieker.WebGUI/bin/Kieker.WebGUI.sh
+++ b/Kieker.WebGUI/bin/Kieker.WebGUI.sh
@@ -6,4 +6,4 @@ BINDIR=$(cd "$(dirname "$0")"; pwd)/
 
 cd "${BINDIR}"
 
-java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled   -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war
\ No newline at end of file
+java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled   -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war
\ No newline at end of file
diff --git a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat
index 11738008f19986630b76ed93464af571a36cfc74..bfac8d0fa3613266fd342f358095f9ee6097383a 100644
--- a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat
+++ b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat
@@ -6,7 +6,7 @@ set BIN_PATH_ABS=%~dp0
 
 cd %BIN_PATH_ABS% 
 
-java -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled  -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war
+java -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled  -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war
 
 @echo on
 
diff --git a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh
index 6b23d851d45243a8a54cad3a5351ec9c22e1fcb9..5b9280d86d2a602b304cece627a9fb9de0c0302f 100644
--- a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh
+++ b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh
@@ -6,4 +6,4 @@ BINDIR=$(cd "$(dirname "$0")"; pwd)/
 
 cd "${BINDIR}"
 
-java  -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled   -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war
\ No newline at end of file
+java  -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled   -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java
index 1277422d3856e231884c39ecc3076dcf466520da..dd6d7afc78a9ebc9703da08fd83adaa1d4038a00 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java
@@ -35,6 +35,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.annotation.Nullable;
@@ -47,7 +49,15 @@ import com.google.common.io.Files;
 
 import kieker.analysis.AnalysisController;
 import kieker.analysis.model.analysisMetaModel.MIAnalysisMetaModelFactory;
+import kieker.analysis.model.analysisMetaModel.MIDisplay;
+import kieker.analysis.model.analysisMetaModel.MIDisplayConnector;
+import kieker.analysis.model.analysisMetaModel.MIFilter;
+import kieker.analysis.model.analysisMetaModel.MIInputPort;
+import kieker.analysis.model.analysisMetaModel.MIOutputPort;
+import kieker.analysis.model.analysisMetaModel.MIPlugin;
 import kieker.analysis.model.analysisMetaModel.MIProject;
+import kieker.analysis.model.analysisMetaModel.MIRepository;
+import kieker.analysis.model.analysisMetaModel.MIView;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
 import kieker.webgui.common.ClassContainer;
@@ -307,6 +317,7 @@ public final class FSProjectDAOImpl implements IProjectDAO, ReleaseListener {
 		}
 
 		// Try to save it.
+		this.addMissingIDs(project);
 		AnalysisController.saveToFile(FSProjectDAOImpl.assembleKaxFile(projectName), project);
 
 		// Store the new meta data
@@ -321,6 +332,121 @@ public final class FSProjectDAOImpl implements IProjectDAO, ReleaseListener {
 		FSProjectDAOImpl.savePropertiesFile(properties, projectName);
 	}
 
+	private void addMissingIDs(final MIProject project) {
+		this.addMissingIDs(project, this.collectUsedIDs(project));
+	}
+
+	private Set<String> collectUsedIDs(final MIProject project) {
+		final Set<String> usedIDs = new TreeSet<String>();
+
+		for (final MIPlugin plugin : project.getPlugins()) {
+			if (plugin.getId() != null) {
+				usedIDs.add(plugin.getId());
+			}
+			for (final MIOutputPort outputPort : plugin.getOutputPorts()) {
+				if (outputPort.getId() != null) {
+					usedIDs.add(outputPort.getId());
+				}
+			}
+
+			if (plugin instanceof MIFilter) {
+				for (final MIInputPort inputPort : ((MIFilter) plugin).getInputPorts()) {
+					if (inputPort.getId() != null) {
+						usedIDs.add(inputPort.getId());
+					}
+				}
+			}
+
+			for (final MIDisplay display : plugin.getDisplays()) {
+				if (display.getId() != null) {
+					usedIDs.add(display.getId());
+				}
+			}
+		}
+		for (final MIRepository repository : project.getRepositories()) {
+			if (repository.getId() != null) {
+				usedIDs.add(repository.getId());
+			}
+		}
+		for (final MIView view : project.getViews()) {
+			if (view.getId() != null) {
+				usedIDs.add(view.getId());
+			}
+
+			for (final MIDisplayConnector displayConnector : view.getDisplayConnectors()) {
+				if (displayConnector.getId() != null) {
+					usedIDs.add(displayConnector.getId());
+				}
+			}
+		}
+
+		return usedIDs;
+	}
+
+	private void addMissingIDs(final MIProject project, final Set<String> usedIDs) {
+		long idCounter = 0;
+
+		for (final MIPlugin plugin : project.getPlugins()) {
+			if (plugin.getId() == null) {
+				while (usedIDs.contains(Long.toString(idCounter))) {
+					idCounter++;
+				}
+				plugin.setId(Long.toString(idCounter++));
+			}
+			for (final MIOutputPort outputPort : plugin.getOutputPorts()) {
+				if (outputPort.getId() == null) {
+					while (usedIDs.contains(Long.toString(idCounter))) {
+						idCounter++;
+					}
+					outputPort.setId(Long.toString(idCounter++));
+				}
+			}
+			if (plugin instanceof MIFilter) {
+				for (final MIInputPort inputPort : ((MIFilter) plugin).getInputPorts()) {
+					if (inputPort.getId() == null) {
+						while (usedIDs.contains(Long.toString(idCounter))) {
+							idCounter++;
+						}
+						inputPort.setId(Long.toString(idCounter++));
+					}
+				}
+			}
+			for (final MIDisplay display : plugin.getDisplays()) {
+				if (display.getId() == null) {
+					while (usedIDs.contains(Long.toString(idCounter))) {
+						idCounter++;
+					}
+					display.setId(Long.toString(idCounter++));
+				}
+			}
+		}
+		for (final MIRepository repository : project.getRepositories()) {
+			if (repository.getId() == null) {
+				while (usedIDs.contains(Long.toString(idCounter))) {
+					idCounter++;
+				}
+				repository.setId(Long.toString(idCounter++));
+			}
+		}
+		for (final MIView view : project.getViews()) {
+			if (view.getId() == null) {
+				while (usedIDs.contains(Long.toString(idCounter))) {
+					idCounter++;
+				}
+				view.setId(Long.toString(idCounter++));
+			}
+
+			for (final MIDisplayConnector displayConnector : view.getDisplayConnectors()) {
+				if (displayConnector.getId() == null) {
+					while (usedIDs.contains(Long.toString(idCounter))) {
+						idCounter++;
+					}
+					displayConnector.setId(Long.toString(idCounter++));
+				}
+			}
+		}
+	}
+
 	@Override
 	public long getCurrTimeStamp(final String projectName) throws ProjectNotExistingException {
 		this.assertProjectExistence(projectName);
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java
index fe4c16fbad8d58960a4f9a9d00eda4bef538cae1..ec7f6020c85405bc8f6b7801c3b1c183529c38ab 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java
@@ -101,9 +101,7 @@ public final class AnalysisEditorBean implements IGraphListener {
 	private long timeStampFromLastSaving;
 
 	@Autowired
-	private AnalysisEditorGraphBean currentAnalysisEditorGraphBean;
-	@Autowired
-	private AnalysisEditorHistoryBean currentAnalysisEditorHistoryBean;
+	private AnalysisEditorGraphBean analysisEditorGraphBean;
 	@Autowired
 	private GlobalPropertiesBean globalPropertiesBean;
 	@Autowired
@@ -153,32 +151,31 @@ public final class AnalysisEditorBean implements IGraphListener {
 	public void initializeGraph() {
 		try {
 			// Initialize the graph
-			this.currentAnalysisEditorGraphBean.declareGraph();
+			this.analysisEditorGraphBean.declareGraph();
 
 			// Initialize the component for the project configuration
 			this.initializeGlobalConfigurationInstance();
-			this.currentAnalysisEditorGraphBean.addGlobalConfigurationInstance(this.globalConfigurationInstance);
+			this.analysisEditorGraphBean.addGlobalConfigurationInstance(this.globalConfigurationInstance);
 
-			this.currentAnalysisEditorGraphBean.addProject(this.project);
+			this.analysisEditorGraphBean.addProject(this.project);
 
 			// Now we have to set the default grid size and color of the user
-			this.currentAnalysisEditorGraphBean.setGridColor(this.userBean.getGridColor());
-			this.currentAnalysisEditorGraphBean.setGridSize(this.userBean.getGridSize());
+			this.analysisEditorGraphBean.setGridColor(this.userBean.getGridColor());
+			this.analysisEditorGraphBean.setGridSize(this.userBean.getGridSize());
 
 			// Perform either an initial auto layout or use the saved layout - if it exists
 			final String layout = this.projectService.getAnalysisLayout(this.projectName);
 
 			if (layout != null) {
-				this.currentAnalysisEditorGraphBean.loadLayout(layout);
+				this.analysisEditorGraphBean.loadLayout(layout);
 			} else {
-				this.currentAnalysisEditorGraphBean.startAutoLayout();
+				this.analysisEditorGraphBean.startAutoLayout();
 			}
 
 			// Make sure that the currentAnalysisEditorGraphBean knows "this" as well.
-			this.currentAnalysisEditorGraphBean.addGraphListener(this);
-			this.currentAnalysisEditorGraphBean.addGraphListener(this.currentAnalysisEditorHistoryBean);
+			this.analysisEditorGraphBean.addGraphListener(this);
 
-			this.currentAnalysisEditorGraphBean.initializeListeners();
+			this.analysisEditorGraphBean.initializeListeners();
 		} catch (final NullPointerException ex) {
 			// This exception can occur when a property has not been initialized
 			LOG.error("An error occured while initializing the graph.", ex);
@@ -323,7 +320,7 @@ public final class AnalysisEditorBean implements IGraphListener {
 
 		// Add it to the project - and to the graph
 		this.project.getRepositories().add(repository);
-		this.currentAnalysisEditorGraphBean.addComponent(repository);
+		this.analysisEditorGraphBean.addComponent(repository);
 
 		this.setModificationsFlag();
 	}
@@ -340,7 +337,7 @@ public final class AnalysisEditorBean implements IGraphListener {
 
 		// Add it to the project - and to the graph
 		this.project.getPlugins().add(plugin);
-		this.currentAnalysisEditorGraphBean.addComponent((MIReader) plugin);
+		this.analysisEditorGraphBean.addComponent((MIReader) plugin);
 
 		this.setModificationsFlag();
 	}
@@ -357,7 +354,7 @@ public final class AnalysisEditorBean implements IGraphListener {
 
 		// Add it to the project - and to the graph
 		this.project.getPlugins().add(plugin);
-		this.currentAnalysisEditorGraphBean.addComponent((MIFilter) plugin);
+		this.analysisEditorGraphBean.addComponent((MIFilter) plugin);
 
 		this.setModificationsFlag();
 	}
@@ -525,7 +522,7 @@ public final class AnalysisEditorBean implements IGraphListener {
 	 *            The change event.
 	 */
 	public void gridColorListener(final ValueChangeEvent event) {
-		this.currentAnalysisEditorGraphBean.setGridColor((String) event.getNewValue());
+		this.analysisEditorGraphBean.setGridColor((String) event.getNewValue());
 	}
 
 	/**
@@ -535,7 +532,7 @@ public final class AnalysisEditorBean implements IGraphListener {
 	 *            The change event.
 	 */
 	public void gridSizeListener(final ValueChangeEvent event) {
-		this.currentAnalysisEditorGraphBean.setGridSize((Integer) event.getNewValue());
+		this.analysisEditorGraphBean.setGridSize((Integer) event.getNewValue());
 	}
 
 	public boolean isUnsavedModification() {
diff --git a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml
index 2da70691a15e48474828e630339ec7474d16eb7a..88a267485c7716b5870f5b8baa33f5dc057ef208 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml
@@ -114,8 +114,8 @@
 
                 <p:submenu label="Graph">
                     <c:if test="#{sec:areAnyGranted('User, Administrator')}">
-                        <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value="  #{localizedMessages.lblUndo}" ajax="true" action="#{currentAnalysisEditorHistoryBean.undoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.undoStackEmpty}" />
-                        <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value="  #{localizedMessages.lblRedo}" ajax="true" action="#{currentAnalysisEditorHistoryBean.redoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.redoStackEmpty}" />
+                        <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value="  #{localizedMessages.lblUndo}" ajax="true" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}" />
+                        <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value="  #{localizedMessages.lblRedo}" ajax="true" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}" />
                         <p:separator/>
                     </c:if>
                     <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value="  #{localizedAnalysisEditorPageMessages.lblAnalysisEditorScaleToFit}" ajax="true" action="#{analysisEditorGraphBean.scaleToFit()}"  disabled="#{empty analysisEditorBean.project}" />
@@ -139,8 +139,8 @@
                         <!-- A dummy item as a separator between the items. -->
                         <p:menuitem style="width: 15px" disabled="true"/>
 
-                        <p:menuitem id="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" action="#{currentAnalysisEditorHistoryBean.undoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.undoStackEmpty}"/>
-                        <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" action="#{currentAnalysisEditorHistoryBean.redoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.redoStackEmpty}"/>
+                        <p:menuitem id="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}"/>
+                        <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}"/>
                         <!-- A dummy item as a separator between the items. -->
                         <p:menuitem style="width: 15px" disabled="true"/>
                     </c:if>