Index: /trunk/sources/HeuristicLab.Problems.TestFunctions.Views/3.3/SingleObjectiveTestFunctionSolutionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TestFunctions.Views/3.3/SingleObjectiveTestFunctionSolutionView.cs	(revision 3893)
+++ /trunk/sources/HeuristicLab.Problems.TestFunctions.Views/3.3/SingleObjectiveTestFunctionSolutionView.cs	(revision 3894)
@@ -55,4 +55,5 @@
       Content.QualityChanged -= new EventHandler(Content_QualityChanged);
       Content.PopulationChanged -= new EventHandler(Content_PopulationChanged);
+      Content.BoundsChanged -= new EventHandler(Content_BoundsChanged);
       base.DeregisterContentEvents();
     }
@@ -63,4 +64,5 @@
       Content.QualityChanged += new EventHandler(Content_QualityChanged);
       Content.PopulationChanged += new EventHandler(Content_PopulationChanged);
+      Content.BoundsChanged += new EventHandler(Content_BoundsChanged);
     }
 
@@ -99,4 +101,11 @@
         GenerateImage();
       }
+    }
+
+    private void Content_BoundsChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_BoundsChanged), sender, e);
+      else
+        GenerateImage();
     }
 
@@ -139,5 +148,6 @@
           }
           pictureBox.Refresh();
-          DoubleMatrix bounds = Content.Evaluator.Bounds;
+          DoubleMatrix bounds = Content.Bounds;
+          if (bounds == null) bounds = Content.Evaluator.Bounds;
           double xMin = bounds[0, 0], xMax = bounds[0, 1], yMin = bounds[1 % bounds.Rows, 0], yMax = bounds[1 % bounds.Rows, 1];
           double xStep = backgroundImage.Width / (xMax - xMin), yStep = backgroundImage.Height / (yMax - yMin);
@@ -164,5 +174,6 @@
         backgroundImage.Dispose();
       backgroundImage = new Bitmap(pictureBox.Width, pictureBox.Height);
-      DoubleMatrix bounds = Content.Evaluator.Bounds;
+      DoubleMatrix bounds = Content.Bounds;
+      if (bounds == null) bounds = Content.Evaluator.Bounds;
       double xMin = bounds[0, 0], xMax = bounds[0, 1], yMin = bounds[1 % bounds.Rows, 0], yMax = bounds[1 % bounds.Rows, 1];
       double xStep = (xMax - xMin) / backgroundImage.Width, yStep = (yMax - yMin) / backgroundImage.Height;
Index: /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/Analyzers/BestSingleObjectiveTestFunctionSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/Analyzers/BestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 3893)
+++ /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/Analyzers/BestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 3894)
@@ -69,5 +69,9 @@
       get { return (IValueLookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>)Parameters["Evaluator"]; }
     }
+    public ILookupParameter<DoubleMatrix> BoundsParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    }
 
+    protected BestSingleObjectiveTestFunctionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
     public BestSingleObjectiveTestFunctionSolutionAnalyzer()
       : base() {
@@ -80,4 +84,15 @@
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the SingleObjectiveTestFunction solution should be stored."));
       Parameters.Add(new ValueLookupParameter<ISingleObjectiveTestFunctionProblemEvaluator>("Evaluator", "The evaluator with which the solution is evaluated."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Bounds", "The bounds of the function."));
+    }
+
+    /// <summary>
+    /// This method can simply be removed when the plugin version is > 3.3
+    /// </summary>
+    [StorableHook(HookType.AfterDeserialization)]
+    private void CompatibilityMethod() {
+      // Bounds are introduced in 3.3.0.3894
+      if (!Parameters.ContainsKey("Bounds"))
+        Parameters.Add(new LookupParameter<DoubleMatrix>("Bounds", "The bounds of the function."));
     }
 
@@ -85,8 +100,7 @@
       ItemArray<RealVector> realVectors = RealVectorParameter.ActualValue;
       ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
-      ResultCollection results = ResultsParameter.ActualValue;
-      ISingleObjectiveTestFunctionProblemEvaluator evaluator = EvaluatorParameter.ActualValue;
       bool max = MaximizationParameter.ActualValue.Value;
       DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
+      SingleObjectiveTestFunctionSolution solution = BestSolutionParameter.ActualValue;
 
       int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
@@ -97,11 +111,14 @@
         BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
         BestKnownSolutionParameter.ActualValue = (RealVector)realVectors[i].Clone();
+        if (solution != null)
+          solution.BestKnownRealVector = BestKnownSolutionParameter.ActualValue;
       }
 
-      SingleObjectiveTestFunctionSolution solution = BestSolutionParameter.ActualValue;
       if (solution == null) {
-        solution = new SingleObjectiveTestFunctionSolution(realVectors[i], qualities[i], evaluator);
+        ResultCollection results = ResultsParameter.ActualValue;
+        solution = new SingleObjectiveTestFunctionSolution(realVectors[i], qualities[i], EvaluatorParameter.ActualValue);
         solution.Population = realVectors;
         solution.BestKnownRealVector = BestKnownSolutionParameter.ActualValue;
+        solution.Bounds = BoundsParameter.ActualValue;
         BestSolutionParameter.ActualValue = solution;
         results.Add(new Result("Best Solution", solution));
Index: /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/Interfaces/IBestSingleObjectiveTestFunctionSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/Interfaces/IBestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 3893)
+++ /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/Interfaces/IBestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 3894)
@@ -26,5 +26,5 @@
 namespace HeuristicLab.Problems.TestFunctions {
   /// <summary>
-  /// An interface which represents operators for analyzing the best solution of single objective TestFunction Problems given in bit vector representation.
+  /// An interface which represents operators for analyzing the best solution of single objective TestFunction Problems given in real vector representation.
   /// </summary>
   public interface IBestSingleObjectiveTestFunctionSolutionAnalyzer : IAnalyzer {
Index: /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 3893)
+++ /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 3894)
@@ -307,4 +307,5 @@
       BestSingleObjectiveTestFunctionSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
       BestSingleObjectiveTestFunctionSolutionAnalyzer.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
+      BestSingleObjectiveTestFunctionSolutionAnalyzer.BoundsParameter.ActualName = BoundsParameter.Name;
     }
     private void InitializeOperators() {
Index: /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionSolution.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionSolution.cs	(revision 3893)
+++ /trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionSolution.cs	(revision 3894)
@@ -108,4 +108,18 @@
     }
 
+    [Storable]
+    private DoubleMatrix bounds;
+    public DoubleMatrix Bounds {
+      get { return bounds; }
+      set {
+        if (bounds != value) {
+          if (bounds != null) DeregisterBoundsEvents();
+          bounds = value;
+          if (bounds != null) RegisterBoundsEvents();
+          OnBoundsChanged();
+        }
+      }
+    }
+
     public SingleObjectiveTestFunctionSolution() : base() { }
     public SingleObjectiveTestFunctionSolution(RealVector realVector, DoubleValue quality, ISingleObjectiveTestFunctionProblemEvaluator evaluator)
@@ -125,4 +139,5 @@
       if (bestQuality != null) RegisterQualityEvents();
       if (population != null) RegisterPopulationEvents();
+      if (bounds != null) RegisterBoundsEvents();
     }
 
@@ -135,4 +150,5 @@
       clone.population = (ItemArray<RealVector>)cloner.Clone(population);
       clone.evaluator = (ISingleObjectiveTestFunctionProblemEvaluator)cloner.Clone(evaluator);
+      clone.bounds = (DoubleMatrix)cloner.Clone(bounds);
       clone.Initialize();
       return clone;
@@ -175,4 +191,11 @@
     }
 
+    public event EventHandler BoundsChanged;
+    private void OnBoundsChanged() {
+      var changed = BoundsChanged;
+      if (changed != null)
+        changed(this, EventArgs.Empty);
+    }
+
     private void RegisterBestKnownRealVectorEvents() {
       BestKnownRealVector.ItemChanged += new EventHandler<EventArgs<int>>(BestKnownRealVector_ItemChanged);
@@ -207,4 +230,12 @@
       Population.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<RealVector>>(Population_ItemsReplaced);
     }
+    private void RegisterBoundsEvents() {
+      Bounds.ItemChanged += new EventHandler<EventArgs<int, int>>(Bounds_ItemChanged);
+      Bounds.Reset += new EventHandler(Bounds_Reset);
+    }
+    private void DeregisterBoundsEvents() {
+      Bounds.ItemChanged -= new EventHandler<EventArgs<int, int>>(Bounds_ItemChanged);
+      Bounds.Reset -= new EventHandler(Bounds_Reset);
+    }
 
     private void BestKnownRealVector_ItemChanged(object sender, EventArgs<int> e) {
@@ -231,4 +262,10 @@
     private void Population_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<RealVector>> e) {
       OnPopulationChanged();
+    }
+    private void Bounds_ItemChanged(object sender, EventArgs<int, int> e) {
+      OnBoundsChanged();
+    }
+    private void Bounds_Reset(object sender, EventArgs e) {
+      OnBoundsChanged();
     }
     #endregion
