Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/coverage/SequenceTools.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/coverage/SequenceTools.java	(revision 128)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/coverage/SequenceTools.java	(revision 129)
@@ -69,5 +69,5 @@
 	 */
 	public static long numSequences(IStochasticProcess process, int length) {
-		return (long) Math.pow(process.getNumStates(), length);
+		return (long) Math.pow(process.getNumSymbols(), length);
 	}
 
Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java	(revision 128)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java	(revision 129)
@@ -107,5 +107,5 @@
 	 * @return number of states
 	 */
-	public int getNumStates();
+	public int getNumSymbols();
 
 	/**
@@ -116,5 +116,17 @@
 	 * @return string representation for all known states
 	 */
-	public String[] getStateStrings();
+	public String[] getSymbolStrings();
+	
+	/**
+	 * <p>
+	 * Returns the number of states the process would have if it would be flattened through state-splitting to a first-order Markov model.
+	 * </p>
+	 * <p>
+	 * If it is not possible to flatten the model, -1 is returned.
+	 * </p>
+	 * 
+	 * @return number of states an equivalent FOM would have; -1 is not available
+	 */
+	public int getNumFOMStates();
 
 	/**
Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/Trie.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/Trie.java	(revision 128)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/Trie.java	(revision 129)
@@ -3,7 +3,9 @@
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import de.ugoe.cs.util.StringTools;
@@ -364,8 +366,23 @@
 	 * </p>
 	 * 
-	 * @return
+	 * @return number of symbols contained in the trie
 	 */
 	public int getNumSymbols() {
 		return knownSymbols.size();
 	}
+
+	/**
+	 * <p>
+	 * Returns the number of trie nodes that are ancestors of a leaf. This is
+	 * the equivalent to the number of states a first-order markov model would
+	 * have.
+	 * <p>
+	 * 
+	 * @return number of trie nodes that are ancestors of leafs.
+	 */
+	public int getNumLeafAncestors() {
+		Set<TrieNode<T>> ancestors = new HashSet<TrieNode<T>>();
+		rootNode.getLeafAncestors(ancestors);
+		return ancestors.size();
+	}
 }
Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java	(revision 128)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java	(revision 129)
@@ -179,5 +179,5 @@
 	 */
 	@Override
-	public int getNumStates() {
+	public int getNumSymbols() {
 		return trie.getNumSymbols();
 	}
@@ -189,6 +189,6 @@
 	 */
 	@Override
-	public String[] getStateStrings() {
-		String[] stateStrings = new String[getNumStates()];
+	public String[] getSymbolStrings() {
+		String[] stateStrings = new String[getNumSymbols()];
 		int i = 0;
 		for (Event<?> symbol : trie.getKnownSymbols()) {
@@ -309,3 +309,10 @@
 	}
 
+	/* (non-Javadoc)
+	 * @see de.ugoe.cs.eventbench.models.IStochasticProcess#getNumFOMStates()
+	 */
+	@Override
+	public int getNumFOMStates() {
+		return trie.getNumLeafAncestors();
+	}
 }
Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieNode.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieNode.java	(revision 128)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieNode.java	(revision 129)
@@ -6,4 +6,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import de.ugoe.cs.eventbench.models.Trie.Edge;
@@ -286,3 +287,34 @@
 		}
 	}
+
+	/**
+	 * <p>
+	 * Checks if the node is a leaf.
+	 * </p>
+	 * 
+	 * @return true if the node is a leaf, false otherwise.
+	 */
+	protected boolean isLeaf() {
+		return children.isEmpty();
+	}
+
+	/**
+	 * <p>
+	 * Recursive methods that collects all nodes that are ancestors of leafs and
+	 * stores them in the set.
+	 * </p>
+	 * 
+	 * @param ancestors
+	 *            set of all ancestors of leafs
+	 */
+	protected void getLeafAncestors(Set<TrieNode<T>> ancestors) {
+		boolean isAncestor = false;
+		for (TrieNode<T> child : children) {
+			child.getLeafAncestors(ancestors);
+			isAncestor |= child.isLeaf();
+		}
+		if (isAncestor) {
+			ancestors.add(this);
+		}
+	}
 }
