From 17ad00f6d92b4ea430addd34fb82663102ec0964 Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nie@informatik.uni-kiel.de>
Date: Thu, 1 Nov 2012 20:11:09 +0100
Subject: [PATCH] Refactoring

---
 Kieker.WebGUI/nb-configuration.xml            |   6 +-
 .../kieker/webgui/common/IUserManager.java    |  40 ----
 .../webgui/common/converter/package-info.java |  21 ---
 .../webgui/common/impl/UserManagerImpl.java   | 175 ------------------
 .../java/kieker/webgui/domain/Project.java    |  40 ++++
 .../kieker/webgui/persistence/IUserDAO.java   |  10 +-
 .../persistence/impl/DerbyUserDAOImpl.java    |  60 +++---
 .../kieker/webgui/service/IUserService.java   |  24 +++
 .../webgui/service/impl/UserServiceImpl.java  |  69 ++++++-
 .../application/GlobalPropertiesBean.java     |   2 +-
 .../beans/application/ProjectsBean.java       |   4 +-
 .../beans/application/ThemeSwitcherBean.java  |   2 +-
 .../beans/application/package-info.java       |   2 +-
 .../{ => web}/beans/request/NewUserBean.java  |   2 +-
 .../{ => web}/beans/request/StringBean.java   |   2 +-
 .../{ => web}/beans/request/package-info.java |   2 +-
 .../{ => web}/beans/session/UserBean.java     |   4 +-
 .../{ => web}/beans/session/package-info.java |   2 +-
 .../beans/view/CurrentAnalysisEditorBean.java |   8 +-
 .../view/CurrentAnalysisEditorGraphBean.java  |   2 +-
 .../beans/view/CurrentCockpitBean.java        |   6 +-
 .../beans/view/CurrentCockpitEditorBean.java  |   6 +-
 .../beans/view/CurrentControllerBean.java     |   4 +-
 .../view/CurrentProjectOverviewBean.java      |   4 +-
 .../beans/view/CurrentUserManagementBean.java |  22 +--
 .../{ => web}/beans/view/package-info.java    |   2 +-
 .../converter/RoleStringConverter.java        |   2 +-
 .../impl => web/converter}/package-info.java  |   2 +-
 .../lang/ProjectOverviewPage_de.properties    |   5 +-
 .../lang/ProjectOverviewPage_en.properties    |   1 +
 .../webapp/WEB-INF/spring-bean-config.xml     |  34 ++--
 .../webapp/pages/ProjectOverviewPage.xhtml    |  10 +-
 32 files changed, 241 insertions(+), 334 deletions(-)
 delete mode 100644 Kieker.WebGUI/src/main/java/kieker/webgui/common/IUserManager.java
 delete mode 100644 Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/package-info.java
 delete mode 100644 Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerImpl.java
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/application/GlobalPropertiesBean.java (99%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/application/ProjectsBean.java (98%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/application/ThemeSwitcherBean.java (97%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/application/package-info.java (95%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/request/NewUserBean.java (98%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/request/StringBean.java (98%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/request/package-info.java (95%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/session/UserBean.java (98%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/session/package-info.java (95%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentAnalysisEditorBean.java (99%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentAnalysisEditorGraphBean.java (99%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentCockpitBean.java (97%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentCockpitEditorBean.java (99%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentControllerBean.java (99%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentProjectOverviewBean.java (96%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/CurrentUserManagementBean.java (85%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{ => web}/beans/view/package-info.java (95%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{common => web}/converter/RoleStringConverter.java (97%)
 rename Kieker.WebGUI/src/main/java/kieker/webgui/{common/impl => web/converter}/package-info.java (95%)

diff --git a/Kieker.WebGUI/nb-configuration.xml b/Kieker.WebGUI/nb-configuration.xml
index 508f207d..e226fa62 100644
--- a/Kieker.WebGUI/nb-configuration.xml
+++ b/Kieker.WebGUI/nb-configuration.xml
@@ -21,10 +21,10 @@ Any value defined here will override the pom.xml file value but is only applicab
     </properties>
     <spring-data xmlns="http://www.netbeans.org/ns/spring-data/1">
         <config-files>
-            <config-file>src/main/webapp/WEB-INF/spring-config.xml</config-file>
-            <config-file>src/main/webapp/WEB-INF/spring-security-taglib.xml</config-file>
-            <config-file>src/main/webapp/WEB-INF/spring-database-config.xml</config-file>
             <config-file>src/main/webapp/WEB-INF/spring-bean-config.xml</config-file>
+            <config-file>src/main/webapp/WEB-INF/spring-common-config.xml</config-file>
+            <config-file>src/main/webapp/WEB-INF/spring-database-config.xml</config-file>
+            <config-file>src/main/webapp/WEB-INF/spring-security-config.xml</config-file>
         </config-files>
         <config-file-groups/>
     </spring-data>
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/IUserManager.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/IUserManager.java
deleted file mode 100644
index 827e6858..00000000
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/IUserManager.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/***************************************************************************
- * Copyright 2012 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.webgui.common;
-
-import java.util.List;
-
-import org.springframework.security.access.prepost.PreAuthorize;
-
-import kieker.webgui.domain.User;
-import kieker.webgui.domain.User.Role;
-
-public interface IUserManager {
-
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void addUser(final String username, final String password, final List<Role> roles);
-
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void removeUser(final String username);
-
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void editUser(final String username, final String password, final Role... roles);
-
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public List<User> getUsers();
-
-}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/package-info.java
deleted file mode 100644
index 7d66d449..00000000
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/***************************************************************************
- * Copyright 2012 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-/**
- * @author Nils Christian Ehmke
- *
- */
-package kieker.webgui.common.converter;
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerImpl.java
deleted file mode 100644
index d737a4b3..00000000
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerImpl.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/***************************************************************************
- * Copyright 2012 Kieker Project (http://kieker-monitoring.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ***************************************************************************/
-
-package kieker.webgui.common.impl;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.sql.DataSource;
-
-import org.springframework.security.access.prepost.PreAuthorize;
-
-import kieker.common.logging.Log;
-import kieker.common.logging.LogFactory;
-import kieker.webgui.common.IUserManager;
-import kieker.webgui.domain.User;
-import kieker.webgui.domain.User.Role;
-
-public class UserManagerImpl implements IUserManager {
-
-	private static final Log LOG = LogFactory.getLog(UserManagerImpl.class);
-	private DataSource dataSource;
-	private Connection connection;
-
-	/**
-	 * Default constructor. <b>Do not use this constructor. This bean is Spring managed.</b>
-	 */
-	public UserManagerImpl() {
-		// No code necessary
-	}
-
-	/**
-	 * This method initializes the object.. <b>Do not call this method manually. It will only be accessed by Spring.</b>
-	 */
-	public void initialize() {
-		try {
-			this.connection = this.dataSource.getConnection();
-		} catch (final SQLException ex) {
-			UserManagerImpl.LOG.error("Could not establish database connection.", ex);
-		}
-	}
-
-	public void destroy() {
-		try {
-			this.connection.close();
-		} catch (final SQLException ex) {
-			UserManagerImpl.LOG.error("Could not close database connection.", ex);
-		}
-	}
-
-	public void setDataSource(final DataSource dataSource) {
-		this.dataSource = dataSource;
-	}
-
-	@Override
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void addUser(final String username, final String password, final List<Role> roles) {
-		PreparedStatement userCmd = null;
-		PreparedStatement roleCmd = null;
-		try {
-			userCmd = this.connection.prepareStatement("INSERT INTO KIEKERUser (name, password, enabled) VALUES (?, ?, True)");
-			roleCmd = this.connection.prepareStatement("INSERT INTO Userroles (name, role) VALUES (?, ?)");
-
-			userCmd.setString(1, username);
-			userCmd.setString(2, password);
-			userCmd.execute();
-
-			roleCmd.setString(1, username);
-			for (final Role role : roles) {
-				roleCmd.setInt(2, role.getID());
-				roleCmd.execute();
-			}
-		} catch (final SQLException ex) {
-			UserManagerImpl.LOG.error("Could not add user to the database.", ex);
-		} finally {
-			if (userCmd != null) {
-				try {
-					userCmd.close();
-				} catch (final SQLException ex) {
-					UserManagerImpl.LOG.error("Could not close prepared statement.", ex);
-				}
-			}
-			if (roleCmd != null) {
-				try {
-					roleCmd.close();
-				} catch (final SQLException ex) {
-					UserManagerImpl.LOG.error("Could not close prepared statement.", ex);
-				}
-			}
-		}
-	}
-
-	@Override
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void removeUser(final String username) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void editUser(final String username, final String password, final Role... roles) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public List<User> getUsers() {
-		// FIXME Users without roles
-		final List<User> result = new ArrayList<User>();
-		ResultSet queryResult = null;
-
-		try {
-			final Map<String, User> tempMap = new TreeMap<String, User>();
-
-			final PreparedStatement getQuery = this.connection
-					.prepareStatement("select u.name, ur.role, u.enabled from KIEKERUser u, Userroles ur where u.name=ur.name");
-
-			// Run through all results
-			queryResult = getQuery.executeQuery();
-			while (queryResult.next()) {
-				// Get both the username and the role from the current entry
-				final String username = queryResult.getString(1);
-				final int roleID = queryResult.getInt(2);
-				final Role role = Role.fromID(roleID);
-				final boolean enabled = queryResult.getBoolean(3);
-
-				// If the user doesn't exist in our map yet, add him.
-				// In each case we add the role to the user
-				if (tempMap.containsKey(username)) {
-					tempMap.get(username).getRoles().add(role);
-				} else {
-					final List<Role> roles = new ArrayList<Role>();
-					roles.add(role);
-					tempMap.put(username, new User(username, null, roles, enabled));
-				}
-			}
-
-			// Now convert the map to the list
-			result.addAll(tempMap.values());
-		} catch (final SQLException ex) {
-			UserManagerImpl.LOG.error("Could not receive user list.", ex);
-		} finally {
-			try {
-				if (queryResult != null) {
-					queryResult.close();
-				}
-			} catch (final SQLException ex) {
-				UserManagerImpl.LOG.error("Could not close query result.", ex);
-			}
-		}
-
-		return result;
-	}
-}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java
index 2c5d9f06..dd2002f4 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java
@@ -22,6 +22,8 @@ import kieker.analysis.model.analysisMetaModel.MIProject;
  */
 public class Project {
 
+	private String owner;
+	private String lastEditor;
 	private MIProject projectInstance;
 
 	public Project(final MIProject projectInstace) {
@@ -47,4 +49,42 @@ public class Project {
 		this.projectInstance = projectInstance;
 	}
 
+	/**
+	 * Getter for the property {@link Project#owner}.
+	 * 
+	 * @return The current value of the property.
+	 */
+	public String getOwner() {
+		return this.owner;
+	}
+
+	/**
+	 * Setter for the property {@link Project#owner}.
+	 * 
+	 * @param owner
+	 *            The new value of the property.
+	 */
+	public void setOwner(final String owner) {
+		this.owner = owner;
+	}
+
+	/**
+	 * Getter for the property {@link Project#lastEditor}.
+	 * 
+	 * @return The current value of the property.
+	 */
+	public String getLastEditor() {
+		return this.lastEditor;
+	}
+
+	/**
+	 * Setter for the property {@link Project#lastEditor}.
+	 * 
+	 * @param lastEditor
+	 *            The new value of the property.
+	 */
+	public void setLastEditor(final String lastEditor) {
+		this.lastEditor = lastEditor;
+	}
+
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IUserDAO.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IUserDAO.java
index f4d6748e..f641af29 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IUserDAO.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IUserDAO.java
@@ -22,7 +22,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 
 import kieker.webgui.domain.User;
-import kieker.webgui.common.exception.DataAccessException;
+import kieker.webgui.domain.User.Role;
 
 /**
  * 
@@ -33,18 +33,18 @@ public interface IUserDAO {
 
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
 	@Transactional
-	public void addUser(final User user) throws DataAccessException;
+	public void addUser(final String username, final String password, final List<Role> roles);
 
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
 	@Transactional
-	public void editUser(final User user) throws DataAccessException;
+	public void removeUser(final String username);
 
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
 	@Transactional
-	public void deleteUser(final User user) throws DataAccessException;
+	public void editUser(final String username, final String password, final Role... roles);
 
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
 	@Transactional
-	public List<User> getUsers() throws DataAccessException;
+	public List<User> getUsers();
 
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/DerbyUserDAOImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/DerbyUserDAOImpl.java
index 6c49c87d..f11448d0 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/DerbyUserDAOImpl.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/DerbyUserDAOImpl.java
@@ -31,7 +31,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
 
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.webgui.common.exception.DataAccessException;
 import kieker.webgui.domain.User;
 import kieker.webgui.domain.User.Role;
 import kieker.webgui.persistence.IUserDAO;
@@ -46,51 +45,61 @@ public class DerbyUserDAOImpl implements IUserDAO {
 	private DataSource dataSource;
 	private Connection connection;
 
-	public void initialize() throws Exception {
-		this.connection = this.dataSource.getConnection();
-	}
-
-	public void destroy() throws Exception {
-		this.connection.close();
+	/**
+	 * Default constructor. <b>Do not use this constructor. This bean is Spring managed.</b>
+	 */
+	public DerbyUserDAOImpl() {
+		// No code necessary
 	}
 
 	/**
-	 * Setter for the property {@link DerbyUserDAO#dataSource}.
-	 * 
-	 * @param dataSource
-	 *            The new value of the property.
+	 * This method initializes the object.. <b>Do not call this method manually. It will only be accessed by Spring.</b>
 	 */
+	public void initialize() {
+		try {
+			this.connection = this.dataSource.getConnection();
+		} catch (final SQLException ex) {
+			DerbyUserDAOImpl.LOG.error("Could not establish database connection.", ex);
+		}
+	}
+
+	public void destroy() {
+		try {
+			this.connection.close();
+		} catch (final SQLException ex) {
+			DerbyUserDAOImpl.LOG.error("Could not close database connection.", ex);
+		}
+	}
+
 	public void setDataSource(final DataSource dataSource) {
 		this.dataSource = dataSource;
 	}
 
 	@Override
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void addUser(final User user) throws DataAccessException {
+	public void addUser(final String username, final String password, final List<Role> roles) {
 		PreparedStatement userCmd = null;
 		PreparedStatement roleCmd = null;
 		try {
-			userCmd = this.connection.prepareStatement("INSERT INTO KIEKERUser (name, password, enabled) VALUES (?, ?, ?)");
+			userCmd = this.connection.prepareStatement("INSERT INTO KIEKERUser (name, password, enabled) VALUES (?, ?, True)");
 			roleCmd = this.connection.prepareStatement("INSERT INTO Userroles (name, role) VALUES (?, ?)");
 
-			userCmd.setString(1, user.getName());
-			userCmd.setString(2, user.getPassword());
-			userCmd.setBoolean(3, user.isEnabled());
+			userCmd.setString(1, username);
+			userCmd.setString(2, password);
 			userCmd.execute();
 
-			roleCmd.setString(1, user.getName());
-			for (final Role role : user.getRoles()) {
+			roleCmd.setString(1, username);
+			for (final Role role : roles) {
 				roleCmd.setInt(2, role.getID());
 				roleCmd.execute();
 			}
 		} catch (final SQLException ex) {
-			throw new DataAccessException("Could not add user to the database.", ex);
+			DerbyUserDAOImpl.LOG.error("Could not add user to the database.", ex);
 		} finally {
 			if (userCmd != null) {
 				try {
 					userCmd.close();
 				} catch (final SQLException ex) {
-					// No need to inform the calling method
 					DerbyUserDAOImpl.LOG.error("Could not close prepared statement.", ex);
 				}
 			}
@@ -98,7 +107,6 @@ public class DerbyUserDAOImpl implements IUserDAO {
 				try {
 					roleCmd.close();
 				} catch (final SQLException ex) {
-					// No need to inform the calling method
 					DerbyUserDAOImpl.LOG.error("Could not close prepared statement.", ex);
 				}
 			}
@@ -107,19 +115,20 @@ public class DerbyUserDAOImpl implements IUserDAO {
 
 	@Override
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void deleteUser(final User user) throws DataAccessException {
+	public void removeUser(final String username) {
 		// TODO Auto-generated method stub
+
 	}
 
 	@Override
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public void editUser(final User user) throws DataAccessException {
+	public void editUser(final String username, final String password, final Role... roles) {
 		// TODO Auto-generated method stub
 	}
 
 	@Override
 	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	public List<User> getUsers() throws DataAccessException {
+	public List<User> getUsers() {
 		// FIXME Users without roles
 		final List<User> result = new ArrayList<User>();
 		ResultSet queryResult = null;
@@ -153,14 +162,13 @@ public class DerbyUserDAOImpl implements IUserDAO {
 			// Now convert the map to the list
 			result.addAll(tempMap.values());
 		} catch (final SQLException ex) {
-			throw new DataAccessException("Could not receive user list.", ex);
+			DerbyUserDAOImpl.LOG.error("Could not receive user list.", ex);
 		} finally {
 			try {
 				if (queryResult != null) {
 					queryResult.close();
 				}
 			} catch (final SQLException ex) {
-				// No need to inform the calling method
 				DerbyUserDAOImpl.LOG.error("Could not close query result.", ex);
 			}
 		}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/IUserService.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/IUserService.java
index 82f4dbf9..0623c8ae 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/IUserService.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/IUserService.java
@@ -15,9 +15,33 @@
  ***************************************************************************/
 package kieker.webgui.service;
 
+import java.util.List;
+
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+
+import kieker.webgui.domain.User;
+import kieker.webgui.domain.User.Role;
+
 /**
  * @author Nils Christian Ehmke
  */
 public interface IUserService {
 
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public void addUser(final String username, final String password, final List<Role> roles);
+
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public void removeUser(final String username);
+
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public void editUser(final String username, final String password, final Role... roles);
+
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public List<User> getUsers();
+
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/UserServiceImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/UserServiceImpl.java
index a50db303..80bd5e36 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/UserServiceImpl.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/UserServiceImpl.java
@@ -15,6 +15,14 @@
  ***************************************************************************/
 package kieker.webgui.service.impl;
 
+import java.util.List;
+
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+
+import kieker.webgui.domain.User;
+import kieker.webgui.domain.User.Role;
+import kieker.webgui.persistence.IUserDAO;
 import kieker.webgui.service.IUserService;
 
 /**
@@ -22,11 +30,68 @@ import kieker.webgui.service.IUserService;
  */
 public class UserServiceImpl implements IUserService {
 
+	private IUserDAO userDAO;
+
+	public UserServiceImpl() {
+		// No code necessary
+	}
+
 	/**
+	 * Setter for the property {@link UserServiceImpl#userDAO}.
 	 * 
+	 * @param userDAO
+	 *            The new value of the property.
 	 */
-	public UserServiceImpl() {
-		// TODO Auto-generated constructor stub
+	public void setUserDAO(final IUserDAO userDAO) {
+		this.userDAO = userDAO;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see kieker.webgui.service.IUserService#addUser(java.lang.String, java.lang.String, java.util.List)
+	 */
+	@Override
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public void addUser(final String username, final String password, final List<Role> roles) {
+		this.userDAO.addUser(username, password, roles);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see kieker.webgui.service.IUserService#removeUser(java.lang.String)
+	 */
+	@Override
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public void removeUser(final String username) {
+		this.userDAO.removeUser(username);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see kieker.webgui.service.IUserService#editUser(java.lang.String, java.lang.String, kieker.webgui.domain.User.Role[])
+	 */
+	@Override
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public void editUser(final String username, final String password, final Role... roles) {
+		this.userDAO.editUser(username, password, roles);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see kieker.webgui.service.IUserService#getUsers()
+	 */
+	@Override
+	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@Transactional
+	public List<User> getUsers() {
+		return this.userDAO.getUsers();
 	}
 
 }
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/GlobalPropertiesBean.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/GlobalPropertiesBean.java
index d93a1bdc..1f1caa7e 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/GlobalPropertiesBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/GlobalPropertiesBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.application;
+package kieker.webgui.web.beans.application;
 
 import java.io.Serializable;
 import java.util.ResourceBundle;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ProjectsBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/ProjectsBean.java
similarity index 98%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ProjectsBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/ProjectsBean.java
index 49bbe492..2280c6d7 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ProjectsBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/ProjectsBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.application;
+package kieker.webgui.web.beans.application;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -27,7 +27,7 @@ import javax.faces.application.FacesMessage;
 import kieker.analysis.model.analysisMetaModel.MIProject;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.webgui.beans.view.CurrentProjectOverviewBean;
+import kieker.webgui.web.beans.view.CurrentProjectOverviewBean;
 import kieker.webgui.common.exception.ProjectAlreadyExistingException;
 import kieker.webgui.common.exception.ProjectLoadException;
 import kieker.webgui.common.exception.ProjectNotExistingException;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/ThemeSwitcherBean.java
similarity index 97%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/ThemeSwitcherBean.java
index 91bb4b37..d2b1bd35 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/ThemeSwitcherBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/ThemeSwitcherBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.application;
+package kieker.webgui.web.beans.application;
 
 import java.util.Collections;
 import java.util.Map;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/package-info.java
similarity index 95%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/package-info.java
index 07aa9a73..f79bc88f 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/application/package-info.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/application/package-info.java
@@ -19,5 +19,5 @@
  * 
  * @author Nils Christian Ehmke
  */
-package kieker.webgui.beans.application;
+package kieker.webgui.web.beans.application;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/NewUserBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/NewUserBean.java
similarity index 98%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/NewUserBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/NewUserBean.java
index d86ed59f..21ae5892 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/NewUserBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/NewUserBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.request;
+package kieker.webgui.web.beans.request;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/StringBean.java
similarity index 98%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/StringBean.java
index caabc4ae..6bde06dd 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/StringBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/StringBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.request;
+package kieker.webgui.web.beans.request;
 
 /**
  * This simple bean can be used to store a string during a request. Furthermore it provides some simple methods to handle strings within the application where a bean
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/package-info.java
similarity index 95%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/package-info.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/package-info.java
index 26cfe25c..53adcd24 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/request/package-info.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/request/package-info.java
@@ -19,5 +19,5 @@
  * 
  * @author Nils Christian Ehmke
  */
-package kieker.webgui.beans.request;
+package kieker.webgui.web.beans.request;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/session/UserBean.java
similarity index 98%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/session/UserBean.java
index a9a6025d..94e62188 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/UserBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/session/UserBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.session;
+package kieker.webgui.web.beans.session;
 
 import java.io.Serializable;
 import java.util.Map;
@@ -26,7 +26,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetails;
 
-import kieker.webgui.beans.application.GlobalPropertiesBean;
+import kieker.webgui.web.beans.application.GlobalPropertiesBean;
 
 /**
  * This bean contains information about the user of this session (like the properties and configurations). This class is a Spring managed bean with session scope.
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/session/package-info.java
similarity index 95%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/package-info.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/session/package-info.java
index ecc09dce..64e96c5f 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/session/package-info.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/session/package-info.java
@@ -19,5 +19,5 @@
  * 
  * @author Nils Christian Ehmke
  */
-package kieker.webgui.beans.session;
+package kieker.webgui.web.beans.session;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java
index 81371c94..7edd84ca 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.io.IOException;
 import java.lang.annotation.Annotation;
@@ -49,9 +49,9 @@ import kieker.analysis.plugin.reader.AbstractReaderPlugin;
 import kieker.analysis.repository.AbstractRepository;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.webgui.beans.application.GlobalPropertiesBean;
-import kieker.webgui.beans.application.ProjectsBean;
-import kieker.webgui.beans.session.UserBean;
+import kieker.webgui.web.beans.application.GlobalPropertiesBean;
+import kieker.webgui.web.beans.application.ProjectsBean;
+import kieker.webgui.web.beans.session.UserBean;
 import kieker.webgui.common.ClassAndMethodContainer;
 import kieker.webgui.common.exception.LibraryAlreadyExistingException;
 import kieker.webgui.common.exception.LibraryLoadException;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java
index ca3f6c43..e8a24cfd 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorGraphBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.util.Map;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java
similarity index 97%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java
index 2d9b158a..1a065350 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.io.IOException;
 
@@ -25,8 +25,8 @@ import kieker.analysis.model.analysisMetaModel.MIProject;
 import kieker.analysis.model.analysisMetaModel.MIView;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.webgui.beans.application.GlobalPropertiesBean;
-import kieker.webgui.beans.application.ProjectsBean;
+import kieker.webgui.web.beans.application.GlobalPropertiesBean;
+import kieker.webgui.web.beans.application.ProjectsBean;
 import kieker.webgui.common.ClassAndMethodContainer;
 import kieker.webgui.common.exception.DisplayNotFoundException;
 import kieker.webgui.common.exception.ProjectNotExistingException;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitEditorBean.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitEditorBean.java
index 678242c1..cb7d9875 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitEditorBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.io.IOException;
 import java.lang.annotation.Annotation;
@@ -40,8 +40,8 @@ import kieker.analysis.model.analysisMetaModel.impl.MAnalysisMetaModelFactory;
 import kieker.analysis.plugin.AbstractPlugin;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.webgui.beans.application.GlobalPropertiesBean;
-import kieker.webgui.beans.application.ProjectsBean;
+import kieker.webgui.web.beans.application.GlobalPropertiesBean;
+import kieker.webgui.web.beans.application.ProjectsBean;
 import kieker.webgui.common.ClassAndMethodContainer;
 import kieker.webgui.common.exception.NewerProjectException;
 import kieker.webgui.common.exception.ProjectLoadException;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java
index 2245572d..fb1bacde 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -28,7 +28,7 @@ import java.util.List;
 import kieker.analysis.AnalysisController;
 import kieker.common.logging.Log;
 import kieker.common.logging.LogFactory;
-import kieker.webgui.beans.application.ProjectsBean;
+import kieker.webgui.web.beans.application.ProjectsBean;
 import kieker.webgui.common.exception.AnalysisInitializationException;
 import kieker.webgui.common.exception.AnalysisStateException;
 import kieker.webgui.common.exception.ProjectNotExistingException;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentProjectOverviewBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentProjectOverviewBean.java
similarity index 96%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentProjectOverviewBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentProjectOverviewBean.java
index 6ccfb249..ac5bc4f7 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentProjectOverviewBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentProjectOverviewBean.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import kieker.webgui.beans.application.ProjectsBean;
+import kieker.webgui.web.beans.application.ProjectsBean;
 
 import org.primefaces.event.SelectEvent;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentUserManagementBean.java
similarity index 85%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentUserManagementBean.java
index 44cff58d..ea0195bb 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentUserManagementBean.java
@@ -14,21 +14,21 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import kieker.webgui.common.IUserManager;
 import kieker.webgui.domain.User;
 import kieker.webgui.domain.User.Role;
+import kieker.webgui.service.IUserService;
 
 /**
  * @author Nils Christian Ehmke
  */
 public final class CurrentUserManagementBean {
 
-	private IUserManager userManagerFacade;
+	private IUserService userService;
 	/**
 	 * This list contains all available users.
 	 */
@@ -42,13 +42,13 @@ public final class CurrentUserManagementBean {
 	}
 
 	/**
-	 * Setter for the property {@link CurrentUserManagementBean#userManagerFacade}.
+	 * Setter for the property {@link CurrentUserManagementBean#userService}.
 	 * 
-	 * @param userManagerFacade
+	 * @param userService
 	 *            The new value for the property.
 	 */
-	public void setUserManagerFacade(final IUserManager userManagerFacade) {
-		this.userManagerFacade = userManagerFacade;
+	public void setUserService(final IUserService userService) {
+		this.userService = userService;
 	}
 
 	/**
@@ -62,7 +62,7 @@ public final class CurrentUserManagementBean {
 	 *            The roles of the new user.
 	 */
 	public void addUser(final String username, final String password, final List<Role> roles) {
-		this.userManagerFacade.addUser(username, password, roles);
+		this.userService.addUser(username, password, roles);
 		// TODO Check that the op was successful before adding the user to our list
 		this.users.add(new User(username, null, roles, true));
 	}
@@ -74,7 +74,7 @@ public final class CurrentUserManagementBean {
 	 *            The name of the user.
 	 */
 	public void removeUser(final String username) {
-		this.userManagerFacade.removeUser(username);
+		this.userService.removeUser(username);
 	}
 
 	/**
@@ -88,7 +88,7 @@ public final class CurrentUserManagementBean {
 	 *            The (new) roles of the user.
 	 */
 	public void editUser(final String username, final String password, final Role... roles) {
-		this.userManagerFacade.editUser(username, password, roles);
+		this.userService.editUser(username, password, roles);
 	}
 
 	/**
@@ -102,7 +102,7 @@ public final class CurrentUserManagementBean {
 	 * Updates the list containing the available users.
 	 */
 	public void updateList() {
-		this.users = this.userManagerFacade.getUsers();
+		this.users = this.userService.getUsers();
 	}
 
 	/**
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/package-info.java
similarity index 95%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/package-info.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/package-info.java
index 1294ccfa..57470cd3 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/package-info.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/package-info.java
@@ -19,5 +19,5 @@
  * 
  * @author Nils Christian Ehmke
  */
-package kieker.webgui.beans.view;
+package kieker.webgui.web.beans.view;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/RoleStringConverter.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/converter/RoleStringConverter.java
similarity index 97%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/RoleStringConverter.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/converter/RoleStringConverter.java
index 2168bc31..99b15498 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/converter/RoleStringConverter.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/converter/RoleStringConverter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.common.converter;
+package kieker.webgui.web.converter;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/converter/package-info.java
similarity index 95%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/package-info.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/web/converter/package-info.java
index 54cf3cb2..1bfdcb1b 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/package-info.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/converter/package-info.java
@@ -18,4 +18,4 @@
  * @author Nils Christian Ehmke
  *
  */
-package kieker.webgui.common.impl;
\ No newline at end of file
+package kieker.webgui.web.converter;
\ No newline at end of file
diff --git a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties
index dd9d1586..f26b7405 100644
--- a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties
+++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties
@@ -1,7 +1,7 @@
 #------------------------------------------------------------------------------
 #
-# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., 
-# welche innerhalb der Projektübersichtsseite benutzt werden.
+# Diese Datei beinhaltet s\u00e4mtliche Nachrichten, Buttonbeschriftungen etc., 
+# welche innerhalb der Projekt\u00fcbersichtsseite benutzt werden.
 #
 #------------------------------------------------------------------------------
 
@@ -13,6 +13,7 @@ projectName = Projektname
 state = Status
 lastModification = Letzte \u00c4nderung
 owner = Besitzer
+lastEditor = Letzter Bearbeiter
 
 copyProject = Projekt Kopieren
 renameProject = Projekt Umbenennen
diff --git a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties
index 7e12607f..b915b322 100644
--- a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties
+++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties
@@ -13,6 +13,7 @@ projectName = Project Name
 state = State
 lastModification = Last Modification
 owner = Owner
+lastEditor = Last Editor
 
 copyProject = Copy Project
 renameProject = Rename Project
diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/spring-bean-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/spring-bean-config.xml
index 4cd740b5..a3ccefdb 100644
--- a/Kieker.WebGUI/src/main/webapp/WEB-INF/spring-bean-config.xml
+++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/spring-bean-config.xml
@@ -13,13 +13,16 @@
         <property name="acManager" ref="acManager" />
         <property name="pluginFinder" ref="pluginFinder" />
     </bean>
+    <bean id="userService" class="kieker.webgui.service.impl.UserServiceImpl">
+        <property name="userDAO" ref="userDAO" />
+    </bean>
     <bean id="acManager" class="kieker.webgui.service.impl.util.ACManager">
         <property name="projectDAO" ref="projectDAO" />
     </bean>
-    <bean id="projectsBean" lazy-init="true" class="kieker.webgui.beans.application.ProjectsBean" init-method="initialize">
+    <bean id="projectsBean" lazy-init="true" class="kieker.webgui.web.beans.application.ProjectsBean" init-method="initialize">
         <property name="projectService" ref="projectService" />
     </bean>
-    <bean id="globalPropertiesBean" class="kieker.webgui.beans.application.GlobalPropertiesBean">
+    <bean id="globalPropertiesBean" class="kieker.webgui.web.beans.application.GlobalPropertiesBean">
         <property name="themeCookieName" value="${kieker.webgui.config.lookAndFeel.cookieName}"/>
         <property name="projectOverviewPage" value="${kieker.webgui.page.projectOverview}"/>
         <property name="facesContextThemeKey" value="${kieker.webgui.config.lookAndFeel.facesContextKey}"/>
@@ -29,7 +32,7 @@
         <property name="analysisEditorDefaultGridSize" value="${kieker.webgui.config.analysisEditor.defaultGridSize}"/>
         <property name="analysisEditorDefaultGridColor" value="${kieker.webgui.config.analysisEditor.defaultGridColor}"/>
     </bean>
-    <bean id="themeSwitcherBean" class="kieker.webgui.beans.application.ThemeSwitcherBean">
+    <bean id="themeSwitcherBean" class="kieker.webgui.web.beans.application.ThemeSwitcherBean">
         <!-- This is the map containing the available themes (look and feels). If one wants to add more themes, this is the correct place to do so. -->
         <property name="themes">
             <map>
@@ -66,50 +69,47 @@
             </map>
         </property>
     </bean>
-    <bean destroy-method="destroy" init-method="initialize"  id="userManager" class="kieker.webgui.common.impl.UserManagerImpl">
-        <property name="dataSource" ref="userDataSource" />
-    </bean>
     <bean id="userDAO" class="kieker.webgui.persistence.impl.DerbyUserDAOImpl" init-method="initialize" destroy-method="destroy">
         <property name="dataSource" ref="userDataSource"/>
     </bean>
     
     <!-- The session scoped beans. -->
-    <bean id="userBean" init-method="initialize" class="kieker.webgui.beans.session.UserBean" scope="session"> 
+    <bean id="userBean" init-method="initialize" class="kieker.webgui.web.beans.session.UserBean" scope="session"> 
         <property name="globalPropertiesBean" ref="globalPropertiesBean"/>
     </bean>
     
     <!-- The view scoped beans. -->
-    <bean id="currentAnalysisEditorBean" class="kieker.webgui.beans.view.CurrentAnalysisEditorBean" scope="view"> 
+    <bean id="currentAnalysisEditorBean" class="kieker.webgui.web.beans.view.CurrentAnalysisEditorBean" scope="view"> 
         <property name="globalPropertiesBean" ref="globalPropertiesBean"/>
         <property name="projectService" ref="projectService" />
         <property name="projectsBean" ref="projectsBean" />
         <property name="currentAnalysisEditorGraphBean" ref="currentAnalysisEditorGraphBean" />
         <property name="userBean" ref="userBean" />
     </bean>
-    <bean id="currentAnalysisEditorGraphBean" class="kieker.webgui.beans.view.CurrentAnalysisEditorGraphBean" scope="view"/> 
-    <bean id="currentCockpitBean" class="kieker.webgui.beans.view.CurrentCockpitBean" scope="view"> 
+    <bean id="currentAnalysisEditorGraphBean" class="kieker.webgui.web.beans.view.CurrentAnalysisEditorGraphBean" scope="view"/> 
+    <bean id="currentCockpitBean" class="kieker.webgui.web.beans.view.CurrentCockpitBean" scope="view"> 
         <property name="projectsBean" ref="projectsBean"/>
         <property name="projectService" ref="projectService" />
     </bean>
-    <bean id="currentCockpitEditorBean" class="kieker.webgui.beans.view.CurrentCockpitEditorBean" scope="view"> 
+    <bean id="currentCockpitEditorBean" class="kieker.webgui.web.beans.view.CurrentCockpitEditorBean" scope="view"> 
         <property name="globalPropertiesBean" ref="globalPropertiesBean"/>
         <property name="projectService" ref="projectService" />
         <property name="projectsBean" ref="projectsBean"/>
     </bean>
-    <bean id="currentControllerBean" class="kieker.webgui.beans.view.CurrentControllerBean" scope="view"> 
+    <bean id="currentControllerBean" class="kieker.webgui.web.beans.view.CurrentControllerBean" scope="view"> 
         <property name="projectsBean" ref="projectsBean"/>
         <property name="projectService" ref="projectService" />
     </bean>
-    <bean id="currentProjectOverviewBean" class="kieker.webgui.beans.view.CurrentProjectOverviewBean" scope="view" init-method="initialialize"> 
+    <bean id="currentProjectOverviewBean" class="kieker.webgui.web.beans.view.CurrentProjectOverviewBean" scope="view" init-method="initialialize"> 
         <property name="projectsBean" ref="projectsBean"/>
     </bean>
-    <bean id="currentUserManagementBean" class="kieker.webgui.beans.view.CurrentUserManagementBean" init-method="initialialize" scope="view"> 
-        <property name="userManagerFacade" ref="userManager"/>
+    <bean id="currentUserManagementBean" class="kieker.webgui.web.beans.view.CurrentUserManagementBean" init-method="initialialize" scope="view"> 
+        <property name="userService" ref="userService"/>
     </bean>
     
     <!-- The request scoped beans. -->
-    <bean id="stringBean" class="kieker.webgui.beans.request.StringBean" scope="request"/> 
-    <bean id="newUserBean" class="kieker.webgui.beans.request.NewUserBean" scope="request"/>
+    <bean id="stringBean" class="kieker.webgui.web.beans.request.StringBean" scope="request"/> 
+    <bean id="newUserBean" class="kieker.webgui.web.beans.request.NewUserBean" scope="request"/>
     
     <!-- The enums. -->
     <util:constant id="ROLE_USER" static-field="kieker.webgui.domain.User.Role.ROLE_USER"/>
diff --git a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml
index 18e9b18f..719740a3 100644
--- a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml
+++ b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml
@@ -69,14 +69,18 @@
                             <h:outputText value="#{projectsBean.getAnalysisControllerState(project)}"/>  
                         </p:column>
 
+                        <p:column headerText="#{localizedProjectOverviewMessages.owner}" style="text-align: center">   
+                            <h:outputText value="N/A" />  
+                        </p:column>  
+                        
                         <p:column headerText="#{localizedProjectOverviewMessages.lastModification}" sortBy="#{projectsBean.getCurrTimeStamp(project)}" style="text-align: center">  
                             <h:outputText value="#{projectsBean.getCurrTimeStamp(project)}" />  
                         </p:column>  
-
-                        <p:column headerText="#{localizedProjectOverviewMessages.owner}" style="text-align: center" rendered="false">   
+                        
+                        <p:column headerText="#{localizedProjectOverviewMessages.lastEditor}" style="text-align: center">   
                             <h:outputText value="N/A" />  
                         </p:column>  
-
+                        
                     </p:dataTable>  
                 </h:form>
             </ui:define>
-- 
GitLab