Index: /stable/HeuristicLab 3.3.sln
===================================================================
--- /stable/HeuristicLab 3.3.sln	(revision 11918)
+++ /stable/HeuristicLab 3.3.sln	(revision 11919)
@@ -1,5 +1,7 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
+# Visual Studio 2013
+VisualStudioVersion = 12.0.31101.0
+MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{96396439-A764-4022-A8D2-BE021449B8D1}"
 	ProjectSection(SolutionItems) = preProject
@@ -111,4 +113,5 @@
 		{25735DB4-8E54-4A2C-83E3-A60C76565E55} = {25735DB4-8E54-4A2C-83E3-A60C76565E55}
 		{5FEE5DB4-7FD9-4CBD-BEC2-3FEE17B31A94} = {5FEE5DB4-7FD9-4CBD-BEC2-3FEE17B31A94}
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8} = {052881B5-4D5D-41C5-9555-FECA01E0BAC8}
 		{F4539FB6-4708-40C9-BE64-0A1390AEA197} = {F4539FB6-4708-40C9-BE64-0A1390AEA197}
 		{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C} = {A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}
@@ -402,4 +405,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataPreprocessing.Views-3.4", "HeuristicLab.DataPreprocessing.Views\3.4\HeuristicLab.DataPreprocessing.Views-3.4.csproj", "{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Analysis.Statistics.Views-3.3", "HeuristicLab.Analysis.Statistics.Views\3.3\HeuristicLab.Analysis.Statistics.Views-3.3.csproj", "{052881B5-4D5D-41C5-9555-FECA01E0BAC8}"
 EndProject
 Global
@@ -1957,4 +1962,16 @@
 		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x64.ActiveCfg = Release|Any CPU
 		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x86.ActiveCfg = Release|Any CPU
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|x64.ActiveCfg = Debug|x64
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|x64.Build.0 = Debug|x64
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|x86.ActiveCfg = Debug|x86
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|x86.Build.0 = Debug|x86
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Release|x64.ActiveCfg = Release|x64
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Release|x64.Build.0 = Release|x64
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Release|x86.ActiveCfg = Release|x86
+		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs	(revision 11919)
@@ -0,0 +1,326 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  [View("Chart Analysis", "HeuristicLab.Analysis.Statistics.Views.InfoResources.ChartAnalysisInfo.rtf")]
+  [Content(typeof(RunCollection), false)]
+  public sealed partial class ChartAnalysisView : ItemView {
+    public new RunCollection Content {
+      get { return (RunCollection)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get { return true; }
+      set { /*not needed because results are always readonly */}
+    }
+
+    private List<IRun> runs;
+    private IProgress progress;
+    private bool valuesAdded = false;
+    private bool suppressUpdates = false;
+
+    public ChartAnalysisView() {
+      InitializeComponent();
+
+      stringConvertibleMatrixView.DataGridView.RowHeaderMouseDoubleClick += DataGridView_RowHeaderMouseDoubleClick;
+
+      var fittingAlgs = ApplicationManager.Manager.GetInstances<IFitting>();
+      foreach (var fit in fittingAlgs) {
+        fittingComboBox.Items.Add(fit);
+      }
+      fittingComboBox.SelectedIndex = 0;
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        stringConvertibleMatrixView.DataGridView.RowHeaderMouseDoubleClick -= DataGridView_RowHeaderMouseDoubleClick;
+        components.Dispose();
+      }
+
+      base.Dispose(disposing);
+    }
+
+    #region Content Events
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateComboboxes();
+      UpdateCaption();
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Chart Analysis" : ViewAttribute.GetViewName(GetType());
+    }
+
+    private void UpdateComboboxes() {
+      if (Content != null) {
+        UpdateDataTableComboBox();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ColumnsChanged += Content_ColumnsChanged;
+      Content.RowsChanged += Content_RowsChanged;
+      Content.CollectionReset += Content_CollectionReset;
+      Content.UpdateOfRunsInProgressChanged += Content_UpdateOfRunsInProgressChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ColumnsChanged -= Content_ColumnsChanged;
+      Content.RowsChanged -= Content_RowsChanged;
+      Content.CollectionReset -= Content_CollectionReset;
+      Content.UpdateOfRunsInProgressChanged -= Content_UpdateOfRunsInProgressChanged;
+    }
+
+    void Content_RowsChanged(object sender, EventArgs e) {
+      RebuildDataTableAsync();
+    }
+
+    void Content_ColumnsChanged(object sender, EventArgs e) {
+      RebuildDataTableAsync();
+    }
+
+    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      UpdateComboboxes();
+      RebuildDataTableAsync();
+    }
+
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      suppressUpdates = Content.UpdateOfRunsInProgress;
+
+      if (!suppressUpdates && !valuesAdded) {
+        RebuildDataTableAsync();
+      }
+      if (valuesAdded) {
+        valuesAdded = false;
+      }
+    }
+    #endregion
+
+    #region events
+    private void DataGridView_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (e.RowIndex >= 0) {
+        IRun run = runs[stringConvertibleMatrixView.GetRowIndex(e.RowIndex)];
+        IContentView view = MainFormManager.MainForm.ShowContent(run);
+        if (view != null) {
+          view.ReadOnly = this.ReadOnly;
+          view.Locked = this.Locked;
+        }
+      }
+    }
+
+    private void dataTableComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateDataRowComboBox();
+    }
+
+    private void dataRowComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      RebuildDataTableAsync();
+    }
+
+    private void addLineToChart_Click(object sender, EventArgs e) {
+      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Adding fitted lines to charts...");
+
+      string resultName = (string)dataTableComboBox.SelectedItem;
+      string rowName = (string)dataRowComboBox.SelectedItem;
+
+      var task = Task.Factory.StartNew(() => AddLineToChart(resultName, rowName));
+
+      task.ContinueWith((t) => {
+        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        ErrorHandling.ShowErrorDialog("An error occured while adding lines to charts. ", t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
+
+      task.ContinueWith((t) => {
+        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      }, TaskContinuationOptions.OnlyOnRanToCompletion);
+    }
+
+    private void AddLineToChart(string resultName, string rowName) {
+      foreach (IRun run in runs) {
+        DataTable resTable = (DataTable)run.Results[resultName];
+        DataRow row = resTable.Rows[rowName];
+        var values = row.Values.ToArray();
+
+        var fittingAlg = fittingComboBox.SelectedItem as IFitting;
+        DataRow newRow = fittingAlg.CalculateFittedLine(values);
+        newRow.Name = row.Name + " (" + fittingAlg + ")";
+
+        if (!resTable.Rows.ContainsKey(newRow.Name))
+          resTable.Rows.Add(newRow);
+      }
+    }
+
+    private void addValuesButton_Click(object sender, EventArgs e) {
+      string resultName = (string)dataTableComboBox.SelectedItem;
+      string rowName = (string)dataRowComboBox.SelectedItem;
+      DoubleMatrix sm = (DoubleMatrix)stringConvertibleMatrixView.Content;
+
+      Content.UpdateOfRunsInProgress = true;
+      for (int i = 0; i < runs.Count(); i++) {
+        IRun run = runs[i];
+
+        for (int j = 0; j < sm.ColumnNames.Count(); j++) {
+          if (stringConvertibleMatrixView.DataGridView.Columns[j].Visible) {
+            string newResultName = resultName + " " + rowName + " " + sm.ColumnNames.ElementAt(j);
+            if (!run.Results.ContainsKey(newResultName)) {
+              run.Results.Add(new KeyValuePair<string, IItem>(newResultName, new DoubleValue(sm[i, j])));
+            }
+          }
+        }
+      }
+      valuesAdded = true;
+      Content.UpdateOfRunsInProgress = false;
+    }
+    #endregion
+
+    private void UpdateDataRowComboBox() {
+      string selectedItem = (string)this.dataRowComboBox.SelectedItem;
+
+      dataRowComboBox.Items.Clear();
+      var resultName = (string)dataTableComboBox.SelectedItem;
+      var dataTables = from run in Content
+                       where run.Results.ContainsKey(resultName)
+                       select run.Results[resultName] as DataTable;
+      var rowNames = (from dataTable in dataTables
+                      from row in dataTable.Rows
+                      select row.Name).Distinct().ToArray();
+
+      dataRowComboBox.Items.AddRange(rowNames);
+      if (selectedItem != null && dataRowComboBox.Items.Contains(selectedItem)) {
+        dataRowComboBox.SelectedItem = selectedItem;
+      } else if (dataRowComboBox.Items.Count > 0) {
+        dataRowComboBox.SelectedItem = dataRowComboBox.Items[0];
+      }
+    }
+
+    private void UpdateDataTableComboBox() {
+      string selectedItem = (string)this.dataTableComboBox.SelectedItem;
+
+      dataTableComboBox.Items.Clear();
+      var dataTables = (from run in Content
+                        from result in run.Results
+                        where result.Value is DataTable
+                        select result.Key).Distinct().ToArray();
+
+      dataTableComboBox.Items.AddRange(dataTables);
+      if (selectedItem != null && dataTableComboBox.Items.Contains(selectedItem)) {
+        dataTableComboBox.SelectedItem = selectedItem;
+      } else if (dataTableComboBox.Items.Count > 0) {
+        dataTableComboBox.SelectedItem = dataTableComboBox.Items[0];
+      }
+    }
+
+    private void RebuildDataTableAsync() {
+      progress = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Calculating values...");
+
+      string resultName = (string)dataTableComboBox.SelectedItem;
+      string rowName = (string)dataRowComboBox.SelectedItem;
+
+      var task = Task.Factory.StartNew(() => RebuildDataTable(resultName, rowName));
+
+      task.ContinueWith((t) => {
+        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        ErrorHandling.ShowErrorDialog("An error occured while calculating values. ", t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
+
+      task.ContinueWith((t) => {
+        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      }, TaskContinuationOptions.OnlyOnRanToCompletion);
+    }
+
+    private void RebuildDataTable(string resultName, string rowName) {
+      LinearLeastSquaresFitting llsFitting = new LinearLeastSquaresFitting();
+      string[] columnNames = new string[] { "Count", "Minimum", "Maximum", "Average", "Median", "Standard Deviation", "Variance", "25th Percentile", "75th Percentile",
+        "Avg. of Upper 25 %", " Avg. of Lower 25 %", "Avg. of First 25 %", "Avg. of Last 25 %", "Slope", "Intercept", "Average Relative Error" };
+
+      runs = Content.Where(x => x.Results.ContainsKey(resultName) && x.Visible).ToList();
+      DoubleMatrix dt = new DoubleMatrix(runs.Count(), columnNames.Count());
+      dt.RowNames = runs.Select(x => x.Name);
+      dt.ColumnNames = columnNames;
+
+      int i = 0;
+      foreach (Run run in runs) {
+        DataTable resTable = (DataTable)run.Results[resultName];
+        dt.SortableView = true;
+        DataRow row = resTable.Rows[rowName];
+        var values = row.Values.ToArray();
+
+        double cnt = values.Count();
+        double min = values.Min();
+        double max = values.Max();
+        double avg = values.Average();
+        double median = values.Median();
+        double stdDev = values.StandardDeviation();
+        double variance = values.Variance();
+        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 slope, intercept, r;
+        llsFitting.Calculate(values, out slope, out intercept);
+        r = llsFitting.CalculateError(values, slope, intercept);
+
+        dt[i, 0] = cnt;
+        dt[i, 1] = min;
+        dt[i, 2] = max;
+        dt[i, 3] = avg;
+        dt[i, 4] = median;
+        dt[i, 5] = stdDev;
+        dt[i, 6] = variance;
+        dt[i, 7] = percentile25;
+        dt[i, 8] = percentile75;
+        dt[i, 9] = upperAvg;
+        dt[i, 10] = lowerAvg;
+        dt[i, 11] = firstAvg;
+        dt[i, 12] = lastAvg;
+        dt[i, 13] = slope;
+        dt[i, 14] = intercept;
+        dt[i, 15] = r;
+
+        i++;
+        progress.ProgressValue = ((double)runs.Count) / i;
+      }
+      stringConvertibleMatrixView.Content = dt;
+
+      for (i = 0; i < runs.Count(); i++) {
+        stringConvertibleMatrixView.DataGridView.Rows[i].DefaultCellStyle.ForeColor = runs[i].Color;
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.designer.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.designer.cs	(revision 11919)
@@ -0,0 +1,188 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  partial class ChartAnalysisView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.fittingComboBox = new System.Windows.Forms.ComboBox();
+      this.addValuesButton = new System.Windows.Forms.Button();
+      this.addLineToChart = new System.Windows.Forms.Button();
+      this.dataRowComboBox = new System.Windows.Forms.ComboBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.dataTableComboBox = new System.Windows.Forms.ComboBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.stringConvertibleMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // fittingComboBox
+      // 
+      this.fittingComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.fittingComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.fittingComboBox.FormattingEnabled = true;
+      this.fittingComboBox.Location = new System.Drawing.Point(76, 3);
+      this.fittingComboBox.Name = "fittingComboBox";
+      this.fittingComboBox.Size = new System.Drawing.Size(214, 21);
+      this.fittingComboBox.TabIndex = 12;
+      // 
+      // addValuesButton
+      // 
+      this.addValuesButton.Location = new System.Drawing.Point(3, 3);
+      this.addValuesButton.Name = "addValuesButton";
+      this.addValuesButton.Size = new System.Drawing.Size(133, 23);
+      this.addValuesButton.TabIndex = 10;
+      this.addValuesButton.Text = "Add Values to Results";
+      this.addValuesButton.UseVisualStyleBackColor = true;
+      this.addValuesButton.Click += new System.EventHandler(this.addValuesButton_Click);
+      // 
+      // addLineToChart
+      // 
+      this.addLineToChart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.addLineToChart.Location = new System.Drawing.Point(296, 3);
+      this.addLineToChart.Name = "addLineToChart";
+      this.addLineToChart.Size = new System.Drawing.Size(100, 23);
+      this.addLineToChart.TabIndex = 9;
+      this.addLineToChart.Text = "Fit Line to Chart";
+      this.addLineToChart.UseVisualStyleBackColor = true;
+      this.addLineToChart.Click += new System.EventHandler(this.addLineToChart_Click);
+      // 
+      // dataRowComboBox
+      // 
+      this.dataRowComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataRowComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.dataRowComboBox.FormattingEnabled = true;
+      this.dataRowComboBox.Location = new System.Drawing.Point(69, 36);
+      this.dataRowComboBox.Name = "dataRowComboBox";
+      this.dataRowComboBox.Size = new System.Drawing.Size(540, 21);
+      this.dataRowComboBox.TabIndex = 8;
+      this.dataRowComboBox.SelectedIndexChanged += new System.EventHandler(this.dataRowComboBox_SelectedIndexChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 39);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(55, 13);
+      this.label2.TabIndex = 7;
+      this.label2.Text = "DataRow:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(60, 13);
+      this.label1.TabIndex = 6;
+      this.label1.Text = "DataTable:";
+      // 
+      // dataTableComboBox
+      // 
+      this.dataTableComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTableComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.dataTableComboBox.FormattingEnabled = true;
+      this.dataTableComboBox.Location = new System.Drawing.Point(69, 6);
+      this.dataTableComboBox.Name = "dataTableComboBox";
+      this.dataTableComboBox.Size = new System.Drawing.Size(540, 21);
+      this.dataTableComboBox.TabIndex = 5;
+      this.dataTableComboBox.SelectedIndexChanged += new System.EventHandler(this.dataTableComboBox_SelectedIndexChanged);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Location = new System.Drawing.Point(6, 391);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.addValuesButton);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.fittingComboBox);
+      this.splitContainer1.Panel2.Controls.Add(this.addLineToChart);
+      this.splitContainer1.Size = new System.Drawing.Size(603, 29);
+      this.splitContainer1.SplitterDistance = 200;
+      this.splitContainer1.TabIndex = 13;
+      // 
+      // stringConvertibleMatrixView
+      // 
+      this.stringConvertibleMatrixView.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)));
+      this.stringConvertibleMatrixView.Caption = "StringConvertibleMatrix View";
+      this.stringConvertibleMatrixView.Content = null;
+      this.stringConvertibleMatrixView.Location = new System.Drawing.Point(2, 63);
+      this.stringConvertibleMatrixView.Name = "stringConvertibleMatrixView";
+      this.stringConvertibleMatrixView.ReadOnly = true;
+      this.stringConvertibleMatrixView.ShowRowsAndColumnsTextBox = true;
+      this.stringConvertibleMatrixView.ShowStatisticalInformation = true;
+      this.stringConvertibleMatrixView.Size = new System.Drawing.Size(607, 322);
+      this.stringConvertibleMatrixView.TabIndex = 0;
+      // 
+      // ChartAnalysisView
+      // 
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.stringConvertibleMatrixView);
+      this.Controls.Add(this.dataTableComboBox);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.dataRowComboBox);
+      this.Controls.Add(this.label2);
+      this.Name = "ChartAnalysisView";
+      this.Size = new System.Drawing.Size(612, 423);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private HeuristicLab.Data.Views.StringConvertibleMatrixView stringConvertibleMatrixView;
+    private System.Windows.Forms.ComboBox dataRowComboBox;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox dataTableComboBox;
+    private System.Windows.Forms.Button addLineToChart;
+    private System.Windows.Forms.Button addValuesButton;
+    private System.Windows.Forms.ComboBox fittingComboBox;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.cs	(revision 11919)
@@ -0,0 +1,238 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  [View("Correlations")]
+  [Content(typeof(RunCollection), false)]
+  public sealed partial class CorrelationView : ItemView {
+    private const string PearsonName = "Pearson product-moment correlation coefficient";
+    private const string SpearmanName = "Spearman's rank correlation coefficient";
+
+    private enum ResultParameterType {
+      Result,
+      Parameter
+    }
+
+    private bool suppressUpdates = false;
+
+    public new RunCollection Content {
+      get { return (RunCollection)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get { return true; }
+      set { /*not needed because results are always readonly */}
+    }
+
+    public CorrelationView() {
+      InitializeComponent();
+      stringConvertibleMatrixView.Minimum = -1.0;
+      stringConvertibleMatrixView.Maximum = 1.0;
+
+      methodComboBox.Items.Add(PearsonName);
+      methodComboBox.Items.Add(SpearmanName);
+      methodComboBox.SelectedIndex = 0;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content != null) {
+        RebuildCorrelationTable();
+      }
+      UpdateCaption();
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Correlations" : ViewAttribute.GetViewName(GetType());
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ColumnsChanged += Content_ColumnsChanged;
+      Content.RowsChanged += Content_RowsChanged;
+      Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged += Content_UpdateOfRunsInProgressChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ColumnsChanged -= Content_ColumnsChanged;
+      Content.RowsChanged -= Content_RowsChanged;
+      Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged -= Content_UpdateOfRunsInProgressChanged;
+    }
+
+    void Content_RowsChanged(object sender, EventArgs e) {
+      UpdateUI();
+    }
+
+    void Content_ColumnsChanged(object sender, EventArgs e) {
+      UpdateUI();
+    }
+
+    private void Content_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      UpdateUI();
+    }
+
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      suppressUpdates = Content.UpdateOfRunsInProgress;
+      UpdateUI();
+    }
+    #endregion
+
+    private void UpdateUI() {
+      if (!suppressUpdates) {
+        RebuildCorrelationTable();
+      }
+    }
+
+    private List<string> GetResultRowNames() {
+      var results = (from run in Content
+                     where run.Visible
+                     from result in run.Results
+                     where result.Value is DoubleValue || result.Value is IntValue
+                     select result.Key).Distinct().OrderBy(x => x).ToList();
+
+      return results;
+    }
+
+    private List<string> GetParameterRowNames() {
+      var parameters = (from run in Content
+                        where run.Visible
+                        from parameter in run.Parameters
+                        where parameter.Value is DoubleValue || parameter.Value is IntValue
+                        select parameter.Key).Distinct().OrderBy(x => x).ToList();
+
+      return parameters;
+    }
+
+    private Dictionary<string, ResultParameterType> GetRowNames() {
+      Dictionary<string, ResultParameterType> ret = new Dictionary<string, ResultParameterType>();
+
+      var results = GetResultRowNames();
+      var parameters = GetParameterRowNames();
+
+      foreach (var r in results) {
+        ret.Add(r, ResultParameterType.Result);
+      }
+      foreach (var p in parameters) {
+        if (!ret.ContainsKey(p)) {
+          ret.Add(p, ResultParameterType.Parameter);
+        }
+      }
+
+      return ret;
+    }
+
+    private List<double> GetDoublesFromResults(List<IRun> runs, string key) {
+      List<double> res = new List<double>();
+
+      foreach (var r in runs) {
+        if (r.Results[key] is DoubleValue) {
+          res.Add(((DoubleValue)r.Results[key]).Value);
+        } else {
+          res.Add(((IntValue)r.Results[key]).Value);
+        }
+      }
+      return res;
+    }
+
+    private List<double> GetDoublesFromParameters(List<IRun> runs, string key) {
+      List<double> res = new List<double>();
+
+      foreach (var r in runs) {
+        if (r.Parameters[key] is DoubleValue) {
+          res.Add(((DoubleValue)r.Parameters[key]).Value);
+        } else {
+          res.Add(((IntValue)r.Parameters[key]).Value);
+        }
+      }
+      return res;
+    }
+
+    private List<double> GetValuesFromResultsParameters(IEnumerable<IRun> runs, string name, ResultParameterType type) {
+      if (type == ResultParameterType.Parameter) {
+        return GetDoublesFromParameters(runs.Where(x => x.Parameters.ContainsKey(name)).ToList(), name);
+      } else if (type == ResultParameterType.Result) {
+        return GetDoublesFromResults(runs.Where(x => x.Results.ContainsKey(name)).ToList(), name);
+      } else {
+        return null;
+      }
+    }
+
+    private void RebuildCorrelationTable() {
+      Dictionary<string, ResultParameterType> resultsParameters = GetRowNames();
+      string methodName = (string)methodComboBox.SelectedItem;
+      var columnNames = resultsParameters.Keys.ToArray();
+
+      var runs = Content.Where(x => x.Visible);
+
+      DoubleMatrix dt = new DoubleMatrix(resultsParameters.Count(), columnNames.Count());
+      dt.RowNames = columnNames;
+      dt.ColumnNames = columnNames;
+
+      int i = 0;
+      foreach (var res in resultsParameters) {
+        var rowValues =
+          GetValuesFromResultsParameters(runs, res.Key, res.Value)
+            .Where(x => !double.IsNaN(x) && !double.IsNegativeInfinity(x) && !double.IsPositiveInfinity(x));
+
+        int j = 0;
+        foreach (var cres in resultsParameters) {
+          var columnValues = GetValuesFromResultsParameters(runs, cres.Key, cres.Value)
+                .Where(x => !double.IsNaN(x) && !double.IsNegativeInfinity(x) && !double.IsPositiveInfinity(x));
+
+          if (!rowValues.Any() || !columnValues.Any() || i == j || rowValues.Count() != columnValues.Count()) {
+            dt[i, j] = double.NaN;
+          } else {
+            if (methodName == PearsonName) {
+              dt[i, j] = alglib.pearsoncorr2(rowValues.ToArray(), columnValues.ToArray());
+            } else {
+              dt[i, j] = alglib.spearmancorr2(rowValues.ToArray(), columnValues.ToArray());
+            }
+          }
+          j++;
+        }
+        i++;
+      }
+
+      dt.SortableView = true;
+      stringConvertibleMatrixView.Content = dt;
+    }
+
+    private void methodComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        RebuildCorrelationTable();
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.designer.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/CorrelationView.designer.cs	(revision 11919)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  partial class CorrelationView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.stringConvertibleMatrixView = new HeuristicLab.Data.Views.EnhancedStringConvertibleMatrixView();
+      this.label1 = new System.Windows.Forms.Label();
+      this.methodComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // stringConvertibleMatrixView
+      // 
+      this.stringConvertibleMatrixView.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)));
+      this.stringConvertibleMatrixView.Caption = "StringConvertibleMatrix View";
+      this.stringConvertibleMatrixView.Content = null;
+      this.stringConvertibleMatrixView.Location = new System.Drawing.Point(3, 30);
+      this.stringConvertibleMatrixView.Maximum = 0D;
+      this.stringConvertibleMatrixView.Minimum = 0D;
+      this.stringConvertibleMatrixView.Name = "stringConvertibleMatrixView";
+      this.stringConvertibleMatrixView.ReadOnly = true;
+      this.stringConvertibleMatrixView.ShowRowsAndColumnsTextBox = true;
+      this.stringConvertibleMatrixView.ShowStatisticalInformation = true;
+      this.stringConvertibleMatrixView.Size = new System.Drawing.Size(492, 352);
+      this.stringConvertibleMatrixView.TabIndex = 0;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(5, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(46, 13);
+      this.label1.TabIndex = 6;
+      this.label1.Text = "Method:";
+      // 
+      // methodComboBox
+      // 
+      this.methodComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.methodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.methodComboBox.FormattingEnabled = true;
+      this.methodComboBox.Location = new System.Drawing.Point(71, 3);
+      this.methodComboBox.Name = "methodComboBox";
+      this.methodComboBox.Size = new System.Drawing.Size(424, 21);
+      this.methodComboBox.TabIndex = 5;
+      this.methodComboBox.SelectedIndexChanged += new System.EventHandler(this.methodComboBox_SelectedIndexChanged);
+      // 
+      // CorrelationView
+      // 
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.methodComboBox);
+      this.Controls.Add(this.stringConvertibleMatrixView);
+      this.Name = "CorrelationView";
+      this.Size = new System.Drawing.Size(498, 385);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private HeuristicLab.Data.Views.EnhancedStringConvertibleMatrixView stringConvertibleMatrixView;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox methodComboBox;
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/HeuristicLab.Analysis.Statistics.Views-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/HeuristicLab.Analysis.Statistics.Views-3.3.csproj	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/HeuristicLab.Analysis.Statistics.Views-3.3.csproj	(revision 11919)
@@ -0,0 +1,288 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{052881B5-4D5D-41C5-9555-FECA01E0BAC8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Analysis.Statistics.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Analysis.Statistics.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\bin\ALGLIB-3.7.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="InfoResources\ChartAnalysisInfo.rtf" />
+    <EmbeddedResource Include="InfoResources\SampleSizeInfluenceInfo.rtf" />
+    <EmbeddedResource Include="InfoResources\StatisticalTestsInfo.rtf" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SampleSizeInfluenceView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SampleSizeInfluenceView.Designer.cs">
+      <DependentUpon>SampleSizeInfluenceView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StatisticalTestsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StatisticalTestsView.designer.cs">
+      <DependentUpon>StatisticalTestsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CorrelationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CorrelationView.designer.cs">
+      <DependentUpon>CorrelationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ChartAnalysisView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ChartAnalysisView.designer.cs">
+      <DependentUpon>ChartAnalysisView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StatisticalTestsConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="StatisticalTestsConfigurationDialog.Designer.cs">
+      <DependentUpon>StatisticalTestsConfigurationDialog.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis.Views\3.3\HeuristicLab.Analysis.Views-3.3.csproj">
+      <Project>{76945d76-ca61-4147-9dc2-0acdcddf87f9}</Project>
+      <Name>HeuristicLab.Analysis.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data.Views\3.3\HeuristicLab.Data.Views-3.3.csproj">
+      <Project>{72104a0b-90e7-42f3-9abe-9bbbadd4b943}</Project>
+      <Name>HeuristicLab.Data.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization.Views\3.3\HeuristicLab.Optimization.Views-3.3.csproj">
+      <Project>{662b4b15-8f4d-4ae5-b3eb-d91c215f5af2}</Project>
+      <Name>HeuristicLab.Optimization.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Visualization.ChartControlsExtensions\3.3\HeuristicLab.Visualization.ChartControlsExtensions-3.3.csproj">
+      <Project>{315BDA09-3F4F-49B3-9790-B37CFC1C5750}</Project>
+      <Name>HeuristicLab.Visualization.ChartControlsExtensions-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/Plugin.cs.frame	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/Plugin.cs.frame	(revision 11919)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Analysis.Statistics.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Analysis.Statistics.Views", "3.3.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Analysis.Statistics.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.7.0")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Analysis.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
+  public class HeuristicLabAnalysisStatisticsViewsPlugin : PluginBase {
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 11919)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Analysis.Statistics.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab algorithm analysis statistics classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("bb4e3c6d-ba36-4bb9-a601-04d3c714c0f1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.10.$WCREV$")]
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.Designer.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.Designer.cs	(revision 11919)
@@ -0,0 +1,305 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  partial class SampleSizeInfluenceView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SampleSizeInfluenceView));
+      this.xAxisLabel = new System.Windows.Forms.Label();
+      this.yAxisLabel = new System.Windows.Forms.Label();
+      this.yAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.noRunsLabel = new System.Windows.Forms.Label();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.hypergeometricCheckBox = new System.Windows.Forms.CheckBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.RecalculateButton = new System.Windows.Forms.Button();
+      this.sampleSizeTextBox = new System.Windows.Forms.TextBox();
+      this.xAxisTextBox = new System.Windows.Forms.TextBox();
+      this.defineSampleSizeButton = new System.Windows.Forms.Button();
+      this.showStatisticsCheckBox = new System.Windows.Forms.CheckBox();
+      this.statisticsGroupBox = new System.Windows.Forms.GroupBox();
+      this.statisticsMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.tooltip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.statisticsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // xAxisLabel
+      // 
+      this.xAxisLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.xAxisLabel.AutoSize = true;
+      this.xAxisLabel.Location = new System.Drawing.Point(438, 277);
+      this.xAxisLabel.Name = "xAxisLabel";
+      this.xAxisLabel.Size = new System.Drawing.Size(62, 13);
+      this.xAxisLabel.TabIndex = 12;
+      this.xAxisLabel.Text = "Group Size:";
+      // 
+      // yAxisLabel
+      // 
+      this.yAxisLabel.AutoSize = true;
+      this.yAxisLabel.Location = new System.Drawing.Point(3, 6);
+      this.yAxisLabel.Name = "yAxisLabel";
+      this.yAxisLabel.Size = new System.Drawing.Size(15, 13);
+      this.yAxisLabel.TabIndex = 10;
+      this.yAxisLabel.Text = "y:";
+      // 
+      // yAxisComboBox
+      // 
+      this.yAxisComboBox.BackColor = System.Drawing.SystemColors.ControlLightLight;
+      this.yAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.yAxisComboBox.FormattingEnabled = true;
+      this.yAxisComboBox.Location = new System.Drawing.Point(24, 3);
+      this.yAxisComboBox.Name = "yAxisComboBox";
+      this.yAxisComboBox.Size = new System.Drawing.Size(221, 21);
+      this.yAxisComboBox.TabIndex = 9;
+      this.yAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.AxisComboBox_SelectedIndexChanged);
+      // 
+      // chart
+      // 
+      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)));
+      chartArea2.Name = "ChartArea1";
+      this.chart.ChartAreas.Add(chartArea2);
+      this.chart.Location = new System.Drawing.Point(6, 30);
+      this.chart.Name = "chart";
+      series2.ChartArea = "ChartArea1";
+      series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.BoxPlot;
+      series2.IsVisibleInLegend = false;
+      series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
+      series2.Name = "DataSeries";
+      series2.YValuesPerPoint = 6;
+      this.chart.Series.Add(series2);
+      this.chart.Size = new System.Drawing.Size(833, 238);
+      this.chart.TabIndex = 17;
+      this.chart.Text = "chart";
+      this.chart.AxisViewChanged += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ViewEventArgs>(this.chart_AxisViewChanged);
+      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
+      // 
+      // noRunsLabel
+      // 
+      this.noRunsLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.noRunsLabel.AutoSize = true;
+      this.noRunsLabel.Location = new System.Drawing.Point(361, 133);
+      this.noRunsLabel.Name = "noRunsLabel";
+      this.noRunsLabel.Size = new System.Drawing.Size(138, 13);
+      this.noRunsLabel.TabIndex = 22;
+      this.noRunsLabel.Text = "No runs could be displayed.";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.hypergeometricCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.label1);
+      this.splitContainer.Panel1.Controls.Add(this.RecalculateButton);
+      this.splitContainer.Panel1.Controls.Add(this.sampleSizeTextBox);
+      this.splitContainer.Panel1.Controls.Add(this.xAxisTextBox);
+      this.splitContainer.Panel1.Controls.Add(this.defineSampleSizeButton);
+      this.splitContainer.Panel1.Controls.Add(this.showStatisticsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.xAxisLabel);
+      this.splitContainer.Panel1.Controls.Add(this.noRunsLabel);
+      this.splitContainer.Panel1.Controls.Add(this.yAxisLabel);
+      this.splitContainer.Panel1.Controls.Add(this.yAxisComboBox);
+      this.splitContainer.Panel1.Controls.Add(this.chart);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.statisticsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(851, 447);
+      this.splitContainer.SplitterDistance = 297;
+      this.splitContainer.TabIndex = 23;
+      // 
+      // hypergeometricCheckBox
+      // 
+      this.hypergeometricCheckBox.AutoSize = true;
+      this.hypergeometricCheckBox.Location = new System.Drawing.Point(332, 7);
+      this.hypergeometricCheckBox.Name = "hypergeometricCheckBox";
+      this.hypergeometricCheckBox.Size = new System.Drawing.Size(100, 17);
+      this.hypergeometricCheckBox.TabIndex = 28;
+      this.hypergeometricCheckBox.Text = "Hypergeometric";
+      this.hypergeometricCheckBox.UseVisualStyleBackColor = true;
+      this.hypergeometricCheckBox.CheckedChanged += new System.EventHandler(this.hypergeometricCheckBox_CheckedChanged);
+      // 
+      // label1
+      // 
+      this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(566, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(143, 13);
+      this.label1.TabIndex = 26;
+      this.label1.Text = "Recommended Sample Size:";
+      // 
+      // RecalculateButton
+      // 
+      this.RecalculateButton.Location = new System.Drawing.Point(251, 3);
+      this.RecalculateButton.Name = "RecalculateButton";
+      this.RecalculateButton.Size = new System.Drawing.Size(75, 23);
+      this.RecalculateButton.TabIndex = 27;
+      this.RecalculateButton.Text = "Recalculate";
+      this.RecalculateButton.UseVisualStyleBackColor = true;
+      this.RecalculateButton.Click += new System.EventHandler(this.RecalculateButton_Click);
+      // 
+      // sampleSizeTextBox
+      // 
+      this.sampleSizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.sampleSizeTextBox.Location = new System.Drawing.Point(724, 3);
+      this.sampleSizeTextBox.Name = "sampleSizeTextBox";
+      this.sampleSizeTextBox.ReadOnly = true;
+      this.sampleSizeTextBox.Size = new System.Drawing.Size(124, 20);
+      this.sampleSizeTextBox.TabIndex = 26;
+      // 
+      // xAxisTextBox
+      // 
+      this.xAxisTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.xAxisTextBox.Location = new System.Drawing.Point(506, 274);
+      this.xAxisTextBox.Name = "xAxisTextBox";
+      this.xAxisTextBox.Size = new System.Drawing.Size(238, 20);
+      this.xAxisTextBox.TabIndex = 25;
+      this.xAxisTextBox.TextChanged += new System.EventHandler(this.xAxisTextBox_TextChanged);
+      // 
+      // defineSampleSizeButton
+      // 
+      this.defineSampleSizeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.defineSampleSizeButton.Location = new System.Drawing.Point(750, 273);
+      this.defineSampleSizeButton.Name = "defineSampleSizeButton";
+      this.defineSampleSizeButton.Size = new System.Drawing.Size(89, 21);
+      this.defineSampleSizeButton.TabIndex = 24;
+      this.defineSampleSizeButton.Text = "Set Group Size";
+      this.defineSampleSizeButton.UseVisualStyleBackColor = true;
+      this.defineSampleSizeButton.Click += new System.EventHandler(this.defineSampleSizeButton_Click);
+      // 
+      // showStatisticsCheckBox
+      // 
+      this.showStatisticsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.showStatisticsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showStatisticsCheckBox.Checked = true;
+      this.showStatisticsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showStatisticsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showStatisticsCheckBox.Location = new System.Drawing.Point(6, 267);
+      this.showStatisticsCheckBox.Name = "showStatisticsCheckBox";
+      this.showStatisticsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showStatisticsCheckBox.TabIndex = 23;
+      this.tooltip.SetToolTip(this.showStatisticsCheckBox, "Show/Hide Statistics");
+      this.showStatisticsCheckBox.UseVisualStyleBackColor = true;
+      this.showStatisticsCheckBox.CheckedChanged += new System.EventHandler(this.showStatisticsCheckBox_CheckedChanged);
+      // 
+      // statisticsGroupBox
+      // 
+      this.statisticsGroupBox.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)));
+      this.statisticsGroupBox.Controls.Add(this.statisticsMatrixView);
+      this.statisticsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.statisticsGroupBox.Name = "statisticsGroupBox";
+      this.statisticsGroupBox.Size = new System.Drawing.Size(833, 141);
+      this.statisticsGroupBox.TabIndex = 1;
+      this.statisticsGroupBox.TabStop = false;
+      this.statisticsGroupBox.Text = "Statistics";
+      // 
+      // statisticsMatrixView
+      // 
+      this.statisticsMatrixView.Caption = "StringConvertibleMatrix View";
+      this.statisticsMatrixView.Content = null;
+      this.statisticsMatrixView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.statisticsMatrixView.Location = new System.Drawing.Point(3, 16);
+      this.statisticsMatrixView.Name = "statisticsMatrixView";
+      this.statisticsMatrixView.ReadOnly = true;
+      this.statisticsMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.statisticsMatrixView.ShowStatisticalInformation = false;
+      this.statisticsMatrixView.Size = new System.Drawing.Size(827, 122);
+      this.statisticsMatrixView.TabIndex = 0;
+      // 
+      // SampleSizeInfluenceView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.BackColor = System.Drawing.SystemColors.Window;
+      this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "SampleSizeInfluenceView";
+      this.Size = new System.Drawing.Size(851, 447);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel1.PerformLayout();
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.statisticsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label xAxisLabel;
+    private System.Windows.Forms.Label yAxisLabel;
+    internal System.Windows.Forms.ComboBox yAxisComboBox;
+    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
+    private System.Windows.Forms.Label noRunsLabel;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private Data.Views.StringConvertibleMatrixView statisticsMatrixView;
+    private System.Windows.Forms.GroupBox statisticsGroupBox;
+    private System.Windows.Forms.ToolTip tooltip;
+    protected System.Windows.Forms.CheckBox showStatisticsCheckBox;
+    private System.Windows.Forms.Button defineSampleSizeButton;
+    private System.Windows.Forms.TextBox xAxisTextBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox sampleSizeTextBox;
+    private System.Windows.Forms.Button RecalculateButton;
+    private System.Windows.Forms.CheckBox hypergeometricCheckBox;
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/SampleSizeInfluenceView.cs	(revision 11919)
@@ -0,0 +1,654 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  [View("Sample Size Influence", "HeuristicLab.Analysis.Statistics.Views.InfoResources.SampleSizeInfluenceInfo.rtf")]
+  [Content(typeof(RunCollection), false)]
+  public partial class SampleSizeInfluenceView : AsynchronousContentView {
+    private enum AxisDimension { Color = 0 }
+    private const string BoxPlotSeriesName = "BoxPlotSeries";
+    private const string BoxPlotChartAreaName = "BoxPlotChartArea";
+    private const string delimitor = ";";
+
+    private bool suppressUpdates = false;
+    private string yAxisValue;
+    private Dictionary<int, Dictionary<object, double>> categoricalMapping;
+    private SortedDictionary<double, Series> seriesCache;
+
+    public SampleSizeInfluenceView() {
+      InitializeComponent();
+      categoricalMapping = new Dictionary<int, Dictionary<object, double>>();
+      seriesCache = new SortedDictionary<double, Series>();
+      chart.ChartAreas[0].Visible = false;
+      chart.Series.Clear();
+      chart.ChartAreas.Add(BoxPlotChartAreaName);
+      chart.CustomizeAllChartAreas();
+      chart.ChartAreas[BoxPlotChartAreaName].Axes.ToList().ForEach(x => { x.ScaleView.Zoomable = true; x.ScaleView.MinSize = 0; });
+      chart.ChartAreas[BoxPlotChartAreaName].CursorX.Interval = 0.5;
+      chart.ChartAreas[BoxPlotChartAreaName].CursorY.Interval = 1e-5;
+    }
+
+    public new RunCollection Content {
+      get { return (RunCollection)base.Content; }
+      set { base.Content = value; }
+    }
+    public IStringConvertibleMatrix Matrix {
+      get { return this.Content; }
+    }
+
+    #region RunCollection and Run events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Reset += new EventHandler(Content_Reset);
+      Content.ColumnNamesChanged += new EventHandler(Content_ColumnNamesChanged);
+      Content.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
+      RegisterRunEvents(Content);
+    }
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.Reset -= new EventHandler(Content_Reset);
+      Content.ColumnNamesChanged -= new EventHandler(Content_ColumnNamesChanged);
+      Content.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
+      DeregisterRunEvents(Content);
+    }
+
+    protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
+      foreach (IRun run in runs) {
+        RegisterRunParametersEvents(run);
+        RegisterRunResultsEvents(run);
+      }
+    }
+
+    protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
+      foreach (IRun run in runs) {
+        DeregisterRunParametersEvents(run);
+        DeregisterRunResultsEvents(run);
+      }
+    }
+
+    private void RegisterRunParametersEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Parameters;
+      dict.ItemsAdded += run_Changed;
+      dict.ItemsRemoved += run_Changed;
+      dict.ItemsReplaced += run_Changed;
+      dict.CollectionReset += run_Changed;
+    }
+
+    private void RegisterRunResultsEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Results;
+      dict.ItemsAdded += run_Changed;
+      dict.ItemsRemoved += run_Changed;
+      dict.ItemsReplaced += run_Changed;
+      dict.CollectionReset += run_Changed;
+    }
+
+    private void DeregisterRunParametersEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Parameters;
+      dict.ItemsAdded -= run_Changed;
+      dict.ItemsRemoved -= run_Changed;
+      dict.ItemsReplaced -= run_Changed;
+      dict.CollectionReset -= run_Changed;
+    }
+
+    private void DeregisterRunResultsEvents(IRun run) {
+      IObservableDictionary<string, IItem> dict = run.Results;
+      dict.ItemsAdded -= run_Changed;
+      dict.ItemsRemoved -= run_Changed;
+      dict.ItemsReplaced -= run_Changed;
+      dict.CollectionReset -= run_Changed;
+    }
+
+    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      DeregisterRunEvents(e.OldItems);
+      RegisterRunEvents(e.Items);
+      UpdateAll();
+    }
+    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      DeregisterRunEvents(e.Items);
+      UpdateComboBoxes();
+    }
+    private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      RegisterRunEvents(e.Items);
+      UpdateComboBoxes();
+    }
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
+      else {
+        suppressUpdates = Content.UpdateOfRunsInProgress;
+        if (!suppressUpdates) UpdateDataPoints();
+      }
+    }
+
+    private void Content_Reset(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Reset), sender, e);
+      else {
+        this.categoricalMapping.Clear();
+        UpdateDataPoints();
+        UpdateAxisLabels();
+      }
+    }
+    private void Content_ColumnNamesChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ColumnNamesChanged), sender, e);
+      else {
+        UpdateComboBoxes();
+      }
+    }
+    private void run_Changed(object sender, EventArgs e) {
+      if (InvokeRequired)
+        this.Invoke(new EventHandler(run_Changed), sender, e);
+      else if (!suppressUpdates) {
+        UpdateDataPoints();
+      }
+    }
+
+    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
+      else UpdateCaption();
+    }
+    #endregion
+
+    #region update comboboxes, datapoints, runs
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateAll();
+    }
+
+    private void UpdateAll() {
+      this.categoricalMapping.Clear();
+      UpdateComboBoxes();
+      UpdateDataPoints();
+      UpdateCaption();
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Sample Size Influence" : ViewAttribute.GetViewName(GetType());
+    }
+
+    private void UpdateSampleSizes(bool forceUpdate = false) {
+      string selectedYAxis = (string)this.yAxisComboBox.SelectedItem;
+
+      if (selectedYAxis != null && (xAxisTextBox.Text.Trim() == string.Empty || forceUpdate)) {
+        xAxisTextBox.Clear();
+        List<double> values = new List<double>();
+        foreach (IRun run in Content.Where(x => x.Visible)) {
+          double? cv = GetValue(run, selectedYAxis);
+          if (cv.HasValue) {
+            values.Add(cv.Value);
+          }
+        }
+
+        if (values.Any()) {
+          if (hypergeometricCheckBox.Checked) {
+            xAxisTextBox.Text += ((int)(values.Count() / 16)) + delimitor + " ";
+            xAxisTextBox.Text += ((int)(values.Count() / 8)) + delimitor + " ";
+            xAxisTextBox.Text += (int)(values.Count() / 4);
+          } else {
+            xAxisTextBox.Text += ((int)(values.Count() / 4)) + delimitor + " ";
+            xAxisTextBox.Text += ((int)(values.Count() / 2)) + delimitor + " ";
+            xAxisTextBox.Text += ((int)(values.Count() / 4 * 3)) + delimitor + " ";
+            xAxisTextBox.Text += (int)(values.Count());
+          }
+        }
+      }
+    }
+
+    private void UpdateComboBoxes() {
+      string selectedYAxis = (string)this.yAxisComboBox.SelectedItem;
+      this.xAxisTextBox.Text = string.Empty;
+      this.yAxisComboBox.Items.Clear();
+      if (Content != null) {
+        string[] additionalAxisDimension = Enum.GetNames(typeof(AxisDimension));
+        UpdateSampleSizes();
+        this.yAxisComboBox.Items.AddRange(additionalAxisDimension);
+        this.yAxisComboBox.Items.AddRange(Matrix.ColumnNames.ToArray());
+
+        if (selectedYAxis != null && yAxisComboBox.Items.Contains(selectedYAxis)) {
+          yAxisComboBox.SelectedItem = selectedYAxis;
+          UpdateDataPoints();
+        }
+      }
+    }
+
+    private void UpdateDataPoints() {
+      this.chart.Series.Clear();
+      this.seriesCache.Clear();
+      if (Content != null) {
+        var usableRuns = Content.Where(r => r.Visible).ToList();
+        List<int> groupSizes = ParseGroupSizesFromText(xAxisTextBox.Text);
+
+        if (hypergeometricCheckBox.Checked) {
+          CalculateGroupsHypergeometric(usableRuns, groupSizes);
+        } else {
+          CalculateGroups(usableRuns, groupSizes);
+        }
+
+        foreach (Series s in this.seriesCache.Values)
+          this.chart.Series.Add(s);
+
+        UpdateStatistics();
+        if (seriesCache.Count > 0) {
+          Series boxPlotSeries = CreateBoxPlotSeries();
+          this.chart.Series.Add(boxPlotSeries);
+        }
+
+        UpdateAxisLabels();
+        if (groupSizes.Any())
+          AddSampleSizeText();
+      } else {
+        sampleSizeTextBox.Text = string.Empty;
+      }
+      UpdateNoRunsVisibleLabel();
+    }
+
+    private void CalculateGroups(List<IRun> usableRuns, List<int> groupSizes) {
+      Random rand = new Random();
+
+      foreach (int gs in groupSizes) {
+        int idx = gs;
+        List<IRun> runGroup = new List<IRun>();
+        if (idx > usableRuns.Count()) {
+          idx = usableRuns.Count();
+        }
+
+        for (int i = 0; i < idx; i++) {
+          int r = rand.Next(usableRuns.Count());
+          runGroup.Add(usableRuns[r]);
+        }
+        runGroup.ForEach(x => AddDataPoint(x, idx));
+      }
+    }
+
+    private void CalculateGroupsHypergeometric(List<IRun> usableRuns, List<int> groupSizes) {
+      Random rand = new Random();
+      var runs = new List<IRun>(usableRuns);
+
+      foreach (int gs in groupSizes) {
+        int idx = gs;
+        List<IRun> runGroup = new List<IRun>();
+        if (idx > runs.Count()) {
+          idx = runs.Count();
+        }
+
+        for (int i = 0; i < idx; i++) {
+          int r = rand.Next(runs.Count());
+          runGroup.Add(runs[r]);
+          runs.Remove(runs[r]);
+        }
+        runGroup.ForEach(x => AddDataPoint(x, idx));
+      }
+    }
+
+    private void AddSampleSizeText() {
+      sampleSizeTextBox.Text = string.Empty;
+      var usableRuns = Content.Where(r => r.Visible).ToList();
+
+      if (!yAxisComboBox.DroppedDown)
+        this.yAxisValue = (string)yAxisComboBox.SelectedItem;
+
+      List<double?> yValue = usableRuns.Select(x => GetValue(x, this.yAxisValue)).ToList();
+      if (yValue.Any(x => !x.HasValue)) return;
+
+      double estimatedSampleSize = SampleSizeDetermination.DetermineSampleSizeByEstimatingMean(yValue.Select(x => x.Value).ToArray());
+      sampleSizeTextBox.Text = estimatedSampleSize.ToString();
+    }
+
+    private List<int> ParseGroupSizesFromText(string groupsText, bool verbose = true) {
+      string[] gs = groupsText.Split(delimitor.ToCharArray());
+      List<int> vals = new List<int>();
+
+      foreach (string s in gs) {
+        string ns = s.Trim();
+
+        if (ns != string.Empty) {
+          int v = 0;
+          try {
+            v = int.Parse(ns);
+            vals.Add(v);
+          }
+          catch (Exception ex) {
+            if (verbose) {
+              ErrorHandling.ShowErrorDialog("Can't parse group sizes. Please only use numbers seperated by a " + delimitor + ". ", ex);
+            }
+          }
+        }
+      }
+      return vals;
+    }
+
+    private void UpdateStatistics() {
+      DoubleMatrix matrix = new DoubleMatrix(11, seriesCache.Count);
+      matrix.SortableView = false;
+      List<string> columnNames = new List<string>();
+      foreach (Series series in seriesCache.Values) {
+        DataPoint datapoint = series.Points.FirstOrDefault();
+        if (datapoint != null) {
+          IRun run = (IRun)datapoint.Tag;
+          string selectedAxis = xAxisTextBox.Text;
+          IItem value = null;
+
+          if (Enum.IsDefined(typeof(AxisDimension), selectedAxis)) {
+            AxisDimension axisDimension = (AxisDimension)Enum.Parse(typeof(AxisDimension), selectedAxis);
+            switch (axisDimension) {
+              case AxisDimension.Color: value = new StringValue(run.Color.ToString());
+                break;
+            }
+          }
+
+          string columnName = series.Name;
+          columnNames.Add(columnName);
+        }
+      }
+      matrix.ColumnNames = columnNames;
+      matrix.RowNames = new string[] { "Count", "Minimum", "Maximum", "Average", "Median", "Standard Deviation", "Variance", "25th Percentile", "75th Percentile", "Lower Confidence Int.", "Upper Confidence Int." };
+
+      for (int i = 0; i < seriesCache.Count; i++) {
+        Series series = seriesCache.ElementAt(i).Value;
+        double[] seriesValues = series.Points.Select(p => p.YValues[0]).OrderBy(d => d).ToArray();
+        Tuple<double, double> confIntervals = seriesValues.ConfidenceIntervals(0.95);
+        matrix[0, i] = seriesValues.Length;
+        matrix[1, i] = seriesValues.Min();
+        matrix[2, i] = seriesValues.Max();
+        matrix[3, i] = seriesValues.Average();
+        matrix[4, i] = seriesValues.Median();
+        matrix[5, i] = seriesValues.StandardDeviation();
+        matrix[6, i] = seriesValues.Variance();
+        matrix[7, i] = seriesValues.Percentile(0.25);
+        matrix[8, i] = seriesValues.Percentile(0.75);
+        matrix[9, i] = confIntervals.Item1;
+        matrix[10, i] = confIntervals.Item2;
+      }
+      statisticsMatrixView.Content = matrix;
+    }
+
+    private Series CreateBoxPlotSeries() {
+      Series boxPlotSeries = new Series(BoxPlotSeriesName);
+      string seriesNames = string.Concat(seriesCache.Keys.Select(x => x.ToString() + ";").ToArray());
+      seriesNames = seriesNames.Remove(seriesNames.Length - 1); //delete last ; from string
+
+      boxPlotSeries.ChartArea = BoxPlotChartAreaName;
+      boxPlotSeries.ChartType = SeriesChartType.BoxPlot;
+      boxPlotSeries["BoxPlotSeries"] = seriesNames;
+      boxPlotSeries["BoxPlotShowUnusualValues"] = "true";
+      boxPlotSeries["PointWidth"] = "0.4";
+      boxPlotSeries.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.VerticalCenter;
+      boxPlotSeries.BackSecondaryColor = System.Drawing.Color.FromArgb(130, 224, 64, 10);
+      boxPlotSeries.BorderColor = System.Drawing.Color.FromArgb(64, 64, 64);
+      boxPlotSeries.Color = System.Drawing.Color.FromArgb(224, 64, 10);
+
+      return boxPlotSeries;
+    }
+
+    private void AddDataPoint(IRun run, int idx) {
+      double xValue;
+      double? yValue;
+
+
+      if (!yAxisComboBox.DroppedDown)
+        this.yAxisValue = (string)yAxisComboBox.SelectedItem;
+
+      xValue = idx;
+      yValue = GetValue(run, this.yAxisValue);
+
+      if (yValue.HasValue) {
+        if (!this.seriesCache.ContainsKey(xValue))
+          seriesCache[xValue] = new Series(xValue.ToString());
+
+        Series series = seriesCache[xValue];
+        DataPoint point = new DataPoint(xValue, yValue.Value);
+        point.Tag = run;
+        series.Points.Add(point);
+      }
+    }
+    #endregion
+
+    #region get values from run
+    private double? GetValue(IRun run, string columnName) {
+      if (run == null || string.IsNullOrEmpty(columnName))
+        return null;
+
+      if (Enum.IsDefined(typeof(AxisDimension), columnName)) {
+        AxisDimension axisDimension = (AxisDimension)Enum.Parse(typeof(AxisDimension), columnName);
+        return GetValue(run, axisDimension);
+      } else {
+        int columnIndex = Matrix.ColumnNames.ToList().IndexOf(columnName);
+        IItem value = Content.GetValue(run, columnIndex);
+        if (value == null)
+          return null;
+
+        DoubleValue doubleValue = value as DoubleValue;
+        IntValue intValue = value as IntValue;
+        TimeSpanValue timeSpanValue = value as TimeSpanValue;
+        double? ret = null;
+        if (doubleValue != null) {
+          if (!double.IsNaN(doubleValue.Value) && !double.IsInfinity(doubleValue.Value))
+            ret = doubleValue.Value;
+        } else if (intValue != null)
+          ret = intValue.Value;
+        else if (timeSpanValue != null) {
+          ret = timeSpanValue.Value.TotalSeconds;
+        } else
+          ret = GetCategoricalValue(columnIndex, value.ToString());
+
+        return ret;
+      }
+    }
+    private double GetCategoricalValue(int dimension, string value) {
+      if (!this.categoricalMapping.ContainsKey(dimension)) {
+        this.categoricalMapping[dimension] = new Dictionary<object, double>();
+        var orderedCategories = Content.Where(r => r.Visible && Content.GetValue(r, dimension) != null).Select(r => Content.GetValue(r, dimension).ToString())
+                                          .Distinct().OrderBy(x => x, new NaturalStringComparer());
+        int count = 1;
+        foreach (var category in orderedCategories) {
+          this.categoricalMapping[dimension].Add(category, count);
+          count++;
+        }
+      }
+      return this.categoricalMapping[dimension][value];
+    }
+    private double GetValue(IRun run, AxisDimension axisDimension) {
+      double value = double.NaN;
+      switch (axisDimension) {
+        case AxisDimension.Color: {
+            value = GetCategoricalValue(-1, run.Color.ToString());
+            break;
+          }
+        default: {
+            throw new ArgumentException("No handling strategy for " + axisDimension.ToString() + " is defined.");
+          }
+      }
+      return value;
+    }
+    #endregion
+
+    #region GUI events
+    private void UpdateNoRunsVisibleLabel() {
+      if (this.chart.Series.Count > 0) {
+        noRunsLabel.Visible = false;
+        showStatisticsCheckBox.Enabled = true;
+        splitContainer.Panel2Collapsed = !showStatisticsCheckBox.Checked;
+      } else {
+        noRunsLabel.Visible = true;
+        showStatisticsCheckBox.Enabled = false;
+        splitContainer.Panel2Collapsed = true;
+      }
+    }
+
+    private void RecalculateButton_Click(object sender, EventArgs e) {
+      UpdateDataPoints();
+    }
+
+    private void hypergeometricCheckBox_CheckedChanged(object sender, EventArgs e) {
+      UpdateSampleSizes(true);
+      UpdateDataPoints();
+    }
+
+    private void AxisComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateSampleSizes();
+      UpdateDataPoints();
+    }
+    private void UpdateAxisLabels() {
+      Axis xAxis = this.chart.ChartAreas[BoxPlotChartAreaName].AxisX;
+      Axis yAxis = this.chart.ChartAreas[BoxPlotChartAreaName].AxisY;
+      int axisDimensionCount = Enum.GetNames(typeof(AxisDimension)).Count();
+
+      SetCustomAxisLabels(xAxis, -1);
+      SetCustomAxisLabels(yAxis, yAxisComboBox.SelectedIndex - axisDimensionCount);
+
+      xAxis.Title = "Group Size";
+      if (yAxisComboBox.SelectedItem != null)
+        yAxis.Title = yAxisComboBox.SelectedItem.ToString();
+    }
+
+    private void chart_AxisViewChanged(object sender, System.Windows.Forms.DataVisualization.Charting.ViewEventArgs e) {
+      this.UpdateAxisLabels();
+    }
+
+    private void SetCustomAxisLabels(Axis axis, int dimension) {
+      axis.CustomLabels.Clear();
+      if (categoricalMapping.ContainsKey(dimension)) {
+        int position = 1;
+        foreach (var pair in categoricalMapping[dimension].Where(x => seriesCache.ContainsKey(x.Value))) {
+          string labelText = pair.Key.ToString();
+          CustomLabel label = new CustomLabel();
+          label.ToolTip = labelText;
+          if (labelText.Length > 25)
+            labelText = labelText.Substring(0, 25) + " ... ";
+          label.Text = labelText;
+          label.GridTicks = GridTickTypes.TickMark;
+          label.FromPosition = position - 0.5;
+          label.ToPosition = position + 0.5;
+          axis.CustomLabels.Add(label);
+          position++;
+        }
+      } else if (dimension > 0 && Content.GetValue(0, dimension) is TimeSpanValue) {
+        this.chart.ChartAreas[0].RecalculateAxesScale();
+        Axis correspondingAxis = this.chart.ChartAreas[0].Axes.Where(x => x.Name == axis.Name).SingleOrDefault();
+        if (correspondingAxis == null)
+          correspondingAxis = axis;
+        for (double i = correspondingAxis.Minimum; i <= correspondingAxis.Maximum; i += correspondingAxis.LabelStyle.Interval) {
+          TimeSpan time = TimeSpan.FromSeconds(i);
+          string x = string.Format("{0:00}:{1:00}:{2:00}", (int)time.Hours, time.Minutes, time.Seconds);
+          axis.CustomLabels.Add(i - correspondingAxis.LabelStyle.Interval / 2, i + correspondingAxis.LabelStyle.Interval / 2, x);
+        }
+      } else if (chart.ChartAreas[BoxPlotChartAreaName].AxisX == axis) {
+        double position = 1.0;
+        foreach (Series series in chart.Series) {
+          if (series.Name != BoxPlotSeriesName) {
+            string labelText = series.Points[0].XValue.ToString();
+            CustomLabel label = new CustomLabel();
+            label.FromPosition = position - 0.5;
+            label.ToPosition = position + 0.5;
+            label.GridTicks = GridTickTypes.TickMark;
+            label.Text = labelText;
+            axis.CustomLabels.Add(label);
+            position++;
+          }
+        }
+      }
+    }
+
+    private void chart_MouseMove(object sender, MouseEventArgs e) {
+      string newTooltipText = string.Empty;
+      string oldTooltipText;
+      HitTestResult h = this.chart.HitTest(e.X, e.Y);
+      if (h.ChartElementType == ChartElementType.AxisLabels) {
+        newTooltipText = ((CustomLabel)h.Object).ToolTip;
+      }
+
+      oldTooltipText = this.tooltip.GetToolTip(chart);
+      if (newTooltipText != oldTooltipText)
+        this.tooltip.SetToolTip(chart, newTooltipText);
+    }
+    #endregion
+
+    private void showStatisticsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      splitContainer.Panel2Collapsed = !showStatisticsCheckBox.Checked;
+    }
+
+    private void defineSampleSizeButton_Click(object sender, EventArgs e) {
+      int min = 0, max = 0, step = 1;
+      var groupSizes = ParseGroupSizesFromText(xAxisTextBox.Text);
+      if (groupSizes.Count() > 0) {
+        min = groupSizes.Min();
+        max = groupSizes.Max();
+      }
+
+      using (var dialog = new DefineArithmeticProgressionDialog(true, min, max, step)) {
+        if (dialog.ShowDialog(this) == DialogResult.OK) {
+          var values = dialog.Values;
+          string newVals = "";
+          foreach (int v in values) {
+            newVals += v + delimitor + " ";
+          }
+          xAxisTextBox.Text = newVals;
+        }
+      }
+    }
+
+    private void xAxisTextBox_TextChanged(object sender, EventArgs e) {
+      var result = ParseGroupSizesFromText(xAxisTextBox.Text, false);
+
+      if (seriesCache.Count() == result.Count()) {
+        bool changed = false;
+        int i = 0;
+        foreach (var gs in seriesCache.Keys) {
+          if (((int)gs) != result[i]) {
+            changed = true;
+            break;
+          }
+          i++;
+        }
+
+        if (changed) {
+          UpdateDataPoints();
+        }
+      } else {
+        UpdateDataPoints();
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsConfigurationDialog.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsConfigurationDialog.Designer.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsConfigurationDialog.Designer.cs	(revision 11919)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Data.Views;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  partial class StatisticalTestsConfigurationDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.label1 = new System.Windows.Forms.Label();
+      this.significanceLevelTextBox = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.okButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 14);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(97, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Significance Level:";
+      // 
+      // significanceLevelTextBox
+      // 
+      this.significanceLevelTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.significanceLevelTextBox.Caption = "StringConvertibleValue View";
+      this.significanceLevelTextBox.Content = null;
+      this.significanceLevelTextBox.LabelVisible = false;
+      this.significanceLevelTextBox.Location = new System.Drawing.Point(115, 12);
+      this.significanceLevelTextBox.Name = "significanceLevelTextBox";
+      this.significanceLevelTextBox.ReadOnly = false;
+      this.significanceLevelTextBox.Size = new System.Drawing.Size(121, 20);
+      this.significanceLevelTextBox.TabIndex = 1;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(242, 10);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(51, 23);
+      this.okButton.TabIndex = 2;
+      this.okButton.Text = "Ok";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // StatisticalTestsConfigurationDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(305, 42);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.significanceLevelTextBox);
+      this.Controls.Add(this.label1);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "StatisticalTestsConfigurationDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Statistical Tests Configuration";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private StringConvertibleValueView significanceLevelTextBox;
+    private System.Windows.Forms.Button okButton;
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsConfigurationDialog.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsConfigurationDialog.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsConfigurationDialog.cs	(revision 11919)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Windows.Forms;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  public partial class StatisticalTestsConfigurationDialog : Form {
+
+    private StatisticalTestsView view;
+
+    public StatisticalTestsConfigurationDialog(StatisticalTestsView view) {
+      InitializeComponent();
+      this.view = view;
+      significanceLevelTextBox.Content = new DoubleValue(view.SignificanceLevel);
+    }
+
+    private void okButton_Click(object sender, System.EventArgs e) {
+      double newVal;
+
+      newVal = ((DoubleValue)significanceLevelTextBox.Content).Value;
+      if (newVal > 0 && newVal < 1) {
+        view.SignificanceLevel = newVal;
+        Close();
+      } else {
+        MessageBox.Show("Please enter a correct value between 0 and 1 for the significance level.", "HeuristicLab",
+          MessageBoxButtons.OK);
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs	(revision 11919)
@@ -0,0 +1,486 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Views;
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  [View("Statistical Tests", "HeuristicLab.Analysis.Statistics.Views.InfoResources.StatisticalTestsInfo.rtf")]
+  [Content(typeof(RunCollection), false)]
+  public sealed partial class StatisticalTestsView : ItemView, IConfigureableView {
+    private double significanceLevel = 0.05;
+    private const int requiredSampleSize = 5;
+    private double[][] data;
+
+    public double SignificanceLevel {
+      get { return significanceLevel; }
+      set {
+        if (!significanceLevel.IsAlmost(value)) {
+          significanceLevel = value;
+          ResetUI();
+          CalculateValues();
+        }
+      }
+    }
+
+    public new RunCollection Content {
+      get { return (RunCollection)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get { return true; }
+      set { /*not needed because results are always readonly */}
+    }
+
+    public StatisticalTestsView() {
+      InitializeComponent();
+    }
+
+    public void ShowConfiguration() {
+      using (StatisticalTestsConfigurationDialog dlg = new StatisticalTestsConfigurationDialog(this)) {
+        dlg.ShowDialog(this);
+      }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content != null) {
+        UpdateResultComboBox();
+        UpdateGroupsComboBox();
+        RebuildDataTable();
+      }
+      UpdateCaption();
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Statistical Tests" : ViewAttribute.GetViewName(GetType());
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ColumnsChanged += Content_ColumnsChanged;
+      Content.RowsChanged += Content_RowsChanged;
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged += Content_UpdateOfRunsInProgressChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ColumnsChanged -= Content_ColumnsChanged;
+      Content.RowsChanged -= Content_RowsChanged;
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged -= Content_UpdateOfRunsInProgressChanged;
+    }
+
+    void Content_RowsChanged(object sender, EventArgs e) {
+      RebuildDataTable();
+    }
+
+    void Content_ColumnsChanged(object sender, EventArgs e) {
+      RebuildDataTable();
+    }
+
+    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      RebuildDataTable();
+    }
+
+    void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      if (!Content.UpdateOfRunsInProgress) {
+        RebuildDataTable();
+      }
+    }
+    #endregion
+
+    private void UpdateGroupsComboBox() {
+      groupComboBox.Items.Clear();
+
+      var parameters = (from run in Content
+                        where run.Visible
+                        from param in run.Parameters
+                        select param.Key).Distinct().ToArray();
+
+      foreach (var p in parameters) {
+        var variations = (from run in Content
+                          where run.Visible && run.Parameters.ContainsKey(p) &&
+                          (run.Parameters[p] is IntValue || run.Parameters[p] is DoubleValue ||
+                          run.Parameters[p] is StringValue || run.Parameters[p] is BoolValue)
+                          select ((dynamic)run.Parameters[p]).Value).Distinct();
+
+        if (variations.Count() > 1) {
+          groupComboBox.Items.Add(p);
+        }
+      }
+
+      if (groupComboBox.Items.Count > 0) {
+        //try to select something different than "Seed" or "Algorithm Name" as this makes no sense
+        //and takes a long time to group
+        List<int> possibleIndizes = new List<int>();
+        for (int i = 0; i < groupComboBox.Items.Count; i++) {
+          if (groupComboBox.Items[i].ToString() != "Seed"
+            && groupComboBox.Items[i].ToString() != "Algorithm Name") {
+            possibleIndizes.Add(i);
+          }
+        }
+
+        if (possibleIndizes.Count > 0) {
+          groupComboBox.SelectedItem = groupComboBox.Items[possibleIndizes.First()];
+        } else {
+          groupComboBox.SelectedItem = groupComboBox.Items[0];
+        }
+      }
+    }
+
+    private string[] GetColumnNames(IEnumerable<IRun> runs) {
+      string parameterName = (string)groupComboBox.SelectedItem;
+      var r = runs.Where(x => x.Parameters.ContainsKey(parameterName));
+      return r.Select(x => ((dynamic)x.Parameters[parameterName]).Value).Distinct().Select(x => (string)x.ToString()).ToArray();
+    }
+
+    private void UpdateResultComboBox() {
+      resultComboBox.Items.Clear();
+      var results = (from run in Content
+                     where run.Visible
+                     from result in run.Results
+                     where result.Value is IntValue || result.Value is DoubleValue
+                     select result.Key).Distinct().ToArray();
+
+      resultComboBox.Items.AddRange(results);
+      if (resultComboBox.Items.Count > 0) resultComboBox.SelectedItem = resultComboBox.Items[0];
+    }
+
+    private void FillCompComboBox() {
+      string parameterName = (string)groupComboBox.SelectedItem;
+      if (parameterName != null) {
+        string resultName = (string)resultComboBox.SelectedItem;
+        if (resultName != null) {
+          var runs = Content.Where(x => x.Results.ContainsKey(resultName) && x.Visible);
+          var columnNames = GetColumnNames(runs).ToList();
+          groupCompComboBox.Items.Clear();
+          columnNames.ForEach(x => groupCompComboBox.Items.Add(x));
+          if (groupCompComboBox.Items.Count > 0) groupCompComboBox.SelectedItem = groupCompComboBox.Items[0];
+        }
+      }
+    }
+
+    private void RebuildDataTable() {
+      string parameterName = (string)groupComboBox.SelectedItem;
+      if (parameterName != null) {
+        string resultName = (string)resultComboBox.SelectedItem;
+
+        var runs = Content.Where(x => x.Results.ContainsKey(resultName) && x.Visible);
+        var columnNames = GetColumnNames(runs);
+        var groups = GetGroups(columnNames, runs);
+        data = new double[columnNames.Count()][];
+
+        DoubleMatrix dt = new DoubleMatrix(groups.Select(x => x.Count()).Max(), columnNames.Count());
+        dt.ColumnNames = columnNames;
+        DataTable histogramDataTable = new DataTable(resultName);
+
+        for (int i = 0; i < columnNames.Count(); i++) {
+          int j = 0;
+          data[i] = new double[groups[i].Count()];
+          DataRow row = new DataRow(columnNames[i]);
+          row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Histogram;
+          histogramDataTable.Rows.Add(row);
+
+          foreach (IRun run in groups[i]) {
+            dt[j, i] = (double)((dynamic)run.Results[resultName]).Value;
+            data[i][j] = dt[j, i];
+            row.Values.Add(dt[j, i]);
+            j++;
+          }
+        }
+
+        GenerateChart(histogramDataTable);
+        stringConvertibleMatrixView.Content = dt;
+      }
+    }
+
+    private void GenerateChart(DataTable histogramTable) {
+      histogramControl.ClearPoints();
+      foreach (var row in histogramTable.Rows) {
+        histogramControl.AddPoints(row.Name, row.Values, true);
+      }
+    }
+
+    private List<IEnumerable<IRun>> GetGroups(string[] columnNames, IEnumerable<IRun> runs) {
+      List<IEnumerable<IRun>> runCols = new List<IEnumerable<IRun>>();
+      string parameterName = (string)groupComboBox.SelectedItem;
+
+      foreach (string cn in columnNames) {
+        var tmpRuns = runs.Where(x => ((string)((dynamic)x.Parameters[parameterName]).Value.ToString()) == cn);
+        runCols.Add(tmpRuns);
+      }
+
+      return runCols;
+    }
+
+    private void ResetUI() {
+      normalityLabel.Image = null;
+      normalityTextLabel.Text = string.Empty;
+      groupCompLabel.Image = null;
+      groupComTextLabel.Text = string.Empty;
+      pairwiseLabel.Image = null;
+      pairwiseTextLabel.Text = string.Empty;
+
+      pValTextBox.Text = string.Empty;
+      equalDistsTextBox.Text = string.Empty;
+    }
+
+    private void resultComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      RebuildDataTable();
+      ResetUI();
+      CalculateValues();
+    }
+
+    private void groupComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      RebuildDataTable();
+      FillCompComboBox();
+      ResetUI();
+      CalculateValues();
+    }
+
+    private bool VerifyDataLength(bool showMessage) {
+      if (data == null || data.Length == 0)
+        return false;
+
+      //alglib needs at least 5 samples for computation
+      if (data.Any(x => x.Length <= requiredSampleSize)) {
+        if (showMessage)
+          MessageBox.Show(this, "You need at least " + requiredSampleSize
+            + " samples per group for computing hypothesis tests.", "HeuristicLab", MessageBoxButtons.OK,
+            MessageBoxIcon.Error);
+        return false;
+      }
+      return true;
+    }
+
+    private void CalculateValues() {
+      if (!VerifyDataLength(true))
+        return;
+
+      if (data != null) {
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>()
+          .AddOperationProgressToView(this, "Calculating...");
+
+        string curItem = (string)groupCompComboBox.SelectedItem;
+        Task.Factory.StartNew(() => CalculateValuesAsync(curItem));
+      }
+    }
+
+    private void CalculateValuesAsync(string groupName) {
+      CalculateAllGroupsTest();
+      CalculateNormalityTest();
+      CalculatePairwiseTest(groupName);
+
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+    }
+
+    private void CalculatePairwise(string groupName) {
+      if (!VerifyDataLength(false))
+        return;
+
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(pairwiseTestGroupBox, "Calculating...");
+      Task.Factory.StartNew(() => CalculatePairwiseAsync(groupName));
+    }
+
+    private void CalculatePairwiseAsync(string groupName) {
+      CalculatePairwiseTest(groupName);
+
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(pairwiseTestGroupBox);
+    }
+
+    private void CalculateAllGroupsTest() {
+      double pval = KruskalWallisTest.Test(data);
+      pValTextBox.Text = pval.ToString();
+      if (pval < significanceLevel) {
+        this.Invoke(new Action(() => {
+          groupCompLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Default;
+          groupComTextLabel.Text = "There are groups with different distributions";
+        }));
+      } else {
+        this.Invoke(new Action(() => {
+          groupCompLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Warning;
+          groupComTextLabel.Text = "Groups have an equal distribution";
+        }));
+      }
+    }
+
+    private void CalculateNormalityTest() {
+      double val;
+      List<double> res = new List<double>();
+      DoubleMatrix pValsMatrix = new DoubleMatrix(1, stringConvertibleMatrixView.Content.Columns);
+      pValsMatrix.ColumnNames = stringConvertibleMatrixView.Content.ColumnNames;
+      pValsMatrix.RowNames = new string[] { "p-Value" };
+
+      for (int i = 0; i < data.Length; i++) {
+        alglib.jarqueberatest(data[i], data[i].Length, out val);
+        res.Add(val);
+        pValsMatrix[0, i] = val;
+      }
+
+      // p-value is below significance level and thus the null hypothesis (data is normally distributed) is rejected
+      if (res.Any(x => x < significanceLevel)) {
+        this.Invoke(new Action(() => {
+          normalityLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Warning;
+          normalityTextLabel.Text = "Some groups may not be normally distributed";
+        }));
+      } else {
+        this.Invoke(new Action(() => {
+          normalityLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Default;
+          normalityTextLabel.Text = "All sample data is normally distributed";
+        }));
+      }
+
+      this.Invoke(new Action(() => {
+        normalityStringConvertibleMatrixView.Content = pValsMatrix;
+        normalityStringConvertibleMatrixView.DataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
+      }));
+    }
+
+    private void ShowPairwiseResult(int nrOfEqualDistributions) {
+      double ratio = ((double)nrOfEqualDistributions) / (data.Length - 1) * 100.0;
+      equalDistsTextBox.Text = ratio.ToString() + " %";
+
+      if (nrOfEqualDistributions == 0) {
+        this.Invoke(new Action(() => {
+          pairwiseLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Default;
+          pairwiseTextLabel.Text = "All groups have different distributions";
+        }));
+      } else {
+        this.Invoke(new Action(() => {
+          pairwiseLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Warning;
+          pairwiseTextLabel.Text = "Some groups have equal distributions";
+        }));
+      }
+    }
+
+    private void CalculatePairwiseTest(string groupName) {
+      var columnNames = stringConvertibleMatrixView.Content.ColumnNames.ToList();
+      int colIndex = columnNames.IndexOf(groupName);
+      columnNames = columnNames.Where(x => x != groupName).ToList();
+
+      double[][] newData = FilterDataForPairwiseTest(colIndex);
+
+      var rowNames = new string[] { "p-Value of Mann-Whitney U", "Adjusted p-Value of Mann-Whitney U", 
+            "p-Value of T-Test", "Adjusted p-Value of T-Test", "Cohen's d", "Hedges' g" };
+
+      DoubleMatrix pValsMatrix = new DoubleMatrix(rowNames.Length, columnNames.Count());
+      pValsMatrix.ColumnNames = columnNames;
+      pValsMatrix.RowNames = rowNames;
+
+      double mwuBothTails;
+      double tTestBothTails;
+      double[] mwuPValues = new double[newData.Length];
+      double[] tTestPValues = new double[newData.Length];
+      bool[] decision = null;
+      double[] adjustedMwuPValues = null;
+      double[] adjustedTtestPValues = null;
+      int cnt = 0;
+
+      for (int i = 0; i < newData.Length; i++) {
+        mwuBothTails = PairwiseTest.MannWhitneyUTest(data[colIndex], newData[i]);
+        tTestBothTails = PairwiseTest.TTest(data[colIndex], newData[i]);
+        mwuPValues[i] = mwuBothTails;
+        tTestPValues[i] = tTestBothTails;
+
+        if (mwuBothTails > significanceLevel) {
+          cnt++;
+        }
+      }
+
+      adjustedMwuPValues = BonferroniHolm.Calculate(significanceLevel, mwuPValues, out decision);
+      adjustedTtestPValues = BonferroniHolm.Calculate(significanceLevel, tTestPValues, out decision);
+
+      for (int i = 0; i < newData.Length; i++) {
+        pValsMatrix[0, i] = mwuPValues[i];
+        pValsMatrix[1, i] = adjustedMwuPValues[i];
+        pValsMatrix[2, i] = tTestPValues[i];
+        pValsMatrix[3, i] = adjustedTtestPValues[i];
+        pValsMatrix[4, i] = SampleSizeDetermination.CalculateCohensD(data[colIndex], newData[i]);
+        pValsMatrix[5, i] = SampleSizeDetermination.CalculateHedgesG(data[colIndex], newData[i]);
+      }
+
+      this.Invoke(new Action(() => {
+        pairwiseStringConvertibleMatrixView.Content = pValsMatrix;
+        pairwiseStringConvertibleMatrixView.DataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
+      }));
+
+      ShowPairwiseResult(cnt);
+    }
+
+    private double[][] FilterDataForPairwiseTest(int columnToRemove) {
+      double[][] newData = new double[data.Length - 1][];
+
+      int i = 0;
+      int l = 0;
+      while (i < data.Length) {
+        if (i != columnToRemove) {
+          double[] row = new double[data[i].Length - 1];
+          newData[l] = row;
+
+          int j = 0, k = 0;
+          while (j < row.Length) {
+            if (i != columnToRemove) {
+              newData[l][j] = data[i][k];
+              j++;
+              k++;
+            } else {
+              k++;
+            }
+          }
+          i++;
+          l++;
+        } else {
+          i++;
+        }
+      }
+      return newData;
+    }
+
+    private void openBoxPlotToolStripMenuItem_Click(object sender, EventArgs e) {
+      RunCollectionBoxPlotView boxplotView = new RunCollectionBoxPlotView();
+      boxplotView.Content = Content;
+      boxplotView.SetXAxis(groupComboBox.SelectedItem.ToString());
+      boxplotView.SetYAxis(resultComboBox.SelectedItem.ToString());
+
+      boxplotView.Show();
+    }
+
+    private void groupCompComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      string curItem = (string)groupCompComboBox.SelectedItem;
+      CalculatePairwise(curItem);
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.designer.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.designer.cs	(revision 11919)
@@ -0,0 +1,586 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.Analysis.Statistics.Views {
+  partial class StatisticalTestsView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.stringConvertibleMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.openBoxPlotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.groupByLabel = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.resultComboBox = new System.Windows.Forms.ComboBox();
+      this.lblPVal = new System.Windows.Forms.Label();
+      this.pValTextBox = new System.Windows.Forms.TextBox();
+      this.groupComboBox = new System.Windows.Forms.ComboBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.splitContainer3 = new System.Windows.Forms.SplitContainer();
+      this.pairwiseTestGroupBox = new System.Windows.Forms.GroupBox();
+      this.pairwiseTextLabel = new System.Windows.Forms.Label();
+      this.pairwiseStringConvertibleMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.pairwiseLabel = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.equalDistsTextBox = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.groupCompComboBox = new System.Windows.Forms.ComboBox();
+      this.allGroupTestGroupBox = new System.Windows.Forms.GroupBox();
+      this.groupComTextLabel = new System.Windows.Forms.Label();
+      this.groupCompLabel = new System.Windows.Forms.Label();
+      this.normalityGroupBox = new System.Windows.Forms.GroupBox();
+      this.normalityTextLabel = new System.Windows.Forms.Label();
+      this.normalityStringConvertibleMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.normalityLabel = new System.Windows.Forms.Label();
+      this.selectDataGroupBox = new System.Windows.Forms.GroupBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.tabPage2 = new System.Windows.Forms.TabPage();
+      this.histogramControl = new HeuristicLab.Analysis.Views.HistogramControl();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.contextMenuStrip1.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();
+      this.splitContainer3.Panel1.SuspendLayout();
+      this.splitContainer3.Panel2.SuspendLayout();
+      this.splitContainer3.SuspendLayout();
+      this.pairwiseTestGroupBox.SuspendLayout();
+      this.allGroupTestGroupBox.SuspendLayout();
+      this.normalityGroupBox.SuspendLayout();
+      this.selectDataGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.tabPage1.SuspendLayout();
+      this.tabPage2.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // stringConvertibleMatrixView
+      // 
+      this.stringConvertibleMatrixView.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)));
+      this.stringConvertibleMatrixView.Caption = "StringConvertibleMatrix View";
+      this.stringConvertibleMatrixView.Content = null;
+      this.stringConvertibleMatrixView.ContextMenuStrip = this.contextMenuStrip1;
+      this.stringConvertibleMatrixView.Location = new System.Drawing.Point(3, 3);
+      this.stringConvertibleMatrixView.Name = "stringConvertibleMatrixView";
+      this.stringConvertibleMatrixView.ReadOnly = false;
+      this.stringConvertibleMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.stringConvertibleMatrixView.ShowStatisticalInformation = true;
+      this.stringConvertibleMatrixView.Size = new System.Drawing.Size(567, 597);
+      this.stringConvertibleMatrixView.TabIndex = 0;
+      // 
+      // contextMenuStrip1
+      // 
+      this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.openBoxPlotToolStripMenuItem});
+      this.contextMenuStrip1.Name = "contextMenuStrip1";
+      this.contextMenuStrip1.Size = new System.Drawing.Size(175, 26);
+      // 
+      // openBoxPlotToolStripMenuItem
+      // 
+      this.openBoxPlotToolStripMenuItem.Name = "openBoxPlotToolStripMenuItem";
+      this.openBoxPlotToolStripMenuItem.Size = new System.Drawing.Size(174, 22);
+      this.openBoxPlotToolStripMenuItem.Text = "Open BoxPlot View";
+      this.openBoxPlotToolStripMenuItem.Click += new System.EventHandler(this.openBoxPlotToolStripMenuItem_Click);
+      // 
+      // groupByLabel
+      // 
+      this.groupByLabel.AutoSize = true;
+      this.groupByLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.groupByLabel.Location = new System.Drawing.Point(3, 6);
+      this.groupByLabel.Name = "groupByLabel";
+      this.groupByLabel.Size = new System.Drawing.Size(53, 13);
+      this.groupByLabel.TabIndex = 7;
+      this.groupByLabel.Text = "Group by:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(40, 13);
+      this.label1.TabIndex = 6;
+      this.label1.Text = "Result:";
+      // 
+      // resultComboBox
+      // 
+      this.resultComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.resultComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.resultComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.resultComboBox.FormattingEnabled = true;
+      this.resultComboBox.Location = new System.Drawing.Point(62, 3);
+      this.resultComboBox.Name = "resultComboBox";
+      this.resultComboBox.Size = new System.Drawing.Size(244, 21);
+      this.resultComboBox.TabIndex = 5;
+      this.resultComboBox.SelectedValueChanged += new System.EventHandler(this.resultComboBox_SelectedValueChanged);
+      // 
+      // lblPVal
+      // 
+      this.lblPVal.AutoSize = true;
+      this.lblPVal.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.lblPVal.Location = new System.Drawing.Point(6, 39);
+      this.lblPVal.Name = "lblPVal";
+      this.lblPVal.Size = new System.Drawing.Size(46, 13);
+      this.lblPVal.TabIndex = 12;
+      this.lblPVal.Text = "p-Value:";
+      this.lblPVal.TextAlign = System.Drawing.ContentAlignment.TopRight;
+      // 
+      // pValTextBox
+      // 
+      this.pValTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pValTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.pValTextBox.Location = new System.Drawing.Point(58, 36);
+      this.pValTextBox.Name = "pValTextBox";
+      this.pValTextBox.ReadOnly = true;
+      this.pValTextBox.Size = new System.Drawing.Size(257, 20);
+      this.pValTextBox.TabIndex = 13;
+      // 
+      // groupComboBox
+      // 
+      this.groupComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.groupComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.groupComboBox.FormattingEnabled = true;
+      this.groupComboBox.Location = new System.Drawing.Point(62, 3);
+      this.groupComboBox.Name = "groupComboBox";
+      this.groupComboBox.Size = new System.Drawing.Size(244, 21);
+      this.groupComboBox.TabIndex = 14;
+      this.groupComboBox.SelectedValueChanged += new System.EventHandler(this.groupComboBox_SelectedValueChanged);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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)));
+      this.splitContainer1.Location = new System.Drawing.Point(6, 19);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.resultComboBox);
+      this.splitContainer1.Panel1.Controls.Add(this.label1);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.groupByLabel);
+      this.splitContainer1.Panel2.Controls.Add(this.groupComboBox);
+      this.splitContainer1.Size = new System.Drawing.Size(309, 54);
+      this.splitContainer1.SplitterDistance = 25;
+      this.splitContainer1.TabIndex = 18;
+      // 
+      // splitContainer3
+      // 
+      this.splitContainer3.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)));
+      this.splitContainer3.Location = new System.Drawing.Point(6, 6);
+      this.splitContainer3.Name = "splitContainer3";
+      // 
+      // splitContainer3.Panel1
+      // 
+      this.splitContainer3.Panel1.Controls.Add(this.stringConvertibleMatrixView);
+      // 
+      // splitContainer3.Panel2
+      // 
+      this.splitContainer3.Panel2.Controls.Add(this.splitContainer2);
+      this.splitContainer3.Size = new System.Drawing.Size(910, 603);
+      this.splitContainer3.SplitterDistance = 573;
+      this.splitContainer3.TabIndex = 20;
+      // 
+      // pairwiseTestGroupBox
+      // 
+      this.pairwiseTestGroupBox.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)));
+      this.pairwiseTestGroupBox.Controls.Add(this.pairwiseTextLabel);
+      this.pairwiseTestGroupBox.Controls.Add(this.pairwiseStringConvertibleMatrixView);
+      this.pairwiseTestGroupBox.Controls.Add(this.pairwiseLabel);
+      this.pairwiseTestGroupBox.Controls.Add(this.label3);
+      this.pairwiseTestGroupBox.Controls.Add(this.equalDistsTextBox);
+      this.pairwiseTestGroupBox.Controls.Add(this.label2);
+      this.pairwiseTestGroupBox.Controls.Add(this.groupCompComboBox);
+      this.pairwiseTestGroupBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.pairwiseTestGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.pairwiseTestGroupBox.Name = "pairwiseTestGroupBox";
+      this.pairwiseTestGroupBox.Size = new System.Drawing.Size(321, 287);
+      this.pairwiseTestGroupBox.TabIndex = 22;
+      this.pairwiseTestGroupBox.TabStop = false;
+      this.pairwiseTestGroupBox.Text = "4. Pairwise Test for Inequalities in Distributions";
+      // 
+      // pairwiseTextLabel
+      // 
+      this.pairwiseTextLabel.AutoSize = true;
+      this.pairwiseTextLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.pairwiseTextLabel.Location = new System.Drawing.Point(28, 46);
+      this.pairwiseTextLabel.Name = "pairwiseTextLabel";
+      this.pairwiseTextLabel.Size = new System.Drawing.Size(165, 13);
+      this.pairwiseTextLabel.TabIndex = 20;
+      this.pairwiseTextLabel.Text = "Groups have different distribution:";
+      // 
+      // pairwiseStringConvertibleMatrixView
+      // 
+      this.pairwiseStringConvertibleMatrixView.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)));
+      this.pairwiseStringConvertibleMatrixView.Caption = "StringConvertibleMatrix View";
+      this.pairwiseStringConvertibleMatrixView.Content = null;
+      this.pairwiseStringConvertibleMatrixView.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.pairwiseStringConvertibleMatrixView.Location = new System.Drawing.Point(6, 97);
+      this.pairwiseStringConvertibleMatrixView.Name = "pairwiseStringConvertibleMatrixView";
+      this.pairwiseStringConvertibleMatrixView.ReadOnly = false;
+      this.pairwiseStringConvertibleMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.pairwiseStringConvertibleMatrixView.ShowStatisticalInformation = false;
+      this.pairwiseStringConvertibleMatrixView.Size = new System.Drawing.Size(309, 172);
+      this.pairwiseStringConvertibleMatrixView.TabIndex = 19;
+      // 
+      // pairwiseLabel
+      // 
+      this.pairwiseLabel.AutoSize = true;
+      this.pairwiseLabel.Location = new System.Drawing.Point(6, 44);
+      this.pairwiseLabel.MaximumSize = new System.Drawing.Size(16, 16);
+      this.pairwiseLabel.MinimumSize = new System.Drawing.Size(16, 16);
+      this.pairwiseLabel.Name = "pairwiseLabel";
+      this.pairwiseLabel.Size = new System.Drawing.Size(16, 16);
+      this.pairwiseLabel.TabIndex = 18;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.label3.Location = new System.Drawing.Point(6, 68);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(74, 13);
+      this.label3.TabIndex = 18;
+      this.label3.Text = "Equal Groups:";
+      this.label3.TextAlign = System.Drawing.ContentAlignment.TopRight;
+      // 
+      // equalDistsTextBox
+      // 
+      this.equalDistsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.equalDistsTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.equalDistsTextBox.Location = new System.Drawing.Point(86, 65);
+      this.equalDistsTextBox.Name = "equalDistsTextBox";
+      this.equalDistsTextBox.ReadOnly = true;
+      this.equalDistsTextBox.Size = new System.Drawing.Size(229, 20);
+      this.equalDistsTextBox.TabIndex = 18;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.label2.Location = new System.Drawing.Point(6, 22);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(111, 13);
+      this.label2.TabIndex = 18;
+      this.label2.Text = "Group for comparison:";
+      // 
+      // groupCompComboBox
+      // 
+      this.groupCompComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupCompComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.groupCompComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.groupCompComboBox.FormattingEnabled = true;
+      this.groupCompComboBox.Location = new System.Drawing.Point(123, 19);
+      this.groupCompComboBox.Name = "groupCompComboBox";
+      this.groupCompComboBox.Size = new System.Drawing.Size(192, 21);
+      this.groupCompComboBox.TabIndex = 17;
+      this.groupCompComboBox.SelectedValueChanged += new System.EventHandler(this.groupCompComboBox_SelectedValueChanged);
+      // 
+      // allGroupTestGroupBox
+      // 
+      this.allGroupTestGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.allGroupTestGroupBox.Controls.Add(this.groupComTextLabel);
+      this.allGroupTestGroupBox.Controls.Add(this.groupCompLabel);
+      this.allGroupTestGroupBox.Controls.Add(this.lblPVal);
+      this.allGroupTestGroupBox.Controls.Add(this.pValTextBox);
+      this.allGroupTestGroupBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.allGroupTestGroupBox.Location = new System.Drawing.Point(3, 237);
+      this.allGroupTestGroupBox.Name = "allGroupTestGroupBox";
+      this.allGroupTestGroupBox.Size = new System.Drawing.Size(321, 63);
+      this.allGroupTestGroupBox.TabIndex = 21;
+      this.allGroupTestGroupBox.TabStop = false;
+      this.allGroupTestGroupBox.Text = "3. Kruskal Wallis Test for Inequalities in Distributions";
+      // 
+      // groupComTextLabel
+      // 
+      this.groupComTextLabel.AutoSize = true;
+      this.groupComTextLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.groupComTextLabel.Location = new System.Drawing.Point(28, 16);
+      this.groupComTextLabel.Name = "groupComTextLabel";
+      this.groupComTextLabel.Size = new System.Drawing.Size(165, 13);
+      this.groupComTextLabel.TabIndex = 19;
+      this.groupComTextLabel.Text = "Groups have different distribution:";
+      // 
+      // groupCompLabel
+      // 
+      this.groupCompLabel.AutoSize = true;
+      this.groupCompLabel.Location = new System.Drawing.Point(6, 16);
+      this.groupCompLabel.MaximumSize = new System.Drawing.Size(16, 16);
+      this.groupCompLabel.MinimumSize = new System.Drawing.Size(16, 16);
+      this.groupCompLabel.Name = "groupCompLabel";
+      this.groupCompLabel.Size = new System.Drawing.Size(16, 16);
+      this.groupCompLabel.TabIndex = 17;
+      // 
+      // normalityGroupBox
+      // 
+      this.normalityGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.normalityGroupBox.Controls.Add(this.normalityTextLabel);
+      this.normalityGroupBox.Controls.Add(this.normalityStringConvertibleMatrixView);
+      this.normalityGroupBox.Controls.Add(this.normalityLabel);
+      this.normalityGroupBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.normalityGroupBox.Location = new System.Drawing.Point(3, 88);
+      this.normalityGroupBox.Name = "normalityGroupBox";
+      this.normalityGroupBox.Size = new System.Drawing.Size(321, 143);
+      this.normalityGroupBox.TabIndex = 20;
+      this.normalityGroupBox.TabStop = false;
+      this.normalityGroupBox.Text = "2. Jarque-Bera Test for Normal Distribution";
+      // 
+      // normalityTextLabel
+      // 
+      this.normalityTextLabel.AutoSize = true;
+      this.normalityTextLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.normalityTextLabel.Location = new System.Drawing.Point(28, 16);
+      this.normalityTextLabel.Name = "normalityTextLabel";
+      this.normalityTextLabel.Size = new System.Drawing.Size(135, 13);
+      this.normalityTextLabel.TabIndex = 18;
+      this.normalityTextLabel.Text = "Data is normally distributed:";
+      // 
+      // normalityStringConvertibleMatrixView
+      // 
+      this.normalityStringConvertibleMatrixView.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)));
+      this.normalityStringConvertibleMatrixView.Caption = "StringConvertibleMatrix View";
+      this.normalityStringConvertibleMatrixView.Content = null;
+      this.normalityStringConvertibleMatrixView.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.normalityStringConvertibleMatrixView.Location = new System.Drawing.Point(6, 35);
+      this.normalityStringConvertibleMatrixView.Name = "normalityStringConvertibleMatrixView";
+      this.normalityStringConvertibleMatrixView.ReadOnly = false;
+      this.normalityStringConvertibleMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.normalityStringConvertibleMatrixView.ShowStatisticalInformation = false;
+      this.normalityStringConvertibleMatrixView.Size = new System.Drawing.Size(306, 102);
+      this.normalityStringConvertibleMatrixView.TabIndex = 17;
+      // 
+      // normalityLabel
+      // 
+      this.normalityLabel.AutoSize = true;
+      this.normalityLabel.Location = new System.Drawing.Point(6, 16);
+      this.normalityLabel.MaximumSize = new System.Drawing.Size(16, 16);
+      this.normalityLabel.MinimumSize = new System.Drawing.Size(16, 16);
+      this.normalityLabel.Name = "normalityLabel";
+      this.normalityLabel.Size = new System.Drawing.Size(16, 16);
+      this.normalityLabel.TabIndex = 16;
+      // 
+      // selectDataGroupBox
+      // 
+      this.selectDataGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.selectDataGroupBox.Controls.Add(this.splitContainer1);
+      this.selectDataGroupBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.selectDataGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.selectDataGroupBox.Name = "selectDataGroupBox";
+      this.selectDataGroupBox.Size = new System.Drawing.Size(321, 79);
+      this.selectDataGroupBox.TabIndex = 19;
+      this.selectDataGroupBox.TabStop = false;
+      this.selectDataGroupBox.Text = "1. Select Data";
+      // 
+      // tabControl
+      // 
+      this.tabControl.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)));
+      this.tabControl.Controls.Add(this.tabPage1);
+      this.tabControl.Controls.Add(this.tabPage2);
+      this.tabControl.Location = new System.Drawing.Point(3, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(930, 641);
+      this.tabControl.TabIndex = 21;
+      // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.splitContainer3);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(922, 615);
+      this.tabPage1.TabIndex = 0;
+      this.tabPage1.Text = "Tests";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // tabPage2
+      // 
+      this.tabPage2.Controls.Add(this.histogramControl);
+      this.tabPage2.Location = new System.Drawing.Point(4, 22);
+      this.tabPage2.Name = "tabPage2";
+      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage2.Size = new System.Drawing.Size(922, 615);
+      this.tabPage2.TabIndex = 1;
+      this.tabPage2.Text = "Histogram";
+      this.tabPage2.UseVisualStyleBackColor = true;
+      // 
+      // histogramControl
+      // 
+      this.histogramControl.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)));
+      this.histogramControl.CalculateExactBins = false;
+      this.histogramControl.IncrementNumberOfBins = 1;
+      this.histogramControl.Location = new System.Drawing.Point(6, 6);
+      this.histogramControl.MaximumNumberOfBins = 100000;
+      this.histogramControl.MinimumNumberOfBins = 1;
+      this.histogramControl.Name = "histogramControl";
+      this.histogramControl.NumberOfBins = 10;
+      this.histogramControl.ShowExactCheckbox = false;
+      this.histogramControl.Size = new System.Drawing.Size(910, 603);
+      this.histogramControl.TabIndex = 0;
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.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)));
+      this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer2.IsSplitterFixed = true;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 3);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.selectDataGroupBox);
+      this.splitContainer2.Panel1.Controls.Add(this.allGroupTestGroupBox);
+      this.splitContainer2.Panel1.Controls.Add(this.normalityGroupBox);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.pairwiseTestGroupBox);
+      this.splitContainer2.Size = new System.Drawing.Size(327, 597);
+      this.splitContainer2.SplitterDistance = 303;
+      this.splitContainer2.SplitterWidth = 1;
+      this.splitContainer2.TabIndex = 1;
+      // 
+      // StatisticalTestsView
+      // 
+      this.Controls.Add(this.tabControl);
+      this.Name = "StatisticalTestsView";
+      this.Size = new System.Drawing.Size(936, 647);
+      this.contextMenuStrip1.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel1.PerformLayout();
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.Panel2.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.splitContainer3.Panel1.ResumeLayout(false);
+      this.splitContainer3.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit();
+      this.splitContainer3.ResumeLayout(false);
+      this.pairwiseTestGroupBox.ResumeLayout(false);
+      this.pairwiseTestGroupBox.PerformLayout();
+      this.allGroupTestGroupBox.ResumeLayout(false);
+      this.allGroupTestGroupBox.PerformLayout();
+      this.normalityGroupBox.ResumeLayout(false);
+      this.normalityGroupBox.PerformLayout();
+      this.selectDataGroupBox.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage2.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+    #endregion
+
+    private HeuristicLab.Data.Views.StringConvertibleMatrixView stringConvertibleMatrixView;
+    private System.Windows.Forms.Label groupByLabel;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox resultComboBox;
+    private System.Windows.Forms.Label lblPVal;
+    private System.Windows.Forms.TextBox pValTextBox;
+    private System.Windows.Forms.ComboBox groupComboBox;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+    private System.Windows.Forms.ToolStripMenuItem openBoxPlotToolStripMenuItem;
+    private System.Windows.Forms.SplitContainer splitContainer3;
+    private System.Windows.Forms.GroupBox selectDataGroupBox;
+    private System.Windows.Forms.GroupBox normalityGroupBox;
+    private System.Windows.Forms.GroupBox pairwiseTestGroupBox;
+    private System.Windows.Forms.GroupBox allGroupTestGroupBox;
+    private System.Windows.Forms.Label normalityLabel;
+    private System.Windows.Forms.Label groupCompLabel;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.ComboBox groupCompComboBox;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox equalDistsTextBox;
+    private System.Windows.Forms.Label pairwiseLabel;
+    private Data.Views.StringConvertibleMatrixView normalityStringConvertibleMatrixView;
+    private Data.Views.StringConvertibleMatrixView pairwiseStringConvertibleMatrixView;
+    private System.Windows.Forms.Label normalityTextLabel;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.TabPage tabPage2;
+    private HeuristicLab.Analysis.Views.HistogramControl histogramControl;
+    private System.Windows.Forms.Label pairwiseTextLabel;
+    private System.Windows.Forms.Label groupComTextLabel;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataRow.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataRow.cs	(revision 11918)
+++ /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataRow.cs	(revision 11919)
@@ -76,4 +76,5 @@
       this.values = new ObservableList<double>(original.values);
     }
+    public DataRow() : this("DataRow") { }
     public DataRow(string name)
       : base(name) {
@@ -116,4 +117,8 @@
       OnVisualPropertiesChanged();
     }
+    protected override void OnNameChanged() {
+      base.OnNameChanged();
+      VisualProperties.DisplayName = Name;
+    }
   }
 }
Index: /stable/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 11918)
+++ /stable/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 11919)
@@ -153,5 +153,14 @@
     <Compile Include="QualityAnalysis\QualityDistributionAnalyzer.cs" />
     <Compile Include="QualityAnalysis\ScaledQualityDifferenceAnalyzer.cs" />
+    <Compile Include="Statistics\BonferroniHolm.cs" />
+    <Compile Include="Statistics\EnumerableStatisticsExtension.cs" />
+    <Compile Include="Statistics\Fitting\ExpFitting.cs" />
+    <Compile Include="Statistics\Fitting\IFitting.cs" />
+    <Compile Include="Statistics\KruskalWallisTest.cs" />
+    <Compile Include="Statistics\Fitting\LinearLeastSquaresFitting.cs" />
+    <Compile Include="Statistics\Fitting\LogFitting.cs" />
     <Compile Include="Statistics\NormalDistribution.cs" />
+    <Compile Include="Statistics\PairwiseTest.cs" />
+    <Compile Include="Statistics\SampleSizeDetermination.cs" />
     <Compile Include="ValueAnalysis\SingleValueAnalyzer.cs" />
     <Compile Include="ValueAnalysis\MinAverageMaxValueAnalyzer.cs" />
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/BonferroniHolm.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/BonferroniHolm.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/BonferroniHolm.cs	(revision 11919)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public static class BonferroniHolm {
+    /// <summary>
+    /// Based on David Groppe's MATLAB implementation 
+    /// (BSD licensed, see 
+    /// http://www.mathworks.com/matlabcentral/fileexchange/28303-bonferroni-holm-correction-for-multiple-comparisons)
+    /// </summary>
+    public static double[] Calculate(double globalAlpha, double[] pValues, out bool[] h) {
+      int k = pValues.Length;
+      double[] alphaNiveau = new double[k];
+      double[] adjustedPValues = new double[k];
+      bool[] decision = new bool[k];
+      Dictionary<int, double> pValuesIndizes = new Dictionary<int, double>();
+
+      for (int i = 0; i < k; i++) {
+        pValuesIndizes.Add(i, pValues[i]);
+      }
+      var sortedPValues = pValuesIndizes.OrderBy(x => x.Value).ToArray();
+
+      for (int i = 1; i < k + 1; i++) {
+        alphaNiveau[i - 1] = globalAlpha / (k - i + 1);
+        int idx = sortedPValues[i - 1].Key;
+
+        if (i == 1) {
+          //true means reject
+          decision[idx] = sortedPValues[i - 1].Value < alphaNiveau[i - 1];
+          adjustedPValues[idx] = sortedPValues[i - 1].Value * (k - i + 1);
+        } else {
+          decision[idx] = decision[sortedPValues[i - 2].Key] && (sortedPValues[i - 1].Value < alphaNiveau[i - 1]);
+          adjustedPValues[idx] = Math.Max(adjustedPValues[sortedPValues[i - 2].Key], sortedPValues[i - 1].Value * (k - i + 1));
+        }
+        if (adjustedPValues[idx] > 1.0) {
+          adjustedPValues[idx] = 1.0;
+        }
+      }
+
+      h = decision;
+      return adjustedPValues;
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/EnumerableStatisticsExtension.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/EnumerableStatisticsExtension.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/EnumerableStatisticsExtension.cs	(revision 11919)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 EnumerableStatisticExtensions {
+    public static Tuple<double, double> ConfidenceIntervals(this IEnumerable<double> values, double alpha) {
+      return ConfidenceIntervals(values.ToArray(), alpha);
+    }
+
+    public static Tuple<double, double> ConfidenceIntervals(this double[] values, double alpha) {
+      double lower, upper;
+      int n = values.Length;
+      if (n <= 1) return new Tuple<double, double>(double.NaN, double.NaN);
+
+      double s = values.StandardDeviation();
+      double x = values.Average();
+      double t = alglib.invstudenttdistribution(n - 1, (1.0 - alpha) / 2.0);
+
+      lower = x + t * (s / Math.Sqrt(n));
+      upper = x - t * (s / Math.Sqrt(n));
+
+      return new Tuple<double, double>(lower, upper);
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/ExpFitting.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/ExpFitting.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/ExpFitting.cs	(revision 11919)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public class ExpFitting : IFitting {
+    private void ExpFunc(double[] c, double[] x, ref double func, object obj) {
+      func = Math.Exp(-c[0] * Math.Pow(x[0], 2));
+    }
+
+    private double[] GetDefaultXValues(int n) {
+      var stdX = Enumerable.Range(1, n).Select(x => (double)x).ToArray();
+      return stdX;
+    }
+
+    public void Calculate(double[] dataPoints, out double p0) {
+      var stdX = GetDefaultXValues(dataPoints.Count());
+      Calculate(dataPoints, stdX, out p0);
+    }
+
+    public void Calculate(double[] y, double[] x, out double p0) {
+      if (y.Count() != x.Count()) {
+        throw new ArgumentException("The lenght of x and y needs do be equal. ");
+      }
+
+      double[] c = new double[] { 0.3 };
+      double epsf = 0;
+      double epsx = 0.000001;
+      int maxits = 0;
+      int info;
+      alglib.lsfitstate state;
+      alglib.lsfitreport rep;
+      double diffstep = 0.0001;
+      double[,] xx = new double[x.Count(), 1];
+
+      for (int i = 0; i < x.Count(); i++) {
+        xx[i, 0] = x[i];
+      }
+
+      alglib.lsfitcreatef(xx, y, c, diffstep, out state);
+      alglib.lsfitsetcond(state, epsf, epsx, maxits);
+      alglib.lsfitfit(state, ExpFunc, null, null);
+      alglib.lsfitresults(state, out info, out c, out rep);
+
+      p0 = c[0];
+    }
+
+    public DataRow CalculateFittedLine(double[] dataPoints) {
+      DataRow newRow = new DataRow();
+      double c0;
+      Calculate(dataPoints, out c0);
+      var stdX = GetDefaultXValues(dataPoints.Count());
+
+      for (int i = 0; i < stdX.Count(); i++) {
+        newRow.Values.Add(Math.Exp(-c0 * Math.Pow(stdX[i], 2)));
+      }
+
+      return newRow;
+    }
+
+    public DataRow CalculateFittedLine(double[] y, double[] x) {
+      DataRow newRow = new DataRow();
+      double c0;
+      Calculate(y, x, out c0);
+
+      for (int i = 0; i < x.Count(); i++) {
+        newRow.Values.Add(Math.Exp(-c0 * Math.Pow(x[i], 2)));
+      }
+
+      return newRow;
+    }
+
+    public override string ToString() {
+      return "Exponential Fitting";
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/IFitting.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/IFitting.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/IFitting.cs	(revision 11919)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+namespace HeuristicLab.Analysis.Statistics {
+  public interface IFitting {
+    DataRow CalculateFittedLine(double[] dataPoints);
+    DataRow CalculateFittedLine(double[] y, double[] x);
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/LinearLeastSquaresFitting.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/LinearLeastSquaresFitting.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/LinearLeastSquaresFitting.cs	(revision 11919)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public class LinearLeastSquaresFitting : IFitting {
+    public void Calculate(double[] dataPoints, out double slope, out double intercept) {
+      var stdX = Enumerable.Range(0, dataPoints.Count()).Select(x => (double)x).ToArray();
+      Calculate(dataPoints, stdX, out slope, out intercept);
+    }
+
+    public void Calculate(double[] y, double[] x, out double slope, out double intercept) {
+      if (y.Count() != x.Count()) {
+        throw new ArgumentException("The lenght of x and y needs do be equal. ");
+      }
+
+      double sxy = 0.0;
+      double sxx = 0.0;
+      int n = y.Count();
+      double sy = y.Sum();
+      double sx = ((n - 1) * n) / 2.0;
+      double avgy = sy / n;
+      double avgx = sx / n;
+
+      for (int i = 0; i < n; i++) {
+        sxy += x[i] * y[i];
+        sxx += x[i] * x[i];
+      }
+
+      slope = (sxy - (n * avgx * avgy)) / (sxx - (n * avgx * avgx));
+      intercept = avgy - slope * avgx;
+    }
+
+    public double CalculateError(double[] dataPoints, double slope, double intercept) {
+      double r;
+      double avgy = dataPoints.Average();
+      double sstot = 0.0;
+      double sserr = 0.0;
+
+      for (int i = 0; i < dataPoints.Count(); i++) {
+        double y = slope * i + intercept;
+        sstot += Math.Pow(dataPoints[i] - avgy, 2);
+        sserr += Math.Pow(dataPoints[i] - y, 2);
+      }
+
+      r = 1.0 - (sserr / sstot);
+      return r;
+    }
+
+    public DataRow CalculateFittedLine(double[] y, double[] x) {
+      double slope, intercept;
+      Calculate(y, x, out slope, out intercept);
+
+      DataRow newRow = new DataRow();
+      for (int i = 0; i < x.Count(); i++) {
+        newRow.Values.Add(slope * x[i] + intercept);
+      }
+      return newRow;
+    }
+
+    public DataRow CalculateFittedLine(double[] dataPoints) {
+      DataRow newRow = new DataRow();
+      double slope, intercept;
+      Calculate(dataPoints, out slope, out intercept);
+      var stdX = Enumerable.Range(0, dataPoints.Count()).Select(x => (double)x).ToArray();
+
+      for (int i = 0; i < stdX.Count(); i++) {
+        newRow.Values.Add(slope * stdX[i] + intercept);
+      }
+
+      return newRow;
+    }
+
+    public override string ToString() {
+      return "Linear Fitting";
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/LogFitting.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/LogFitting.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/Fitting/LogFitting.cs	(revision 11919)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public class LogFitting : IFitting {
+    private void LogFunc(double[] c, double[] x, ref double func, object obj) {
+      func = c[0] * Math.Exp(c[1] / x[0]);
+    }
+
+    private double[] GetDefaultXValues(int n) {
+      var stdX = Enumerable.Range(1, n).Select(x => (double)x).ToArray();
+      return stdX;
+    }
+
+    public void Calculate(double[] dataPoints, out double p0, out double p1) {
+      var stdX = GetDefaultXValues(dataPoints.Count());
+      Calculate(dataPoints, stdX, out p0, out p1);
+    }
+
+    public void Calculate(double[] y, double[] x, out double p0, out double p1) {
+      if (y.Count() != x.Count()) {
+        throw new ArgumentException("The lenght of x and y needs do be equal. ");
+      }
+
+      double[] c = new double[] { 0.3, 0.3 };
+      double epsf = 0;
+      double epsx = 0.000001;
+      int maxits = 0;
+      int info;
+      alglib.lsfitstate state;
+      alglib.lsfitreport rep;
+      double diffstep = 0.0001;
+      double[,] xx = new double[x.Count(), 1];
+
+      for (int i = 0; i < x.Count(); i++) {
+        xx[i, 0] = x[i];
+      }
+
+      alglib.lsfitcreatef(xx, y, c, diffstep, out state);
+      alglib.lsfitsetcond(state, epsf, epsx, maxits);
+      alglib.lsfitfit(state, LogFunc, null, null);
+      alglib.lsfitresults(state, out info, out c, out rep);
+
+      p0 = c[0];
+      p1 = c[1];
+    }
+
+    public DataRow CalculateFittedLine(double[] dataPoints) {
+      DataRow newRow = new DataRow();
+      double c0, c1;
+      Calculate(dataPoints, out c0, out c1);
+      var stdX = GetDefaultXValues(dataPoints.Count());
+
+      for (int i = 0; i < stdX.Count(); i++) {
+        newRow.Values.Add(c0 * Math.Exp(c1 / stdX[i]));
+      }
+
+      return newRow;
+    }
+
+    public DataRow CalculateFittedLine(double[] y, double[] x) {
+      DataRow newRow = new DataRow();
+      double c0, c1;
+      Calculate(y, x, out c0, out c1);
+
+      for (int i = 0; i < x.Count(); i++) {
+        newRow.Values.Add(c0 * Math.Exp(c1 / x[i]));
+      }
+
+      return newRow;
+    }
+
+    public override string ToString() {
+      return "Logarithmic Fitting";
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/KruskalWallisTest.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/KruskalWallisTest.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/KruskalWallisTest.cs	(revision 11919)
@@ -0,0 +1,151 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public static class KruskalWallisTest {
+    /// <summary>
+    /// Performs the Kruskal-Wallis test and returns the p-Value. 
+    /// (source based on R's kruskal.test(), GNU GPL)
+    /// </summary>
+    public static double Test(double[][] data) {
+      double[] g;
+      double[] x = FlattenArray(data, out g);
+      int n = x.Length;
+      int parameter = data.Length - 1;
+
+      int[] r = Rank(x);
+      double[][] ties = CountDuplicates(x);
+      double statistic = CalculateStatistic(r, g);
+      double tiesCorrection = CalculateTiesCorrection(ties);
+      statistic = ((12 * statistic / (n * (n + 1)) - 3 * (n + 1)) /
+                  (1 - tiesCorrection / (Math.Pow(n, 3) - n)));
+
+      return alglib.chisquarecdistribution(parameter, statistic);
+    }
+
+    private static double CalculateStatistic(int[] r, double[] g) {
+      double result = 0.0;
+      double lastG = g[0];
+      double curSum = 0.0;
+      int cnt = 0;
+      for (int i = 0; i < r.Length; i++) {
+        if (lastG.IsAlmost(g[i])) {
+          curSum += r[i];
+          cnt++;
+        } else {
+          double sum = Math.Pow(curSum, 2);
+          sum /= cnt;
+          result += sum;
+
+          lastG = g[i];
+          curSum = r[i];
+          cnt = 1;
+        }
+      }
+
+      double lastSum = Math.Pow(curSum, 2);
+      lastSum /= cnt;
+      result += lastSum;
+
+      return result;
+    }
+
+    private static double CalculateTiesCorrection(double[][] ties) {
+      double sum = 0.0;
+      for (int i = 0; i < ties[1].Length; i++) {
+        double tic = Math.Pow(ties[1][i], 3) - ties[1][i];
+        sum += tic;
+      }
+      return sum;
+    }
+
+    private static double[] FlattenArray(double[][] x, out double[] indizes) {
+      int compLenght = 0;
+      for (int i = 0; i < x.Length; i++) {
+        compLenght += x[i].Length;
+      }
+
+      double[] result = new double[compLenght];
+      indizes = new double[compLenght];
+
+      int resultPos = 0;
+      for (int i = 0; i < x.Length; i++) {
+        Array.Copy(x[i], 0, result, resultPos, x[i].Length);
+
+        for (int j = resultPos; j < resultPos + x[i].Length; j++) {
+          indizes[j] = i;
+        }
+        resultPos += x[i].Length;
+      }
+
+      return result;
+    }
+
+    private static double[][] CountDuplicates(double[] x) {
+      List<double> number = new List<double>();
+      List<double> cnt = new List<double>();
+      double[] sortedX = new double[x.Length];
+
+      Array.Copy(x, sortedX, x.Length);
+      Array.Sort(sortedX);
+
+      double last = x[0];
+      number.Add(x[0]);
+      cnt.Add(1);
+
+      for (int i = 1; i < x.Length; i++) {
+        if (!last.IsAlmost(x[i])) {
+          number.Add(x[i]);
+          last = x[i];
+          cnt.Add(1);
+        } else {
+          cnt[cnt.Count - 1] += 1;
+        }
+      }
+
+      double[][] result = new double[2][];
+      result[0] = number.ToArray();
+      result[1] = cnt.ToArray();
+
+      return result;
+    }
+
+    private static int[] Rank(double[] x) {
+      double[] keys = new double[x.Length];
+      int[] items = new int[x.Length];
+      int[] ranks = new int[x.Length];
+
+      Array.Copy(x, keys, x.Length);
+      for (int i = 0; i < x.Length; i++) items[i] = i;
+
+      Array.Sort(keys, items);
+
+      for (int i = 0; i < x.Length; i++) {
+        ranks[items[i]] = i + 1;
+      }
+      return ranks;
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/PairwiseTest.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/PairwiseTest.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/PairwiseTest.cs	(revision 11919)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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
+
+
+namespace HeuristicLab.Analysis.Statistics {
+  public class PairwiseTest {
+    public static double TTest(double[] group1, double[] group2) {
+      double left, right, both;
+      alglib.unequalvariancettest(group1, group1.Length, group2, group2.Length, out both, out left, out right);
+      return both;
+    }
+
+    public static double MannWhitneyUTest(double[] group1, double[] group2) {
+      double mwuBothtails, mwuLefttail, mwuRighttail;
+      alglib.mannwhitneyutest(group1, group1.Length, group2, group2.Length, out mwuBothtails, out mwuLefttail, out mwuRighttail);
+      return mwuBothtails;
+    }
+  }
+}
Index: /stable/HeuristicLab.Analysis/3.3/Statistics/SampleSizeDetermination.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/Statistics/SampleSizeDetermination.cs	(revision 11919)
+++ /stable/HeuristicLab.Analysis/3.3/Statistics/SampleSizeDetermination.cs	(revision 11919)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Analysis.Statistics {
+  public static class SampleSizeDetermination {
+    /// <summary>
+    /// Determines for a given sample the required sample size as described in 
+    /// Göran Kauermann, Helmut Küchenhoff: Stichproben: Methoden und praktische Umsetzung mit R, section 2.27. 
+    /// </summary>
+    /// <param name="samples">The pilot sample.</param>
+    /// <param name="conf">Confidence Interval.</param>
+    /// <returns>Number of required samples for the given confidence interval. </returns>
+    public static int DetermineSampleSizeByEstimatingMean(double[] samples, double conf = 0.95) {
+      if (conf < 0.0 || conf > 1.0) throw new ArgumentException("The confidence interval must be between zero and one.");
+
+      var confInterval = samples.ConfidenceIntervals(conf);
+      double e = (confInterval.Item2 - confInterval.Item1) / 2;
+      double s = samples.StandardDeviation();
+      double z = alglib.invnormaldistribution((conf + 1) / 2);
+      double n = samples.Count();
+
+      double result = Math.Pow(s, 2) / ((Math.Pow(e, 2) / Math.Pow(z, 2)) + (Math.Pow(s, 2) / n));
+
+      result = Math.Ceiling(result);
+      if (result > int.MaxValue)
+        return int.MaxValue;
+      else
+        return (int)result;
+    }
+
+    /// <summary>
+    /// Calculates Cohen's d.
+    /// </summary>
+    /// <returns>Cohen's d. 
+    /// d = 0.2 means small effect
+    /// d = 0.5 means medium effect
+    /// d = 0.8 means big effect
+    /// According to Wikipedia this means: "A lower Cohen's d indicates a necessity of larger sample sizes, and vice versa."
+    /// </returns>
+    public static double CalculateCohensD(double[] d1, double[] d2) {
+      double x1, x2, s1, s2;
+
+      x1 = d1.Average();
+      x2 = d2.Average();
+      s1 = d1.Variance();
+      s2 = d2.Variance();
+
+      return Math.Abs(x1 - x2) / Math.Sqrt((s1 + s2) / 2);
+    }
+
+    /// <summary>
+    /// Calculates Hedges' g. 
+    /// Hedges' g works like Cohen's d but corrects for bias. 
+    /// </summary>
+    /// <returns>Hedges' g</returns>
+    public static double CalculateHedgesG(double[] d1, double[] d2) {
+      double x1, x2, s1, s2, n1, n2, s, g, c;
+
+      x1 = d1.Average();
+      x2 = d2.Average();
+      s1 = d1.Variance();
+      s2 = d2.Variance();
+      n1 = d1.Count();
+      n2 = d2.Count();
+
+      s = Math.Sqrt(((n1 - 1) * s1 + (n2 - 1) * s2) / (n1 + n2 - 2));
+      g = Math.Abs(x1 - x2) / s;
+      c = (1 - (3 / (4 * (n1 + n2) - 9))) * g;
+
+      return c;
+    }
+  }
+}
Index: /stable/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj	(revision 11918)
+++ /stable/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj	(revision 11919)
@@ -438,4 +438,5 @@
     <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Monitor_Large.png" />
     <None Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DisplayInColor_Vertical.png" />
+    <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations_Default.png" />
     <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Paused.png" />
     <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Objects_BatchRun_Prepared.png" />
Index: /stable/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs
===================================================================
--- /stable/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs	(revision 11918)
+++ /stable/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs	(revision 11919)
@@ -324,4 +324,14 @@
         ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
+        public static System.Drawing.Bitmap Default {
+            get {
+                object obj = ResourceManager.GetObject("Default", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
         public static System.Drawing.Bitmap Delegate {
             get {
Index: /stable/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx
===================================================================
--- /stable/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx	(revision 11918)
+++ /stable/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx	(revision 11919)
@@ -524,3 +524,6 @@
     <value>Resources\VS2010ImageLibrary\camera.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="Default" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Annotations_Default.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
Index: /stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs
===================================================================
--- /stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 11918)
+++ /stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 11919)
@@ -453,4 +453,11 @@
     }
 
+    public void SetXAxis(string axisName) {
+      xAxisComboBox.SelectedItem = axisName;
+    }
+
+    public void SetYAxis(string axisName) {
+      yAxisComboBox.SelectedItem = axisName;
+    }
   }
 }
Index: /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/BonferroniHolmUnitTests.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/BonferroniHolmUnitTests.cs	(revision 11919)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/BonferroniHolmUnitTests.cs	(revision 11919)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Analysis.Statistics;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Analysis.Tests {
+  [TestClass]
+  public class BonferroniHolmUnitTest {
+    [TestMethod]
+    public void BonferroniHolmUnitTest1() {
+      /* example taken from 
+       * http://www.mathworks.com/matlabcentral/fileexchange/28303-bonferroni-holm-correction-for-multiple-comparisons
+       * 
+       * p = 0.56, 0.22, 0.001, 0.04, 0.01
+       * a = 0.05
+       * cor_p = 0.560, 0.440, 0.005, 0.120, 0.040
+       * h = 0, 0, 1, 0, 1
+       * 
+       */
+
+      double[] correctedPValues = new double[] { 0.56, 0.44, 0.005, 0.12, 0.04 };
+      double[] pVals = new[] { 0.56, 0.22, 0.001, 0.04, 0.01 };
+      bool[] h = new bool[] { false, false, true, false, true };
+      bool[] decision;
+
+      var result = BonferroniHolm.Calculate(0.05, pVals, out decision);
+
+      for (int i = 0; i < pVals.Length; i++) {
+        Assert.AreEqual(correctedPValues[i], result[i]);
+        Assert.AreEqual(h[i], decision[i]);
+      }
+    }
+
+    [TestMethod]
+    public void BonferroniHolmUnitTest2() {
+      /* example taken from 
+       * http://en.wikipedia.org/wiki/Holm-Bonferroni_method#Example
+       * 
+       * p = 0.01, 0.04, 0.03,  0.005
+       * a = 0.05
+       * cor_p = 0.03, 0.06, 0.06, 0.02
+       * h = 1, 0, 0, 1
+       * 
+       */
+
+      double[] correctedPValues = new double[] { 0.03, 0.06, 0.06, 0.02 };
+      double[] pVals = new[] { 0.01, 0.04, 0.03, 0.005 };
+      bool[] h = new bool[] { true, false, false, true };
+      bool[] decision;
+
+      var result = BonferroniHolm.Calculate(0.05, pVals, out decision);
+
+      for (int i = 0; i < pVals.Length; i++) {
+        Assert.AreEqual(correctedPValues[i], result[i]);
+        Assert.AreEqual(h[i], decision[i]);
+      }
+    }
+
+    [TestMethod]
+    public void BonferroniHolmUnitTest3() {
+      // comparison with R's p.adjust(p, "holm") method
+      double[] correctedPValues = new double[] { 0.23262159, 0.05204139 };
+      double[] pVals = new[] { 0.232621592948806, 0.0260206949805373 };
+      bool[] decision;
+
+      var result = BonferroniHolm.Calculate(0.05, pVals, out decision);
+
+      for (int i = 0; i < pVals.Length; i++) {
+        Assert.AreEqual(correctedPValues[i], Math.Round(result[i], 8));
+      }
+    }
+
+    [TestMethod]
+    public void BonferroniHolmUnitTest4() {
+      // comparison with R's p.adjust(p, "holm") method
+      double[] correctedPValues = new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
+      double[] pVals = new[] { 0.1108139, 0.1241641, 0.2805913, 0.3715633, 0.3967397, 0.6165547, 0.7272018, 0.8774432, 0.9495787, 0.9755199 };
+      bool[] decision;
+
+      var result = BonferroniHolm.Calculate(0.05, pVals, out decision);
+
+      for (int i = 0; i < pVals.Length; i++) {
+        Assert.AreEqual(correctedPValues[i], Math.Round(result[i], 8));
+      }
+    }
+
+    [TestMethod]
+    public void BonferroniHolmUnitTest5() {
+      // comparison with R's p.adjust(p, "holm") method
+      double[] correctedPValues = new double[] { 1.389563e-05, 7.293675e-05, 2.330999e-04, 2.330999e-04, 4.370736e-04, 5.539326e-04 };
+      double[] pVals = new[] { 2.315938e-06, 1.458735e-05, 5.827497e-05, 7.166659e-05, 2.185368e-04, 5.539326e-04 };
+      bool[] decision;
+
+      var result = BonferroniHolm.Calculate(0.05, pVals, out decision);
+
+      for (int i = 0; i < pVals.Length; i++) {
+        Assert.AreEqual(Math.Round(correctedPValues[i], 10), Math.Round(result[i], 10));
+      }
+    }
+  }
+}
+
Index: /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/ConfidenceIntervalsTests.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/ConfidenceIntervalsTests.cs	(revision 11919)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/ConfidenceIntervalsTests.cs	(revision 11919)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Analysis.Statistics;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Analysis.Tests {
+  [TestClass]
+  public class ConfidenceIntervalsTests {
+    private readonly double[] x = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 1.5, 0.3 };
+    private readonly double[] y = new double[] { -0.4071000,  1.3207543,  0.8364860, -0.6574363,  0.6215807,  
+      1.1562429, -0.7299977, -0.1013315, -1.5221018, -0.9375169, -0.6257027,  1.1698417, -0.9868505,  0.6890087, 
+      -0.1643505, -0.4920212, -0.6958091,  1.8849663,  0.8117723,  0.9806149};
+    private readonly double[] z = new double[] { 45, 55, 67, 45, 68, 79, 98, 87, 84, 82 };
+
+    [TestMethod]
+    public void ConfidenceIntervalsTest1() {
+      var result = z.ConfidenceIntervals(0.98);
+      Assert.AreEqual(54.8, Math.Round(result.Item1, 1));
+      Assert.AreEqual(87.2, Math.Round(result.Item2, 1));
+    }
+
+    [TestMethod]
+    public void ConfidenceIntervalsTest2() {
+      //comparison with R's t.test(..)
+      var result = x.ConfidenceIntervals(0.95);
+      Assert.AreEqual(1.880506, Math.Round(result.Item1, 6));
+      Assert.AreEqual(5.679494, Math.Round(result.Item2, 6));
+    }
+
+    [TestMethod]
+    public void ConfidenceIntervalsTest3() {
+      //comparison with R's t.test(..)
+      var result = y.ConfidenceIntervals(0.1);
+      Assert.AreEqual(0.0802945, Math.Round(result.Item1, 7));
+      Assert.AreEqual(0.1348105, Math.Round(result.Item2, 7));
+    }
+
+    [TestMethod]
+    public void ConfidenceIntervalsTest4() {
+      //comparison with R's t.test(..)
+      var result = y.ConfidenceIntervals(0.99);
+      Assert.AreEqual(-0.5047921, Math.Round(result.Item1, 7));
+      Assert.AreEqual(0.7198970, Math.Round(result.Item2, 7));
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/EffectSizeUnitTests.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/EffectSizeUnitTests.cs	(revision 11919)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/EffectSizeUnitTests.cs	(revision 11919)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Analysis.Statistics;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Analysis.Tests {
+  [TestClass]
+  public class EffectSizeUnitTests {
+    private readonly double[] x = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 1.5, 0.3 };
+    private readonly double[] y = new double[] { 1.0, 3.0, 10.0, 4.0, 2.5, 6.0, 7.5, 8.0, 1.5, 0.5 };
+    private readonly double[] z = new double[] { 45.0, 0.3, 12.0, 45.0, 68.0, 79.0, 10.0, 87.0, 84.0, 1.0 };
+
+    [TestMethod]
+    public void CohensdTest1() {
+      //compared to R lsr package/cohenD(..)
+      var result = SampleSizeDetermination.CalculateCohensD(x, y);
+      Assert.AreEqual(0.2074003, Math.Round(result, 7));
+    }
+
+    [TestMethod]
+    public void CohensdTest2() {
+      //compared to R lsr package/cohenD(..)
+      var result = SampleSizeDetermination.CalculateCohensD(x, z);
+      Assert.AreEqual(1.57424, Math.Round(result, 5));
+    }
+
+    [TestMethod]
+    public void HedgesGTest1() {
+      //compared to R effsize package/cohen.d(..,hedges.correction=TRUE)
+      var result = SampleSizeDetermination.CalculateHedgesG(x, y);
+      Assert.AreEqual(0.1986369, Math.Round(result, 7));
+    }
+
+    [TestMethod]
+    public void HedgesGTest2() {
+      //compared to R effsize package/cohen.d(..,hedges.correction=TRUE)
+      var result = SampleSizeDetermination.CalculateHedgesG(x, z);
+      Assert.AreEqual(1.507722, Math.Round(result, 6));
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/KruskalWallisUnitTests.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/KruskalWallisUnitTests.cs	(revision 11919)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Analysis-3.3/KruskalWallisUnitTests.cs	(revision 11919)
@@ -0,0 +1,172 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Analysis.Statistics;
+using HeuristicLab.Common;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Analysis.Tests {
+  [TestClass]
+  public class KruskalWallisUnitTests {
+    //tests the sample data from R's Kruskal.Test() help page
+    [TestMethod]
+    public void KruskalWallisTest1() {
+      double[][] data = new double[3][];
+      data[0] = new double[] { 2.9, 3.0, 2.5, 2.6, 3.2 };
+      data[1] = new double[] { 3.8, 2.7, 4.0, 2.4 };
+      data[2] = new double[] { 2.8, 3.4, 3.7, 2.2, 2.0 };
+
+      Assert.AreEqual(0.68, Math.Round(KruskalWallisTest.Test(data), 2));
+    }
+
+    //compares groups of uniformly distributed random variables
+    [TestMethod]
+    public void KruskalWallisTest2() {
+      double[][] data = new double[3][];
+      data[0] = new double[] { 977,3848,2803,4097,3155,2745,25,3384,2587,1332,1407,2842,4089,4083,608,3246,1634
+                              ,3182,2856,1614,2627,1116,2659,1166,3299,2322,3681,2184,2470,4682,3305,2553,239,2847
+                              ,2733,8,2773,3215,1345,1037,1760,2729,984,648,1875,4852,1002,4106,3934,4542,3718
+                              ,67,4539,1862,1886,1299,4544,3463,4052,1934,728,2492,799,730,1896,468,4724,1329
+                              ,510,3952,2392,2812,330,94,1726,2542,926,1472,4014,812,1243,2274,2394,3120,1745
+                              ,2597,4331,2562,4814,239,1194,4843,4577,3277,3482,1381,4697,3878,500,2182};
+      data[1] = new double[] { 4106,3279,4464,1460,1023,4459,4723,2934,1818,26,2539,1816,2246,1185,1266,1137,1921
+                              ,1340,4655,4636,578,2970,4208,2658,110,1063,2081,1735,3308,3900,1483,929,2214,2810
+                              ,4568,327,3046,1085,4585,535,3303,1511,213,491,492,167,1520,1469,122,2514,2206
+                              ,2218,974,1480,3959,1158,2753,1273,3870,2356,4707,492,3606,562,445,866,3714,1603
+                              ,3139,4941,3824,1124,2130,3701,3437,1771,2837,1,3800,3465,3407,4281,444,363,2926
+                              ,2353,4429,3357,4834,1039,4238,139,3050,4099,2003,4253,2004,3849,4321,380 };
+      data[2] = new double[] { 233,1577,198,2311,2281,1957,737,3508,1974,1819,3778,1237,3497,616,1286,1901,3114
+                              ,3982,1756,1058,2874,2401,1921,3146,1313,1604,621,2365,46,3108,2714,81,4367,853
+                              ,1387,73,4132,2052,3440,2814,520,4434,4183,4055,1655,4417,3845,2389,1500,3029,3733
+                              ,3834,3681,1283,2875,1752,1258,279,1302,4301,4402,229,2256,3490,977,3615,1293,4345
+                              ,2005,298,2962,2118,3379,3121,4237,4646,1186,568,2181,2843,4721,1609,224,391,1893
+                              ,3605,4162,493,330,4595,2699,4457,3981,3499,1773,653,3176,134,3205,4537 };
+
+      Assert.AreEqual(0.95, Math.Round(KruskalWallisTest.Test(data), 2));
+    }
+
+    //compares groups of normally distributed random variables
+    [TestMethod]
+    public void KruskalWallisTest3() {
+      double[][] data = new double[3][];
+      data[0] = new double[] { 0.264589812,0.161585300,0.890091755,0.342488339,-1.596719857,0.120133657
+                              ,2.241639009,0.085758340,-0.857294600,1.677233367,1.256788739,-1.094681878
+                              ,1.243547091,-0.420561525,-0.762303565,0.108380241,-1.583143952,-0.327616045
+                              ,1.848906992,2.265051780,-0.101968019,0.958290323,0.531773709,0.923724862
+                              ,-0.345119203,1.502269741,-0.441750726,-0.041689146,-0.794916891,-1.407491978
+                              ,0.260857731,-0.583565945,-0.246297801,0.289167991,1.475766373,0.089479435
+                              ,-0.419836298,0.929193796,1.321124907,0.984626214,-1.106529215,1.893772460
+                              ,-0.116651087,-0.855576968,-0.235878058,0.122260772,0.505024585,0.557638701
+                              ,1.042759510,-0.301076354,0.786736923,0.768976235,-0.004049338,0.577436400
+                              ,1.281303178,0.081638643,0.323528409,-0.037552073,0.700950894,0.051583445
+                              ,-0.002369374,1.025067100,-0.829806908,0.759951587,-0.126659012,0.139548228
+                              ,1.776592281,-1.047810226,0.002268369,1.706443821,0.491150412,0.785840754
+                              ,-0.108426124,-0.364622100,-1.863405685,0.475659013,1.410155770,1.619192440
+                              ,0.145232489,0.390564220,0.078523202,1.246437519,-1.851728231,-0.702955879 };
+      data[1] = new double[] { 0.88684045,-1.64580307,1.35554664,0.99774740,-0.28673422,0.07218712,-0.57748503
+                              ,0.46563867,0.18205386,0.37696309,-0.67810720,-0.22694641,0.04085999,-0.01930002
+                              ,-1.14389989,-0.04909415,-0.05459455,-0.17639915,-0.16265625,0.07556000,-0.44700873
+                              ,-0.91181687,0.68196982,1.24826347,0.43507746,-0.09482412,0.78624477,0.34046540
+                              ,-0.62211625,-1.12255940,-0.63737143,0.68804212,-0.71520904,-1.53110842,-1.05479994
+                              ,-1.24221848,-0.45931126,-0.45559477,1.76679857,-0.77232782,1.13517674,-1.39495738
+                              ,-0.34197961,0.30465514,-0.53298790,0.50683810,-0.58359581,-0.25960696,-1.22998083
+                              ,0.65792853,1.26266806,1.74247915,0.58659782,0.30592475,-0.18126620,1.34782875
+                              ,0.15637320,0.37607185,-0.68933176,-1.24838659,0.65059380,-0.81253053,-1.69024871
+                              ,0.07260499,-1.63974258,0.16926860,1.57151501,-1.59405343,-0.07934909,-0.02262132
+                              ,-0.77291344,0.59094265,-0.27438763,-0.95374866,-0.22790924,-0.21198915,0.68324522
+                              ,-0.23775701,-1.16306273,-1.33217708,-0.11785916,0.85999469,0.01001755,-0.01307264 };
+      data[2] = new double[] { 1.211025191,0.958893913,-0.195330882,-2.169217166,0.001336114,1.216295531
+                              ,-0.973521915,0.365480774,-0.489803183,-1.673553315,2.003532021,1.423367551
+                              ,0.092679901,-1.491714972,-1.565832859,0.689337215,-1.204939599,0.598992068
+                              ,-1.261605940,0.890733253,3.334496751,0.817455786,0.441394621,-2.374263091
+                              ,-0.635907080,-1.283172539,-0.130218566,-0.169552228,0.177057474,-0.398655531
+                              ,1.151068075,1.700511574,-0.193563851,-0.970337200,-1.299506394,0.571352533
+                              ,0.304304277,-0.962776922,-0.160333430,0.727834694,-0.175105398,-2.029508526
+                              ,1.491111387,-1.584083346,0.662427657,1.500680474,0.820281659,-0.707746044
+                              ,-0.180426669,-1.259842785,0.050592502,0.476649763,0.368184886,1.482703173
+                              ,1.863034189,-0.833241981,1.602468694,0.155115911,-2.463551102,2.045183510
+                              ,-0.078774687,0.463642193,1.263807207,-0.635996999,-0.563708248,0.475730571
+                              ,-0.162671474,-0.682790861,-0.573510544,0.077701772,0.751698338,0.408727821
+                              ,-0.374242494,-0.002329019,-0.330893667,-0.488596854,-0.697768835,-1.356949810
+                              ,-0.947125493,2.087444922,0.271276104,-1.027604792,-0.364097727,-0.741089219};
+
+      Assert.AreEqual(0.0253, Math.Round(KruskalWallisTest.Test(data), 4));
+    }
+
+    //compares groups of normally and uniformly distributed random variables
+    [TestMethod]
+    public void KruskalWallisTest4() {
+      double[][] data = new double[3][];
+      data[0] = new double[] { 977,3848,2803,4097,3155,2745,25,3384,2587,1332,1407,2842,4089,4083,608,3246,1634
+                              ,3182,2856,1614,2627,1116,2659,1166,3299,2322,3681,2184,2470,4682,3305,2553,239,2847
+                              ,2733,8,2773,3215,1345,1037,1760,2729,984,648,1875,4852,1002,4106,3934,4542,3718
+                              ,67,4539,1862,1886,1299,4544,3463,4052,1934,728,2492,799,730,1896,468,4724,1329
+                              ,510,3952,2392,2812,330,94,1726,2542,926,1472,4014,812,1243,2274,2394,3120,1745
+                              ,2597,4331,2562,4814,239,1194,4843,4577,3277,3482,1381,4697,3878,500,2182};
+      data[1] = new double[] { 0.88684045,-1.64580307,1.35554664,0.99774740,-0.28673422,0.07218712,-0.57748503
+                              ,0.46563867,0.18205386,0.37696309,-0.67810720,-0.22694641,0.04085999,-0.01930002
+                              ,-1.14389989,-0.04909415,-0.05459455,-0.17639915,-0.16265625,0.07556000,-0.44700873
+                              ,-0.91181687,0.68196982,1.24826347,0.43507746,-0.09482412,0.78624477,0.34046540
+                              ,-0.62211625,-1.12255940,-0.63737143,0.68804212,-0.71520904,-1.53110842,-1.05479994
+                              ,-1.24221848,-0.45931126,-0.45559477,1.76679857,-0.77232782,1.13517674,-1.39495738
+                              ,-0.34197961,0.30465514,-0.53298790,0.50683810,-0.58359581,-0.25960696,-1.22998083
+                              ,0.65792853,1.26266806,1.74247915,0.58659782,0.30592475,-0.18126620,1.34782875
+                              ,0.15637320,0.37607185,-0.68933176,-1.24838659,0.65059380,-0.81253053,-1.69024871
+                              ,0.07260499,-1.63974258,0.16926860,1.57151501,-1.59405343,-0.07934909,-0.02262132
+                              ,-0.77291344,0.59094265,-0.27438763,-0.95374866,-0.22790924,-0.21198915,0.68324522
+                              ,-0.23775701,-1.16306273,-1.33217708,-0.11785916,0.85999469,0.01001755,-0.01307264 };
+      data[2] = new double[] { 1.211025191,0.958893913,-0.195330882,-2.169217166,0.001336114,1.216295531
+                              ,-0.973521915,0.365480774,-0.489803183,-1.673553315,2.003532021,1.423367551
+                              ,0.092679901,-1.491714972,-1.565832859,0.689337215,-1.204939599,0.598992068
+                              ,-1.261605940,0.890733253,3.334496751,0.817455786,0.441394621,-2.374263091
+                              ,-0.635907080,-1.283172539,-0.130218566,-0.169552228,0.177057474,-0.398655531
+                              ,1.151068075,1.700511574,-0.193563851,-0.970337200,-1.299506394,0.571352533
+                              ,0.304304277,-0.962776922,-0.160333430,0.727834694,-0.175105398,-2.029508526
+                              ,1.491111387,-1.584083346,0.662427657,1.500680474,0.820281659,-0.707746044
+                              ,-0.180426669,-1.259842785,0.050592502,0.476649763,0.368184886,1.482703173
+                              ,1.863034189,-0.833241981,1.602468694,0.155115911,-2.463551102,2.045183510
+                              ,-0.078774687,0.463642193,1.263807207,-0.635996999,-0.563708248,0.475730571
+                              ,-0.162671474,-0.682790861,-0.573510544,0.077701772,0.751698338,0.408727821
+                              ,-0.374242494,-0.002329019,-0.330893667,-0.488596854,-0.697768835,-1.356949810
+                              ,-0.947125493,2.087444922,0.271276104,-1.027604792,-0.364097727,-0.741089219};
+
+      var result = KruskalWallisTest.Test(data);
+      Assert.IsTrue(result.IsAlmost(2.2E-16));
+    }
+
+    //compares groups containing the same random variables
+    [TestMethod]
+    public void KruskalWallisTest5() {
+      double[][] data = new double[4][];
+      data[0] = new double[] { 1477,764,4731,1048,822,974,3302,2258,1946,3067,974,206,2439,3022,2714,2559,28
+                              ,2654,4588,3363,4750,1440,1892,3629,816,4317,34,2119,3290,1758};
+      data[1] = new double[] { 1477,764,4731,1048,822,974,3302,2258,1946,3067,974,206,2439,3022,2714,2559,28
+                              ,2654,4588,3363,4750,1440,1892,3629,816,4317,34,2119,3290,1758};
+      data[2] = new double[] {1477,764,4731,1048,822,974,3302,2258,1946,3067,974,206,2439,3022,2714,2559,28
+                              ,2654,4588,3363,4750,1440,1892,3629,816,4317,34,2119,3290,1758 };
+      data[3] = new double[] {1477,764,4731,1048,822,974,3302,2258,1946,3067,974,206,2439,3022,2714,2559,28
+                              ,2654,4588,3363,4750,1440,1892,3629,816,4317,34,2119,3290,1758 };
+
+      Assert.AreEqual(1, Math.Round(KruskalWallisTest.Test(data), 2));
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 11918)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 11919)
@@ -404,4 +404,8 @@
     <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessFunctionsTest.cs" />
     <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessRegressionTest.cs" />
+    <Compile Include="HeuristicLab.Analysis-3.3\BonferroniHolmUnitTests.cs" />
+    <Compile Include="HeuristicLab.Analysis-3.3\ConfidenceIntervalsTests.cs" />
+    <Compile Include="HeuristicLab.Analysis-3.3\EffectSizeUnitTests.cs" />
+    <Compile Include="HeuristicLab.Analysis-3.3\KruskalWallisUnitTests.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\MultidimensionalScalingTest.cs" />
     <Compile Include="HeuristicLab.Collections-3.3\BidirectionalDictionaryTest.cs" />
