Index: trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/ModelFlattener.java
===================================================================
--- trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/ModelFlattener.java	(revision 351)
+++ trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/ModelFlattener.java	(revision 361)
@@ -43,17 +43,17 @@
 			HighOrderMarkovModel model) {
 		int markovOrder = model.trieOrder - 1;
-		if (markovOrder == 1) {
-			// TODO model is already FOM
-			// requires copy constructor in class trie
-		}
-		firstOrderTrie = new Trie<Event<?>>();
-		TrieNode<Event<?>> rootNode = model.trie.find(null);
-		generateFirstOrderTrie(rootNode, new LinkedList<String>(), markovOrder);
-		firstOrderTrie.updateKnownSymbols();
-
 		FirstOrderMarkovModel firstOrderModel = new FirstOrderMarkovModel(
 				new Random());
-		firstOrderModel.trie = firstOrderTrie;
 		firstOrderModel.trieOrder = 2;
+		if (markovOrder == 1) {
+			firstOrderModel.trie = new Trie<Event<?>>(model.trie);
+			firstOrderModel.trieOrder = 2;
+		} else {
+			firstOrderTrie = new Trie<Event<?>>();
+			TrieNode<Event<?>> rootNode = model.trie.find(null);
+			generateFirstOrderTrie(rootNode, new LinkedList<String>(), markovOrder);
+			firstOrderTrie.updateKnownSymbols();
+			firstOrderModel.trie = firstOrderTrie;
+		}
 
 		return firstOrderModel;
Index: trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/Trie.java
===================================================================
--- trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/Trie.java	(revision 351)
+++ trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/Trie.java	(revision 361)
@@ -2,4 +2,5 @@
 
 import java.io.Serializable;
+import java.security.InvalidParameterException;
 import java.util.Collection;
 import java.util.HashSet;
@@ -64,4 +65,21 @@
 	/**
 	 * <p>
+	 * Copy-Constructor. Creates a new Trie as the copy of other. The other trie
+	 * must noch be null.
+	 * </p>
+	 * 
+	 * @param other
+	 *            Trie that is copied
+	 */
+	public Trie(Trie<T> other) {
+		if (other == null) {
+			throw new InvalidParameterException("other trie must not be null");
+		}
+		rootNode = new TrieNode<T>(other.rootNode);
+		knownSymbols = new LinkedHashSet<T>(other.knownSymbols);
+	}
+
+	/**
+	 * <p>
 	 * Returns a collection of all symbols occuring in the trie.
 	 * </p>
@@ -251,5 +269,5 @@
 	public List<T> getContextSuffix(List<T> context) {
 		List<T> contextSuffix;
-		if( context!=null ) {
+		if (context != null) {
 			contextSuffix = new LinkedList<T>(context); // defensive copy
 		} else {
Index: trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieNode.java
===================================================================
--- trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieNode.java	(revision 351)
+++ trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieNode.java	(revision 361)
@@ -78,5 +78,5 @@
 	 *            symbol associated with the trie node
 	 */
-	public TrieNode(T symbol) {
+	TrieNode(T symbol) {
 		if (symbol == null) {
 			throw new InvalidParameterException(
@@ -86,4 +86,24 @@
 		count = 0;
 		children = new LinkedList<TrieNode<T>>();
+	}
+
+	/**
+	 * <p>
+	 * Copy-Constructor. Creates a new TrieNode as copy of other. Other must not
+	 * be null.
+	 * </p>
+	 * 
+	 * @param other
+	 */
+	TrieNode(TrieNode<T> other) {
+		if (other == null) {
+			throw new InvalidParameterException("other must not be null");
+		}
+		symbol = other.symbol;
+		count = other.count;
+		children = new LinkedList<TrieNode<T>>();
+		for (TrieNode<T> child : other.children) {
+			children.add(new TrieNode<T>(child));
+		}
 	}
 
