Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMCrossover.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMCrossover.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMCrossover.cs	(revision 10538)
@@ -40,5 +40,5 @@
     public abstract JSMEncoding Cross(IRandom random, JSMEncoding parent1, JSMEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
 
@@ -46,5 +46,5 @@
         Cross(RandomParameter.ActualValue, parents[0] as JSMEncoding, parents[1] as JSMEncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMEncoding.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMEncoding.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/JSMEncoding.cs	(revision 10538)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Text;
 using HeuristicLab.Common;
@@ -53,5 +54,5 @@
 
       foreach (Permutation p in JobSequenceMatrix) {
-        sb.Append(p.ToString() + " \n");
+        sb.AppendLine(p.ToString());
       }
 
@@ -59,38 +60,4 @@
       return sb.ToString();
     }
-
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(JSMEncoding))
-        return AreEqual(this, obj as JSMEncoding);
-
-      return false;
-    }
-    public override int GetHashCode() {
-      if (JobSequenceMatrix.Count == 1)
-        return JobSequenceMatrix[0].GetHashCode();
-      if (JobSequenceMatrix.Count == 2)
-        return JobSequenceMatrix[0].GetHashCode() ^ JobSequenceMatrix[1].GetHashCode();
-      return 0;
-    }
-    private static bool AreEqual(JSMEncoding jSMEncoding1, JSMEncoding jSMEncoding2) {
-      if (jSMEncoding1.JobSequenceMatrix.Count != jSMEncoding2.JobSequenceMatrix.Count)
-        return false;
-      for (int i = 0; i < jSMEncoding1.JobSequenceMatrix.Count; i++) {
-        if (!AreEqual(jSMEncoding1.JobSequenceMatrix[i], jSMEncoding2.JobSequenceMatrix[i]))
-          return false;
-      }
-      return true;
-    }
-
-    private static bool AreEqual(Permutation p1, Permutation p2) {
-      if (p1.Length != p2.Length)
-        return false;
-      for (int i = 0; i < p1.Length; i++) {
-        if (p1[i] != p2[i])
-          return false;
-      }
-      return true;
-    }
   }
 }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Manipulators/JSMManipulator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Manipulators/JSMManipulator.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Manipulators/JSMManipulator.cs	(revision 10538)
@@ -39,9 +39,9 @@
     protected abstract void Manipulate(IRandom random, IScheduleEncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = ScheduleEncodingParameter.ActualValue as JSMEncoding;
       if (solution == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type JSMEncoding.");
       Manipulate(RandomParameter.ActualValue, solution);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Crossovers/PWRCrossover.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Crossovers/PWRCrossover.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Crossovers/PWRCrossover.cs	(revision 10538)
@@ -40,5 +40,5 @@
     public abstract PWREncoding Cross(IRandom random, PWREncoding parent1, PWREncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
 
@@ -46,5 +46,5 @@
         Cross(RandomParameter.ActualValue, parents[0] as PWREncoding, parents[1] as PWREncoding);
 
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Manipulators/PWRManipulator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Manipulators/PWRManipulator.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/Manipulators/PWRManipulator.cs	(revision 10538)
@@ -40,9 +40,9 @@
     protected abstract void Manipulate(IRandom random, PWREncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = ScheduleEncodingParameter.ActualValue as PWREncoding;
       if (solution == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type PWREncoding.");
       Manipulate(RandomParameter.ActualValue, solution);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWREncoding.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWREncoding.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PermutationWithRepetition/PWREncoding.cs	(revision 10538)
@@ -75,29 +75,4 @@
       return sb.ToString();
     }
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(PWREncoding))
-        return AreEqual(this, obj as PWREncoding);
-      else
-        return base.Equals(obj);
-    }
-
-    public override int GetHashCode() {
-      if (PermutationWithRepetition.Length == 1)
-        return PermutationWithRepetition[0].GetHashCode();
-      if (PermutationWithRepetition.Length == 2)
-        return PermutationWithRepetition[0].GetHashCode() ^ PermutationWithRepetition[1].GetHashCode();
-      return 0;
-    }
-
-    private bool AreEqual(PWREncoding pWREncoding1, PWREncoding pWREncoding2) {
-      if (pWREncoding1.PermutationWithRepetition.Length != pWREncoding2.PermutationWithRepetition.Length)
-        return false;
-      for (int i = 0; i < pWREncoding1.PermutationWithRepetition.Length; i++) {
-        if (pWREncoding1.PermutationWithRepetition[i] != pWREncoding2.PermutationWithRepetition[i])
-          return false;
-      }
-      return true;
-    }
   }
 }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Crossovers/PRVCrossover.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Crossovers/PRVCrossover.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Crossovers/PRVCrossover.cs	(revision 10538)
@@ -40,9 +40,9 @@
     public abstract PRVEncoding Cross(IRandom random, PRVEncoding parent1, PRVEncoding parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
       ChildParameter.ActualValue =
         Cross(RandomParameter.ActualValue, parents[0] as PRVEncoding, parents[1] as PRVEncoding);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Manipulators/PRVManipulator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Manipulators/PRVManipulator.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/Manipulators/PRVManipulator.cs	(revision 10538)
@@ -39,9 +39,9 @@
     protected abstract void Manipulate(IRandom random, PRVEncoding individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var solution = ScheduleEncodingParameter.ActualValue as PRVEncoding;
       if (solution == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type PRVEncoding.");
       Manipulate(RandomParameter.ActualValue, solution);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVEncoding.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVEncoding.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/PriorityRulesVector/PRVEncoding.cs	(revision 10538)
@@ -74,5 +74,5 @@
 
       foreach (int i in PriorityRulesVector) {
-        sb.Append(i.ToString() + " ");
+        sb.Append(i + " ");
       }
 
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCreator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCreator.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCreator.cs	(revision 10538)
@@ -29,5 +29,5 @@
   [Item("ScheduleCreator", "Represents the generalized form of creators for Scheduling Problems.")]
   [StorableClass]
-  public abstract class ScheduleCreator : SingleSuccessorOperator, IScheduleCreator {
+  public abstract class ScheduleCreator : InstrumentedOperator, IScheduleCreator {
 
     public ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter {
@@ -43,7 +43,7 @@
     }
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       ScheduleEncodingParameter.ActualValue = CreateSolution();
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCrossover.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCrossover.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleCrossover.cs	(revision 10538)
@@ -30,5 +30,5 @@
   [Item("ScheduleCrossover", "A scheduling crossover operation.")]
   [StorableClass]
-  public abstract class ScheduleCrossover : SingleSuccessorOperator, IScheduleCrossover, IStochasticOperator {
+  public abstract class ScheduleCrossover : InstrumentedOperator, IScheduleCrossover, IStochasticOperator {
 
     public ILookupParameter<IScheduleEncoding> ChildParameter {
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Crossovers/DirectScheduleCrossover.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Crossovers/DirectScheduleCrossover.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Crossovers/DirectScheduleCrossover.cs	(revision 10538)
@@ -45,9 +45,9 @@
     public abstract Schedule Cross(IRandom random, Schedule parent1, Schedule parent2);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var parents = ParentsParameter.ActualValue;
       ChildParameter.ActualValue =
         Cross(RandomParameter.ActualValue, parents[0] as Schedule, parents[1] as Schedule);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
   }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs	(revision 10538)
@@ -20,6 +20,8 @@
 #endregion
 
+using System;
 using System.ComponentModel;
 using System.Text;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -38,5 +40,8 @@
         bool changed = dueDate != value;
         dueDate = value;
-        if (changed) OnPropertyChanged("DueDate");
+        if (changed) {
+          OnPropertyChanged("DueDate");
+          OnToStringChanged();
+        }
       }
     }
@@ -49,5 +54,8 @@
         bool changed = index != value;
         index = value;
-        if (changed) OnPropertyChanged("Index");
+        if (changed) {
+          OnPropertyChanged("Index");
+          OnToStringChanged();
+        }
       }
     }
@@ -68,14 +76,16 @@
     protected Job(Job original, Cloner cloner)
       : base(original, cloner) {
-      this.DueDate = original.DueDate;
-      this.Index = original.Index;
-      this.Tasks = cloner.Clone(original.Tasks);
+      this.dueDate = original.DueDate;
+      this.index = original.Index;
+      this.tasks = cloner.Clone(original.Tasks);
+      RegisterEventHandlers();
     }
     public Job() : this(-1, double.MaxValue) { }
     public Job(int index, double dueDate)
       : base() {
-      DueDate = dueDate;
-      Index = index;
-      Tasks = new ItemList<Task>();
+      this.dueDate = dueDate;
+      this.index = index;
+      this.tasks = new ItemList<Task>();
+      RegisterEventHandlers();
     }
 
@@ -84,9 +94,46 @@
     }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      Tasks.ItemsAdded += TasksOnItemsChanged;
+      Tasks.ItemsRemoved += TasksOnItemsChanged;
+      Tasks.ItemsReplaced += TasksOnItemsChanged;
+      Tasks.CollectionReset += TasksOnItemsChanged;
+      foreach (var task in Tasks) {
+        task.PropertyChanged += TaskOnPropertyChanged;
+        task.ToStringChanged += TaskOnToStringChanged;
+      }
+    }
+
+    private void TasksOnItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<Task>> e) {
+      foreach (var task in e.OldItems) {
+        task.Value.PropertyChanged -= TaskOnPropertyChanged;
+        task.Value.ToStringChanged -= TaskOnToStringChanged;
+      }
+      foreach (var task in e.Items) {
+        task.Value.PropertyChanged += TaskOnPropertyChanged;
+        task.Value.ToStringChanged += TaskOnToStringChanged;
+      }
+      OnTasksChanged();
+      OnToStringChanged();
+    }
+
+    private void TaskOnPropertyChanged(object sender, EventArgs e) {
+      OnTasksChanged();
+    }
+
+    private void TaskOnToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
     public override string ToString() {
       var sb = new StringBuilder();
       sb.Append("Job#" + Index + " [ ");
       foreach (Task t in Tasks) {
-        sb.Append(t.ToString() + " ");
+        sb.Append(t + " ");
       }
       sb.Append("{" + DueDate + "} ");
@@ -100,4 +147,10 @@
     }
 
+    public event EventHandler TasksChanged;
+    protected virtual void OnTasksChanged() {
+      var handler = TasksChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Manipulators/DirectScheduleManipulator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Manipulators/DirectScheduleManipulator.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Manipulators/DirectScheduleManipulator.cs	(revision 10538)
@@ -40,9 +40,9 @@
     protected abstract void Manipulate(IRandom random, Schedule individual);
 
-    public override IOperation Apply() {
+    public override IOperation InstrumentedApply() {
       var schedule = ScheduleEncodingParameter.ActualValue as Schedule;
       if (schedule == null) throw new InvalidOperationException("ScheduleEncoding was not found or is not of type Schedule.");
       Manipulate(RandomParameter.ActualValue, schedule);
-      return base.Apply();
+      return base.InstrumentedApply();
     }
 
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Resource.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Resource.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Resource.cs	(revision 10538)
@@ -73,36 +73,9 @@
       sb.Append("Resource#" + Index + " [ ");
       foreach (ScheduledTask t in Tasks) {
-        sb.Append(t.ToString() + " ");
+        sb.Append(t+ " ");
       }
       sb.Append("]");
       return sb.ToString();
     }
-
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(Resource))
-        return AreEqual(this, obj as Resource);
-      else
-        return false;
-    }
-
-    public override int GetHashCode() {
-      if (Tasks.Count == 1)
-        return Tasks[0].GetHashCode();
-      if (Tasks.Count == 2)
-        return Tasks[0].GetHashCode() ^ Tasks[1].GetHashCode();
-      return 0;
-    }
-
-    private static bool AreEqual(Resource res1, Resource res2) {
-      if (res1.Tasks.Count != res2.Tasks.Count)
-        return false;
-      for (int i = 0; i < res1.Tasks.Count; i++) {
-        if (!res1.Tasks[i].Equals(res2.Tasks[i]))
-          return false;
-      }
-
-      return true;
-    }
   }
 }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Schedule.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Schedule.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Schedule.cs	(revision 10538)
@@ -149,5 +149,5 @@
       sb.Append("[ ");
       foreach (Resource r in Resources) {
-        sb.Append(r.ToString() + " \n");
+        sb.AppendLine(r.ToString());
       }
       sb.Append("]");
@@ -164,30 +164,4 @@
       return quality;
     }
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(Schedule))
-        return AreEqual(this, obj as Schedule);
-      else
-        return false;
-    }
-    public override int GetHashCode() {
-      if (Resources.Count == 1)
-        return Resources[0].GetHashCode();
-      if (Resources.Count == 2)
-        return Resources[0].GetHashCode() ^ Resources[1].GetHashCode();
-      return 0;
-    }
-
-    private static bool AreEqual(Schedule schedule1, Schedule schedule2) {
-      if (schedule1.Resources.Count != schedule2.Resources.Count)
-        return false;
-      for (int i = 0; i < schedule1.Resources.Count; i++) {
-        if (!schedule1.Resources[i].Equals(schedule2.Resources[i]))
-          return false;
-      }
-
-      return true;
-    }
-
   }
 }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/ScheduledTask.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/ScheduledTask.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/ScheduledTask.cs	(revision 10538)
@@ -75,25 +75,4 @@
       return sb.ToString();
     }
-
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(ScheduledTask))
-        return AreEqual(this, obj as ScheduledTask);
-      else
-        return false;
-    }
-
-    public override int GetHashCode() {
-      return TaskNr ^ JobNr;
-    }
-
-    public static bool AreEqual(ScheduledTask task1, ScheduledTask task2) {
-      return (
-        task1.TaskNr == task2.TaskNr &&
-        task1.Duration == task2.Duration &&
-        task1.JobNr == task2.JobNr &&
-        task1.ResourceNr == task2.ResourceNr &&
-        task1.StartTime == task2.StartTime &&
-        task1.EndTime == task2.EndTime);
-    }
   }
 }
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs	(revision 10538)
@@ -38,5 +38,8 @@
         bool changed = taskNr != value;
         taskNr = value;
-        if (changed) OnPropertyChanged("TaskNr");
+        if (changed) {
+          OnPropertyChanged("TaskNr");
+          OnToStringChanged();
+        }
       }
     }
@@ -48,5 +51,8 @@
         bool changed = resourceNr != value;
         resourceNr = value;
-        if (changed) OnPropertyChanged("ResourceNr");
+        if (changed) {
+          OnPropertyChanged("ResourceNr");
+          OnToStringChanged();
+        }
       }
     }
@@ -89,18 +95,18 @@
     protected Task(Task original, Cloner cloner)
       : base(original, cloner) {
-      this.ResourceNr = original.ResourceNr;
-      this.JobNr = original.JobNr;
-      this.Duration = original.Duration;
-      this.TaskNr = original.TaskNr;
-      this.IsScheduled = original.IsScheduled;
+      this.resourceNr = original.ResourceNr;
+      this.jobNr = original.JobNr;
+      this.duration = original.Duration;
+      this.taskNr = original.TaskNr;
+      this.isScheduled = original.IsScheduled;
     }
     public Task() : this(-1, -1, -1, 0) { }
     public Task(int taskNr, int resNr, int jobNr, double duration)
       : base() {
-      Duration = duration;
-      ResourceNr = resNr;
-      JobNr = jobNr;
-      TaskNr = taskNr;
-      IsScheduled = false;
+      this.duration = duration;
+      this.resourceNr = resNr;
+      this.jobNr = jobNr;
+      this.taskNr = taskNr;
+      this.isScheduled = false;
     }
 
@@ -115,23 +121,4 @@
     }
 
-    public override bool Equals(object obj) {
-      if (obj.GetType() == typeof(Task))
-        return AreEqual(this, obj as Task);
-      else
-        return false;
-    }
-
-    public override int GetHashCode() {
-      return TaskNr ^ JobNr;
-    }
-
-    public static bool AreEqual(Task task1, Task task2) {
-      return (task1.Duration == task2.Duration &&
-        task1.IsScheduled == task2.IsScheduled &&
-        task1.JobNr == task2.JobNr &&
-        task1.ResourceNr == task2.ResourceNr &&
-        task1.TaskNr == task2.TaskNr);
-    }
-
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
Index: branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleManipulator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleManipulator.cs	(revision 10085)
+++ branches/DataPreprocessing/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleManipulator.cs	(revision 10538)
@@ -30,5 +30,5 @@
   [Item("ScheduleManipulator", "A scheduling manipulation operation.")]
   [StorableClass]
-  public abstract class ScheduleManipulator : SingleSuccessorOperator, IScheduleManipulator, IStochasticOperator {
+  public abstract class ScheduleManipulator : InstrumentedOperator, IScheduleManipulator, IStochasticOperator {
 
     public ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter {
