Index: /branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 17612)
@@ -45,5 +45,5 @@
   public class HillClimber : BasicAlgorithm {
     [Storable]
-    private IRandom random;
+    private readonly IRandom random;
 
     [Storable] public IFixedValueParameter<IntValue> MaximumIterationsParameter { get; private set; }
@@ -65,4 +65,14 @@
       get { return MaximumIterationsParameter.Value.Value; }
       set { MaximumIterationsParameter.Value.Value = value; }
+    }
+
+    private int Iterations {
+      get => IterationsResult.Value.Value;
+      set => IterationsResult.Value.Value = value;
+    }
+
+    private double BestQuality {
+      get => BestQualityResult.Value.Value;
+      set => BestQualityResult.Value.Value = value;
     }
 
@@ -88,10 +98,14 @@
     }
 
+    protected override void Initialize(CancellationToken cancellationToken) {
+      base.Initialize(cancellationToken);
+
+      IterationsResult.Value = new IntValue();
+      BestQualityResult.Value = new DoubleValue(double.NaN);
+    }
+
 
 
     protected override void Run(CancellationToken cancellationToken) {
-      IterationsResult.Value = new IntValue();
-      BestQualityResult.Value = new DoubleValue(double.NaN);
-
       while (IterationsResult.Value.Value < MaximumIterations) {
         cancellationToken.ThrowIfCancellationRequested();
@@ -106,10 +120,10 @@
 
         fitness = ImproveToLocalOptimum(Problem, solution, fitness, random);
-        var bestSoFar = BestQualityResult.Value.Value;
+        var bestSoFar = BestQuality;
         if (double.IsNaN(bestSoFar) || Problem.IsBetter(fitness, bestSoFar)) {
-          BestQualityResult.Value.Value = fitness;
+          BestQuality = fitness;
         }
 
-        IterationsResult.Value.Value++;
+        Iterations++;
       }
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBProblem.cs	(revision 17612)
@@ -72,6 +72,8 @@
     }
 
+    public ResultCollection Results { get => Problem.Results; }
+
     [Storable]
-    private ItemList<OKBSolution> solutions; 
+    private ItemList<OKBSolution> solutions;
     public ItemList<OKBSolution> Solutions {
       get { return solutions; }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs	(revision 17612)
@@ -33,5 +33,4 @@
   public abstract class BinaryVectorMultiObjectiveProblem : MultiObjectiveProblem<BinaryVectorEncoding, BinaryVector> {
     [Storable] protected IResultParameter<ParetoFrontScatterPlot<BinaryVector>> BestResultParameter { get; private set; }
-    //public IResultDefinition<ParetoFrontScatterPlot<BinaryVector>> BestResult { get { return BestResultParameter; }}
     [Storable] protected ReferenceParameter<IntValue> DimensionRefParameter { get; private set; }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 17612)
@@ -33,7 +33,11 @@
   [StorableType("2F6FEB34-BD19-47AF-9484-7F48565C0C43")]
   public abstract class BinaryVectorProblem : SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector> {
-    [Storable] protected IResultParameter<ISingleObjectiveSolutionContext<BinaryVector>> BestResultParameter { get; private set; }
-    //public IResultDefinition<ISingleObjectiveSolutionContext<BinaryVector>> BestResult => BestResultParameter;
     [Storable] protected ReferenceParameter<IntValue> DimensionRefParameter { get; private set; }
+    [Storable] public IResult<ISingleObjectiveSolutionContext<BinaryVector>> BestSolutionResult { get; private set; }
+
+    private ISingleObjectiveSolutionContext<BinaryVector> BestSolution {
+      get => BestSolutionResult.Value;
+      set => BestSolutionResult.Value = value;
+    }
 
     public int Dimension {
@@ -51,6 +55,6 @@
     protected BinaryVectorProblem(BinaryVectorProblem original, Cloner cloner)
       : base(original, cloner) {
-      BestResultParameter = cloner.Clone(original.BestResultParameter);
       DimensionRefParameter = cloner.Clone(original.DimensionRefParameter);
+      BestSolutionResult = cloner.Clone(original.BestSolutionResult);
       RegisterEventHandlers();
     }
@@ -59,6 +63,6 @@
     protected BinaryVectorProblem(BinaryVectorEncoding encoding) : base(encoding) {
       EncodingParameter.ReadOnly = true;
-      Parameters.Add(BestResultParameter = new ResultParameter<ISingleObjectiveSolutionContext<BinaryVector>>("Best Solution", "The best solution."));
       Parameters.Add(DimensionRefParameter = new ReferenceParameter<IntValue>("Dimension", "The dimension of the binary vector problem.", Encoding.LengthParameter));
+      Results.Add(BestSolutionResult = new Result<ISingleObjectiveSolutionContext<BinaryVector>>("Best Solution"));
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -73,7 +77,6 @@
       base.Analyze(solutionContexts, results, random);
       var best = GetBest(solutionContexts);
-      var currentBest = BestResultParameter.ActualValue;
-      if (currentBest == null || IsBetter(best.EvaluationResult.Quality, currentBest.EvaluationResult.Quality))
-        BestResultParameter.ActualValue = best.Clone() as SingleObjectiveSolutionContext<BinaryVector>;
+      if (BestSolution == null || IsBetter(best, BestSolution))
+        BestSolution = best.Clone() as SingleObjectiveSolutionContext<BinaryVector>;
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs	(revision 17612)
@@ -35,5 +35,4 @@
   public abstract class IntegerVectorMultiObjectiveProblem : MultiObjectiveProblem<IntegerVectorEncoding, IntegerVector> {
     [Storable] protected IResultParameter<ParetoFrontScatterPlot<IntegerVector>> BestResultParameter { get; private set; }
-    //public IResultDefinition<ParetoFrontScatterPlot<IntegerVector>> BestResult { get { return BestResultParameter; } }
     [Storable] protected ReferenceParameter<IntValue> DimensionRefParameter { get; private set; }
     [Storable] protected ReferenceParameter<IntMatrix> BoundsRefParameter { get; private set; }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs	(revision 17612)
@@ -36,5 +36,4 @@
   public abstract class IntegerVectorProblem : SingleObjectiveProblem<IntegerVectorEncoding, IntegerVector> {
     [Storable] protected IResultParameter<IntegerVector> BestResultParameter { get; private set; }
-    //public IResultDefinition<IntegerVector> BestResult { get => BestResultParameter; }
     [Storable] protected ReferenceParameter<IntValue> DimensionRefParameter { get; private set; }
     [Storable] protected ReferenceParameter<IntMatrix> BoundsRefParameter { get; private set; }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 17612)
@@ -86,7 +86,13 @@
         if (problem != value) {
           if ((value != null) && !ProblemType.IsInstanceOfType(value)) throw new ArgumentException("Invalid problem type.");
-          if (problem != null) DeregisterProblemEvents();
+          if (problem != null) {
+            Results.RemoveRange(problem.Results);
+            DeregisterProblemEvents();
+          }
           problem = value;
-          if (problem != null) RegisterProblemEvents();
+          if (problem != null) {
+            Results.AddRange(problem.Results);
+            RegisterProblemEvents();
+          }
           OnProblemChanged();
           Prepare();
@@ -203,4 +209,5 @@
         throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
 
+      //TODO Reset all results
       Results.Reset();
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblem.cs	(revision 17612)
@@ -32,4 +32,6 @@
   /// </summary>
   public interface IProblem : IParameterizedNamedItem, IStorableContent {
+    //TODO extract into interface? ResultsProducingItems? Problem and Algorithm 
+    ResultCollection Results { get; }
 
     event EventHandler Reset;
@@ -48,4 +50,5 @@
   public interface IProblem<TEncoding, TEncodedSolution> : IHeuristicOptimizationProblem
     where TEncoding : class, IEncoding<TEncodedSolution>
-    where TEncodedSolution : class, IEncodedSolution { }
+    where TEncodedSolution : class, IEncodedSolution {
+  }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblemDefinition.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblemDefinition.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblemDefinition.cs	(revision 17612)
@@ -34,5 +34,4 @@
     where TEncodedSolution : class, IEncodedSolution {
     TEncoding Encoding { get; }
-
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 17612)
@@ -52,4 +52,5 @@
     }
 
+
     ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator {
       get { return Encoding.SolutionCreator; }
@@ -67,5 +68,5 @@
     }
 
-    //TODO is a parameter for the evaluator really necessary, only single-objective or multi-objective evulators calling the func are possible
+    //TODO is a parameter for the evaluator really necessary, only single-objective or multi-objective evaluators calling the func are possible
     public ValueParameter<TEvaluator> EvaluatorParameter {
       get { return (ValueParameter<TEvaluator>)Parameters["Evaluator"]; }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveProblem.cs	(revision 17612)
@@ -130,4 +130,8 @@
     public virtual bool IsBetter(double quality, double bestQuality) {
       return IsBetter(Maximization, quality, bestQuality);
+    }
+
+    public virtual bool IsBetter(ISingleObjectiveSolutionContext<TEncodedSolution> solution, ISingleObjectiveSolutionContext<TEncodedSolution> otherSolution) {
+      return IsBetter(Maximization, solution.EvaluationResult.Quality, otherSolution.EvaluationResult.Quality);
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Problems/Problem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 17612)
@@ -39,9 +39,12 @@
     }
 
-
+    [Storable]
+    public ResultCollection Results { get; } = new ResultCollection();
 
     [StorableConstructor]
     protected Problem(StorableConstructorFlag _) : base(_) { }
-    protected Problem(Problem original, Cloner cloner) : base(original, cloner) { }
+    protected Problem(Problem original, Cloner cloner) : base(original, cloner) {
+      Results = cloner.Clone(original.Results);
+    }
     public Problem() : base() { }
 
@@ -157,7 +160,5 @@
 
 
-    protected virtual void ParameterizeOperators() {
-
-    }
+    protected virtual void ParameterizeOperators() { }
 
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 17612)
@@ -40,6 +40,5 @@
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 120)]
   [StorableType("9F18A098-A8B8-4F70-93CF-79FF1496AC8A")]
-  public sealed class UserDefinedProblem : ParameterizedNamedItem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent {
-    public string Filename { get; set; }
+  public sealed class UserDefinedProblem : Problem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent {
 
     public static new Image StaticItemImage {
@@ -170,9 +169,4 @@
     private void OnOperatorsChanged() {
       EventHandler handler = OperatorsChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler Reset;
-    private void OnReset() {
-      EventHandler handler = Reset;
       if (handler != null) handler(this, EventArgs.Empty);
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisProblem.cs	(revision 17612)
@@ -20,9 +20,8 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Optimization;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -51,6 +50,10 @@
 
   [StorableType("07b08ca0-40cb-433e-8aed-72df06a87d62")]
-  public interface ISymbolicDataAnalysisSingleObjectiveProblem : ISymbolicDataAnalysisProblem, ISingleObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> { }
+  public interface ISymbolicDataAnalysisSingleObjectiveProblem : ISymbolicDataAnalysisProblem, ISingleObjectiveHeuristicOptimizationProblem
+    //ISingleObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> 
+    { }
   [StorableType("1c5a0cf4-1286-45d8-b126-a6f5ddccf7bf")]
-  public interface ISymbolicDataAnalysisMultiObjectiveProblem : ISymbolicDataAnalysisProblem, IMultiObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> { }
+  public interface ISymbolicDataAnalysisMultiObjectiveProblem : ISymbolicDataAnalysisProblem, IMultiObjectiveHeuristicOptimizationProblem
+    //IMultiObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree>
+    { }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 17612)
@@ -47,5 +47,4 @@
     [Storable] public OptionalValueParameter<OrienteeringSolution> BestKnownSolutionParameter { get; private set; }
     [Storable] private IResultParameter<OrienteeringSolution> BestOrienteeringSolutionParameter { get; set; }
-    //public IResultDefinition<OrienteeringSolution> BestOrienteeringSolution => BestOrienteeringSolutionParameter;
 
     public IOrienteeringProblemData OrienteeringProblemData {
@@ -122,5 +121,5 @@
       }
       var bestSoFar = BestOrienteeringSolutionParameter.ActualValue;
-      
+
       if (bestSoFar == null || IsBetter(quality, bestSoFar.Quality.Value)) {
         bestSoFar = data.GetSolution((IntegerVector)best.Clone(), quality, score, travelCosts);
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs	(revision 17611)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs	(revision 17612)
@@ -48,5 +48,4 @@
     [Storable] public IValueParameter<ITSPSolution> BestKnownSolutionParameter { get; private set; }
     [Storable] protected IResultParameter<ITSPSolution> BestTSPSolutionParameter { get; private set; }
-    //public IResultDefinition<ITSPSolution> BestTSPSolution => BestTSPSolutionParameter;
 
     public ITSPData TSPData {
