Index: /stable/HeuristicLab.Analysis/3.3/BestScopeSolutionAnalyzer.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/BestScopeSolutionAnalyzer.cs	(revision 11905)
+++ /stable/HeuristicLab.Analysis/3.3/BestScopeSolutionAnalyzer.cs	(revision 11906)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -37,8 +38,8 @@
   [StorableClass]
   public class BestScopeSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
     public virtual bool EnabledByDefault {
       get { return true; }
     }
-
     public LookupParameter<BoolValue> MaximizationParameter {
       get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
@@ -47,9 +48,6 @@
       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public ILookupParameter<IScope> BestSolutionParameter {
-      get { return (ILookupParameter<IScope>)Parameters["BestSolution"]; }
-    }
-    public ILookupParameter<IScope> BestKnownSolutionParameter {
-      get { return (ILookupParameter<IScope>)Parameters["BestKnownSolution"]; }
+    public IFixedValueParameter<StringValue> BestSolutionResultNameParameter {
+      get { return (IFixedValueParameter<StringValue>)Parameters["BestSolution ResultName"]; }
     }
     public ILookupParameter<DoubleValue> BestKnownQualityParameter {
@@ -58,4 +56,9 @@
     public IValueLookupParameter<ResultCollection> ResultsParameter {
       get { return (IValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public string BestSolutionResultName {
+      get { return BestSolutionResultNameParameter.Value.Value; }
+      set { BestSolutionResultNameParameter.Value.Value = value; }
     }
 
@@ -67,4 +70,15 @@
       return new BestScopeSolutionAnalyzer(this, cloner);
     }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("BestSolution ResultName"))
+        Parameters.Add(new FixedValueParameter<StringValue>("BestSolution ResultName", "The name of the result for storing the best solution.", new StringValue("Best Solution")));
+      if (Parameters.ContainsKey("BestSolution")) Parameters.Remove("BestSolution");
+      if (Parameters.ContainsKey("BestKnownSolution")) Parameters.Remove("BestKnownSolution");
+      #endregion
+    }
     #endregion
     public BestScopeSolutionAnalyzer()
@@ -72,6 +86,5 @@
       Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions."));
-      Parameters.Add(new LookupParameter<IScope>("BestSolution", "The best solution."));
-      Parameters.Add(new LookupParameter<IScope>("BestKnownSolution", "The best known solution."));
+      Parameters.Add(new FixedValueParameter<StringValue>("BestSolution ResultName", "The name of the result for storing the best solution.", new StringValue("Best Solution")));
       Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the solution should be stored."));
@@ -84,4 +97,8 @@
       DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
 
+      if (results.ContainsKey(BestSolutionResultName) && !typeof(IScope).IsAssignableFrom(results[BestSolutionResultName].DataType)) {
+        throw new InvalidOperationException(string.Format("Could not add best solution result, because there is already a result with the name \"{0}\" present in the result collection.", BestSolutionResultName));
+      }
+
       int i = -1;
       if (!max)
@@ -91,5 +108,5 @@
       IEnumerable<IScope> scopes = new IScope[] { ExecutionContext.Scope };
       for (int j = 0; j < QualityParameter.Depth; j++)
-        scopes = scopes.Select(x => (IEnumerable<IScope>)x.SubScopes).Aggregate((a, b) => a.Concat(b));
+        scopes = scopes.SelectMany(x => x.SubScopes);
       IScope currentBestScope = scopes.ToList()[i];
 
@@ -98,25 +115,31 @@
           || !max && qualities[i].Value < bestKnownQuality.Value) {
         BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
-        BestKnownSolutionParameter.ActualValue = (IScope)currentBestScope.Clone();
       }
 
-      IScope solution = BestSolutionParameter.ActualValue;
-      if (solution == null) {
-        solution = (IScope)currentBestScope.Clone();
-        BestSolutionParameter.ActualValue = solution;
-        results.Add(new Result("Best Solution", solution));
+      if (!results.ContainsKey(BestSolutionResultName)) {
+        var cloner = new Cloner();
+        //avoid cloning of subscopes and the results collection that the solution is put in
+        cloner.RegisterClonedObject(results, new ResultCollection());
+        cloner.RegisterClonedObject(currentBestScope.SubScopes, new ScopeList());
+        var solution = cloner.Clone(currentBestScope);
+
+        results.Add(new Result(BestSolutionResultName, solution));
       } else {
+        var bestSolution = (IScope)results[BestSolutionResultName].Value;
         string qualityName = QualityParameter.TranslatedName;
-        if (solution.Variables.ContainsKey(qualityName)) {
-          double bestSoFarQuality = (solution.Variables[qualityName].Value as DoubleValue).Value;
-          if (max && qualities[i].Value > bestSoFarQuality
-            || !max && qualities[i].Value < bestSoFarQuality) {
-            solution = (IScope)currentBestScope.Clone();
-            BestSolutionParameter.ActualValue = solution;
-            results["Best Solution"].Value = solution;
+        if (bestSolution.Variables.ContainsKey(qualityName)) {
+          double bestQuality = ((DoubleValue)bestSolution.Variables[qualityName].Value).Value;
+          if (max && qualities[i].Value > bestQuality
+              || !max && qualities[i].Value < bestQuality) {
+            var cloner = new Cloner();
+            //avoid cloning of subscopes and the results collection that the solution is put in
+            cloner.RegisterClonedObject(results, new ResultCollection());
+            cloner.RegisterClonedObject(currentBestScope.SubScopes, new ScopeList());
+            var solution = cloner.Clone(currentBestScope);
+
+            results[BestSolutionResultName].Value = solution;
           }
         }
       }
-
       return base.Apply();
     }
Index: /stable/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 11905)
+++ /stable/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 11906)
@@ -240,5 +240,4 @@
       BestScopeSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
       BestScopeSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      BestScopeSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
       BestScopeSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
     }
