Index: /trunk/quest-core-assertions/src/main/java/de/ugoe/cs/quest/assertions/FileEqualsReplay.java
===================================================================
--- /trunk/quest-core-assertions/src/main/java/de/ugoe/cs/quest/assertions/FileEqualsReplay.java	(revision 559)
+++ /trunk/quest-core-assertions/src/main/java/de/ugoe/cs/quest/assertions/FileEqualsReplay.java	(revision 560)
@@ -4,4 +4,5 @@
 import java.security.InvalidParameterException;
 
+import de.ugoe.cs.quest.IReplayDecorator;
 import de.ugoe.cs.quest.eventcore.IReplayable;
 import de.ugoe.cs.util.StringTools;
@@ -79,3 +80,13 @@
     }
 
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IReplayable#getDecorator()
+     */
+    @Override
+    public IReplayDecorator getDecorator() {
+        return null;
+    }
+
 }
Index: /trunk/quest-core-assertions/src/main/java/de/ugoe/cs/quest/assertions/TextEqualsReplay.java
===================================================================
--- /trunk/quest-core-assertions/src/main/java/de/ugoe/cs/quest/assertions/TextEqualsReplay.java	(revision 559)
+++ /trunk/quest-core-assertions/src/main/java/de/ugoe/cs/quest/assertions/TextEqualsReplay.java	(revision 560)
@@ -4,4 +4,5 @@
 import java.security.InvalidParameterException;
 
+import de.ugoe.cs.quest.IReplayDecorator;
 import de.ugoe.cs.quest.eventcore.IReplayable;
 import de.ugoe.cs.util.StringTools;
@@ -92,3 +93,13 @@
     }
 
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IReplayable#getDecorator()
+     */
+    @Override
+    public IReplayDecorator getDecorator() {
+        return null;
+    }
+
 }
Index: /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/IReplayable.java
===================================================================
--- /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/IReplayable.java	(revision 559)
+++ /trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/IReplayable.java	(revision 560)
@@ -2,4 +2,6 @@
 
 import java.io.Serializable;
+
+import de.ugoe.cs.quest.IReplayDecorator;
 
 /**
@@ -24,3 +26,12 @@
 	 */
 	String getReplay();
+	
+	/**
+	 * <p>
+	 * Returns the replay decorator associated with the replayable. Returns null if no replay decorator is associated with the replayable.
+	 * </p>
+	 *
+	 * @return replay decorator
+	 */
+	IReplayDecorator getDecorator();
 }
Index: /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ReplayGenerator.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ReplayGenerator.java	(revision 559)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ReplayGenerator.java	(revision 560)
@@ -1,2 +1,3 @@
+
 package de.ugoe.cs.quest;
 
@@ -16,9 +17,8 @@
 /**
  * <p>
- * This class provides the functionality to generate replay files from sequences
- * if {@link ReplayableEvent}s.
+ * This class provides the functionality to generate replay files from sequences if
+ * {@link ReplayableEvent}s.
  * </p>
  * 
- * TODO: Figure our how to handle {@link IReplayDecorator}
  * TODO: Add appropriate checks if Events are replayable
  * 
@@ -28,150 +28,163 @@
 public class ReplayGenerator {
 
-	/**
-	 * <p>
-	 * {@link IReplayDecorator} to be used. If this field is {@code null}, no
-	 * decorator is used. Default: {@code null}
-	 * </p>
-	 */
-	private IReplayDecorator decorator = null;
+    /**
+     * <p>
+     * {@link IReplayDecorator} to be used. If this field is {@code null}, no decorator is used.
+     * Default: {@code null}
+     * </p>
+     */
+    private IReplayDecorator decorator = null;
 
-	/**
-	 * <p>
-	 * Id of the current session. The starting id is 1.
-	 * </p>
-	 */
-	int sessionId = 1;
+    /**
+     * <p>
+     * Id of the current session. The starting id is 1.
+     * </p>
+     */
+    int sessionId = 1;
 
-	/**
-	 * <p>
-	 * Creates a replay file that contains multiple event sequences.
-	 * </p>
-	 * 
-	 * @param sequences
-	 *            collection of event sequences from which the sessions are
-	 *            generated
-	 * @param filename
-	 *            name and path of the replay file
-	 */
-	public void createLogfileMultipleSessions(
-			Collection<List<Event>> sequences, String filename) {
-		OutputStreamWriter writer = openReplayFile(filename);
-		if (writer != null) {
-			try {
-				decorator = sequences.iterator().next().get(0).getReplayDecorator();
-				if (decorator != null) {
-					writer.write(decorator.getHeader());
-				}
-				for (List<Event> actions : sequences) {
-					writeSession(actions, writer);
-				}
-				if (decorator != null) {
-					writer.write(decorator.getFooter());
-				}
-				decorator = null;
-				writer.close();
-			} catch (IOException e) {
-				Console.printerrln("Unable to write replay file " + filename);
-			}
-		}
-	}
+    /**
+     * <p>
+     * Creates a replay file that contains multiple event sequences.
+     * </p>
+     * 
+     * @param sequences
+     *            collection of event sequences from which the sessions are generated
+     * @param filename
+     *            name and path of the replay file
+     */
+    public void createLogfileMultipleSessions(Collection<List<Event>> sequences, String filename) {
+        OutputStreamWriter writer = openReplayFile(filename);
+        if (writer != null) {
+            try {
+                try {
+                    decorator =
+                        sequences.iterator().next().get(0).getReplayables().get(0).getDecorator();
+                }
+                catch (Exception e) {
+                    // in the above line, many things can go wrong: emtpy sequences, null
+                    // references, etc. However, all failures just indicate that no replay decorator
+                    // should be used, hence, we ignore the exception
+                }
+                if (decorator != null) {
+                    writer.write(decorator.getHeader());
+                }
+                for (List<Event> actions : sequences) {
+                    writeSession(actions, writer);
+                }
+                if (decorator != null) {
+                    writer.write(decorator.getFooter());
+                }
+                decorator = null;
+                writer.close();
+            }
+            catch (IOException e) {
+                Console.printerrln("Unable to write replay file " + filename);
+            }
+        }
+    }
 
-	/**
-	 * <p>
-	 * Creates a replay file that from a single event sequence.
-	 * </p>
-	 * 
-	 * @param actions
-	 *            event sequence from which the sessions are generated
-	 * @param filename
-	 *            name and path of the replay file
-	 */
-	public void createLogfileSingleSession(List<Event> actions,
-			String filename) {
-		OutputStreamWriter writer = openReplayFile(filename);
-		if (writer != null) {
-			try {
-				actions.get(0).getReplayDecorator();
-				if (decorator != null) {
-					writer.write(decorator.getHeader());
-				}
-				writeSession(actions, writer);
-				if (decorator != null) {
-					writer.write(decorator.getFooter());
-				}
-				decorator = null;
-				writer.close();
-			} catch (IOException e) {
-				Console.printerrln("Unable to write replay file " + filename);
-			}
-		}
-	}
+    /**
+     * <p>
+     * Creates a replay file that from a single event sequence.
+     * </p>
+     * 
+     * @param actions
+     *            event sequence from which the sessions are generated
+     * @param filename
+     *            name and path of the replay file
+     */
+    public void createLogfileSingleSession(List<Event> actions, String filename) {
+        OutputStreamWriter writer = openReplayFile(filename);
+        if (writer != null) {
+            try {
+                try {
+                    decorator = actions.get(0).getReplayables().get(0).getDecorator();
+                }
+                catch (Exception e) {
+                    // in the above line, many things can go wrong: emtpy sequences, null
+                    // references, etc. However, all failures just indicate that no replay decorator
+                    // should be used, hence, we ignore the exception
+                }
+                if (decorator != null) {
+                    writer.write(decorator.getHeader());
+                }
+                writeSession(actions, writer);
+                if (decorator != null) {
+                    writer.write(decorator.getFooter());
+                }
+                decorator = null;
+                writer.close();
+            }
+            catch (IOException e) {
+                Console.printerrln("Unable to write replay file " + filename);
+            }
+        }
+    }
 
-	/**
-	 * <p>
-	 * Helper function that opens the replay file for writing.
-	 * </p>
-	 * 
-	 * @param filename
-	 *            name and path of the replay file
-	 * @return {@link OutputStreamWriter} that writes to the replay file
-	 */
-	private OutputStreamWriter openReplayFile(String filename) {
-		File file = new File(filename);
-		boolean fileCreated;
-		try {
-			fileCreated = file.createNewFile();
-			if (!fileCreated) {
-				Console.traceln("Created logfile " + filename);
-			} else {
-				Console.traceln("Overwrote existing logfile " + filename);
-			}
-		} catch (IOException e) {
-			Console.printerrln("Unable to create file " + filename);
-			Console.logException(e);
-		}
-		OutputStreamWriter writer = null;
-		try {
-			writer = new OutputStreamWriter(new FileOutputStream(file),
-					"UTF-16");
-		} catch (IOException e) {
-			Console.printerrln("Unable to open file for writing (read-only file):"
-					+ filename);
-			Console.logException(e);
-		}
-		return writer;
-	}
+    /**
+     * <p>
+     * Helper function that opens the replay file for writing.
+     * </p>
+     * 
+     * @param filename
+     *            name and path of the replay file
+     * @return {@link OutputStreamWriter} that writes to the replay file
+     */
+    private OutputStreamWriter openReplayFile(String filename) {
+        File file = new File(filename);
+        boolean fileCreated;
+        try {
+            fileCreated = file.createNewFile();
+            if (!fileCreated) {
+                Console.traceln("Created logfile " + filename);
+            }
+            else {
+                Console.traceln("Overwrote existing logfile " + filename);
+            }
+        }
+        catch (IOException e) {
+            Console.printerrln("Unable to create file " + filename);
+            Console.logException(e);
+        }
+        OutputStreamWriter writer = null;
+        try {
+            writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-16");
+        }
+        catch (IOException e) {
+            Console.printerrln("Unable to open file for writing (read-only file):" + filename);
+            Console.logException(e);
+        }
+        return writer;
+    }
 
-	/**
-	 * <p>
-	 * Helper function that adds an event sequence to the replay.
-	 * </p>
-	 * 
-	 * @param actions
-	 *            event sequences to be added
-	 * @param writer
-	 *            {@link OutputStreamWriter} to which the replay is added
-	 * @throws IOException
-	 *             thrown if there is a problem writing to writer
-	 */
-	private void writeSession(List<Event> actions,
-			OutputStreamWriter writer) throws IOException {
-		if (decorator != null) {
-			writer.write(decorator.getSessionHeader(sessionId));
-		}
-		for (Event currentAction : actions) {
+    /**
+     * <p>
+     * Helper function that adds an event sequence to the replay.
+     * </p>
+     * 
+     * @param actions
+     *            event sequences to be added
+     * @param writer
+     *            {@link OutputStreamWriter} to which the replay is added
+     * @throws IOException
+     *             thrown if there is a problem writing to writer
+     */
+    private void writeSession(List<Event> actions, OutputStreamWriter writer) throws IOException {
+        if (decorator != null) {
+            writer.write(decorator.getSessionHeader(sessionId));
+        }
+        for (Event currentAction : actions) {
 
-			List<? extends IReplayable> replayables = currentAction
-					.getReplayMessages();
-			for (IReplayable replayble : replayables) {
-				writer.write(replayble.getReplay() + StringTools.ENDLINE);
-				writer.flush();
-			}
-		}
-		if (decorator != null) {
-			writer.write(decorator.getSessionFooter(sessionId));
-		}
-		sessionId++;
-	}
+            List<? extends IReplayable> replayables = currentAction.getReplayables();
+            for (IReplayable replayble : replayables) {
+                writer.write(replayble.getReplay() + StringTools.ENDLINE);
+                writer.flush();
+            }
+        }
+        if (decorator != null) {
+            writer.write(decorator.getSessionFooter(sessionId));
+        }
+        sessionId++;
+    }
 
 }
Index: /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/guitar/eventcore/GUITARReplayable.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/guitar/eventcore/GUITARReplayable.java	(revision 559)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/guitar/eventcore/GUITARReplayable.java	(revision 560)
@@ -1,5 +1,8 @@
+
 package de.ugoe.cs.quest.plugin.guitar.eventcore;
 
+import de.ugoe.cs.quest.IReplayDecorator;
 import de.ugoe.cs.quest.eventcore.IReplayable;
+import de.ugoe.cs.quest.plugin.guitar.EFGReplayDecorator;
 import de.ugoe.cs.util.StringTools;
 
@@ -14,43 +17,53 @@
 public class GUITARReplayable implements IReplayable {
 
-	/**
-	 * <p>
-	 * EventId in the EFG and GUI files.
-	 * </p>
-	 */
-	String eventId;
+    /**
+     * <p>
+     * EventId in the EFG and GUI files.
+     * </p>
+     */
+    String eventId;
 
-	/**
-	 * <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>
-	 * Constructor. Creates a new {@link GUITARReplayable}.
-	 * </p>
-	 * 
-	 * @param eventId
-	 */
-	public GUITARReplayable(String eventId) {
-		this.eventId = eventId;
-	}
+    /**
+     * <p>
+     * Constructor. Creates a new {@link GUITARReplayable}.
+     * </p>
+     * 
+     * @param eventId
+     */
+    public GUITARReplayable(String eventId) {
+        this.eventId = eventId;
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see de.ugoe.cs.quest.eventcore.IReplayable#getReplay()
-	 */
-	@Override
-	public String getReplay() {
-		StringBuilder replay = new StringBuilder();
-		replay.append("<Step>" + StringTools.ENDLINE);
-		replay.append("<EventId>" + eventId + "</EventId>" + StringTools.ENDLINE);
-		replay.append("<ReachingStep>false</ReachingStep>" + StringTools.ENDLINE);
-		replay.append("</Step>" + StringTools.ENDLINE);
-		return replay.toString();
-	}
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IReplayable#getReplay()
+     */
+    @Override
+    public String getReplay() {
+        StringBuilder replay = new StringBuilder();
+        replay.append("<Step>" + StringTools.ENDLINE);
+        replay.append("<EventId>" + eventId + "</EventId>" + StringTools.ENDLINE);
+        replay.append("<ReachingStep>false</ReachingStep>" + StringTools.ENDLINE);
+        replay.append("</Step>" + StringTools.ENDLINE);
+        return replay.toString();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IReplayable#getDecorator()
+     */
+    @Override
+    public IReplayDecorator getDecorator() {
+        return EFGReplayDecorator.getInstance();
+    }
 
 }
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 559)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/plugin/php/eventcore/WebRequest.java	(revision 560)
@@ -5,4 +5,5 @@
 import java.util.List;
 
+import de.ugoe.cs.quest.IReplayDecorator;
 import de.ugoe.cs.quest.eventcore.IReplayable;
 
@@ -158,3 +159,13 @@
     }
 
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.quest.eventcore.IReplayable#getDecorator()
+     */
+    @Override
+    public IReplayDecorator getDecorator() {
+        return null;
+    }
+
 }
