diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
index b438bf9431f4c06973757c4ff04406cf2fed1bb9..81371c948b660275751a20edd41dd71dc98dadc4 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentAnalysisEditorBean.java
@@ -395,7 +395,7 @@ public final class CurrentAnalysisEditorBean {
 	private void reloadClassLoader() throws ProjectLoadException {
 		synchronized (this) {
 			try {
-				this.classLoader = this.projectService.getClassLoader(this.projectName); // NOPMD (ClassLoader)
+				this.classLoader = this.projectService.getClassLoader(this.projectName, this); // NOPMD (ClassLoader)
 			} catch (final NullPointerException ex) {
 				throw new ProjectLoadException("Invalid class loader.", ex);
 			} catch (final IOException ex) {
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java
index 9367932e9dd0324381362cdb343134f1f1141517..2d9b158ac46d320f1d2c196efc834992e35b3415 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitBean.java
@@ -122,7 +122,7 @@ public final class CurrentCockpitBean {
 					this.project = this.projectsBean.openProject(this.projectName);
 
 					if (this.project != null) {
-						final ClassLoader classLoader = this.projectService.getClassLoader(this.projectName); // NOPMD (ClassLoader)
+						final ClassLoader classLoader = this.projectService.getClassLoader(this.projectName, this); // NOPMD (ClassLoader)
 						this.classAndMethodContainer = new ClassAndMethodContainer(classLoader);
 					}
 				}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java
index 18b5fee8d5be0c686cbbe009e97f9dcf84ca9308..678242c146fc1d76e8701316d44d45c44198c469 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentCockpitEditorBean.java
@@ -227,7 +227,7 @@ public final class CurrentCockpitEditorBean {
 	private void reloadClassLoader() throws ProjectLoadException {
 		synchronized (this) {
 			try {
-				this.classLoader = this.projectService.getClassLoader(this.projectName); // NOPMD (ClassLoader)
+				this.classLoader = this.projectService.getClassLoader(this.projectName, this); // NOPMD (ClassLoader)
 			} catch (final NullPointerException ex) {
 				throw new ProjectLoadException("Invalid class loader.", ex);
 			} catch (final IOException ex) {
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java
index b9301ad137a20fbb2247809bd28109b62acaee0c..2245572dc5f60fb0e8551724b9544e21ec22e476 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentControllerBean.java
@@ -147,7 +147,7 @@ public final class CurrentControllerBean {
 		synchronized (this) {
 			this.addLogEntry("Instantiating Analysis for project '" + this.projectName + "'");
 			try {
-				this.projectService.initializeAnalysis(this.projectName, this.projectService.getClassLoader(this.projectName)); // NOPMD (ClassLoader)
+				this.projectService.initializeAnalysis(this.projectName, this.projectService.getClassLoader(this.projectName, this)); // NOPMD (ClassLoader)
 			} catch (final AnalysisStateException ex) {
 				CurrentControllerBean.LOG.error("The analysis has already been instantiated.", ex);
 				this.addLogEntry(ex);
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c5d9f064cd6f71439e5241a53843500a65a439a
--- /dev/null
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/Project.java
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * 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.domain;
+
+import kieker.analysis.model.analysisMetaModel.MIProject;
+
+/**
+ * @author Nils Christian Ehmke
+ */
+public class Project {
+
+	private MIProject projectInstance;
+
+	public Project(final MIProject projectInstace) {
+		this.projectInstance = projectInstace;
+	}
+
+	/**
+	 * Getter for the property {@link Project#projectInstance}.
+	 * 
+	 * @return The current value of the property.
+	 */
+	public MIProject getProjectInstance() {
+		return this.projectInstance;
+	}
+
+	/**
+	 * Setter for the property {@link Project#projectInstance}.
+	 * 
+	 * @param projectInstace
+	 *            The new value of the property.
+	 */
+	public void setProjectInstance(final MIProject projectInstance) {
+		this.projectInstance = projectInstance;
+	}
+
+}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/User.java b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/User.java
index 5056f1c20e996647ac7b32f97e58caa16c3959d5..e2a5a0b0137d8e4dedaca634819309e1650f6b27 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/User.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/User.java
@@ -110,7 +110,7 @@ public class User {
 
 	public static enum Role {
 
-		ROLE_USER(1), ROLE_ADMIN(2);
+		ROLE_GUEST(0), ROLE_USER(1), ROLE_ADMIN(2);
 
 		private int id;
 
@@ -126,7 +126,11 @@ public class User {
 			if (id == 2) {
 				return Role.ROLE_ADMIN;
 			} else {
-				return Role.ROLE_USER;
+				if (id == 1) {
+					return Role.ROLE_USER;
+				} else {
+					return Role.ROLE_GUEST;
+				}
 			}
 		}
 	}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IProjectDAO.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IProjectDAO.java
index 0453da31f092c68766448f9bd4104d7e8e63a448..bf55230f2588e68a094dbc23bdd8151bfd14afee 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IProjectDAO.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/IProjectDAO.java
@@ -53,7 +53,7 @@ public interface IProjectDAO {
 	 * @throws IOException
 	 *             If something went wrong during the creation of the project.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract void addProject(String projectName) throws ProjectAlreadyExistingException, IOException;
 
@@ -72,7 +72,7 @@ public interface IProjectDAO {
 	 * @throws IOException
 	 *             If something went wrong during the creation of the target-project or during the loading of the source-project.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract void copyProject(String originalProjectName, String newProjectName) throws ProjectNotExistingException, ProjectAlreadyExistingException,
 			IOException;
@@ -88,7 +88,7 @@ public interface IProjectDAO {
 	 * @throws IOException
 	 *             If something went wrong during the opening of the project.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract MIProject openProject(String projectName) throws ProjectNotExistingException, IOException;
 
@@ -107,7 +107,7 @@ public interface IProjectDAO {
 	 * @throws IOException
 	 *             If something went wrong during the opening of the project. This can also mean that the given {@link ClassAndMethodContainer} is somehow invalid.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract Object openProject(String projectName, ClassAndMethodContainer classAndMethodContainer) throws ProjectNotExistingException, IOException;
 
@@ -131,7 +131,7 @@ public interface IProjectDAO {
 	 * @throws NewerProjectException
 	 *             If the project on the file system is newer and the overwriteNewerProject-flag has not been set.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract void saveProject(String projectName, MIProject project, long timeStamp, boolean overwriteNewerProject) throws
 			ProjectNotExistingException, IOException, NewerProjectException;
@@ -145,7 +145,7 @@ public interface IProjectDAO {
 	 * @throws ProjectNotExistingException
 	 *             If a project with the given name does not exist.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract long getCurrTimeStamp(String projectName) throws ProjectNotExistingException;
 
@@ -163,7 +163,7 @@ public interface IProjectDAO {
 	 * @throws LibraryAlreadyExistingException
 	 *             If a library with the same name exists already.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract void uploadLibrary(UploadedFile file, String projectName) throws ProjectNotExistingException, IOException, LibraryAlreadyExistingException;
 
@@ -178,9 +178,9 @@ public interface IProjectDAO {
 	 * @throws IOException
 	 *             If something went wrong during the initialization of the class loader.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
-	public abstract ClassLoader getClassLoader(String projectName) throws ProjectNotExistingException, IOException;
+	public ClassLoader getClassLoader(final String projectName, final Object requester) throws ProjectNotExistingException, IOException;
 
 	/**
 	 * This method lists all available libraries of the given project.
@@ -191,7 +191,7 @@ public interface IProjectDAO {
 	 * @throws ProjectNotExistingException
 	 *             If a project with the given name does not exist.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract List<String> listAllLibraries(String projectName) throws ProjectNotExistingException;
 
@@ -200,7 +200,7 @@ public interface IProjectDAO {
 	 * 
 	 * @return A list containing all available project names.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract Collection<String> listAllProjects();
 
@@ -215,7 +215,7 @@ public interface IProjectDAO {
 	 * @throws MalformedURLException
 	 *             If the URL is for some reason invalid.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract URL getURL(MIDependency lib, String project) throws MalformedURLException;
 
@@ -224,7 +224,7 @@ public interface IProjectDAO {
 	 * 
 	 * @return The kieker library.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract URL getKiekerURL();
 
@@ -235,7 +235,7 @@ public interface IProjectDAO {
 	 *            The name of the project.
 	 * @return The kax-file of the project.
 	 */
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
+	@PreAuthorize("isAuthenticated()")
 	@Transactional
 	public abstract File getProjectFile(String projectName);
 
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 c7a475743dd43c919e28b4c28d996bde9cdee5f9..f7b3951797aec1e4031ecefa2a6b521c55fa3c31 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
@@ -23,9 +23,9 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.ref.WeakReference;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.nio.channels.ByteChannel;
 import java.nio.channels.FileChannel;
 import java.security.AccessController;
@@ -33,6 +33,12 @@ import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.util.WeakReferenceMonitor;
+import org.springframework.util.WeakReferenceMonitor.ReleaseListener;
 
 import kieker.analysis.AnalysisController;
 import kieker.analysis.model.analysisMetaModel.MIAnalysisMetaModelFactory;
@@ -47,13 +53,14 @@ import kieker.webgui.common.exception.NewerProjectException;
 import kieker.webgui.common.exception.ProjectAlreadyExistingException;
 import kieker.webgui.common.exception.ProjectNotExistingException;
 import kieker.webgui.persistence.IProjectDAO;
+import kieker.webgui.persistence.impl.util.CloseableURLClassLoader;
 
 import org.primefaces.model.UploadedFile;
 
 /**
  * @author Nils Christian Ehmke
  */
-public class FSProjectDAOImpl implements IProjectDAO {
+public class FSProjectDAOImpl implements IProjectDAO, ReleaseListener {
 
 	private static final Log LOG = LogFactory.getLog(FSProjectDAOImpl.class);
 	private static final String KAX_EXTENSION = "kax";
@@ -70,6 +77,7 @@ public class FSProjectDAOImpl implements IProjectDAO {
 	private static final int BUF_SIZE_BYTES = 1024 * 1024;
 
 	private final MIAnalysisMetaModelFactory factory = new MAnalysisMetaModelFactory();
+	private final Map<CloseableURLClassLoader, WeakReference<Object>> classLoaders = new ConcurrentHashMap<CloseableURLClassLoader, WeakReference<Object>>();
 
 	/**
 	 * Default constructor. <b>Do not use this constructor. This bean is Spring managed.</b>
@@ -333,7 +341,7 @@ public class FSProjectDAOImpl implements IProjectDAO {
 	 * @see kieker.webgui.persistence.IProjectDAO#getClassLoader(java.lang.String)
 	 */
 	@Override
-	public ClassLoader getClassLoader(final String projectName) throws ProjectNotExistingException, IOException {
+	public ClassLoader getClassLoader(final String projectName, final Object requester) throws ProjectNotExistingException, IOException {
 		// Check whether the project exists
 		if (!this.projectExists(projectName)) {
 			throw new ProjectNotExistingException("A project with the name '" + projectName + "' does not exist.");
@@ -363,7 +371,13 @@ public class FSProjectDAOImpl implements IProjectDAO {
 
 		// Now assemble the URL class loader
 		final PrivilegedClassLoaderAction action = new PrivilegedClassLoaderAction(libs);
-		return AccessController.doPrivileged(action);
+		final CloseableURLClassLoader classLoader = AccessController.doPrivileged(action);
+
+		// Remember the requester
+		this.classLoaders.put(classLoader, new WeakReference<Object>(requester));
+		WeakReferenceMonitor.monitor(requester, this);
+
+		return classLoader;
 	}
 
 	/*
@@ -572,7 +586,7 @@ public class FSProjectDAOImpl implements IProjectDAO {
 	 * @author Nils Christian Ehmke
 	 * @version 1.0
 	 */
-	private static class PrivilegedClassLoaderAction implements PrivilegedAction<URLClassLoader> {
+	private static class PrivilegedClassLoaderAction implements PrivilegedAction<CloseableURLClassLoader> {
 		/**
 		 * The list of libraries used to create the class loader.
 		 */
@@ -594,9 +608,41 @@ public class FSProjectDAOImpl implements IProjectDAO {
 		 * @return The class loader.
 		 */
 		@Override
-		public URLClassLoader run() {
+		public CloseableURLClassLoader run() {
 			// We use "null" as an explicit parent to make sure that the class loader is completely independent from the web gui class loader.
-			return new URLClassLoader(this.libs.toArray(new URL[this.libs.size()]), null);
+			return new CloseableURLClassLoader(this.libs.toArray(new URL[this.libs.size()]), null);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.springframework.util.WeakReferenceMonitor.ReleaseListener#released()
+	 */
+	@Override
+	public void released() {
+		synchronized (this.classLoaders) {
+			int open = 0;
+
+			final List<CloseableURLClassLoader> toBeRemoved = new ArrayList<CloseableURLClassLoader>();
+			// Run through the class loaders and check which of them can be closed
+			for (final Entry<CloseableURLClassLoader, WeakReference<Object>> entry : this.classLoaders.entrySet()) {
+				if (entry.getValue().get() == null) {
+					toBeRemoved.add(entry.getKey());
+				} else {
+					open++;
+				}
+			}
+			for (final CloseableURLClassLoader classLoader : toBeRemoved) {
+				try {
+					classLoader.close();
+					this.classLoaders.remove(classLoader);
+					FSProjectDAOImpl.LOG.info("Closed classloader (" + classLoader + ")");
+				} catch (final IOException ex) {
+					FSProjectDAOImpl.LOG.error("Could not close classloader (" + classLoader + ")");
+				}
+			}
+			FSProjectDAOImpl.LOG.info(open + " classloaders still open.");
 		}
 	}
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b75d894667054f10fecc9548cf747b3857f663c
--- /dev/null
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/util/CloseableURLClassLoader.java
@@ -0,0 +1,73 @@
+/***************************************************************************
+ * 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.persistence.impl.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Collection;
+
+/**
+ * A class loader which extends the {@link URLClassLoader} with a close-method using a hack. This will probably only work for a Sun VM.
+ * 
+ * @author Nils Christian Ehmke
+ */
+public class CloseableURLClassLoader extends URLClassLoader implements Closeable {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see URLClassLoader#URLClassLoader(URL[], ClassLoader)
+	 */
+	public CloseableURLClassLoader(final URL[] urls, final ClassLoader parent) {
+		super(urls, parent);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.io.Closeable#close()
+	 */
+	@Override
+	public void close() throws IOException {
+		try {
+			final Class<URLClassLoader> clazz = URLClassLoader.class;
+			final java.lang.reflect.Field ucp = clazz.getDeclaredField("ucp");
+			ucp.setAccessible(true);
+
+			final Object sun_misc_URLClassPath = ucp.get(this);
+			final java.lang.reflect.Field loaders = sun_misc_URLClassPath.getClass().getDeclaredField("loaders");
+			loaders.setAccessible(true);
+
+			final Object java_util_Collection = loaders.get(sun_misc_URLClassPath);
+			for (final Object sun_misc_URLClassPath_JarLoader : ((Collection<?>) java_util_Collection).toArray()) {
+				try {
+					final java.lang.reflect.Field loader = sun_misc_URLClassPath_JarLoader.getClass().getDeclaredField("jar");
+					loader.setAccessible(true);
+					final Object java_util_jar_JarFile = loader.get(sun_misc_URLClassPath_JarLoader);
+					((java.util.jar.JarFile) java_util_jar_JarFile).close();
+				} catch (final Throwable t) {
+					// if we got this far, this is probably not a JAR loader so skip it
+				}
+			}
+		} catch (final Throwable ex) {
+			// probably not a SUN VM
+			throw new IOException("Not a Sun VM.", ex);
+		}
+	}
+
+}
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java
index 92ca6832c3913d5a03a9096ef755412e49fb9add..e47fae9d0e178e76739b9a5b707df5325659e1bb 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/IProjectService.java
@@ -168,7 +168,7 @@ public interface IProjectService {
 	 * @throws IOException
 	 *             If something went wrong during the initialization of the class loader.
 	 */
-	public ClassLoader getClassLoader(final String projectName) throws ProjectNotExistingException, IOException;
+	public ClassLoader getClassLoader(final String projectName, final Object requester) throws ProjectNotExistingException, IOException;
 
 	/**
 	 * This method lists all available libraries of the given project.
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java
index 9b3b79470afe5df7297637fb3dd8786514da4930..0f81448fc9ee8533579783187f325fadfc29243c 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/ProjectServiceImpl.java
@@ -36,10 +36,10 @@ import kieker.webgui.common.exception.LibraryLoadException;
 import kieker.webgui.common.exception.NewerProjectException;
 import kieker.webgui.common.exception.ProjectAlreadyExistingException;
 import kieker.webgui.common.exception.ProjectNotExistingException;
-import kieker.webgui.common.util.ACManager;
-import kieker.webgui.common.util.PluginFinder;
 import kieker.webgui.persistence.IProjectDAO;
 import kieker.webgui.service.IProjectService;
+import kieker.webgui.service.impl.util.ACManager;
+import kieker.webgui.service.impl.util.PluginFinder;
 
 import org.primefaces.model.UploadedFile;
 
@@ -173,11 +173,11 @@ public final class ProjectServiceImpl implements IProjectService {
 	}
 
 	@Override
-	public ClassLoader getClassLoader(final String projectName) throws ProjectNotExistingException, IOException {
+	public ClassLoader getClassLoader(final String projectName, final Object requester) throws ProjectNotExistingException, IOException {
 		final Object projectLock = this.getLock(projectName, this.fileSystemLocks);
 
 		synchronized (projectLock) {
-			return this.projectDAO.getClassLoader(projectName); // NOPMD (ClassLoader)
+			return this.projectDAO.getClassLoader(projectName, requester); // NOPMD (ClassLoader)
 		}
 	}
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/util/ACManager.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/common/util/ACManager.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java
index 11c315314cb410e3da824647ffc154ed5effa20a..0471b9895cf3d7685f0e3203a80260e120b868ad 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/util/ACManager.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/ACManager.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.common.util;
+package kieker.webgui.service.impl.util;
 
 import java.util.concurrent.ConcurrentHashMap;
 
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/util/Analysis.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/Analysis.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/common/util/Analysis.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/Analysis.java
index 74180ef306d141f8c85ae3f615a218fcd8da9b65..bf72d284ba58ad230aa1b15efe00cb9342111d4b 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/util/Analysis.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/Analysis.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  ***************************************************************************/
 
-package kieker.webgui.common.util;
+package kieker.webgui.service.impl.util;
 
 import java.io.File;
 import java.lang.reflect.InvocationTargetException;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/util/PluginFinder.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/PluginFinder.java
similarity index 99%
rename from Kieker.WebGUI/src/main/java/kieker/webgui/common/util/PluginFinder.java
rename to Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/PluginFinder.java
index 8e414cb19c262ad82e9706a1d60eb4ea92777a13..177c5afb7f0ee66203dbe731d5ee0954333e5c2b 100644
--- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/util/PluginFinder.java
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/PluginFinder.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  ***************************************************************************/
-package kieker.webgui.common.util;
+package kieker.webgui.service.impl.util;
 
 import java.io.IOException;
 import java.net.URL;
diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/package-info.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ee712888aaf6dc7ee3545e92a6d676dfd75e2d6
--- /dev/null
+++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/util/package-info.java
@@ -0,0 +1,20 @@
+/***************************************************************************
+ * 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.service.impl.util;
\ No newline at end of file
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 a612d99579f2e316bce4fb2e1a5d10d93f032d21..4cd740b51d111d333276bd9e0827e9dd3c01ea23 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
@@ -7,13 +7,13 @@
 
     <!-- The singleton scoped beans. -->
     <bean id="projectDAO" class="kieker.webgui.persistence.impl.FSProjectDAOImpl" init-method="initialize"/>
-    <bean id="pluginFinder" class="kieker.webgui.common.util.PluginFinder" />
+    <bean id="pluginFinder" class="kieker.webgui.service.impl.util.PluginFinder" />
     <bean id="projectService" class="kieker.webgui.service.impl.ProjectServiceImpl">
         <property name="projectDAO" ref="projectDAO" />
         <property name="acManager" ref="acManager" />
         <property name="pluginFinder" ref="pluginFinder" />
     </bean>
-    <bean id="acManager" class="kieker.webgui.common.util.ACManager">
+    <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">