Index: /trunk/autoquest-plugin-jfc/.classpath
===================================================================
--- /trunk/autoquest-plugin-jfc/.classpath	(revision 906)
+++ /trunk/autoquest-plugin-jfc/.classpath	(revision 906)
@@ -0,0 +1,27 @@
+<?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 including="**/*.java" kind="src" path="src/main/resources"/>
+	<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/autoquest-plugin-jfc/.project
===================================================================
--- /trunk/autoquest-plugin-jfc/.project	(revision 906)
+++ /trunk/autoquest-plugin-jfc/.project	(revision 906)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>quest-plugin-jfc</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/autoquest-plugin-jfc/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /trunk/autoquest-plugin-jfc/.settings/org.eclipse.jdt.core.prefs	(revision 906)
+++ /trunk/autoquest-plugin-jfc/.settings/org.eclipse.jdt.core.prefs	(revision 906)
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
Index: /trunk/autoquest-plugin-jfc/.settings/org.eclipse.m2e.core.prefs
===================================================================
--- /trunk/autoquest-plugin-jfc/.settings/org.eclipse.m2e.core.prefs	(revision 906)
+++ /trunk/autoquest-plugin-jfc/.settings/org.eclipse.m2e.core.prefs	(revision 906)
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
Index: /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-argouml.txt
===================================================================
--- /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-argouml.txt	(revision 906)
+++ /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-argouml.txt	(revision 906)
@@ -0,0 +1,43 @@
+org.argouml.cognitive.checklist.ui.TabChecklist = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.cognitive.ui.TabToDo = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.cognitive.ui.WizDescription = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.core.propertypanels.ui.LabelledComponent = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.core.propertypanels.ui.OldScrollList = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCScrollPane
+org.argouml.core.propertypanels.ui.ScrollListImpl = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCScrollPane
+org.argouml.core.propertypanels.ui.UMLComboBox = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCComboBox
+org.argouml.core.propertypanels.ui.UMLEditableComboBox$UMLComboBoxEditor$UMLImagePanel = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.core.propertypanels.ui.UMLExpressionBodyField = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+org.argouml.core.propertypanels.ui.UMLExpressionLanguageField = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+org.argouml.core.propertypanels.ui.UMLLinkedList = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCListBox
+org.argouml.core.propertypanels.ui.UMLMultiplicityPanel$MultiplicityCheckBox = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCCheckBox
+org.argouml.core.propertypanels.ui.UMLMutableLinkedList = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCListBox
+org.argouml.core.propertypanels.ui.UMLTextField = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+org.argouml.ui.ArgoJMenu = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+org.argouml.ui.DetailsPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.ui.HelpBox = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
+org.argouml.ui.MenuBar14 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenuBar
+org.argouml.ui.MultiEditorPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.ui.NavigatorPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.ui.ProjectBrowser = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCFrame
+org.argouml.ui.SettingsDialog = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
+org.argouml.ui.explorer.DnDExplorerTree = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTree
+org.argouml.ui.explorer.PerspectiveComboBox = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCComboBox
+org.argouml.uml.diagram.ui.DnDJGraph = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCCanvas
+org.argouml.uml.diagram.ui.TabDiagram = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.uml.ui.TabDocumentation = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.uml.ui.TabStereotype = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.uml.ui.TabTaggedValues = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.uml.ui.UMLComboBox2 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCComboBox
+org.argouml.uml.ui.UMLEditableComboBox$UMLComboBoxEditor$UMLImagePanel = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+org.argouml.uml.ui.UMLLinkedList = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCListBox
+org.argouml.uml.ui.UMLTextArea2 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextArea
+org.tigris.gef.graph.presentation.JGraphInternalPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCCanvas
+org.tigris.gef.presentation.FigTextEditor = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+org.tigris.swidgets.ArrowButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCButton
+org.tigris.swidgets.BorderSplitPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCSplitPane
+org.tigris.swidgets.MultipleSplitPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCSplitPane
+org.tigris.swidgets.Splitter = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCSplitPane
+org.tigris.toolbar.ToolBar = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCToolBar
+org.tigris.toolbar.toolbutton.ModalButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCButton
+org.tigris.toolbar.toolbutton.PopupToolBoxButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenuButton
+org.argouml.core.propertypanels.ui.UMLExpressionLanguageField = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
Index: /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-freemind.txt
===================================================================
--- /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-freemind.txt	(revision 906)
+++ /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-freemind.txt	(revision 906)
@@ -0,0 +1,10 @@
+freemind.main.FreeMind = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCFrame
+freemind.controller.MainToolBar = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCToolBar
+freemind.modes.mindmapmode.MindMapToolBar = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCToolBar
+freemind.view.mindmapview.MapView$ScrollPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCScrollPane
+freemind.view.mindmapview.MapView = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCCanvas
+freemind.view.mindmapview.NodeView = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCShape
+freemind.view.mindmapview.RootMainView = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCShape
+freemind.controller.MenuBar = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenuBar
+freemind.view.mindmapview.ForkMainView = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCShape
+freemind.modes.FreeMindJFileDialog = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
Index: /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-swing.txt
===================================================================
--- /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-swing.txt	(revision 906)
+++ /trunk/autoquest-plugin-jfc/data/guimappings/guimapping-swing.txt	(revision 906)
@@ -0,0 +1,34 @@
+javax.swing.JButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCButton
+javax.swing.JComboBox = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCComboBox
+javax.swing.JDialog = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
+javax.swing.JEditorPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextArea
+javax.swing.JFileChooser = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
+javax.swing.JLayeredPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+javax.swing.JMenu = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+javax.swing.JMenu$1 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+javax.swing.JMenuItem = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+javax.swing.JOptionPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
+javax.swing.JPanel = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+javax.swing.JPopupMenu = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+javax.swing.JPopupMenu$1 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+javax.swing.JRadioButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCRadioButton
+javax.swing.JRootPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+javax.swing.JScrollPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCScrollPane
+javax.swing.JScrollPane$ScrollBar = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCScrollBar
+javax.swing.JSplitPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCSplitPane
+javax.swing.JTabbedPane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTabbedPane
+javax.swing.JTable = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTable
+javax.swing.JTextArea = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextArea
+javax.swing.JTextField = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+javax.swing.JToolBar$1 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCToolBar
+javax.swing.JViewport = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+javax.swing.Popup$HeavyWeightWindow = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCDialog
+javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+javax.swing.plaf.basic.BasicComboPopup$1 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu
+javax.swing.plaf.metal.MetalComboBoxButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCButton
+javax.swing.plaf.metal.MetalFileChooserUI$1 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+javax.swing.plaf.metal.MetalFileChooserUI$3 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCTextField
+javax.swing.plaf.metal.MetalScrollButton = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCScrollBar
+sun.swing.FilePane = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+sun.swing.FilePane$3 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
+sun.swing.FilePane$4 = de.ugoe.cs.quest.plugin.jfc.guimodel.JFCPanel
Index: /trunk/autoquest-plugin-jfc/pom.xml
===================================================================
--- /trunk/autoquest-plugin-jfc/pom.xml	(revision 906)
+++ /trunk/autoquest-plugin-jfc/pom.xml	(revision 906)
@@ -0,0 +1,63 @@
+<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">
+    <parent>
+        <groupId>de.ugoe.cs.quest</groupId>
+        <artifactId>quest</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>quest-plugin-jfc</artifactId>
+	<name>quest-plugin-jfc</name>
+	<scm>
+		<url>${quest-scm-trunk-dir}/quest-plugin-jfc</url>
+	</scm>
+	<dependencies>
+		<dependency>
+			<groupId>de.ugoe.cs</groupId>
+			<artifactId>java-utils</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>de.ugoe.cs.quest</groupId>
+			<artifactId>quest-plugin-core</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>de.ugoe.cs.quest</groupId>
+			<artifactId>quest-core-events</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>de.ugoe.cs.quest</groupId>
+			<artifactId>quest-misc</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sourceforge.collections</groupId>
+			<artifactId>collections-generic</artifactId>
+			<version>4.01</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.2-beta-2</version>
+				<configuration>
+					<descriptors>
+						<descriptor>src/main/assembly/config.xml</descriptor>
+					</descriptors>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
Index: /trunk/autoquest-plugin-jfc/src/main/assembly/config.xml
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/assembly/config.xml	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/assembly/config.xml	(revision 906)
@@ -0,0 +1,19 @@
+<assembly
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+  <id>config</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <fileSets>
+    <fileSet>
+      <directory>data</directory>
+      <outputDirectory></outputDirectory>
+      <includes>
+        <include>**/*</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+</assembly>
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCLogParser.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCLogParser.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCLogParser.java	(revision 906)
@@ -0,0 +1,704 @@
+package de.ugoe.cs.quest.plugin.jfc;
+
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.gui.IInteraction;
+import de.ugoe.cs.quest.eventcore.gui.KeyPressed;
+import de.ugoe.cs.quest.eventcore.gui.KeyReleased;
+import de.ugoe.cs.quest.eventcore.gui.KeyboardFocusChange;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonDown;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonInteraction;
+import de.ugoe.cs.quest.eventcore.gui.MouseButtonUp;
+import de.ugoe.cs.quest.eventcore.gui.MouseClick;
+import de.ugoe.cs.quest.eventcore.guimodel.GUIElementFactory;
+import de.ugoe.cs.quest.eventcore.guimodel.GUIModel;
+import de.ugoe.cs.quest.eventcore.guimodel.GUIModelException;
+import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.quest.plugin.jfc.eventcore.JFCEventId;
+import de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElementSpec;
+import de.ugoe.cs.tasktree.keyboardmaps.VirtualKey;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * This class provides functionality to parse XML log files generated by the JFCMonitor of
+ * EventBench. The result of parsing a file is a collection of event sequences.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class JFCLogParser extends DefaultHandler {
+
+    /**
+     * <p>
+     * Collection of event sequences that is contained in the log file, which is parsed.
+     * </p>
+     */
+    private Collection<List<Event>> sequences;
+
+    /**
+     * <p>
+     * Internal handle to the id of the event that is currently being parsed.
+     * </p>
+     */
+    private JFCEventId currentEventId;
+    
+    /**
+     * <p>
+     * Internal handle to the parameters of the event that is currently being parsed.
+     * </p>
+     */
+    private Map<String, String> currentEventParameters;
+
+    /**
+     * <p>
+     * Internal handle to the source parameters of the event that is currently being parsed.
+     * </p>
+     */
+    private Map<String, String> currentSourceParameters;
+
+    /**
+     * <p>
+     * Internal handle to the event sequence that is currently being parsed.
+     * </p>
+     */
+    private List<Event> currentSequence;
+   
+    /**
+     * <p>
+     * internal handle to the parameters currently parsed for a component
+     * </p>
+     */
+    private JFCGUIElementSpec currentGuiElementSpec;
+
+    /**
+     * <p>
+     * internal handle to the last parsed component
+     * </p>
+     */
+    private List<JFCGUIElementSpec> currentGuiElementPath = new ArrayList<JFCGUIElementSpec>();
+
+    /**
+     * <p>
+     * internal handle to the component of the previous event to be potentially reused for the
+     * current
+     * </p>
+     */
+    private IGUIElement lastGUIElement;
+
+    /**
+     * <p>
+     * the model of the GUI elements, that were found during parsing
+     * </p>
+     */
+    private GUIModel guiModel = new GUIModel();
+
+    /**
+     * <p>
+     * this is used to check, if for every pressed key, there is a release of it
+     * </p>
+     */
+    private List<VirtualKey> mPressedKeys = new ArrayList<VirtualKey>();
+
+    /**
+     * <p>
+     * Enumeration to differentiate if a parameter belongs to an event, a source or the parent of a
+     * source.
+     * </p>
+     * 
+     * @author Steffen Herbold
+     * @version 1.0
+     */
+    private enum ParamSource {
+        EVENT, SOURCE, PARENT, COMPONENT
+    };
+
+    /**
+     * <p>
+     * Specifies whether the parameters that are currently being read belong the the event, the
+     * source or the parent.
+     * </p>
+     */
+    private ParamSource paramSource = null;
+
+    /**
+     * <p>
+     * a specification for event ids to be omitted by the parser
+     * </p>
+     */
+    private Collection<JFCEventId> eventFilter;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCLogParser with a default event filter. This ignores focus
+     * events, mouse pressed, and mouse released events.
+     * </p>
+     */
+    public JFCLogParser() {
+        sequences = new LinkedList<List<Event>>();
+        currentSequence = null;
+        //setupDefaultEventFilter();
+    }
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCLogParser with a specific event filter. The events in the
+     * provided collection are ignored by the parser. As events, the constants of the different
+     * event classes must be used. E.g. creating a collection and putting
+     * <code>MouseEvent.MOUSE_PRESSED</code> will cause the parser to ignore all mouse pressed
+     * events. If the provided collection is null, no event is ignored.
+     * </p>
+     * 
+     * @param ignoredEvents
+     *            the events to be ignored by the parser, can be null
+     */
+    public JFCLogParser(Collection<JFCEventId> ignoredEvents) {
+        sequences = new LinkedList<List<Event>>();
+        currentSequence = null;
+        eventFilter = ignoredEvents;
+    }
+
+    /**
+     * <p>
+     * Parses a log file written by the JFCMonitor and creates a collection of event sequences.
+     * </p>
+     * 
+     * @param filename
+     *            name and path of the log file
+     */
+    public void parseFile(String filename) {
+        if (filename == null) {
+            throw new IllegalArgumentException("filename must not be null");
+        }
+
+        parseFile(new File(filename));
+    }
+
+    /**
+     * <p>
+     * Parses a log file written by the JFCMonitor and creates a collection of event sequences.
+     * </p>
+     * 
+     * @param file
+     *            name and path of the log file
+     */
+    public void parseFile(File file) {
+        if (file == null) {
+            throw new IllegalArgumentException("file must not be null");
+        }
+
+        SAXParserFactory spf = SAXParserFactory.newInstance();
+        spf.setValidating(true);
+
+        SAXParser saxParser = null;
+        InputSource inputSource = null;
+        try {
+            saxParser = spf.newSAXParser();
+            inputSource =
+                new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+        }
+        catch (UnsupportedEncodingException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return;
+        }
+        catch (ParserConfigurationException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return;
+        }
+        catch (SAXException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return;
+        }
+        catch (FileNotFoundException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return;
+        }
+        if (inputSource != null) {
+            inputSource.setSystemId("file://" + file.getAbsolutePath());
+            try {
+                if (saxParser == null) {
+                    throw new RuntimeException("SAXParser creation failed");
+                }
+                saxParser.parse(inputSource, this);
+            }
+            catch (SAXParseException e) {
+                Console.printerrln("Failure parsing file in line " + e.getLineNumber() +
+                    ", column " + e.getColumnNumber() + ".");
+                Console.logException(e);
+                return;
+            }
+            catch (SAXException e) {
+                Console.printerr("Error parsing file + " + file.getName());
+                Console.logException(e);
+                return;
+            }
+            catch (IOException e) {
+                Console.printerr("Error parsing file + " + file.getName());
+                Console.logException(e);
+                return;
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Returns the collection of event sequences that is obtained from parsing log files.
+     * </p>
+     * 
+     * @return collection of event sequences
+     */
+    public Collection<List<Event>> getSequences() {
+        return sequences;
+    }
+
+    /**
+     * <p>
+     * Returns the gui model that is obtained from parsing log files.
+     * </p>
+     * 
+     * @return collection of event sequences
+     */
+    public GUIModel getGuiModel() {
+        return guiModel;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String,
+     * java.lang.String, org.xml.sax.Attributes)
+     */
+    public void startElement(String uri, String localName, String qName, Attributes atts)
+        throws SAXException
+    {
+        if (qName.equals("sessions")) {
+            currentSequence = new LinkedList<Event>();
+        }
+        if (qName.equals("newsession")) {
+            Console.traceln(Level.FINE, "start of session");
+            if (currentSequence != null && !currentSequence.isEmpty()) {
+                // create a copy of the list just to have a correctly typed one.
+                sequences.add(currentSequence.subList(0, currentSequence.size() - 1));
+            }
+            currentSequence = new LinkedList<Event>();
+        }
+        else if (qName.equals("event")) {
+            JFCEventId eventId = JFCEventId.parseEventId(atts.getValue("id"));
+            if ((eventFilter == null) || (!eventFilter.contains(eventId))) {
+                currentEventId = eventId;
+                currentEventParameters = new HashMap<String, String>();
+                currentSourceParameters = new HashMap<String, String>();
+                paramSource = ParamSource.EVENT;
+            }
+        }
+        else if (currentEventId != null) {
+            if (qName.equals("param")) {
+                if (paramSource == ParamSource.EVENT) {
+                    currentEventParameters.put(atts.getValue("name"), atts.getValue("value"));
+                }
+                else if (paramSource == ParamSource.SOURCE) {
+                    currentSourceParameters.put(atts.getValue("name"), atts.getValue("value"));
+                }
+                else if (paramSource == ParamSource.COMPONENT) {
+                    if ("title".equals(atts.getValue("name"))) {
+                        currentGuiElementSpec.setName(atts.getValue("value"));
+                    }
+                    else if ("class".equals(atts.getValue("name"))) {
+                        currentGuiElementSpec.setType(atts.getValue("value"));
+                    }
+                    else if ("icon".equals(atts.getValue("name"))) {
+                        currentGuiElementSpec.setIcon(atts.getValue("value"));
+                    }
+                    else if ("index".equals(atts.getValue("name"))) {
+                        currentGuiElementSpec.setIndex(Integer.parseInt(atts.getValue("value")));
+                    }
+                    else if ("hash".equals(atts.getValue("name"))) {
+                        currentGuiElementSpec.setElementHash
+                            ((int) Long.parseLong(atts.getValue("value"), 16));
+                    }
+                }
+            }
+            else if (qName.equals("source")) {
+                paramSource = ParamSource.SOURCE;
+            }
+            else if (qName.equals("parent")) {
+                paramSource = ParamSource.PARENT;
+            }
+            else if (qName.equals("component")) {
+                paramSource = ParamSource.COMPONENT;
+                currentGuiElementSpec = new JFCGUIElementSpec();
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String,
+     * java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        if (qName.equals("sessions")) {
+            if (currentSequence != null && !currentSequence.isEmpty()) {
+                sequences.add(currentSequence);
+            }
+            currentSequence = null;
+        }
+        else if (currentEventId != null) {
+            if (qName.equals("event")) {
+                
+                if (currentGuiElementPath.size() <= 0)
+                {
+                    // no component specification available. Try to parse the GUI element from
+                    // the toString parameter
+                    currentGuiElementSpec = new JFCGUIElementSpec();
+                    getGUIElementSpecFromToString(currentSourceParameters.get("toString"));
+                    currentGuiElementPath.add(currentGuiElementSpec);
+                    currentGuiElementSpec = null;
+                }
+                
+                IGUIElement currentGUIElement;
+                try {
+                    currentGUIElement = guiModel.integratePath
+                        (currentGuiElementPath, GUIElementFactory.getInstance());
+                }
+                catch (GUIModelException e) {
+                    throw new SAXException("error in the GUI model provided in the log", e);
+                }
+                
+                Event event = new Event
+                    (instantiateInteraction(currentEventId, currentEventParameters),
+                     (currentGUIElement == null ? lastGUIElement : currentGUIElement));
+                
+                currentSequence.add(event);
+                
+                currentEventParameters = null;
+                currentSourceParameters = null;
+                currentGuiElementSpec = null;
+                currentGuiElementPath.clear();
+                
+                currentEventId = null;
+                
+                if (currentGUIElement != null) {
+                    lastGUIElement = currentGUIElement;
+                }
+                
+                currentGUIElement = null;
+            }
+            else if (qName.equals("source")) {
+                paramSource = ParamSource.EVENT;
+            }
+            else if (qName.equals("parent")) {
+                paramSource = ParamSource.SOURCE;
+            }
+            else if (qName.equals("component")) {
+                paramSource.equals(ParamSource.SOURCE);
+                currentGuiElementPath.add(currentGuiElementSpec);
+                currentGuiElementSpec = null;
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * depending on the event id and the event parameters, this method instantiates the concrete
+     * interaction, that took place, i.e. the event type
+     * </p>
+     *
+     * @param eventId
+     *            the id of the event
+     * @param eventParameters
+     *            the parameters provided for the event
+     *            
+     * @return as described
+     * 
+     * @throws SAXException thrown if the provided event id is unknown
+     */
+    private IInteraction instantiateInteraction(JFCEventId          eventId,
+                                                Map<String, String> eventParameters)
+      throws SAXException
+    {
+        switch (eventId)
+        {
+            case FOCUS_GAINED:
+                return handleNewFocus(eventId, eventParameters);
+
+            case KEY_PRESSED:
+            case KEY_RELEASED:
+            case KEY_TYPED:
+                return handleKeyAction(eventId, eventParameters);
+
+            case MOUSE_CLICKED:
+            case MOUSE_PRESSED:
+            case MOUSE_RELEASED:
+            case MOUSE_MOVED:
+            case MOUSE_ENTERED:
+            case MOUSE_EXITED:
+            case MOUSE_DRAGGED:
+            case MOUSE_WHEEL:
+                return handleMouseAction(eventId, eventParameters);
+
+            default:
+                throw new SAXException("unhandled event id " + eventId);
+        }
+    }
+
+    /**
+     * <p>
+     * handles a mouse interaction. The method determines based on the event id and the parameters
+     * which mouse button is pressed, released or clicked.
+     * </p>
+     *
+     * @param eventId
+     *            the id of the event
+     * @param eventParameters
+     *            the parameters provided for the event
+     *            
+     * @return as described
+     * 
+     * @throws SAXException thrown if the provided event id or button index is unknown
+     */
+    private IInteraction handleMouseAction(JFCEventId eventId, Map<String, String> eventParameters)
+        throws SAXException
+    {
+        MouseButtonInteraction.Button button = null;
+
+        if (eventParameters.get("Button") != null)
+        {
+            int buttonId = Integer.parseInt(eventParameters.get("Button"));
+            if (buttonId == MouseEvent.BUTTON1)
+            {
+                button = MouseButtonInteraction.Button.LEFT;
+            }
+            else if (buttonId == MouseEvent.BUTTON2)
+            {
+                button = MouseButtonInteraction.Button.MIDDLE;
+            }
+            else if (buttonId == MouseEvent.BUTTON3)
+            {
+                button = MouseButtonInteraction.Button.RIGHT;
+            }
+            else
+            {
+                throw new SAXException("unknown mouse button index " + buttonId);
+            }
+        }
+
+        if (JFCEventId.MOUSE_CLICKED == eventId)
+        {
+            return new MouseClick(button);
+        }
+        else if (JFCEventId.MOUSE_PRESSED == eventId)
+        {
+            return new MouseButtonDown(button);
+        }
+        else if (JFCEventId.MOUSE_RELEASED == eventId)
+        {
+            return new MouseButtonUp(button);
+        }
+        else
+        {
+            throw new SAXException("unknown event id " + eventId);
+        }
+    }
+
+    /**
+     * <p>
+     * handles a keyboard interaction. The method determines based on the event id and the
+     * parameters which key on the keyboard is pressed or released. It further checks, if for 
+     * every released key there is also a pressed event
+     * </p>
+     *
+     * @param eventId
+     *            the id of the event
+     * @param eventParameters
+     *            the parameters provided for the event
+     *            
+     * @return as described
+     * 
+     * @throws SAXException thrown if the provided event id is unknown or if there is a key
+     *                      release without a preceding press of the same key
+     */
+    private IInteraction handleKeyAction(JFCEventId eventId, Map<String, String> eventParameters)
+      throws SAXException
+    {
+        // TODO handle shortcuts
+        if (JFCEventId.KEY_PRESSED == eventId)
+        {
+            VirtualKey key = VirtualKey.parseVirtualKey(eventParameters.get("KeyCode"));
+            mPressedKeys.add(key);
+
+            return new KeyPressed(key);
+        }
+        else if (JFCEventId.KEY_RELEASED == eventId)
+        {
+            VirtualKey key = VirtualKey.parseVirtualKey(eventParameters.get("KeyCode"));
+            if (mPressedKeys.contains(key))
+            {
+                mPressedKeys.remove(key);
+            }
+            else
+            {
+                Console.traceln(Level.SEVERE, "log file has an error, as it contains a key up event on key " +
+                                   key + " for which there is no preceeding key down event");
+            }
+
+            return new KeyReleased(key);
+        }
+
+        throw new SAXException("unknown event id " + eventId);
+    }
+
+    /**
+     * <p>
+     * handles explicit keyboard focus changes.
+     * </p>
+     *
+     * @param eventId
+     *            the id of the event
+     * @param eventParameters
+     *            the parameters provided for the event
+     *            
+     * @return as described
+     * 
+     * @throws SAXException thrown if the provided event id is unknown
+     */
+    private IInteraction handleNewFocus(JFCEventId eventId, Map<String, String> eventParameters)
+        throws SAXException
+    {
+        if (JFCEventId.FOCUS_GAINED == eventId)
+        {
+            return new KeyboardFocusChange();
+        }
+        else
+        {
+            throw new SAXException("unknown event id " + eventId);
+        }
+    }
+
+    /**
+     * <p>
+     * for some events in the log file, no component specification is provided. In this case the
+     * GUI element on which the event is executed must be determined based on the
+     * <code>toString</code> parameter of the event. This is achieved through this method. The
+     * <code>toString</code> parameter does not always carry sufficient information for the GUI
+     * elements. For example the title is not necessarily provided. Therefore some of this
+     * information is generated.
+     * </p>
+     *
+     * @param toStringValue
+     *            the <code>toString</code> parameter of the event to be parsed for the GUI element
+     *            
+     * @return the appropriate GUI Element
+     * 
+     * @throws SAXException thrown if the provided value of the <code>toString</code> parameter
+     *                      can not be parsed
+     */
+    private void getGUIElementSpecFromToString(String toStringValue)
+        throws SAXException
+    {
+        try
+        {
+            // match the following: <type>[<parameters>]
+            String pattern = "([\\w$\\.]*)\\[(.*)\\]";
+            Matcher matcher = Pattern.compile(pattern).matcher(toStringValue);
+
+            if (!matcher.find())
+            {
+                throw new IllegalArgumentException
+                    ("could not parse target from toString parameter");
+            }
+
+            String type = matcher.group(1);
+            
+            // match the following: <parameter>|,
+            // where <parameter> := <digitValue>|<value>|<key>"="<value>
+            pattern = "([\\w$@=\\.]*)|,";
+
+            matcher = Pattern.compile(pattern).matcher(matcher.group(2));
+            
+            float elementHash = -1;
+            
+            pattern = "(([\\d]*)|([\\w$]*)|(([\\w$@\\.]*)=([\\w$@\\.]*)))\\z";
+            Pattern valuePattern = Pattern.compile(pattern);
+            
+            while (matcher.find()) {
+                Matcher valueMatcher = valuePattern.matcher(matcher.group(1));
+                if (valueMatcher.find()) {
+                    if ((valueMatcher.group(2) != null) && (!"".equals(valueMatcher.group(2)))) {
+                        // found digit value. Those in combination usually denote the position
+                        // of the GUI element. So calculate an element has out of them
+                        elementHash += Integer.parseInt(valueMatcher.group(2));
+                    }
+                    else if ((valueMatcher.group(5) != null) &&
+                             (!"".equals(valueMatcher.group(5))) &&
+                             (valueMatcher.group(6) != null) &&
+                             (!"".equals(valueMatcher.group(6))))
+                    {
+                        // found a key value pair. Get some of them and integrate them into the hash 
+                        String key = valueMatcher.group(5);
+                        
+                        if ("alignmentX".equals(key) || "alignmentY".equals(key)) {
+                            elementHash += Float.parseFloat(valueMatcher.group(6));
+                        }
+                    }
+                }
+            }
+
+            currentGuiElementSpec.setName("unknown(" + ((int) elementHash) + ")");
+            currentGuiElementSpec.setType(type);
+            currentGuiElementSpec.setIndex(-1);
+            currentGuiElementSpec.setElementHash((int) elementHash);
+        }
+        catch (Exception e)
+        {
+            throw new SAXException("could not parse target", e);
+        }
+    }
+    
+    /**
+     * <p>
+     * creates a default event filter that ignores focus changes, mouse pressed and mouse released
+     * events.
+     * </p>
+     */
+    /*private void setupDefaultEventFilter() {
+        eventFilter = new HashSet<JFCEventId>();
+        eventFilter.add(JFCEventId.MOUSE_PRESSED);
+        eventFilter.add(JFCEventId.MOUSE_RELEASED);
+        eventFilter.add(JFCEventId.FOCUS_GAINED);
+    }*/
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCPlugin.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCPlugin.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCPlugin.java	(revision 906)
@@ -0,0 +1,47 @@
+package de.ugoe.cs.quest.plugin.jfc;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import de.ugoe.cs.quest.plugin.QuestPlugin;
+
+/**
+ * <p>
+ * Identifier class for the QUEST JFC plug-in.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class JFCPlugin implements QuestPlugin {
+
+    /**
+     * <p>
+     * The command packages of this plug-in.
+     * </p>
+     */
+    private final static String[] commandPackages = new String[]
+        { "de.ugoe.cs.quest.plugin.jfc.commands" };
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.QuestPlugin#getTitle()
+     */
+    @Override
+    public String getTitle() {
+        return "JFC-Plugin";
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.QuestPlugin#getCommandPackages()
+     */
+    @Override
+    public List<String> getCommandPackages() {
+        return Collections.unmodifiableList(Arrays.asList(commandPackages));
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCReplayIDCalculator.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCReplayIDCalculator.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCReplayIDCalculator.java	(revision 906)
@@ -0,0 +1,283 @@
+package de.ugoe.cs.quest.plugin.jfc;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.IEventTarget;
+import de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement;
+import de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElementSpec;
+
+
+/**
+ * <p>
+ * This class provides the functionality to calculate the unique GUITAR replayIDs
+ * for {@link JFCEvent}s. This code is mainly based on guitar source code: edu.umd.cs.guitar.
+ * model.JFCDefaultIDGeneratorSimple
+ *    
+ * </p>
+ * @author fabian.glaser
+ *
+ */
+
+public class JFCReplayIDCalculator {
+	
+	static final int prime = 31;
+	private JFCReplayIDValidator validator;
+	
+	public JFCReplayIDCalculator() {
+		this.validator = null;
+	}
+	
+	public JFCReplayIDCalculator(JFCReplayIDValidator validator){
+		this.validator = validator;
+	}
+	
+	/**
+	 * Properties that are used to identify widgets
+	 */
+	private static List<String> ID_PROPERTIES = Arrays.asList(
+			"Class","Title","Icon");
+	
+   /**
+    * Those classes are invisible widgets but cause false-positive when
+    * calculating ID (compare guitar source code: edu.umd.cs.guitar.
+    * model.JFCDefaultIDGeneratorSimple)
+    */
+   private static List<String> IGNORED_CLASSES = Arrays.asList("javax.swing.JPanel",
+         "javax.swing.JTabbedPane", "javax.swing.JScrollPane",
+         "javax.swing.JSplitPane", "javax.swing.Box",
+         "javax.swing.JViewport", "javax.swing.JScrollBar",
+         "javax.swing.JLayeredPane",
+         "javax.swing.JList$AccessibleJList$AccessibleJListChild",
+         "javax.swing.JList$AccessibleJList", "javax.swing.JList",
+         "javax.swing.JScrollPane$ScrollBar",
+         "javax.swing.plaf.metal.MetalScrollButton");
+   
+   /**
+    * Calculates the replayID of a JFCEvent needed for compatibility with guitar suite
+    * @param List of {@link JFCGUIElementSpec}s that represent the component path of a event target
+    * for which the replayID should be calculated. 
+    * @return replayID
+    */
+	
+   public String calculateReplayID(List<JFCGUIElementSpec> guiElementPath){
+	   String replayID = "";
+	   long hashCode = 1;
+	 
+	   ListIterator<JFCGUIElementSpec> iterator = guiElementPath.listIterator();
+	   
+	   JFCGUIElementSpec currentSpec = iterator.next();
+	   String title = currentSpec.getName();
+	   String fuzzyTitle = getFuzzyTitle(title);
+	   long windowHashCode = fuzzyTitle.hashCode();
+	   windowHashCode = (windowHashCode * 2) & 0xffffffffL;
+
+	   long propagatedHashCode = windowHashCode;
+	   
+	   // added validator to check if generated component ids are known
+	   if (validator != null){
+		   if (validator.validateReplayID("w" + windowHashCode)){
+			   System.out.println("ID w" + windowHashCode + " is valid.");
+		   }
+		   else{
+			   System.err.println(currentSpec + " describes an unknown component.");
+		   	   System.err.println("ID w" + windowHashCode + " is unknown." );
+		   	   System.err.println();
+		   }
+			   
+	   }
+	   
+	   // construct looks complicated but avoids going back and forth through path
+	   if (iterator.hasNext())
+		   currentSpec = iterator.next();
+	   else{
+		   currentSpec = null;
+		   // there are no subcomponents, so we use windowHashCode as hashCode
+		   hashCode = windowHashCode;
+	   }
+
+	   // walk through component path and calculate hashcode
+	   while(currentSpec != null){
+		   long localHashCode = getLocalHashCode(currentSpec);
+		   hashCode = propagatedHashCode * prime + localHashCode;
+		   hashCode = (hashCode * 2) & 0xffffffffL;
+		   
+		   // added validator to check if generated component ids are known
+		   if (validator != null){
+			   if (validator.validateReplayID("w" + hashCode)){
+				   System.out.println("ID w" + hashCode + " is valid.");
+				   System.out.println("==> " + currentSpec + " describes a known component.");
+			   }
+			   else{
+				   System.err.println("ID w" + hashCode + " is unknown." );
+				   System.err.println("==> " + currentSpec + " describes an unknown component.");
+				   System.err.println();
+			   }
+		   }
+
+		   if (iterator.hasNext()){
+			   currentSpec = iterator.next();
+			   Integer index = currentSpec.getIndex();
+			   propagatedHashCode = prime * propagatedHashCode
+					   + index.hashCode();
+		   }
+		   else
+			   currentSpec = null;
+			   
+	   }
+
+	   replayID = "e" + hashCode;
+
+	   return replayID;
+   }
+   
+   
+	/**
+	 * Calculates the replayID of a JFCEvent needed for compatibility with guitar suite 
+	 * @param event for which the ID should be calculated
+	 * @return replayID
+	 */
+	public String calculateReplayID(Event event){
+		List<JFCGUIElementSpec> guiElementPath = new ArrayList<JFCGUIElementSpec>();
+		
+		IEventTarget target = event.getTarget();
+		if (!target.getPlatform().equals("JFC")){
+			throw new IllegalArgumentException("Event target must be of type JFC.");
+		}
+		
+		JFCGUIElement currentTarget = (JFCGUIElement) target;
+		
+		// extract element path
+		while (currentTarget != null){
+			JFCGUIElementSpec currentSpec = (JFCGUIElementSpec) currentTarget.getSpecification();
+			
+			// new specification must be inserted at the beginning of the list
+			guiElementPath.add(0, currentSpec);
+			currentTarget = (JFCGUIElement) currentTarget.getParent();
+		}
+		
+		// calculation is delegated to other calculateReplayID method
+		return this.calculateReplayID(guiElementPath);
+	}
+	
+	/**
+	 * Calculates the hashcode part of a component.
+	 * @param spec The {@link JFCGUIElementSpec} for which the hashcode should be calculated.
+	 * @return the local hashcode
+	 */
+	
+	private long getLocalHashCode(JFCGUIElementSpec spec){
+		long hashcode = 1;
+		String wClass = spec.getType();
+		if (IGNORED_CLASSES.contains(wClass)) {
+		    hashcode = (prime * hashcode + (wClass.equals("null") ? 0 : (wClass
+		               .hashCode())));
+		    return hashcode;
+		}
+		else{
+			Map<String, String> idProperties = extractIDProperties(spec);
+			for (String property: idProperties.keySet()){
+				String value = idProperties.get(property);
+				if (!value.equals("null")){
+					hashcode = prime * hashcode + property.hashCode();
+					hashcode = prime * hashcode + value.hashCode();
+				}
+			}
+		}
+		
+		hashcode = (hashcode * 2) & 0xffffffffL;
+		
+		return hashcode;
+	}
+	
+	/**
+	 * Extracts the IDProperties from a given {@link JFCGUIElementSpec}.
+	 * @param spec
+	 * @return LinkedHashMap that contains the IDProperties and its values.
+	 */
+	
+	private Map<String, String> extractIDProperties(JFCGUIElementSpec spec){
+		LinkedHashMap<String, String> idProperties = new LinkedHashMap<String, String>();
+		if (ID_PROPERTIES.contains("Class")){
+			idProperties.put("Class", spec.getType());
+		}
+		if (ID_PROPERTIES.contains("Title")){
+			String name = spec.getName();
+			// spec returns extra "" that need to be removed
+			idProperties.put("Title", name.substring(1, name.length() - 1));
+		}
+		if (ID_PROPERTIES.contains("Icon")){
+			idProperties.put("Icon", spec.getIcon());
+		}
+		if (ID_PROPERTIES.contains("Index")){
+			idProperties.put("Index", Integer.toString(spec.getIndex()));
+		}	
+		return idProperties;
+	}
+	
+	/**
+	 * Guitar has a special way to deal with window titles when
+	 * calculating unique widget IDs. This method mimics Guitar's
+	 * behavior (compare guitar source code: edu.umd.cs.guitar.
+	 * model.JFCDefaultIDGeneratorSimple).
+	 * @param title
+	 * @return fuzzyTitle
+	 */
+
+	private String getFuzzyTitle(String title){
+		final List<String> PATTERNS = 
+				Arrays.asList("Rachota .*",
+						"OmegaT-.*",
+						"Buddi.*",
+						"Open:.*",
+						"JabRef.*",
+						"GanttProject.*",
+						".*Pauker.*",
+						".*FreeMind.*",
+						".* - ArgoUML.*",
+						"Save Project .*");
+
+
+		for (String sPattern : PATTERNS) {
+			if (matchRegex(title, sPattern)) {
+				return sPattern;
+			}
+		}
+
+		return title;
+	}
+
+	/**
+	 * Determine if the input string matches the input regex pattern.
+	 * This method mimics Guitars behavior.
+	 * Attempt to match the pattern 'sPattern' with the string 'sInputString'.
+
+	 * @param sInputString    Input string to match with pattern
+	 * @param sPattern        Regex pattern to match with string
+	 * @return                True if match, false otherwise
+	 */
+	
+	private static boolean
+	matchRegex(String sInputString,
+			String sPattern)
+	{
+		Pattern pattern;
+		Matcher matcher;
+
+		pattern = Pattern.compile(sPattern);
+		matcher = pattern.matcher(sInputString);
+		if (matcher.matches()) {
+			return true;
+		}
+
+		return false;
+	}
+	
+};
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCReplayIDValidator.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCReplayIDValidator.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCReplayIDValidator.java	(revision 906)
@@ -0,0 +1,69 @@
+package de.ugoe.cs.quest.plugin.jfc;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class JFCReplayIDValidator {
+	private Set<String> validIds = null;
+	
+	public JFCReplayIDValidator(File guitarEfgFile) throws ParserConfigurationException, SAXException, IOException{
+		this.initialize(guitarEfgFile);
+	}
+	
+	public void initialize(File guitarGUIFile) throws ParserConfigurationException, SAXException, IOException{
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+		DocumentBuilder builder = factory.newDocumentBuilder();
+		Document freemindGUI = builder.parse(guitarGUIFile);
+	
+		validIds = new HashSet<String>();
+		
+		NodeList guis = freemindGUI.getFirstChild().getChildNodes();
+		for (int i = 0; i < guis.getLength(); i++)
+			extractIDs(guis.item(i));
+	}
+	
+	private void extractIDs(Node node){
+		NodeList children = node.getChildNodes();
+		if (children != null){
+			for (int j = 0; j < children.getLength(); j++){
+				if (children.item(j).getNodeName().equals("Attributes")){
+					NodeList properties = children.item(j).getChildNodes();
+					for (int i = 0; i < properties.getLength(); i++){
+						NodeList property = properties.item(i).getChildNodes();
+						for (int k = 0; k < property.getLength(); k++){
+							if (property.item(k).getTextContent().equals("ID")){
+								validIds.add(property.item(k+2).getTextContent());
+							}
+						}
+					}
+				}
+				else{
+					extractIDs(children.item(j));
+				}
+			}
+		}
+	}
+	
+
+	public boolean validateReplayID(String replayID){
+		if (validIds == null || validIds.size() == 0)
+			throw new IllegalStateException("There are no valid IDs known, call initialize first.");
+		
+		if (validIds.contains(replayID))
+			return true;
+		
+		return false;
+		
+	}
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCTraceCorrector.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCTraceCorrector.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCTraceCorrector.java	(revision 906)
@@ -0,0 +1,1289 @@
+package de.ugoe.cs.quest.plugin.jfc;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import de.ugoe.cs.util.StringTools;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * corrects older JFC log files which sometimes do not contain correct source specifications for
+ * events. It parses the file and adds component specifications to the sources, that do not have
+ * them. For each invalid source it checks, if there is another source with the same
+ * <code>toString</code> parameter but a complete list of components. If one is found, it is reused
+ * as source for the event with the wrong source. If none is found, a new component list is
+ * generated. This contains as parent components the components of the source of the previous event.
+ * The leaf component is parsed from the <code>toString</code> parameter that is provided with the
+ * source specifications. The resulting leaf nodes are not fully correct. They may pretend to
+ * be equal although they are not. Furthermore they may resist at a position in the GUI tree where
+ * they are not in reality. But more correctness is not achievable based on the
+ * <code>toString</code> parameter. 
+ * </p>
+ * 
+ * @version $Revision: $ $Date: 05.09.2012$
+ * @author 2012, last modified by $Author: pharms$
+ */
+public class JFCTraceCorrector  extends DefaultHandler {
+
+    /**
+     * <p>
+     * the file to write the result into
+     * </p>
+     */
+    private PrintStream outFile;
+    
+    /**
+     * <p>
+     * the currently parsed event
+     * </p>
+     */
+    private Event currentEvent;
+
+    /**
+     * <p>
+     * the currently parsed source of the currently parsed event
+     * </p>
+     */
+    private Source currentSource;
+
+    /**
+     * <p>
+     * the list of all sources parsed in a file identified through their <code>toString</code>
+     * representation
+     * </p>
+     */
+    private Map<String, List<Source>> allSources = new HashMap<String, List<Source>>();
+
+    /**
+     * <p>
+     * the currently parsed component of the currently parsed source of the currently parsed event
+     * </p>
+     */
+    private Component currentComponent;
+
+    /**
+     * <p>
+     * the currently parsed session
+     * </p>
+     */
+    private Session currentSession;
+
+    /**
+     * <p>
+     * corrects the given file and returns the name of the file into which the result was written
+     * </p>
+     * 
+     * @param filename the name of the file to be corrected
+     * 
+     * @return the name of the file with the corrected logfile
+     * 
+     * @throws IllegalArgumentException if the filename is null
+     */
+    public String correctFile(String filename) throws IllegalArgumentException {
+        if (filename == null) {
+            throw new IllegalArgumentException("filename must not be null");
+        }
+
+        return correctFile(new File(filename)).getAbsolutePath();
+    }
+
+    /**
+     * <p>
+     * corrects the given file, stores the result in the second provided file and returns the
+     * name of the file into which the result was written
+     * </p>
+     * 
+     * @param filename   the name of the file to be corrected
+     * @param resultFile the name of the file into which the corrected log shall be written
+     * 
+     * @return the name of the file with the corrected logfile
+     * 
+     * @throws IllegalArgumentException if the filename or resultFile is null
+     */
+    public String correctFile(String filename, String resultFile) throws IllegalArgumentException {
+        if ((filename == null) | (resultFile == null)) {
+            throw new IllegalArgumentException("filename and resultFile must not be null");
+        }
+
+        return correctFile(new File(filename), new File(resultFile)).getAbsolutePath();
+    }
+
+    /**
+     * <p>
+     * corrects the given file and returns the file into which the result was written. The name
+     * of the resulting file is contains the suffix "_corrected" before the dot.
+     * </p>
+     * 
+     * @param file the file to be corrected
+     * 
+     * @return the file containing the corrected logfile
+     * 
+     * @throws IllegalArgumentException if the file is null
+     */
+    public File correctFile(File file) throws IllegalArgumentException {
+        if (file == null) {
+            throw new IllegalArgumentException("file must not be null");
+        }
+
+        int index = file.getName().lastIndexOf('.');
+        String fileName =
+            file.getName().substring(0, index) + "_corrected" + file.getName().substring(index);
+
+        File resultFile = new File(file.getParentFile(), fileName);
+
+        return correctFile(file, resultFile);
+    }
+
+    /**
+     * <p>
+     * corrects the given file, stores the result in the second provided file and returns the
+     * file into which the result was written
+     * </p>
+     * 
+     * @param file       the file to be corrected
+     * @param resultFile the file into which the corrected log shall be written
+     * 
+     * @return the file with the corrected logfile
+     * 
+     * @throws IllegalArgumentException if the file or resultFile is null or if they are equal
+     */
+    public File correctFile(File file, File resultFile) throws IllegalArgumentException {
+        if ((file == null) || (resultFile == null)) {
+            throw new IllegalArgumentException("file and result file must not be null");
+        }
+        
+        if (file.getAbsolutePath().equals(resultFile.getAbsolutePath())) {
+            throw new IllegalArgumentException("file and result file must not be equal");
+        }
+        
+        try {
+            outFile = new PrintStream(new BufferedOutputStream(new FileOutputStream(resultFile)));
+            outFile.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
+        }
+        catch (FileNotFoundException e1) {
+            throw new IllegalArgumentException("could not create a corrected file name " +
+                                               resultFile + " next to " + file);
+        }
+        
+
+        SAXParserFactory spf = SAXParserFactory.newInstance();
+        spf.setValidating(true);
+
+        SAXParser saxParser = null;
+        InputSource inputSource = null;
+        try {
+            saxParser = spf.newSAXParser();
+            inputSource =
+                new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+        }
+        catch (UnsupportedEncodingException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return null;
+        }
+        catch (ParserConfigurationException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return null;
+        }
+        catch (SAXException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return null;
+        }
+        catch (FileNotFoundException e) {
+            Console.printerr("Error parsing file + " + file.getName());
+            Console.logException(e);
+            return null;
+        }
+        if (inputSource != null) {
+            inputSource.setSystemId("file://" + file.getAbsolutePath());
+            try {
+                if (saxParser == null) {
+                    throw new RuntimeException("SAXParser creation failed");
+                }
+                saxParser.parse(inputSource, this);
+            }
+            catch (SAXParseException e) {
+                Console.printerrln("Failure parsing file in line " + e.getLineNumber() +
+                    ", column " + e.getColumnNumber() + ".");
+                Console.logException(e);
+                return null;
+            }
+            catch (SAXException e) {
+                Console.printerr("Error parsing file + " + file.getName());
+                Console.logException(e);
+                return null;
+            }
+            catch (IOException e) {
+                Console.printerr("Error parsing file + " + file.getName());
+                Console.logException(e);
+                return null;
+            }
+        }
+        
+        if (outFile != null) {
+            outFile.close();
+        }
+        
+        return resultFile;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String,
+     * java.lang.String, org.xml.sax.Attributes)
+     */
+    public void startElement(String uri, String localName, String qName, Attributes atts)
+        throws SAXException
+    {
+        if (qName.equals("sessions")) {
+            if (currentSession != null) {
+                throw new SAXException("nested sessions are not allowed");
+            }
+            
+            currentSession = new Session("sessions");
+        }
+        else if (qName.equals("newsession")) {
+            if (currentSession != null) {
+                currentSession.dump(outFile);
+            }
+            
+            currentSession = new Session("newsession");
+        }
+        else if (qName.equals("event")) {
+            if (currentEvent != null) {
+                throw new SAXException("nested events are not allowed");
+            }
+            
+            currentEvent = new Event(atts.getValue("id"));
+        }
+        else if (qName.equals("source")) {
+            if (currentSource != null) {
+                throw new SAXException("nested sources are not allowed");
+            }
+            
+            currentSource = new Source();
+        }
+        else if (qName.equals("component")) {
+            if (currentComponent != null) {
+                throw new SAXException("nested components are not allowed");
+            }
+            
+            currentComponent = new Component();
+        }
+        else if (qName.equals("param")) {
+            if (currentComponent != null) {
+                currentComponent.addParameter(atts.getValue("name"), atts.getValue("value"));
+            }
+            else if (currentSource != null) {
+                currentSource.addParameter(atts.getValue("name"), atts.getValue("value"));
+            }
+            else if (currentEvent != null) {
+                currentEvent.addParameter(atts.getValue("name"), atts.getValue("value"));
+            }
+            else {
+                throw new SAXException("parameter occurred at an unexpected place");
+            }
+        }
+        else {
+            throw new SAXException("unexpected tag " + qName);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String,
+     * java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        // we do not have to check, if the current objects are null, as the Parser itself will
+        // throw an exception, if there is a closing tag for a non existent opening tag. But
+        // with a correct opening tag, the member variables will not be null (see startElement())
+        if (qName.equals("sessions")) {
+            correctSources(currentSession);
+
+            currentSession.dump(outFile);
+            currentSession = null;
+            allSources.clear();
+        }
+        else if (qName.equals("newsession")) {
+            correctSources(currentSession);
+            
+            currentSession.dump(outFile);
+            currentSession = null;
+            allSources.clear();
+        }
+        else if (qName.equals("event")) {
+            currentSession.addEvent(currentEvent);
+            currentEvent = null;
+        }
+        else if (qName.equals("source")) {
+            currentEvent.setSource(getUniqueSource(currentSource));
+            currentSource = null;
+        }
+        else if (qName.equals("component")) {
+            currentSource.addComponent(currentComponent);
+            currentComponent = null;
+        }
+        else if (!qName.equals("param")) {
+            throw new SAXException("unexpected closing tag " + qName);
+        }
+
+    }
+
+    /**
+     * <p>
+     * returns a source object, that is equal to the provided one but that is unique throughout
+     * the parsing process. The method may return the provided source, if this is the first
+     * occurrence of this source. This method is needed to reduce the amount of source
+     * representations that are instantiated during parsing log files. 
+     * </p>
+     *
+     * @param source the source to search for a unique representation
+     * 
+     * @return the unique representation of the source
+     */
+    private Source getUniqueSource(Source source) {
+        Source existingSource = null;
+        
+        List<Source> candidates = allSources.get(source.getToStringValue());
+        
+        if (candidates != null) {
+            for (Source candidate : candidates) {
+                if (candidate.equals(source)) {
+                    existingSource = candidate;
+                    break;
+                }
+            }
+        }
+        
+        if (existingSource == null) {
+            if (candidates == null) {
+                candidates = new ArrayList<Source>();
+                allSources.put(source.getToStringValue(), candidates);
+            }
+            
+            candidates.add(source);
+            existingSource = source;
+        }
+        
+        return existingSource;
+    }
+
+    /**
+     * <p>
+     * convenience method to find a source based on its <code>toString</code> parameter value.
+     * The method only returns sources, which match the provided <code>toString</code>
+     * representation and which have a valid list of components (size greater 0).
+     * </p>
+     *
+     * @param toStringValue the value of the <code>toString</code> parameter the source to find
+     *                      must have
+     * 
+     * @return the source matching the parameter and having a valid list of components or null if
+     *         none is found
+     */
+    private Source findValidSource(String toStringValue) {
+        Source existingSource = null;
+        
+        List<Source> candidates = allSources.get(toStringValue);
+        
+        if (candidates != null) {
+            for (Source candidate : candidates) {
+                if ((candidate.getComponents() != null) && (candidate.getComponents().size() > 0))
+                {
+                    existingSource = candidate;
+                    break;
+                }
+            }
+        }
+        
+        return existingSource;
+    }
+
+    /**
+     * <p>
+     * corrects all wrong sources in the events of the session. For each wrong resource, the
+     * {@link #correctEventSource(Event, Source)} method is called.
+     * </p>
+     *
+     * @param session the session of which the events shall be corrected
+     */
+    private void correctSources(Session session) {
+        Source previousSource = null;
+        for (Event event : session.getEvents()) {
+            if ((event.getSource() == null) || (event.getSource().getComponents() == null) ||
+                (event.getSource().getComponents().size() == 0))
+            {
+                correctEventSource(event, previousSource);
+            }
+            
+            previousSource = event.getSource();
+        }
+    }
+
+    /**
+     * <p>
+     * corrects the source of an event. It first searches for a correct source with an equal
+     * <code>toString</code> parameter. If there is any, this is reused. Otherwise it creates a
+     * new correct source. For this, it copies all parameters of the source of the provided previous
+     * event if they are not included in the source already. Furthermore, it adds all components
+     * of the source of the previous event. At last, it adds a further component based on the
+     * information found in the <code>toString</code> parameter of the source.
+     * </p>
+     * 
+     * @param event          the event of which the source must be corrected
+     * @param previousSource the source of the previous event to be potentially reused partially
+     */
+    private void correctEventSource(Event event, Source previousSource) {
+        Source existingSource = null;
+        
+        if ((event.getSource() != null) && (event.getSource().getToStringValue() != null)) {
+            existingSource = findValidSource(event.getSource().getToStringValue());
+        }
+        
+        if (existingSource != null) {
+            event.setSource(existingSource);
+        }
+        else {
+            if (previousSource != null) {
+                for (Parameter parameterOfPreviousSource : previousSource.getParameters()) {
+                    boolean foundParameter = false;
+                    for (Parameter parameter : event.getSource().getParameters()) {
+                        if (parameter.getName().equals(parameterOfPreviousSource.getName())) {
+                            foundParameter = true;
+                            break;
+                        }
+                    }
+
+                    if (!foundParameter) {
+                        event.getSource().addParameter(parameterOfPreviousSource);
+                    }
+                }
+    
+                for (Component component : previousSource.getComponents()) {
+                    if (!(component instanceof ComponentFromToString)) {
+                        event.getSource().addComponent(component);
+                    }
+                }
+            }
+
+            event.getSource().addComponent
+                (getComponentFromToString(event.getSource().getToStringValue()));
+        }
+    }
+
+    /**
+     * <p>
+     * determines a component based on the <code>toString</code> parameter of a source.
+     * For this, it parses the parameter value and tries to determine several infos such as the
+     * type and the name of it. The resulting components are not always distinguishable. This is,
+     * because the <code>toString</code> parameter does not contain sufficient information for
+     * correct identification.
+     * </p>
+     * 
+     * @param toStringValue the <code>toString</code> parameter of a source
+     * 
+     * @return the component parsed from the <code>toString</code> parameter
+     */
+    private Component getComponentFromToString(String toStringValue) {
+        ComponentFromToString component = new ComponentFromToString();
+        
+        // search for the beginning of the parameters section. Up to this position we find the class
+        int start = toStringValue.indexOf('[');
+        String clazz = toStringValue.substring(0, start);
+        
+        // the first parameters are x and y coordinate as well as the size. The size is one
+        // parameter, where with and height are separated with an 'x'
+        start = toStringValue.indexOf(',', start) + 1;
+        int end = toStringValue.indexOf(',', start);
+        
+        component.setX(Integer.parseInt(toStringValue.substring(start, end)));
+        
+        start = end + 1;
+        end = toStringValue.indexOf(',', start);
+
+        component.setY(Integer.parseInt(toStringValue.substring(start, end)));
+
+        start = end + 1;
+        end = toStringValue.indexOf('x', start);
+
+        component.setWidth(Integer.parseInt(toStringValue.substring(start, end)));
+
+        start = end + 1;
+        end = toStringValue.indexOf(',', start);
+
+        component.setHeight(Integer.parseInt(toStringValue.substring(start, end)));
+
+        // no start parsing the rest of the parameters and extract those having a key and a 
+        // value and whose key is text, defaultIcon, or an alignment
+        int intermediate;
+        start = end + 1;
+
+        String title = null;
+        String icon = null;
+        String alignment = null;
+        
+        do {
+            end = toStringValue.indexOf(',', start);
+            intermediate = toStringValue.indexOf('[', start);
+            
+            if ((intermediate >= 0) && (intermediate < end)) {
+                // the value of the parameter itself contains brackets. So try to determine the 
+                // real end of the parameter
+                end = toStringValue.indexOf(']', intermediate);
+                end = toStringValue.indexOf(',', end);
+            }
+            
+            if (end < 0) {
+                //we reached the end of the stream. So the the end to the "end"
+                end = toStringValue.lastIndexOf(']');
+            }
+            
+            intermediate = toStringValue.indexOf('=', start);
+            
+            if ((intermediate >= 0) && (intermediate < end)) {
+                // this is a key value pair, so store the the parameter
+                String key = toStringValue.substring(start, intermediate);
+                String value = toStringValue.substring(intermediate + 1, end);
+                
+                if ("text".equals(key)) {
+                    title = value;
+                }
+                else if ("defaultIcon".equals(key)) {
+                    icon = value;
+                }
+                else if ("alignmentX".equals(key) || "alignmentY".equals(key)) {
+                    if (alignment == null) {
+                        alignment = value;
+                    }
+                    else {
+                        alignment += "/" + value;
+                    }
+                }
+            }
+            /*else {
+                // this is a simple value, for now simply ignore it
+                String key = toStringValue.substring(start, end);
+                if (!"invalid".equals(key)) {
+                    componentHash += key.hashCode();
+                    component.params.add(new String[] { key, "true" });
+                }
+            }*/
+            
+            start = end + 1;
+        }
+        while (start < toStringValue.lastIndexOf(']'));
+        
+        // finish the component specification by setting the parameters
+        if ((title == null) || "".equals(title) || "null".equals(title)) {
+            if ((icon == null) || "".equals(icon) || "null".equals(icon)) {
+                title = clazz.substring(clazz.lastIndexOf('.') + 1) + "(";
+                
+                // to be able to distinguish some elements, that usually have no name and icon, try
+                // to include some of their specific identifying information in their name.
+                if ("org.tigris.gef.presentation.FigTextEditor".equals(clazz) ||
+                    "org.argouml.core.propertypanels.ui.UMLTextField".equals(clazz))
+                {
+                    title += "height " + component.height + ", ";
+                }
+                else if ("org.argouml.core.propertypanels.ui.UMLLinkedList".equals(clazz) ||
+                         "org.argouml.core.propertypanels.ui.LabelledComponent".equals(clazz))
+                {
+                    title += "position " + component.getX() + "/" + component.getY() + ", ";
+                }
+                
+                title += "alignment " + alignment + ")";
+            }
+            else {
+                // to be able to distinguish some elements, that usually have no name but an icon,
+                // try to include some of their specific identifying information in their name.
+                if ("org.tigris.toolbar.toolbutton.PopupToolBoxButton".equals(clazz))
+                {
+                    icon = icon.substring(0, icon.lastIndexOf('@'));
+                    title = clazz.substring(clazz.lastIndexOf('.') + 1) + "(position " +
+                        component.getX() + ")";
+                }
+                else {
+                    title = icon;
+                }
+            }
+        }
+        
+        component.addParameter("title", title);
+        component.addParameter("class", clazz);
+        component.addParameter("icon", ((icon == null) ? "" : icon));
+        component.addParameter("index", "-1");
+        
+        int hashCode = clazz.hashCode() + title.hashCode();
+        
+        if (hashCode < 0) {
+            hashCode = -hashCode;
+        }
+        
+        component.addParameter("hash", Integer.toString(hashCode, 16));
+
+        return component;
+    }    
+
+    /**
+     * <p>
+     * used to dump a list of parameters to the provided print stream
+     * </p>
+     */
+    private void dumpParams(PrintStream out, List<Parameter> params, String indent) {
+        for (Parameter param : params) {
+            out.print(indent);
+            out.print("<param name=\"");
+            out.print(StringTools.xmlEntityReplacement(param.getName()));
+            out.print("\" value=\"");
+            out.print(StringTools.xmlEntityReplacement(param.getValue()));
+            out.println("\" />");
+        }
+        
+    }
+    
+    /**
+     * <p>
+     * check if two parameter lists are equal. Thea are equal if the contain the same parameters
+     * ignoring their order.
+     * </p>
+     *
+     * @param params1 the first parameter list to be compared
+     * @param params2 the second parameter list to be compared
+     * 
+     * @return true if both lists contain the same parameters, false else.
+     */
+    private boolean parametersEqual(List<Parameter> params1, List<Parameter> params2) {
+        if (params1 == null) {
+            return params2 == null;
+        }
+        
+        if (params2 == null) {
+            return false;
+        }
+        
+        if (params1.size() != params2.size()) {
+            return false;
+        }
+        
+        boolean found;
+        for (Parameter param1 : params1) {
+            found = false;
+            
+            for (Parameter param2 : params2) {
+                if (param1.equals(param2)) {
+                    found = true;
+                    break;
+                }
+            }
+            
+            if (!found) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+    
+    
+    /**
+     * <p>
+     * used to carry all events of a session and to dump it to the output file
+     * </p> 
+     */
+    private class Session {
+        
+        /** */
+        private String type;
+        
+        /** */
+        private List<Event> events = new ArrayList<Event>();
+        
+        /**
+         * 
+         */
+        private Session(String type) {
+            if (type == null) {
+                throw new IllegalArgumentException("type must not be null");
+            }
+            
+            this.type = type;
+        }
+        
+        /**
+         * 
+         */
+        private void addEvent(Event event) {
+            if (event == null) {
+                throw new IllegalArgumentException("event must not be null");
+            }
+            
+            events.add(event);
+        }
+        
+        /**
+         * @return the events
+         */
+        private List<Event> getEvents() {
+            return Collections.unmodifiableList(events);
+        }
+
+        /**
+         * 
+         */
+        private void dump(PrintStream out) {
+            if (out == null) {
+                throw new IllegalArgumentException("out must not be null");
+            }
+            
+            out.print("<");
+            out.print(type);
+            out.println(">");
+
+            for (Event event : events) {
+                event.dump(out);
+            }
+            
+            out.print("</");
+            out.print(type);
+            out.println(">");
+        }
+    }
+
+    /**
+     * <p>
+     * used to carry all information about an event and to dump it to the output file
+     * </p> 
+     */
+    private class Event {
+
+        /** */
+        private String id;
+
+        /** */
+        private List<Parameter> params = new ArrayList<Parameter>();
+
+        /** */
+        private Source source;
+        
+        /**
+         * 
+         */
+        private Event(String id) {
+            if (id == null) {
+                throw new IllegalArgumentException("id must not be null");
+            }
+            
+            this.id = id;
+        }
+        
+        /**
+         * @param source the source to set
+         */
+        private void setSource(Source source) {
+            this.source = source;
+        }
+
+        /**
+         * @return the source
+         */
+        private Source getSource() {
+            return source;
+        }
+
+        /**
+         * 
+         */
+        private void addParameter(String name, String value) {
+            if (name == null) {
+                throw new IllegalArgumentException("name must not be null");
+            }
+            
+            if (value == null) {
+                throw new IllegalArgumentException("value must not be null");
+            }
+            
+            params.add(new Parameter(name, value));
+        }
+        
+        /**
+         * 
+         */
+        private void dump(PrintStream out) {
+            if (out == null) {
+                throw new IllegalArgumentException("out must not be null");
+            }
+            
+            out.print("<event id=\"");
+            out.print(StringTools.xmlEntityReplacement(id));
+            out.println("\">");
+            
+            dumpParams(out, params, " ");
+            source.dump(out);
+            
+            out.println("</event>");
+        }
+    }
+
+    /**
+     * <p>
+     * used to carry all information about a source of an event and to dump it to the output file
+     * </p> 
+     */
+    private class Source {
+        
+        /** */
+        private List<Parameter> params = new ArrayList<Parameter>();
+        
+        /** */
+        private List<Component> components = new ArrayList<Component>();
+        
+        /** */
+        private String toStringValue = null;
+
+        /**
+         *
+         */
+        private String getToStringValue() {
+            if (toStringValue == null) {
+                for (Parameter param : params) {
+                    if (("toString".equals(param.getName())) &&
+                        (param.getValue() != null) && (!"".equals(param.getValue())))
+                    {
+                        toStringValue = param.getValue();
+                        break;
+                    }
+                }
+            }
+            
+            return toStringValue;
+        }
+
+        /**
+         * 
+         */
+        private void addParameter(String name, String value) {
+            if (name == null) {
+                throw new IllegalArgumentException("name must not be null");
+            }
+            
+            if (value == null) {
+                throw new IllegalArgumentException("value must not be null");
+            }
+            
+            params.add(new Parameter(name, value));
+        }
+        
+        /**
+         * 
+         */
+        private void addParameter(Parameter parameter) {
+            if (parameter == null) {
+                throw new IllegalArgumentException("parameter must not be null");
+            }
+            
+            params.add(parameter);
+        }
+        
+        /**
+         * @return the params
+         */
+        private List<Parameter> getParameters() {
+            return Collections.unmodifiableList(params);
+        }
+
+        /**
+         * 
+         */
+        private void addComponent(Component component) {
+            if (component == null) {
+                throw new IllegalArgumentException("component must not be null");
+            }
+            
+            components.add(component);
+        }
+        
+        /**
+         * @return the components
+         */
+        private List<Component> getComponents() {
+            return Collections.unmodifiableList(components);
+        }
+
+        /**
+         * 
+         */
+        private void dump(PrintStream out) {
+            if (out == null) {
+                throw new IllegalArgumentException("out must not be null");
+            }
+            
+            out.println(" <source>");
+            
+            dumpParams(out, params, "  ");
+            
+            for (Component component : components) {
+                component.dump(out);
+            }
+            
+            out.println(" </source>");
+        }
+        
+        /* (non-Javadoc)
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            
+            if (obj instanceof Source) {
+                Source other = (Source) obj;
+                
+                if ((getToStringValue() != other.getToStringValue()) ||
+                    ((getToStringValue() != null) &&
+                     (!getToStringValue().equals(other.getToStringValue()))))
+                {
+                    return false;
+                }
+                
+                if (!parametersEqual(params, other.params)) {
+                    return false;
+                }
+                
+                if (components == null) {
+                    return other.components == null;
+                }
+                
+                if (other.components == null) {
+                    return false;
+                }
+                
+                if (components.size() != other.components.size()) {
+                    return false;
+                }
+
+                for (int i = 0; i < components.size(); i++) {
+                    if (!components.get(i).equals(other.components.get(i))) {
+                        return false;
+                    }
+                }
+                
+                return true;
+            }
+            
+            return false;
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            String str = getToStringValue();
+            
+            if (str != null) {
+                return str.hashCode();
+            }
+            else {
+                // ensure that all incomplete sources provide the same hashcode
+                return 0;
+            }
+        }
+
+    }
+    
+    /**
+     * <p>
+     * used to carry all information about a component of a source and to dump it to the output file
+     * </p> 
+     */
+    private class Component {
+        
+        /** */
+        private List<Parameter> params = new ArrayList<Parameter>();
+        
+        /**
+         * 
+         */
+        protected void addParameter(String name, String value) {
+            if (name == null) {
+                throw new IllegalArgumentException("name must not be null");
+            }
+            
+            if (value == null) {
+                throw new IllegalArgumentException("value must not be null");
+            }
+            
+            params.add(new Parameter(name, value));
+        }
+        
+        /**
+         * @return the params
+         */
+        private List<Parameter> getParameters() {
+            return Collections.unmodifiableList(params);
+        }
+
+        /**
+         * 
+         */
+        protected void dump(PrintStream out) {
+            if (out == null) {
+                throw new IllegalArgumentException("out must not be null");
+            }
+            
+            out.println("  <component>");
+            dumpParams(out, params, "   ");
+            out.println("  </component>");
+        }
+
+        /**
+         * 
+         */
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            
+            if (obj instanceof Component) {
+                return parametersEqual(params, ((Component) obj).params);
+            }
+            else {   
+               return false;
+            }
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            // all components with an equally sized parameter list can be equal. This does not
+            // work, if not all component parameters are set yet. But we do not use components
+            // in a hash map so we provide an easy implementation
+            return params.size();
+        }
+    }
+
+    /**
+     * <p>
+     * represents a specific component, which was read from the toString parameter of a source
+     * </p> 
+     */
+    private class ComponentFromToString extends Component {
+        
+        /** */
+        private int x;
+        
+        /** */
+        private int y;
+        
+        /** */
+        private int width;
+        
+        /** */
+        private int height;
+        
+        /**
+         * @param x the x to set
+         */
+        private void setX(int x) {
+            this.x = x;
+        }
+
+        /**
+         * @return the x
+         */
+        private int getX() {
+            return x;
+        }
+
+       /**
+         * @param y the y to set
+         */
+        private void setY(int y) {
+            this.y = y;
+        }
+
+        /**
+         * @return the y
+         */
+        private int getY() {
+            return y;
+        }
+
+        /**
+         * @param width the width to set
+         */
+        private void setWidth(int width) {
+            this.width = width;
+        }
+
+        /**
+         * @param height the height to set
+         */
+        private void setHeight(int height) {
+            this.height = height;
+        }
+
+        /**
+         * 
+         */
+        @Override
+        protected void dump(PrintStream out) {
+            if (out == null) {
+                throw new IllegalArgumentException("out must not be null");
+            }
+            
+            out.println("  <component>");
+            
+            out.print("   ");
+            out.print("<param name=\"x\" value=\"");
+            out.print(x);
+            out.println("\" />");
+
+            out.print("   ");
+            out.print("<param name=\"y\" value=\"");
+            out.print(y);
+            out.println("\" />");
+
+            out.print("   ");
+            out.print("<param name=\"width\" value=\"");
+            out.print(width);
+            out.println("\" />");
+
+            out.print("   ");
+            out.print("<param name=\"height\" value=\"");
+            out.print(height);
+            out.println("\" />");
+
+            dumpParams(out, super.getParameters(), "   ");
+            out.println("  </component>");
+        }
+        
+        /**
+         * 
+         */
+        public boolean equals(Object obj) {
+            if (!super.equals(obj)) {
+                return false;
+            }
+            
+            if (obj instanceof ComponentFromToString) {
+                ComponentFromToString other = (ComponentFromToString) obj;
+                return (x == other.x) && (y == other.y) &&
+                    (width == other.width) && (height == other.height);
+            }
+            else {   
+               return false;
+            }
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            return super.hashCode() + x + y + width + height;
+        }
+    }
+
+    /**
+     * <p>
+     * used to carry all information about a parameter being a key and a value
+     * </p> 
+     */
+    private class Parameter {
+        
+        /** */
+        private String name;
+        
+        /** */
+        private String value;
+        
+        /**
+         * 
+         */
+        private Parameter(String name, String value) {
+            if (name == null) {
+                throw new IllegalArgumentException("name must not be null");
+            }
+            
+            if (value == null) {
+                throw new IllegalArgumentException("value must not be null");
+            }
+            
+            this.name = name;
+            this.value = value;
+        }
+
+        /**
+         * @return the name
+         */
+        private String getName() {
+            return name;
+        }
+
+        /**
+         * @return the value
+         */
+        private String getValue() {
+            return value;
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof Parameter) {
+                return
+                    (name.equals(((Parameter) obj).name) && value.equals(((Parameter) obj).value));
+            }
+            else {
+                return false;
+            }
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            return name.hashCode() + value.hashCode();
+        }
+        
+        
+    }
+        
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDcorrectDirOldJFC.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDcorrectDirOldJFC.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDcorrectDirOldJFC.java	(revision 906)
@@ -0,0 +1,77 @@
+
+package de.ugoe.cs.quest.plugin.jfc.commands;
+
+import java.io.File;
+import java.util.List;
+import java.util.logging.Level;
+
+import de.ugoe.cs.quest.plugin.jfc.JFCTraceCorrector;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * Command that tries to correct all files in a folder as if they were log files generated by the
+ * older version of the JFCMonitor which sometimes do not include correct event sources. The result
+ * is another specified directory, which contains the corrected files.
+ * </p>
+ * 
+ * @author Patrick Harms
+ * @version 1.0
+ */
+public class CMDcorrectDirOldJFC implements Command {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+     */
+    @Override
+    public void run(List<Object> parameters) {
+        String path;
+        String resultPath;
+
+        try {
+            path = (String) parameters.get(0);
+            resultPath = (String) parameters.get(1);
+        }
+        catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+
+        File folder = new File(path);
+        if (!folder.isDirectory()) {
+            Console.printerrln(path + " is not a directory");
+            return;
+        }
+
+        File destfolder = new File(resultPath);
+        if (!destfolder.isDirectory()) {
+            Console.printerrln(resultPath + " is not a directory");
+            return;
+        }
+
+        JFCTraceCorrector corrector = new JFCTraceCorrector();
+
+        String absolutPath = folder.getAbsolutePath();
+        String absolutDestPath = destfolder.getAbsolutePath();
+        for (String filename : folder.list()) {
+            String source = absolutPath + "/" + filename;
+            String dest = absolutDestPath + "/" + filename;
+            Console.traceln(Level.INFO, "Processing file: " + source);
+
+            corrector.correctFile(source, dest);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.Command#help()
+     */
+    @Override
+    public String help() {
+        return "correctDirOldJFC <sourcedirectory> <destinationdirectory>";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDcorrectOldJFC.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDcorrectOldJFC.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDcorrectOldJFC.java	(revision 906)
@@ -0,0 +1,53 @@
+
+package de.ugoe.cs.quest.plugin.jfc.commands;
+
+import java.util.List;
+
+import de.ugoe.cs.quest.plugin.jfc.JFCTraceCorrector;
+import de.ugoe.cs.util.console.Command;
+
+/**
+ * <p>
+ * Command to correct an XML file with sessions monitored by the older version of the
+ * EventBench's JFCMonitor which sometimes do not include correct event sources.
+ * </p>
+ * 
+ * @author Patrick Harms
+ * @version 1.0
+ */
+public class CMDcorrectOldJFC implements Command {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+     */
+    @Override
+    public void run(List<Object> parameters) {
+        String inputfilename;
+        String outputfilename;
+
+        try {
+            inputfilename = (String) parameters.get(0);
+            outputfilename = (String) parameters.get(1);
+        }
+        catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+
+        JFCTraceCorrector corrector = new JFCTraceCorrector();
+
+        corrector.correctFile(inputfilename, outputfilename);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.Command#help()
+     */
+    @Override
+    public String help() {
+        return "correctOldJFC <inputfilename> <outputfilename>";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDparseDirJFC.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDparseDirJFC.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDparseDirJFC.java	(revision 906)
@@ -0,0 +1,87 @@
+package de.ugoe.cs.quest.plugin.jfc.commands;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+
+import de.ugoe.cs.quest.CommandHelpers;
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.guimodel.GUIModel;
+import de.ugoe.cs.quest.plugin.jfc.JFCLogParser;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.GlobalDataContainer;
+
+/**
+ * <p>
+ * Command that tries to parse all files in a folder as if they were log files generated by the
+ * JFCMonitor. The result is one set of sequences for all files (not one set of sequences for each
+ * file!).
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class CMDparseDirJFC implements Command {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+     */
+    @Override
+    public void run(List<Object> parameters) {
+        String path;
+        String sequencesName = "sequences";
+
+        try {
+            path = (String) parameters.get(0);
+            if (parameters.size() >= 2) {
+                sequencesName = (String) parameters.get(1);
+            }
+        }
+        catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+
+        File folder = new File(path);
+        if (!folder.isDirectory()) {
+            Console.printerrln(path + " is not a directory");
+            return;
+        }
+
+        JFCLogParser parser = new JFCLogParser();
+
+        String absolutPath = folder.getAbsolutePath();
+        for (String filename : folder.list()) {
+            String source = absolutPath + "/" + filename;
+            Console.traceln(Level.INFO, "Processing file: " + source);
+
+            parser.parseFile(source);
+        }
+
+        Collection<List<Event>> sequences = parser.getSequences();
+        
+        GUIModel targets = parser.getGuiModel();
+
+        if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
+            CommandHelpers.dataOverwritten(sequencesName);
+        }
+        
+        if (GlobalDataContainer.getInstance().addData(sequencesName + "_targets", targets)) {
+            CommandHelpers.dataOverwritten(sequencesName + "_targets");
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.util.console.Command#help()
+     */
+    @Override
+    public String help() {
+        return "parseDirJFC <directory> {<sequencesName>}";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDparseJFC.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDparseJFC.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDparseJFC.java	(revision 906)
@@ -0,0 +1,69 @@
+package de.ugoe.cs.quest.plugin.jfc.commands;
+
+import java.util.Collection;
+import java.util.List;
+
+import de.ugoe.cs.quest.CommandHelpers;
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.guimodel.GUIModel;
+import de.ugoe.cs.quest.plugin.jfc.JFCLogParser;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.GlobalDataContainer;
+
+/**
+ * <p>
+ * Command to parse an XML file with sessions monitored by EventBench's
+ * JFCMonitor.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class CMDparseJFC implements Command {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@Override
+	public void run(List<Object> parameters) {
+		String filename;
+		String sequencesName = "sequences";
+
+		try {
+			filename = (String) parameters.get(0);
+			if (parameters.size() >= 2) {
+				sequencesName = (String) parameters.get(1);
+			}
+		} catch (Exception e) {
+			throw new IllegalArgumentException();
+		}
+		
+		JFCLogParser parser = new JFCLogParser();
+
+		parser.parseFile(filename);
+		Collection<List<Event>> sequences = parser.getSequences();
+
+	        GUIModel targets = parser.getGuiModel();
+
+		if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
+			CommandHelpers.dataOverwritten(sequencesName);
+		}
+		
+	        if (GlobalDataContainer.getInstance().addData(sequencesName + "_targets", targets)) {
+	            CommandHelpers.dataOverwritten(sequencesName + "_targets");
+	        }
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#help()
+	 */
+	@Override
+	public String help() {
+		return "parseJFC <filename> {<sequencesName>}";
+	}
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDpreprocessDirJFC.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDpreprocessDirJFC.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDpreprocessDirJFC.java	(revision 906)
@@ -0,0 +1,119 @@
+package de.ugoe.cs.quest.plugin.jfc.commands;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.logging.Level;
+
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * Command to pre-process files written by EventBench's JFCMonitor located in a
+ * directory. The only task of the pre-processing is checking if the session was
+ * closed properly, i.e., if the XML file ends with a {@code </sessions>} tag.
+ * If this is not the case, the tag will be appended to the file.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class CMDpreprocessDirJFC implements Command {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@Override
+	public void run(List<Object> parameters) {
+		String sourcePath;
+		String targetPath;
+		try {
+			sourcePath = (String) parameters.get(0);
+			targetPath = (String) parameters.get(1);
+		} catch (Exception e) {
+			throw new IllegalArgumentException();
+		}
+
+		File sourceFolder = new File(sourcePath);
+		if (!sourceFolder.isDirectory()) {
+			Console.printerrln(sourcePath + " is not a directory");
+		}
+		String absolutPathSource = sourceFolder.getAbsolutePath();
+		File targetFolder = new File(targetPath);
+		if (!targetFolder.isDirectory()) {
+			Console.printerrln(targetPath + " is not a directory");
+		}
+		String absolutPathTarget = targetFolder.getAbsolutePath();
+
+		for (String filename : sourceFolder.list()) {
+			String source = absolutPathSource + "/" + filename;
+			Console.traceln(Level.INFO, "Preprocessing file: " + source);
+			File file = new File(source);
+			InputStreamReader reader;
+			try {
+				FileInputStream fis = new FileInputStream(file);
+				reader = new InputStreamReader(fis, "UTF-16");
+			} catch (FileNotFoundException e) {
+				Console.printerrln(e.getMessage());
+				return;
+			} catch (UnsupportedEncodingException e) {
+				Console.printerrln(e.getMessage());
+				return;
+			}
+			char[] buffer = new char[(int) file.length()];
+			try {
+				reader.read(buffer);
+				reader.close();
+			} catch (IOException e) {
+				Console.printerrln(e.getMessage());
+				return;
+			}
+
+			String content = new String(buffer).trim();
+
+			int index = filename.lastIndexOf('.');
+			String target = absolutPathTarget + "/"
+					+ filename.substring(0, index) + ".xml";
+
+			Console.traceln(Level.INFO, "   Saving as: " + target);
+
+			OutputStreamWriter writer;
+			try {
+				FileOutputStream fos = new FileOutputStream(target);
+				writer = new OutputStreamWriter(fos, "UTF-8");
+			} catch (IOException e) {
+				Console.printerrln(e.getMessage());
+				return;
+			}
+			try {
+				writer.write(content);
+				if (!content.endsWith("</sessions>")) {
+					writer.write("</sessions>");
+				}
+				writer.close();
+			} catch (IOException e) {
+				Console.printerrln(e.getMessage());
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#help()
+	 */
+	@Override
+	public String help() {
+		return "preprocessDirJFC <sourceDirectory> <targetDirectory>";
+	}
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDpreprocessJFC.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDpreprocessJFC.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/commands/CMDpreprocessJFC.java	(revision 906)
@@ -0,0 +1,97 @@
+package de.ugoe.cs.quest.plugin.jfc.commands;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * Command to pre-process files written by EventBench's JFCMonitor. The only
+ * task of the pre-processing is checking if the session was closed properly,
+ * i.e., if the XML file ends with a {@code </sessions>} tag. If this is not the
+ * case, the tag will be appended to the file.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class CMDpreprocessJFC implements Command {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@Override
+	public void run(List<Object> parameters) {
+		String source;
+		String target;
+		try {
+			source = (String) parameters.get(0);
+			target = (String) parameters.get(1);
+		} catch (Exception e) {
+			throw new IllegalArgumentException();
+		}
+
+		File file = new File(source);
+		InputStreamReader reader = null;
+		try {
+			FileInputStream fis = new FileInputStream(file);
+			reader = new InputStreamReader(fis, "UTF-16");
+		} catch (FileNotFoundException e) {
+			Console.printerrln(e.getMessage());
+			return;
+		} catch (UnsupportedEncodingException e) {
+			Console.printerrln(e.getMessage());
+			return;
+		}
+		char[] buffer = new char[(int) file.length()];
+		try {
+			reader.read(buffer);
+			reader.close();
+		} catch (IOException e) {
+			Console.printerrln(e.getMessage());
+			return;
+		}
+
+		String content = new String(buffer).trim();
+
+		OutputStreamWriter writer;
+		try {
+			FileOutputStream fos = new FileOutputStream(target);
+			writer = new OutputStreamWriter(fos, "UTF-8");
+		} catch (IOException e) {
+			Console.printerrln(e.getMessage());
+			return;
+		}
+		try {
+			writer.write(content);
+			if (!content.endsWith("</sessions>")) {
+				writer.write("</sessions>");
+			}
+			writer.close();
+		} catch (IOException e) {
+			Console.printerrln(e.getMessage());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#help()
+	 */
+	@Override
+	public String help() {
+		return "preprocessJFC <sourceFile> <targetFile>";
+	}
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/eventcore/JFCEventId.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/eventcore/JFCEventId.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/eventcore/JFCEventId.java	(revision 906)
@@ -0,0 +1,97 @@
+
+package de.ugoe.cs.quest.plugin.jfc.eventcore;
+
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+
+/**
+ * <p>
+ * Enumeration to deal with JFC event ids.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public enum JFCEventId {
+
+    MOUSE_CLICKED(MouseEvent.MOUSE_CLICKED), MOUSE_PRESSED(MouseEvent.MOUSE_PRESSED),
+    MOUSE_RELEASED(MouseEvent.MOUSE_RELEASED), MOUSE_MOVED(MouseEvent.MOUSE_MOVED), MOUSE_ENTERED(
+        MouseEvent.MOUSE_ENTERED), MOUSE_EXITED(MouseEvent.MOUSE_EXITED), MOUSE_DRAGGED(
+        MouseEvent.MOUSE_DRAGGED), MOUSE_WHEEL(MouseEvent.MOUSE_WHEEL), FOCUS_GAINED(
+        FocusEvent.FOCUS_GAINED), FOCUS_LOST(FocusEvent.FOCUS_LOST), KEY_TYPED(KeyEvent.KEY_TYPED),
+    KEY_PRESSED(KeyEvent.KEY_PRESSED), KEY_RELEASED(KeyEvent.KEY_RELEASED);
+
+    /**
+     * <p>
+     * Numerical representation of the event type.
+     * </p>
+     */
+    private int mNumber;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCEventId.
+     * </p>
+     * 
+     * @param number
+     *            numerical representation of the event type.
+     */
+    JFCEventId(int number) {
+        mNumber = number;
+    }
+
+    /**
+     * <p>
+     * Returns the numerical representation of the event type.
+     * </p>
+     * 
+     * @return the numerical representation
+     */
+    public int getNumber() {
+        return mNumber;
+    }
+
+    /**
+     * <p>
+     * Parses an {@link String} and returns the respective JFCEventId if possible.
+     * </p>
+     * 
+     * @param numberString
+     *            String representation of the event type
+     * @return created JFCEventId
+     * @throws IllegalArgumentException
+     *             thrown if there is no JFCEventId that correlates to numberString
+     */
+    public static JFCEventId parseEventId(String numberString) throws IllegalArgumentException {
+        try {
+            int number = Integer.parseInt(numberString);
+            return valueOf(number);
+        }
+        catch (NumberFormatException e) {
+            return JFCEventId.valueOf(JFCEventId.class, numberString);
+        }
+    }
+
+    /**
+     * <p>
+     * Returns the JFCEventId associated with an integer.
+     * </p>
+     * 
+     * @param number
+     *            integer to which the according JFCEventId is returned
+     * @return the JFCEventId
+     * @throws IllegalArgumentException
+     *             thrown if there is no JFCEventId that correlates to number
+     */
+    public static JFCEventId valueOf(int number) throws IllegalArgumentException {
+        for (JFCEventId type : JFCEventId.values()) {
+            if (type.mNumber == number) {
+                return type;
+            }
+        }
+
+        throw new IllegalArgumentException("there is no event type with number " + number);
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCButton.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCButton.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCButton.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IButton;
+
+/**
+ * <p>
+ * Class that represents buttons in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCButton extends JFCGUIElement implements IButton {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCButton.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCButton(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Button";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCCanvas.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCCanvas.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCCanvas.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ICanvas;
+
+/**
+ * <p>
+ * Class that represents canvas' in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCCanvas extends JFCGUIElement implements ICanvas {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCCanvas.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCCanvas(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Canvas";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCCheckBox.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCCheckBox.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCCheckBox.java	(revision 906)
@@ -0,0 +1,52 @@
+// Module    : $RCSfile: JFCCheckBox.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 03.09.2012 $
+// Project   : quest-plugin-jfc
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ICheckBox;
+
+/**
+ * <p>
+ * Class that represents check boxes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCCheckBox extends JFCGUIElement implements ICheckBox {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCCheckBox.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCCheckBox(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "CheckBox";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCComboBox.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCComboBox.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCComboBox.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IComboBox;
+
+/**
+ * <p>
+ * Class that represents combo boxes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCComboBox extends JFCGUIElement implements IComboBox {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCComboBox.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCComboBox(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "ComboBox";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCDialog.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCDialog.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCDialog.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IFrame;
+
+/**
+ * <p>
+ * Class that represents dialogs in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCDialog extends JFCGUIElement implements IFrame {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCDialog.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCDialog(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Dialog";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCFrame.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCFrame.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCFrame.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IFrame;
+
+/**
+ * <p>
+ * Class that represents frames in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCFrame extends JFCGUIElement implements IFrame {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCFrame.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCFrame(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Frame";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElement.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElement.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElement.java	(revision 906)
@@ -0,0 +1,164 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.AbstractDefaultGUIElement;
+import de.ugoe.cs.quest.eventcore.guimodel.IGUIElementSpec;
+
+/**
+ * <p>
+ * Base class for all JFC GUI elements.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCGUIElement extends AbstractDefaultGUIElement {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Specification of the GUI Element
+     * </p>
+     */
+    private JFCGUIElementSpec specification;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCGUIElement.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCGUIElement(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+        this.specification = specification;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IEventTarget#getPlatform()
+     */
+    @Override
+    public String getPlatform() {
+        return "JFC";
+    }
+
+    /**
+     * <p>
+     * Returns the type of the GUI element, i.e., the name of its Java class.
+     * </p>
+     * 
+     * @return the Java class name
+     */
+    public String getJavaType() {
+        return specification.getType();
+    }
+
+    /**
+     * <p>
+     * Returns the name of the GUI element.
+     * </p>
+     * 
+     * @return the name
+     */
+    String getName() {
+        return specification.getName();
+    }
+
+    /**
+     * <p>
+     * Returns the icon of the GUI element.
+     * </p>
+     * 
+     * @return the icon
+     */
+    String getIcon() {
+        return specification.getIcon();
+    }
+
+    /**
+     * <p>
+     * Returns the index of the GUI element.
+     * </p>
+     * 
+     * @return the index
+     */
+    int getIndex() {
+        return specification.getIndex();
+    }
+
+    /**
+     * <p>
+     * Returns the object hash of the GUI element.
+     * </p>
+     * 
+     * @return the object hash
+     */
+    int getElementHash() {
+        return specification.getElementHash();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * de.ugoe.cs.quest.eventcore.guimodel.IGUIElement#updateSpecification(de.ugoe.cs.quest.eventcore
+     * .guimodel.IGUIElementSpec)
+     */
+    @Override
+    public void updateSpecification(IGUIElementSpec updateSpecification) {
+        if (updateSpecification instanceof JFCGUIElementSpec) {
+            specification.update(((JFCGUIElementSpec) updateSpecification));
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String getStringIdentifier() {
+        String str = this.toString();
+        if (getParent() != null) {
+            return getParent().getStringIdentifier() + "->" + str;
+        }
+        return str;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        String str =
+            getElementDescriptor() + "(" + getName() + "," + getElementHash() + "," + getIcon() +
+                "," + getIndex() + ")";
+        return str;
+    }
+
+    /**
+     * <p>
+     * A short string describing the GUI element, e.g., Button, Canvas, or ScrollBar.
+     * </p>
+     * 
+     * @return short element descriptor
+     */
+    protected String getElementDescriptor() {
+        return "Default";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElementSpec.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElementSpec.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElementSpec.java	(revision 906)
@@ -0,0 +1,392 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections15.CollectionUtils;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.quest.eventcore.guimodel.IGUIElementSpec;
+
+/**
+ * <p>
+ * Implements the specification of {@link IGUIElement} for {@link JFCGUIElement}s.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCGUIElementSpec implements IGUIElementSpec {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Current name of the GUI element
+     * </p>
+     */
+    private String name;
+
+    /**
+     * <p>
+     * Previous names of the GUI element as it may have changed over time.
+     * </p>
+     */
+    private List<String> formerNames = new ArrayList<String>();
+
+    /**
+     * <p>
+     * Type of the GUI element, i.e., its Java class.
+     * </p>
+     */
+    private String type = null;
+
+    /**
+     * <p>
+     * Icon associated with the GUI element.
+     * </p>
+     */
+    private String icon = null;
+
+    /**
+     * <p>
+     * Index of the GUI element in its parent element.
+     * </p>
+     */
+    private int index = -1;
+
+    /**
+     * <p>
+     * Hash code of the window element. Used as unique identifier during its existence.
+     * </p>
+     */
+    private int elementHash = -1;
+
+    /**
+     * <p>
+     * Previous hashes of the window as the window may have been destroyed and recreated.
+     * </p>
+     */
+    private List<Integer> formerElementHashes = new ArrayList<Integer>();
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * de.ugoe.cs.quest.eventcore.guimodel.IGUIElementSpec#getSecificationSimilarity(IGUIElementSpec
+     * )
+     */
+    @Override
+    public boolean getSimilarity(IGUIElementSpec other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (!(other instanceof JFCGUIElementSpec)) {
+            return false;
+        }
+
+        JFCGUIElementSpec otherSpec = (JFCGUIElementSpec) other;
+
+        if ((type != otherSpec.type) && ((type != null) && (!type.equals(otherSpec.type)))) {
+            return false;
+        }
+
+        if ((icon != otherSpec.icon) && ((icon != null) && (!icon.equals(otherSpec.icon)))) {
+            return false;
+        }
+
+        // up to now, we compared, if the basics match. Now lets compare the id, the name and the
+        // index. All may change. The name may be reset (e.g. the title of a frame using the
+        // asterisk in the case data was changed). The id may change if e.g. a dialog is closed
+        // and reopend, i.e. a new instance is created. The index may change, if later in a panel
+        // a new element is added or another one is removed. If the element hash or the name stay
+        // the same, then similarity is given. Therefore these are the first two comparisons
+
+        if (elementHash == otherSpec.elementHash) {
+            return true;
+        }
+
+        if ((name != null) && (name.equals(otherSpec.name))) {
+            return true;
+        }
+
+        if ((((name == null) && (otherSpec.name == null)) || (("".equals(name)) && (""
+            .equals(otherSpec.name)))) &&
+            (formerNames.size() == 0) &&
+            (otherSpec.formerNames.size() == 0))
+        {
+            return true;
+        }
+
+        // if the id and the name did not stay the same, then the name should be checked first.
+        // One of all known names of one of the specs must be equal to one of the known names of the
+        // respective other spec for similarity. Furthermore, if this is given, the index should
+        // have stayed the same.
+
+        if ((otherSpec.name != null) && formerNames.contains(otherSpec.name)) {
+            return index == otherSpec.index;
+        }
+
+        if ((name != null) && otherSpec.formerNames.contains(name)) {
+            return index == otherSpec.index;
+        }
+
+        if (CollectionUtils.containsAny(formerNames, otherSpec.formerNames)) {
+            return index == otherSpec.index;
+        }
+
+        // ok. Even the names do not match. This is usually a clear indication, that the elements
+        // are distinct. However, we check, if the former ids matched. This is very unlikely
+        // to happen. But it may occur, if a GUI element does not have a name or its name stays
+        // the empty string and if this GUI element is created, destroyed, and created again.
+        // Again we are restrictive and request the index to be equal as well.
+
+        if (formerElementHashes.contains(otherSpec.elementHash)) {
+            return index == otherSpec.index;
+        }
+
+        if (otherSpec.formerElementHashes.contains(elementHash)) {
+            return index == otherSpec.index;
+        }
+
+        if (CollectionUtils.containsAny(formerElementHashes, otherSpec.formerElementHashes)) {
+            return index == otherSpec.index;
+        }
+
+        // now we can be really sure, that the GUI elements differ
+
+        return false;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.guimodel.IGUIElementSpec#equals(IGUIElementSpec)
+     */
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (!(other instanceof JFCGUIElementSpec)) {
+            return false;
+        }
+
+        JFCGUIElementSpec otherSpec = (JFCGUIElementSpec) other;
+
+        return ((name == otherSpec.name) || ((name != null) && (name.equals(otherSpec.name)))) &&
+            ((type == otherSpec.type) || ((type != null) && (type.equals(otherSpec.type)))) &&
+            ((icon == otherSpec.icon) || ((icon != null) && (icon.equals(otherSpec.icon)))) &&
+            (index == otherSpec.index) && (elementHash == otherSpec.elementHash);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return (name + type + icon + index + elementHash).hashCode();
+    }
+
+    /**
+     * <p>
+     * Returns the name of the specified GUI element.
+     * </p>
+     * 
+     * @return the name
+     */
+    public String getName() {
+        StringBuffer names = new StringBuffer();
+
+        if (name != null) {
+            names.append('"');
+            names.append(name);
+            names.append('"');
+        }
+        else {
+            names.append("NOT_SET");
+        }
+
+        if (formerNames.size() > 0) {
+
+            names.append(" (aka ");
+
+            for (int i = 0; i < formerNames.size(); i++) {
+                if (i > 0) {
+                    names.append("/");
+                }
+
+                names.append('"');
+                names.append(formerNames.get(i));
+                names.append('"');
+            }
+
+            names.append(")");
+        }
+
+        return names.toString();
+    }
+
+    /**
+     * <p>
+     * Returns the title of the specified GUI element.
+     * </p>
+     * 
+     * @return the title
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * <p>
+     * Returns the icon associated with the specified GUI element.
+     * </p>
+     * 
+     * @return the icon
+     */
+    public String getIcon() {
+        return icon;
+    }
+
+    /**
+     * <p>
+     * Returns the index of the specified GUI element in its parent element.
+     * </p>
+     * 
+     * @return the index
+     */
+    public int getIndex() {
+        return index;
+    }
+
+    /**
+     * <p>
+     * Returns the object hash of the specified GUI element.
+     * </p>
+     * 
+     * @return the elementHash
+     */
+    public int getElementHash() {
+        return elementHash;
+    }
+
+    /**
+     * <p>
+     * Sets the name of the specified GUI element.
+     * </p>
+     * 
+     * @param newName
+     *            the name
+     */
+    public void setName(String newName) {
+        if ((this.name != null) && (!this.name.equals(newName)) &&
+            (!this.formerNames.contains(this.name)))
+        {
+            this.formerNames.add(this.name);
+        }
+
+        this.name = newName;
+    }
+
+    /**
+     * <p>
+     * Sets the type of the specified GUI element.
+     * </p>
+     * 
+     * @param type
+     *            the type
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * <p>
+     * Sets the icon associated with the specified GUI element.
+     * </p>
+     * 
+     * @param icon
+     *            the icon
+     */
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    /**
+     * <p>
+     * Sets the index in its parent element of the specified GUI element.
+     * </p>
+     * 
+     * @param index
+     *            the index
+     */
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    /**
+     * <p>
+     * Sets the object hash of the specified GUI element.
+     * </p>
+     * 
+     * @param newElementHash
+     *            the element hash
+     */
+    public void setElementHash(int newElementHash) {
+        if ((this.elementHash > -1) && !this.formerElementHashes.contains(this.elementHash)) {
+            this.formerElementHashes.add(this.elementHash);
+        }
+
+        this.elementHash = newElementHash;
+    }
+
+    /**
+     * <p>
+     * Updates the specification with another specification.
+     * </p>
+     * 
+     * @param furtherSpec
+     *            specification used to update the current specification
+     */
+    void update(JFCGUIElementSpec other) {
+        if (other != this) {
+            for (int formerElementHash : other.formerElementHashes) {
+                setElementHash(formerElementHash);
+            }
+
+            if (elementHash != other.elementHash) {
+                elementHash = other.elementHash;
+            }
+
+            for (String formerName : other.formerNames) {
+                setName(formerName);
+            }
+
+            if ((name != other.name) && (name != null) && (!name.equals(other.name))) {
+                setName(other.name);
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return "[" + getName() + ";\"" + type + "\";\"" + icon + "\";" + index + ";" + elementHash +
+            "]";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCListBox.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCListBox.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCListBox.java	(revision 906)
@@ -0,0 +1,52 @@
+// Module    : $RCSfile: JFCListBox.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 03.09.2012 $
+// Project   : quest-plugin-jfc
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IListBox;
+
+/**
+ * <p>
+ * Class that represents list boxes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCListBox extends JFCGUIElement implements IListBox {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCListBox.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCListBox(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "List";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenu.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenu.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenu.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IMenu;
+
+/**
+ * <p>
+ * Class that represents menus in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCMenu extends JFCGUIElement implements IMenu {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCMenu.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCMenu(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Menu";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenuBar.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenuBar.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenuBar.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IMenuBar;
+
+/**
+ * <p>
+ * Class that menu bar buttons in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCMenuBar extends JFCMenu implements IMenuBar {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCMenuBar.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCMenuBar(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCMenu#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "MenuBar";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenuButton.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenuButton.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCMenuButton.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IMenuButton;
+
+/**
+ * <p>
+ * Class that represents menu buttons in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCMenuButton extends JFCButton implements IMenuButton {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCMenuButton.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCMenuButton(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCButton#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "MenuButton";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCPanel.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCPanel.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCPanel.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IPanel;
+
+/**
+ * <p>
+ * Class that represents panels in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCPanel extends JFCGUIElement implements IPanel {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCPanel.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCPanel(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Panel";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCRadioButton.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCRadioButton.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCRadioButton.java	(revision 906)
@@ -0,0 +1,52 @@
+// Module    : $RCSfile: JFCRadioButton.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 03.09.2012 $
+// Project   : quest-plugin-jfc
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IRadioButton;
+
+/**
+ * <p>
+ * Class that represents radio buttons in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCRadioButton extends JFCGUIElement implements IRadioButton {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCRadioButton.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCRadioButton(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "RadioButton";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCScrollBar.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCScrollBar.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCScrollBar.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IScrollBar;
+
+/**
+ * <p>
+ * Class that represents scroll bars in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCScrollBar extends JFCGUIElement implements IScrollBar {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCScrollBar.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCScrollBar(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "ScrollBar";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCScrollPane.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCScrollPane.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCScrollPane.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IScrollPane;
+
+/**
+ * <p>
+ * Class that represents scroll panes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCScrollPane extends JFCGUIElement implements IScrollPane {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCScrollPane.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCScrollPane(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "ScrollPane";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCShape.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCShape.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCShape.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IShape;
+
+/**
+ * <p>
+ * Class that represents shapes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCShape extends JFCGUIElement implements IShape {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCShape.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCShape(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Shape";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCSplitPane.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCSplitPane.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCSplitPane.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ISplitPane;
+
+/**
+ * <p>
+ * Class that represents split panes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCSplitPane extends JFCGUIElement implements ISplitPane {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCSplitPane.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCSplitPane(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "SplitPane";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTabbedPane.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTabbedPane.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTabbedPane.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ITabbedPane;
+
+/**
+ * <p>
+ * Class that represents tabbed panes in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCTabbedPane extends JFCGUIElement implements ITabbedPane {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCTabbedPane.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCTabbedPane(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "TabbedPane";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTable.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTable.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTable.java	(revision 906)
@@ -0,0 +1,52 @@
+// Module    : $RCSfile: JFCTable.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 03.09.2012 $
+// Project   : quest-plugin-jfc
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ITable;
+
+/**
+ * <p>
+ * Class that represents tables in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCTable extends JFCGUIElement implements ITable {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCTable.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCTable(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Table";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTextArea.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTextArea.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTextArea.java	(revision 906)
@@ -0,0 +1,47 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ITextField;
+
+/**
+ * <p>
+ * Class that represents text areas in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCTextArea extends JFCGUIElement implements ITextField {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCTextArea.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCTextArea(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "TextArea";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTextField.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTextField.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTextField.java	(revision 906)
@@ -0,0 +1,47 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ITextField;
+
+/**
+ * <p>
+ * Class that represents text fields in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCTextField extends JFCGUIElement implements ITextField {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCTextField.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCTextField(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "TextField";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCToolBar.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCToolBar.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCToolBar.java	(revision 906)
@@ -0,0 +1,48 @@
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.IToolBar;
+
+/**
+ * <p>
+ * Class that represents toolbars in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCToolBar extends JFCGUIElement implements IToolBar {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCToolBar.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCToolBar(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "ToolBar";
+    }
+
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTree.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTree.java	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCTree.java	(revision 906)
@@ -0,0 +1,52 @@
+// Module    : $RCSfile: JFCTree.java,v $
+// Version   : $Revision: 0.0 $  $Author: pharms $  $Date: 03.09.2012 $
+// Project   : quest-plugin-jfc
+// Creation  : 2012 by pharms
+// Copyright : Patrick Harms, 2012
+
+package de.ugoe.cs.quest.plugin.jfc.guimodel;
+
+import de.ugoe.cs.quest.eventcore.guimodel.ITree;
+
+/**
+ * <p>
+ * Class that represents trees in JFC GUIs.
+ * </p>
+ * 
+ * @version 1.0
+ * @author Patrick Harms
+ */
+public class JFCTree extends JFCGUIElement implements ITree {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Constructor. Creates a new JFCTree.
+     * </p>
+     * 
+     * @param specification
+     *            specification of created GUI element
+     * @param parent
+     *            parent of the created GUI element; null means that the element is a top-level
+     *            window
+     */
+    public JFCTree(JFCGUIElementSpec specification, JFCGUIElement parent) {
+        super(specification, parent);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.plugin.jfc.guimodel.JFCGUIElement#getElementDescriptor()
+     */
+    @Override
+    protected String getElementDescriptor() {
+        return "Tree";
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/resources/manuals/correctDirOldJFC
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/resources/manuals/correctDirOldJFC	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/resources/manuals/correctDirOldJFC	(revision 906)
@@ -0,0 +1,9 @@
+corrects older JFC log files contained in a directory which sometimes do not contain correct event
+sources. The result is another directory containing the corrected log files.
+
+$USAGE$
+<sourcedirectory> name of the source directory containing the older JFC log file
+<destinationdirectory> name of the destination directory into which the corrected log files shall be stored. Must not be equal to the sourcedirectory
+
+Example(s):
+correctDirOldJFC usagedata/jfc_old usagedata/jfc_new
Index: /trunk/autoquest-plugin-jfc/src/main/resources/manuals/correctOldJFC
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/resources/manuals/correctOldJFC	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/resources/manuals/correctOldJFC	(revision 906)
@@ -0,0 +1,8 @@
+corrects an older JFC log file which sometimes does not contain correct event sources
+
+$USAGE$
+<inputfilename> name of the older JFC log file
+<outputfilename> name of the new JFC log file to write the results into. Must not be equal to the inputfilename
+
+Example(s):
+correctOldJFC usagedata/jfc/jfclog_01.xml usagedata/jfc/jfclog_01_corrected.xml
Index: /trunk/autoquest-plugin-jfc/src/main/resources/manuals/parseDirJFC
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/resources/manuals/parseDirJFC	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/resources/manuals/parseDirJFC	(revision 906)
@@ -0,0 +1,9 @@
+Loads sequences from a directory that contains JFC log files. The directory must not contain any other files!
+
+$USAGE$
+<directory> directory where the log files are located
+<sequencesName> optional; name of the sequences; default: sequences
+
+Example(s):
+parseDirJFC usagedata/jfc
+parseDirJFC usagedata/jfc jfc_sequences
Index: /trunk/autoquest-plugin-jfc/src/main/resources/manuals/parseJFC
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/resources/manuals/parseJFC	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/resources/manuals/parseJFC	(revision 906)
@@ -0,0 +1,9 @@
+Loads sequences from a JFC log file.
+
+$USAGE$
+<filename> name of the JFC log file
+<sequencesName> optional; name of the sequences; default: sequences
+
+Example(s):
+parseJFC usagedata/jfc/jfclog_01.xml
+parseJFC usagedata/jfcjfclog_01.xml jfc_sequences
Index: /trunk/autoquest-plugin-jfc/src/main/resources/manuals/preprocessDirJFC
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/resources/manuals/preprocessDirJFC	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/resources/manuals/preprocessDirJFC	(revision 906)
@@ -0,0 +1,8 @@
+Pre-processes files created by the JFCMonitor into the JFC log format expected by parseDirJFC and parseJFC. The command processes all files in a directory and stores the pre-processed files in another directory.
+
+$USAGE$
+<sourceDirectory> directory where the files to be pre-processed are located
+<targetDirectory> directory for the processed files
+
+Example(s):
+preprocessDirJFC usagedata/jfcraw usagedata/jfc
Index: /trunk/autoquest-plugin-jfc/src/main/resources/manuals/preprocessJFC
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/resources/manuals/preprocessJFC	(revision 906)
+++ /trunk/autoquest-plugin-jfc/src/main/resources/manuals/preprocessJFC	(revision 906)
@@ -0,0 +1,8 @@
+Pre-processes a file created by the JFCMonitor into the JFC log format expected by parseDirJFC and parseJFC.
+
+$USAGE$
+<sourceFile> file to be pre-processed
+<targetFile> processed file
+
+Example(s):
+preprocessDirJFC usagedata/jfcraw/jfclograw_01 usagedata/jfc/jfclog_01.xml
