Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs	(revision 12247)
@@ -88,4 +88,8 @@
       get { return (ValueParameter<IntValue>)Parameters["SelectedParents"]; }
     }
+
+    private IFixedValueParameter<BoolValue> DominateOnEqualQualitiesParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; }
+    }
     #endregion
 
@@ -135,4 +139,9 @@
       set { SelectedParentsParameter.Value = value; }
     }
+    public bool DominateOnEqualQualities {
+      get { return DominateOnEqualQualitiesParameter.Value.Value; }
+      set { DominateOnEqualQualitiesParameter.Value.Value = value; }
+    }
+
     private RandomCreator RandomCreator {
       get { return (RandomCreator)OperatorGraph.InitialOperator; }
@@ -171,4 +180,5 @@
       Parameters.Add(new ValueParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntValue(1000)));
       Parameters.Add(new ValueParameter<IntValue>("SelectedParents", "Each two parents form a new child, typically this value should be twice the population size, but because the NSGA-II is maximally elitist it can be any multiple of 2 greater than 0.", new IntValue(200)));
+      Parameters.Add(new FixedValueParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.", new BoolValue(false)));
 
       RandomCreator randomCreator = new RandomCreator();
@@ -195,4 +205,5 @@
       subScopesCounter.Successor = rankAndCrowdingSorter;
 
+      rankAndCrowdingSorter.DominateOnEqualQualitiesParameter.ActualName = DominateOnEqualQualitiesParameter.Name;
       rankAndCrowdingSorter.CrowdingDistanceParameter.ActualName = "CrowdingDistance";
       rankAndCrowdingSorter.RankParameter.ActualName = "Rank";
@@ -311,4 +322,10 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("DominateOnEqualQualities"))
+        Parameters.Add(new FixedValueParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated.", new BoolValue(false)));
+      #endregion
+
       PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
       PopulationSize.ValueChanged += new EventHandler(PopulationSize_ValueChanged);
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs	(revision 12247)
@@ -79,8 +79,20 @@
       get { return (LookupParameter<IntValue>)Parameters["EvaluatedSolutions"]; }
     }
+    public IValueLookupParameter<BoolValue> DominateOnEqualQualitiesParameter {
+      get { return (ValueLookupParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; }
+    }
     #endregion
 
     [StorableConstructor]
     protected NSGA2MainLoop(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("DominateOnEqualQualities"))
+        Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated."));
+      #endregion
+    }
+
     protected NSGA2MainLoop(NSGA2MainLoop original, Cloner cloner) : base(original, cloner) { }
     public NSGA2MainLoop()
@@ -105,4 +117,5 @@
       Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each generation."));
       Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of times solutions have been evaluated."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated."));
       #endregion
 
@@ -171,4 +184,5 @@
       subScopesCounter.ValueParameter.ActualName = EvaluatedSolutionsParameter.Name;
 
+      rankAndCrowdingSorter.DominateOnEqualQualitiesParameter.ActualName = DominateOnEqualQualitiesParameter.Name;
       rankAndCrowdingSorter.CrowdingDistanceParameter.ActualName = "CrowdingDistance";
       rankAndCrowdingSorter.RankParameter.ActualName = "Rank";
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs	(revision 12247)
@@ -510,8 +510,10 @@
         SimilarityCalculatorParameter.ValidValues.Add(similarityCalculator);
 
-      if (!SimilarityCalculatorParameter.ValidValues.Any()) {
-        SimilarityCalculatorParameter.ValidValues.Add(new QualitySimilarityCalculator { QualityVariableName = Problem.Evaluator.QualityParameter.ActualName });
+      if (!SimilarityCalculatorParameter.ValidValues.OfType<QualitySimilarityCalculator>().Any())
+        SimilarityCalculatorParameter.ValidValues.Add(new QualitySimilarityCalculator {
+          QualityVariableName = Problem.Evaluator.QualityParameter.ActualName
+        });
+      if (!SimilarityCalculatorParameter.ValidValues.OfType<NoSimilarityCalculator>().Any())
         SimilarityCalculatorParameter.ValidValues.Add(new NoSimilarityCalculator());
-      }
 
       if (oldSimilarityCalculator != null) {
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs	(revision 12247)
@@ -410,8 +410,10 @@
         SimilarityCalculatorParameter.ValidValues.Add(similarityCalculator);
 
-      if (!SimilarityCalculatorParameter.ValidValues.Any()) {
-        SimilarityCalculatorParameter.ValidValues.Add(new QualitySimilarityCalculator { QualityVariableName = Problem.Evaluator.QualityParameter.ActualName });
+      if (!SimilarityCalculatorParameter.ValidValues.OfType<QualitySimilarityCalculator>().Any())
+        SimilarityCalculatorParameter.ValidValues.Add(new QualitySimilarityCalculator {
+          QualityVariableName = Problem.Evaluator.QualityParameter.ActualName
+        });
+      if (!SimilarityCalculatorParameter.ValidValues.OfType<NoSimilarityCalculator>().Any())
         SimilarityCalculatorParameter.ValidValues.Add(new NoSimilarityCalculator());
-      }
 
       if (oldSimilarityCalculator != null) {
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs	(revision 12247)
@@ -112,5 +112,7 @@
 
     void Content_ColumnsChanged(object sender, EventArgs e) {
-      RebuildDataTableAsync();
+      if (!suppressUpdates) {
+        RebuildDataTableAsync();
+      }
     }
 
@@ -289,8 +291,8 @@
         double percentile25 = values.Percentile(0.25);
         double percentile75 = values.Percentile(0.75);
-        double lowerAvg = values.OrderBy(x => x).Take((int)(values.Count() * 0.25)).Average();
-        double upperAvg = values.OrderByDescending(x => x).Take((int)(values.Count() * 0.25)).Average();
-        double firstAvg = values.Take((int)(values.Count() * 0.25)).Average();
-        double lastAvg = values.Skip((int)(values.Count() * 0.75)).Average();
+        double lowerAvg = values.Count() > 4 ? values.OrderBy(x => x).Take((int)(values.Count() * 0.25)).Average() : double.NaN;
+        double upperAvg = values.Count() > 4 ? values.OrderByDescending(x => x).Take((int)(values.Count() * 0.25)).Average() : double.NaN;
+        double firstAvg = values.Count() > 4 ? values.Take((int)(values.Count() * 0.25)).Average() : double.NaN;
+        double lastAvg = values.Count() > 4 ? values.Skip((int)(values.Count() * 0.75)).Average() : double.NaN;
         double slope, intercept, r;
         llsFitting.Calculate(values, out slope, out intercept);
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.cs	(revision 12247)
@@ -56,4 +56,5 @@
       stringConvertibleMatrixView.Minimum = -1.0;
       stringConvertibleMatrixView.Maximum = 1.0;
+      stringConvertibleMatrixView.FormatPattern = "0.000";
 
       methodComboBox.Items.Add(PearsonName);
@@ -97,5 +98,7 @@
 
     void Content_ColumnsChanged(object sender, EventArgs e) {
-      UpdateUI();
+      if (!suppressUpdates) {
+        UpdateUI();
+      }
     }
 
@@ -212,6 +215,8 @@
                 .Where(x => !double.IsNaN(x) && !double.IsNegativeInfinity(x) && !double.IsPositiveInfinity(x));
 
-          if (!rowValues.Any() || !columnValues.Any() || i == j || rowValues.Count() != columnValues.Count()) {
+          if (!rowValues.Any() || !columnValues.Any() || rowValues.Count() != columnValues.Count()) {
             dt[i, j] = double.NaN;
+          } else if (i == j) {
+            dt[i, j] = 1.0;
           } else {
             if (methodName == PearsonName) {
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.cs	(revision 12247)
@@ -174,5 +174,7 @@
         Invoke(new EventHandler(Content_ColumnNamesChanged), sender, e);
       else {
-        UpdateComboBoxes();
+        if (!suppressUpdates) {
+          UpdateComboBoxes();
+        }
       }
     }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs	(revision 12247)
@@ -109,5 +109,7 @@
 
     void Content_ColumnsChanged(object sender, EventArgs e) {
-      RebuildDataTable();
+      if (!Content.UpdateOfRunsInProgress) {
+        RebuildDataTable();
+      }
     }
 
@@ -277,5 +279,5 @@
 
       //alglib needs at least 5 samples for computation
-      if (data.Any(x => x.Length <= requiredSampleSize)) {
+      if (data.Any(x => x.Length < requiredSampleSize)) {
         if (showMessage)
           MessageBox.Show(this, "You need at least " + requiredSampleSize
@@ -291,5 +293,5 @@
         return;
 
-      if (data != null) {
+      if (data != null && data.All(x => x != null)) {
         MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>()
           .AddOperationProgressToView(this, "Calculating...");
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Views/3.3/HistogramControl.Designer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Views/3.3/HistogramControl.Designer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Views/3.3/HistogramControl.Designer.cs	(revision 12247)
@@ -55,12 +55,15 @@
       this.label1 = new System.Windows.Forms.Label();
       this.exactCheckBox = new System.Windows.Forms.CheckBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.bandwidthNumericUpDown = new System.Windows.Forms.NumericUpDown();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.binsNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.bandwidthNumericUpDown)).BeginInit();
       this.SuspendLayout();
       // 
       // chart
       // 
-      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       chartArea1.Name = "ChartArea1";
@@ -88,5 +91,5 @@
             0});
       this.binsNumericUpDown.Minimum = new decimal(new int[] {
-            1,
+            2,
             0,
             0,
@@ -115,5 +118,5 @@
       this.exactCheckBox.AutoSize = true;
       this.exactCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
-      this.exactCheckBox.Location = new System.Drawing.Point(158, 4);
+      this.exactCheckBox.Location = new System.Drawing.Point(291, 4);
       this.exactCheckBox.Name = "exactCheckBox";
       this.exactCheckBox.Size = new System.Drawing.Size(56, 17);
@@ -123,7 +126,42 @@
       this.exactCheckBox.CheckedChanged += new System.EventHandler(this.exactCheckBox_CheckedChanged);
       // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(158, 5);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(60, 13);
+      this.label2.TabIndex = 5;
+      this.label2.Text = "Bandwidth:";
+      // 
+      // bandwidthNumericUpDown
+      // 
+      this.bandwidthNumericUpDown.DecimalPlaces = 2;
+      this.bandwidthNumericUpDown.Location = new System.Drawing.Point(224, 3);
+      this.bandwidthNumericUpDown.Maximum = new decimal(new int[] {
+            100000000,
+            0,
+            0,
+            0});
+      this.bandwidthNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            851968});
+      this.bandwidthNumericUpDown.Name = "bandwidthNumericUpDown";
+      this.bandwidthNumericUpDown.Size = new System.Drawing.Size(61, 20);
+      this.bandwidthNumericUpDown.TabIndex = 4;
+      this.bandwidthNumericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.bandwidthNumericUpDown.ValueChanged += new System.EventHandler(this.bandwidthNumericUpDown_ValueChanged);
+      // 
       // HistogramControl
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.bandwidthNumericUpDown);
       this.Controls.Add(this.exactCheckBox);
       this.Controls.Add(this.label1);
@@ -134,4 +172,5 @@
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.binsNumericUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.bandwidthNumericUpDown)).EndInit();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -145,4 +184,6 @@
     private System.Windows.Forms.Label label1;
     private System.Windows.Forms.CheckBox exactCheckBox;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.NumericUpDown bandwidthNumericUpDown;
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Views/3.3/HistogramControl.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Views/3.3/HistogramControl.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis.Views/3.3/HistogramControl.cs	(revision 12247)
@@ -31,6 +31,8 @@
   public partial class HistogramControl : UserControl {
     protected static readonly string SeriesName = "Histogram";
-
+    protected static readonly decimal bandwidthMin = 0.0000000000001m;
     protected Dictionary<string, List<double>> points;
+    protected bool suppressUpdate;
+
     public int NumberOfBins {
       get { return (int)binsNumericUpDown.Value; }
@@ -123,7 +125,7 @@
     }
 
-    protected void UpdateHistogram() {
+    protected void UpdateHistogram(double bandwith = double.NaN) {
       if (InvokeRequired) {
-        Invoke((Action)UpdateHistogram, null);
+        Invoke((Action<double>)UpdateHistogram, bandwith);
         return;
       }
@@ -134,5 +136,4 @@
 
       chart.Series.Clear();
-
       foreach (var point in points) {
         if (!point.Value.Any()) continue;
@@ -140,5 +141,4 @@
         Series histogramSeries = new Series(point.Key);
         chart.Series.Add(histogramSeries);
-
         double minValue = point.Value.Min();
         double maxValue = point.Value.Max();
@@ -165,11 +165,15 @@
         histogramSeries["PointWidth"] = "1";
 
-        CalculateDensity(histogramSeries, point.Value);
-
         overallMax = Math.Max(overallMax, maxValue);
         overallMin = Math.Min(overallMin, minValue);
+
+        chart.ApplyPaletteColors();
+        CalculateDensity(histogramSeries, point.Value, bandwith);
       }
 
       ChartArea chartArea = chart.ChartAreas[0];
+      // don't show grid lines for second y-axis
+      chartArea.AxisY2.MajorGrid.Enabled = false;
+      chartArea.AxisY2.MinorGrid.Enabled = false;
       chartArea.AxisY.Title = "Frequency";
 
@@ -182,7 +186,8 @@
     }
 
-    protected void CalculateDensity(Series series, List<double> row) {
+    protected void CalculateDensity(Series series, List<double> row, double bandwidth = double.NaN) {
       string densitySeriesName = "Density " + series.Name;
       double stepWidth = series.Points[1].XValue - series.Points[0].XValue;
+      var rowArray = row.ToArray();
 
       if (chart.Series.Any(x => x.Name == densitySeriesName)) {
@@ -191,7 +196,18 @@
       }
 
-      var density = NormalDistribution.Density(row.ToArray(), row.Count, stepWidth);
+      if (double.IsNaN(bandwidth)) {
+        bandwidth = KernelDensityEstimator.EstimateBandwidth(rowArray);
+        decimal bwDecimal = (decimal)bandwidth;
+        if (bwDecimal < bandwidthMin) {
+          bwDecimal = bandwidthMin;
+          bandwidth = decimal.ToDouble(bwDecimal);
+        }
+        suppressUpdate = true;
+        bandwidthNumericUpDown.Value = bwDecimal;
+      }
+      var density = KernelDensityEstimator.Density(rowArray, rowArray.Length, stepWidth, bandwidth);
 
       Series newSeries = new Series(densitySeriesName);
+      newSeries.Color = series.Color;
       newSeries.ChartType = SeriesChartType.FastLine;
       newSeries.BorderWidth = 2;
@@ -200,4 +216,6 @@
       }
 
+      // densities should be plotted on the second axis (different scale)
+      newSeries.YAxisType = AxisType.Secondary;
       chart.Series.Add(newSeries);
     }
@@ -221,4 +239,11 @@
       UpdateHistogram();
     }
+
+    private void bandwidthNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      if (!suppressUpdate) {
+        UpdateHistogram(decimal.ToDouble(bandwidthNumericUpDown.Value));
+      }
+      suppressUpdate = false;
+    }
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 12247)
@@ -167,5 +167,5 @@
     <Compile Include="Statistics\Fitting\LinearLeastSquaresFitting.cs" />
     <Compile Include="Statistics\Fitting\LogFitting.cs" />
-    <Compile Include="Statistics\NormalDistribution.cs" />
+    <Compile Include="Statistics\KernelDensityEstimator.cs" />
     <Compile Include="Statistics\PairwiseTest.cs" />
     <Compile Include="Statistics\SampleSizeDetermination.cs" />
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/Statistics/KernelDensityEstimator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/Statistics/KernelDensityEstimator.cs	(revision 12247)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/Statistics/KernelDensityEstimator.cs	(revision 12247)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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 System.Linq;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public static class KernelDensityEstimator {
+    public static double[] Density(double[] x, double mean, double stdDev) {
+      return x.Select(xi => Density(xi, mean, stdDev)).ToArray();
+    }
+
+    public static double Density(double x, double mean, double stdDev) {
+      return (1.0 / (stdDev * Math.Sqrt(2.0 * Math.PI))) *
+                  Math.Exp(-((Math.Pow(x - mean, 2.0)) /
+                             (2.0 * Math.Pow(stdDev, 2.0))));
+    }
+
+    // the scale (sigma) of the kernel is a parameter
+    public static List<Tuple<double, double>> Density(double[] x, int nrOfPoints, double stepWidth, double sigma = 1.0) {
+      // calculate grid for which to estimate the density
+      double[] newX = new double[nrOfPoints];
+      double margin = stepWidth * 2;
+
+      double dataMin = x.Min() - margin;
+      double dataMax = x.Max() + margin;
+      double diff = (dataMax - dataMin) / nrOfPoints;
+      double cur = dataMin;
+      newX[0] = cur;
+      for (int i = 1; i < nrOfPoints; i++) {
+        cur += diff;
+        newX[i] = cur;
+      }
+
+      // for each of the points for which we want to calculate the density
+      // we sum up all the densities of the observed points assuming they are at the center of a normal distribution
+      var y = from xi in newX
+              select (from obsX in x
+                      select Density(xi, obsX, sigma)).Sum();
+
+      return newX.Zip(y, Tuple.Create).ToList();
+    }
+
+    //Silverman's rule of thumb for bandwidth estimation (sigma)
+    public static double EstimateBandwidth(double[] x) {
+      return 1.06 * x.StandardDeviation() * Math.Pow(x.Length, -0.2);
+    }
+  }
+}
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/Statistics/NormalDistribution.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Analysis/3.3/Statistics/NormalDistribution.cs	(revision 12190)
+++ 	(revision )
@@ -1,68 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 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 System.Linq;
-using HeuristicLab.Common;
-
-namespace HeuristicLab.Analysis.Statistics {
-  public static class NormalDistribution {
-    public static double[] Density(double[] x, double mean, double stdDev) {
-      double[] result = new double[x.Length];
-
-      for (int i = 0; i < x.Length; i++) {
-        result[i] = (1.0 / (stdDev * Math.Sqrt(2.0 * Math.PI))) *
-                    Math.Exp(-((Math.Pow(x[i] - mean, 2.0)) /
-                               (2.0 * Math.Pow(stdDev, 2.0))));
-      }
-
-      return result;
-    }
-
-    // based on the idea from http://www.statmethods.net/graphs/density.html
-    public static List<Tuple<double, double>> Density(double[] x, int nrOfPoints, double stepWidth) {
-      double[] newX = new double[nrOfPoints];
-      double mean = x.Average();
-      double stdDev = x.StandardDeviation();
-      double margin = stepWidth * 2;
-
-      double dataMin = x.Min() - margin;
-      double dataMax = x.Max() + margin;
-      double diff = (dataMax - dataMin) / nrOfPoints;
-      double cur = dataMin;
-      newX[0] = cur;
-      for (int i = 1; i < nrOfPoints; i++) {
-        cur += diff;
-        newX[i] = cur;
-      }
-
-      var y = Density(newX, mean, stdDev).Select(k => k * stepWidth * x.Length).ToList();
-
-      var points = new List<Tuple<double, double>>();
-      for (int i = 0; i < newX.Length; i++) {
-        points.Add(new Tuple<double, double>(newX[i], y[i]));
-      }
-
-      return points;
-    }
-  }
-}
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 12247)
@@ -25,4 +25,5 @@
 using System.Linq;
 using System.Management;
+using System.Net.NetworkInformation;
 using HeuristicLab.Clients.Hive.SlaveCore.Properties;
 
@@ -34,4 +35,8 @@
   public class ConfigManager {
     private static ConfigManager instance = null;
+    private const string vmwareNameString = "VMware";
+    private const string virtualboxNameString = "VirtualBox";
+    private const int macLength = 12;
+
     public static ConfigManager Instance {
       get { return instance; }
@@ -179,33 +184,29 @@
     /// </summary>    
     private static Guid GetUniqueMachineIdFromMac() {
-      ManagementClass mgtClass = new ManagementClass("Win32_NetworkAdapterConfiguration");
-      ManagementObjectCollection mgtCol = mgtClass.GetInstances();
-
-      foreach (ManagementObject mgtObj in mgtCol) {
-        foreach (var prop in mgtObj.Properties) {
-          if (prop.Value != null && prop.Name == "MACAddress") {
-            try {
-              //simply take the first nic
-              string mac = prop.Value.ToString();
-              byte[] b = new byte[8];
-              string[] macParts = mac.Split(':');
-              if (macParts.Length == 6) {
-                for (int i = 0; i < macParts.Length; i++) {
-                  b[i + 2] = (byte)((ParseNybble(macParts[i][0]) << 4) | ParseNybble(macParts[i][1]));
-                }
-
-                // also get machine name and save it to the first 4 bytes                
-                Guid guid = new Guid(Environment.MachineName.GetHashCode(), 0, 0, b);
-                return guid;
-              } else
-                throw new Exception("Error getting mac addresse");
-            }
-            catch {
-              throw new Exception("Error getting mac addresse");
-            }
-          }
-        }
-      }
-      throw new Exception("Error getting mac addresse");
+      //try to get a real network interface, not a virtual one 
+      NetworkInterface validNic = NetworkInterface.GetAllNetworkInterfaces()
+                      .FirstOrDefault(x =>
+                                  !x.Name.Contains(vmwareNameString) &&
+                                  !x.Name.Contains(virtualboxNameString) &&
+                                  (x.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
+                                   x.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet));
+
+      if (validNic == default(NetworkInterface)) {
+        validNic = NetworkInterface.GetAllNetworkInterfaces().First();
+      }
+
+      string addr = validNic.GetPhysicalAddress().ToString();
+      if (addr.Length != macLength) {
+        throw new Exception("Error generating slave UID: MAC address has to have " + macLength + " digits. Actual MAC address is: " + addr);
+      }
+
+      byte[] b = new byte[8];
+      int j = 2;
+      for (int i = 0; i < macLength; i += 2) {
+        b[j++] = (byte)((ParseNybble(addr[i]) << 4) | ParseNybble(addr[i + 1]));
+      }
+      // also get machine name and save it to the first 4 bytes                
+      Guid guid = new Guid(Environment.MachineName.GetHashCode(), 0, 0, b);
+      return guid;
     }
 
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 12247)
@@ -154,5 +154,4 @@
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
-      this.itemsListView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyUp);
       // 
       // imageList
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.cs	(revision 12247)
@@ -257,9 +257,5 @@
             Content[item.Index] = null;
         }
-      }
-    }
-
-    protected virtual void itemsListView_KeyUp(object sender, KeyEventArgs e) {
-      if (e.KeyData == (Keys.Control | Keys.C)) {
+      } else if (e.KeyData == (Keys.Control | Keys.C)) {
         if (itemsListView.SelectedItems.Count > 0) {
           var builder = new StringBuilder();
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 12247)
@@ -107,5 +107,4 @@
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
-      this.itemsListView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyUp);
       // 
       // imageList
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 12247)
@@ -242,8 +242,5 @@
           }
         }
-      }
-    }
-    protected virtual void itemsListView_KeyUp(object sender, KeyEventArgs e) {
-      if (e.KeyData == (Keys.Control | Keys.C)) {
+      } else if (e.KeyData == (Keys.Control | Keys.C)) {
         if (itemsListView.SelectedItems.Count > 0) {
           var builder = new StringBuilder();
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 12247)
@@ -155,5 +155,4 @@
       this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
       this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
-      this.itemsListView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyUp);
       // 
       // imageList
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs	(revision 12247)
@@ -262,9 +262,5 @@
             Content.RemoveAt(item.Index);
         }
-      }
-    }
-
-    protected virtual void itemsListView_KeyUp(object sender, KeyEventArgs e) {
-      if (e.KeyData == (Keys.Control | Keys.C)) {
+      } else if (e.KeyData == (Keys.Control | Keys.C)) {
         if (itemsListView.SelectedItems.Count > 0) {
           var builder = new StringBuilder();
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.cs	(revision 12247)
@@ -45,4 +45,6 @@
     public double Minimum { get; set; }
 
+    public string FormatPattern { get; set; }
+
     public new DoubleMatrix Content {
       get { return (DoubleMatrix)base.Content; }
@@ -52,4 +54,5 @@
     public EnhancedStringConvertibleMatrixView() {
       InitializeComponent();
+      FormatPattern = string.Empty;
     }
 
@@ -57,4 +60,11 @@
       columnVisibility = null;
       rowVisibility = null;
+    }
+
+    protected override void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
+      if (Content != null && e.RowIndex < Content.Rows && e.ColumnIndex < Content.Columns) {
+        int rowIndex = virtualRowIndices[e.RowIndex];
+        e.Value = Content[rowIndex, e.ColumnIndex].ToString(FormatPattern);
+      }
     }
 
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 12247)
@@ -281,5 +281,5 @@
       dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
     }
-    private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
+    protected virtual void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
       if (Content != null && e.RowIndex < Content.Rows && e.ColumnIndex < Content.Columns) {
         int rowIndex = virtualRowIndices[e.RowIndex];
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data/3.3/EnumValue.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data/3.3/EnumValue.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Data/3.3/EnumValue.cs	(revision 12247)
@@ -29,5 +29,5 @@
   [Item("EnumValue", "An abstract base class for representing values of enum types.")]
   [StorableClass]
-  public abstract class EnumValue<T> : ValueTypeValue<T>, IComparable<EnumValue<T>> where T : struct, IComparable {
+  public sealed class EnumValue<T> : ValueTypeValue<T>, IComparable<EnumValue<T>> where T : struct, IComparable {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Enum; }
@@ -39,21 +39,26 @@
     }
 
+    public EnumValue() {
+      this.value = default(T);
+      this.readOnly = false;
+    }
+    public EnumValue(T value) {
+      this.value = value;
+      this.readOnly = false;
+    }
+
     [StorableConstructor]
-    protected EnumValue(bool deserializing) : base(deserializing) { }
-    protected EnumValue(EnumValue<T> original, Cloner cloner)
+    private EnumValue(bool deserializing) : base(deserializing) { }
+    private EnumValue(EnumValue<T> original, Cloner cloner)
       : base(original, cloner) {
       this.value = original.value;
       this.readOnly = original.readOnly;
     }
-    protected EnumValue() {
-      this.value = default(T);
-      this.readOnly = false;
-    }
-    protected EnumValue(T value) {
-      this.value = value;
-      this.readOnly = false;
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EnumValue<T>(this, cloner);
     }
 
-    public virtual int CompareTo(EnumValue<T> other) {
+    public int CompareTo(EnumValue<T> other) {
       return Value.CompareTo(other.Value);
     }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs	(revision 12247)
@@ -299,6 +299,7 @@
 
     #region methods for painting the symbolic expression tree
-    private void DrawFunctionTree(Graphics graphics, int preferredWidth, int preferredHeight, int minHDistance, int minVDistance) {
-      CalculateLayout(preferredWidth, preferredHeight, minHDistance, minVDistance);
+    private void DrawFunctionTree(Graphics graphics, int preferredWidth, int preferredHeight, int minHDistance, int minVDistance, bool recalculateLayout = true) {
+      if (recalculateLayout)
+        CalculateLayout(preferredWidth, preferredHeight, minHDistance, minVDistance);
       var visualNodes = visualTreeNodes.Values;
       //draw nodes and connections
@@ -366,5 +367,5 @@
       Image image = new Bitmap(Width, Height);
       using (Graphics g = Graphics.FromImage(image)) {
-        DrawFunctionTree(g, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
+        DrawFunctionTree(g, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance, false);
       }
       image.Save(filename);
@@ -376,5 +377,5 @@
         using (Metafile file = new Metafile(filename, g.GetHdc())) {
           using (Graphics emfFile = Graphics.FromImage(file)) {
-            DrawFunctionTree(emfFile, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
+            DrawFunctionTree(emfFile, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance, false);
           }
         }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs.sln
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs.sln	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs.sln	(revision 12247)
@@ -2,5 +2,5 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 2013
-VisualStudioVersion = 12.0.21005.1
+VisualStudioVersion = 12.0.31101.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DayView-1.0", "HeuristicLab.ExtLibs\HeuristicLab.DayView\1.0\HeuristicLab.DayView-1.0.csproj", "{02766ECC-D0F5-4115-9ECA-47409167B638}"
@@ -40,8 +40,4 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.ALGLIB-3.7.0", "HeuristicLab.ExtLibs\HeuristicLab.ALGLIB\3.7.0\HeuristicLab.ALGLIB-3.7.0\HeuristicLab.ALGLIB-3.7.0.csproj", "{6F1D7847-D610-4E52-A184-405DAEFA41A9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EPPlus-3.1.3", "HeuristicLab.ExtLibs\HeuristicLab.EPPlus\3.1.3\EPPlus-3.1.3\EPPlus-3.1.3.csproj", "{7B288026-5502-4A39-BF41-77E086F3E4A3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.EPPlus-3.1.3", "HeuristicLab.ExtLibs\HeuristicLab.EPPlus\3.1.3\HeuristicLab.EPPlus-3.1.3\HeuristicLab.EPPlus-3.1.3.csproj", "{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetScilab-1.0", "HeuristicLab.ExtLibs\HeuristicLab.DotNetScilab\1.0\DotNetScilab-1.0\DotNetScilab-1.0.csproj", "{C3F0C7DC-82AD-405B-990A-BF2C5B7F46FF}"
@@ -275,28 +271,4 @@
 		{6F1D7847-D610-4E52-A184-405DAEFA41A9}.Release|x86.ActiveCfg = Release|x86
 		{6F1D7847-D610-4E52-A184-405DAEFA41A9}.Release|x86.Build.0 = Release|x86
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Debug|x64.ActiveCfg = Debug|x64
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Debug|x64.Build.0 = Debug|x64
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Debug|x86.ActiveCfg = Debug|x86
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Debug|x86.Build.0 = Debug|x86
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Release|Any CPU.Build.0 = Release|Any CPU
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Release|x64.ActiveCfg = Release|x64
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Release|x64.Build.0 = Release|x64
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Release|x86.ActiveCfg = Release|x86
-		{7B288026-5502-4A39-BF41-77E086F3E4A3}.Release|x86.Build.0 = Release|x86
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Debug|x64.ActiveCfg = Debug|x64
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Debug|x64.Build.0 = Debug|x64
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Debug|x86.ActiveCfg = Debug|x86
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Debug|x86.Build.0 = Debug|x86
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Release|Any CPU.Build.0 = Release|Any CPU
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Release|x64.ActiveCfg = Release|x64
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Release|x64.Build.0 = Release|x64
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Release|x86.ActiveCfg = Release|x86
-		{B8B9E73B-18DE-4781-8F31-D3472BA9DB66}.Release|x86.Build.0 = Release|x86
 		{C3F0C7DC-82AD-405B-990A-BF2C5B7F46FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{C3F0C7DC-82AD-405B-990A-BF2C5B7F46FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
@@ -445,10 +417,14 @@
 		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|x64.ActiveCfg = Debug|x64
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|x64.Build.0 = Debug|x64
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|x86.ActiveCfg = Debug|x86
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Debug|x86.Build.0 = Debug|x86
 		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|x64.ActiveCfg = Release|Any CPU
-		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|x86.ActiveCfg = Release|Any CPU
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|x64.ActiveCfg = Release|x64
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|x64.Build.0 = Release|x64
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|x86.ActiveCfg = Release|x86
+		{832EA4F3-20F7-42D7-B079-B588BA559E5F}.Release|x86.Build.0 = Release|x86
 		{675A6EE4-DE7C-413E-8BEF-EB21E0384C87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{675A6EE4-DE7C-413E-8BEF-EB21E0384C87}.Debug|Any CPU.Build.0 = Debug|Any CPU
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/EPPlus-4.0.3/EPPlus-4.0.3.csproj
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/EPPlus-4.0.3/EPPlus-4.0.3.csproj	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/EPPlus-4.0.3/EPPlus-4.0.3.csproj	(revision 12247)
@@ -49,5 +49,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <OutputPath>bin\Debug\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -64,5 +64,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <OutputPath>bin\Release\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -89,4 +89,22 @@
     <DebugType>pdbonly</DebugType>
     <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/HeuristicLab.EPPlus-4.0.3.csproj
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/HeuristicLab.EPPlus-4.0.3.csproj	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/HeuristicLab.EPPlus-4.0.3.csproj	(revision 12247)
@@ -88,4 +88,5 @@
   </ItemGroup>
   <ItemGroup>
+    <None Include="epplus-4.0.3 memory improvement.diff" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="Plugin.cs" />
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/epplus-4.0.3 memory improvement.diff
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/epplus-4.0.3 memory improvement.diff	(revision 12247)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/epplus-4.0.3 memory improvement.diff	(revision 12247)
@@ -0,0 +1,287 @@
+diff --git a/EPPlus-4.0.3/ExcelCellBase.cs b/EPPlus-4.0.3/ExcelCellBase.cs
+--- a/EPPlus-4.0.3/ExcelCellBase.cs
++++ b/EPPlus-4.0.3/ExcelCellBase.cs
+@@ -480,17 +480,15 @@
+             bool fixedRow, fixedCol;
+             return GetRowCol(address, out row, out col, throwException, out fixedRow, out fixedCol);
+         }
+-        internal static bool GetRowCol(string address, out int row, out int col, bool throwException, out bool fixedRow, out bool fixedCol)
+-        {
++        internal static bool GetRowCol(string address, out int row, out int col, bool throwException, out bool fixedRow, out bool fixedCol) {
+             bool colPart = true;
+-            string sRow = "", sCol = "";
++            int colStartIx = 0;
++            int colLength = 0;
+             col = 0;
++            row = 0;
+             fixedRow = false;
+             fixedCol = false;
+-            if (address.IndexOf(':') > 0)  //If it is a mult-cell address use 
+-            {
+-                address = address.Substring(0, address.IndexOf(':'));
+-            }
++
+             if (address.EndsWith("#REF!"))
+             {
+                 row = 0;
+@@ -501,71 +499,56 @@
+             int sheetMarkerIndex = address.IndexOf('!');
+             if (sheetMarkerIndex >= 0)
+             {
+-                address = address.Substring(sheetMarkerIndex + 1);
++                colStartIx = sheetMarkerIndex + 1;
+             }
+ 
+-            address = address.ToUpper(CultureInfo.InvariantCulture);
+-            for (int i = 0; i < address.Length; i++)
++            for (int i = colStartIx; i < address.Length; i++)
+             {
+-                if ((address[i] >= 'A' && address[i] <= 'Z') && colPart && sCol.Length <= 3)
++                char c = address[i];
++                if (colPart && ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && colLength <= 3)
+                 {
+-                    sCol += address[i];
++                    col *= 26;
++                    col += ((int)c) - 64;
++                    colLength++;
+                 }
+-                else if (address[i] >= '0' && address[i] <= '9')
++                else if (c >= '0' && c <= '9')
+                 {
+-                    sRow += address[i];
++                    row *= 10;
++                    row += ((int)c) - 48;
+                     colPart = false;
+                 }
+-                else if (address[i] == '$')
++                else if (c == '$')
+                 {
+-                    if (i == 0) 
+-                        fixedCol = true; 
+-                    else 
++                    if (i == colStartIx)
++                    {
++                        colStartIx++;
++                        fixedCol = true;
++                    }
++                    else
++                    {
++                        colPart = false;
+                         fixedRow = true;
++                    }
++                }
++                else if (c == ':')
++                {
++                    break;
+                 }
+                 else
+                 {
++                    row = 0;
++                    col = 0;
+                     if (throwException)
+                     {
+                         throw (new Exception(string.Format("Invalid Address format {0}", address)));
+                     }
+                     else
+                     {
+-                        row = 0;
+-                        col = 0;
+                         return false;
+                     }
+                 }
+             }
+-
+-            // Get the column number
+-            if (sCol != "")
+-            {
+-                col = GetColumn(sCol);
+-            }
+-            else
+-            {
+-                col = 0;
+-                int.TryParse(sRow, out row);
+-                return row>0;
+-            }
+-            // Get the row number
+-            if (sRow == "") //Blank, fullRow
+-            {
+-                //if (throwException)
+-                //{
+-                //    throw (new Exception(string.Format("Invalid Address format {0}", address)));
+-                //}
+-                //else
+-                //{                    
+-                row = 0;
+-                return col > 0;
+-                //}
+-            }
+-            else
+-            {
+-                return int.TryParse(sRow, out row);
+-            }
++            return row != 0 || col != 0;
+         }
+ 
+         private static int GetColumn(string sCol)
+diff --git a/EPPlus-4.0.3/ExcelRangeBase.cs b/EPPlus-4.0.3/ExcelRangeBase.cs
+--- a/EPPlus-4.0.3/ExcelRangeBase.cs
++++ b/EPPlus-4.0.3/ExcelRangeBase.cs
+@@ -58,7 +58,7 @@
+     /// <summary>
+ 	/// A range of cells 
+ 	/// </summary>
+-	public class ExcelRangeBase : ExcelAddress, IExcelCell, IDisposable, IEnumerable<ExcelRangeBase>, IEnumerator<ExcelRangeBase>
++	public class ExcelRangeBase : ExcelAddress, IExcelCell, IEnumerable<ExcelRangeBase>
+ 	{
+ 		/// <summary>
+ 		/// Reference to the worksheet
+@@ -2757,69 +2757,84 @@
+         CellsStoreEnumerator<object> cellEnum;
+ 		public IEnumerator<ExcelRangeBase> GetEnumerator()
+ 		{
+-			Reset();
+-			return this;
++            return new ExcelRangeBaseEnumerator(this);
+ 		}
+ 
+ 		IEnumerator IEnumerable.GetEnumerator()
+ 		{
+-			Reset();
+-			return this;
++            return new ExcelRangeBaseEnumerator(this);
+ 		}
+ 
+ 		/// <summary>
+ 		/// The current range when enumerating
+ 		/// </summary>
+-		public ExcelRangeBase Current
+-		{
+-			get
+-			{
+-				return new ExcelRangeBase(_worksheet, ExcelAddressBase.GetAddress(cellEnum.Row, cellEnum.Column));
+-			}
+-		}
++        public class ExcelRangeBaseEnumerator : IEnumerator<ExcelRangeBase> {
++            private CellsStoreEnumerator<object> _cellEnum;
++            private int _enumAddressIx = -1;
++            private ExcelRangeBase _range;
++            private ExcelRangeBase _current;
+ 
+-		/// <summary>
+-		/// The current range when enumerating
+-		/// </summary>
+-		object IEnumerator.Current
+-		{
+-			get
+-			{
+-				return ((object)(new ExcelRangeBase(_worksheet, ExcelAddressBase.GetAddress(cellEnum.Row, cellEnum.Column))));
+-			}
+-		}
+-
+-		int _enumAddressIx = -1;
+-        public bool MoveNext()
+-		{
+-            if (cellEnum.Next())
+-            {
+-                return true;
+-            }
+-            else if (_addresses!=null)
+-            {
+-                _enumAddressIx++;
+-                if (_enumAddressIx < _addresses.Count)
+-                {
+-                    cellEnum = new CellsStoreEnumerator<object>(_worksheet._values, 
+-                        _addresses[_enumAddressIx]._fromRow, 
+-                        _addresses[_enumAddressIx]._fromCol, 
+-                        _addresses[_enumAddressIx]._toRow, 
+-                        _addresses[_enumAddressIx]._toCol);
+-                    return MoveNext();
+-                }
+-                else
+-                {
+-                    return false;
++            /// <summary>
++            /// The current range when enumerating
++            /// </summary>
++            public ExcelRangeBase Current {
++                get {
++                    return _current;
+                 }
+             }
+-            return false;
+-		}
+ 
+-		public void Reset()
+-		{
+-            _enumAddressIx = -1;
+-            cellEnum = new CellsStoreEnumerator<object>(_worksheet._values, _fromRow, _fromCol, _toRow, _toCol);
++            /// <summary>
++            /// The current range when enumerating
++            /// </summary>
++            object IEnumerator.Current {
++                get {
++                    return _current;
++                }
++            }
++
++            public ExcelRangeBaseEnumerator(ExcelRangeBase range) {
++                this._range = range;
++                Reset();
++            }
++            public bool MoveNext() {
++                if (_cellEnum.Next()) {
++                    _current._fromCol = _cellEnum.Column;
++                    _current._fromRow = _cellEnum.Row;
++                    _current._toCol = _cellEnum.Column;
++                    _current._toRow = _cellEnum.Row;
++                    _current.Address = GetAddress(_current._fromRow, _current._fromCol);
++                    return true;
++                }
++                else if (_range._addresses != null) {
++                    _enumAddressIx++;
++                    if (_enumAddressIx < _range._addresses.Count) {
++                        _cellEnum = new CellsStoreEnumerator<object>(_range._worksheet._values,
++                            _range._addresses[_enumAddressIx]._fromRow,
++                            _range._addresses[_enumAddressIx]._fromCol,
++                            _range._addresses[_enumAddressIx]._toRow,
++                            _range._addresses[_enumAddressIx]._toCol);
++                        return MoveNext();
++                    }
++                    else {
++                        return false;
++                    }
++                }
++                return false;
++            }
++
++            public void Reset() {
++                _enumAddressIx = -1;
++                _cellEnum = new CellsStoreEnumerator<object>(_range._worksheet._values, _range._fromRow, _range._fromCol, _range._toRow, _range._toCol);
++                _current = new ExcelRangeBase(_range._worksheet, ExcelAddressBase.GetAddress(_cellEnum.Row, _cellEnum.Column));
++            }
++
++            public void Dispose() {
++                if (_cellEnum != null) {
++                    _cellEnum.Dispose();
++                    _cellEnum = null;
++                }
++            }
++
+         }
+ 
+         //private void GetNextIndexEnum(int fromRow, int fromCol, int toRow, int toCol)
+diff --git a/EPPlus-4.0.3/Table/PivotTable/ExcelPivotTable.cs b/EPPlus-4.0.3/Table/PivotTable/ExcelPivotTable.cs
+--- a/EPPlus-4.0.3/Table/PivotTable/ExcelPivotTable.cs
++++ b/EPPlus-4.0.3/Table/PivotTable/ExcelPivotTable.cs
+@@ -150,10 +150,7 @@
+ 
+             LoadFields();
+ 
+-            using (var r=sheet.Cells[address.Address])
+-            {
+-                r.Clear();
+-            }
++            sheet.Cells[address.Address].Clear();
+         }
+         private void init()
+         {
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.MainForm.WindowsForms/3.3/Dialogs/InfoBox.Designer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.MainForm.WindowsForms/3.3/Dialogs/InfoBox.Designer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.MainForm.WindowsForms/3.3/Dialogs/InfoBox.Designer.cs	(revision 12247)
@@ -74,4 +74,5 @@
       this.infoRichTextBox.TabIndex = 1;
       this.infoRichTextBox.Text = "";
+      this.infoRichTextBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.infoRichTextBox_LinkClicked);
       // 
       // InfoBox
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.MainForm.WindowsForms/3.3/Dialogs/InfoBox.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.MainForm.WindowsForms/3.3/Dialogs/InfoBox.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.MainForm.WindowsForms/3.3/Dialogs/InfoBox.cs	(revision 12247)
@@ -59,4 +59,8 @@
       LoadEmbeddedResource();
     }
+
+    private void infoRichTextBox_LinkClicked(object sender, LinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start(e.LinkText);
+    }
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/ExpressionCalculator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/ExpressionCalculator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/ExpressionCalculator.cs	(revision 12247)
@@ -74,8 +74,12 @@
 variables (run parameters or results):
   unquoted or in double quotes if they contain special characters or whitespace
-mathematical functions:
+mathematical functions (resulting in double values):
   +, -, *, /, ^ (power), log
 predicates:
   ==, <, >, isnull, not
+conversions:
+  toint, todouble
+array indexing:
+  []
 stack manipulation:
   drop swap dup
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs	(revision 12247)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -40,15 +41,18 @@
     private enum DominationResult { Dominates, IsDominated, IsNonDominated };
 
+    #region Parameter properties
     public IValueLookupParameter<BoolArray> MaximizationParameter {
       get { return (IValueLookupParameter<BoolArray>)Parameters["Maximization"]; }
     }
-
+    public IValueLookupParameter<BoolValue> DominateOnEqualQualitiesParameter {
+      get { return (ValueLookupParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; }
+    }
     public IScopeTreeLookupParameter<DoubleArray> QualitiesParameter {
       get { return (IScopeTreeLookupParameter<DoubleArray>)Parameters["Qualities"]; }
     }
-
     public IScopeTreeLookupParameter<IntValue> RankParameter {
       get { return (IScopeTreeLookupParameter<IntValue>)Parameters["Rank"]; }
     }
+    #endregion
 
     [StorableConstructor]
@@ -57,4 +61,5 @@
     public FastNonDominatedSort() {
       Parameters.Add(new ValueLookupParameter<BoolArray>("Maximization", "Whether each objective is maximization or minimization."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated."));
       Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The qualities of a solution.", 1));
       Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of a solution.", 1));
@@ -62,4 +67,5 @@
 
     public override IOperation Apply() {
+      bool dominateOnEqualQualities = DominateOnEqualQualitiesParameter.ActualValue.Value;
       BoolArray maximization = MaximizationParameter.ActualValue;
       ItemArray<DoubleArray> qualities = QualitiesParameter.ActualValue;
@@ -79,5 +85,5 @@
           dominatedScopes[p] = new List<int>();
         for (int qI = pI + 1; qI < populationSize; qI++) {
-          DominationResult test = Dominates(qualities[pI], qualities[qI], maximization);
+          DominationResult test = Dominates(qualities[pI], qualities[qI], maximization, dominateOnEqualQualities);
           if (test == DominationResult.Dominates) {
             dominatedScopes[p].Add(qI);
@@ -134,5 +140,7 @@
     }
 
-    private DominationResult Dominates(DoubleArray left, DoubleArray right, BoolArray maximizations) {
+    private static DominationResult Dominates(DoubleArray left, DoubleArray right, BoolArray maximizations, bool dominateOnEqualQualities) {
+      if (dominateOnEqualQualities && left.SequenceEqual(right)) return DominationResult.Dominates;
+
       bool leftIsBetter = false, rightIsBetter = false;
       for (int i = 0; i < left.Length; i++) {
@@ -141,4 +149,5 @@
         if (leftIsBetter && rightIsBetter) break;
       }
+
       if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates;
       if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated;
@@ -146,10 +155,10 @@
     }
 
-    private bool IsDominated(double left, double right, bool maximization) {
+    private static bool IsDominated(double left, double right, bool maximization) {
       return maximization && left < right
         || !maximization && left > right;
     }
 
-    private void AddToFront(IScope p, List<ScopeList> fronts, int i) {
+    private static void AddToFront(IScope p, List<ScopeList> fronts, int i) {
       if (i == fronts.Count) fronts.Add(new ScopeList());
       fronts[i].Add(p);
@@ -159,4 +168,13 @@
       return new FastNonDominatedSort(this, cloner);
     }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("DominateOnEqualQualities"))
+        Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated."));
+      #endregion
+    }
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs	(revision 12247)
@@ -30,4 +30,5 @@
 namespace HeuristicLab.Optimization.Operators {
   public class RankAndCrowdingSorter : AlgorithmOperator, IMultiObjectiveOperator {
+    #region Parameter properties
     public ValueLookupParameter<BoolArray> MaximizationParameter {
       get { return (ValueLookupParameter<BoolArray>)Parameters["Maximization"]; }
@@ -42,4 +43,8 @@
       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["CrowdingDistance"]; }
     }
+    public IValueLookupParameter<BoolValue> DominateOnEqualQualitiesParameter {
+      get { return (ValueLookupParameter<BoolValue>)Parameters["DominateOnEqualQualities"]; }
+    }
+    #endregion
 
     [StorableConstructor]
@@ -49,4 +54,5 @@
       : base() {
       Parameters.Add(new ValueLookupParameter<BoolArray>("Maximization", "For each objective a value that is true if that objective should be maximized, or false if it should be minimized."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated."));
       Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The vector of quality values."));
       Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of a solution (to which front it belongs)."));
@@ -60,4 +66,5 @@
 
       fastNonDominatedSort.MaximizationParameter.ActualName = MaximizationParameter.Name;
+      fastNonDominatedSort.DominateOnEqualQualitiesParameter.ActualName = DominateOnEqualQualitiesParameter.Name;
       fastNonDominatedSort.QualitiesParameter.ActualName = QualitiesParameter.Name;
       fastNonDominatedSort.RankParameter.ActualName = RankParameter.Name;
@@ -81,4 +88,13 @@
       return new RankAndCrowdingSorter(this, cloner);
     }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("DominateOnEqualQualities"))
+        Parameters.Add(new ValueLookupParameter<BoolValue>("DominateOnEqualQualities", "Flag which determines wether solutions with equal quality values should be treated as dominated."));
+      #endregion
+    }
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs	(revision 12247)
@@ -111,6 +111,6 @@
       if (x == null || y == null) return false;
 
-      var q1 = x.Variables[QualityVariableName];
-      var q2 = x.Variables[QualityVariableName];
+      var q1 = x.Variables[QualityVariableName].Value;
+      var q2 = y.Variables[QualityVariableName].Value;
 
       return CheckQualityEquality(q1, q2) && CalculateSolutionSimilarity(x, y).IsAlmost(1.0);
@@ -133,5 +133,5 @@
         }
       }
-      return 0; // throw exception?
+      return 0;
     }
 
@@ -146,6 +146,15 @@
       var da2 = q2 as DoubleArray;
 
-      if (da1 != null && da2 != null)
-        return da1.SequenceEqual(da2);
+      if (da1 != null && da2 != null) {
+        if (da1.Length != da2.Length)
+          throw new ArgumentException("The quality arrays must have the same length.");
+
+        for (int i = 0; i < da1.Length; ++i) {
+          if (!da1[i].IsAlmost(da2[i]))
+            return false;
+        }
+
+        return true;
+      }
 
       throw new ArgumentException("Could not determine quality equality.");
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization/3.3/RunCollectionModification/RunCollectionFormulaModifer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization/3.3/RunCollectionModification/RunCollectionFormulaModifer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Optimization/3.3/RunCollectionModification/RunCollectionFormulaModifer.cs	(revision 12247)
@@ -68,8 +68,12 @@
 variables (run parameters or results):
   unquoted or in double quotes if they contain special characters or whitespace
-mathematical functions:
-  +, -, /, ^ (power), log
+mathematical functions (resulting in double values):
+  +, -, *, /, ^ (power), log
 predicates:
   ==, <, >, isnull, not
+conversions:
+  toint, todouble
+array indexing:
+  []
 stack manipulation:
   drop swap dup
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs	(revision 12247)
@@ -29,5 +29,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
-namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.SingleObjective {
   [Item("Bounded Mean squared error Evaluator", "Calculates the bounded mean squared error of a symbolic classification solution (estimations above or below the class values are only penaltilized linearly.")]
   [StorableClass]
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs	(revision 12247)
@@ -28,5 +28,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
-namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.SingleObjective {
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
   [Item("Mean squared error Evaluator", "Calculates the mean squared error of a symbolic classification solution.")]
   [StorableClass]
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs	(revision 12247)
@@ -25,5 +25,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.SingleObjective;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningAnalyzer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningAnalyzer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningAnalyzer.cs	(revision 12247)
@@ -43,5 +43,5 @@
     public SymbolicClassificationPruningAnalyzer() {
       Parameters.Add(new ValueParameter<SymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, "The impact values calculator", new SymbolicClassificationSolutionImpactValuesCalculator()));
-      Parameters.Add(new ValueParameter<SymbolicDataAnalysisExpressionPruningOperator>(PruningOperatorParameterName, "The operator used to prune trees", new SymbolicClassificationPruningOperator()));
+      Parameters.Add(new ValueParameter<SymbolicDataAnalysisExpressionPruningOperator>(PruningOperatorParameterName, "The operator used to prune trees", new SymbolicClassificationPruningOperator(new SymbolicClassificationSolutionImpactValuesCalculator())));
     }
   }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningOperator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningOperator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationPruningOperator.cs	(revision 12247)
@@ -22,7 +22,9 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -32,5 +34,4 @@
   [Item("SymbolicClassificationPruningOperator", "An operator which prunes symbolic classificaton trees.")]
   public class SymbolicClassificationPruningOperator : SymbolicDataAnalysisExpressionPruningOperator {
-    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
     private const string ModelCreatorParameterName = "ModelCreator";
 
@@ -52,14 +53,14 @@
     protected SymbolicClassificationPruningOperator(bool deserializing) : base(deserializing) { }
 
-    public SymbolicClassificationPruningOperator() {
-      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, new SymbolicClassificationSolutionImpactValuesCalculator()));
+    public SymbolicClassificationPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator)
+      : base(impactValuesCalculator) {
       Parameters.Add(new LookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName));
     }
 
-    protected override ISymbolicDataAnalysisModel CreateModel() {
-      var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel(SymbolicExpressionTree, Interpreter, EstimationLimits.Lower, EstimationLimits.Upper);
-      var problemData = (IClassificationProblemData)ProblemData;
-      var rows = problemData.TrainingIndices;
-      model.RecalculateModelParameters(problemData, rows);
+    protected override ISymbolicDataAnalysisModel CreateModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDataAnalysisProblemData problemData, DoubleLimit estimationLimits) {
+      var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel(tree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
+      var classificationProblemData = (IClassificationProblemData)problemData;
+      var rows = classificationProblemData.TrainingIndices;
+      model.RecalculateModelParameters(classificationProblemData, rows);
       return model;
     }
@@ -69,6 +70,11 @@
       var classificationProblemData = (IClassificationProblemData)ProblemData;
       var trainingIndices = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size);
-      var estimatedValues = classificationModel.GetEstimatedClassValues(ProblemData.Dataset, trainingIndices);
-      var targetValues = ProblemData.Dataset.GetDoubleValues(classificationProblemData.TargetVariable, trainingIndices);
+
+      return Evaluate(classificationModel, classificationProblemData, trainingIndices);
+    }
+
+    private static double Evaluate(IClassificationModel model, IClassificationProblemData problemData, IEnumerable<int> rows) {
+      var estimatedValues = model.GetEstimatedClassValues(problemData.Dataset, rows);
+      var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
       OnlineCalculatorError errorState;
       var quality = OnlineAccuracyCalculator.Calculate(targetValues, estimatedValues, out errorState);
@@ -76,4 +82,38 @@
       return quality;
     }
+
+    public static ISymbolicExpressionTree Prune(ISymbolicExpressionTree tree, ISymbolicClassificationModelCreator modelCreator,
+      SymbolicClassificationSolutionImpactValuesCalculator impactValuesCalculator, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter,
+      IClassificationProblemData problemData, DoubleLimit estimationLimits, IEnumerable<int> rows,
+      double nodeImpactThreshold = 0.0, bool pruneOnlyZeroImpactNodes = false) {
+      var clonedTree = (ISymbolicExpressionTree)tree.Clone();
+      var model = modelCreator.CreateSymbolicClassificationModel(clonedTree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
+
+      var nodes = clonedTree.IterateNodesPrefix().ToList();
+      double quality = Evaluate(model, problemData, rows);
+
+      for (int i = 0; i < nodes.Count; ++i) {
+        var node = nodes[i];
+        if (node is ConstantTreeNode) continue;
+
+        double impactValue, replacementValue;
+        impactValuesCalculator.CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, quality);
+
+        if (pruneOnlyZeroImpactNodes) {
+          if (!impactValue.IsAlmost(0.0)) continue;
+        } else if (nodeImpactThreshold < impactValue) {
+          continue;
+        }
+
+        var constantNode = (ConstantTreeNode)node.Grammar.GetSymbol("Constant").CreateTreeNode();
+        constantNode.Value = replacementValue;
+
+        ReplaceWithConstant(node, constantNode);
+        i += node.GetLength() - 1; // skip subtrees under the node that was folded
+
+        quality -= impactValue;
+      }
+      return model.SymbolicExpressionTree;
+    }
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningAnalyzer.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningAnalyzer.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningAnalyzer.cs	(revision 12247)
@@ -45,5 +45,5 @@
     public SymbolicRegressionPruningAnalyzer() {
       Parameters.Add(new ValueParameter<SymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, "The impact values calculator", new SymbolicRegressionSolutionImpactValuesCalculator()));
-      Parameters.Add(new ValueParameter<SymbolicDataAnalysisExpressionPruningOperator>(PruningOperatorParameterName, "The operator used to prune trees", new SymbolicRegressionPruningOperator()));
+      Parameters.Add(new ValueParameter<SymbolicDataAnalysisExpressionPruningOperator>(PruningOperatorParameterName, "The operator used to prune trees", new SymbolicRegressionPruningOperator(new SymbolicRegressionSolutionImpactValuesCalculator())));
     }
   }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionPruningOperator.cs	(revision 12247)
@@ -22,8 +22,9 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Parameters;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -32,6 +33,4 @@
   [Item("SymbolicRegressionPruningOperator", "An operator which prunes symbolic regression trees.")]
   public class SymbolicRegressionPruningOperator : SymbolicDataAnalysisExpressionPruningOperator {
-    private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator";
-
     protected SymbolicRegressionPruningOperator(SymbolicRegressionPruningOperator original, Cloner cloner)
       : base(original, cloner) {
@@ -44,11 +43,10 @@
     protected SymbolicRegressionPruningOperator(bool deserializing) : base(deserializing) { }
 
-    public SymbolicRegressionPruningOperator() {
-      var impactValuesCalculator = new SymbolicRegressionSolutionImpactValuesCalculator();
-      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, "The impact values calculator to be used for figuring out the node impacts.", impactValuesCalculator));
+    public SymbolicRegressionPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator)
+      : base(impactValuesCalculator) {
     }
 
-    protected override ISymbolicDataAnalysisModel CreateModel() {
-      return new SymbolicRegressionModel(SymbolicExpressionTree, Interpreter, EstimationLimits.Lower, EstimationLimits.Upper);
+    protected override ISymbolicDataAnalysisModel CreateModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDataAnalysisProblemData problemData, DoubleLimit estimationLimits) {
+      return new SymbolicRegressionModel(tree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
     }
 
@@ -56,7 +54,12 @@
       var regressionModel = (IRegressionModel)model;
       var regressionProblemData = (IRegressionProblemData)ProblemData;
-      var trainingIndices = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size);
-      var estimatedValues = regressionModel.GetEstimatedValues(ProblemData.Dataset, trainingIndices); // also bounds the values
-      var targetValues = ProblemData.Dataset.GetDoubleValues(regressionProblemData.TargetVariable, trainingIndices);
+      var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size);
+      return Evaluate(regressionModel, regressionProblemData, rows);
+    }
+
+    private static double Evaluate(IRegressionModel model, IRegressionProblemData problemData,
+      IEnumerable<int> rows) {
+      var estimatedValues = model.GetEstimatedValues(problemData.Dataset, rows); // also bounds the values
+      var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
       OnlineCalculatorError errorState;
       var quality = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, estimatedValues, out errorState);
@@ -64,4 +67,34 @@
       return quality;
     }
+
+    public static ISymbolicExpressionTree Prune(ISymbolicExpressionTree tree, SymbolicRegressionSolutionImpactValuesCalculator impactValuesCalculator, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IRegressionProblemData problemData, DoubleLimit estimationLimits, IEnumerable<int> rows, double nodeImpactThreshold = 0.0, bool pruneOnlyZeroImpactNodes = false) {
+      var clonedTree = (ISymbolicExpressionTree)tree.Clone();
+      var model = new SymbolicRegressionModel(clonedTree, interpreter, estimationLimits.Lower, estimationLimits.Upper);
+      var nodes = clonedTree.IterateNodesPrefix().ToList();
+      double quality = Evaluate(model, problemData, rows);
+
+      for (int i = 0; i < nodes.Count; ++i) {
+        var node = nodes[i];
+        if (node is ConstantTreeNode) continue;
+
+        double impactValue, replacementValue;
+        impactValuesCalculator.CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, quality);
+
+        if (pruneOnlyZeroImpactNodes) {
+          if (!impactValue.IsAlmost(0.0)) continue;
+        } else if (nodeImpactThreshold < impactValue) {
+          continue;
+        }
+
+        var constantNode = (ConstantTreeNode)node.Grammar.GetSymbol("Constant").CreateTreeNode();
+        constantNode.Value = replacementValue;
+
+        ReplaceWithConstant(node, constantNode);
+        i += node.GetLength() - 1; // skip subtrees under the node that was folded
+
+        quality -= impactValue;
+      }
+      return model.SymbolicExpressionTree;
+    }
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs	(revision 12247)
@@ -109,5 +109,5 @@
       : base(original, cloner) { }
 
-    protected SymbolicDataAnalysisExpressionPruningOperator() {
+    protected SymbolicDataAnalysisExpressionPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator) {
       #region add parameters
       Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName));
@@ -122,13 +122,14 @@
       Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName));
       Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName));
+      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, impactValuesCalculator));
       #endregion
     }
 
-    protected abstract ISymbolicDataAnalysisModel CreateModel();
+    protected abstract ISymbolicDataAnalysisModel CreateModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDataAnalysisProblemData problemData, DoubleLimit estimationLimits);
 
     protected abstract double Evaluate(IDataAnalysisModel model);
 
     public override IOperation Apply() {
-      var model = CreateModel();
+      var model = CreateModel(SymbolicExpressionTree, Interpreter, ProblemData, EstimationLimits);
       var nodes = SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList();
       var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size);
@@ -169,5 +170,36 @@
     }
 
-    private static void ReplaceWithConstant(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement) {
+    public ISymbolicExpressionTree Prune(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDataAnalysisProblemData problemData, DoubleLimit estimationLimits) {
+      var model = CreateModel((ISymbolicExpressionTree)tree.Clone(), Interpreter, ProblemData, EstimationLimits);
+      var nodes = SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList();
+      var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size);
+
+      double quality = Evaluate(model);
+
+      for (int i = 0; i < nodes.Count; ++i) {
+        var node = nodes[i];
+        if (node is ConstantTreeNode) continue;
+
+        double impactValue, replacementValue;
+        ImpactValuesCalculator.CalculateImpactAndReplacementValues(model, node, ProblemData, rows, out impactValue, out replacementValue, quality);
+
+        if (PruneOnlyZeroImpactNodes) {
+          if (!impactValue.IsAlmost(0.0)) continue;
+        } else if (NodeImpactThreshold < impactValue) {
+          continue;
+        }
+
+        var constantNode = (ConstantTreeNode)node.Grammar.GetSymbol("Constant").CreateTreeNode();
+        constantNode.Value = replacementValue;
+
+        ReplaceWithConstant(node, constantNode);
+        i += node.GetLength() - 1; // skip subtrees under the node that was folded
+
+        quality -= impactValue;
+      }
+      return model.SymbolicExpressionTree;
+    }
+
+    protected static void ReplaceWithConstant(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement) {
       var parent = original.Parent;
       var i = parent.IndexOfSubtree(original);
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplifier.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplifier.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplifier.cs	(revision 12247)
@@ -299,7 +299,7 @@
         // simplify expressions x0..xn
         // make multiplication (x0 * 1/(x1 * x1 * .. * xn))
-        var simplifiedTrees = original.Subtrees.Select(x => GetSimplifiedTree(x));
+        var simplifiedTrees = original.Subtrees.Select(GetSimplifiedTree).ToArray();
         return
-          MakeProduct(simplifiedTrees.First(), Invert(simplifiedTrees.Skip(1).Aggregate((a, b) => MakeProduct(a, b))));
+          MakeProduct(simplifiedTrees.First(), Invert(simplifiedTrees.Skip(1).Aggregate(MakeProduct)));
       }
     }
@@ -310,6 +310,6 @@
       } else {
         return original.Subtrees
-          .Select(x => GetSimplifiedTree(x))
-          .Aggregate((a, b) => MakeProduct(a, b));
+          .Select(GetSimplifiedTree).ToArray()
+          .Aggregate(MakeProduct);
       }
     }
@@ -321,8 +321,8 @@
         // simplify expressions x0..xn
         // make addition (x0,-x1..-xn)
-        var simplifiedTrees = original.Subtrees.Select(x => GetSimplifiedTree(x));
+        var simplifiedTrees = original.Subtrees.Select(GetSimplifiedTree).ToArray();
         return simplifiedTrees.Take(1)
-          .Concat(simplifiedTrees.Skip(1).Select(x => Negate(x)))
-          .Aggregate((a, b) => MakeSum(a, b));
+          .Concat(simplifiedTrees.Skip(1).Select(Negate))
+          .Aggregate(MakeSum);
       }
     }
@@ -335,6 +335,6 @@
         // make addition (x0..xn)
         return original.Subtrees
-          .Select(x => GetSimplifiedTree(x))
-          .Aggregate((a, b) => MakeSum(a, b));
+          .Select(GetSimplifiedTree).ToArray()
+          .Aggregate(MakeSum);
       }
     }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.cs	(revision 12247)
@@ -48,4 +48,5 @@
     protected AbstractFeatureCorrelationView() {
       InitializeComponent();
+      dataView.FormatPattern = "0.000";
       fcc = new FeatureCorrelationCalculator();
       var calculators = ApplicationManager.Manager.GetInstances<IDependencyCalculator>();
@@ -115,4 +116,5 @@
       dataView.Maximum = calc.Maximum;
       dataView.Minimum = calc.Minimum;
+
       dataView.Content = correlation;
       dataView.Enabled = true;
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 12247)
@@ -252,5 +252,5 @@
       Operators.Add(new KnapsackSimultaneousPathRelinker());
       Operators.Add(new KnapsackSimilarityCalculator());
-      Operators.Add(new QualitySimilarityCalculator { QualityVariableName = SolutionCreator.BinaryVectorParameter.ActualName });
+      Operators.Add(new QualitySimilarityCalculator());
       Operators.Add(new NoSimilarityCalculator());
 
@@ -310,5 +310,5 @@
         op.ParentsParameter.Hidden = true;
       }
-      foreach (KnapsackSimilarityCalculator op in Operators.OfType<KnapsackSimilarityCalculator>()) {
+      foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>()) {
         op.SolutionVariableName = SolutionCreator.BinaryVectorParameter.ActualName;
         op.QualityVariableName = Evaluator.QualityParameter.ActualName;
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 12247)
@@ -261,5 +261,5 @@
       Operators.Add(new SingleObjectiveTestFunctionPathRelinker());
       Operators.Add(new SingleObjectiveTestFunctionSimilarityCalculator());
-      Operators.Add(new QualitySimilarityCalculator { QualityVariableName = SolutionCreator.RealVectorParameter.ActualName });
+      Operators.Add(new QualitySimilarityCalculator());
       Operators.Add(new NoSimilarityCalculator());
 
@@ -385,8 +385,9 @@
         op.ParentsParameter.Hidden = true;
       }
-      foreach (var op in Operators.OfType<SingleObjectiveTestFunctionSimilarityCalculator>()) {
+      foreach (var op in Operators.OfType<ISolutionSimilarityCalculator>()) {
         op.SolutionVariableName = SolutionCreator.RealVectorParameter.ActualName;
         op.QualityVariableName = Evaluator.QualityParameter.ActualName;
-        op.Bounds = Bounds;
+        var calc = op as SingleObjectiveTestFunctionSimilarityCalculator;
+        if (calc != null) calc.Bounds = Bounds;
       }
     }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 12247)
@@ -234,5 +234,5 @@
       Operators.Add(new TSPSimultaneousPathRelinker());
       Operators.Add(new TSPSimilarityCalculator());
-      Operators.Add(new QualitySimilarityCalculator { QualityVariableName = SolutionCreator.PermutationParameter.ActualName });
+      Operators.Add(new QualitySimilarityCalculator());
       Operators.Add(new NoSimilarityCalculator());
 
@@ -359,5 +359,5 @@
         op.ParentsParameter.Hidden = true;
       }
-      foreach (TSPSimilarityCalculator op in Operators.OfType<TSPSimilarityCalculator>()) {
+      foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>()) {
         op.SolutionVariableName = SolutionCreator.PermutationParameter.ActualName;
         op.QualityVariableName = Evaluator.QualityParameter.ActualName;
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs	(revision 12247)
@@ -32,4 +32,5 @@
 using HeuristicLab.MainForm.WindowsForms;
 using HeuristicLab.Persistence.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Persistence.Default.Xml;
 using HeuristicLab.PluginInfrastructure;
@@ -236,5 +237,5 @@
       if (!(item.Value is IDeepCloneable)) return;
       var data = new DataObject(HeuristicLab.Common.Constants.DragDropDataFormat, item);
-      DoDragDrop(data, DragDropEffects.Copy);
+      DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
     }
     protected virtual void variableListView_DragEnter(object sender, DragEventArgs e) {
@@ -252,10 +253,12 @@
       e.Effect = DragDropEffects.None;
       if (validDragOperation) {
-        if (e.AllowedEffect.HasFlag(DragDropEffects.Copy))
-          e.Effect = DragDropEffects.Copy;
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
       }
     }
     protected virtual void variableListView_DragDrop(object sender, DragEventArgs e) {
-      if (e.Effect != DragDropEffects.Copy) return;
+      if (e.Effect == DragDropEffects.None) return;
+
       object item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
 
@@ -278,6 +281,5 @@
       if (cloneable == null) return;
 
-      var clonedItem = cloneable.Clone();
-      Content.Add(variableName, clonedItem);
+      Content.Add(variableName, e.Effect.HasFlag(DragDropEffects.Copy) ? cloneable.Clone() : cloneable);
 
       var listViewItem = variableListView.FindItemWithText(variableName);
@@ -474,6 +476,6 @@
       if (variable.Value != null) {
         type = variable.Value.GetType();
-        if (serializableLookup.TryGetValue(type, out serializable))
-          return serializable;
+        if (serializableLookup.TryGetValue(type, out serializable)) return serializable;
+        if (StorableClassAttribute.IsStorableClass(type)) return serializableLookup[type] = true;
       }
 
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx.cs	(revision 12247)
@@ -23,11 +23,6 @@
 using System.Collections.Generic;
 using System.Linq;
-using System.Web;
-using System.Web.UI;
 using System.Web.UI.WebControls;
-using HeuristicLab.Services.Hive.DataAccess;
 using HeuristicLab.Services.Hive;
-using HeuristicLab.Services.Hive.DataTransfer;
-using System.Text;
 using System.Web.UI.DataVisualization.Charting;
 using DA = HeuristicLab.Services.Hive.DataAccess;
@@ -37,38 +32,40 @@
   protected void Page_Load(object sender, EventArgs e) {
     var dao = ServiceLocator.Instance.HiveDao;
+    var optDao = ServiceLocator.Instance.OptimizedHiveDao;
     var transactionManager = ServiceLocator.Instance.TransactionManager;
     var resourceName = Request.QueryString["resource"];
-    IEnumerable<Guid> resourceIds = new List<Guid>();
-    IEnumerable<DT.Slave> onlineSlaves = new List<DT.Slave>();
+    List<Guid> resourceIds = new List<Guid>();
+    List<DT.Slave> onlineSlaves = new List<DT.Slave>();
     int currentlyJobsWaiting = 0;
-    Dictionary<Guid, int> calculatingTasksByUser = new Dictionary<Guid,int>();
+    Dictionary<Guid, int> calculatingTasksByUser = new Dictionary<Guid, int>();
     Dictionary<Guid, int> waitingTasksByUser = new Dictionary<Guid, int>();
     List<DT.Resource> groups = new List<DT.Resource>();
 
     transactionManager.UseTransaction(() => {
-       groups = dao.GetResources(x => x.ResourceType == "GROUP").ToList();
-    }, false, false);    
+      groups = dao.GetResources(x => x.ResourceType == "GROUP").ToList();
+    }, false, false);
 
     if (!string.IsNullOrEmpty(resourceName)) {
-        transactionManager.UseTransaction(() =>
-        {
-            var resId = dao.GetResources(x => x.Name == resourceName).Single().Id;
-            resourceIds = dao.GetChildResources(resId).Select(x => x.Id).Union(new List<Guid> { resId });
-            calculatingTasksByUser = dao.GetCalculatingTasksByUserForResources(resourceIds.ToList());
-            waitingTasksByUser = dao.GetWaitingTasksByUserForResources(resourceIds.ToList());
-        }, false, false);        
+      transactionManager.UseTransaction(() => {
+        var resId = dao.GetResources(x => x.Name == resourceName).Single().Id;
+        resourceIds = dao.GetChildResources(resId).Select(x => x.Id).Union(new List<Guid> { resId }).ToList();
+        calculatingTasksByUser = dao.GetCalculatingTasksByUserForResources(resourceIds);
+        waitingTasksByUser = dao.GetWaitingTasksByUserForResources(resourceIds);
+      }, false, false);
     } else {
-        transactionManager.UseTransaction(() =>
-        {
-             resourceIds = dao.GetResources(x => true).Select(y => y.Id);
-             calculatingTasksByUser = dao.GetCalculatingTasksByUser();
-             waitingTasksByUser = dao.GetWaitingTasksByUser();            
-        }, false, false);
-    }   
+      transactionManager.UseTransaction(() => {
+        resourceIds = optDao.GetAllResourceIds().ToList();
+        calculatingTasksByUser = optDao.GetCalculatingTasksByUser();
+        waitingTasksByUser = optDao.GetWaitingTasksByUser();
+      }, false, false);
+    }
 
-    transactionManager.UseTransaction(() =>
-    {                     
-        onlineSlaves = dao.GetSlaves(x => (x.SlaveState == DA.SlaveState.Calculating || x.SlaveState == DA.SlaveState.Idle) && resourceIds.Contains(x.ResourceId));
-        currentlyJobsWaiting = dao.GetLightweightTasks(x => x.State == DA.TaskState.Waiting).Count();            
+    transactionManager.UseTransaction(() => {
+      if (string.IsNullOrEmpty(resourceName)) {
+        onlineSlaves = dao.GetSlaves(x => x.SlaveState == DA.SlaveState.Calculating || x.SlaveState == DA.SlaveState.Idle).ToList();
+      } else {
+        onlineSlaves = dao.GetSlaves(x => (x.SlaveState == DA.SlaveState.Calculating || x.SlaveState == DA.SlaveState.Idle) && resourceIds.Contains(x.ResourceId)).ToList();
+      }
+      currentlyJobsWaiting = optDao.GetNumberOfWaitingTasks();
     }, false, false);
 
@@ -76,5 +73,5 @@
     int currentlyAvailableCores = onlineSlaves.Where(s => s.Cores.HasValue && s.IsAllowedToCalculate).Sum(s => s.Cores.Value);
     int currentlyUsedCores = overallCurrentlyAvailableCores - onlineSlaves.Where(s => s.FreeCores.HasValue).Sum(s => s.FreeCores.Value);
-    
+
     this.overallAvailableCoresLabel.Text = overallCurrentlyAvailableCores.ToString();
     this.availableCoresLabel.Text = currentlyAvailableCores.ToString();
@@ -86,22 +83,21 @@
     groupsLabel.Text += string.Join(", ", groups.Select(x => string.Format("<a href=\"?resource={0}\">{0}</a>", x.Name)));
 
-    overallCpuUtilizationLabel.Text = (onlineSlaves.Count() > 0 ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2).ToString() : "0.0") + " %";
-    cpuUtilizationLabel.Text = (onlineSlaves.Count() > 0 && onlineSlaves.Where(x => x.IsAllowedToCalculate).Count() > 0 ? Math.Round(onlineSlaves.Where(x => x.IsAllowedToCalculate).Average(s => s.CpuUtilization), 2).ToString() : "0.0") + " %";
+    overallCpuUtilizationLabel.Text = (onlineSlaves.Any() ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2).ToString() : "0.0") + " %";
+    cpuUtilizationLabel.Text = (onlineSlaves.Any() && onlineSlaves.Any(x => x.IsAllowedToCalculate) ? Math.Round(onlineSlaves.Where(x => x.IsAllowedToCalculate).Average(s => s.CpuUtilization), 2).ToString() : "0.0") + " %";
 
-    DT.Statistics[] stats = new DT.Statistics[0];    
-    transactionManager.UseTransaction(() =>
-    {   
-        if (daysDropDownList.SelectedValue == "All") {
-          stats = dao.GetStatistics(x => true).OrderBy(x => x.TimeStamp).ToArray();
-        } else {
-          stats = dao.GetStatistics(x => x.Timestamp >= DateTime.Now.Subtract(TimeSpan.FromDays(int.Parse(daysDropDownList.SelectedValue)))).OrderBy(x => x.TimeStamp).ToArray();
-        }
+    DT.Statistics[] stats = new DT.Statistics[0];
+    transactionManager.UseTransaction(() => {
+      if (daysDropDownList.SelectedValue == "All") {
+        stats = dao.GetStatistics(x => true).OrderBy(x => x.TimeStamp).ToArray();
+      } else {
+        stats = dao.GetStatistics(x => x.Timestamp >= DateTime.Now.Subtract(TimeSpan.FromDays(int.Parse(daysDropDownList.SelectedValue)))).OrderBy(x => x.TimeStamp).ToArray();
+      }
     }, false, false);
-    
+
     for (int i = 0; i < stats.Length; i++) {
       var s = stats[i];
-      var slaveStats = s.SlaveStatistics.Where(x => resourceIds.Contains(x.SlaveId));
+      var slaveStats = s.SlaveStatistics.Where(x => resourceIds.Contains(x.SlaveId)).ToArray();
 
-      var averageCpuUtilization = slaveStats.Count() > 0 ? slaveStats.Average(x => x.CpuUtilization) : 0.0;
+      var averageCpuUtilization = slaveStats.Any() ? slaveStats.Average(x => x.CpuUtilization) : 0.0;
       cpuUtilizationChart.Series[0].Points.Add(new DataPoint(s.TimeStamp.ToOADate(), averageCpuUtilization));
 
@@ -118,6 +114,6 @@
     }
 
-    GenerateTasksByUserTable(waitingTasksByUser, waitingTasksByUserTable);  
-    GenerateTasksByUserTable(calculatingTasksByUser, calculatingTasksByUserTable);  
+    GenerateTasksByUserTable(waitingTasksByUser, waitingTasksByUserTable);
+    GenerateTasksByUserTable(calculatingTasksByUser, calculatingTasksByUserTable);
   }
 
@@ -134,6 +130,6 @@
       table.Rows.Add(curRow);
     }
-    if (tasksByUser.Count() > 0) {
-      TableRow sumRow = new TableRow();        
+    if (tasksByUser.Any()) {
+      TableRow sumRow = new TableRow();
       TableCell sumCell = new TableCell();
       sumCell.BorderWidth = Unit.Pixel(3);
@@ -143,4 +139,4 @@
       table.Rows.Add(sumRow);
     }
-  }  
+  }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/HiveDao.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/HiveDao.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/HiveDao.cs	(revision 12247)
@@ -869,14 +869,4 @@
     }
 
-    public Dictionary<Guid, int> GetWaitingTasksByUser() {
-      using (var db = CreateContext()) {
-        var waitingTasksByUser = from task in db.Tasks
-                                 where task.State == TaskState.Waiting
-                                 group task by task.Job.OwnerUserId into g
-                                 select new { UserId = g.Key, UsedCores = g.Count() };
-        return waitingTasksByUser.ToDictionary(x => x.UserId, x => x.UsedCores);
-      }
-    }
-
     public Dictionary<Guid, int> GetWaitingTasksByUserForResources(List<Guid> resourceIds) {
       using (var db = CreateContext()) {
@@ -886,14 +876,4 @@
                                  select new { UserId = g.Key, UsedCores = g.Count() };
         return waitingTasksByUser.ToDictionary(x => x.UserId, x => x.UsedCores);
-      }
-    }
-
-    public Dictionary<Guid, int> GetCalculatingTasksByUser() {
-      using (var db = CreateContext()) {
-        var calculatingTasksByUser = from task in db.Tasks
-                                     where task.State == TaskState.Calculating
-                                     group task by task.Job.OwnerUserId into g
-                                     select new { UserId = g.Key, UsedCores = g.Count() };
-        return calculatingTasksByUser.ToDictionary(x => x.UserId, x => x.UsedCores);
       }
     }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Interfaces/IHiveDao.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Interfaces/IHiveDao.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Interfaces/IHiveDao.cs	(revision 12247)
@@ -150,7 +150,5 @@
 
     #region Statistics Methods
-    Dictionary<Guid, int> GetWaitingTasksByUser();
     Dictionary<Guid, int> GetWaitingTasksByUserForResources(List<Guid> resourceIds);
-    Dictionary<Guid, int> GetCalculatingTasksByUser();
     Dictionary<Guid, int> GetCalculatingTasksByUserForResources(List<Guid> resourceIds);
     DT.Statistics GetStatistic(Guid id);
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Interfaces/IOptimizedHiveDao.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Interfaces/IOptimizedHiveDao.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Interfaces/IOptimizedHiveDao.cs	(revision 12247)
@@ -65,4 +65,16 @@
     IEnumerable<Guid> GetAssignedResourceIds(Guid jobId);
     #endregion
+
+    #region Website Methods
+
+    IEnumerable<Guid> GetAllResourceIds();
+
+    int GetNumberOfWaitingTasks();
+
+    Dictionary<Guid, int> GetCalculatingTasksByUser();
+
+    Dictionary<Guid, int> GetWaitingTasksByUser();
+
+    #endregion
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs	(revision 12247)
@@ -122,6 +122,16 @@
     /// </summary>
     private void DeleteObsoleteSlaves() {
-      var slaves = dao.GetSlaves(x => x.IsDisposable.GetValueOrDefault() && x.SlaveState == SlaveState.Offline && (DateTime.Now - x.LastHeartbeat) > HeuristicLab.Services.Hive.Properties.Settings.Default.SweepInterval);
-      foreach (DT.Slave slave in slaves) dao.DeleteSlave(slave.Id);
+      var slaves = dao.GetSlaves(x => x.IsDisposable.GetValueOrDefault() &&
+                                      x.SlaveState == SlaveState.Offline &&
+                                      (DateTime.Now - x.LastHeartbeat) > Hive.Properties.Settings.Default.SweepInterval)
+                                .Select(x => x.Id)
+                                .ToArray();
+
+      foreach (Guid slaveId in slaves) {
+        var downtimesAvailable = dao.GetDowntimes(x => x.ResourceId == slaveId).Any();
+        if (!downtimesAvailable) {
+          dao.DeleteSlave(slaveId);
+        }
+      }
     }
   }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/OptimizedHiveDao.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/OptimizedHiveDao.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Services.Hive/3.3/OptimizedHiveDao.cs	(revision 12247)
@@ -245,4 +245,54 @@
     );
     #endregion
+
+
+    #region Website Methods
+    private const string GetAllResourceIdsString = @"SELECT ResourceId FROM [Resource]";
+    public IEnumerable<Guid> GetAllResourceIds() {
+      return Db.ExecuteQuery<Guid>(GetAllResourceIdsString);
+    }
+
+    private const string GetNumberOfWaitingTasksString = @"SELECT COUNT(TaskId) 
+                                                           FROM [Task] 
+                                                           WHERE TaskState LIKE 'Waiting'";
+    public int GetNumberOfWaitingTasks() {
+      return Db.ExecuteQuery<int>(GetNumberOfWaitingTasksString).Single();
+    }
+
+    private class UserTasks {
+      public Guid OwnerUserId;
+      public int Count;
+    }
+
+    private const string GetCalculatingTasksByUserString = @"SELECT Job.OwnerUserId, COUNT(Task.TaskId) as Count 
+                                                             FROM Task, Job 
+                                                             WHERE TaskState LIKE 'Calculating' AND Task.JobId = Job.JobId
+                                                             GROUP BY Job.OwnerUserId";
+
+    public Dictionary<Guid, int> GetCalculatingTasksByUser() {
+      var result = Db.ExecuteQuery<UserTasks>(GetCalculatingTasksByUserString);
+      Dictionary<Guid, int> lst = new Dictionary<Guid, int>();
+
+      foreach (var userTask in result) {
+        lst.Add(userTask.OwnerUserId, userTask.Count);
+      }
+      return lst;
+    }
+
+    private const string GetWaitingTasksByUserString = @"SELECT Job.OwnerUserId, COUNT(Task.TaskId) as Count 
+                                                         FROM Task, Job 
+                                                         WHERE TaskState LIKE 'Waiting' AND Task.JobId = Job.JobId
+                                                         GROUP BY Job.OwnerUserId";
+
+    public Dictionary<Guid, int> GetWaitingTasksByUser() {
+      var result = Db.ExecuteQuery<UserTasks>(GetWaitingTasksByUserString);
+      Dictionary<Guid, int> lst = new Dictionary<Guid, int>();
+
+      foreach (var userTask in result) {
+        lst.Add(userTask.OwnerUserId, userTask.Count);
+      }
+      return lst;
+    }
+    #endregion
   }
 }
Index: branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/ImageExportDialog.cs
===================================================================
--- branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/ImageExportDialog.cs	(revision 12190)
+++ branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/ImageExportDialog.cs	(revision 12247)
@@ -175,5 +175,5 @@
 
       chartAreaComboBox.Items.Clear();
-      foreach (var area in originalChart.ChartAreas) {
+      foreach (var area in originalChart.ChartAreas.Where(x => x.Visible)) {
         chartAreaComboBox.Items.Add(area.Name);
       }
