Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java	(revision 93)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java	(revision 94)
@@ -15,4 +15,8 @@
 	public Set<List<? extends Event<?>>> generateSequences(int length);
 	
+	public Set<List<? extends Event<?>>> generateSequences(int length, boolean fromStart);
+	
+	public Set<List<? extends Event<?>>> generateValidSequences(int length);
+	
 	public int getNumStates();
 	
Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java	(revision 93)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java	(revision 94)
@@ -112,5 +112,6 @@
 	
 	public Set<List<? extends Event<?>>> generateSequences(int length) {
-		Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();;
+		return generateSequences(length, false);
+		/*Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();;
 		if( length<1 ) {
 			throw new InvalidParameterException("Length of generated subsequences must be at least 1.");
@@ -137,4 +138,55 @@
 		}
 		return sequenceSet;
+		*/
+	}
+	
+	// if startValid, all sequences will start in Event.STARTEVENT
+	public Set<List<? extends Event<?>>> generateSequences(int length, boolean fromStart) {
+		Set<List<? extends Event<?>>> sequenceSet = new LinkedHashSet<List<? extends Event<?>>>();;
+		if( length<1 ) {
+			throw new InvalidParameterException("Length of generated subsequences must be at least 1.");
+		}
+		if( length==1 ) {
+			if( fromStart ) {
+				List<Event<?>> subSeq = new LinkedList<Event<?>>();
+				subSeq.add(Event.STARTEVENT);
+			} else {
+				for( Event<?> event : getEvents() ) {
+					List<Event<?>> subSeq = new LinkedList<Event<?>>();
+					subSeq.add(event);
+					sequenceSet.add(subSeq);
+				}
+			}
+			return sequenceSet;
+		}
+		Set<? extends Event<?>> events = getEvents();
+		Set<List<? extends Event<?>>> seqsShorter = generateSequences(length-1);
+		for( Event<?> event : events ) {
+			for( List<? extends Event<?>> seqShorter : seqsShorter ) {
+				Event<?> lastEvent = event;
+				if( getProbability(seqShorter, lastEvent)>0.0 ) {
+					List<Event<?>> subSeq = new ArrayList<Event<?>>(seqShorter);
+					subSeq.add(lastEvent);
+					sequenceSet.add(subSeq);
+				}
+			}
+		}
+		return sequenceSet;
+	}
+	
+	// sequences from start to end
+	public Set<List<? extends Event<?>>> generateValidSequences(int length) {
+		// check for min-length implicitly done by generateSequences
+		Set<List<? extends Event<?>>> validSequences = generateSequences(length, true);
+		for( List<? extends Event<?>> sequence : validSequences ) {
+			if( sequence.size()!=length ) {
+				validSequences.remove(sequence);
+			} else {
+				if( !Event.ENDEVENT.equals(sequence.get(sequence.size()-1)) ) {
+					validSequences.remove(sequence);
+				}
+			}
+		}
+		return validSequences;
 	}
 
