Index: /branches/TerminationCriteria/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 12409)
+++ /branches/TerminationCriteria/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 12410)
@@ -83,6 +83,6 @@
       get { return (IFixedValueParameter<BoolValue>)Parameters["ReevaluateElites"]; }
     }
-    private ValueParameter<IntValue> MaximumGenerationsParameter {
-      get { return (ValueParameter<IntValue>)Parameters["MaximumGenerations"]; }
+    private IFixedValueParameter<IntValue> MaximumGenerationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["MaximumGenerations"]; }
     }
     private ValueLookupParameter<DoubleValue> SuccessRatioParameter {
@@ -158,7 +158,7 @@
       set { ReevaluateElitesParameter.Value.Value = value; }
     }
-    public IntValue MaximumGenerations {
-      get { return MaximumGenerationsParameter.Value; }
-      set { MaximumGenerationsParameter.Value = value; }
+    public int MaximumGenerations {
+      get { return MaximumGenerationsParameter.Value.Value; }
+      set { MaximumGenerationsParameter.Value.Value = value; }
     }
     public DoubleValue SuccessRatio {
@@ -194,5 +194,4 @@
       set { AnalyzerParameter.Value = value; }
     }
-
     public IntValue MaximumEvaluatedSolutions {
       get { return MaximumEvaluatedSolutionsParameter.Value; }
@@ -222,5 +221,5 @@
     private SuccessfulOffspringAnalyzer successfulOffspringAnalyzer;
     [Storable]
-    private ComparisonTerminator<IntValue> generationsTerminator;
+    private MaximumIterationsTerminator generationsTerminator;
     [Storable]
     private ComparisonTerminator<IntValue> evaluatedSolutionsTerminator;
@@ -228,5 +227,5 @@
     private ComparisonTerminator<DoubleValue> selectionPressureTerminator;
     [Storable]
-    private ComparisonTerminator<DoubleValue> qualityTerminator;
+    private SingleObjectiveQualityTerminator qualityTerminator;
     [Storable]
     private ExecutionTimeTerminator executionTimeTerminator;
@@ -276,5 +275,5 @@
       Parameters.Add(new ValueParameter<IntValue>("Elites", "The numer of elite solutions which are kept in each generation.", new IntValue(1)));
       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>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntValue(1000)));
+      Parameters.Add(new FixedValueParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntValue(1000)));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("SuccessRatio", "The ratio of successful to total children that should be achieved.", new DoubleValue(1)));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("ComparisonFactorLowerBound", "The lower bound of the comparison factor (start).", new DoubleValue(0)));
@@ -339,4 +338,18 @@
       ParameterizeSelectors();
 
+      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
+      selectionPressureAnalyzer = new ValueAnalyzer();
+      successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
+      ParameterizeAnalyzers();
+      UpdateAnalyzers();
+
+      generationsTerminator = new MaximumIterationsTerminator();
+      evaluatedSolutionsTerminator = new ComparisonTerminator<IntValue>("EvaluatedSolutions", ComparisonType.Less, new IntValue(int.MaxValue)) { Name = "Evaluations" };
+      selectionPressureTerminator = new ComparisonTerminator<DoubleValue>("SelectionPressure", ComparisonType.Less, new DoubleValue(200)) { Name = "Selection Pressure" };
+      qualityTerminator = new SingleObjectiveQualityTerminator();
+      executionTimeTerminator = new ExecutionTimeTerminator(this, new TimeSpanValue(TimeSpan.FromMinutes(5))) { Name = "Execution Time" };
+      ParameterizeTerminators();
+      UpdateTerminators();
+
       foreach (IDiscreteDoubleValueModifier modifier in ApplicationManager.Manager.GetInstances<IDiscreteDoubleValueModifier>().OrderBy(x => x.Name))
         ComparisonFactorModifierParameter.ValidValues.Add(modifier);
@@ -344,18 +357,4 @@
       if (linearModifier != null) ComparisonFactorModifierParameter.Value = linearModifier;
       ParameterizeComparisonFactorModifiers();
-
-      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
-      selectionPressureAnalyzer = new ValueAnalyzer();
-      successfulOffspringAnalyzer = new SuccessfulOffspringAnalyzer();
-      ParameterizeAnalyzers();
-      UpdateAnalyzers();
-
-      generationsTerminator = new ComparisonTerminator<IntValue>("Generations", ComparisonType.Less, new IntValue(50)) { Name = "Generations" };
-      evaluatedSolutionsTerminator = new ComparisonTerminator<IntValue>("EvaluatedSolutions", ComparisonType.Less, new IntValue(int.MaxValue)) { Name = "Evaluations" };
-      selectionPressureTerminator = new ComparisonTerminator<DoubleValue>("SelectionPressure", ComparisonType.Less, new DoubleValue(200)) { Name = "Selection Pressure" };
-      qualityTerminator = new ComparisonTerminator<DoubleValue>(new DoubleValue()) { Name = "Quality" };
-      executionTimeTerminator = new ExecutionTimeTerminator(this, new TimeSpanValue(TimeSpan.FromMinutes(5))) { Name = "Execution Time" };
-      ParameterizeTerminators();
-      UpdateTerminators();
 
       Initialize();
@@ -504,13 +503,8 @@
     }
     private void ParameterizeTerminators() {
-      qualityTerminator.ComparisonValueParameter.ActualName = qualityAnalyzer.CurrentBestQualityParameter.Name;
-      if (Problem != null) {
-        var maximizationParameter = (IValueParameter<BoolValue>)Problem.MaximizationParameter;
-        if (maximizationParameter != null) {
-          bool maximization = maximizationParameter.Value.Value;
-          qualityTerminator.Comparison = maximization ? ComparisonType.Less : ComparisonType.Greater;
-          qualityTerminator.Threshold.Value = maximization ? double.MaxValue : double.MinValue;
-        }
-      }
+      generationsTerminator.IterationsParameter.ActualName = "Generations";
+      generationsTerminator.MaximumIterationsParameter = MaximumGenerationsParameter;
+
+      qualityTerminator.Parameterize(qualityAnalyzer.CurrentBestQualityParameter, Problem);
     }
     private void ParameterizeComparisonFactorModifiers() {
@@ -572,4 +566,5 @@
     }
     private void UpdateTerminators() {
+      // ToDo restore checked state
       Terminators.Operators.Clear();
       if (Problem != null) {
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj	(revision 12409)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj	(revision 12410)
@@ -73,4 +73,8 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -141,4 +145,7 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="IThresholdTerminator.cs" />
+    <Compile Include="MaximumIterationsTerminator.cs" />
+    <Compile Include="SingleObjectiveQualityTerminator.cs" />
     <Compile Include="ThresholdTerminator.cs" />
     <Compile Include="Views\ThresholdTerminatorView.cs">
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/IThresholdTerminator.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/IThresholdTerminator.cs	(revision 12410)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/IThresholdTerminator.cs	(revision 12410)
@@ -0,0 +1,28 @@
+﻿#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 HeuristicLab.Core;
+
+namespace HeuristicLab.Termination {
+  public interface IThresholdTerminator : ITerminator {
+    IParameter ThresholdParameter { get; }
+  }
+}
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/MaximumIterationsTerminator.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/MaximumIterationsTerminator.cs	(revision 12410)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/MaximumIterationsTerminator.cs	(revision 12410)
@@ -0,0 +1,116 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Termination {
+  [Item("MaximumIterationsTerminator", "")]
+  [StorableClass]
+  public class MaximumIterationsTerminator : Terminator, IThresholdTerminator/*, IIterationBasedOperator*/ {
+    public ILookupParameter<IntValue> IterationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Iterations"]; }
+    }
+
+    [Storable]
+    private IFixedValueParameter<IntValue> maximumIterationsParameter;
+    public IFixedValueParameter<IntValue> MaximumIterationsParameter {
+      get { return maximumIterationsParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("MaximumIterations parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("MaximumIterations parameter value must not be null.");
+        if (maximumIterationsParameter == value) return;
+
+        if (maximumIterationsParameter != null) Parameters.Remove(maximumIterationsParameter);
+        maximumIterationsParameter = value;
+        Parameters.Add(maximumIterationsParameter);
+        OnMaximumIterationsParameterChanged();
+      }
+    }
+    IParameter IThresholdTerminator.ThresholdParameter {
+      get { return MaximumIterationsParameter; }
+    }
+
+    public int MaximumIterations {
+      get { return MaximumIterationsParameter.Value.Value; }
+      set { MaximumIterationsParameter.Value.Value = value; }
+    }
+
+
+    [StorableConstructor]
+    protected MaximumIterationsTerminator(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    protected MaximumIterationsTerminator(MaximumIterationsTerminator original, Cloner cloner)
+      : base(original, cloner) {
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MaximumIterationsTerminator(this, cloner);
+    }
+
+    public MaximumIterationsTerminator()
+      : base() {
+      Parameters.Add(new LookupParameter<IntValue>("Iterations", "The current iteration.") { Hidden = false });
+      Parameters.Add(new FixedValueParameter<IntValue>("MaximumIterations", "The maximum number of iterations the algorithm should perform."));
+      Initialize();
+    }
+
+    private void Initialize() {
+      IterationsParameter.ActualNameChanged += new EventHandler(IterationsParameter_ActualNameChanged);
+      RegisterMaximumIterationsParameterEvents();
+    }
+
+    private void MaximumIterations_ValueChanged(object sender, EventArgs e) {
+      OnMaximumIterationsChanged();
+    }
+    private void IterationsParameter_ActualNameChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    protected virtual void OnMaximumIterationsChanged() {
+      OnToStringChanged();
+    }
+    private void OnMaximumIterationsParameterChanged() {
+      RegisterMaximumIterationsParameterEvents();
+    }
+
+    private void RegisterMaximumIterationsParameterEvents() {
+      MaximumIterationsParameter.Value.ValueChanged += new EventHandler(MaximumIterations_ValueChanged);
+    }
+
+    protected override bool CheckContinueCriterion() {
+      int iterations = IterationsParameter.ActualValue.Value;
+
+      return iterations < MaximumIterations;
+    }
+
+    public override string ToString() {
+      return string.Format("{0} < {1}", IterationsParameter.ActualName, MaximumIterations);
+    }
+  }
+}
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/SingleObjectiveQualityTerminator.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/SingleObjectiveQualityTerminator.cs	(revision 12410)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/SingleObjectiveQualityTerminator.cs	(revision 12410)
@@ -0,0 +1,45 @@
+﻿#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 HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Termination {
+  [Item("SingleObjectiveQualityTerminator", "")]
+  public class SingleObjectiveQualityTerminator : ComparisonTerminator<DoubleValue> {
+    public SingleObjectiveQualityTerminator() {
+      Name = "Quality";
+    }
+
+    public void Parameterize(IParameter qualityParameter, ISingleObjectiveHeuristicOptimizationProblem problem) {
+      ComparisonValueParameter.ActualName = qualityParameter.Name;
+      if (problem != null) {
+        var maximizationParameter = (IValueParameter<BoolValue>)problem.MaximizationParameter;
+        if (maximizationParameter != null) {
+          bool maximization = maximizationParameter.Value.Value;
+          Comparison = maximization ? ComparisonType.Less : ComparisonType.Greater;
+          Threshold.Value = maximization ? double.MaxValue : double.MinValue;
+        }
+      }
+    }
+  }
+}
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationOperator.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationOperator.cs	(revision 12409)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationOperator.cs	(revision 12410)
@@ -82,5 +82,5 @@
     public override IOperation InstrumentedApply() {
       var next = new OperationCollection(base.InstrumentedApply());
-      if (TerminateParameter.ActualValue != null && TerminateParameter.ActualValue.Value) {
+      if (TerminateParameter.ActualValue.Value) {
         if (TerminateBranch != null) next.Insert(0, ExecutionContext.CreateOperation(TerminateBranch));
       } else {
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/ThresholdTerminator.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/ThresholdTerminator.cs	(revision 12409)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/ThresholdTerminator.cs	(revision 12410)
@@ -31,7 +31,10 @@
   [Item("ThresholdTerminator", "Base class for all termination criteria which specifies some threshold.")]
   [StorableClass]
-  public abstract class ThresholdTerminator<T> : Terminator where T : class, IItem, IStringConvertibleValue, new() {
+  public abstract class ThresholdTerminator<T> : Terminator, IThresholdTerminator where T : class, IItem, IStringConvertibleValue, new() {
     public IFixedValueParameter<T> ThresholdParameter {
       get { return (IFixedValueParameter<T>)Parameters["Threshold"]; }
+    }
+    IParameter IThresholdTerminator.ThresholdParameter {
+      get { return ThresholdParameter; }
     }
 
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/Views/ThresholdTerminatorView.Designer.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/Views/ThresholdTerminatorView.Designer.cs	(revision 12409)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/Views/ThresholdTerminatorView.Designer.cs	(revision 12410)
@@ -25,5 +25,5 @@
 
 namespace HeuristicLab.Termination.Views {
-  partial class ThresholdTerminatorView<T> where T : class, IItem, IComparable, IStringConvertibleValue, new() {
+  partial class ThresholdTerminatorView {
     /// <summary> 
     /// Required designer variable.
Index: /branches/TerminationCriteria/HeuristicLab.Termination/3.3/Views/ThresholdTerminatorView.cs
===================================================================
--- /branches/TerminationCriteria/HeuristicLab.Termination/3.3/Views/ThresholdTerminatorView.cs	(revision 12409)
+++ /branches/TerminationCriteria/HeuristicLab.Termination/3.3/Views/ThresholdTerminatorView.cs	(revision 12410)
@@ -20,8 +20,5 @@
 #endregion
 
-using System;
-using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
-using HeuristicLab.Data;
 using HeuristicLab.MainForm;
 
@@ -29,9 +26,9 @@
 
   [View("ThresholdTerminator View")]
-  [Content(typeof(ThresholdTerminator<>), true)]
-  public partial class ThresholdTerminatorView<T> : ItemView where T : class, IItem, IComparable, IStringConvertibleValue, new() {
+  [Content(typeof(IThresholdTerminator), true)]
+  public partial class ThresholdTerminatorView : ItemView {
 
-    public new ThresholdTerminator<T> Content {
-      get { return (ThresholdTerminator<T>)base.Content; }
+    public new IThresholdTerminator Content {
+      get { return (IThresholdTerminator)base.Content; }
       set { base.Content = value; }
     }
@@ -45,6 +42,6 @@
       viewHost.Content = null;
       if (Content != null) {
-        if (Content.ThresholdParameter.Value != null)
-          viewHost.Content = Content.ThresholdParameter.Value;
+        if (Content.ThresholdParameter.ActualValue != null)
+          viewHost.Content = Content.ThresholdParameter.ActualValue;
         else
           viewHost.Content = Content.ThresholdParameter;
