Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Operators/3.3/BeforeMutatorOperator.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Operators/3.3/BeforeMutatorOperator.cs	(revision 8239)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Operators/3.3/BeforeMutatorOperator.cs	(revision 8239)
@@ -0,0 +1,92 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Operators {
+  using CloneMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItem>;
+  using TraceMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItemList<HeuristicLab.Core.IItem>>;
+
+  /// <summary>
+  /// An operator that tracks parents after crossover.
+  /// </summary>
+  [Item("BeforeMutatorOperator", "An operator that tracks parents before mutation.")]
+  [StorableClass]
+  public class BeforeMutatorOperator : SingleSuccessorOperator {
+    private const string TargetName = "TSPTour";
+
+    #region Parameter properties
+    public ILookupParameter<Permutation> IndividualParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<CloneMapType> GlobalCloneMapParameter {
+      get { return (ILookupParameter<CloneMapType>)Parameters[CreateTrackingDatastructures.GlobalCloneMapParameterName]; }
+    }
+    public ILookupParameter<TraceMapType> GlobalTraceMapParameter {
+      get { return (ILookupParameter<TraceMapType>)Parameters[CreateTrackingDatastructures.GlobalTraceMapParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public Permutation Individual {
+      get { return IndividualParameter.ActualValue; }
+    }
+    public CloneMapType GlobalCloneMap {
+      get { return GlobalCloneMapParameter.ActualValue; }
+    }
+    public TraceMapType GlobalTraceMap {
+      get { return GlobalTraceMapParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private BeforeMutatorOperator(bool deserializing) : base(deserializing) { }
+    private BeforeMutatorOperator(BeforeMutatorOperator original, Cloner cloner) : base(original, cloner) { }
+    public BeforeMutatorOperator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The individual to be mutated."));
+      Parameters.Add(new LookupParameter<CloneMapType>(CreateTrackingDatastructures.GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
+      Parameters.Add(new LookupParameter<TraceMapType>(CreateTrackingDatastructures.GlobalTraceMapParameterName, "A global cache containing tracing info."));
+      IndividualParameter.ActualName = TargetName;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BeforeMutatorOperator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      if (GlobalTraceMap.ContainsKey(Individual)) { // crossover executed
+        var clone = (IItem)Individual.Clone();
+        GlobalTraceMap[clone] = GlobalTraceMap[Individual];
+        GlobalTraceMap[Individual] = new ItemList<IItem> { clone };
+      } else {
+        var original = GlobalCloneMap[Individual];
+        GlobalTraceMap[Individual] = new ItemList<IItem> { original };
+      }
+      return base.Apply();
+    }
+  }
+}
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Operators/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Operators-3.3.csproj
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Operators/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Operators-3.3.csproj	(revision 8237)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Operators/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Operators-3.3.csproj	(revision 8239)
@@ -91,4 +91,5 @@
   <ItemGroup>
     <Compile Include="AfterCrossoverOperator.cs" />
+    <Compile Include="BeforeMutatorOperator.cs" />
     <Compile Include="CreateTrackingDatastructures.cs" />
     <Compile Include="Plugin.cs" />
Index: branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BestIndividualQualityAnalyzer.cs
===================================================================
--- branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BestIndividualQualityAnalyzer.cs	(revision 8237)
+++ branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior/3.3/Analyzers/BestIndividualQualityAnalyzer.cs	(revision 8239)
@@ -84,5 +84,5 @@
     public BestIndividualQualityAnalyzer()
       : base() {
-      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection where the analysis values should are stored."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The results collection where the analysis values should be stored."));
       Parameters.Add(new LookupParameter<DistanceMatrix>(DistanceMatrixParameterName, "The distance matrix of the TSP."));
       Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "Nr of generations."));
