Index: /trunk/quest-ui-core/pom.xml
===================================================================
--- /trunk/quest-ui-core/pom.xml	(revision 523)
+++ /trunk/quest-ui-core/pom.xml	(revision 524)
@@ -46,4 +46,9 @@
 		</dependency>
 		<dependency>
+			<groupId>de.ugoe.cs.quest</groupId>
+			<artifactId>quest-core-testgeneration</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+		</dependency>
+		<dependency>
 			<groupId>net.sf.jung</groupId>
 			<artifactId>jung-visualization</artifactId>
Index: /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateFixedLengthSequences.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateFixedLengthSequences.java	(revision 523)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateFixedLengthSequences.java	(revision 524)
@@ -2,15 +2,10 @@
 
 import java.security.InvalidParameterException;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.Random;
-import java.util.Set;
 
 import de.ugoe.cs.quest.CommandHelpers;
 import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.testgeneration.DrawFromAllSequencesGenerator;
 import de.ugoe.cs.quest.ui.GlobalDataContainer;
 import de.ugoe.cs.quest.usageprofiles.IStochasticProcess;
@@ -71,48 +66,9 @@
 		}
 		model = (IStochasticProcess) dataObject;
-		Collection<List<? extends Event<?>>> sequences = new LinkedHashSet<List<? extends Event<?>>>();
-		for (int length = minLength; length <= maxLength; length++) {
-			if( validEnd ) {
-				sequences.addAll(model.generateValidSequences(length + 2));
-			} else {
-				sequences.addAll(model.generateSequences(length + 1, true));
-			}
-		}
-		Console.traceln("" + sequences.size() + " possible");
-		if (!all && numSequences < sequences.size()) {
-			List<Double> probabilities = new ArrayList<Double>(sequences.size());
-			double probSum = 0.0;
-			for (List<? extends Event<?>> sequence : sequences) {
-				double prob = model.getProbability(sequence);
-				probabilities.add(prob);
-				probSum += prob;
-			}
-			Set<Integer> drawnSequences = new HashSet<Integer>(numSequences);
-			Random r = new Random();
-			while (drawnSequences.size() < numSequences) {
-				double randVal = r.nextDouble() * probSum;
-				double sum = 0.0d;
-				int index = -1;
-				while (sum < randVal) {
-					index++;
-					double currentProb = probabilities.get(index);
-					sum += currentProb;
-				}
-				if (!drawnSequences.contains(index)) {
-					drawnSequences.add(index);
-					probSum -= probabilities.get(index);
-					probabilities.set(index, 0.0d);
-				}
-			}
-			Collection<List<? extends Event<?>>> retainedSequences = new LinkedList<List<? extends Event<?>>>();
-			int index = 0;
-			for (List<? extends Event<?>> sequence : sequences) {
-				if (drawnSequences.contains(index)) {
-					retainedSequences.add(sequence);
-				}
-				index++;
-			}
-			sequences = retainedSequences;
-		}
+		DrawFromAllSequencesGenerator generator = new DrawFromAllSequencesGenerator(
+				numSequences, minLength, maxLength, validEnd, all);
+		Collection<List<? extends Event<?>>> sequences = generator
+				.generateTestSuite(model);
+
 		if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
 			CommandHelpers.dataOverwritten(sequencesName);
Index: /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateHybrid.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateHybrid.java	(revision 523)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateHybrid.java	(revision 524)
@@ -2,13 +2,11 @@
 
 import java.security.InvalidParameterException;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Random;
 
 import de.ugoe.cs.quest.CommandHelpers;
 import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.testgeneration.HybridGenerator;
 import de.ugoe.cs.quest.ui.GlobalDataContainer;
 import de.ugoe.cs.quest.usageprofiles.IStochasticProcess;
@@ -78,92 +76,12 @@
 		}
 		model = (IStochasticProcess) dataObject;
-		Collection<List<? extends Event<?>>> sequences = new LinkedHashSet<List<? extends Event<?>>>();
-
-		List<List<? extends Event<?>>> seqsTmp = new ArrayList<List<? extends Event<?>>>(
-				model.generateSequences(maxLengthAll + 1, true));
-
-		Console.traceln("" + seqsTmp.size() + " of length " + maxLengthAll
-				+ " possible");
-		List<Double> probabilities = new ArrayList<Double>(seqsTmp.size());
-		double probSum = 0.0;
-		for (List<? extends Event<?>> sequence : seqsTmp) {
-			double prob = model.getProbability(sequence);
-			probabilities.add(prob);
-			probSum += prob;
-		}
-
-		Random r = new Random();
-		int j = 0;
-		while (sequences.size() < numSequences && j <= numSequences * 100) {
-			j++;
-			double randVal = r.nextDouble() * probSum;
-			double sum = 0.0d;
-			int index = -1;
-			while (sum < randVal) {
-				index++;
-				double currentProb = probabilities.get(index);
-				sum += currentProb;
-			}
-			List<? extends Event<?>> seqTmp = seqsTmp.get(index);
-			if (!Event.ENDEVENT.equals(seqTmp.get(seqTmp.size() - 1))) {
-				List<? extends Event<?>> sequence;
-				if (validEnd) {
-					sequence = finishSequence(seqTmp, model, length + 2,
-							validEnd);
-					if( sequence!= null && sequence.size()!=length+2 ) {
-						sequence = null;
-					}
-				} else {
-					sequence = finishSequence(seqTmp, model, length + 1,
-							validEnd);
-					if( sequence!= null && sequence.size()!=length+1 ) {
-						sequence = null;
-					}
-				}
-				if( sequence!=null ) {
-					sequences.add(sequence);
-				}
-			}
-		}
+		
+		HybridGenerator generator = new HybridGenerator(numSequences, length, maxLengthAll, validEnd);
+		Collection<List<? extends Event<?>>> sequences = generator.generateTestSuite(model);
+		
 		if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
 			CommandHelpers.dataOverwritten(sequencesName);
 		}
 		Console.println("" + sequences.size() + " sequences generated");
-	}
-
-	public List<? extends Event<?>> finishSequence(
-			List<? extends Event<?>> sequence, IStochasticProcess model,
-			int maxLength, boolean validEnd) {
-		Random r = new Random();
-		boolean endFound = false;
-		List<Event<?>> sequenceCopy = new LinkedList<Event<?>>(sequence);
-		final int maxIter = 30000;
-		int iter = 0;
-		while (!endFound && iter<maxIter) {
-			iter++;
-			sequenceCopy = new LinkedList<Event<?>>(sequence);
-			while (!endFound && sequenceCopy.size() <= maxLength) {
-				double randVal = r.nextDouble();
-				double probSum = 0.0;
-				for (Event<?> symbol : model.getEvents()) {
-					probSum += model.getProbability(sequenceCopy, symbol);
-					if (probSum >= randVal) {
-						if (!(Event.STARTEVENT.equals(symbol) || (!validEnd && Event.ENDEVENT.equals(symbol)))) {
-							// only add the symbol the sequence if it is not
-							// START
-							// or END
-							sequenceCopy.add(symbol);
-						}
-						endFound = Event.ENDEVENT.equals(symbol)
-								|| (!validEnd && sequenceCopy.size() == maxLength);
-						break;
-					}
-				}
-			}
-		}
-		if( iter==maxIter ) {
-			return null;
-		}
-		return sequenceCopy;
 	}
 
Index: /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateRandomSequences.java
===================================================================
--- /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateRandomSequences.java	(revision 523)
+++ /trunk/quest-ui-core/src/main/java/de/ugoe/cs/quest/ui/commands/CMDgenerateRandomSequences.java	(revision 524)
@@ -2,10 +2,10 @@
 
 import java.security.InvalidParameterException;
-import java.util.HashSet;
+import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 import de.ugoe.cs.quest.CommandHelpers;
 import de.ugoe.cs.quest.eventcore.Event;
+import de.ugoe.cs.quest.testgeneration.RandomWalkGenerator;
 import de.ugoe.cs.quest.ui.GlobalDataContainer;
 import de.ugoe.cs.quest.usageprofiles.IStochasticProcess;
@@ -28,5 +28,4 @@
 	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
 	 */
-	@SuppressWarnings("unchecked")
 	@Override
 	public void run(List<Object> parameters) {
@@ -67,20 +66,10 @@
 		}
 		model = (IStochasticProcess) dataObject;
-		Set<List<? extends Event<?>>> sequences = new HashSet<List<? extends Event<?>>>(
-				numSessions);
-		long numIterations = 0;
-		while (sequences.size() < numSessions && numIterations < maxIter) {
-			List<? extends Event<?>> generatedSequence = model.randomSequence(
-					maxLength, validEnd);
-			if (generatedSequence.size() >= minLength
-					&& generatedSequence.size() <= maxLength) {
-				((List<Event<?>>) generatedSequence).add(0, Event.STARTEVENT);
-				if( validEnd ) {
-					((List<Event<?>>) generatedSequence).add(Event.ENDEVENT);
-				}
-				sequences.add(generatedSequence);
-			}
-			numIterations++;
-		}
+
+		RandomWalkGenerator generator = new RandomWalkGenerator(numSessions,
+				minLength, maxLength, validEnd, maxIter);
+		Collection<List<? extends Event<?>>> sequences = generator
+				.generateTestSuite(model);
+
 		if (sequences.size() < numSessions) {
 			Console.println("Only " + sequences.size()
@@ -88,4 +77,5 @@
 					+ " iterations");
 		}
+
 		if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
 			CommandHelpers.dataOverwritten(sequencesName);
