Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DifferenceSubstitutionMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DifferenceSubstitutionMatrix.java	(revision 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DifferenceSubstitutionMatrix.java	(revision 1698)
@@ -3,4 +3,9 @@
  */
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
 
 
@@ -50,7 +55,9 @@
 
 	@Override
-	public void generate() {
-		// TODO Auto-generated method stub
-		
+	public void generate(HashSet<ITask> uniqueTasks) {
+	}
+
+	@Override
+	public void update(LinkedList<ITask> newlyGeneratedTasks) {
 	}
 
Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DummySubstitutionMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DummySubstitutionMatrix.java	(revision 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DummySubstitutionMatrix.java	(revision 1698)
@@ -1,3 +1,8 @@
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
 
 public class DummySubstitutionMatrix implements SubstitutionMatrix {
@@ -19,6 +24,13 @@
 
 	@Override
-	public void generate() {
+	public void generate(HashSet<ITask> uniqueTasks) {
 	}
 
+	@Override
+	public void update(LinkedList<ITask> newlyGeneratedTasks) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+
 }
Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/NearbySubstitutionMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/NearbySubstitutionMatrix.java	(revision 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/NearbySubstitutionMatrix.java	(revision 1698)
@@ -3,4 +3,9 @@
  */
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
 
 /**
@@ -40,8 +45,11 @@
 
 
+
 	@Override
-	public void generate() {
-		// TODO Auto-generated method stub
-		
+	public void generate(HashSet<ITask> uniqueTasks) {
+	}
+
+	@Override
+	public void update(LinkedList<ITask> newlyGeneratedTasks) {
 	}
 
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 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java	(revision 1698)
@@ -28,12 +28,11 @@
 	private double positiveThreshold;
 
-	public ObjectDistanceSubstitionMatrix(HashSet<ITask> uniqueTasks,
+	public ObjectDistanceSubstitionMatrix(
 			float positiveThreshold, int gapPenalty,
 			boolean calculateNonTaskInstances) {
-		this.uniqueTasks = uniqueTasks;
+		
 		this.positiveThreshold = positiveThreshold;
 		idmapping = new HashMap<Integer, Integer>();
 		etisOfTasks = new HashMap<Integer, LinkedList<IEventTaskInstance>>();
-		matrix = new TriangleMatrix(uniqueTasks.size() + 1);
 		this.gapPenalty = gapPenalty;
 		this.calculateNonTaskInstances = calculateNonTaskInstances;
@@ -65,18 +64,17 @@
 
 	}
-
-	public void generate() {
-		if (this.calculateNonTaskInstances) {
-			Console.traceln(Level.INFO, "	searching EventTasks in Tasks");
+	
+	//Just Calculate the distance between the new tasks and the matrix.
+	public void update(LinkedList<ITask> newTasks) {
+		matrix.increaseSize(newTasks.size());
+		if (this.calculateNonTaskInstances) {
+			Console.traceln(Level.INFO, "searching EventTasks in Tasks");
 			searchEventTaskInstances();
 		}
-		Console.traceln(Level.INFO, "   calculating distances");
-		int index1 = -1;
-		int index2 = -1;
-		float distance = 0;
-		int count = 0;
-		for (Iterator<ITask> it = uniqueTasks.iterator(); it.hasNext();) {
-			count++;
-			
+		
+		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();) {
@@ -130,4 +128,71 @@
 		}
 	}
+
+	public void generate(HashSet<ITask> uniqueTasks) {
+		this.uniqueTasks = uniqueTasks;
+		matrix = new TriangleMatrix(uniqueTasks.size() + 1);
+		matrix.initialize(0);
+		if (this.calculateNonTaskInstances) {
+			Console.traceln(Level.INFO, "searching EventTasks in Tasks");
+			searchEventTaskInstances();
+		}
+		Console.traceln(Level.INFO, "calculating distances");
+		int index1 = -1;
+		int index2 = -1;
+		float distance = 0;
+		for (Iterator<ITask> it = uniqueTasks.iterator(); it.hasNext();) {
+			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();
+				}
+				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);
+
+			}
+		}
+	}
+	
+	
 
 	private float distanceBetweenTaskAndInstance(ITask task1,
@@ -157,5 +222,6 @@
 
 	public boolean scoreExists(int id, int id2) {
-		return idmapping.containsKey(id) && idmapping.containsKey(id2);
+		//return idmapping.containsKey(id) && idmapping.containsKey(id2);
+		return false;
 	}
 
Index: /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/SubstitutionMatrix.java
===================================================================
--- /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/SubstitutionMatrix.java	(revision 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/SubstitutionMatrix.java	(revision 1698)
@@ -1,3 +1,8 @@
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
 
 
@@ -10,5 +15,7 @@
 	public double getGapPenalty();
 
-	public void generate();
+	public void generate(HashSet<ITask> uniqueTasks);
+	
+	public void update(LinkedList<ITask> newlyGeneratedTasks);
 
 	
Index: /branches/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 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/TriangleMatrix.java	(revision 1698)
@@ -1,20 +1,37 @@
 package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
 
+import java.util.ArrayList;
+
+//Must be initialized!
 public class TriangleMatrix {
 	
-	private float[] matrix;
+	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 float [size*(size+1)/2];
+		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[row*size-(row*(row+1)/2 - (size-col))];
+		return matrix.get(row*size-(row*(row+1)/2 - (size-col)));
 		
 	}
@@ -23,10 +40,12 @@
 		int row = Math.min(first, second);
 		int col = Math.max(first, second);
-		matrix[row*size-(row*(row+1)/2 - (size-col))] = value;
+		matrix.set(row*size-(row*(row+1)/2 - (size-col)),value);
 	}
 
 	public void initialize(float value) {
-		for (int i=0; i < matrix.length; i++) {
-			matrix[i] = value;
+		this.initalizationValue = value;
+		matrix.clear();
+		for (int i=0; i < this.size*(this.size+1)/2; i++) {
+			matrix.add(value);
 		}
 	}
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 1697)
+++ /branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java	(revision 1698)
@@ -68,5 +68,5 @@
 class SequenceForTaskDetectionRuleAlignment implements ISessionScopeRule {
 
-	private int iteration = 0;
+	//private int iteration = 0;
 	/**
 	 * <p>
@@ -139,6 +139,10 @@
 
 		harmonizeEventTaskInstancesModel(appData);
+		// Generate a substitution matrix between all occurring events.
+		Console.traceln(Level.INFO, "generating substitution matrix");
+		appData.getSubmat().generate(appData.getUniqueTasks());
+		
 		do {
-			iteration++;
+			//iteration++;
 
 			appData.detectedAndReplacedTasks = false;
@@ -146,4 +150,5 @@
 			detectAndReplaceIterations(appData);
 			appData.getStopWatch().start("task replacement");
+			appData.updateSubstitutionMatrix();
 			detectAndReplaceTasks(appData); //
 			appData.getStopWatch().stop("task replacement");
@@ -168,4 +173,5 @@
 		return appData.getResult();
 	}
+
 
 	private ArrayList<NumberSequence> createNumberSequences(
@@ -322,6 +328,5 @@
 
 			IIteration iteration = taskFactory.createNewIteration();
-			appData.getUniqueTasks().add(iteration);
-			appData.getNumber2Task().put(iteration.getId(), iteration);
+			appData.newTaskCreated(iteration);
 			iterations.put(iteratedTask, iteration);
 			iterationInstances.put(iteration,
@@ -445,6 +450,5 @@
 	public ISequence matchAsSequence(RuleApplicationData appData, Match m) {	
 		ISequence sequence = taskFactory.createNewSequence();
-		appData.uniqueTasks.add(sequence);
-		appData.number2task.put(sequence.getId(), sequence);
+		appData.newTaskCreated(sequence);
 
 		int[] first = m.getFirstSequence().getSequence();
@@ -469,6 +473,5 @@
 			else if (first[i] == -1 && second[i] != -1) {
 				IOptional optional = taskFactory.createNewOptional();
-				appData.uniqueTasks.add(optional);
-				appData.number2task.put(optional.getId(), optional);
+				appData.newTaskCreated(optional);
 				taskBuilder.setMarkedTask(optional, appData.getNumber2Task()
 						.get(second[i]));
@@ -479,6 +482,5 @@
 			else if (first[i] != -1 && second[i] == -1) {
 				IOptional optional = taskFactory.createNewOptional();
-				appData.uniqueTasks.add(optional);
-				appData.number2task.put(optional.getId(), optional);
+				appData.newTaskCreated(optional);
 				taskBuilder.setMarkedTask(optional, appData.getNumber2Task()
 						.get(first[i]));
@@ -494,6 +496,5 @@
 
 					ISelection selection = taskFactory.createNewSelection();
-					appData.getUniqueTasks().add(selection);
-					appData.number2task.put(selection.getId(), selection);
+					appData.newTaskCreated(selection);
 					taskBuilder.addChild(selection, appData.getNumber2Task()
 							.get(first[i]));
@@ -504,14 +505,11 @@
 					boolean selectionfound = true;
 					ISelection selection = taskFactory.createNewSelection();
-					appData.getUniqueTasks().add(selection);
-					appData.number2task.put(selection.getId(), selection);
+					appData.newTaskCreated(selection);
 
 					ISequence subsequence1 = taskFactory.createNewSequence();
-					appData.uniqueTasks.add(subsequence1);
-					appData.number2task.put(subsequence1.getId(), subsequence1);
+					appData.newTaskCreated(subsequence1);
 
 					ISequence subsequence2 = taskFactory.createNewSequence();
-					appData.uniqueTasks.add(subsequence2);
-					appData.number2task.put(subsequence2.getId(), subsequence2);
+					appData.newTaskCreated(subsequence2);
 
 					taskBuilder.addChild(selection, subsequence1);
@@ -542,6 +540,5 @@
 
 					ISelection selection = taskFactory.createNewSelection();
-					appData.getUniqueTasks().add(selection);
-					appData.number2task.put(selection.getId(), selection);
+					appData.newTaskCreated(selection);
 					taskBuilder.addChild(selection, appData.getNumber2Task()
 							.get(first[i]));
@@ -568,16 +565,10 @@
 		// Create NumberSequences
 		appData.setNumberSequences(this.createNumberSequences(appData));
-
-		// Generate a substitution matrix between all occurring events.
-		Console.traceln(Level.INFO, "generating substitution matrix");
-		ObjectDistanceSubstitionMatrix submat = new ObjectDistanceSubstitionMatrix(
-				appData.getUniqueTasks(), 6, -3,true);
-		submat.generate();
-
+		
 		// Generate pairwise alignments
 		Console.traceln(Level.INFO, "generating pairwise alignments");
 		LinkedList<Match> matchseqs = new LinkedList<Match>();
 		PairwiseAlignmentStorage alignments = PairwiseAlignmentGenerator
-				.generate(appData.getNumberSequences(), submat, 9);
+				.generate(appData.getNumberSequences(), appData.getSubmat(), 9);
 
 		// Retrieve all matches reached a specific threshold
@@ -729,5 +720,4 @@
 		alignments = null;
 		matchseqs = null;
-		submat = null;
 		appData.getStopWatch().stop("replacing tasks");
 	}
@@ -740,9 +730,14 @@
 		private HashMap<Integer, ITask> number2task;
 
-		// TODO: We Actually just need number2task here
+		// TODO: We Actually just need number2task here, this structure can be removed in the future.
 		private HashSet<ITask> uniqueTasks;
-
+		
+		ObjectDistanceSubstitionMatrix submat; 
+
+	
 		private ArrayList<NumberSequence> numberseqs;
 
+		private LinkedList<ITask> newTasks;
+		
 		/**
          * 
@@ -775,4 +770,20 @@
 			stopWatch = new StopWatch();
 			result = new RuleApplicationResult();
+			submat= new ObjectDistanceSubstitionMatrix(6,-3,true);
+			newTasks = new LinkedList<ITask>();
+		}
+
+		private ObjectDistanceSubstitionMatrix getSubmat() {
+			return submat;
+		}
+		
+		private void resetNewlyCreatedTasks() {
+			uniqueTasks.addAll(newTasks);
+			newTasks.clear();
+		}
+		
+		private void newTaskCreated(ITask task) {
+			number2task.put(task.getId(), task);
+			newTasks.add(task);
 		}
 
@@ -788,8 +799,4 @@
 		}
 
-		// private void setUniqueTasks(SymbolMap<ITaskInstance, ITask> ut) {
-		// this.uniqueTasks = ut;
-		// }
-
 		private void setNumberSequences(ArrayList<NumberSequence> numberseqs) {
 			this.numberseqs = numberseqs;
@@ -800,4 +807,10 @@
 		}
 
+		private void updateSubstitutionMatrix() {
+			submat.update(getNewTasks());
+			resetNewlyCreatedTasks();
+		}
+
+		
 		/**
          *
@@ -814,4 +827,8 @@
 		}
 
+		public LinkedList<ITask> getNewTasks() {
+			return newTasks;
+		}
+		
 		/**
 		 * @return the stopWatch
