Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java	(revision 1706)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java	(revision 1707)
@@ -1,5 +1,9 @@
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
 
+import java.io.Serializable;
 import java.util.HashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -18,6 +22,10 @@
 
 
-public class ObjectDistanceSubstitionMatrix implements SubstitutionMatrix {
-
+public class ObjectDistanceSubstitionMatrix implements SubstitutionMatrix,Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -4253258274617754083L;
 	private HashMap<Integer, Integer> idmapping;
 	private ITriangleMatrix matrix;
@@ -90,58 +98,29 @@
 			this.updateEventTaskInstances(newTasks);
 			
-		for(Iterator<ITask> it = newTasks.iterator();it.hasNext();) {
-			int index1 = -1;
-			int index2 = -1;
-			float distance = 0;
-			ITask task1 = it.next();
-			for (Iterator<ITask> jt = uniqueTasks.iterator(); jt.hasNext();) {
-				ITask task2 = jt.next();
-				ITaskInstance ti1 = null;
-				ITaskInstance ti2 = null;
-				// We just need to the first instance here
-				if (task1.getInstances().size() > 0) {
-					ti1 = (ITaskInstance) task1.getInstances().iterator()
-							.next();
+			int nThreads = de.ugoe.cs.autoquest.tasktrees.temporalrelation.SequenceForTaskDetectionRuleAlignment.nThreads;
+			ExecutorService executor = Executors.newFixedThreadPool(nThreads);
+			
+			      
+			int count=0;
+			int size=uniqueTasks.size();
+			
+			for(Iterator<ITask> it = newTasks.iterator();it.hasNext();) {
+				ITask task1 = it.next();
+				for (Iterator<ITask> jt = uniqueTasks.iterator(); jt.hasNext();) {
+					ITask task2 = jt.next();
+					Runnable worker = new DistanceCalculator(task1,task2);
+				    executor.execute(worker);
 				}
-				if (task2.getInstances().size() > 0) {
-					ti2 = (ITaskInstance) task2.getInstances().iterator()
-							.next();
-				}
-				IEventTaskInstance eti1 = null;
-				IEventTaskInstance eti2 = null;
-
-				if (ti1 instanceof IEventTaskInstance
-						&& ti2 instanceof IEventTaskInstance) {
-					eti1 = (IEventTaskInstance) ti1;
-					index1 = getIndex(eti1);
-					eti2 = (IEventTaskInstance) ti2;
-					index2 = getIndex(eti2);
-					distance = distanceBetweenInstances(eti1, eti2);
-				} else if (ti1 instanceof IEventTaskInstance
-						&& !(ti2 instanceof IEventTaskInstance)) {
-					task1 = ((ITaskInstance) ti1).getTask();
-					index2 = getIndex(task2);
-					eti1 = (IEventTaskInstance) ti1;
-					index1 = getIndex(eti1);
-					distance = distanceBetweenTaskAndInstance(task2, eti1);
-				} else if (!(ti1 instanceof IEventTaskInstance)
-						&& ti2 instanceof IEventTaskInstance) {
-					index1 = getIndex(task1);
-					eti2 = (IEventTaskInstance) ti2;
-					index2 = getIndex(eti2);
-					distance = distanceBetweenTaskAndInstance(task1, eti2);
-				} else if (!(ti1 instanceof IEventTaskInstance)
-						&& !(ti2 instanceof IEventTaskInstance)) {
-					index1 = getIndex(task1);
-					index2 = getIndex(task2);
-					distance = distanceBetweenTasks(task1, task2);
-				} else {
-					System.out.println("Unknown error");
-				}
-
-				matrix.set(index1, index2, distance);
-
-			}
-		}
+			}
+			
+			 executor.shutdown();
+			    // Wait until all threads are finish
+			 try {
+				executor.awaitTermination(60, TimeUnit.MINUTES);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+			 System.out.println("Finished all threads");
+			
 		}
 	}
@@ -158,66 +137,39 @@
 		}
 		matrix.initialize(0);
-		Console.traceln(Level.INFO, "calculating distances");
-		int index1 = -1;
-		int index2 = -1;
-		float distance = 0;
+		
+		
+		int nThreads = de.ugoe.cs.autoquest.tasktrees.temporalrelation.SequenceForTaskDetectionRuleAlignment.nThreads;
+		Console.traceln(Level.INFO, "calculating distances with " + nThreads + " threads");
+		ExecutorService executor = Executors.newFixedThreadPool(nThreads);
+		
+		      
+		int count=0;
+		int size=uniqueTasks.size();
 		for (Iterator<ITask> it = uniqueTasks.iterator(); it.hasNext();) {
 			ITask task1 = it.next();
+			count++;
+			if((size%count*100)==0) {
+				Console.traceln(Level.INFO,(Math.round((float) count/size*100))+ "%");
+			}
 			for (Iterator<ITask> jt = uniqueTasks.iterator(); jt.hasNext();) {
 				ITask task2 = jt.next();
-				ITaskInstance ti1 = null;
-				ITaskInstance ti2 = null;
-				// We just need to the first instance here
-				if (task1.getInstances().size() > 0) {
-					ti1 = (ITaskInstance) task1.getInstances().iterator()
-							.next();
-				}
-				if (task2.getInstances().size() > 0) {
-					ti2 = (ITaskInstance) task2.getInstances().iterator()
-							.next();
-				}
-				IEventTaskInstance eti1 = null;
-				IEventTaskInstance eti2 = null;
-
-				if (ti1 instanceof IEventTaskInstance
-						&& ti2 instanceof IEventTaskInstance) {
-					eti1 = (IEventTaskInstance) ti1;
-					index1 = getIndex(eti1);
-					eti2 = (IEventTaskInstance) ti2;
-					index2 = getIndex(eti2);
-					distance = distanceBetweenInstances(eti1, eti2);
-				} else if (ti1 instanceof IEventTaskInstance
-						&& !(ti2 instanceof IEventTaskInstance)) {
-					task1 = ((ITaskInstance) ti1).getTask();
-					index2 = getIndex(task2);
-					eti1 = (IEventTaskInstance) ti1;
-					index1 = getIndex(eti1);
-					distance = distanceBetweenTaskAndInstance(task2, eti1);
-				} else if (!(ti1 instanceof IEventTaskInstance)
-						&& ti2 instanceof IEventTaskInstance) {
-					index1 = getIndex(task1);
-					eti2 = (IEventTaskInstance) ti2;
-					index2 = getIndex(eti2);
-					distance = distanceBetweenTaskAndInstance(task1, eti2);
-				} else if (!(ti1 instanceof IEventTaskInstance)
-						&& !(ti2 instanceof IEventTaskInstance)) {
-					index1 = getIndex(task1);
-					index2 = getIndex(task2);
-					distance = distanceBetweenTasks(task1, task2);
-				} else {
-					System.out.println("Unknown error");
-				}
-				matrix.set(index1, index2, distance);
-
-			}
-		}
+				Runnable worker = new DistanceCalculator(task1,task2);
+			    executor.execute(worker);
+			}
+		}
+		 executor.shutdown();
+		    // Wait until all threads are finish
+		 try {
+			executor.awaitTermination(60, TimeUnit.MINUTES);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		 System.out.println("Finished all threads");
+		
 		this.firstRoundMaxIndex=index;
 	}
 	
-	private void computeDistance(ITask task1, ITask task2) {
-		
-		
-	}
-	
+		
+
 	
 	
@@ -233,13 +185,13 @@
 					.iterator(); it.hasNext();) {
 				IEventTaskInstance eti2 = it.next();
-				int taskId1 = eti1.getTask().getId();
-				int taskId2 = eti2.getTask().getId();
-				if (scoreExists(taskId1, taskId2)) {
-					tmpDistance += getScore(taskId1, taskId2);
-				} else {
+				//int taskId1 = eti1.getTask().getId();
+				//int taskId2 = eti2.getTask().getId();
+				//if (scoreExists(taskId1, taskId2)) {
+				//	tmpDistance += getScore(taskId1, taskId2);
+				//} else {
 					float dist = distanceBetweenInstances(eti1, eti2);
 					matrix.set(getIndex(eti1), getIndex(eti2), dist);
 					tmpDistance += dist;
-				}
+				//}
 			}
 			return tmpDistance / eventTaskInstances.size();
@@ -249,8 +201,8 @@
 	}
 
-	public boolean scoreExists(int id, int id2) {
+	//public boolean scoreExists(int id, int id2) {
 		//return idmapping.containsKey(id) && idmapping.containsKey(id2);
-		return false;
-	}
+	//	return false;
+	//}
 
 	private float distanceBetweenTasks(ITask task1, ITask task2) {
@@ -271,8 +223,9 @@
 	}
 
-	private int getIndex(ITask task) {
+	synchronized private int getIndex(ITask task) {
 		int tempindex = -1;
 
 		if (!idmapping.containsKey(task.getId())) {
+			
 			idmapping.put(task.getId(), index);
 			tempindex = index;
@@ -285,5 +238,5 @@
 	}
 
-	private int getIndex(IEventTaskInstance eti) {
+	synchronized private int getIndex(IEventTaskInstance eti) {
 		int tempindex = -1;
 		if (!idmapping.containsKey(eti.getTask().getId())) {
@@ -327,4 +280,74 @@
 
 	}
+	
+	
+	private class DistanceCalculator implements Runnable {
+
+		private ITask task1;
+		private ITask task2;
+		
+		public DistanceCalculator(ITask task1, ITask task2){
+			this.task1 = task1;
+			this.task2 = task2;
+		}
+		
+		
+		@Override
+		public void run() {
+			computeDistance(task1,task2);
+		}
+		private void computeDistance(ITask task1, ITask task2) {
+			int index1 = -1;
+			int index2 = -1;
+			float distance = 0;
+			ITaskInstance ti1 = null;
+			ITaskInstance ti2 = null;
+			// We just need to the first instance here
+			if (task1.getInstances().size() > 0) {
+				ti1 = (ITaskInstance) task1.getInstances().iterator()
+						.next();
+			}
+			if (task2.getInstances().size() > 0) {
+				ti2 = (ITaskInstance) task2.getInstances().iterator()
+						.next();
+			}
+			IEventTaskInstance eti1 = null;
+			IEventTaskInstance eti2 = null;
+
+			if (ti1 instanceof IEventTaskInstance
+					&& ti2 instanceof IEventTaskInstance) {
+				eti1 = (IEventTaskInstance) ti1;
+				index1 = getIndex(eti1);
+				eti2 = (IEventTaskInstance) ti2;
+				index2 = getIndex(eti2);
+				distance = distanceBetweenInstances(eti1, eti2);
+			} else if (ti1 instanceof IEventTaskInstance
+					&& !(ti2 instanceof IEventTaskInstance)) {
+				task1 = ((ITaskInstance) ti1).getTask();
+				index2 = getIndex(task2);
+				eti1 = (IEventTaskInstance) ti1;
+				index1 = getIndex(eti1);
+				distance = distanceBetweenTaskAndInstance(task2, eti1);
+			} else if (!(ti1 instanceof IEventTaskInstance)
+					&& ti2 instanceof IEventTaskInstance) {
+				index1 = getIndex(task1);
+				eti2 = (IEventTaskInstance) ti2;
+				index2 = getIndex(eti2);
+				distance = distanceBetweenTaskAndInstance(task1, eti2);
+			} else if (!(ti1 instanceof IEventTaskInstance)
+					&& !(ti2 instanceof IEventTaskInstance)) {
+				index1 = getIndex(task1);
+				index2 = getIndex(task2);
+				distance = distanceBetweenTasks(task1, task2);
+			} else {
+				System.out.println("Unknown error");
+			}
+			matrix.set(index1, index2, distance);
+			//return distance;
+			
+		}
+		
+		
+	}
 
 }
Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/StaticTriangleMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/StaticTriangleMatrix.java	(revision 1706)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/StaticTriangleMatrix.java	(revision 1707)
@@ -1,6 +1,12 @@
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
 
-public class StaticTriangleMatrix implements ITriangleMatrix {
+import java.io.Serializable;
+
+public class StaticTriangleMatrix implements ITriangleMatrix,Serializable {
 	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7599542322424894866L;
 	private float[] matrix;
 	protected int size;
Index: anches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/TriangleMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/TriangleMatrix.java	(revision 1706)
+++ 	(revision )
@@ -1,74 +1,0 @@
-package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
-
-import java.util.ArrayList;
-
-//Must be initialized!
-public class TriangleMatrix {
-	
-	private ArrayList<Float> matrix;
-	protected int size;
-	private float initalizationValue;
-	
-	
-	
-	//Increases the size
-	public void increaseSize(int count) {
-		int oldsize = size;
-		this.size += count;
-		matrix.ensureCapacity(size*(size+1/2));
-		for(int i=0;i<(oldsize*count)+(count*(count+1)/2);i++) {
-			matrix.add(this.initalizationValue);
-		}
-	}
-
-
-	public TriangleMatrix(int size) {
-		this.size = size;
-		matrix = new ArrayList<Float>();
-		matrix.ensureCapacity(size*(size+1/2));
-	}
-
-	
-	public float get(int first, int second) {
-		int row = Math.min(first, second);
-		int col = Math.max(first, second);
-		return matrix.get(row*size-(row*(row+1)/2 - (size-col)));
-		
-	}
-	
-	public void set(int first, int second, float value) {
-		int row = Math.min(first, second);
-		int col = Math.max(first, second);
-		matrix.set(row*size-(row*(row+1)/2 - (size-col)),value);
-	}
-
-	public void initialize(float value) {
-		this.initalizationValue = value;
-		matrix.clear();
-		for (int i=0; i < this.size*(this.size+1)/2; i++) {
-			matrix.add(value);
-		}
-	}
-	
-	
-	public String toString() {
-		String result = "";
-		for (int i = 0; i < size; i++) {
-			for(int j = 0; j< size; j++) {
-				if(i<j) {
-					if(Float.isInfinite(this.get(i,j))) {
-						result = result + " -------";
-					}
-					else {
-						result = result + String.format("%+8.2f",this.get(i,j));
-					}
-				}
-				else {
-					result = result + ("        ");
-				}
-			}
-			result = result + "\n";
-		}
-		return result;
-	}
-}
Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/RuleApplicationResult.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/RuleApplicationResult.java	(revision 1706)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/RuleApplicationResult.java	(revision 1707)
@@ -15,4 +15,5 @@
 package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
@@ -31,7 +32,13 @@
  * @author Patrick Harms
  */
-class RuleApplicationResult {
+class RuleApplicationResult implements Serializable {
 
-    /** */
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5927099713841481328L;
+
+	/** */
     private RuleApplicationStatus status = RuleApplicationStatus.NOT_APPLIED;
 
Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java	(revision 1706)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java	(revision 1707)
@@ -15,4 +15,10 @@
 package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
 
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -27,4 +33,5 @@
 import java.util.logging.Level;
 
+import de.ugoe.cs.autoquest.CommandHelpers;
 import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.Match;
 import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.MatchOccurence;
@@ -49,4 +56,5 @@
 import de.ugoe.cs.util.StopWatch;
 import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.GlobalDataContainer;
 
 /**
@@ -66,5 +74,10 @@
  * @author Patrick Harms
  */
-class SequenceForTaskDetectionRuleAlignment implements ISessionScopeRule {
+public class SequenceForTaskDetectionRuleAlignment implements ISessionScopeRule {
+	
+	
+	public static int nThreads;
+	public static boolean harmonizeSequences;
+	
 
 	private int iteration = 0;
@@ -137,10 +150,52 @@
 	public RuleApplicationResult apply(List<IUserSession> sessions) {
 		RuleApplicationData appData = new RuleApplicationData(sessions);
-
-		harmonizeEventTaskInstancesModel(appData);
-		// Generate a substitution matrix between all occurring events.
-		Console.traceln(Level.INFO, "generating substitution matrix");
-		Console.traceln(Level.INFO,"Got " + appData.getUniqueTasks().size() + "tasks");
-		appData.getSubmat().generate(appData.getUniqueTasks());
+		if(SequenceForTaskDetectionRuleAlignment.harmonizeSequences) {
+			harmonizeEventTaskInstancesModel(appData);
+			Console.traceln(Level.INFO, "generating substitution matrix from " + appData.getUniqueTasks().size() + " unique tasks");
+			appData.getSubmat().generate(appData.getUniqueTasks());
+			appData.getStopWatch().stop("substitution matrix");
+			GlobalDataContainer.getInstance().addData("appData", appData);
+			//Saving intermediate results to file
+			Console.traceln(Level.INFO,"saving substitution matrix to file");
+			String objectName = "appData";
+			String filename = "appData.dat";
+			Object dataObject = GlobalDataContainer.getInstance().getData(
+					objectName);
+			if (dataObject == null) {
+				CommandHelpers.objectNotFoundMessage(objectName);
+			}
+			FileOutputStream fos = null;
+			ObjectOutputStream out = null;
+			try {
+				fos = new FileOutputStream(filename);
+				out = new ObjectOutputStream(fos);
+				out.writeObject(dataObject);
+				out.close();
+			} catch (IOException ex) {
+				Console.logException(ex);
+			}
+		}
+		else {
+			Console.traceln(Level.INFO,"loading substitution matrix from file");
+			String objectName = "appData";
+			String filename = "appData.dat";
+			Object data = null;
+			FileInputStream fis = null;
+			ObjectInputStream in = null;
+			try {
+				fis = new FileInputStream(filename);
+				in = new ObjectInputStream(fis);
+				data = in.readObject();
+				in.close();
+			} catch (IOException ex) {
+				Console.logException(ex);
+			} catch (ClassNotFoundException ex) {
+				Console.logException(ex);
+			}
+			if (GlobalDataContainer.getInstance().addData(objectName, data)) {
+				CommandHelpers.dataOverwritten(objectName);
+			}
+			appData = (RuleApplicationData) GlobalDataContainer.getInstance().getData("appData");
+		}
 		
 		
@@ -733,5 +788,10 @@
      * 
      */
-	private static class RuleApplicationData {
+	private static class RuleApplicationData implements Serializable {
+
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = -7559657686755522960L;
 
 		private HashMap<Integer, ITask> number2task;
Index: /trunk/autoquest-ui-core-alignment/src/main/java/de/ugoe/cs/autoquest/commands/usability/CMDgenerateTaskTree.java
===================================================================
--- /trunk/autoquest-ui-core-alignment/src/main/java/de/ugoe/cs/autoquest/commands/usability/CMDgenerateTaskTree.java	(revision 1706)
+++ /trunk/autoquest-ui-core-alignment/src/main/java/de/ugoe/cs/autoquest/commands/usability/CMDgenerateTaskTree.java	(revision 1707)
@@ -28,7 +28,7 @@
 /**
  * <p>
- * This command generates a task tree based on the provided sequences. It uses the
- * {@link TaskTreeManager} for this purpose. Please consult the documentation of the task tree
- * manager for more details.
+ * This command generates a task tree based on the provided sequences. It uses
+ * the {@link TaskTreeManager} for this purpose. Please consult the
+ * documentation of the task tree manager for more details.
  * </p>
  * 
@@ -38,57 +38,77 @@
 public class CMDgenerateTaskTree implements Command {
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see de.ugoe.cs.util.console.Command#help()
-     */
-    @Override
-    public String help() {
-        return "generateTaskTree <sequences> {<tasktree>}";
-    }
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#help()
+	 */
+	@Override
+	public String help() {
+		return "generateTaskTree <sequences> {<tasktree>} {<boolean: harmonize sequences or not (true or false)>} {<integer: number of threads>}";
+	}
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see de.ugoe.cs.util.console.Command#run(java.util.List)
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void run(List<Object> parameters) {
-        String sequencesName;
-        String tasktreeName;
-        try {
-            sequencesName = (String) parameters.get(0);
-            if (parameters.size() > 1) {
-                tasktreeName = (String) parameters.get(1);
-            }
-            else {
-                tasktreeName = "tasktree";
-            }
-        }
-        catch (Exception e) {
-            throw new IllegalArgumentException("must provide a sequences name");
-        }
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void run(List<Object> parameters) {
+		String sequencesName;
+		String tasktreeName;
+		try {
+			sequencesName = (String) parameters.get(0);
+			if (parameters.size() > 1) {
+				tasktreeName = (String) parameters.get(1);
+			} else {
+				tasktreeName = "tasktree";
+			}
+		} catch (Exception e) {
+			throw new IllegalArgumentException("must provide a sequences name");
+		}
+		if (parameters.size() > 2) {
+			String harmonize = (String) parameters.get(2);
+			de.ugoe.cs.autoquest.tasktrees.temporalrelation.SequenceForTaskDetectionRuleAlignment.harmonizeSequences = true;
+			System.out.println(harmonize);
+			if (harmonize.equals("false")) {
+				System.out.println("Not harmonizing");
+				de.ugoe.cs.autoquest.tasktrees.temporalrelation.SequenceForTaskDetectionRuleAlignment.harmonizeSequences = false;
+			}
+		}
+		if (parameters.size() > 3) {
+			String threadCount = (String) parameters.get(3);
+			de.ugoe.cs.autoquest.tasktrees.temporalrelation.SequenceForTaskDetectionRuleAlignment.nThreads = 1;
+			try {
+				int tmp = Integer.parseInt(threadCount);
+				de.ugoe.cs.autoquest.tasktrees.temporalrelation.SequenceForTaskDetectionRuleAlignment.nThreads = tmp;
+			} catch (Exception e) {
+				throw new IllegalArgumentException(
+						"The fourth parameter must be an integer. Did you forget to name the tasktree?");
+			}
+		}
 
-        Collection<List<Event>> sequences = null;
-        Object dataObject = GlobalDataContainer.getInstance().getData(sequencesName);
-        if (dataObject == null) {
-            CommandHelpers.objectNotFoundMessage(sequencesName);
-            return;
-        }
-        if (!SequenceInstanceOf.isCollectionOfSequences(dataObject)) {
-            CommandHelpers.objectNotType(sequencesName, "Collection<List<Event<?>>>");
-            return;
-        }
+		Collection<List<Event>> sequences = null;
+		Object dataObject = GlobalDataContainer.getInstance().getData(
+				sequencesName);
+		if (dataObject == null) {
+			CommandHelpers.objectNotFoundMessage(sequencesName);
+			return;
+		}
+		if (!SequenceInstanceOf.isCollectionOfSequences(dataObject)) {
+			CommandHelpers.objectNotType(sequencesName,
+					"Collection<List<Event<?>>>");
+			return;
+		}
 
-        sequences = (Collection<List<Event>>) dataObject;
-        
-        ITaskModel taskModel = new TaskTreeManager().createTaskModel(sequences);
-        
-        if (GlobalDataContainer.getInstance().addData(tasktreeName, taskModel)) {
-            CommandHelpers.dataOverwritten(sequencesName);
-        }
-        
-    }
+		sequences = (Collection<List<Event>>) dataObject;
+
+		ITaskModel taskModel = new TaskTreeManager().createTaskModel(sequences);
+
+		if (GlobalDataContainer.getInstance().addData(tasktreeName, taskModel)) {
+			CommandHelpers.dataOverwritten(sequencesName);
+		}
+
+	}
 
 }
Index: /trunk/java-utils-alignment/src/main/java/de/ugoe/cs/util/StopWatch.java
===================================================================
--- /trunk/java-utils-alignment/src/main/java/de/ugoe/cs/util/StopWatch.java	(revision 1706)
+++ /trunk/java-utils-alignment/src/main/java/de/ugoe/cs/util/StopWatch.java	(revision 1707)
@@ -16,4 +16,5 @@
 
 import java.io.PrintStream;
+import java.io.Serializable;
 import java.text.DecimalFormat;
 import java.util.HashMap;
@@ -34,7 +35,11 @@
  * @author Patrick Harms
  */
-public class StopWatch {
-    
-    /**
+public class StopWatch implements Serializable{
+    
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -4216393284789336830L;
+	/**
      * the splits hold internally
      */
