Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/DeterministicFiniteAutomatonTest.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/DeterministicFiniteAutomatonTest.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/DeterministicFiniteAutomatonTest.java	(revision 548)
@@ -7,4 +7,5 @@
 import de.ugoe.cs.quest.eventcore.Event;
 import de.ugoe.cs.quest.usageprofiles.DeterministicFiniteAutomaton;
+import de.ugoe.cs.quest.usageprofiles.mock.StringEventType;
 
 import java.util.Random;
@@ -22,5 +23,5 @@
 public class DeterministicFiniteAutomatonTest {
 
-	Collection<List<? extends Event<?>>> sequences;
+	Collection<List<Event>> sequences;
 
 	@Test
@@ -46,9 +47,9 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
-		context.add(new Event<String>("b"));
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
+		context.add(new Event(new StringEventType("b")));
 
-		Event<String> symbol = new Event<String>("r");
+		Event symbol = new Event(new StringEventType("r"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -63,8 +64,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
 
-		Event<String> symbol = new Event<String>("b");
+		Event symbol = new Event(new StringEventType("b"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -79,8 +80,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
 
-		Event<String> symbol = new Event<String>("c");
+		Event symbol = new Event(new StringEventType("c"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -95,8 +96,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
 
-		Event<String> symbol = new Event<String>("e");
+		Event symbol = new Event(new StringEventType("e"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -111,8 +112,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
 
-		Event<String> symbol = null;
+		Event symbol = null;
 
 		fixture.getProbability(context, symbol);
@@ -125,7 +126,7 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = null;
+		List<Event> context = null;
 
-		Event<String> symbol = new Event<String>("a");
+		Event symbol = new Event(new StringEventType("a"));
 
 		fixture.getProbability(context, symbol);
@@ -134,18 +135,18 @@
 	@Before
 	public void setUp() throws Exception {
-		List<Event<?>> sequence = new ArrayList<Event<?>>();
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("c"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("d"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
+		List<Event> sequence = new ArrayList<Event>();
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("c")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("d")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
 
-		sequences = new ArrayList<List<? extends Event<?>>>();
+		sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 	}
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/FirstOrderMarkovModelTest.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/FirstOrderMarkovModelTest.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/FirstOrderMarkovModelTest.java	(revision 548)
@@ -10,4 +10,5 @@
 import de.ugoe.cs.quest.usageprofiles.FirstOrderMarkovModel;
 import de.ugoe.cs.quest.usageprofiles.FirstOrderMarkovModel.MarkovEdge;
+import de.ugoe.cs.quest.usageprofiles.mock.StringEventType;
 import static org.junit.Assert.*;
 
@@ -21,5 +22,5 @@
 public class FirstOrderMarkovModelTest {
 
-	Collection<List<? extends Event<?>>> sequences;
+	Collection<List<Event>> sequences;
 	
 	@Test
@@ -72,18 +73,18 @@
 	@Before
 	public void setUp() throws Exception {
-		List<Event<?>> sequence = new ArrayList<Event<?>>();
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("c"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("d"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
+		List<Event> sequence = new ArrayList<Event>();
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("c")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("d")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
 
-		sequences = new ArrayList<List<? extends Event<?>>>();
+		sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 	}
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/HighOrderMarkovModelTest.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/HighOrderMarkovModelTest.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/HighOrderMarkovModelTest.java	(revision 548)
@@ -7,4 +7,5 @@
 import de.ugoe.cs.quest.eventcore.Event;
 import de.ugoe.cs.quest.usageprofiles.HighOrderMarkovModel;
+import de.ugoe.cs.quest.usageprofiles.mock.StringEventType;
 
 import java.util.Random;
@@ -22,5 +23,5 @@
 public class HighOrderMarkovModelTest {
 
-	Collection<List<? extends Event<?>>> sequences;
+	Collection<List<Event>> sequences;
 
 	@Test
@@ -71,8 +72,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("b"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -88,8 +89,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("r");
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("r"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -105,8 +106,8 @@
 		fixture.train(sequences);
 
-		List<Event<String>> context = new ArrayList<Event<String>>();
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("c");
+		List<Event> context = new ArrayList<Event>();
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("c"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -122,9 +123,9 @@
 		fixture.train(sequences);
 
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("b"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -140,9 +141,9 @@
 		fixture.train(sequences);
 
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("b"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -158,9 +159,9 @@
 		fixture.train(sequences);
 
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("b"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("b")));
+
+		Event symbol = new Event(new StringEventType("b"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -176,9 +177,9 @@
 		fixture.train(sequences);
 
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("b"));
-
-		Event<String> symbol = new Event<String>("a");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("b")));
+
+		Event symbol = new Event(new StringEventType("a"));
 
 		double result = fixture.getProbability(context, symbol);
@@ -194,9 +195,9 @@
 		fixture.train(sequences);
 
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("b"));
-
-		Event<String> symbol = null;
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("b")));
+
+		Event symbol = null;
 
 		fixture.getProbability(context, symbol);
@@ -210,7 +211,7 @@
 		fixture.train(sequences);
 
-		List<Event<?>> context = null;
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = null;
+
+		Event symbol = new Event(new StringEventType("b"));
 
 		fixture.getProbability(context, symbol);
@@ -219,18 +220,18 @@
 	@Before
 	public void setUp() throws Exception {
-		List<Event<?>> sequence = new ArrayList<Event<?>>();
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("c"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("d"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-
-		sequences = new ArrayList<List<? extends Event<?>>>();
+		List<Event> sequence = new ArrayList<Event>();
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("c")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("d")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+
+		sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 	}
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/MockTrieBasedModel.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/MockTrieBasedModel.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/MockTrieBasedModel.java	(revision 548)
@@ -16,7 +16,7 @@
 
 	@Override
-	public double getProbability(List<? extends Event<?>> context,
-			Event<?> symbol) {
-		List<Event<?>> list = new ArrayList<Event<?>>();
+	public double getProbability(List<Event> context,
+			Event symbol) {
+		List<Event> list = new ArrayList<Event>();
 		if( context.isEmpty() ) {
 			return 2;
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/ModelFlattenerTest.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/ModelFlattenerTest.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/ModelFlattenerTest.java	(revision 548)
@@ -1,2 +1,3 @@
+
 package de.ugoe.cs.quest.usageprofiles;
 
@@ -14,135 +15,135 @@
 import de.ugoe.cs.quest.usageprofiles.PredictionByPartialMatch;
 import de.ugoe.cs.quest.usageprofiles.TrieNode;
+import de.ugoe.cs.quest.usageprofiles.mock.StringEventType;
 import static org.junit.Assert.*;
 
 /**
- * The class <code>ModelFlattenerTest</code> contains tests for the class <code>{@link ModelFlattener}</code>.
- *
+ * The class <code>ModelFlattenerTest</code> contains tests for the class
+ * <code>{@link ModelFlattener}</code>.
+ * 
  * @author Steffen Herbold
  * @version 1.0
  */
 public class ModelFlattenerTest {
-	
-	List<Event<?>> sequence;
-	
-	private static void assertCollectionContent(Collection<?> c1, Collection<?> c2) {
-		assertEquals(c1.size(), c2.size());
-		for( Object obj : c1 ) {
-			assertTrue(c2.contains(obj));
-		}
-	}
-	
-	@Test
-	public void testFlattenHighOrderMarkovModel_1()
-		throws Exception {
-		ModelFlattener fixture = new ModelFlattener();
-		HighOrderMarkovModel model = new HighOrderMarkovModel(2, new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
-		sequences.add(sequence);
-		model.train(sequences);
-		
-		Collection<Event<?>> expectedSymbols = new HashSet<Event<?>>();
-		expectedSymbols.add(new Event<Object>("a-=-END"));
-		expectedSymbols.add(new Event<Object>("a-=-b"));
-		expectedSymbols.add(new Event<Object>("a-=-c"));
-		expectedSymbols.add(new Event<Object>("a-=-d"));
-		expectedSymbols.add(new Event<Object>("b-=-r"));
-		expectedSymbols.add(new Event<Object>("c-=-a"));
-		expectedSymbols.add(new Event<Object>("d-=-a"));
-		expectedSymbols.add(new Event<Object>("r-=-a"));
-		expectedSymbols.add(new Event<Object>("START-=-a"));
 
-		FirstOrderMarkovModel result = fixture.flattenHighOrderMarkovModel(model);
-		
-		assertCollectionContent(expectedSymbols, result.getEvents());
-		
-		TrieNode<Event<?>> root = result.trie.find(null);
-		TrieNode<Event<?>> root_aEnd = root.getChild(new Event<Object>("a-=-END"));
-		TrieNode<Event<?>> root_ab = root.getChild(new Event<Object>("a-=-b"));
-		TrieNode<Event<?>> root_ab_br = root_ab.getChild(new Event<Object>("b-=-r"));
-		TrieNode<Event<?>> root_ac = root.getChild(new Event<Object>("a-=-c"));
-		TrieNode<Event<?>> root_ac_ca = root_ac.getChild(new Event<Object>("c-=-a"));
-		TrieNode<Event<?>> root_ad = root.getChild(new Event<Object>("a-=-d"));
-		TrieNode<Event<?>> root_ad_da = root_ad.getChild(new Event<Object>("d-=-a"));
-		TrieNode<Event<?>> root_br = root.getChild(new Event<Object>("b-=-r"));
-		TrieNode<Event<?>> root_br_ra = root_br.getChild(new Event<Object>("r-=-a"));
-		TrieNode<Event<?>> root_ca = root.getChild(new Event<Object>("c-=-a"));
-		TrieNode<Event<?>> root_ca_ad = root_ca.getChild(new Event<Object>("a-=-d"));
-		TrieNode<Event<?>> root_da = root.getChild(new Event<Object>("d-=-a"));
-		TrieNode<Event<?>> root_da_ab = root_da.getChild(new Event<Object>("a-=-b"));
-		TrieNode<Event<?>> root_ra = root.getChild(new Event<Object>("r-=-a"));
-		TrieNode<Event<?>> root_ra_ac = root_ra.getChild(new Event<Object> ("a-=-c"));
-		TrieNode<Event<?>> root_ra_aEnd = root_ra.getChild(new Event<Object>("a-=-END"));
-		TrieNode<Event<?>> root_startA = root.getChild(new Event<Object>("START-=-a"));
-		TrieNode<Event<?>> root_startA_ab = root_startA.getChild(new Event<Object>("a-=-b"));
-		
-		assertEquals(1, root_aEnd.getCount());
-		assertTrue(root_aEnd.isLeaf());
-		assertEquals(2, root_ab.getCount());
-		assertEquals(1, root_ab.getChildren().size());
-		assertEquals(2, root_ab_br.getCount());
-		assertTrue(root_ab_br.isLeaf());
-		assertEquals(1, root_ac.getCount());
-		assertEquals(1, root_ac.getChildren().size());
-		assertEquals(1, root_ac_ca.getCount());
-		assertTrue(root_ac_ca.isLeaf());
-		assertEquals(1, root_ad.getCount());
-		assertEquals(1, root_ad.getChildren().size());
-		assertEquals(1, root_ad_da.getCount());
-		assertTrue(root_ad_da.isLeaf());
-		assertEquals(2, root_br.getCount());
-		assertEquals(1, root_br.getChildren().size());
-		assertEquals(2, root_br_ra.getCount());
-		assertTrue(root_br_ra.isLeaf());
-		assertEquals(1, root_ca.getCount());
-		assertEquals(1, root_ca.getChildren().size());
-		assertEquals(1, root_ca_ad.getCount());
-		assertTrue(root_ca_ad.isLeaf());
-		assertEquals(1, root_da.getCount());
-		assertEquals(1, root_da.getChildren().size());
-		assertEquals(1, root_da_ab.getCount());
-		assertTrue(root_da_ab.isLeaf());
-		assertEquals(2, root_ra.getCount());
-		assertEquals(2, root_ra.getChildren().size());
-		assertEquals(1, root_ra_ac.getCount());
-		assertTrue(root_ra_ac.isLeaf());
-		assertEquals(1, root_ra_aEnd.getCount());
-		assertTrue(root_ra_aEnd.isLeaf());
-		assertEquals(1, root_startA.getCount());
-		assertEquals(1, root_startA.getChildren().size());
-		assertEquals(1, root_startA_ab.getCount());
-		assertTrue(root_startA_ab.isLeaf());		
-	}
+    List<Event> sequence;
 
-	@Test
-	public void testFlattenPredictionByPartialMatch_1()
-		throws Exception {
-		ModelFlattener fixture = new ModelFlattener();
-		PredictionByPartialMatch model = new PredictionByPartialMatch(1, new Random());
+    private static void assertCollectionContent(Collection<?> c1, Collection<?> c2) {
+        assertEquals(c1.size(), c2.size());
+        for (Object obj : c1) {
+            assertTrue(c2.contains(obj));
+        }
+    }
 
-		FirstOrderMarkovModel result = fixture.flattenPredictionByPartialMatch(model);
-		
-		assertEquals(null, result);
-	}
+    @Test
+    public void testFlattenHighOrderMarkovModel_1() throws Exception {
+        ModelFlattener fixture = new ModelFlattener();
+        HighOrderMarkovModel model = new HighOrderMarkovModel(2, new Random());
+        Collection<List<Event>> sequences = new ArrayList<List<Event>>();
+        sequences.add(sequence);
+        model.train(sequences);
 
-	@Before
-	public void setUp()
-		throws Exception {
-		sequence = new ArrayList<Event<?>>();
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("c"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("d"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-	}
+        Collection<Event> expectedSymbols = new HashSet<Event>();
+        expectedSymbols.add(new Event(new StringEventType("a-=-END")));
+        expectedSymbols.add(new Event(new StringEventType("a-=-b")));
+        expectedSymbols.add(new Event(new StringEventType("a-=-c")));
+        expectedSymbols.add(new Event(new StringEventType("a-=-d")));
+        expectedSymbols.add(new Event(new StringEventType("b-=-r")));
+        expectedSymbols.add(new Event(new StringEventType("c-=-a")));
+        expectedSymbols.add(new Event(new StringEventType("d-=-a")));
+        expectedSymbols.add(new Event(new StringEventType("r-=-a")));
+        expectedSymbols.add(new Event(new StringEventType("START-=-a")));
 
-	public static void main(String[] args) {
-		new org.junit.runner.JUnitCore().run(ModelFlattenerTest.class);
-	}
+        FirstOrderMarkovModel result = fixture.flattenHighOrderMarkovModel(model);
+
+        assertCollectionContent(expectedSymbols, result.getEvents());
+
+        TrieNode<Event> root = result.trie.find(null);
+        TrieNode<Event> root_aEnd = root.getChild(new Event(new StringEventType("a-=-END")));
+        TrieNode<Event> root_ab = root.getChild(new Event(new StringEventType("a-=-b")));
+        TrieNode<Event> root_ab_br = root_ab.getChild(new Event(new StringEventType("b-=-r")));
+        TrieNode<Event> root_ac = root.getChild(new Event(new StringEventType("a-=-c")));
+        TrieNode<Event> root_ac_ca = root_ac.getChild(new Event(new StringEventType("c-=-a")));
+        TrieNode<Event> root_ad = root.getChild(new Event(new StringEventType("a-=-d")));
+        TrieNode<Event> root_ad_da = root_ad.getChild(new Event(new StringEventType("d-=-a")));
+        TrieNode<Event> root_br = root.getChild(new Event(new StringEventType("b-=-r")));
+        TrieNode<Event> root_br_ra = root_br.getChild(new Event(new StringEventType("r-=-a")));
+        TrieNode<Event> root_ca = root.getChild(new Event(new StringEventType("c-=-a")));
+        TrieNode<Event> root_ca_ad = root_ca.getChild(new Event(new StringEventType("a-=-d")));
+        TrieNode<Event> root_da = root.getChild(new Event(new StringEventType("d-=-a")));
+        TrieNode<Event> root_da_ab = root_da.getChild(new Event(new StringEventType("a-=-b")));
+        TrieNode<Event> root_ra = root.getChild(new Event(new StringEventType("r-=-a")));
+        TrieNode<Event> root_ra_ac = root_ra.getChild(new Event(new StringEventType("a-=-c")));
+        TrieNode<Event> root_ra_aEnd = root_ra.getChild(new Event(new StringEventType("a-=-END")));
+        TrieNode<Event> root_startA = root.getChild(new Event(new StringEventType("START-=-a")));
+        TrieNode<Event> root_startA_ab =
+            root_startA.getChild(new Event(new StringEventType("a-=-b")));
+
+        assertEquals(1, root_aEnd.getCount());
+        assertTrue(root_aEnd.isLeaf());
+        assertEquals(2, root_ab.getCount());
+        assertEquals(1, root_ab.getChildren().size());
+        assertEquals(2, root_ab_br.getCount());
+        assertTrue(root_ab_br.isLeaf());
+        assertEquals(1, root_ac.getCount());
+        assertEquals(1, root_ac.getChildren().size());
+        assertEquals(1, root_ac_ca.getCount());
+        assertTrue(root_ac_ca.isLeaf());
+        assertEquals(1, root_ad.getCount());
+        assertEquals(1, root_ad.getChildren().size());
+        assertEquals(1, root_ad_da.getCount());
+        assertTrue(root_ad_da.isLeaf());
+        assertEquals(2, root_br.getCount());
+        assertEquals(1, root_br.getChildren().size());
+        assertEquals(2, root_br_ra.getCount());
+        assertTrue(root_br_ra.isLeaf());
+        assertEquals(1, root_ca.getCount());
+        assertEquals(1, root_ca.getChildren().size());
+        assertEquals(1, root_ca_ad.getCount());
+        assertTrue(root_ca_ad.isLeaf());
+        assertEquals(1, root_da.getCount());
+        assertEquals(1, root_da.getChildren().size());
+        assertEquals(1, root_da_ab.getCount());
+        assertTrue(root_da_ab.isLeaf());
+        assertEquals(2, root_ra.getCount());
+        assertEquals(2, root_ra.getChildren().size());
+        assertEquals(1, root_ra_ac.getCount());
+        assertTrue(root_ra_ac.isLeaf());
+        assertEquals(1, root_ra_aEnd.getCount());
+        assertTrue(root_ra_aEnd.isLeaf());
+        assertEquals(1, root_startA.getCount());
+        assertEquals(1, root_startA.getChildren().size());
+        assertEquals(1, root_startA_ab.getCount());
+        assertTrue(root_startA_ab.isLeaf());
+    }
+
+    @Test
+    public void testFlattenPredictionByPartialMatch_1() throws Exception {
+        ModelFlattener fixture = new ModelFlattener();
+        PredictionByPartialMatch model = new PredictionByPartialMatch(1, new Random());
+
+        FirstOrderMarkovModel result = fixture.flattenPredictionByPartialMatch(model);
+
+        assertEquals(null, result);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        sequence = new ArrayList<Event>();
+        sequence.add(new Event(new StringEventType("a")));
+        sequence.add(new Event(new StringEventType("b")));
+        sequence.add(new Event(new StringEventType("r")));
+        sequence.add(new Event(new StringEventType("a")));
+        sequence.add(new Event(new StringEventType("c")));
+        sequence.add(new Event(new StringEventType("a")));
+        sequence.add(new Event(new StringEventType("d")));
+        sequence.add(new Event(new StringEventType("a")));
+        sequence.add(new Event(new StringEventType("b")));
+        sequence.add(new Event(new StringEventType("r")));
+        sequence.add(new Event(new StringEventType("a")));
+    }
+
+    public static void main(String[] args) {
+        new org.junit.runner.JUnitCore().run(ModelFlattenerTest.class);
+    }
 }
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/PredictionByPartialMatchTest.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/PredictionByPartialMatchTest.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/PredictionByPartialMatchTest.java	(revision 548)
@@ -7,4 +7,5 @@
 import de.ugoe.cs.quest.eventcore.Event;
 import de.ugoe.cs.quest.usageprofiles.PredictionByPartialMatch;
+import de.ugoe.cs.quest.usageprofiles.mock.StringEventType;
 
 import java.util.Random;
@@ -22,5 +23,5 @@
 public class PredictionByPartialMatchTest {
 
-	Collection<List<? extends Event<?>>> sequences;
+	Collection<List<Event>> sequences;
 
 	@Test
@@ -209,9 +210,9 @@
 		fixture.train(sequences);
 		
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("b"));
 		
 		double result = fixture.getProbability(context, symbol);
@@ -230,9 +231,9 @@
 		fixture.train(sequences);
 		
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("c");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("c"));
 		
 		double result = fixture.getProbability(context, symbol);
@@ -251,9 +252,9 @@
 		fixture.train(sequences);
 		
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("b"));
 		
 		double result = fixture.getProbability(context, symbol);
@@ -272,9 +273,9 @@
 		fixture.train(sequences);
 		
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("c");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("c"));
 		
 		double result = fixture.getProbability(context, symbol);
@@ -293,9 +294,9 @@
 		fixture.train(sequences);
 		
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("b");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("b"));
 		
 		double result = fixture.getProbability(context, symbol);
@@ -314,9 +315,9 @@
 		fixture.train(sequences);
 		
-		List<Event<?>> context = new ArrayList<Event<?>>();
-		context.add(Event.STARTEVENT);
-		context.add(new Event<String>("a"));
-
-		Event<String> symbol = new Event<String>("c");
+		List<Event> context = new ArrayList<Event>();
+		context.add(Event.STARTEVENT);
+		context.add(new Event(new StringEventType("a")));
+
+		Event symbol = new Event(new StringEventType("c"));
 		
 		double result = fixture.getProbability(context, symbol);
@@ -342,18 +343,18 @@
 	@Before
 	public void setUp() throws Exception {
-		List<Event<?>> sequence = new ArrayList<Event<?>>();
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("c"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("d"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-
-		sequences = new ArrayList<List<? extends Event<?>>>();
+		List<Event> sequence = new ArrayList<Event>();
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("c")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("d")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+
+		sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 	}
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/TrieBasedModelTest.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/TrieBasedModelTest.java	(revision 518)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/TrieBasedModelTest.java	(revision 548)
@@ -11,4 +11,5 @@
 import de.ugoe.cs.quest.usageprofiles.TrieBasedModel;
 import de.ugoe.cs.quest.usageprofiles.TrieNode;
+import de.ugoe.cs.quest.usageprofiles.mock.StringEventType;
 
 import org.junit.*;
@@ -24,131 +25,131 @@
 public class TrieBasedModelTest {
 
-	List<Event<?>> sequence;
-	Collection<Event<?>> symbols;
-
-	private void assertTrieStructure(Trie<Event<?>> trie, int numSequences) {
-		TrieNode<Event<?>> root = trie.find(null);
-		TrieNode<Event<?>> root_a = root.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_a_a = root_a.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_a_b = root_a.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_a_b_a = root_a_b
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_a_b_b = root_a_b
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_a_b_c = root_a_b
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_a_b_d = root_a_b
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_a_b_r = root_a_b
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_a_c = root_a.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_a_c_a = root_a_c
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_a_c_b = root_a_c
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_a_c_c = root_a_c
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_a_c_d = root_a_c
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_a_c_r = root_a_c
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_a_d = root_a.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_a_d_a = root_a_d
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_a_d_b = root_a_d
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_a_d_c = root_a_d
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_a_d_d = root_a_d
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_a_d_r = root_a_d
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_a_r = root_a.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_b = root.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_b_a = root_b.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_b_b = root_b.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_b_c = root_b.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_b_d = root_b.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_b_r = root_b.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_b_r_a = root_b_r
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_b_r_b = root_b_r
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_b_r_c = root_b_r
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_b_r_d = root_b_r
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_b_r_r = root_b_r
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_c = root.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_c_a = root_c.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_c_a_a = root_c_a
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_c_a_b = root_c_a
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_c_a_c = root_c_a
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_c_a_d = root_c_a
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_c_a_r = root_c_a
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_c_b = root_c.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_c_c = root_c.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_c_d = root_c.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_c_r = root_c.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_d = root.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_d_a = root_d.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_d_a_a = root_d_a
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_d_a_b = root_d_a
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_d_a_c = root_d_a
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_d_a_d = root_d_a
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_d_a_r = root_d_a
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_d_b = root_d.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_d_c = root_d.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_d_d = root_d.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_d_r = root_d.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_r = root.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_r_a = root_r.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_r_a_a = root_r_a
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_r_a_b = root_r_a
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_r_a_c = root_r_a
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_r_a_d = root_r_a
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_r_a_r = root_r_a
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_r_a_end = root_r_a.getChild(Event.ENDEVENT);
-		TrieNode<Event<?>> root_r_b = root_r.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_r_c = root_r.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_r_d = root_r.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_r_r = root_r.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_start = root.getChild(Event.STARTEVENT);
-		TrieNode<Event<?>> root_start_a = root_start
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_start_a_a = root_start_a
-				.getChild(new Event<String>("a"));
-		TrieNode<Event<?>> root_start_a_b = root_start_a
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_start_a_c = root_start_a
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_start_a_d = root_start_a
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_start_a_r = root_start_a
-				.getChild(new Event<String>("r"));
-		TrieNode<Event<?>> root_start_b = root_start
-				.getChild(new Event<String>("b"));
-		TrieNode<Event<?>> root_start_c = root_start
-				.getChild(new Event<String>("c"));
-		TrieNode<Event<?>> root_start_d = root_start
-				.getChild(new Event<String>("d"));
-		TrieNode<Event<?>> root_start_r = root_start
-				.getChild(new Event<String>("r"));
+	List<Event> sequence;
+	Collection<Event> symbols;
+
+	private void assertTrieStructure(Trie<Event> trie, int numSequences) {
+		TrieNode<Event> root = trie.find(null);
+		TrieNode<Event> root_a = root.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_a_a = root_a.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_a_b = root_a.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_a_b_a = root_a_b
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_a_b_b = root_a_b
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_a_b_c = root_a_b
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_a_b_d = root_a_b
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_a_b_r = root_a_b
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_a_c = root_a.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_a_c_a = root_a_c
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_a_c_b = root_a_c
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_a_c_c = root_a_c
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_a_c_d = root_a_c
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_a_c_r = root_a_c
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_a_d = root_a.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_a_d_a = root_a_d
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_a_d_b = root_a_d
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_a_d_c = root_a_d
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_a_d_d = root_a_d
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_a_d_r = root_a_d
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_a_r = root_a.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_b = root.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_b_a = root_b.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_b_b = root_b.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_b_c = root_b.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_b_d = root_b.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_b_r = root_b.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_b_r_a = root_b_r
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_b_r_b = root_b_r
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_b_r_c = root_b_r
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_b_r_d = root_b_r
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_b_r_r = root_b_r
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_c = root.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_c_a = root_c.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_c_a_a = root_c_a
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_c_a_b = root_c_a
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_c_a_c = root_c_a
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_c_a_d = root_c_a
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_c_a_r = root_c_a
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_c_b = root_c.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_c_c = root_c.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_c_d = root_c.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_c_r = root_c.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_d = root.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_d_a = root_d.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_d_a_a = root_d_a
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_d_a_b = root_d_a
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_d_a_c = root_d_a
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_d_a_d = root_d_a
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_d_a_r = root_d_a
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_d_b = root_d.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_d_c = root_d.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_d_d = root_d.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_d_r = root_d.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_r = root.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_r_a = root_r.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_r_a_a = root_r_a
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_r_a_b = root_r_a
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_r_a_c = root_r_a
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_r_a_d = root_r_a
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_r_a_r = root_r_a
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_r_a_end = root_r_a.getChild(Event.ENDEVENT);
+		TrieNode<Event> root_r_b = root_r.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_r_c = root_r.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_r_d = root_r.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_r_r = root_r.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_start = root.getChild(Event.STARTEVENT);
+		TrieNode<Event> root_start_a = root_start
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_start_a_a = root_start_a
+				.getChild(new Event(new StringEventType("a")));
+		TrieNode<Event> root_start_a_b = root_start_a
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_start_a_c = root_start_a
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_start_a_d = root_start_a
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_start_a_r = root_start_a
+				.getChild(new Event(new StringEventType("r")));
+		TrieNode<Event> root_start_b = root_start
+				.getChild(new Event(new StringEventType("b")));
+		TrieNode<Event> root_start_c = root_start
+				.getChild(new Event(new StringEventType("c")));
+		TrieNode<Event> root_start_d = root_start
+				.getChild(new Event(new StringEventType("d")));
+		TrieNode<Event> root_start_r = root_start
+				.getChild(new Event(new StringEventType("r")));
 
 		assertEquals(numSequences * 5, root_a.getCount());
@@ -287,49 +288,49 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
 		int length = 2;
 
-		Collection<List<Event<?>>> expected = new HashSet<List<Event<?>>>();
-		ArrayList<Event<?>> list;
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("a"));
+		Collection<List<Event>> expected = new HashSet<List<Event>>();
+		ArrayList<Event> list;
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("a")));
 		list.add(Event.ENDEVENT);
 		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("b"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("c"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("d"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("b"));
-		list.add(new Event<String>("r"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("c"));
-		list.add(new Event<String>("a"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("d"));
-		list.add(new Event<String>("a"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
-		list.add(new Event<String>("r"));
-		list.add(new Event<String>("a"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("b")));
+		expected.add(list);
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("c")));
+		expected.add(list);
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("d")));
+		expected.add(list);
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("b")));
+		list.add(new Event(new StringEventType("r")));
+		expected.add(list);
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("c")));
+		list.add(new Event(new StringEventType("a")));
+		expected.add(list);
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("d")));
+		list.add(new Event(new StringEventType("a")));
+		expected.add(list);
+		list = new ArrayList<Event>();
+		list.add(new Event(new StringEventType("r")));
+		list.add(new Event(new StringEventType("a")));
+		expected.add(list);
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
-		expected.add(list);
-
-		Collection<List<? extends Event<?>>> result = fixture
+		list.add(new Event(new StringEventType("a")));
+		expected.add(list);
+
+		Collection<List<Event>> result = fixture
 				.generateSequences(length);
 
@@ -342,33 +343,33 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
 		int length = 3;
 
-		Collection<List<Event<?>>> expected = new HashSet<List<Event<?>>>();
-		ArrayList<Event<?>> list;
-		list = new ArrayList<Event<?>>();
+		Collection<List<Event>> expected = new HashSet<List<Event>>();
+		ArrayList<Event> list;
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
+		list.add(new Event(new StringEventType("a")));
 		list.add(Event.ENDEVENT);
 		expected.add(list);
-		list = new ArrayList<Event<?>>();
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("b"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("b")));
+		expected.add(list);
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("c"));
-		expected.add(list);
-		list = new ArrayList<Event<?>>();
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("c")));
+		expected.add(list);
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("d"));
-		expected.add(list);
-
-		Collection<List<? extends Event<?>>> result = fixture
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("d")));
+		expected.add(list);
+
+		Collection<List<Event>> result = fixture
 				.generateSequences(length, true);
 
@@ -381,5 +382,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
@@ -394,27 +395,27 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
 		int length = 5;
 
-		Collection<List<Event<?>>> expected = new HashSet<List<Event<?>>>();
-		ArrayList<Event<?>> list;
-		list = new ArrayList<Event<?>>();
+		Collection<List<Event>> expected = new HashSet<List<Event>>();
+		ArrayList<Event> list;
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("c"));
-		list.add(new Event<String>("a"));
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("c")));
+		list.add(new Event(new StringEventType("a")));
 		list.add(Event.ENDEVENT);
 		expected.add(list);
-		list = new ArrayList<Event<?>>();
+		list = new ArrayList<Event>();
 		list.add(Event.STARTEVENT);
-		list.add(new Event<String>("a"));
-		list.add(new Event<String>("d"));
-		list.add(new Event<String>("a"));
+		list.add(new Event(new StringEventType("a")));
+		list.add(new Event(new StringEventType("d")));
+		list.add(new Event(new StringEventType("a")));
 		list.add(Event.ENDEVENT);
 		expected.add(list);
 
-		Collection<List<? extends Event<?>>> result = fixture
+		Collection<List<Event>> result = fixture
 				.generateValidSequences(length);
 
@@ -427,5 +428,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
@@ -440,10 +441,10 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
-		sequences.add(sequence);
-
-		fixture.train(sequences);
-
-		Collection<? extends Event<?>> result = fixture.getEvents();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
+		sequences.add(sequence);
+
+		fixture.train(sequences);
+
+		Collection<Event> result = fixture.getEvents();
 
 		assertCollectionContent(symbols, result);
@@ -456,7 +457,7 @@
 				new Random());
 
-		Collection<? extends Event<?>> result = fixture.getEvents();
-
-		assertCollectionContent(new HashSet<Event<?>>(), result);
+		Collection<Event> result = fixture.getEvents();
+
+		assertCollectionContent(new HashSet<Event>(), result);
 	}
 
@@ -466,5 +467,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 
@@ -493,5 +494,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
@@ -518,5 +519,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
@@ -543,5 +544,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 
@@ -558,5 +559,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		sequences.add(sequence);
@@ -574,5 +575,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = null;
+		Collection<List<Event>> sequences = null;
 
 		fixture.train(sequences);
@@ -584,5 +585,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = new ArrayList<List<? extends Event<?>>>();
+		Collection<List<Event>> sequences = new ArrayList<List<Event>>();
 		sequences.add(sequence);
 		fixture.train(sequences);
@@ -599,5 +600,5 @@
 		MockTrieBasedModel fixture = new MockTrieBasedModel(markovOrder,
 				new Random());
-		Collection<List<? extends Event<?>>> sequences = null;
+		Collection<List<Event>> sequences = null;
 		fixture.trie = null;
 
@@ -607,23 +608,23 @@
 	@Before
 	public void setUp() throws Exception {
-		sequence = new ArrayList<Event<?>>();
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("c"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("d"));
-		sequence.add(new Event<String>("a"));
-		sequence.add(new Event<String>("b"));
-		sequence.add(new Event<String>("r"));
-		sequence.add(new Event<String>("a"));
-
-		symbols = new HashSet<Event<?>>();
-		symbols.add(new Event<String>("a"));
-		symbols.add(new Event<String>("b"));
-		symbols.add(new Event<String>("c"));
-		symbols.add(new Event<String>("d"));
-		symbols.add(new Event<String>("r"));
+		sequence = new ArrayList<Event>();
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("c")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("d")));
+		sequence.add(new Event(new StringEventType("a")));
+		sequence.add(new Event(new StringEventType("b")));
+		sequence.add(new Event(new StringEventType("r")));
+		sequence.add(new Event(new StringEventType("a")));
+
+		symbols = new HashSet<Event>();
+		symbols.add(new Event(new StringEventType("a")));
+		symbols.add(new Event(new StringEventType("b")));
+		symbols.add(new Event(new StringEventType("c")));
+		symbols.add(new Event(new StringEventType("d")));
+		symbols.add(new Event(new StringEventType("r")));
 		symbols.add(Event.STARTEVENT);
 		symbols.add(Event.ENDEVENT);
Index: trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/mock/StringEventType.java
===================================================================
--- trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/mock/StringEventType.java	(revision 548)
+++ trunk/quest-core-usageprofiles-test/src/test/java/de/ugoe/cs/quest/usageprofiles/mock/StringEventType.java	(revision 548)
@@ -0,0 +1,32 @@
+package de.ugoe.cs.quest.usageprofiles.mock;
+
+import de.ugoe.cs.quest.eventcore.IEventType;
+
+public class StringEventType implements IEventType {
+    /**  */
+    private static final long serialVersionUID = 1L;
+    String str;
+
+    public StringEventType(String str) {
+        if (str == null) {
+            throw new AssertionError(
+                                     "illegal use of mock StringEventType: str must nut be null");
+        }
+        this.str = str;
+    }
+
+    public String getName() {
+        return "StringEventType";
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) {
+            return true;
+        }
+        if (other instanceof StringEventType) {
+            return str.equals(((StringEventType) other).str);
+        }
+        return false;
+    }
+}
