Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AfterCrossoverCombinedOperator.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AfterCrossoverCombinedOperator.cs	(revision 8710)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AfterCrossoverCombinedOperator.cs	(revision 8711)
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Optimization.Operators;
@@ -31,14 +30,5 @@
   [Item("AfterCrossoverCombinedOperator", "An operator that contains all operators that need to be executed after crossover.")]
   [StorableClass]
-  public class AfterCrossoverCombinedOperator : MultiOperator<IOperator> {
-
-    private CrossoverPerformanceAnalyzer cxAnalyzer;
-
-    private ScopeParameter CurrentScopeParameter {
-      get { return (ScopeParameter)Parameters["CurrentScope"]; }
-    }
-    public IScope CurrentScope {
-      get { return CurrentScopeParameter.ActualValue; }
-    }
+  public class AfterCrossoverCombinedOperator : CombinedOperator {
     public ILookupParameter<IEvaluator> EvaluatorParameter {
       get { return ((LookupParameter<IEvaluator>)Parameters["Evaluator"]); }
@@ -49,6 +39,6 @@
 
     [StorableConstructor]
-    private AfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
-    private AfterCrossoverCombinedOperator(AfterCrossoverCombinedOperator original, Cloner cloner)
+    protected AfterCrossoverCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected AfterCrossoverCombinedOperator(AfterCrossoverCombinedOperator original, Cloner cloner)
       : base(original, cloner) {
     }
@@ -56,15 +46,8 @@
     public AfterCrossoverCombinedOperator()
       : base() {
-      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose variables and sub-scopes should be removed."));
       Parameters.Add(new LookupParameter<IEvaluator>("Evaluator", "The operator which is used to evaluate new solutions."));
       Parameters.Add(new ValueParameter<SingleObjectiveSolutionSimilarityCalculator>("SimilarityCalculator"));
 
       SimilarityCalculatorParameter.ValueChanged += new System.EventHandler(SimilarityCalculatorParameter_ValueChanged);
-
-      cxAnalyzer = new CrossoverPerformanceAnalyzer();
-      var varDuplicator = new VariableDuplicator();
-
-      Operators.Add(cxAnalyzer);
-      Operators.Add(varDuplicator);
     }
 
@@ -72,5 +55,4 @@
       SimilarityCalculatorParameter.Value.QualityVariableName = "TSPTourLength";
       SimilarityCalculatorParameter.Value.SolutionVariableName = "TSPTour";
-      cxAnalyzer.SimilarityCalculatorParameter.Value = SimilarityCalculatorParameter.Value;
     }
 
@@ -79,18 +61,12 @@
     }
 
-    public override IOperation Apply() {
-      if (!Operators.Contains(EvaluatorParameter.ActualValue)) {
-        Operators.Insert(0, EvaluatorParameter.ActualValue);
-      }
+    public override void InitializeOperators() {
+      var cxAnalyzer = new CrossoverPerformanceAnalyzer();
+      cxAnalyzer.SimilarityCalculatorParameter.Value = SimilarityCalculatorParameter.Value;
+      var varDuplicator = new VariableDuplicator();
 
-      OperationCollection next = new OperationCollection(base.Apply());
-      OperationCollection inner = new OperationCollection();
-      inner.Parallel = false;
-
-      for (int i = 0; i < Operators.Count; i++) {
-        inner.Add(ExecutionContext.CreateOperation(Operators[i], CurrentScope));
-      }
-      next.Insert(0, inner);
-      return next;
+      Operators.Add(EvaluatorParameter.ActualValue);
+      Operators.Add(cxAnalyzer);
+      Operators.Add(varDuplicator);
     }
   }
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AfterMutationCombinedOperator.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AfterMutationCombinedOperator.cs	(revision 8711)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/AfterMutationCombinedOperator.cs	(revision 8711)
@@ -0,0 +1,74 @@
+﻿#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.Optimization;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("AfterMutationCombinedOperator", "An operator that contains all operators that need to be executed after mutation.")]
+  [StorableClass]
+  public class AfterMutationCombinedOperator : CombinedOperator {
+    public ILookupParameter<IEvaluator> EvaluatorParameter {
+      get { return ((LookupParameter<IEvaluator>)Parameters["Evaluator"]); }
+    }
+    public IValueParameter<SingleObjectiveSolutionSimilarityCalculator> SimilarityCalculatorParameter {
+      get { return (IValueParameter<SingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
+    }
+
+    [StorableConstructor]
+    protected AfterMutationCombinedOperator(bool deserializing) : base(deserializing) { }
+    protected AfterMutationCombinedOperator(AfterMutationCombinedOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public AfterMutationCombinedOperator()
+      : base() {
+      Parameters.Add(new LookupParameter<IEvaluator>("Evaluator", "The operator which is used to evaluate new solutions."));
+      Parameters.Add(new ValueParameter<SingleObjectiveSolutionSimilarityCalculator>("SimilarityCalculator"));
+
+      SimilarityCalculatorParameter.ValueChanged += new System.EventHandler(SimilarityCalculatorParameter_ValueChanged);
+    }
+
+    void SimilarityCalculatorParameter_ValueChanged(object sender, System.EventArgs e) {
+      SimilarityCalculatorParameter.Value.QualityVariableName = "TSPTourLength";
+      SimilarityCalculatorParameter.Value.SolutionVariableName = "TSPTour";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AfterMutationCombinedOperator(this, cloner);
+    }
+
+    public override void InitializeOperators() {
+      var evaluatorClone = (IEvaluator)EvaluatorParameter.ActualValue.Clone();
+      ((ILookupParameter)evaluatorClone.Parameters["Quality"]).ActualName = "TSPTourLengthM";
+      var mAnalyzer = new MutationPerformanceAnalyzer();
+      var varRemover = new VariableRemover();
+
+      Operators.Add(evaluatorClone);
+      Operators.Add(mAnalyzer);
+      Operators.Add(varRemover);
+    }
+  }
+}
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperator.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperator.cs	(revision 8711)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/CombinedOperator.cs	(revision 8711)
@@ -0,0 +1,71 @@
+﻿#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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {
+  [Item("CombinedOperator", "An operator that executes a collection of other operators.")]
+  [StorableClass]
+  public class CombinedOperator : MultiOperator<IOperator> {
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+
+    [StorableConstructor]
+    protected CombinedOperator(bool deserializing) : base(deserializing) { }
+    protected CombinedOperator(CombinedOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public CombinedOperator()
+      : base() {
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose variables and sub-scopes should be removed."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CombinedOperator(this, cloner);
+    }
+
+    public virtual void InitializeOperators() { }
+
+    public override IOperation Apply() {
+      if (Operators.Count == 0)
+        InitializeOperators();
+
+      OperationCollection next = new OperationCollection(base.Apply());
+      OperationCollection inner = new OperationCollection();
+      inner.Parallel = false;
+
+      for (int i = 0; i < Operators.Count; i++) {
+        inner.Add(ExecutionContext.CreateOperation(Operators[i], CurrentScope));
+      }
+      next.Insert(0, inner);
+      return next;
+    }
+  }
+}
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 8710)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj	(revision 8711)
@@ -116,6 +116,8 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="CombinedOperator.cs" />
+    <Compile Include="AlgorithmBehaviorHelpers.cs" />
     <Compile Include="AfterCrossoverCombinedOperator.cs" />
-    <Compile Include="AlgorithmBehaviorHelpers.cs" />
+    <Compile Include="AfterMutationCombinedOperator.cs" />
     <Compile Include="PathRelinkerPerformanceAnalyzer.cs" />
     <Compile Include="VariableRemover.cs" />
Index: /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/VariableRemover.cs
===================================================================
--- /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/VariableRemover.cs	(revision 8710)
+++ /branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/VariableRemover.cs	(revision 8711)
@@ -52,4 +52,5 @@
       Parameters.Add(new ValueParameter<StringValue>("VariableName", "The name of the variable to remove from the current scope."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose variables and sub-scopes should be removed."));
+      VariableNameParameter.Value.Value = "TSPTourClone";
     }
 
