Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS.SteadyState/3.3/AlpsSsGeneticAlgorithm.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS.SteadyState/3.3/AlpsSsGeneticAlgorithm.cs	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS.SteadyState/3.3/AlpsSsGeneticAlgorithm.cs	(revision 12271)
@@ -131,5 +131,4 @@
       Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateElites", "Flag to determine if elite individuals should be reevaluated (i.e., if stochastic fitness functions are used.)", new BoolValue(false)) { Hidden = true });
       Parameters.Add(new ValueParameter<IntValue>("BatchSize", "Number of inner iterations before updates and analyzers are fired.", new IntValue(100)) { Hidden = true });
-      AgeInheritance = new ReductionOperation(ReductionOperations.Min);
 
       var randomCreator = new RandomCreator();
@@ -282,4 +281,13 @@
     }
 
+    protected override ReductionOperations GetAgeInheritanceReduction(AgeInheritance ageInheritance) {
+      switch (ageInheritance) {
+        case ALPS.AgeInheritance.Older: return ReductionOperations.Min;
+        case ALPS.AgeInheritance.Agerage: return ReductionOperations.Avg;
+        case ALPS.AgeInheritance.Younger: return ReductionOperations.Max;
+        default: throw new NotSupportedException("AgeInheritance " + ageInheritance + " is not supported.");
+      }
+    }
+
     protected override void ParameterizeStochasticOperator(IOperator @operator) {
       var stochasticOperator = @operator as IStochasticOperator;
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS.SteadyState/3.3/AlpsSsGeneticAlgorithmMainOperator.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS.SteadyState/3.3/AlpsSsGeneticAlgorithmMainOperator.cs	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS.SteadyState/3.3/AlpsSsGeneticAlgorithmMainOperator.cs	(revision 12271)
@@ -48,5 +48,5 @@
       var mutator = new Placeholder() { Name = "Mutator (Placeholder)" };
       var ageReducer = new DataReducer() { Name = "Calculate EvalsCreated" };
-      var lastMoveReducer = new DataReducer() { Name = "Calculate LastMove" };
+      var lastMoveAssigner = new Assigner() { Name = "Set LastMove" };
       var subScopesRemover = new SubScopesRemover();
       var evaluator = new Placeholder() { Name = "Evaluator (Placeholder)" };
@@ -71,16 +71,13 @@
 
       ageReducer.ParameterToReduce.ActualName = "EvalsCreated";
-      ageReducer.ReductionOperation.ActualName = "AgeInheritance";
+      ageReducer.ReductionOperation.ActualName = "AgeInheritanceReduction";
       ageReducer.ReductionOperation.Value = null;
       ageReducer.TargetParameter.ActualName = "EvalsCreated";
       ageReducer.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
-      ageReducer.Successor = lastMoveReducer;
+      ageReducer.Successor = lastMoveAssigner;
 
-      lastMoveReducer.ParameterToReduce.ActualName = "LastMove";
-      lastMoveReducer.ReductionOperation.ActualName = "AgeInheritance";
-      lastMoveReducer.ReductionOperation.Value = null;
-      lastMoveReducer.TargetParameter.ActualName = "LastMove";
-      lastMoveReducer.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
-      lastMoveReducer.Successor = subScopesRemover;
+      lastMoveAssigner.LeftSideParameter.ActualName = "LastMove";
+      lastMoveAssigner.RightSideParameter.ActualName = "EvaluatedSolutions";
+      lastMoveAssigner.Successor = subScopesRemover;
 
       subScopesRemover.Successor = evaluator;
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgeInheritance.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgeInheritance.cs	(revision 12271)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgeInheritance.cs	(revision 12271)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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
+
+namespace HeuristicLab.Algorithms.ALPS {
+
+  /// <summary>
+  /// Defines how the age of a new individual is calculated during the crossover of two parent individuals.
+  /// </summary>
+  public enum AgeInheritance {
+    Older,
+    Agerage,
+    Younger
+  }
+}
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgingScheme.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgingScheme.cs	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgingScheme.cs	(revision 12271)
@@ -20,5 +20,13 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Data;
+
 namespace HeuristicLab.Algorithms.ALPS {
+  /// <summary>
+  /// Defines the growth of age limits for the layers.
+  /// </summary>
   public enum AgingScheme {
     Linear,
@@ -27,3 +35,46 @@
     Exponential
   }
+
+  /// <summary>
+  /// Helper for calculating the age limits for a AgingScheme and a given AgeGap.
+  /// </summary>
+  public static class AgingSchemeCalculator {
+    public static IntArray CalculateAgeLimits(this AgingScheme scheme, int ageGap, int numberOfLayers) {
+      IEnumerable<int> schemeGenerator;
+      switch (scheme) {
+        case AgingScheme.Linear: schemeGenerator = LinearAgingScheme(); break;
+        case AgingScheme.Fibonacci: schemeGenerator = FibonacciAgingScheme(); break;
+        case AgingScheme.Polynomial: schemeGenerator = PolynomialAgingScheme(2); break;
+        case AgingScheme.Exponential: schemeGenerator = ExponentialAgingScheme(2); break;
+        default: throw new NotSupportedException("Aging Scheme " + scheme + " is not supported.");
+      }
+
+      return new IntArray(schemeGenerator.Select(a => a * ageGap).Take(numberOfLayers).ToArray());
+    }
+
+    #region Scheme definitions
+    // 1 2 3 4 5 6 7 ...
+    private static IEnumerable<int> LinearAgingScheme() {
+      for (int i = 0; ; i++)
+        yield return i + 1;
+    }
+    // 1 2 3 5 8 13 21 ...
+    private static IEnumerable<int> FibonacciAgingScheme() {
+      for (int i = 1, next = 2, temp; ; temp = next, next = i + next, i = temp)
+        yield return i;
+    }
+    // (n^2): 1 2 4 9 16 25 36 ...
+    private static IEnumerable<int> PolynomialAgingScheme(double exp) {
+      yield return 1;
+      yield return 2;
+      for (int i = 2; ; i++)
+        yield return (int)Math.Pow(i, exp);
+    }
+    // 1 2 4 8 16 32 64 ...
+    private static IEnumerable<int> ExponentialAgingScheme(double @base) {
+      for (int i = 0; ; i++)
+        yield return (int)Math.Pow(@base, i);
+    }
+    #endregion
+  }
 }
Index: anches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgingSchemeCalculator.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AgingSchemeCalculator.cs	(revision 12270)
+++ 	(revision )
@@ -1,66 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 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 System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.Algorithms.ALPS {
-  public static class AgingSchemeCalculator {
-    public static IntArray CalculateAgeLimits(AgingScheme scheme, int ageGap, int numberOfLayers) {
-      IEnumerable<int> schemeGenerator;
-      switch (scheme) {
-        case AgingScheme.Linear: schemeGenerator = LinearAgingScheme(); break;
-        case AgingScheme.Fibonacci: schemeGenerator = FibonacciAgingScheme(); break;
-        case AgingScheme.Polynomial: schemeGenerator = PolynomialAgingScheme(2); break;
-        case AgingScheme.Exponential: schemeGenerator = ExponentialAgingScheme(2); break;
-        default: throw new NotSupportedException("Aging Scheme " + scheme + " is not supported.");
-      }
-
-      return new IntArray(schemeGenerator.Select(a => a * ageGap).Take(numberOfLayers).ToArray());
-    }
-
-    // 1 2 3 4 5 6 7 ...
-    private static IEnumerable<int> LinearAgingScheme() {
-      for (int i = 0; ; i++)
-        yield return i + 1;
-    }
-    // 1 2 3 5 8 13 21 ...
-    private static IEnumerable<int> FibonacciAgingScheme() {
-      for (int i = 1, next = 2, temp; ; temp = next, next = i + next, i = temp)
-        yield return i;
-    }
-    // (n^2): 1 2 4 9 16 25 36 ...
-    private static IEnumerable<int> PolynomialAgingScheme(double exp) {
-      yield return 1;
-      yield return 2;
-      for (int i = 2; ; i++)
-        yield return (int)Math.Pow(i, exp);
-
-    }
-    // 1 2 4 8 16 32 64 ...
-    private static IEnumerable<int> ExponentialAgingScheme(double @base) {
-      for (int i = 0; ; i++)
-        yield return (int)Math.Pow(@base, i);
-    }
-  }
-}
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/Alps.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/Alps.cs	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/Alps.cs	(revision 12271)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Analysis;
@@ -36,5 +35,5 @@
 
 namespace HeuristicLab.Algorithms.ALPS {
-  [Item("ALPS", "A base class for all ALPS-based algorithms.")]
+  [Item("ALPS", "Base class for all ALPS-based algorithms.")]
   [StorableClass]
   public abstract class Alps : HeuristicOptimizationEngineAlgorithm, IStorableContent {
@@ -76,6 +75,9 @@
       get { return (IValueParameter<IntArray>)Parameters["AgeLimits"]; }
     }
-    private IValueParameter<ReductionOperation> AgeInheritanceParameter {
-      get { return (IValueParameter<ReductionOperation>)Parameters["AgeInheritance"]; }
+    private IValueParameter<EnumValue<AgeInheritance>> AgeInheritanceParameter {
+      get { return (IValueParameter<EnumValue<AgeInheritance>>)Parameters["AgeInheritance"]; }
+    }
+    private IValueParameter<ReductionOperation> AgeInheritanceReductionParameter {
+      get { return (IValueParameter<ReductionOperation>)Parameters["AgeInheritanceReduction"]; }
     }
     private IValueParameter<IntValue> MatingPoolRangeParameter {
@@ -118,7 +120,11 @@
       set { AgeLimitsParameter.Value = value; }
     }
-    public ReductionOperation AgeInheritance {
+    public EnumValue<AgeInheritance> AgeInheritance {
       get { return AgeInheritanceParameter.Value; }
       set { AgeInheritanceParameter.Value = value; }
+    }
+    private ReductionOperation AgeInheritanceReduction {
+      get { return AgeInheritanceReductionParameter.Value; }
+      set { AgeInheritanceReductionParameter.Value = value; }
     }
     public IntValue MatingPoolRange {
@@ -168,5 +174,6 @@
       Parameters.Add(new ValueParameter<IntValue>("AgeGap", "The frequency of reseeding the lowest layer and scaling factor for the age-limits for the layers", new IntValue(20)));
       Parameters.Add(new ValueParameter<IntArray>("AgeLimits", new IntArray(new int[0])) { Hidden = true });
-      Parameters.Add(new ValueParameter<ReductionOperation>("AgeInheritance", "The operator for determining the age of an offspring based the parents' age.", new ReductionOperation(ReductionOperations.Max)) { Hidden = true });
+      Parameters.Add(new ValueParameter<EnumValue<AgeInheritance>>("AgeInheritance", "The operator for determining the age of an offspring based the parents' age.", new EnumValue<AgeInheritance>(ALPS.AgeInheritance.Older)));
+      Parameters.Add(new ValueParameter<ReductionOperation>("AgeInheritanceReduction") { Hidden = true });
       Parameters.Add(new ValueParameter<IntValue>("MatingPoolRange", "The range of layers used for creating a mating pool. (1 = current + previous layer)", new IntValue(1)) { Hidden = true });
       Parameters.Add(new ValueParameter<PercentValue>("MatingPoolSelectionPercentage", "Percentage of the previous layers used for creating a mating pool.", new PercentValue(1.0, restrictToUnitInterval: true)) { Hidden = true });
@@ -175,7 +182,6 @@
       layerQualityAnalyzer = new BestAverageWorstQualityAnalyzer();
 
-      // Create Operator Graph
-
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
+      ParameterizeAgeInheritanceReduction();
 
       ParameterizeAnalyzers();
@@ -185,4 +191,6 @@
     }
 
+
+    #region Events
     public override void Prepare() {
       if (Problem != null)
@@ -190,5 +198,4 @@
     }
 
-    #region Events
     protected override void OnProblemChanged() {
       base.OnProblemChanged();
@@ -227,22 +234,29 @@
     private void AgeGapParameter_ValueChanged(object sender, EventArgs e) {
       AgeGap.ValueChanged += AgeGap_ValueChanged;
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
     }
     private void AgeGap_ValueChanged(object sender, EventArgs e) {
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
     }
     private void AgingSchemeParameter_ValueChanged(object sender, EventArgs e) {
       AgingScheme.ValueChanged += AgingScheme_ValueChanged;
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
     }
     private void AgingScheme_ValueChanged(object sender, EventArgs e) {
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
     }
     private void NumberOfLayersParameter_ValueChanged(object sender, EventArgs e) {
       NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
     }
     private void NumberOfLayers_ValueChanged(object sender, EventArgs e) {
-      RecalculateAgeLimits();
+      ParameterizeAgeLimits();
+    }
+    private void AgeInheritanceParameter_ValueChanged(object sender, EventArgs e) {
+      AgeInheritance.ValueChanged += AgeInheritance_ValueChanged;
+      ParameterizeAgeInheritanceReduction();
+    }
+    private void AgeInheritance_ValueChanged(object sender, EventArgs e) {
+      ParameterizeAgeInheritanceReduction();
     }
     private void AnalyzerOperators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IAnalyzer>> e) {
@@ -278,4 +292,6 @@
       NumberOfLayersParameter.ValueChanged += NumberOfLayersParameter_ValueChanged;
       NumberOfLayers.ValueChanged += NumberOfLayers_ValueChanged;
+      AgeInheritanceParameter.ValueChanged += AgeInheritanceParameter_ValueChanged;
+      AgeInheritance.ValueChanged += AgeInheritance_ValueChanged;
       Analyzer.Operators.ItemsAdded += AnalyzerOperators_ItemsAdded;
       LayerAnalyzer.Operators.ItemsAdded += LayerAnalyzerOperators_ItemsAdded;
@@ -307,4 +323,15 @@
       }
     }
+
+    private void ParameterizeAgeInheritanceReduction() {
+      AgeInheritanceReduction.Value = GetAgeInheritanceReduction(AgeInheritance.Value);
+    }
+    protected abstract ReductionOperations GetAgeInheritanceReduction(AgeInheritance ageInheritance);
+    private void ParameterizeAgeLimits() {
+      var scheme = AgingScheme.Value;
+      int ageGap = AgeGap.Value;
+      int numberOfLayers = NumberOfLayers.Value;
+      AgeLimits = scheme.CalculateAgeLimits(ageGap, numberOfLayers);
+    }
     protected virtual void ParameterizeStochasticOperator(IOperator @operator) {
       var stochasticOperator = @operator as IStochasticOperator;
@@ -338,11 +365,4 @@
     }
     #endregion
-
-    private void RecalculateAgeLimits() {
-      var scheme = AgingScheme.Value;
-      int ageGap = AgeGap.Value;
-      int numberOfLayers = NumberOfLayers.Value;
-      AgeLimits = AgingSchemeCalculator.CalculateAgeLimits(scheme, ageGap, numberOfLayers);
-    }
   }
 }
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithm.cs	(revision 12271)
@@ -279,4 +279,13 @@
       }
     }
+
+    protected override ReductionOperations GetAgeInheritanceReduction(AgeInheritance ageInheritance) {
+      switch (ageInheritance) {
+        case ALPS.AgeInheritance.Older: return ReductionOperations.Max;
+        case ALPS.AgeInheritance.Agerage: return ReductionOperations.Avg;
+        case ALPS.AgeInheritance.Younger: return ReductionOperations.Min;
+        default: throw new NotSupportedException("AgeInheritance " + ageInheritance + " is not supported.");
+      }
+    }
     #endregion
 
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs	(revision 12271)
@@ -246,5 +246,5 @@
       ageCalculator.TargetParameter.ActualName = "Age";
       ageCalculator.ReductionOperation.Value = null;
-      ageCalculator.ReductionOperation.ActualName = "AgeInheritance";
+      ageCalculator.ReductionOperation.ActualName = "AgeInheritanceReduction";
       ageCalculator.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
       ageCalculator.Successor = crossoverSuccessor;
Index: /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/HeuristicLab.Algorithms.ALPS-3.3.csproj
===================================================================
--- /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/HeuristicLab.Algorithms.ALPS-3.3.csproj	(revision 12270)
+++ /branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/HeuristicLab.Algorithms.ALPS-3.3.csproj	(revision 12271)
@@ -132,5 +132,5 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="AgingSchemeCalculator.cs" />
+    <Compile Include="AgeInheritance.cs" />
     <Compile Include="Alps.cs" />
     <Compile Include="Analyzers\OldestAverageYoungestAgeAnalyzer.cs" />
