Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/EvaluationResult.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/EvaluationResult.cs	(revision 17357)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/EvaluationResult.cs	(revision 17357)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Collections.Generic;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+
+  //TODO maybe change EvaluationResult from class to struct
+  //TODO implement indexer instead of get/set additional data
+  [StorableType("3E4F5781-0DDB-4B7A-99E2-89C3F1028EB1")]
+  public abstract class EvaluationResult : Item, IEvaluationResult {
+
+    [Storable]
+    private readonly Dictionary<string, object> data = new Dictionary<string, object>();
+
+    protected EvaluationResult() : base() { }
+
+
+    [StorableConstructor]
+    protected EvaluationResult(StorableConstructorFlag _) : base(_) { }
+
+    protected EvaluationResult(EvaluationResult original, Cloner cloner) : base(original, cloner) {
+      //TODO clone data dictionary
+    }
+
+
+    public void SetAdditionalData(string identifier, object o) {
+      data[identifier] = o;
+    }
+    public object GetAdditionalData(string identifier) {
+      return data[identifier];
+    }
+
+  }
+
+  [StorableType("1468E570-64D1-43A5-8B0A-B7821BFAE708")]
+  public class SingleObjectiveEvaluationResult : EvaluationResult, ISingleObjectiveEvaluationResult {
+    [Storable]
+    public double Quality { get; private set; }
+
+    public SingleObjectiveEvaluationResult(double quality) {
+      Quality = quality;
+    }
+
+    [StorableConstructor]
+    protected SingleObjectiveEvaluationResult(StorableConstructorFlag _) : base(_) { }
+
+    public SingleObjectiveEvaluationResult(SingleObjectiveEvaluationResult original, Cloner cloner) : base(original, cloner) {
+      Quality = original.Quality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveEvaluationResult(this, cloner);
+    }
+  }
+
+  [StorableType("6D2B628D-E3B0-4C0A-8A2E-61BC8F38439B")]
+  public class MultiObjectiveEvaluationResult : EvaluationResult, IMultiObjectiveEvaluationResult {
+    [Storable]
+    public double[] Quality { get; private set; }
+
+    public MultiObjectiveEvaluationResult(double[] quality) {
+      Quality = quality;
+    }
+
+    [StorableConstructor]
+    protected MultiObjectiveEvaluationResult(StorableConstructorFlag _) : base(_) { }
+
+    public MultiObjectiveEvaluationResult(MultiObjectiveEvaluationResult original, Cloner cloner) : base(original, cloner) {
+      Quality = original.Quality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveEvaluationResult(this, cloner);
+    }
+  }
+}
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncodedSolution.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncodedSolution.cs	(revision 17356)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncodedSolution.cs	(revision 17357)
@@ -1,6 +1,5 @@
 ﻿#region License Information
-
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -19,5 +18,4 @@
  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
  */
-
 #endregion
 
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEvaluationResult.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEvaluationResult.cs	(revision 17357)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEvaluationResult.cs	(revision 17357)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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 HEAL.Attic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  [StorableType("406EB24F-A59C-440C-8B83-49FC05F48855")]
+  public interface IEvaluationResult : IItem {
+    void SetAdditionalData(string identifier, object o);
+    object GetAdditionalData(string identifier);
+  }
+
+  public interface ISingleObjectiveEvaluationResult : IEvaluationResult {
+    double Quality { get; }
+  }
+
+  public interface IMultiObjectiveEvaluationResult : IEvaluationResult {
+    //TODO change to unmodifiable Type from double[]
+    double[] Quality { get; }
+  }
+}
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISolutionContext.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISolutionContext.cs	(revision 17357)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISolutionContext.cs	(revision 17357)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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 HEAL.Attic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  [StorableType("383A35EB-03C9-473D-A20B-EE34E00BC174")]
+  public interface ISolutionContext : IItem {
+
+    bool IsEvaluated { get; }
+    IEncodedSolution EncodedSolution { get; }
+
+    IEvaluationResult EvaluationResult { get; }
+
+    void SetAdditionalData(string identifier, object o);
+    object GetAdditionalData(string identifier);
+  }
+
+  public interface ISingleObjectiveSolutionContext : ISolutionContext {
+    //TODO discuss with abeham hiding of base property
+    new ISingleObjectiveEvaluationResult EvaluationResult { get; }
+  }
+
+  public interface IMultiObjectiveSolutionContext : ISolutionContext {
+    new IMultiObjectiveEvaluationResult EvaluationResult { get; }
+  }
+
+}
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SolutionContext.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SolutionContext.cs	(revision 17357)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/SolutionContext.cs	(revision 17357)
@@ -0,0 +1,109 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Collections.Generic;
+
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  [StorableType("72638F28-11DD-440D-B7A2-79E16E0EFB83")]
+  public abstract class SolutionContext : Item {
+
+    [Storable]
+    private readonly Dictionary<string, object> data = new Dictionary<string, object>();
+
+    [Storable]
+    public IEncodedSolution EncodedSolution { get; private set; }
+
+    [Storable]
+    public IEvaluationResult EvaluationResult { get; protected set; }
+
+    public bool IsEvaluated => EvaluationResult != null;
+
+    protected SolutionContext(IEncodedSolution encodedSolution) : base() {
+      EncodedSolution = encodedSolution ?? throw new ArgumentNullException("encodedSolution");
+    }
+
+    protected SolutionContext(IEncodedSolution encodedSolution, IEvaluationResult evaluationResult) : this(encodedSolution) {
+      EvaluationResult = evaluationResult ?? throw new ArgumentNullException("evaluationResult");
+    }
+
+    [StorableConstructor]
+    protected SolutionContext(StorableConstructorFlag _) : base(_) { }
+
+    public SolutionContext(SolutionContext original, Cloner cloner) : base(original, cloner) {
+      //TODO clone data dictionary
+      EncodedSolution = cloner.Clone(original.EncodedSolution);
+      EvaluationResult = cloner.Clone(original.EvaluationResult);
+    }
+
+    public void SetAdditionalData(string identifier, object o) {
+      data[identifier] = o;
+    }
+    public object GetAdditionalData(string identifier) {
+      return data[identifier];
+    }
+  }
+
+  [StorableType("DF6DA9C9-7EF4-4DC3-9855-6C43BDEDD735")]
+  public class SingleObjectiveSolutionContext : SolutionContext, ISingleObjectiveSolutionContext {
+    public new ISingleObjectiveEvaluationResult EvaluationResult { get; set; }
+
+    public SingleObjectiveSolutionContext(IEncodedSolution encodedSolution) : base(encodedSolution) { }
+
+
+    public SingleObjectiveSolutionContext(IEncodedSolution encodedSolution, IEvaluationResult evaluationResult) : base(encodedSolution, evaluationResult) { }
+
+    [StorableConstructor]
+    public SingleObjectiveSolutionContext(StorableConstructorFlag _) : base(_) {    }
+
+    public SingleObjectiveSolutionContext(SolutionContext original, Cloner cloner) : base(original, cloner) { }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveSolutionContext(this, cloner);
+    }
+  }
+
+  [StorableType("929868B3-8994-4D75-B363-CCF9C51410F9")]
+  public class MultiObjectiveSolutionContext : SolutionContext, IMultiObjectiveSolutionContext {
+    public new IMultiObjectiveEvaluationResult EvaluationResult { get; set; }
+
+    public MultiObjectiveSolutionContext(IEncodedSolution encodedSolution) : base(encodedSolution) { }
+
+
+    public MultiObjectiveSolutionContext(IEncodedSolution encodedSolution, IEvaluationResult evaluationResult) : base(encodedSolution, evaluationResult) { }
+
+    [StorableConstructor]
+    public MultiObjectiveSolutionContext(StorableConstructorFlag _) : base(_) { }
+
+    public MultiObjectiveSolutionContext(SolutionContext original, Cloner cloner) : base(original, cloner) { }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveSolutionContext(this, cloner);
+    }
+  }
+}
