Index: trunk/autoquest-runner/src/main/assembly/bin.xml
===================================================================
--- trunk/autoquest-runner/src/main/assembly/bin.xml	(revision 920)
+++ trunk/autoquest-runner/src/main/assembly/bin.xml	(revision 922)
@@ -14,5 +14,5 @@
       <includes></includes>
       <excludes>
-        <exclude>de.ugoe.cs.quest:quest-runner</exclude>
+        <exclude>de.ugoe.cs.autoquest:quest-runner</exclude>
       </excludes>
       <outputDirectory>lib</outputDirectory>
@@ -20,5 +20,5 @@
     <dependencySet>
       <includes>
-          <include>de.ugoe.cs.quest:quest-runner</include>
+          <include>de.ugoe.cs.autoquest:quest-runner</include>
       </includes>
       <outputDirectory></outputDirectory>
Index: trunk/autoquest-runner/src/main/java/de/ugoe/cs/autoquest/log4j/Log4JLogger.java
===================================================================
--- trunk/autoquest-runner/src/main/java/de/ugoe/cs/autoquest/log4j/Log4JLogger.java	(revision 922)
+++ trunk/autoquest-runner/src/main/java/de/ugoe/cs/autoquest/log4j/Log4JLogger.java	(revision 922)
@@ -0,0 +1,128 @@
+
+package de.ugoe.cs.autoquest.log4j;
+
+import java.util.logging.Level;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.listener.ICommandListener;
+import de.ugoe.cs.util.console.listener.IErrorListener;
+import de.ugoe.cs.util.console.listener.IExceptionListener;
+import de.ugoe.cs.util.console.listener.ITraceListener;
+
+/**
+ * <p>
+ * Implements logging based on the log4j API.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class Log4JLogger implements IErrorListener, ITraceListener, IExceptionListener,
+    ICommandListener
+{
+
+    /**
+     * <p>
+     * Reference to the logger.
+     * </p>
+     */
+    Logger logger;
+
+    /**
+     * <p>
+     * This is the trace level according to the Java logger API. We use this instead of the log4j
+     * levels themselves for the logging.
+     * </p>
+     */
+    Level traceLevel;
+
+    /**
+     * <p>
+     * Constructor. Creates a new Log4JLogger and registers the implemented listener with the
+     * {@link Console}.
+     * </p>
+     * @param traceLevel tracing level
+     */
+    public Log4JLogger(Level traceLevel) {
+        PropertyConfigurator.configure("data/log4j.properties");
+        logger = Logger.getLogger("de.ugoe.cs.autoquest");
+        logger.setLevel(convertToLog4JLevel(traceLevel));
+        this.traceLevel = traceLevel;
+        Console.getInstance().registerErrorListener(this);
+        Console.getInstance().registerTraceListener(this);
+        Console.getInstance().registerExceptionListener(this);
+        Console.getInstance().registerCommandListener(this);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.listener.ICommandListener#commandNotification (java.lang.String)
+     */
+    @Override
+    public void commandNotification(String command) {
+        logger.info("Command executed: " + command);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.listener.IExceptionListener#printStacktrace(java
+     * .lang.Exception)
+     */
+    @Override
+    public void logException(Exception e) {
+        logger.error("", e);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.listener.ITraceListener#traceMsg(java.lang.String )
+     */
+    @Override
+    public void traceMsg(String traceMessage, Level level) {
+        if( level.intValue()>=traceLevel.intValue()) {
+            logger.log(convertToLog4JLevel(level), traceMessage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.listener.IErrorListener#errorMsg(java.lang.String )
+     */
+    @Override
+    public void errorMsg(String errMessage) {
+        logger.error(errMessage);
+    }
+
+    /**
+     * <p>
+     * Converts the log level described by {@link Level} into a {@link org.apache.log4j.Level}.
+     * </p>
+     * 
+     * @param level
+     *            java.util.logger.Level severity
+     * @return org.apache.log4j.Level severity
+     */
+    private org.apache.log4j.Level convertToLog4JLevel(Level level) {
+        if (level == Level.OFF) {
+            return org.apache.log4j.Level.OFF;
+        }
+        if (level == Level.SEVERE) {
+            return org.apache.log4j.Level.FATAL;
+        }
+        if (level == Level.WARNING) {
+            return org.apache.log4j.Level.WARN;
+        }
+        if (level == Level.INFO || level == Level.CONFIG) {
+            return org.apache.log4j.Level.INFO;
+        }
+        // remaining levels: FINE, FINER, FINEST, ALL
+        return org.apache.log4j.Level.ALL;
+    }
+}
Index: trunk/autoquest-runner/src/main/java/de/ugoe/cs/autoquest/ui/Runner.java
===================================================================
--- trunk/autoquest-runner/src/main/java/de/ugoe/cs/autoquest/ui/Runner.java	(revision 922)
+++ trunk/autoquest-runner/src/main/java/de/ugoe/cs/autoquest/ui/Runner.java	(revision 922)
@@ -0,0 +1,141 @@
+
+package de.ugoe.cs.autoquest.ui;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.logging.Level;
+
+import joptsimple.OptionException;
+import joptsimple.OptionParser;
+import joptsimple.OptionSet;
+import joptsimple.OptionSpec;
+import de.ugoe.cs.autoquest.log4j.Log4JLogger;
+import de.ugoe.cs.autoquest.plugin.PluginLoader;
+import de.ugoe.cs.autoquest.plugin.QuestPlugin;
+import de.ugoe.cs.autoquest.ui.swt.MainWindow;
+import de.ugoe.cs.util.console.CommandExecuter;
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.TextConsole;
+
+/**
+ * <p>
+ * Start-up class of the application.
+ * </p>
+ * <p>
+ * It sets up and starts the {@link Console}.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class Runner {
+
+    public enum UITYPE {
+        text, swt
+    };
+    
+    public enum LEVELENUM {
+        OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL;
+        
+        public Level getLevel() {
+            switch (this)
+            {
+                case OFF:
+                    return Level.OFF;
+                case SEVERE:
+                    return Level.SEVERE;
+                case ALL:
+                    return Level.ALL;
+                case CONFIG:
+                    return Level.CONFIG;
+                case FINE:
+                    return Level.FINE;
+                case FINER:
+                    return Level.FINER;
+                case FINEST:
+                    return Level.FINEST;
+                case INFO:
+                    return Level.INFO;
+                case WARNING:
+                    return Level.WARNING;
+                default:
+                    throw new AssertionError("reached source code that should be unreachable");
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Main method of the application.
+     * </p>
+     * 
+     * @param args
+     *            if parameters are defined, they are interpreted as commands for the
+     *            {@link Console} and executed before the user can use the console; can be used to
+     *            perform batch operations
+     */
+    public static void main(String[] args) {
+        
+        CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.autoquest.commands.misc");
+        CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.autoquest.commands.sequences");
+        CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.autoquest.commands.usability");
+        CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.autoquest.commands.usage");
+        CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.autoquest.ui.swt.commands");
+
+        PluginLoader pluginLoader = new PluginLoader(new File("lib"));
+        pluginLoader.load();
+
+        for (QuestPlugin plugin : pluginLoader.getPlugins()) {
+            for (String commandPackage : plugin.getCommandPackages()) {
+                CommandExecuter.getInstance().addCommandPackage(commandPackage);
+            }
+        }
+
+        OptionParser parser = new OptionParser();
+        OptionSpec<LEVELENUM> log4j =
+            parser.accepts("log4j", "Allowed values: OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL").withRequiredArg()
+                .ofType(LEVELENUM.class).defaultsTo(LEVELENUM.INFO);
+        OptionSpec<UITYPE> ui =
+            parser.accepts("ui", "Allowed values: text, swt").withRequiredArg()
+                .ofType(UITYPE.class).defaultsTo(UITYPE.text);
+        OptionSpec<LEVELENUM> trace =
+            parser.accepts("trace", "Allowed values: OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL").withRequiredArg()
+                .ofType(LEVELENUM.class).defaultsTo(LEVELENUM.WARNING);
+        OptionSet options = parser.parse(args);
+
+        List<String> startupCommands = options.nonOptionArguments();
+        try {
+            if(options.valueOf(log4j)!=LEVELENUM.OFF) {
+                new Log4JLogger(options.valueOf(log4j).getLevel());
+            }
+
+            switch (options.valueOf(ui))
+            {
+                case text:
+                    TextConsole textConsole = new TextConsole(options.valueOf(trace).getLevel());
+                    for (String command : startupCommands) {
+                        CommandExecuter.getInstance().exec(command);
+                    }
+                    textConsole.run();
+                    break;
+                case swt:
+                    MainWindow mainWindow = new MainWindow(startupCommands, options.valueOf(trace).getLevel());
+                    mainWindow.open();
+                    break;
+                default:
+                    throw new AssertionError("reached source code that should be unreachable");
+            }
+        }
+        catch (OptionException e) {
+            System.err.println("Invalid Parameters: " + e.getMessage());
+            try {
+                parser.printHelpOn(System.out);
+            }
+            catch (IOException e1) {
+                // ignore exception.
+            }
+        }
+    }
+
+}
