Index: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/WeblogParser.java
===================================================================
--- trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/WeblogParser.java	(revision 488)
+++ trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/WeblogParser.java	(revision 554)
@@ -16,5 +16,10 @@
 import java.util.Set;
 
-import de.ugoe.cs.quest.plugin.php.eventcore.WebEvent;
+import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.eventcore.IEventTarget;
+import de.ugoe.cs.quest.eventcore.IEventType;
+import de.ugoe.cs.quest.plugin.php.eventcore.PHPEventTarget;
+import de.ugoe.cs.quest.plugin.php.eventcore.PHPEventType;
+import de.ugoe.cs.quest.plugin.php.eventcore.WebRequest;
 import de.ugoe.cs.util.FileTools;
 import de.ugoe.cs.util.console.Console;
@@ -67,5 +72,5 @@
 	 * </p>
 	 */
-	private List<List<WebEvent>> sequences;
+	private List<List<Event>> sequences;
 
 	/**
@@ -90,5 +95,5 @@
 	 * </p>
 	 */
-	private List<Collection<List<WebEvent>>> sequencesFrequentUsers;
+	private List<Collection<List<Event>>> sequencesFrequentUsers;
 
 	/**
@@ -145,5 +150,5 @@
 	 * @return generated event sequences
 	 */
-	public Collection<List<WebEvent>> getSequences() {
+	public Collection<List<Event>> getSequences() {
 		return sequences;
 	}
@@ -232,5 +237,5 @@
 	 * @return list of the sequences of all frequent users
 	 */
-	public List<Collection<List<WebEvent>>> getFrequentUserSequences() {
+	public List<Collection<List<Event>>> getFrequentUserSequences() {
 		return sequencesFrequentUsers;
 	}
@@ -255,4 +260,6 @@
 
 		Map<String, List<Integer>> cookieSessionMap = new HashMap<String, List<Integer>>();
+		Map<String, Long> cookieTimestampMap = new HashMap<String, Long>();
+		
 		int lastId = -1;
 
@@ -261,5 +268,5 @@
 		loadRobotRegex();
 
-		sequences = new ArrayList<List<WebEvent>>();
+		sequences = new ArrayList<List<Event>>();
 		users = new ArrayList<String>();
 
@@ -298,6 +305,8 @@
 					List<String> getVars = extractGetVarsFromUri(uri);
 					
-					WebEvent event = new WebEvent(url, path, timestamp,
-							postedVars, getVars);
+					IEventType type = new PHPEventType(path, postedVars, getVars);
+					IEventTarget target = new PHPEventTarget(path);
+					Event event = new Event(type, target);
+					event.addReplayable(new WebRequest(url, path, postedVars, getVars));
 
 					// find session and add event
@@ -308,19 +317,18 @@
 						sessionIds.add(++lastId);
 						cookieSessionMap.put(cookie, sessionIds);
-						sequences.add(new LinkedList<WebEvent>());
+						sequences.add(new LinkedList<Event>());
 						users.add(cookie);
 					}
 					Integer lastSessionIndex = sessionIds
 							.get(sessionIds.size() - 1);
-					List<WebEvent> lastSession = sequences
+					List<Event> lastSession = sequences
 							.get(lastSessionIndex);
 					long lastEventTime = timestamp;
 					if (!lastSession.isEmpty()) {
-						lastEventTime = lastSession.get(lastSession.size() - 1)
-								.getTimestamp();
+						lastEventTime = cookieTimestampMap.get(cookie);
 					}
 					if (timestamp - lastEventTime > timeout) {
 						sessionIds.add(++lastId);
-						List<WebEvent> newSession = new LinkedList<WebEvent>();
+						List<Event> newSession = new LinkedList<Event>();
 						newSession.add(event);
 						sequences.add(newSession);
@@ -329,4 +337,5 @@
 						lastSession.add(event);
 					}
+					cookieTimestampMap.put(cookie, timestamp);
 				} catch (URISyntaxException e) {
 					Console.traceln("Ignored line " + lineCounter + ": "
@@ -358,5 +367,5 @@
 	private void generateFrequentUserSequences(Set<String> uniqueUsers) {
 		frequentUsers = new ArrayList<String>();
-		sequencesFrequentUsers = new ArrayList<Collection<List<WebEvent>>>();
+		sequencesFrequentUsers = new ArrayList<Collection<List<Event>>>();
 		for (String user : uniqueUsers) {
 			List<String> tmp = new ArrayList<String>();
@@ -367,5 +376,5 @@
 			if (size >= frequentUsersThreshold) {
 				frequentUsers.add(user);
-				Collection<List<WebEvent>> sequencesUser = new ArrayList<List<WebEvent>>();
+				Collection<List<Event>> sequencesUser = new ArrayList<List<Event>>();
 				for (int i = 0; i < sequences.size(); i++) {
 					if (users.get(i).equals(user)) {
Index: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/commands/CMDloadWebSequences.java
===================================================================
--- trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/commands/CMDloadWebSequences.java	(revision 488)
+++ trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/commands/CMDloadWebSequences.java	(revision 554)
@@ -9,6 +9,6 @@
 
 import de.ugoe.cs.quest.CommandHelpers;
+import de.ugoe.cs.quest.eventcore.Event;
 import de.ugoe.cs.quest.plugin.php.WeblogParser;
-import de.ugoe.cs.quest.plugin.php.eventcore.WebEvent;
 import de.ugoe.cs.quest.ui.GlobalDataContainer;
 import de.ugoe.cs.util.console.Command;
@@ -93,5 +93,5 @@
 		if (generateFrequentUsers) {
 			List<String> frequentUserIDs = parser.getFrequentUsers();
-			List<Collection<List<WebEvent>>> frequentUserSessions = parser
+			List<Collection<List<Event>>> frequentUserSessions = parser
 					.getFrequentUserSequences();
 			for (int i = 0; i < frequentUserIDs.size(); i++) {
Index: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/PHPEventTarget.java
===================================================================
--- trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/PHPEventTarget.java	(revision 554)
+++ trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/PHPEventTarget.java	(revision 554)
@@ -0,0 +1,62 @@
+
+package de.ugoe.cs.quest.plugin.php.eventcore;
+
+import de.ugoe.cs.quest.eventcore.IEventTarget;
+
+/**
+ * <p>
+ * Event target for PHP web requests.
+ * </p>
+ * 
+ * @version $Revision: $ $Date: Aug 16, 2012$
+ * @author 2012, last modified by $Author: sherbold$
+ */
+public class PHPEventTarget implements IEventTarget {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Path of the PHP request.
+     * </p>
+     */
+    private String path;
+
+    /**
+     * <p>
+     * Constructor. Creates a new PHP event target as the path of the request.
+     * </p>
+     * 
+     * @param path
+     *            path of the URI of the event
+     */
+    public PHPEventTarget(String path) {
+        this.path = path;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IEventTarget#getPlatform()
+     */
+    @Override
+    public String getPlatform() {
+        return "PHP";
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return path;
+    }
+
+}
Index: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/PHPEventType.java
===================================================================
--- trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/PHPEventType.java	(revision 554)
+++ trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/PHPEventType.java	(revision 554)
@@ -0,0 +1,97 @@
+// Module    : $RCSfile: PHPEventType.java,v $
+// Version   : $Revision: 0.0 $  $Author: sherbold $  $Date: Aug 16, 2012 $
+// Project   : quest-ui-core
+// Creation  : 2012 by sherbold
+// Copyright : Patrick Harms, 2012
+
+package de.ugoe.cs.quest.plugin.php.eventcore;
+
+import java.util.List;
+
+import de.ugoe.cs.quest.eventcore.IEventType;
+
+/**
+ * <p>
+ * Event type for PHP web requests.
+ * </p>
+ * 
+ * @version $Revision: $ $Date: Aug 16, 2012$
+ * @author 2012, last modified by $Author: sherbold$
+ */
+public class PHPEventType implements IEventType {
+
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * <p>
+     * Path of the web request.
+     * </p>
+     */
+    private String path;
+
+    /**
+     * <p>
+     * List of post variable names posted with the request.
+     * </p>
+     */
+    private List<String> postVars;
+
+    /**
+     * <p>
+     * List of get variable names posted with the request.
+     * </p>
+     */
+    private List<String> getVars;
+
+    /**
+     * <p>
+     * Constructor. Creates a new PHPEventType from a given path, a list of post variables, and a
+     * list of get variables.
+     * </p>
+     * 
+     * @param path
+     *            path of the URI of the event
+     * @param postVars
+     *            POST variables send with the event
+     * @param getVars
+     *            GET variables send with the event
+     */
+    public PHPEventType(String path, List<String> postVars, List<String> getVars) {
+        this.path = path;
+        this.postVars = postVars;
+        this.getVars = getVars;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IEventType#getName()
+     */
+    @Override
+    public String getName() {
+        return "PHPEventType";
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        String str = path;
+        if (getVars != null && !getVars.isEmpty()) {
+            str += "+GET" + getVars.toString().replace(" ", "");
+        }
+        if (postVars != null && !postVars.isEmpty()) {
+            str += "+POST" + postVars.toString().replace(" ", "");
+        }
+        return str;
+    }
+
+}
Index: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/WebEvent.java
===================================================================
--- trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/WebEvent.java	(revision 488)
+++ 	(revision )
@@ -1,108 +1,0 @@
-package de.ugoe.cs.quest.plugin.php.eventcore;
-
-import java.util.List;
-
-import de.ugoe.cs.quest.eventcore.ReplayableEvent;
-
-/**
- * <p>
- * This class defines web events (of PHP-based web applications).
- * </p>
- * 
- * @author Steffen Herbold
- * @version 1.0
- * 
- */
-public class WebEvent extends ReplayableEvent<WebRequest> {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <p>
-	 * Timestamp of the event.
-	 * </p>
-	 */
-	private final long timestamp;
-
-	/**
-	 * <p>
-	 * Helper method that generates the type of the event based on the of the
-	 * URI, the POST variables, and the GET variables.
-	 * </p>
-	 * 
-	 * @param path
-	 *            path of the URI of the event
-	 * @param postVars
-	 *            POST variables send with the event
-	 * @param getVars
-	 *            GET variables send with the event
-	 * @return type of the event
-	 */
-	private final static String makeType(String path, List<String> postVars,
-			List<String> getVars) {
-		String type = path;
-		if (getVars != null && !getVars.isEmpty()) {
-			type += "+GET" + getVars.toString().replace(" ", "");
-		}
-		if (postVars != null && !postVars.isEmpty()) {
-			type += "+POST" + postVars.toString().replace(" ", "");
-		}
-		return type;
-	}
-
-	/**
-	 * <p>
-	 * Constructor. Creates a new WebEvent.
-	 * </p>
-	 * 
-	 * @param url
-	 *            URL of the server that received the event
-	 * @param path
-	 *            path of the URI
-	 * @param timestamp
-	 *            timestamp of when the event took place
-	 * @param postVars
-	 *            POST variables send with the event
-	 * @param getVars
-	 *            GET variables send with the event
-	 */
-	public WebEvent(String url, String path, long timestamp,
-			List<String> postVars, List<String> getVars) {
-		super(makeType(path, postVars, getVars));
-		this.timestamp = timestamp;
-		super.setTarget(path);
-		addReplayEvent(new WebRequest(url, path, postVars, getVars));
-	}
-
-	/**
-	 * <p>
-	 * Returns the timestamp of the event.
-	 * </p>
-	 * 
-	 * @return timestamp of th event
-	 */
-	public long getTimestamp() {
-		return timestamp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see de.ugoe.cs.quest.eventcore.ReplayableEvent#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object other) {
-		return super.equals(other);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see de.ugoe.cs.quest.eventcore.ReplayableEvent#hashCode()
-	 */
-	@Override
-	public int hashCode() {
-		return super.hashCode();
-	}
-
-}
Index: trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/WebRequest.java
===================================================================
--- trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/WebRequest.java	(revision 488)
+++ trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/WebRequest.java	(revision 554)
@@ -1,2 +1,3 @@
+
 package de.ugoe.cs.quest.plugin.php.eventcore;
 
@@ -8,12 +9,10 @@
 /**
  * <p>
- * Contains all information related to a web request, i.e., the path, the POST
- * variables and the GET variables. The generated replay are for the command
- * line tool {@code curl}. The requests do not contain correct values for the
- * POST and GET request. Instead, only the parameters that are part of the
- * requests are added and the values of the parameters are
- * DATA_$PARAMNAME$_DATA, where $PARAMNAME$ is the upper case string of the
- * parameter name. This allows test data generators to insert concrete values,
- * as EventBench does not include a test data generator for web software.
+ * Contains all information related to a web request, i.e., the path, the POST variables and the GET
+ * variables. The generated replay are for the command line tool {@code curl}. The requests do not
+ * contain correct values for the POST and GET request. Instead, only the parameters that are part
+ * of the requests are added and the values of the parameters are DATA_$PARAMNAME$_DATA, where
+ * $PARAMNAME$ is the upper case string of the parameter name. This allows test data generators to
+ * insert concrete values, as EventBench does not include a test data generator for web software.
  * </p>
  * 
@@ -23,150 +22,139 @@
 public class WebRequest implements IReplayable {
 
-	/**
-	 * <p>
-	 * Id for object serialization.
-	 * </p>
-	 */
-	private static final long serialVersionUID = 1L;
+    /**
+     * <p>
+     * Id for object serialization.
+     * </p>
+     */
+    private static final long serialVersionUID = 1L;
 
-	/**
-	 * <p>
-	 * POST variables of the web request.
-	 * </p>
-	 */
-	List<String> postVars;
+    /**
+     * <p>
+     * POST variables of the web request.
+     * </p>
+     */
+    List<String> postVars;
 
-	/**
-	 * <p>
-	 * GET variables of the web request.
-	 * </p>
-	 */
-	List<String> getVars;
+    /**
+     * <p>
+     * GET variables of the web request.
+     * </p>
+     */
+    List<String> getVars;
 
-	/**
-	 * <p>
-	 * URI of the web request.
-	 * </p>
-	 */
-	String targetUri;
+    /**
+     * <p>
+     * URI of the web request.
+     * </p>
+     */
+    String targetUri;
 
-	/**
-	 * <p>
-	 * URL of the server.
-	 * </p>
-	 */
-	String serverUrl;
+    /**
+     * <p>
+     * URL of the server.
+     * </p>
+     */
+    String serverUrl;
 
-	/**
-	 * <p>
-	 * Constructor. Creates a new WebRequest.
-	 * </p>
-	 * 
-	 * @param uri
-	 *            URI of the request
-	 * @param postVars
-	 *            POST variables of the request
-	 * @param getVars
-	 *            GET variables of the request
-	 */
-	public WebRequest(String url, String uri, List<String> postVars,
-			List<String> getVars) {
-		serverUrl = url;
-		targetUri = uri;
-		this.postVars = new ArrayList<String>(postVars); // defensive copy
-		this.getVars = new ArrayList<String>(getVars);
-	}
+    /**
+     * <p>
+     * Constructor. Creates a new WebRequest.
+     * </p>
+     * 
+     * @param uri
+     *            URI of the request
+     * @param postVars
+     *            POST variables of the request
+     * @param getVars
+     *            GET variables of the request
+     */
+    public WebRequest(String url, String uri, List<String> postVars, List<String> getVars) {
+        serverUrl = url;
+        targetUri = uri;
+        this.postVars = new ArrayList<String>(postVars); // defensive copy
+        this.getVars = new ArrayList<String>(getVars);
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see de.ugoe.cs.quest.eventcore.IReplayable#getReplay()
-	 */
-	@Override
-	public String getReplay() {
-		StringBuilder builder = new StringBuilder();
-		builder.append("curl");
-		if (!postVars.isEmpty()) {
-			boolean isFirstPost = true;
-			for (String postVar : postVars) {
-				if (isFirstPost) {
-					builder.append(" --data \"");
-					isFirstPost = false;
-				} else {
-					builder.append('&');
-				}
-				builder.append(postVar + "=DATA_" + postVar.toUpperCase()
-						+ "_DATA");
-			}
-			builder.append('\"');
-		}
-		builder.append(' ');
-		if (serverUrl != null) {
-			builder.append(serverUrl);
-		}
-		builder.append(targetUri);
-		if (!getVars.isEmpty()) {
-			boolean isFirstGet = true;
-			for (String getVar : getVars) {
-				if (isFirstGet) {
-					builder.append('?');
-					isFirstGet = false;
-				} else {
-					builder.append('&');
-				}
-				builder.append(getVar + "=DATA_" + getVar.toUpperCase()
-						+ "_DATA");
-			}
-		}
-		return builder.toString();
-	}
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IReplayable#getReplay()
+     */
+    @Override
+    public String getReplay() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("curl");
+        if (!postVars.isEmpty()) {
+            boolean isFirstPost = true;
+            for (String postVar : postVars) {
+                if (isFirstPost) {
+                    builder.append(" --data \"");
+                    isFirstPost = false;
+                }
+                else {
+                    builder.append('&');
+                }
+                builder.append(postVar + "=DATA_" + postVar.toUpperCase() + "_DATA");
+            }
+            builder.append('\"');
+        }
+        builder.append(' ');
+        if (serverUrl != null) {
+            builder.append(serverUrl);
+        }
+        builder.append(targetUri);
+        if (!getVars.isEmpty()) {
+            boolean isFirstGet = true;
+            for (String getVar : getVars) {
+                if (isFirstGet) {
+                    builder.append('?');
+                    isFirstGet = false;
+                }
+                else {
+                    builder.append('&');
+                }
+                builder.append(getVar + "=DATA_" + getVar.toUpperCase() + "_DATA");
+            }
+        }
+        return builder.toString();
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see de.ugoe.cs.quest.eventcore.IReplayable#getTarget()
-	 */
-	@Override
-	public String getTarget() {
-		return targetUri;
-	}
+    /**
+     * <p>
+     * Two {@link WebRequest}s are equal, if their {@link #targetUri}, {@link #postVars}, and
+     * {@link #getVars} are equal.
+     * </p>
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (other instanceof WebRequest) {
+            return targetUri.equals(((WebRequest) other).targetUri) &&
+                postVars.equals(((WebRequest) other).postVars) &&
+                getVars.equals(((WebRequest) other).getVars);
+        }
+        return false;
+    }
 
-	/**
-	 * <p>
-	 * Two {@link WebRequest}s are equal, if their {@link #targetUri},
-	 * {@link #postVars}, and {@link #getVars} are equal.
-	 * </p>
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object other) {
-		if (this == other) {
-			return true;
-		}
-		if (other instanceof WebRequest) {
-			return targetUri.equals(((WebRequest) other).targetUri)
-					&& postVars.equals(((WebRequest) other).postVars)
-					&& getVars.equals(((WebRequest) other).getVars);
-		}
-		return false;
-	}
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        int multiplier = 17;
+        int hash = 42;
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	@Override
-	public int hashCode() {
-		int multiplier = 17;
-		int hash = 42;
+        hash = multiplier * hash + targetUri.hashCode();
+        hash = multiplier * hash + postVars.hashCode();
+        hash = multiplier * hash + getVars.hashCode();
 
-		hash = multiplier * hash + targetUri.hashCode();
-		hash = multiplier * hash + postVars.hashCode();
-		hash = multiplier * hash + getVars.hashCode();
-
-		return hash;
-	}
+        return hash;
+    }
 
 }
