Index: trunk/sources/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 14517)
@@ -48,4 +48,6 @@
 
     private const string IterationsParameterName = "Iterations";
+    private const string BestQualityResultName = "Best quality";
+    private const string IterationsResultName = "Iterations";
 
     public override Type ProblemType {
@@ -66,4 +68,15 @@
     }
 
+    #region ResultsProperties
+    private double ResultsBestQuality {
+      get { return ((DoubleValue)Results[BestQualityResultName].Value).Value; }
+      set { ((DoubleValue)Results[BestQualityResultName].Value).Value = value; }
+    }
+    private int ResultsIterations {
+      get { return ((IntValue)Results[IterationsResultName].Value).Value; }
+      set { ((IntValue)Results[IterationsResultName].Value).Value = value; }
+    }
+    #endregion
+
     [StorableConstructor]
     protected HillClimber(bool deserializing) : base(deserializing) { }
@@ -77,11 +90,26 @@
     public HillClimber()
       : base() {
+      pausable = true;
       random = new MersenneTwister();
       Parameters.Add(new FixedValueParameter<IntValue>(IterationsParameterName, "", new IntValue(100)));
     }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      pausable = true;
+      #endregion
+    }
+
+    protected override void Initialize(CancellationToken cancellationToken) {
+      Results.Add(new Result(BestQualityResultName, new DoubleValue(double.NaN)));
+      Results.Add(new Result(IterationsResultName, new IntValue(0)));
+      base.Initialize(cancellationToken);
+    }
     protected override void Run(CancellationToken cancellationToken) {
-      var BestQuality = new DoubleValue(double.NaN);
-      Results.Add(new Result("Best quality", BestQuality));
-      for (int iteration = 0; iteration < Iterations; iteration++) {
+      while (ResultsIterations < Iterations) {
+        cancellationToken.ThrowIfCancellationRequested();
+
         var solution = new BinaryVector(Problem.Length);
         for (int i = 0; i < solution.Length; i++) {
@@ -92,7 +120,9 @@
 
         fitness = ImproveToLocalOptimum(Problem, solution, fitness, random);
-        if (double.IsNaN(BestQuality.Value) || Problem.IsBetter(fitness, BestQuality.Value)) {
-          BestQuality.Value = fitness;
+        if (double.IsNaN(ResultsBestQuality) || Problem.IsBetter(fitness, ResultsBestQuality)) {
+          ResultsBestQuality = fitness;
         }
+
+        ResultsIterations++;
       }
     }
Index: trunk/sources/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 14195)
+++ trunk/sources/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 14517)
@@ -165,4 +165,5 @@
 
     public ParameterlessPopulationPyramid() {
+      pausable = true;
       Parameters.Add(new FixedValueParameter<IntValue>(MaximumIterationsParameterName, "", new IntValue(Int32.MaxValue)));
       Parameters.Add(new FixedValueParameter<IntValue>(MaximumEvaluationsParameterName, "", new IntValue(Int32.MaxValue)));
@@ -170,4 +171,12 @@
       Parameters.Add(new FixedValueParameter<IntValue>(SeedParameterName, "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
       Parameters.Add(new FixedValueParameter<BoolValue>(SetSeedRandomlyParameterName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      pausable = true;
+      #endregion
     }
 
@@ -213,5 +222,5 @@
     }
 
-    protected override void Run(CancellationToken cancellationToken) {
+    protected override void Initialize(CancellationToken cancellationToken) {
       // Set up the algorithm
       if (SetSeedRandomly) Seed = new System.Random().Next();
@@ -242,21 +251,23 @@
       Results.Add(new Result("Stored Solutions", table));
 
+      base.Initialize(cancellationToken);
+    }
+
+    protected override void Run(CancellationToken cancellationToken) {
       // Loop until iteration limit reached or canceled.
-      for (ResultsIterations = 0; ResultsIterations < MaximumIterations; ResultsIterations++) {
-        double fitness = double.NaN;
-
-        try {
-          fitness = iterate();
-          cancellationToken.ThrowIfCancellationRequested();
-        } finally {
-          ResultsEvaluations = tracker.Evaluations;
-          ResultsBestSolution = new BinaryVector(tracker.BestSolution);
-          ResultsBestQuality = tracker.BestQuality;
-          ResultsBestFoundOnEvaluation = tracker.BestFoundOnEvaluation;
-          ResultsQualitiesBest.Values.Add(tracker.BestQuality);
-          ResultsQualitiesIteration.Values.Add(fitness);
-          ResultsLevels.Values.Add(pyramid.Count);
-          ResultsSolutions.Values.Add(seen.Count);
-        }
+      while (ResultsIterations < MaximumIterations) {
+        cancellationToken.ThrowIfCancellationRequested();
+        double fitness = iterate();
+
+        ResultsEvaluations = tracker.Evaluations;
+        ResultsBestSolution = new BinaryVector(tracker.BestSolution);
+        ResultsBestQuality = tracker.BestQuality;
+        ResultsBestFoundOnEvaluation = tracker.BestFoundOnEvaluation;
+        ResultsQualitiesBest.Values.Add(tracker.BestQuality);
+        ResultsQualitiesIteration.Values.Add(fitness);
+        ResultsLevels.Values.Add(pyramid.Count);
+        ResultsSolutions.Values.Add(seen.Count);
+
+        ResultsIterations++;
       }
     }
