Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs	(revision 11677)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs	(revision 11678)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -414,8 +413,4 @@
     }
     private void ParameterizeMainLoop() {
-      //MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
-      //MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
-      //MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
-      //MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
       MainLoop.MainOperator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
       MainLoop.MainOperator.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
@@ -500,5 +495,8 @@
       if (oldCrossover != null) {
         var crossover = CrossoverParameter.ValidValues.FirstOrDefault(c => c.GetType() == oldCrossover.GetType());
-        CrossoverParameter.Value = crossover;
+        if (crossover != null)
+          CrossoverParameter.Value = crossover;
+        else
+          oldCrossover = null;
       }
       if (oldCrossover == null && defaultCrossover != null)
@@ -514,5 +512,6 @@
       if (oldMutator != null) {
         var mutator = MutatorParameter.ValidValues.FirstOrDefault(m => m.GetType() == oldMutator.GetType());
-        MutatorParameter.Value = mutator;
+        if (mutator != null)
+          MutatorParameter.Value = mutator;
       }
     }
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 11677)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 11678)
@@ -175,5 +175,6 @@
       ageCalculator.ParameterToReduce.ActualName = "Age";
       ageCalculator.TargetParameter.ActualName = "Age";
-      ageCalculator.ReductionOperation.Value = new ReductionOperation(ReductionOperations.Max);
+      ageCalculator.ReductionOperation.Value = null;
+      ageCalculator.ReductionOperation.ActualName = "AgeInheritance";
       ageCalculator.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
       crossover.Successor = ageCalculator;
Index: /branches/ALPS/HeuristicLab.Operators/3.3/DataReducer.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Operators/3.3/DataReducer.cs	(revision 11677)
+++ /branches/ALPS/HeuristicLab.Operators/3.3/DataReducer.cs	(revision 11678)
@@ -40,9 +40,9 @@
       get { return (LookupParameter<IItem>)Parameters["TargetParameter"]; }
     }
-    public ValueParameter<ReductionOperation> ReductionOperation {
-      get { return (ValueParameter<ReductionOperation>)Parameters["ReductionOperation"]; }
-    }
-    public ValueParameter<ReductionOperation> TargetOperation {
-      get { return (ValueParameter<ReductionOperation>)Parameters["TargetOperation"]; }
+    public ValueLookupParameter<ReductionOperation> ReductionOperation {
+      get { return (ValueLookupParameter<ReductionOperation>)Parameters["ReductionOperation"]; }
+    }
+    public ValueLookupParameter<ReductionOperation> TargetOperation {
+      get { return (ValueLookupParameter<ReductionOperation>)Parameters["TargetOperation"]; }
     }
     #endregion
@@ -58,6 +58,6 @@
       Parameters.Add(new ScopeTreeLookupParameter<IItem>("ParameterToReduce", "The parameter on which the reduction operation should be applied."));
       Parameters.Add(new LookupParameter<IItem>("TargetParameter", "The target variable in which the reduced value should be stored."));
-      Parameters.Add(new ValueParameter<ReductionOperation>("ReductionOperation", "The operation which is applied on the parameters to reduce."));
-      Parameters.Add(new ValueParameter<ReductionOperation>("TargetOperation", "The operation used to apply the reduced value to the target variable."));
+      Parameters.Add(new ValueLookupParameter<ReductionOperation>("ReductionOperation", "The operation which is applied on the parameters to reduce.", new ReductionOperation()));
+      Parameters.Add(new ValueLookupParameter<ReductionOperation>("TargetOperation", "The operation used to apply the reduced value to the target variable.", new ReductionOperation()));
       #endregion
     }
@@ -65,4 +65,19 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       return new DataReducer(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      var oldReductionOperation = Parameters["ReductionOperation"] as ValueParameter<ReductionOperation>;
+      if (oldReductionOperation != null) {
+        Parameters.Remove("ReductionOperation");
+        Parameters.Add(new ValueLookupParameter<ReductionOperation>("ReductionOperation", "The operation which is applied on the parameters to reduce.", oldReductionOperation.Value));
+      }
+      var oldTargetOperation = Parameters["TargetOperation"] as ValueParameter<ReductionOperation>;
+      if (oldTargetOperation != null) {
+        Parameters.Remove("TargetOperation");
+        Parameters.Add(new ValueLookupParameter<ReductionOperation>("TargetOperation", "The operation used to apply the reduced value to the target variable.", oldTargetOperation.Value));
+      }
     }
 
@@ -89,5 +104,5 @@
     private void CalculateResult(IEnumerable<int> values, Type targetType) {
       int result;
-      switch (ReductionOperation.Value.Value) {
+      switch (ReductionOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           result = values.Sum();
@@ -116,5 +131,5 @@
 
       IntValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           target = InitializeTarget<IntValue, int>(targetType, 0);
@@ -149,5 +164,5 @@
     private void CalculateResult(IEnumerable<double> values, Type targetType) {
       double result;
-      switch (ReductionOperation.Value.Value) {
+      switch (ReductionOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           result = values.Sum();
@@ -176,5 +191,5 @@
 
       DoubleValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           target = InitializeTarget<DoubleValue, double>(targetType, 0.0);
@@ -209,5 +224,5 @@
     private void CalculateResult(IEnumerable<TimeSpan> values, Type targetType) {
       TimeSpan result;
-      switch (ReductionOperation.Value.Value) {
+      switch (ReductionOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           result = values.Aggregate(new TimeSpan(), (x, y) => x + y);
@@ -230,5 +245,5 @@
 
       TimeSpanValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, new TimeSpan());
@@ -259,5 +274,5 @@
     private void CalculateResult(IEnumerable<bool> values, Type targetType) {
       bool result;
-      switch (ReductionOperation.Value.Value) {
+      switch (ReductionOperation.ActualValue.Value) {
         case ReductionOperations.All:
           result = values.All(x => x);
@@ -271,5 +286,5 @@
 
       BoolValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Assign:
           target = InitializeTarget<BoolValue, bool>(targetType, true);
