Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs	(revision 17522)
@@ -31,4 +31,7 @@
   [StorableType("b64caac0-a23a-401a-bb7e-ffa3e22b80ea")]
   public abstract class BinaryVectorMultiObjectiveProblem : MultiObjectiveProblem<BinaryVectorEncoding, BinaryVector> {
+    [Storable] protected IResultParameter<ParetoFrontScatterPlot<BinaryVector>> BestResultParameter { get; private set; }
+    public IResultDefinition<ParetoFrontScatterPlot<BinaryVector>> BestResult { get { return BestResultParameter; } }
+
     public int Length {
       get { return Encoding.Length; }
@@ -45,4 +48,5 @@
     protected BinaryVectorMultiObjectiveProblem(BinaryVectorMultiObjectiveProblem original, Cloner cloner)
       : base(original, cloner) {
+      BestResultParameter = cloner.Clone(original.BestResultParameter);
       RegisterEventHandlers();
     }
@@ -51,4 +55,5 @@
     protected BinaryVectorMultiObjectiveProblem(BinaryVectorEncoding encoding) : base(encoding) {
       EncodingParameter.ReadOnly = true;
+      Parameters.Add(BestResultParameter = new ResultParameter<ParetoFrontScatterPlot<BinaryVector>>("Best Pareto Front", "The best Pareto front found."));
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -64,5 +69,6 @@
       var fronts = DominationCalculator.CalculateAllParetoFrontsIndices(individuals, qualities, Maximization);
       var plot = new ParetoFrontScatterPlot<BinaryVector>(fronts, individuals, qualities, Objectives, BestKnownFront);
-      results.AddOrUpdateResult("Pareto Front Scatter Plot", plot);
+      
+      BestResultParameter.ActualValue = plot;
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 17522)
@@ -33,5 +33,6 @@
   [StorableType("2F6FEB34-BD19-47AF-9484-7F48565C0C43")]
   public abstract class BinaryVectorProblem : SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector> {
-    [Storable] public IResultParameter<BinaryVector> BestSolutionParameter { get; private set; }
+    [Storable] protected IResultParameter<ISingleObjectiveSolutionContext<BinaryVector>> BestResultParameter { get; private set; }
+    public IResultDefinition<ISingleObjectiveSolutionContext<BinaryVector>> BestResult { get { return BestResultParameter; } }
 
     public int Length {
@@ -49,5 +50,5 @@
     protected BinaryVectorProblem(BinaryVectorProblem original, Cloner cloner)
       : base(original, cloner) {
-      BestSolutionParameter = cloner.Clone(original.BestSolutionParameter);
+      BestResultParameter = cloner.Clone(original.BestResultParameter);
       RegisterEventHandlers();
     }
@@ -56,6 +57,5 @@
     protected BinaryVectorProblem(BinaryVectorEncoding encoding) : base(encoding) {
       EncodingParameter.ReadOnly = true;
-      BestSolutionParameter = new ResultParameter<BinaryVector>("Best Solution", "The best solution.");
-      Parameters.Add(BestSolutionParameter);
+      Parameters.Add(BestResultParameter = new ResultParameter<ISingleObjectiveSolutionContext<BinaryVector>>("Best Solution", "The best solution."));
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -67,8 +67,9 @@
     }
 
-    public override void Analyze(BinaryVector[] vectors, double[] qualities, ResultCollection results, IRandom random) {
-      base.Analyze(vectors, qualities, results, random);
-      var best = GetBestSolution(vectors, qualities);
-      BestSolutionParameter.ActualValue = (BinaryVector)best.Item1.Clone();
+    public override void Analyze(ISingleObjectiveSolutionContext<BinaryVector>[] solutionContexts, ResultCollection results, IRandom random) {
+      var best = GetBest(solutionContexts);
+      var currentBest = BestResultParameter.ActualValue;
+      if (currentBest == null || IsBetter(best.EvaluationResult.Quality, currentBest.EvaluationResult.Quality))
+        BestResultParameter.ActualValue = (ISingleObjectiveSolutionContext<BinaryVector>)best.Clone();
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs	(revision 17522)
@@ -33,4 +33,7 @@
   [StorableType("11916b0f-4c34-4ece-acae-e28d11211b43")]
   public abstract class IntegerVectorMultiObjectiveProblem : MultiObjectiveProblem<IntegerVectorEncoding, IntegerVector> {
+    [Storable] protected IResultParameter<ParetoFrontScatterPlot<IntegerVector>> BestResultParameter { get; private set; }
+    public IResultDefinition<ParetoFrontScatterPlot<IntegerVector>> BestResult { get { return BestResultParameter; } }
+
     public int Length {
       get { return Encoding.Length; }
@@ -47,4 +50,5 @@
     protected IntegerVectorMultiObjectiveProblem(IntegerVectorMultiObjectiveProblem original, Cloner cloner)
       : base(original, cloner) {
+      BestResultParameter = cloner.Clone(original.BestResultParameter);
       RegisterEventHandlers();
     }
@@ -53,4 +57,5 @@
     protected IntegerVectorMultiObjectiveProblem(IntegerVectorEncoding encoding) : base(encoding) {
       EncodingParameter.ReadOnly = true;
+      Parameters.Add(BestResultParameter = new ResultParameter<ParetoFrontScatterPlot<IntegerVector>>("Best Pareto Front", "The best Pareto front found."));
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -66,5 +71,6 @@
       var fronts = DominationCalculator.CalculateAllParetoFrontsIndices(individuals, qualities, Maximization);
       var plot = new ParetoFrontScatterPlot<IntegerVector>(fronts, individuals, qualities, Objectives, BestKnownFront);
-      results.AddOrUpdateResult("Pareto Front Scatter Plot", plot);
+
+      BestResultParameter.ActualValue = plot;
     }
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs	(revision 17522)
@@ -34,4 +34,7 @@
   [StorableType("c6081457-a3de-45ce-9f47-e0eb1c851bd2")]
   public abstract class IntegerVectorProblem : SingleObjectiveProblem<IntegerVectorEncoding, IntegerVector> {
+    [Storable] protected IResultParameter<IntegerVector> BestResultParameter { get; private set; }
+    public IResultDefinition<IntegerVector> BestResult { get => BestResultParameter; }
+
     public int Length {
       get { return Encoding.Length; }
@@ -48,4 +51,5 @@
     protected IntegerVectorProblem(IntegerVectorProblem original, Cloner cloner)
       : base(original, cloner) {
+      BestResultParameter = cloner.Clone(original.BestResultParameter);
       RegisterEventHandlers();
     }
@@ -54,4 +58,5 @@
     protected IntegerVectorProblem(IntegerVectorEncoding encoding) : base(encoding) {
       EncodingParameter.ReadOnly = true;
+      Parameters.Add(BestResultParameter = new ResultParameter<IntegerVector>("Best Solution", "The best solution."));
 
       Operators.Add(new HammingSimilarityCalculator());
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17522)
@@ -149,4 +149,8 @@
 
     //TODO refactor to solution contexts
+    protected ISingleObjectiveSolutionContext<TEncodedSolution> GetBest(ISingleObjectiveSolutionContext<TEncodedSolution>[] solutionContexts) {
+      return Maximization ? solutionContexts.MaxItems(x => x.EvaluationResult.Quality).First()
+        : solutionContexts.MinItems(x => x.EvaluationResult.Quality).First();
+    }
     protected Tuple<TEncodedSolution, double> GetBestSolution(TEncodedSolution[] solutions, double[] qualities) {
       return GetBestSolution(solutions, qualities, Maximization);
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 17522)
@@ -21,10 +21,20 @@
 
 using System;
+using HEAL.Attic;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Optimization {
+  [StorableType("986fa3d0-38f8-43aa-820e-e67d09a29025")]
+  public interface IResultDefinition {
+    string Name { get; set; }
+  }
+
+  [StorableType("4c0c854b-676d-4ccd-96c4-b06a3d7f2fa1")]
+  public interface IResultDefinition<T> : IResultDefinition where T : class, IItem {
+    T Get(ResultCollection results);
+  }
+
   [StorableType("af5d3f60-6f3a-4a44-a906-688ac8296fe3")]
-  public interface IResultParameter : ILookupParameter {
+  public interface IResultParameter : ILookupParameter, IResultDefinition {
     string ResultCollectionName { get; set; }
     ResultCollection ResultCollection { get; set; }
@@ -34,5 +44,5 @@
 
   [StorableType("803e6ad6-dd9d-497a-ad1c-7cd3dc5b0d3c")]
-  public interface IResultParameter<T> : ILookupParameter<T>, IResultParameter where T : class, IItem {
+  public interface IResultParameter<T> : ILookupParameter<T>, IResultParameter, IResultDefinition<T> where T : class, IItem {
     T DefaultValue { get; set; }
     event EventHandler DefaultValueChanged;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 17521)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 17522)
@@ -62,4 +62,7 @@
     [Storable]
     public ResultCollection ResultCollection { get; set; }
+
+    string IResultDefinition.Name { get => ActualName; set => ActualName = value; }
+    T IResultDefinition<T>.Get(ResultCollection results) => results[ActualName].Value as T;
 
     [StorableConstructor]
