Index: /trunk/quest-plugin-core-test/.classpath
===================================================================
--- /trunk/quest-plugin-core-test/.classpath	(revision 511)
+++ /trunk/quest-plugin-core-test/.classpath	(revision 511)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
Index: /trunk/quest-plugin-core-test/.project
===================================================================
--- /trunk/quest-plugin-core-test/.project	(revision 511)
+++ /trunk/quest-plugin-core-test/.project	(revision 511)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>quest-plugin-core-test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/quest-plugin-core-test/pom.xml
===================================================================
--- /trunk/quest-plugin-core-test/pom.xml	(revision 511)
+++ /trunk/quest-plugin-core-test/pom.xml	(revision 511)
@@ -0,0 +1,134 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>de.ugoe.cs.quest</groupId>
+	<artifactId>quest-plugin-core-test</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>quest-plugin-core-test</name>
+	<scm>
+		<url>https://quest.informatik.uni-goettingen.de/svn/quest/trunk/quest-plugin-core-test</url>
+	</scm>
+  <dependencies>
+    <dependency>
+      <groupId>de.ugoe.cs.quest</groupId>
+      <artifactId>quest-plugin-core</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+        <groupId>junit</groupId>
+        <artifactId>junit</artifactId>
+        <version>4.8.1</version>
+        <scope>test</scope>
+    </dependency>
+    <dependency>
+	  <groupId>junit-addons</groupId>
+	  <artifactId>junit-addons</artifactId>
+	  <version>1.4</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <versionRange>[1.0.0,)</versionRange>
+                    <goals>
+                      <goal>unpack</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore/>
+                  </action>
+                </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>emma-maven-plugin</artifactId>
+                    <versionRange>[1.0-alpha-3,)</versionRange>
+                    <goals>
+                      <goal>emma</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore/>
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <version>2.4</version>
+        <executions>
+          <execution>
+            <id>unpack</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>de.ugoe.cs.quest</groupId>
+                  <artifactId>quest-plugin-core</artifactId>
+                  <version>0.0.1-SNAPSHOT</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>emma-maven-plugin</artifactId>
+        <version>1.0-alpha-3</version>
+        <inherited>true</inherited>          
+        <executions>
+          <execution>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>emma</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.3.2</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
Index: /trunk/quest-plugin-core-test/src/test/java/de/ugoe/cs/quest/plugin/PluginLoaderTest.java
===================================================================
--- /trunk/quest-plugin-core-test/src/test/java/de/ugoe/cs/quest/plugin/PluginLoaderTest.java	(revision 511)
+++ /trunk/quest-plugin-core-test/src/test/java/de/ugoe/cs/quest/plugin/PluginLoaderTest.java	(revision 511)
@@ -0,0 +1,158 @@
+package de.ugoe.cs.quest.plugin;
+
+import java.io.File;
+
+import junitx.framework.ArrayAssert;
+
+import org.junit.*;
+import static org.junit.Assert.*;
+
+/**
+ * The class <code>PluginLoaderTest</code> contains tests for the class
+ * <code>{@link PluginLoader}</code>.
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class PluginLoaderTest {
+	
+	@Test
+	public void testPluginLoader_1() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		assertNotNull(loader);
+	}
+	
+	@Test(expected = java.security.InvalidParameterException.class)
+	public void testPluginLoader_2() throws Exception {
+		new PluginLoader(null);
+	}
+	
+	@Test(expected = java.security.InvalidParameterException.class)
+	public void testPluginLoader_3() throws Exception {
+		new PluginLoader(new File("testdata/de.ugoe.cs.quest.plugin.PluginLoaderTest/jfcmonitor.jar"));
+	}
+		
+	@Test
+	public void testCheckNameConformity_1() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-plugin-jfc-1.0.jar";
+		boolean expected = true;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_2() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-plugin-jf-c-1.0.jar";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_3() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-plugin-jfc.jar";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_4() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-plugi-jfc-1.0.jar";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_5() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-pluginjfc-1.0.jar";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_6() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-plugin-jfc-1-0.jar";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_7() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "quest-plugin-jfc-1.0.nojar";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_8() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = null;
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testCheckNameConformity_9() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		String filename = "";
+		boolean expected = false;
+		
+		boolean result = loader.checkNameConformity(filename);
+		
+		assertEquals(expected, result);
+	}
+	
+	@Test
+	public void testGetClassPathFromJar_1() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		File jarFile = new File("testdata/de.ugoe.cs.quest.plugin.PluginLoaderTest/jfcmonitor.jar");
+		
+		String[] expected = new String[]{ "file:" + jarFile.getParentFile().getAbsolutePath()+"/javahelperlib.jar" };
+				
+		String[] result = loader.getClassPathFromJar(jarFile);
+		
+		ArrayAssert.assertEquivalenceArrays(expected, result);
+	}
+	
+	@Test
+	public void testGetClassPathFromJar_2() throws Exception {
+		PluginLoader loader = new PluginLoader(new File("."));
+		File jarFile = new File("testdata/de.ugoe.cs.quest.plugin.PluginLoaderTest/jmi.jar");
+		
+		String[] expected = new String[]{ };
+				
+		String[] result = loader.getClassPathFromJar(jarFile);
+		
+		ArrayAssert.assertEquivalenceArrays(expected, result);
+	}
+
+}
Index: /trunk/quest-plugin-core/.classpath
===================================================================
--- /trunk/quest-plugin-core/.classpath	(revision 511)
+++ /trunk/quest-plugin-core/.classpath	(revision 511)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
Index: /trunk/quest-plugin-core/.project
===================================================================
--- /trunk/quest-plugin-core/.project	(revision 511)
+++ /trunk/quest-plugin-core/.project	(revision 511)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>quest-plugin-core</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/quest-plugin-core/pom.xml
===================================================================
--- /trunk/quest-plugin-core/pom.xml	(revision 511)
+++ /trunk/quest-plugin-core/pom.xml	(revision 511)
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>de.ugoe.cs.quest</groupId>
+	<artifactId>quest-plugin-core</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>quest-plugin-core</name>
+	<scm>
+		<url>https://quest.informatik.uni-goettingen.de/svn/quest/trunk/quest-plugin-core</url>
+	</scm>
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.6</source>
+					<target>1.6</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
Index: /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/PluginLoader.java
===================================================================
--- /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/PluginLoader.java	(revision 511)
+++ /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/PluginLoader.java	(revision 511)
@@ -0,0 +1,234 @@
+package de.ugoe.cs.quest.plugin;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.InvalidParameterException;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+
+/**
+ * <p>
+ * This class provides the functionality to load QUEST plug-ins from a
+ * pre-defined folder.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class PluginLoader {
+
+	/**
+	 * <p>
+	 * Handle of the plug-in directory.
+	 * </p>
+	 */
+	private final File pluginDir;
+
+	/**
+	 * <p>
+	 * Collection of the loaded plug-ins.
+	 * </p>
+	 */
+	private final Collection<QuestPlugin> plugins;
+
+	/**
+	 * <p>
+	 * Constructor. Creates a new PluginLoader that can load plug-ins the
+	 * defined directory.
+	 * </p>
+	 * 
+	 * @param pluginDir
+	 *            handle of the directory; in case the handle is
+	 *            <code>null</code> or does not describe a directory, an
+	 *            {@link InvalidParameterException} is thrown
+	 */
+	public PluginLoader(File pluginDir) {
+		if (pluginDir == null) {
+			throw new InvalidParameterException(
+					"Parameter pluginDir must not be null!");
+		}
+		if (!pluginDir.isDirectory()) {
+			throw new InvalidParameterException("File " + pluginDir.getPath()
+					+ " is not a directory");
+		}
+		this.pluginDir = pluginDir;
+		plugins = new LinkedList<QuestPlugin>();
+	}
+
+	/**
+	 * <p>
+	 * Loads plug-ins from {@link #pluginDir}.
+	 * </p>
+	 * 
+	 * @throws PluginLoaderException
+	 *             thrown if there is a problem loading a plug-in or updating
+	 *             the classpath
+	 */
+	public void load() throws PluginLoaderException {
+		File[] jarFiles = pluginDir.listFiles(new FilenameFilter() {
+			@Override
+			public boolean accept(File dir, String name) {
+				return checkNameConformity(name);
+			}
+		});
+
+		for (File jarFile : jarFiles) {
+			updateClassLoader(jarFile);
+
+			String pluginName = jarFile.getName().split("-")[2];
+			String pluginClassName = "de.ugoe.cs.quest.plugin." + pluginName
+					+ "." + pluginName.toUpperCase() + "Plugin";
+
+			Class<?> pluginClass = null;
+			try {
+				pluginClass = Class.forName(pluginClassName);
+			} catch (ClassNotFoundException e) {
+				throw new PluginLoaderException("No class '" + pluginClassName
+						+ "' found in " + pluginDir + "/" + jarFile.getName());
+			}
+			if (!pluginClass.isInstance(QuestPlugin.class)) {
+				throw new PluginLoaderException("Class " + pluginClassName
+						+ " not instance of QuestPlugin");
+			}
+			try {
+				QuestPlugin pluginObject = (QuestPlugin) pluginClass
+						.newInstance();
+				plugins.add(pluginObject);
+			} catch (InstantiationException e) {
+				throw new PluginLoaderException("Could not instantiate "
+						+ pluginClassName);
+			} catch (IllegalAccessException e) {
+				throw new PluginLoaderException("Could not access "
+						+ pluginClassName);
+			}
+		}
+	}
+
+	/**
+	 * <p>
+	 * Retrieves the classpath from a Jar file's MANIFEST.
+	 * </p>
+	 * 
+	 * @throws IOException
+	 * @throws FileNotFoundException
+	 */
+	protected String[] getClassPathFromJar(File jarFile) {
+		String[] classPath;
+
+		JarInputStream jarInputStream = null;
+		try {
+			jarInputStream = new JarInputStream(new FileInputStream(jarFile));
+		} catch (FileNotFoundException e) {
+			throw new AssertionError(
+					"FileNotFoundException should be impossible!");
+		} catch (IOException e) {
+			throw new PluginLoaderException(e);
+		}
+
+		Manifest manifest = jarInputStream.getManifest();
+
+		String jarClassPath = manifest.getMainAttributes().getValue(
+				"Class-Path");
+
+		if (jarClassPath != null) {
+			String[] jarClassPathElements = jarClassPath.split(" ");
+			classPath = new String[jarClassPathElements.length];
+			for (int i = 0; i < jarClassPathElements.length; i++) {
+				classPath[i] = "file:"
+						+ jarFile.getParentFile().getAbsolutePath() + "/"
+						+ jarClassPathElements[i];
+			}
+			try {
+				jarInputStream.close();
+			} catch (IOException e) {
+				throw new PluginLoaderException(e);
+			}
+		} else {
+			classPath = new String[] {};
+		}
+		return classPath;
+	}
+
+	/**
+	 * <p>
+	 * Updates the classpath of the {@link ClassLoader} to include the plug-in
+	 * jar as well as further libraries required by the plug-in jar as defined
+	 * in the <code>Class-Path</code> section of its manifest.
+	 * </p>
+	 * 
+	 * @param jarFile
+	 *            handle of the plug-in jar file
+	 * @throws PluginLoaderException
+	 *             thrown if there is a problem updating the class loader or
+	 *             loading the plug-in jar
+	 */
+	private void updateClassLoader(File jarFile) throws PluginLoaderException {
+		String[] classPath = getClassPathFromJar(jarFile);
+		URLClassLoader classLoader = (URLClassLoader) ClassLoader
+				.getSystemClassLoader();
+		Method method;
+
+		try {
+			method = URLClassLoader.class.getDeclaredMethod("addURL",
+					new Class[] { URL.class });
+		} catch (SecurityException e) {
+			throw new PluginLoaderException(
+					"addURL method of URLClassLoader not accessible via reflection.");
+		} catch (NoSuchMethodException e) {
+			throw new AssertionError(
+					"URLClassLoader does not have addURL method. Should be impossible!!");
+		}
+		method.setAccessible(true);
+
+		try {
+			method.invoke(
+					classLoader,
+					new Object[] { new URL("file:" + jarFile.getAbsoluteFile()) });
+			for (String element : classPath) {
+				method.invoke(classLoader, new Object[] { new URL(element) });
+			}
+		} catch (IllegalArgumentException e) {
+			throw new AssertionError(
+					"Illegal arguments for addURL method. Should be impossible!!");
+		} catch (MalformedURLException e) {
+			throw new PluginLoaderException(e);
+		} catch (IllegalAccessException e) {
+			throw new PluginLoaderException(
+					"addURL method of URLClassLoader not accessible via reflection.");
+		} catch (InvocationTargetException e) {
+			throw new PluginLoaderException(e);
+		}
+	}
+
+	/**
+	 * <p>
+	 * Checks if the name of a file indicates that it defines a QUEST plug-in.
+	 * The structure of valid plug-in filenames is
+	 * <code>quest-plugin-%PLUGIN_NAME%-version.jar</code>, where
+	 * <code>%PLUGIN_NAME%</code> is replaced by the name of the plug-in. Note
+	 * that plug-in names must not contain any dashes.
+	 * </p>
+	 * 
+	 * @param filename
+	 *            filename that is checked
+	 * @return true if filename matches pattern of QUEST plug-in; false
+	 *         otherwise
+	 */
+	protected boolean checkNameConformity(String filename) {
+		if (filename == null) {
+			return false;
+		}
+		return filename.startsWith("quest-plugin-")
+				&& filename.endsWith(".jar") && filename.split("-").length == 4;
+	}
+}
Index: /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/PluginLoaderException.java
===================================================================
--- /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/PluginLoaderException.java	(revision 511)
+++ /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/PluginLoaderException.java	(revision 511)
@@ -0,0 +1,37 @@
+package de.ugoe.cs.quest.plugin;
+
+/**
+ * <p>
+ * This exception is thrown in case there is an error during the loading of
+ * QUEST plugins. Note that the failures during the loading may result in an
+ * invalid classpath and this exception should, therefore, be treated with
+ * appropriate care.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class PluginLoaderException extends RuntimeException {
+
+	/**
+	 * @see RuntimeException#RuntimeException(String)
+	 */
+	public PluginLoaderException(String msg) {
+		super(msg);
+	}
+	
+	/**
+	 * @see RuntimeException#RuntimeException(Throwable)
+	 */
+	public PluginLoaderException(Throwable throwable) {
+		super(throwable);
+	}
+
+	/**
+	 * <p>
+	 * Id for object serialization.
+	 * </p>
+	 */
+	private static final long serialVersionUID = 1L;
+
+}
Index: /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/QuestPlugin.java
===================================================================
--- /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/QuestPlugin.java	(revision 511)
+++ /trunk/quest-plugin-core/src/main/java/de/ugoe/cs/quest/plugin/QuestPlugin.java	(revision 511)
@@ -0,0 +1,25 @@
+package de.ugoe.cs.quest.plugin;
+
+import java.util.Collection;
+
+/**
+ * <p>Interface for QUEST plug-ins.</p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+interface QuestPlugin {
+	
+	/**
+	 * <p>Title of the plug-in.</p>
+	 * @return
+	 */
+	public String getTitle();
+
+	/**
+	 * <p>Collection of {@link String}s that contain the commands defined by this plug-in.</p>
+	 * <p>Consult the de.ugoe.cs.utils.console package of the java-utils project for more information.</p>
+	 * @return
+	 */
+	public Collection<String> getCommandPackages();
+}
