Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 17513)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs	(revision 17517)
@@ -95,5 +95,9 @@
     }
 
-    public abstract ResultCollection Results { get; }
+    [Storable]
+    private readonly ResultCollection results = new ResultCollection();
+    public ResultCollection Results {
+      get { return results; }
+    }
 
     [Storable]
@@ -185,4 +189,5 @@
       storeAlgorithmInEachRun = original.storeAlgorithmInEachRun;
       runsCounter = original.runsCounter;
+      results = cloner.Clone(original.Results);
       runs = cloner.Clone(original.runs);
       Initialize();
@@ -197,4 +202,5 @@
       if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped))
         throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState));
+      results.Clear();
     }
     public void Prepare(bool clearRuns) {
@@ -286,4 +292,6 @@
     public event EventHandler Started;
     protected virtual void OnStarted() {
+      foreach (var param in Parameters.Concat(Problem.Parameters).OfType<IResultParameter>())
+        param.ResultCollection = results;
       ExecutionState = ExecutionState.Started;
       EventHandler handler = Started;
@@ -292,4 +300,6 @@
     public event EventHandler Paused;
     protected virtual void OnPaused() {
+      foreach (var param in Parameters.Concat(Problem.Parameters).OfType<IResultParameter>())
+        param.ResultCollection = null;
       ExecutionState = ExecutionState.Paused;
       EventHandler handler = Paused;
@@ -311,4 +321,6 @@
         }
       } finally {
+        foreach (var param in Parameters.Concat(Problem.Parameters).OfType<IResultParameter>())
+          param.ResultCollection = null;
         ExecutionState = ExecutionState.Stopped;
         EventHandler handler = Stopped;
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 17513)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 17517)
@@ -22,7 +22,7 @@
 using System;
 using System.Threading;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Optimization {
@@ -42,9 +42,4 @@
     [Storable]
     private bool initialized;
-    [Storable]
-    private readonly ResultCollection results;
-    public override ResultCollection Results {
-      get { return results; }
-    }
 
     private CancellationTokenSource cancellationTokenSource;
@@ -58,10 +53,8 @@
     protected BasicAlgorithm(BasicAlgorithm original, Cloner cloner)
       : base(original, cloner) {
-      results = cloner.Clone(original.Results);
       initialized = original.initialized;
     }
     protected BasicAlgorithm()
       : base() {
-      results = new ResultCollection();
     }
 
@@ -69,5 +62,4 @@
       if (Problem == null) return;
       base.Prepare();
-      results.Clear();
       initialized = false;
       OnPrepared();
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 17513)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 17517)
@@ -76,14 +76,8 @@
     }
 
-    public override ResultCollection Results {
-      get {
-        return (ResultCollection)globalScope.Variables["Results"].Value;
-      }
-    }
-
     protected EngineAlgorithm()
       : base() {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
+      globalScope.Variables.Add(new Variable("Results", Results));
       operatorGraph = new OperatorGraph();
       Initialize();
@@ -92,5 +86,5 @@
       : base(name) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
+      globalScope.Variables.Add(new Variable("Results", Results));
       operatorGraph = new OperatorGraph();
       Initialize();
@@ -99,5 +93,5 @@
       : base(name, parameters) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
+      globalScope.Variables.Add(new Variable("Results", Results));
       operatorGraph = new OperatorGraph();
       Initialize();
@@ -106,5 +100,5 @@
       : base(name, description) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
+      globalScope.Variables.Add(new Variable("Results", Results));
       operatorGraph = new OperatorGraph();
       Initialize();
@@ -113,5 +107,5 @@
       : base(name, description, parameters) {
       globalScope = new Scope("Global Scope");
-      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
+      globalScope.Variables.Add(new Variable("Results", Results));
       operatorGraph = new OperatorGraph();
       Initialize();
@@ -160,5 +154,5 @@
       base.Prepare();
       globalScope.Clear();
-      globalScope.Variables.Add(new Variable("Results", new ResultCollection()));
+      globalScope.Variables.Add(new Variable("Results", Results));
 
       if ((engine != null) && (operatorGraph.InitialOperator != null)) {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 17513)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs	(revision 17517)
@@ -28,4 +28,6 @@
   public interface IResultParameter : ILookupParameter {
     string ResultCollectionName { get; set; }
+    ResultCollection ResultCollection { get; set; }
+
     event EventHandler ResultCollectionNameChanged;
   }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 17513)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs	(revision 17517)
@@ -60,4 +60,7 @@
     }
 
+    [Storable]
+    public ResultCollection ResultCollection { get; set; }
+
     [StorableConstructor]
     private ResultParameter(StorableConstructorFlag _) : base(_) { }
@@ -66,4 +69,5 @@
       resultCollectionName = original.resultCollectionName;
       defaultValue = cloner.Clone(original.defaultValue);
+      ResultCollection = cloner.Clone(original.ResultCollection);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -89,19 +93,21 @@
 
     protected override IItem GetActualValue() {
-      ResultCollection results;
-      if (CachedActualValue != null) {
-        results = CachedActualValue as ResultCollection;
-        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
-      } else {
-        var tmp = ResultCollectionName;
-        // verifyType has to be disabled, because the ResultCollection may not be identical to the generic type of the parameter
-        results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
-        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
-        CachedActualValue = results;
+      ResultCollection results = ResultCollection;
+      if (results == null) {
+        if (CachedActualValue != null) {
+          results = CachedActualValue as ResultCollection;
+          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
+        } else {
+          var tmp = ResultCollectionName;
+          // verifyType has to be disabled, because the ResultCollection may not be identical to the generic type of the parameter
+          results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
+          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
+          CachedActualValue = results;
+        }
       }
 
       IResult result;
       if (!results.TryGetValue(ActualName, out result)) {
-        if (DefaultValue == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): Result not found and no default value specified.");
+        if (DefaultValue == null) return null;
         result = ItemDescription == Description ? new Result(ActualName, (T)DefaultValue.Clone()) : new Result(ActualName, Description, (T)DefaultValue.Clone());
         results.Add(result);
@@ -116,13 +122,15 @@
 
     protected override void SetActualValue(IItem value) {
-      ResultCollection results;
-      if (CachedActualValue != null) {
-        results = CachedActualValue as ResultCollection;
-        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
-      } else {
-        var tmp = ResultCollectionName;
-        results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
-        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
-        CachedActualValue = results;
+      ResultCollection results = ResultCollection;
+      if (results == null) {
+        if (CachedActualValue != null) {
+          results = CachedActualValue as ResultCollection;
+          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
+        } else {
+          var tmp = ResultCollectionName;
+          results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
+          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
+          CachedActualValue = results;
+        }
       }
 
