Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EnumerableBoolEqualityComparer.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EnumerableBoolEqualityComparer.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EnumerableBoolEqualityComparer.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  * and the BEACON Center for the Study of Evolution in Action.
  *
@@ -34,25 +34,28 @@
   // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
   // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  [StorableClass]
   internal sealed class EvaluationTracker : BinaryProblem {
+    [Storable]
     private readonly BinaryProblem problem;
-
+    [Storable]
     private int maxEvaluations;
 
     #region Properties
+    [Storable]
     public double BestQuality {
       get;
       private set;
     }
-
+    [Storable]
     public int Evaluations {
       get;
       private set;
     }
-
+    [Storable]
     public int BestFoundOnEvaluation {
       get;
       private set;
     }
-
+    [Storable]
     public BinaryVector BestSolution {
       get;
@@ -61,6 +64,8 @@
     #endregion
 
+
     [StorableConstructor]
     private EvaluationTracker(bool deserializing) : base(deserializing) { }
+
     private EvaluationTracker(EvaluationTracker original, Cloner cloner)
       : base(original, cloner) {
@@ -70,9 +75,10 @@
       Evaluations = original.Evaluations;
       BestFoundOnEvaluation = original.BestFoundOnEvaluation;
-      BestSolution = cloner.Clone(BestSolution);
+      BestSolution = cloner.Clone(original.BestSolution);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new EvaluationTracker(this, cloner);
     }
+
     public EvaluationTracker(BinaryProblem problem, int maxEvaluations) {
       this.problem = problem;
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  * and the BEACON Center for the Study of Evolution in Action.
  *
@@ -48,8 +48,13 @@
 
     private const string IterationsParameterName = "Iterations";
+    private const string BestQualityResultName = "Best quality";
+    private const string IterationsResultName = "Iterations";
 
     public override Type ProblemType {
       get { return typeof(BinaryProblem); }
     }
+
+    public override bool SupportsPause { get { return false; } }
+
     public new BinaryProblem Problem {
       get { return (BinaryProblem)base.Problem; }
@@ -65,4 +70,15 @@
       set { IterationsParameter.Value.Value = value; }
     }
+
+    #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]
@@ -80,8 +96,15 @@
       Parameters.Add(new FixedValueParameter<IntValue>(IterationsParameterName, "", new IntValue(100)));
     }
+
+
+    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 +115,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: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageCrossover.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageCrossover.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageCrossover.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  * and the BEACON Center for the Study of Evolution in Action.
  *
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageTree.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageTree.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageTree.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  * and the BEACON Center for the Study of Evolution in Action.
  *
@@ -27,4 +27,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Random;
 
@@ -33,11 +34,44 @@
   // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
   // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
-  public class LinkageTree {
+  [StorableClass]
+  public class LinkageTree : DeepCloneable {
+    [Storable]
     private readonly int[][][] occurances;
+    [Storable]
     private readonly List<int>[] clusters;
+    [Storable]
     private List<int> clusterOrdering;
+    [Storable]
     private readonly int length;
+    [Storable]
     private readonly IRandom rand;
+    [Storable]
     private bool rebuildRequired = false;
+
+
+    [StorableConstructor]
+    protected LinkageTree(bool deserializing) : base() { }
+
+
+    protected LinkageTree(LinkageTree original, Cloner cloner) : base(original, cloner) {
+      occurances = new int[original.occurances.Length][][];
+      //mkommend: first entry is not used, cf. ctor line 83
+      for (int i = 1; i < original.occurances.Length; i++) {
+        occurances[i] = new int[original.occurances[i].Length][];
+        for (int j = 0; j < original.occurances[i].Length; j++)
+          occurances[i][j] = original.occurances[i][j].ToArray();
+      }
+
+      clusters = original.clusters.Select(c => c.ToList()).ToArray();
+      clusterOrdering = new List<int>(original.clusterOrdering);
+      length = original.length;
+      rand = cloner.Clone(original.rand);
+      rebuildRequired = original.rebuildRequired;
+    }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LinkageTree(this, cloner);
+    }
 
     public LinkageTree(int length, IRandom rand) {
@@ -93,6 +127,6 @@
     // Uses the frequency table to calcuate the entropy distance between two indices.
     // In the GECCO paper, calculates Equation 1
-    private int[] bits = new int[4];
     private double EntropyDistance(int i, int j) {
+      int[] bits = new int[4];
       // This ensures you are using the lower triangular part of "occurances"
       if (i < j) {
@@ -125,6 +159,6 @@
     // by I. Gronau and S. Moran
     // In the GECCO paper, Figure 2 is a simplified version of this algorithm.
-    private double[][] distances;
     private void Rebuild() {
+      double[][] distances = null;
       if (distances == null) {
         distances = new double[clusters.Length * 2 - 1][];
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  * and the BEACON Center for the Study of Evolution in Action.
  * 
@@ -23,4 +23,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading;
 using HeuristicLab.Analysis;
@@ -51,10 +52,19 @@
     }
 
+    [Storable]
     private readonly IRandom random = new MersenneTwister();
-    private List<Population> pyramid;
+    [Storable]
+    private List<Population> pyramid = new List<Population>();
+    [Storable]
     private EvaluationTracker tracker;
 
     // Tracks all solutions in Pyramid for quick membership checks
+
     private HashSet<BinaryVector> seen = new HashSet<BinaryVector>(new EnumerableBoolEqualityComparer());
+    [Storable]
+    private IEnumerable<BinaryVector> StorableSeen {
+      get { return seen; }
+      set { seen = new HashSet<BinaryVector>(value, new EnumerableBoolEqualityComparer()); }
+    }
 
     #region ParameterNames
@@ -153,4 +163,6 @@
     #endregion
 
+    public override bool SupportsPause { get { return true; } }
+
     [StorableConstructor]
     protected ParameterlessPopulationPyramid(bool deserializing) : base(deserializing) { }
@@ -158,4 +170,8 @@
     protected ParameterlessPopulationPyramid(ParameterlessPopulationPyramid original, Cloner cloner)
       : base(original, cloner) {
+      random = cloner.Clone(original.random);
+      pyramid = original.pyramid.Select(cloner.Clone).ToList();
+      tracker = cloner.Clone(original.tracker);
+      seen = new HashSet<BinaryVector>(original.seen.Select(cloner.Clone), new EnumerableBoolEqualityComparer());
     }
 
@@ -164,5 +180,5 @@
     }
 
-    public ParameterlessPopulationPyramid() {
+    public ParameterlessPopulationPyramid() : base() {
       Parameters.Add(new FixedValueParameter<IntValue>(MaximumIterationsParameterName, "", new IntValue(Int32.MaxValue)));
       Parameters.Add(new FixedValueParameter<IntValue>(MaximumEvaluationsParameterName, "", new IntValue(Int32.MaxValue)));
@@ -213,5 +229,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,12 +258,18 @@
       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++) {
+      while (ResultsIterations < MaximumIterations) {
         double fitness = double.NaN;
 
         try {
           fitness = iterate();
+          ResultsIterations++;
           cancellationToken.ThrowIfCancellationRequested();
-        } finally {
+        }
+        finally {
           ResultsEvaluations = tracker.Evaluations;
           ResultsBestSolution = new BinaryVector(tracker.BestSolution);
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Plugin.cs.frame
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Plugin.cs.frame	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Plugin.cs.frame	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -29,5 +29,5 @@
   /// Plugin class for HeuristicLab.Algorithms.ParameterlessPopulationPyramid plugin.
   /// </summary>
-  [Plugin("HeuristicLab.Algorithms.ParameterlessPopulationPyramid", "3.3.13.$WCREV$")]
+  [Plugin("HeuristicLab.Algorithms.ParameterlessPopulationPyramid", "3.3.15.$WCREV$")]
   [PluginFile("HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  * and the BEACON Center for the Study of Evolution in Action.
  *
@@ -22,6 +22,9 @@
 
 using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
@@ -29,13 +32,29 @@
   // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
   // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
-  public class Population {
+  [StorableClass]
+  public class Population : DeepCloneable {
+    [Storable]
     public List<BinaryVector> Solutions {
       get;
       private set;
     }
-
+    [Storable]
     public LinkageTree Tree {
       get;
       private set;
+    }
+
+
+    [StorableConstructor]
+    protected Population(bool deserializing) : base() { }
+
+
+    protected Population(Population original, Cloner cloner) : base(original, cloner) {
+      Solutions = original.Solutions.Select(cloner.Clone).ToList();
+      Tree = cloner.Clone(original.Tree);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Population(this, cloner);
     }
 
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Properties/AssemblyInfo.cs.frame	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Properties/AssemblyInfo.cs.frame	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("HEAL")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2015 HEAL and BEACON Center for the Study of Evolution in Action")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL and BEACON Center for the Study of Evolution in Action")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -54,3 +54,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.13.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.15.$WCREV$")]
