Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj	(revision 12301)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/HeuristicLab.Termination-3.3.csproj	(revision 12303)
@@ -73,4 +73,40 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -79,6 +115,12 @@
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ITerminationCriterion.cs" />
+    <Compile Include="MaximumIterationsTerminationCriterion.cs" />
+    <Compile Include="MultiTerminationCriterion.cs" />
+    <Compile Include="TerminationCriterion.cs" />
+    <Compile Include="TerminationOperator.cs" />
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/ITerminationCriterion.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/ITerminationCriterion.cs	(revision 12303)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/ITerminationCriterion.cs	(revision 12303)
@@ -0,0 +1,30 @@
+﻿#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 {
+  /// <summary>
+  /// An interface which represents an operator for checking a termination criterion.
+  /// </summary>
+  public interface ITerminationCriterion : IOperator {
+  }
+}
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/MaximumIterationsTerminationCriterion.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/MaximumIterationsTerminationCriterion.cs	(revision 12303)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/MaximumIterationsTerminationCriterion.cs	(revision 12303)
@@ -0,0 +1,59 @@
+﻿#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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Termination {
+  [Item("MaximumIterationsTerminationCriterion", "")]
+  [StorableClass]
+  public sealed class MaximumIterationsTerminationCriterion : TerminationCriterion, IIterationBasedOperator {
+    public ILookupParameter<IntValue> IterationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["Iterations"]; }
+    }
+
+    public IValueLookupParameter<IntValue> MaximumIterationsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MaximumIterations"]; }
+    }
+
+    [StorableConstructor]
+    private MaximumIterationsTerminationCriterion(bool deserializing) : base(deserializing) { }
+    private MaximumIterationsTerminationCriterion(MaximumIterationsTerminationCriterion original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MaximumIterationsTerminationCriterion(this, cloner);
+    }
+    public MaximumIterationsTerminationCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<IntValue>("Iterations", "The current iteration"));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The number of iterations that the algorithm should run."));
+    }
+
+    protected override bool CheckTermination() {
+      return IterationsParameter.ActualValue.Value >= MaximumIterationsParameter.ActualValue.Value;
+    }
+  }
+}
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/MultiTerminationCriterion.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/MultiTerminationCriterion.cs	(revision 12303)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/MultiTerminationCriterion.cs	(revision 12303)
@@ -0,0 +1,69 @@
+﻿#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.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Termination {
+  [Item("MultiTerminationCriterion", "A multi operator, containing termination criteria.")]
+  [StorableClass]
+  public sealed class MultiTerminationCriterion : CheckedMultiOperator<ITerminationCriterion>, ITerminationCriterion {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
+    }
+    public override Image ItemImage {
+      get {
+        if (Breakpoint) return HeuristicLab.Common.Resources.VSImageLibrary.BreakpointActive;
+        else return base.ItemImage;
+      }
+    }
+
+    public ILookupParameter<BoolValue> TerminateParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["Terminate"]; }
+    }
+
+    [StorableConstructor]
+    private MultiTerminationCriterion(bool deserializing) : base(deserializing) { }
+    private MultiTerminationCriterion(MultiTerminationCriterion original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiTerminationCriterion(this, cloner); }
+
+    public MultiTerminationCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>("Terminate", "The parameter which will be set to determine if execution should be terminated or should continue."));
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (!Operators.CheckedItems.Any()) throw new InvalidOperationException(Name + ": Please add at least one termination criterion.");
+
+      var next = new OperationCollection(base.InstrumentedApply());
+      foreach (var item in Operators.CheckedItems)
+        next.Add(ExecutionContext.CreateOperation(item.Value));
+      return next;
+    }
+  }
+}
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationCriterion.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationCriterion.cs	(revision 12303)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationCriterion.cs	(revision 12303)
@@ -0,0 +1,56 @@
+﻿#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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Termination {
+  [Item("TerminationCriterion", "A base class for all termination criteria.")]
+  [StorableClass]
+  public abstract class TerminationCriterion : InstrumentedOperator, ITerminationCriterion {
+    public ILookupParameter<BoolValue> TerminateParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["Terminate"]; }
+    }
+
+    [StorableConstructor]
+    protected TerminationCriterion(bool deserializing) : base(deserializing) { }
+    protected TerminationCriterion(TerminationCriterion original, Cloner cloner) : base(original, cloner) { }
+
+    protected TerminationCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<BoolValue>("Terminate", "The parameter which will be set to determine if execution should be terminated or should continue."));
+    }
+
+    public sealed override IOperation InstrumentedApply() {
+      if (!TerminateParameter.ActualValue.Value) { // If terminate flag is already set, no need to check further termination criteria.
+        bool terminate = CheckTermination();
+        TerminateParameter.ActualValue = new BoolValue(terminate);
+      }
+      return base.InstrumentedApply();
+    }
+
+    protected abstract bool CheckTermination();
+  }
+}
Index: branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationOperator.cs
===================================================================
--- branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationOperator.cs	(revision 12303)
+++ branches/TerminationCriteria/HeuristicLab.Termination/3.3/TerminationOperator.cs	(revision 12303)
@@ -0,0 +1,99 @@
+﻿#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.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Termination {
+  [Item("Termination Operator", "An operator which either calls the terminate- or the continue branch.")]
+  [StorableClass]
+  public sealed class TerminationOperator : AlgorithmOperator {
+    public ILookupParameter<ITerminationCriterion> TerminationCriteriaParameter {
+      get { return (ILookupParameter<ITerminationCriterion>)Parameters["TerminationCriteria"]; }
+    }
+    public ILookupParameter<BoolValue> TerminateParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["Terminate"]; }
+    }
+    private OperatorParameter ContinueBranchParameter {
+      get { return (OperatorParameter)Parameters["ContinueBranch"]; }
+    }
+    private OperatorParameter TerminateBranchParameter {
+      get { return (OperatorParameter)Parameters["TerminateBranch"]; }
+    }
+
+    public IOperator ContinueBranch {
+      get { return ContinueBranchParameter.Value; }
+      set { ContinueBranchParameter.Value = value; }
+    }
+    public IOperator TerminateBranch {
+      get { return TerminateBranchParameter.Value; }
+      set { TerminateBranchParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    private TerminationOperator(bool deserializing) : base(deserializing) { }
+
+    private TerminationOperator(TerminationOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TerminationOperator(this, cloner);
+    }
+
+    public TerminationOperator()
+      : base() {
+      Parameters.Add(new LookupParameter<ITerminationCriterion>("TerminationCriteria", "The termination criteria which sould be checked."));
+      Parameters.Add(new LookupParameter<BoolValue>("Terminate", "The parameter which will be set to determine if execution should be terminated or schould continue."));
+      Parameters.Add(new OperatorParameter("ContinueBranch", "The operator which is executed if no termination criteria has met."));
+      Parameters.Add(new OperatorParameter("TerminateBranch", "The operator which is executed if any termination criteria has met."));
+
+      var assigner = new Assigner() { Name = "Terminate = false" };
+      var placeholder = new Placeholder() { Name = "Check termination criteria (Placeholder)" };
+      var terminateBranch = new ConditionalBranch() { Name = "Terminate?" };
+
+      OperatorGraph.InitialOperator = assigner;
+
+      assigner.LeftSideParameter.ActualName = TerminateParameter.Name;
+      assigner.RightSideParameter.Value = new BoolValue(false);
+      assigner.Successor = placeholder;
+
+      placeholder.OperatorParameter.ActualName = TerminationCriteriaParameter.Name;
+      placeholder.Successor = terminateBranch;
+    }
+
+    public override IOperation Apply() {
+      var next = new OperationCollection(base.Apply());
+      // ToDo Terminate available after call execution of the operator graph
+      if (TerminateParameter.ActualValue != null && TerminateParameter.ActualValue.Value) {
+        if (TerminateBranch != null) next.Insert(0, ExecutionContext.CreateOperation(TerminateBranch));
+      } else {
+        if (ContinueBranch != null) next.Insert(0, ExecutionContext.CreateOperation(ContinueBranch));
+      }
+      return next;
+    }
+  }
+}
