Index: stable/HeuristicLab.Operators/3.3/DataReducer.cs
===================================================================
--- stable/HeuristicLab.Operators/3.3/DataReducer.cs	(revision 12127)
+++ stable/HeuristicLab.Operators/3.3/DataReducer.cs	(revision 12132)
@@ -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();
@@ -112,9 +127,9 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.ActualValue.Value, targetType));
       }
 
       IntValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           target = InitializeTarget<IntValue, int>(targetType, 0);
@@ -142,5 +157,5 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.ActualValue.Value, targetType));
       }
     }
@@ -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();
@@ -172,9 +187,9 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.ActualValue.Value, targetType));
       }
 
       DoubleValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           target = InitializeTarget<DoubleValue, double>(targetType, 0.0);
@@ -202,5 +217,5 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.ActualValue.Value, targetType));
       }
     }
@@ -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);
@@ -226,9 +241,9 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.ActualValue.Value, targetType));
       }
 
       TimeSpanValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Sum:
           target = InitializeTarget<TimeSpanValue, TimeSpan>(targetType, new TimeSpan());
@@ -252,5 +267,5 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.ActualValue.Value, targetType));
       }
     }
@@ -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);
@@ -267,9 +282,9 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as ReductionOperation for type: {1}.", ReductionOperation.ActualValue.Value, targetType));
       }
 
       BoolValue target;
-      switch (TargetOperation.Value.Value) {
+      switch (TargetOperation.ActualValue.Value) {
         case ReductionOperations.Assign:
           target = InitializeTarget<BoolValue, bool>(targetType, true);
@@ -277,5 +292,5 @@
           break;
         default:
-          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.Value.Value, targetType));
+          throw new InvalidOperationException(string.Format("Operation {0} is not supported as TargetOperation for type: {1}.", TargetOperation.ActualValue.Value, targetType));
       }
     }
