Index: branches/TerminationCriteria/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 12312)
+++ branches/TerminationCriteria/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 12328)
@@ -194,4 +194,5 @@
       set { AnalyzerParameter.Value = value; }
     }
+
     public IntValue MaximumEvaluatedSolutions {
       get { return MaximumEvaluatedSolutionsParameter.Value; }
@@ -202,4 +203,7 @@
       set { FillPopulationWithParentsParameter.Value.Value = value; }
     }
+    private MultiTerminationCriterion TerminationCriteria {
+      get { return TerminationCriteriaParameter.Value; }
+    }
     private RandomCreator RandomCreator {
       get { return (RandomCreator)OperatorGraph.InitialOperator; }
@@ -217,4 +221,14 @@
     [Storable]
     private SuccessfulOffspringAnalyzer successfulOffspringAnalyzer;
+    [Storable]
+    private ComparisonTerminationCriterion<IntValue> maximumGenerationsTerminationCriterion;
+    [Storable]
+    private ComparisonTerminationCriterion<IntValue> maximumEvaluatedSolutionsTerminationCriterion;
+    [Storable]
+    private ComparisonTerminationCriterion<DoubleValue> maximumSelectionPressureTerminationCriterion;
+    [Storable]
+    private ComparisonTerminationCriterion<DoubleValue> qualityTerminationCriterion;
+    [Storable]
+    private ExecutionTimeTimeTerminationCriterion executionTimeTerminationCriterion;
     #endregion
 
@@ -241,4 +255,9 @@
       selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
       successfulOffspringAnalyzer = cloner.Clone(original.successfulOffspringAnalyzer);
+      maximumGenerationsTerminationCriterion = cloner.Clone(original.maximumGenerationsTerminationCriterion);
+      maximumEvaluatedSolutionsTerminationCriterion = cloner.Clone(original.maximumEvaluatedSolutionsTerminationCriterion);
+      maximumSelectionPressureTerminationCriterion = cloner.Clone(original.maximumSelectionPressureTerminationCriterion);
+      qualityTerminationCriterion = cloner.Clone(original.qualityTerminationCriterion);
+      executionTimeTerminationCriterion = cloner.Clone(original.executionTimeTerminationCriterion);
       Initialize();
     }
@@ -331,5 +350,11 @@
       ParameterizeAnalyzers();
       UpdateAnalyzers();
-      AddTerminationCriteria();
+
+      maximumGenerationsTerminationCriterion = new ComparisonTerminationCriterion<IntValue>("Generations", "MaximumGenerations", ComparisonType.GreaterOrEqual) { Name = "Maximum Generations" };
+      maximumEvaluatedSolutionsTerminationCriterion = new ComparisonTerminationCriterion<IntValue>("EvaluatedSolutions", "MaximumEvaluatedSolutions", ComparisonType.GreaterOrEqual) { Name = "Maximum Evaluations" };
+      maximumSelectionPressureTerminationCriterion = new ComparisonTerminationCriterion<DoubleValue>("SelectionPressure", "MaximumSelectionPressure", ComparisonType.GreaterOrEqual) { Name = "Maximum Selection" };
+      qualityTerminationCriterion = new ComparisonTerminationCriterion<DoubleValue>() { Name = "Maximum/Minimum Quality" };
+      executionTimeTerminationCriterion = new ExecutionTimeTimeTerminationCriterion(this, TimeSpan.FromMinutes(5)) { Name = "Maximum Execution Time" };
+      UpdateTerminationCriteria();
 
       Initialize();
@@ -355,4 +380,5 @@
       UpdateMutators();
       UpdateAnalyzers();
+      UpdateTerminationCriteria();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.OnProblemChanged();
@@ -513,11 +539,21 @@
       Analyzer.Operators.Add(successfulOffspringAnalyzer, successfulOffspringAnalyzer.EnabledByDefault);
     }
-    private void AddTerminationCriteria() {
-      TerminationCriteriaParameter.Value.Operators.Add(
-        new ComparisonTerminationCriterion<IntValue>("Generations", "MaximumGenerations", ComparisonType.GreaterOrEqual) { Name = "Maximum Generations" });
-      TerminationCriteriaParameter.Value.Operators.Add(
-        new ComparisonTerminationCriterion<IntValue>("EvaluatedSolutions", "MaximumEvaluatedSolutions", ComparisonType.GreaterOrEqual) { Name = "Maximum Evaluations" });
-      TerminationCriteriaParameter.Value.Operators.Add(
-        new ComparisonTerminationCriterion<DoubleValue>("SelectionPressure", "MaximumSelectionPressure", ComparisonType.GreaterOrEqual) { Name = "Maximum Selection Pressure" });
+    private void UpdateTerminationCriteria() {
+      TerminationCriteria.Operators.Clear();
+
+      if (Problem != null) {
+        foreach (var terminationCriterion in Problem.Operators.OfType<ITerminationCriterion>())
+          TerminationCriteria.Operators.Add(terminationCriterion);
+        bool maximization = ((BoolValue)Problem.MaximizationParameter.ActualValue).Value;
+        qualityTerminationCriterion.Name = maximization ? "Maximum Quality" : "Minimum Quality";
+        qualityTerminationCriterion.Comparison = new Comparison(maximization ? ComparisonType.GreaterOrEqual : ComparisonType.LessOrEqual);
+        qualityTerminationCriterion.LeftSideParameter.ActualName = qualityAnalyzer.CurrentBestQualityParameter.Name;
+        qualityTerminationCriterion.RightSideParameter.Value = new DoubleValue(maximization ? double.MaxValue : double.MinValue);
+      }
+      TerminationCriteria.Operators.Add(maximumGenerationsTerminationCriterion);
+      TerminationCriteria.Operators.Add(maximumEvaluatedSolutionsTerminationCriterion);
+      TerminationCriteria.Operators.Add(maximumSelectionPressureTerminationCriterion);
+      TerminationCriteria.Operators.Add(qualityTerminationCriterion, checkedState: false);
+      TerminationCriteria.Operators.Add(executionTimeTerminationCriterion, checkedState: false);
     }
     private OffspringSelectionGeneticAlgorithmMainLoop FindMainLoop(IOperator start) {
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/ComparisonTerminationCriterion.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/ComparisonTerminationCriterion.cs	(revision 12312)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/ComparisonTerminationCriterion.cs	(revision 12328)
@@ -28,7 +28,7 @@
 
 namespace HeuristicLab.Termination {
-  [Item("ComparisonTerminationCriterion", "")]
+  [Item("ComparisonTerminationCriterion", "An termination criterion which compares to values.")]
   [StorableClass]
-  public sealed class ComparisonTerminationCriterion<T> : TerminationCriterion where T : class, IItem, IComparable {
+  public class ComparisonTerminationCriterion<T> : TerminationCriterion where T : class, IItem, IComparable {
     public ILookupParameter<T> LeftSideParameter {
       get { return (ILookupParameter<T>)Parameters["LeftSide"]; }
@@ -47,6 +47,6 @@
 
     [StorableConstructor]
-    private ComparisonTerminationCriterion(bool deserializing) : base(deserializing) { }
-    private ComparisonTerminationCriterion(ComparisonTerminationCriterion<T> original, Cloner cloner)
+    protected ComparisonTerminationCriterion(bool deserializing) : base(deserializing) { }
+    protected ComparisonTerminationCriterion(ComparisonTerminationCriterion<T> original, Cloner cloner)
       : base(original, cloner) {
     }
@@ -58,5 +58,5 @@
       Parameters.Add(new LookupParameter<T>("LeftSide", "The left side of the comparison."));
       Parameters.Add(new ValueLookupParameter<T>("RightSide", "The right side of the comparison."));
-      Parameters.Add(new ValueParameter<Comparison>("Comparison", "The type of comparison.", new Comparison(ComparisonType.Equal)) { Hidden = true });
+      Parameters.Add(new ValueParameter<Comparison>("Comparison", "The type of comparison.", new Comparison(ComparisonType.GreaterOrEqual)) { Hidden = true });
     }
     public ComparisonTerminationCriterion(string leftSideActualName, string rightSideActualName, ComparisonType comparison = ComparisonType.GreaterOrEqual)
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/ExecutionTimeTimeTerminationCriterion.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/ExecutionTimeTimeTerminationCriterion.cs	(revision 12328)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/ExecutionTimeTimeTerminationCriterion.cs	(revision 12328)
@@ -0,0 +1,63 @@
+﻿#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("ExecutionTimeTimeTerminationCriterion", "")]
+  [StorableClass]
+  public class ExecutionTimeTimeTerminationCriterion : TerminationCriterion {
+
+    private IValueParameter<TimeSpanValue> MaximumExecutionTimeParameter {
+      get { return (IValueParameter<TimeSpanValue>)Parameters["MaximumExecutionTime"]; }
+    }
+
+    [Storable]
+    private readonly IExecutable executable;
+
+    [StorableConstructor]
+    protected ExecutionTimeTimeTerminationCriterion(bool deserializing) : base(deserializing) { }
+    protected ExecutionTimeTimeTerminationCriterion(ExecutionTimeTimeTerminationCriterion original, Cloner cloner)
+      : base(original, cloner) {
+      executable = cloner.Clone(executable);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExecutionTimeTimeTerminationCriterion(this, cloner);
+    }
+    public ExecutionTimeTimeTerminationCriterion(IExecutable executable)
+      : this(executable, new TimeSpan(0, 10, 0)) { }
+    public ExecutionTimeTimeTerminationCriterion(IExecutable executable, TimeSpan maximumExecutionTime) {
+      this.executable = executable;
+      Parameters.Add(new ValueParameter<TimeSpanValue>("MaximumExecutionTime", "The maximum execution time of an algortihm.", new TimeSpanValue(TimeSpan.FromMinutes(10))));
+    }
+
+    protected override bool CheckTermination() {
+      var max = MaximumExecutionTimeParameter.Value.Value;
+
+      return executable.ExecutionTime > max;
+    }
+  }
+}
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj	(revision 12312)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj	(revision 12328)
@@ -121,4 +121,5 @@
     <Compile Include="ComparisonTerminationCriterion.cs" />
     <Compile Include="MultiTerminationCriterion.cs" />
+    <Compile Include="ExecutionTimeTimeTerminationCriterion.cs" />
     <Compile Include="TerminationCriterion.cs" />
     <Compile Include="TerminationOperator.cs" />
