Index: /branches/DataPreprocessing Cleanup/Build.cmd
===================================================================
--- /branches/DataPreprocessing Cleanup/Build.cmd	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/Build.cmd	(revision 15268)
@@ -0,0 +1,104 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Release]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Release
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :clean
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:clean
+IF "%~4"=="" GOTO :prompt_clean
+
+SET CLEANBEFOREBUILD=%~4
+GOTO :main
+
+:prompt_clean
+SET /P CLEANBEFOREBUILD=Would you like to clean before building [n]: 
+IF "%CLEANBEFOREBUILD%"=="" SET CLEANBEFOREBUILD=n
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%" NEQ "n" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: /branches/DataPreprocessing Cleanup/DataPreprocessing Cleanup.sln
===================================================================
--- /branches/DataPreprocessing Cleanup/DataPreprocessing Cleanup.sln	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/DataPreprocessing Cleanup.sln	(revision 15268)
@@ -0,0 +1,48 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.15
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DataPreprocessing-3.4", "HeuristicLab.DataPreprocessing\3.4\HeuristicLab.DataPreprocessing-3.4.csproj", "{3B90F866-70F8-43EF-A541-51819D255B7B}"
+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
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Debug|x64.ActiveCfg = Debug|x64
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Debug|x64.Build.0 = Debug|x64
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Debug|x86.ActiveCfg = Debug|x86
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Debug|x86.Build.0 = Debug|x86
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Release|x64.ActiveCfg = Release|x64
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Release|x64.Build.0 = Release|x64
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Release|x86.ActiveCfg = Release|x86
+		{3B90F866-70F8-43EF-A541-51819D255B7B}.Release|x86.Build.0 = Release|x86
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Debug|x64.ActiveCfg = Debug|x64
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Debug|x64.Build.0 = Debug|x64
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Debug|x86.ActiveCfg = Debug|x86
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Debug|x86.Build.0 = Debug|x86
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x64.ActiveCfg = Release|x64
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x64.Build.0 = Release|x64
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x86.ActiveCfg = Release|x86
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedFilterCollectionView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedFilterCollectionView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedFilterCollectionView.Designer.cs	(revision 15268)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class CheckedFilterCollectionView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedFilterCollectionView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedFilterCollectionView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedFilterCollectionView.cs	(revision 15268)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.DataPreprocessing.Filter;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("CheckedFilterCollection View")]
+  [Content(typeof(ICheckedItemCollection<>), false)]
+  [Content(typeof(CheckedItemCollection<>), false)]
+  public partial class CheckedFilterCollectionView : CheckedItemCollectionView<IFilter> {
+    public CheckedFilterCollectionView() {
+      InitializeComponent();
+    }
+
+    protected override void addButton_Click(object sender, EventArgs e) {
+      IFilter filter = CreateItem();
+      if (filter != null) {
+        Content.Add(filter);
+        Content.SetItemCheckedState(filter, false);
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.Designer.cs	(revision 15268)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class CheckedTransformationListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15268)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Reflection;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("CheckedTransformationList View")]
+  [Content(typeof(ICheckedItemList<ITransformation>), false)]
+  public partial class CheckedTransformationListView : CheckedItemListView<ITransformation> {
+    public CheckedTransformationListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Transformations";
+    }
+
+    protected override ITransformation CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Transformation";
+        typeSelectorDialog.TypeSelector.Caption = "Available Transformations";
+        typeSelectorDialog.TypeSelector.Configure(typeof(ITransformation), showNotInstantiableTypes: true, showGenericTypes: false, typeCondition: CanInstanciateTransformation);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          // TODO: Avoid accessing parent view
+          var transformationView = (TransformationView)Parent;
+          var columnNames = transformationView.Content.Data.VariableNames;
+
+          return (ITransformation)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType(new[] { columnNames });
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+
+    private bool CanInstanciateTransformation(Type type) {
+      foreach (ConstructorInfo ctor in type.GetConstructors(BindingFlags.Public | BindingFlags.Instance)) {
+        ParameterInfo[] parameters = ctor.GetParameters();
+        if (parameters.Length == 1 && parameters[0].ParameterType == typeof(IEnumerable<string>)) return true;
+      }
+      return false;
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.Designer.cs	(revision 15268)
@@ -0,0 +1,153 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class ComparisonFilterView {
+    /// <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();
+      this.lblAttr = new System.Windows.Forms.Label();
+      this.lblFilterOperation = new System.Windows.Forms.Label();
+      this.lblFilterData = new System.Windows.Forms.Label();
+      this.cbAttr = new System.Windows.Forms.ComboBox();
+      this.cbFilterOperation = new System.Windows.Forms.ComboBox();
+      this.tbFilterData = new System.Windows.Forms.TextBox();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // lblAttr
+      // 
+      this.lblAttr.AutoSize = true;
+      this.lblAttr.Location = new System.Drawing.Point(3, 15);
+      this.lblAttr.Name = "lblAttr";
+      this.lblAttr.Size = new System.Drawing.Size(49, 13);
+      this.lblAttr.TabIndex = 0;
+      this.lblAttr.Text = "Attribute:";
+      // 
+      // lblFilterOperation
+      // 
+      this.lblFilterOperation.AutoSize = true;
+      this.lblFilterOperation.Location = new System.Drawing.Point(3, 42);
+      this.lblFilterOperation.Name = "lblFilterOperation";
+      this.lblFilterOperation.Size = new System.Drawing.Size(81, 13);
+      this.lblFilterOperation.TabIndex = 1;
+      this.lblFilterOperation.Text = "Filter Operation:";
+      // 
+      // lblFilterData
+      // 
+      this.lblFilterData.AutoSize = true;
+      this.lblFilterData.Location = new System.Drawing.Point(3, 69);
+      this.lblFilterData.Name = "lblFilterData";
+      this.lblFilterData.Size = new System.Drawing.Size(58, 13);
+      this.lblFilterData.TabIndex = 2;
+      this.lblFilterData.Text = "Filter Data:";
+      // 
+      // cbAttr
+      // 
+      this.cbAttr.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.cbAttr.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cbAttr.FormattingEnabled = true;
+      this.cbAttr.Location = new System.Drawing.Point(92, 12);
+      this.cbAttr.Name = "cbAttr";
+      this.cbAttr.Size = new System.Drawing.Size(235, 21);
+      this.cbAttr.TabIndex = 3;
+      this.cbAttr.SelectedIndexChanged += new System.EventHandler(this.cbAttr_SelectedIndexChanged);
+      // 
+      // cbFilterOperation
+      // 
+      this.cbFilterOperation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.cbFilterOperation.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cbFilterOperation.FormattingEnabled = true;
+      this.cbFilterOperation.Location = new System.Drawing.Point(92, 39);
+      this.cbFilterOperation.Name = "cbFilterOperation";
+      this.cbFilterOperation.Size = new System.Drawing.Size(235, 21);
+      this.cbFilterOperation.TabIndex = 4;
+      this.cbFilterOperation.SelectedIndexChanged += new System.EventHandler(this.cbFilterOperation_SelectedIndexChanged);
+      // 
+      // tbFilterData
+      // 
+      this.tbFilterData.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tbFilterData.Location = new System.Drawing.Point(92, 67);
+      this.tbFilterData.Name = "tbFilterData";
+      this.tbFilterData.Size = new System.Drawing.Size(235, 20);
+      this.tbFilterData.TabIndex = 5;
+      this.tbFilterData.Validating += new System.ComponentModel.CancelEventHandler(this.tbFilterData_Validating);
+      this.tbFilterData.Validated += new System.EventHandler(this.tbFilterData_Validated);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // ComparisonFilterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tbFilterData);
+      this.Controls.Add(this.cbFilterOperation);
+      this.Controls.Add(this.cbAttr);
+      this.Controls.Add(this.lblFilterData);
+      this.Controls.Add(this.lblFilterOperation);
+      this.Controls.Add(this.lblAttr);
+      this.Name = "ComparisonFilterView";
+      this.Size = new System.Drawing.Size(348, 97);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label lblAttr;
+    private System.Windows.Forms.Label lblFilterOperation;
+    private System.Windows.Forms.Label lblFilterData;
+    private System.Windows.Forms.ComboBox cbAttr;
+    private System.Windows.Forms.ComboBox cbFilterOperation;
+    private System.Windows.Forms.TextBox tbFilterData;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.cs	(revision 15268)
@@ -0,0 +1,179 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.DataPreprocessing.Filter;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Comparison Filter View")]
+  [Content(typeof(ComparisonFilter), false)]
+  public partial class ComparisonFilterView : ItemView {
+    public new ComparisonFilter Content {
+      get { return (ComparisonFilter)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ComparisonFilterView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      cbAttr.Items.Clear();
+      cbFilterOperation.Items.Clear();
+      tbFilterData.Text = string.Empty;
+      if (Content != null) {
+        cbFilterOperation.Items.AddRange(Content.AllowedConstraintOperations.ToArray());
+        if (Content.ConstraintOperation != null)
+          cbFilterOperation.SelectedItem = Content.ConstraintOperation;
+        else if (cbFilterOperation.Items.Count != 0)
+          cbFilterOperation.SelectedIndex = 0;
+        UpdateColumnComboBox();
+        ReadOnly = Content.Active;
+        if (Content.ConstraintData != null) {
+          tbFilterData.Text = Content.ConstraintData.GetValue();
+        } else {
+          this.Content_ConstraintColumnChanged(cbAttr, EventArgs.Empty); // TODO
+        }
+      }
+      if (Content == null || Content.ConstraintData == null) {
+        tbFilterData.Text = string.Empty;
+      } else {
+        tbFilterData.Text = Content.ConstraintData.GetValue();
+      }
+    }
+
+    protected virtual void UpdateColumnComboBox() {
+      this.cbAttr.Items.Clear();
+      if (Content.ConstrainedValue != null) {
+        this.cbAttr.Items.AddRange(Content.ConstrainedValue.VariableNames.ToArray<string>());
+        this.cbAttr.SelectedItem = this.cbAttr.Items[Content.ConstraintColumn];
+        cbAttr.SelectedItem = Content.ConstraintColumn;
+        if (Content.ConstraintData != null)
+          tbFilterData.Text = Content.ConstraintData.GetValue();
+        else
+          this.Content_ConstraintColumnChanged(cbAttr, EventArgs.Empty);
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      this.Content.ActiveChanged += new EventHandler(Content_ActiveChanged);
+      this.Content.ConstraintOperationChanged += new EventHandler(Content_ComparisonOperationChanged);
+      this.Content.ConstraintColumnChanged += new EventHandler(Content_ConstraintColumnChanged);
+      this.Content.ConstrainedValueChanged += new EventHandler(Content_ConstrainedValueChanged);
+      this.Content.ConstraintDataChanged += new EventHandler(Content_ConstrainedDataChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      this.Content.ActiveChanged -= new EventHandler(Content_ActiveChanged);
+      this.Content.ConstraintOperationChanged -= new EventHandler(Content_ComparisonOperationChanged);
+      this.Content.ConstraintColumnChanged -= new EventHandler(Content_ConstraintColumnChanged);
+      this.Content.ConstrainedValueChanged -= new EventHandler(Content_ConstrainedValueChanged);
+      this.Content.ConstraintDataChanged -= new EventHandler(Content_ConstrainedDataChanged);
+    }
+
+    protected virtual void Content_ConstrainedValueChanged(object sender, EventArgs e) {
+      this.UpdateColumnComboBox();
+    }
+
+    private void Content_ConstrainedDataChanged(object sender, EventArgs e) {
+      if (Content.ConstraintData != null)
+        tbFilterData.Text = Content.ConstraintData.GetValue();
+      else
+        tbFilterData.Text = string.Empty;
+    }
+
+    protected virtual void Content_ConstraintColumnChanged(object sender, EventArgs e) {
+      if (Content.ConstrainedValue != null) {
+        if (cbAttr.Items.IndexOf(cbAttr.SelectedItem) != Content.ConstraintColumn) {
+          cbAttr.SelectedItem = this.cbAttr.Items[Content.ConstraintColumn];
+        }
+      }
+      if (Content.ConstraintData == null) {
+        this.Content.ConstraintData = CreateStringConvertibleValue(cbAttr.SelectedIndex);
+      }
+    }
+
+    protected virtual void Content_ComparisonOperationChanged(object sender, EventArgs e) {
+      if (Content.ConstraintOperation != (ConstraintOperation)this.cbFilterOperation.SelectedItem)
+        this.cbFilterOperation.SelectedItem = Content.ConstraintOperation;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      cbAttr.Enabled = Content != null && !Content.Active;
+      cbFilterOperation.Enabled = Content != null && !Content.Active;
+      tbFilterData.Enabled = Content != null && !Content.Active;
+    }
+
+    private void cbAttr_SelectedIndexChanged(object sender, EventArgs e) {
+      if (Content.ConstrainedValue != null) {
+        Content.ConstraintColumn = Content.ConstrainedValue.GetColumnIndex(cbAttr.SelectedItem.ToString());
+      }
+    }
+
+    private void cbFilterOperation_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.ConstraintOperation = (ConstraintOperation)this.cbFilterOperation.SelectedItem;
+    }
+
+    protected virtual void Content_ActiveChanged(object sender, EventArgs e) {
+      this.ReadOnly = !Content.Active;
+      SetEnabledStateOfControls();
+      Refresh(); ResumeRepaint(true);
+    }
+
+    private void tbFilterData_Validated(object sender, EventArgs e) {
+      IStringConvertibleValue value = CreateStringConvertibleValue(cbAttr.SelectedIndex);
+      value.SetValue(tbFilterData.Text);
+      Content.ConstraintData = value;
+    }
+
+    private IStringConvertibleValue CreateStringConvertibleValue(int columnIndex) {
+      IStringConvertibleValue value;
+      if (Content.ConstrainedValue.VariableHasType<double>(columnIndex)) {
+        value = new DoubleValue();
+      } else if (Content.ConstrainedValue.VariableHasType<String>(columnIndex)) {
+        value = new StringValue();
+      } else if (Content.ConstrainedValue.VariableHasType<DateTime>(columnIndex)) {
+        value = new DateTimeValue();
+      } else {
+        throw new ArgumentException("unsupported type");
+      }
+      return value;
+    }
+
+    private void tbFilterData_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      string errorMessage = string.Empty;
+      if (!Content.ConstraintData.Validate(tbFilterData.Text, out errorMessage)) {
+        errorProvider.SetError(tbFilterData, errorMessage);
+        e.Cancel = true;
+      } else
+        errorProvider.Clear();
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.Designer.cs	(revision 15268)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class DataCompletenessView {
+    /// <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 chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // chart
+      // 
+      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      chartArea1.Name = "ChartArea1";
+      this.chart.ChartAreas.Add(chartArea1);
+      legend1.Alignment = System.Drawing.StringAlignment.Center;
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.Name = "Legend1";
+      this.chart.Legends.Add(legend1);
+      this.chart.Location = new System.Drawing.Point(4, 4);
+      this.chart.Name = "chart";
+      this.chart.Size = new System.Drawing.Size(486, 337);
+      this.chart.TabIndex = 0;
+      this.chart.Text = "enhancedChart1";
+      // 
+      // DataCompletenessView
+      // 
+      this.Controls.Add(this.chart);
+      this.Name = "DataCompletenessView";
+      this.Size = new System.Drawing.Size(493, 344);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private Visualization.ChartControlsExtensions.EnhancedChart chart;
+
+
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.cs	(revision 15268)
@@ -0,0 +1,148 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Histogram View")]
+  [Content(typeof(DataCompletenessChartContent), true)]
+  public partial class DataCompletenessView : ItemView {
+    //series colors
+    private static readonly Color colorNonMissingValue = Color.CornflowerBlue;
+    private static readonly Color colorMissingValue = Color.Orange;
+
+    public new DataCompletenessChartContent Content {
+      get { return (DataCompletenessChartContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public DataCompletenessView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) return;
+      InitData();
+    }
+
+    private void InitData() {
+      IDictionary<int, IList<int>> missingValueIndices = Content.SearchLogic.GetMissingValueIndices();
+
+      bool[,] valueMissing = new bool[Content.SearchLogic.Rows, Content.SearchLogic.Columns];
+      foreach (var columnMissingValues in missingValueIndices) {
+        var column = columnMissingValues.Key;
+        foreach (var missingValueIndex in columnMissingValues.Value)
+          valueMissing[missingValueIndex, column] = true;
+      }
+
+      var yValuesPerColumn = ProcessMatrixForCharting(valueMissing);
+      PrepareChart();
+      CreateSeries(yValuesPerColumn);
+    }
+
+    private void PrepareChart() {
+      chart.EnableDoubleClickResetsZoom = true;
+      chart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 0;
+      chart.ChartAreas[0].AxisY.MajorGrid.LineWidth = 0;
+      chart.ChartAreas[0].AxisX.IsMarginVisible = false;
+      chart.ChartAreas[0].AxisY.IsMarginVisible = false;
+      chart.ChartAreas[0].CursorX.IsUserEnabled = true;
+      chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
+      chart.ChartAreas[0].CursorY.IsUserEnabled = true;
+      chart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
+      //custom x axis label
+      double from = 0.5;
+      foreach (String columnName in Content.SearchLogic.VariableNames) {
+        double to = from + 1;
+        chart.ChartAreas[0].AxisX.CustomLabels.Add(from, to, columnName);
+        from = to;
+      }
+      //custom y axis label
+      chart.ChartAreas[0].AxisY.IsReversed = true;
+    }
+
+    private void CreateSeries(List<List<int>> yValuesPerColumn) {
+      chart.Series.SuspendUpdates();
+      //prepare series
+      int seriesCount = DetermineSeriesCount(yValuesPerColumn);
+      for (int i = 0; i < seriesCount; i++) {
+        Series series = new Series(CreateSeriesName(i));
+        series.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedColumn;
+        series.IsVisibleInLegend = false;
+        series["PointWidth"] = "1.0";
+        series.IsVisibleInLegend = i < 2; //only first two series are visible, non-missing and missing values
+        series.Color = i % 2 == 0 ? colorNonMissingValue : colorMissingValue;
+
+        var values = yValuesPerColumn.Select(y => i < y.Count ? y[i] : 0).ToArray();
+        series.Points.DataBindY(values);
+        chart.Series.Add(series);
+      }
+      chart.Series.ResumeUpdates();
+    }
+
+    private String CreateSeriesName(int index) {
+      if (index == 0)
+        return "non-missing value";
+      else if (index == 1)
+        return "missing value";
+      return "series" + index;
+    }
+
+    #region data_preparation_for_chartseries
+    private int DetermineSeriesCount(List<List<int>> yValuesPerColumn) {
+      return yValuesPerColumn.Max(values => values.Count);
+    }
+
+    private List<List<int>> ProcessMatrixForCharting(bool[,] matrix) {
+      var columnsYValues = new List<List<int>>();
+      for (int column = 0; column < matrix.GetLength(1); column++) {
+        var yValues = new List<int>();
+        bool missingState = false;
+        int valueCount = 0;
+
+        for (int row = 0; row < matrix.GetLength(0); row++) {
+          if (missingState == matrix[row, column]) {
+            valueCount++;
+          } else {
+            yValues.Add(valueCount);
+            valueCount = 1;
+            missingState = !missingState;
+          }
+        }
+        yValues.Add(valueCount);
+        if (missingState) //handle last missing
+        {
+          yValues.Add(0);
+        }
+        columnsYValues.Add(yValues);
+      }
+      return columnsYValues;
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.Designer.cs	(revision 15268)
@@ -0,0 +1,372 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class DataGridContentView {
+    /// <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.btnApplySort = new System.Windows.Forms.Button();
+      this.contextMenuCell = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.replaceValueOverColumnToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.averageToolStripMenuItem_Column = new System.Windows.Forms.ToolStripMenuItem();
+      this.medianToolStripMenuItem_Column = new System.Windows.Forms.ToolStripMenuItem();
+      this.randomToolStripMenuItem_Column = new System.Windows.Forms.ToolStripMenuItem();
+      this.mostCommonToolStripMenuItem_Column = new System.Windows.Forms.ToolStripMenuItem();
+      this.interpolationToolStripMenuItem_Column = new System.Windows.Forms.ToolStripMenuItem();
+      this.smoothingToolStripMenuItem_Column = new System.Windows.Forms.ToolStripMenuItem();
+      this.replaceValueOverSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.averageToolStripMenuItem_Selection = new System.Windows.Forms.ToolStripMenuItem();
+      this.medianToolStripMenuItem_Selection = new System.Windows.Forms.ToolStripMenuItem();
+      this.randomToolStripMenuItem_Selection = new System.Windows.Forms.ToolStripMenuItem();
+      this.mostCommonToolStripMenuItem_Selection = new System.Windows.Forms.ToolStripMenuItem();
+      this.btnSearch = new System.Windows.Forms.Button();
+      this.btnReplace = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.addRowButton = new System.Windows.Forms.Button();
+      this.addColumnButton = new System.Windows.Forms.Button();
+      this.renameColumnsButton = new System.Windows.Forms.Button();
+      this.showVariablesGroupBox = new System.Windows.Forms.GroupBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.contextMenuCell.SuspendLayout();
+      this.showVariablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // rowsLabel
+      // 
+      this.rowsLabel.Size = new System.Drawing.Size(55, 13);
+      this.rowsLabel.Text = "Datarows:";
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
+      this.errorProvider.SetIconAlignment(this.rowsTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.rowsTextBox, 2);
+      this.rowsTextBox.Size = new System.Drawing.Size(71, 20);
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
+      this.columnsTextBox.Size = new System.Drawing.Size(71, 20);
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.Size = new System.Drawing.Size(53, 13);
+      this.columnsLabel.Text = "Variables:";
+      // 
+      // statisticsTextBox
+      // 
+      this.statisticsTextBox.Size = new System.Drawing.Size(421, 13);
+      // 
+      // btnApplySort
+      // 
+      this.btnApplySort.Location = new System.Drawing.Point(228, 0);
+      this.btnApplySort.Name = "btnApplySort";
+      this.btnApplySort.Size = new System.Drawing.Size(104, 23);
+      this.btnApplySort.TabIndex = 7;
+      this.btnApplySort.Text = "Apply Sort";
+      this.toolTip.SetToolTip(this.btnApplySort, "The current sorting is applied on the data itself.");
+      this.btnApplySort.UseVisualStyleBackColor = true;
+      this.btnApplySort.Click += new System.EventHandler(this.btnApplySort_Click);
+      // 
+      // contextMenuCell
+      // 
+      this.contextMenuCell.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.replaceValueOverColumnToolStripMenuItem,
+            this.replaceValueOverSelectionToolStripMenuItem});
+      this.contextMenuCell.Name = "contextMenuCell";
+      this.contextMenuCell.Size = new System.Drawing.Size(224, 48);
+      // 
+      // replaceValueOverColumnToolStripMenuItem
+      // 
+      this.replaceValueOverColumnToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.averageToolStripMenuItem_Column,
+            this.medianToolStripMenuItem_Column,
+            this.randomToolStripMenuItem_Column,
+            this.mostCommonToolStripMenuItem_Column,
+            this.interpolationToolStripMenuItem_Column,
+            this.smoothingToolStripMenuItem_Column});
+      this.replaceValueOverColumnToolStripMenuItem.Name = "replaceValueOverColumnToolStripMenuItem";
+      this.replaceValueOverColumnToolStripMenuItem.Size = new System.Drawing.Size(223, 22);
+      this.replaceValueOverColumnToolStripMenuItem.Text = "Replace Value over Variable";
+      // 
+      // averageToolStripMenuItem_Column
+      // 
+      this.averageToolStripMenuItem_Column.Name = "averageToolStripMenuItem_Column";
+      this.averageToolStripMenuItem_Column.Size = new System.Drawing.Size(155, 22);
+      this.averageToolStripMenuItem_Column.Text = "Average";
+      this.averageToolStripMenuItem_Column.Click += new System.EventHandler(this.ReplaceWithAverage_Column_Click);
+      // 
+      // medianToolStripMenuItem_Column
+      // 
+      this.medianToolStripMenuItem_Column.Name = "medianToolStripMenuItem_Column";
+      this.medianToolStripMenuItem_Column.Size = new System.Drawing.Size(155, 22);
+      this.medianToolStripMenuItem_Column.Text = "Median";
+      this.medianToolStripMenuItem_Column.Click += new System.EventHandler(this.ReplaceWithMedian_Column_Click);
+      // 
+      // randomToolStripMenuItem_Column
+      // 
+      this.randomToolStripMenuItem_Column.Name = "randomToolStripMenuItem_Column";
+      this.randomToolStripMenuItem_Column.Size = new System.Drawing.Size(155, 22);
+      this.randomToolStripMenuItem_Column.Text = "Random";
+      this.randomToolStripMenuItem_Column.Click += new System.EventHandler(this.ReplaceWithRandom_Column_Click);
+      // 
+      // mostCommonToolStripMenuItem_Column
+      // 
+      this.mostCommonToolStripMenuItem_Column.Name = "mostCommonToolStripMenuItem_Column";
+      this.mostCommonToolStripMenuItem_Column.Size = new System.Drawing.Size(155, 22);
+      this.mostCommonToolStripMenuItem_Column.Text = "Most Common";
+      this.mostCommonToolStripMenuItem_Column.Click += new System.EventHandler(this.ReplaceWithMostCommon_Column_Click);
+      // 
+      // interpolationToolStripMenuItem_Column
+      // 
+      this.interpolationToolStripMenuItem_Column.Name = "interpolationToolStripMenuItem_Column";
+      this.interpolationToolStripMenuItem_Column.Size = new System.Drawing.Size(155, 22);
+      this.interpolationToolStripMenuItem_Column.Text = "Interpolation";
+      this.interpolationToolStripMenuItem_Column.Click += new System.EventHandler(this.ReplaceWithInterpolation_Column_Click);
+      // 
+      // smoothingToolStripMenuItem_Column
+      // 
+      this.smoothingToolStripMenuItem_Column.Name = "smoothingToolStripMenuItem_Column";
+      this.smoothingToolStripMenuItem_Column.Size = new System.Drawing.Size(155, 22);
+      this.smoothingToolStripMenuItem_Column.Text = "Smoothing";
+      this.smoothingToolStripMenuItem_Column.Click += new System.EventHandler(this.ReplaceWithSmoothing_Selection_Click);
+      // 
+      // replaceValueOverSelectionToolStripMenuItem
+      // 
+      this.replaceValueOverSelectionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.averageToolStripMenuItem_Selection,
+            this.medianToolStripMenuItem_Selection,
+            this.randomToolStripMenuItem_Selection,
+            this.mostCommonToolStripMenuItem_Selection});
+      this.replaceValueOverSelectionToolStripMenuItem.Name = "replaceValueOverSelectionToolStripMenuItem";
+      this.replaceValueOverSelectionToolStripMenuItem.Size = new System.Drawing.Size(223, 22);
+      this.replaceValueOverSelectionToolStripMenuItem.Text = "Replace Value over Selection";
+      // 
+      // averageToolStripMenuItem_Selection
+      // 
+      this.averageToolStripMenuItem_Selection.Name = "averageToolStripMenuItem_Selection";
+      this.averageToolStripMenuItem_Selection.Size = new System.Drawing.Size(155, 22);
+      this.averageToolStripMenuItem_Selection.Text = "Average";
+      this.averageToolStripMenuItem_Selection.Click += new System.EventHandler(this.ReplaceWithAverage_Selection_Click);
+      // 
+      // medianToolStripMenuItem_Selection
+      // 
+      this.medianToolStripMenuItem_Selection.Name = "medianToolStripMenuItem_Selection";
+      this.medianToolStripMenuItem_Selection.Size = new System.Drawing.Size(155, 22);
+      this.medianToolStripMenuItem_Selection.Text = "Median";
+      this.medianToolStripMenuItem_Selection.Click += new System.EventHandler(this.ReplaceWithMedian_Selection_Click);
+      // 
+      // randomToolStripMenuItem_Selection
+      // 
+      this.randomToolStripMenuItem_Selection.Name = "randomToolStripMenuItem_Selection";
+      this.randomToolStripMenuItem_Selection.Size = new System.Drawing.Size(155, 22);
+      this.randomToolStripMenuItem_Selection.Text = "Random";
+      this.randomToolStripMenuItem_Selection.Click += new System.EventHandler(this.ReplaceWithRandom_Selection_Click);
+      // 
+      // mostCommonToolStripMenuItem_Selection
+      // 
+      this.mostCommonToolStripMenuItem_Selection.Name = "mostCommonToolStripMenuItem_Selection";
+      this.mostCommonToolStripMenuItem_Selection.Size = new System.Drawing.Size(155, 22);
+      this.mostCommonToolStripMenuItem_Selection.Text = "Most Common";
+      this.mostCommonToolStripMenuItem_Selection.Click += new System.EventHandler(this.ReplaceWithMostCommon_Selection_Click);
+      // 
+      // btnSearch
+      // 
+      this.btnSearch.Location = new System.Drawing.Point(167, 0);
+      this.btnSearch.Name = "btnSearch";
+      this.btnSearch.Size = new System.Drawing.Size(55, 23);
+      this.btnSearch.TabIndex = 8;
+      this.btnSearch.Text = "Search";
+      this.toolTip.SetToolTip(this.btnSearch, "Opens the Search dialog");
+      this.btnSearch.UseVisualStyleBackColor = true;
+      this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
+      // 
+      // btnReplace
+      // 
+      this.btnReplace.Location = new System.Drawing.Point(167, 26);
+      this.btnReplace.Name = "btnReplace";
+      this.btnReplace.Size = new System.Drawing.Size(55, 23);
+      this.btnReplace.TabIndex = 9;
+      this.btnReplace.Text = "Replace";
+      this.toolTip.SetToolTip(this.btnReplace, "Opens the Search & Replace dialog");
+      this.btnReplace.UseVisualStyleBackColor = true;
+      this.btnReplace.Click += new System.EventHandler(this.btnReplace_Click);
+      // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(36, 19);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Select Inputs & Target");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(66, 19);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "Select None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(6, 19);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.checkAllButton, "Select All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
+      // 
+      // addRowButton
+      // 
+      this.addRowButton.Location = new System.Drawing.Point(338, 26);
+      this.addRowButton.Name = "addRowButton";
+      this.addRowButton.Size = new System.Drawing.Size(83, 23);
+      this.addRowButton.TabIndex = 10;
+      this.addRowButton.Text = "Add Datarow";
+      this.addRowButton.UseVisualStyleBackColor = true;
+      this.addRowButton.Click += new System.EventHandler(this.addRowButton_Click);
+      // 
+      // addColumnButton
+      // 
+      this.addColumnButton.Location = new System.Drawing.Point(338, 0);
+      this.addColumnButton.Name = "addColumnButton";
+      this.addColumnButton.Size = new System.Drawing.Size(83, 23);
+      this.addColumnButton.TabIndex = 10;
+      this.addColumnButton.Text = "Add Variable";
+      this.addColumnButton.UseVisualStyleBackColor = true;
+      this.addColumnButton.Click += new System.EventHandler(this.addColumnButton_Click);
+      // 
+      // renameColumnsButton
+      // 
+      this.renameColumnsButton.Location = new System.Drawing.Point(228, 26);
+      this.renameColumnsButton.Name = "renameColumnsButton";
+      this.renameColumnsButton.Size = new System.Drawing.Size(104, 23);
+      this.renameColumnsButton.TabIndex = 11;
+      this.renameColumnsButton.Text = "Rename Variables";
+      this.renameColumnsButton.UseVisualStyleBackColor = true;
+      this.renameColumnsButton.Click += new System.EventHandler(this.renameColumnsButton_Click);
+      // 
+      // showVariablesGroupBox
+      // 
+      this.showVariablesGroupBox.Controls.Add(this.checkInputsTargetButton);
+      this.showVariablesGroupBox.Controls.Add(this.uncheckAllButton);
+      this.showVariablesGroupBox.Controls.Add(this.checkAllButton);
+      this.showVariablesGroupBox.Location = new System.Drawing.Point(448, 0);
+      this.showVariablesGroupBox.Name = "showVariablesGroupBox";
+      this.showVariablesGroupBox.Size = new System.Drawing.Size(97, 49);
+      this.showVariablesGroupBox.TabIndex = 17;
+      this.showVariablesGroupBox.TabStop = false;
+      this.showVariablesGroupBox.Text = "Show Variables";
+      // 
+      // DataGridContentView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.showVariablesGroupBox);
+      this.Controls.Add(this.renameColumnsButton);
+      this.Controls.Add(this.addColumnButton);
+      this.Controls.Add(this.addRowButton);
+      this.Controls.Add(this.btnReplace);
+      this.Controls.Add(this.btnSearch);
+      this.Controls.Add(this.btnApplySort);
+      this.Name = "DataGridContentView";
+      this.Controls.SetChildIndex(this.btnApplySort, 0);
+      this.Controls.SetChildIndex(this.btnSearch, 0);
+      this.Controls.SetChildIndex(this.btnReplace, 0);
+      this.Controls.SetChildIndex(this.addRowButton, 0);
+      this.Controls.SetChildIndex(this.addColumnButton, 0);
+      this.Controls.SetChildIndex(this.renameColumnsButton, 0);
+      this.Controls.SetChildIndex(this.statisticsTextBox, 0);
+      this.Controls.SetChildIndex(this.rowsLabel, 0);
+      this.Controls.SetChildIndex(this.columnsLabel, 0);
+      this.Controls.SetChildIndex(this.rowsTextBox, 0);
+      this.Controls.SetChildIndex(this.columnsTextBox, 0);
+      this.Controls.SetChildIndex(this.showVariablesGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.contextMenuCell.ResumeLayout(false);
+      this.showVariablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnApplySort;
+    private System.Windows.Forms.ContextMenuStrip contextMenuCell;
+    private System.Windows.Forms.ToolStripMenuItem replaceValueOverColumnToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem averageToolStripMenuItem_Column;
+    private System.Windows.Forms.ToolStripMenuItem medianToolStripMenuItem_Column;
+    private System.Windows.Forms.ToolStripMenuItem randomToolStripMenuItem_Column;
+    private System.Windows.Forms.ToolStripMenuItem mostCommonToolStripMenuItem_Column;
+    private System.Windows.Forms.ToolStripMenuItem interpolationToolStripMenuItem_Column;
+    private System.Windows.Forms.ToolStripMenuItem replaceValueOverSelectionToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem averageToolStripMenuItem_Selection;
+    private System.Windows.Forms.ToolStripMenuItem medianToolStripMenuItem_Selection;
+    private System.Windows.Forms.ToolStripMenuItem randomToolStripMenuItem_Selection;
+    private System.Windows.Forms.ToolStripMenuItem mostCommonToolStripMenuItem_Selection;
+    private System.Windows.Forms.Button btnSearch;
+    private System.Windows.Forms.Button btnReplace;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ToolStripMenuItem smoothingToolStripMenuItem_Column;
+    private System.Windows.Forms.Button addRowButton;
+    private System.Windows.Forms.Button addColumnButton;
+    private System.Windows.Forms.Button renameColumnsButton;
+    private System.Windows.Forms.GroupBox showVariablesGroupBox;
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs	(revision 15268)
@@ -0,0 +1,713 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 HeuristicLab.Data;
+using HeuristicLab.Data.Views;
+using HeuristicLab.DataPreprocessing.Filter;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Data Grid Content View")]
+  [Content(typeof(DataGridContent), true)]
+  public partial class DataGridContentView : StringConvertibleMatrixView {
+    private bool isSearching = false;
+    private bool updateOnMouseUp = false;
+    private SearchAndReplaceDialog findAndReplaceDialog;
+    private IFindPreprocessingItemsIterator searchIterator;
+    private string currentSearchText;
+    private ComparisonOperation currentComparisonOperation;
+    private Tuple<int, int> currentCell;
+
+    public new DataGridContent Content {
+      get { return (DataGridContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    private IDictionary<int, IList<int>> _highlightedCellsBackground;
+    public IDictionary<int, IList<int>> HightlightedCellsBackground {
+      get { return _highlightedCellsBackground; }
+      set {
+        _highlightedCellsBackground = value;
+        Refresh();
+      }
+    }
+
+    public DataGridContentView() {
+      InitializeComponent();
+      dataGridView.MouseDown += dataGridView_MouseDown;
+      dataGridView.CellMouseClick += dataGridView_CellMouseClick;
+      dataGridView.RowHeaderMouseClick += dataGridView_RowHeaderMouseClick;
+      dataGridView.MouseUp += dataGridView_MouseUp;
+      contextMenuCell.Items.Add(ShowHideColumns);
+      _highlightedCellsBackground = new Dictionary<int, IList<int>>();
+      currentCell = null;
+    }
+
+    protected override void OnContentChanged() {
+      List<KeyValuePair<int, SortOrder>> order = new List<KeyValuePair<int, SortOrder>>(base.sortedColumnIndices);
+      base.OnContentChanged();
+
+      DataGridView.RowHeadersWidth = 70;
+
+      if (Content == null && findAndReplaceDialog != null) {
+        findAndReplaceDialog.Close();
+      }
+
+      if (Content != null) {
+        base.sortedColumnIndices = order;
+        base.Sort();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Changed += Content_Changed;
+      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.Changed -= Content_Changed;
+      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
+    }
+
+    private void FilterLogic_FilterChanged(object sender, EventArgs e) {
+      OnContentChanged();
+      searchIterator = null;
+      if (findAndReplaceDialog != null && !findAndReplaceDialog.IsDisposed) {
+        if (Content.FilterLogic.IsFiltered) {
+          findAndReplaceDialog.DisableReplace();
+        } else {
+          findAndReplaceDialog.EnableReplace();
+        }
+      }
+      btnReplace.Enabled = !Content.FilterLogic.IsFiltered;
+    }
+
+    private void Content_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      OnContentChanged();
+      searchIterator = null;
+    }
+
+    protected override void dataGridView_SelectionChanged(object sender, EventArgs e) {
+      base.dataGridView_SelectionChanged(sender, e);
+      if (Content != null && dataGridView.RowCount != 0 && dataGridView.ColumnCount != 0)
+        Content.Selection = GetSelectedCells();
+    }
+
+    //couldn't use base.dataGridView_CellValidating as the values have to be validated per column individually
+    protected override void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (dataGridView.ReadOnly) return;
+      if (Content == null) return;
+      if (Content.Rows == 0 || Content.Columns == 0) return;
+
+      string errorMessage;
+      if (!String.IsNullOrEmpty(e.FormattedValue.ToString())) {
+        if (dataGridView.IsCurrentCellInEditMode && Content.FilterLogic.IsFiltered) {
+          errorMessage = "A filter is active, you cannot modify data. Press ESC to exit edit mode.";
+        } else {
+          Content.Validate(e.FormattedValue.ToString(), out errorMessage, e.ColumnIndex);
+        }
+
+        if (!String.IsNullOrEmpty(errorMessage)) {
+          e.Cancel = true;
+          dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+        }
+
+      }
+    }
+
+    protected override void PasteValuesToDataGridView() {
+      string[,] values = SplitClipboardString(Clipboard.GetText());
+      if (values.Length == 0) return;
+      int rowIndex = 0;
+      int columnIndex = 0;
+      if (dataGridView.CurrentCell != null) {
+        rowIndex = dataGridView.CurrentCell.RowIndex;
+        columnIndex = dataGridView.CurrentCell.ColumnIndex;
+      }
+
+      bool containsHeader = false;
+      var firstRow = Enumerable.Range(0, values.GetLength(0)).Select(col => values[col, 0]).ToList();
+      if ((Content.Selection.Values.Sum(s => s.Count) == Content.Rows * Content.Columns)
+          || (rowIndex == 0 && columnIndex == 0 && Content.Rows <= values.GetLength(1) && Content.Columns <= values.GetLength(0))) {
+        // All is selected -or- top left selected and everything will be replaced
+        double temp;
+        containsHeader = !firstRow.All(string.IsNullOrEmpty) && firstRow.Any(r => !double.TryParse(r, out temp));
+        if (containsHeader)
+          rowIndex = columnIndex = 0;
+      }
+
+      int newRows = values.GetLength(1) + rowIndex - (containsHeader ? 1 : 0);
+      int newColumns = values.GetLength(0) + columnIndex;
+      if (Content.Rows < newRows) Content.Rows = newRows;
+      if (Content.Columns < newColumns) Content.Columns = newColumns;
+
+      ReplaceTransaction(() => {
+        Content.PreProcessingData.InTransaction(() => {
+          for (int row = containsHeader ? 1 : 0; row < values.GetLength(1); row++) {
+            for (int col = 0; col < values.GetLength(0); col++) {
+              Content.SetValue(values[col, row], row + rowIndex - (containsHeader ? 1 : 0), col + columnIndex);
+            }
+          }
+          if (containsHeader) {
+            for (int i = 0; i < firstRow.Count; i++)
+              if (string.IsNullOrWhiteSpace(firstRow[i]))
+                firstRow[i] = string.Format("<{0}>", i);
+            Content.PreProcessingData.RenameColumns(firstRow);
+          }
+        });
+      });
+
+      ClearSorting();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      rowsTextBox.ReadOnly = true;
+      columnsTextBox.ReadOnly = true;
+    }
+
+    protected override int[] Sort(IEnumerable<KeyValuePair<int, SortOrder>> sortedColumns) {
+      btnApplySort.Enabled = sortedColumns.Any();
+      return base.Sort(sortedColumns);
+    }
+
+    protected override void ClearSorting() {
+      btnApplySort.Enabled = false;
+      base.ClearSorting();
+    }
+
+    //Necessary so that dataGridView.SelectedRows and SelectedColumns are populated correctly
+    //further information: https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.selectedcolumns.aspx
+    private void dataGridView_MouseDown(object sender, MouseEventArgs e) {
+      var hitTestInfo = dataGridView.HitTest(e.X, e.Y);
+      // row header click
+      if (hitTestInfo.ColumnIndex == -1 && hitTestInfo.RowIndex >= 0) {
+        if (dataGridView.SelectionMode != DataGridViewSelectionMode.RowHeaderSelect) {
+          dataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
+        }
+      }
+      // column header click
+      if (hitTestInfo.RowIndex == -1 && hitTestInfo.ColumnIndex >= 0) {
+        if (dataGridView.SelectionMode != DataGridViewSelectionMode.ColumnHeaderSelect) {
+          dataGridView.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
+        }
+      }
+    }
+
+    protected override void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (Content == null) return;
+
+      if (e.Button == MouseButtons.Middle) {
+        int newIndex = e.ColumnIndex >= 0 ? e.ColumnIndex : 0;
+        Content.PreProcessingData.InsertColumn<double>(newIndex.ToString(), newIndex);
+      } else if (e.Button == MouseButtons.Right && Content.SortableView) {
+        SortColumn(e.ColumnIndex);
+      }
+
+      searchIterator = null;
+    }
+    private void dataGridView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (Content != null) {
+        if (e.Button == MouseButtons.Middle) {
+          int newIndex = e.RowIndex >= 0 ? e.RowIndex : 0;
+          Content.PreProcessingData.InsertRow(newIndex);
+        }
+      }
+    }
+
+    private void dataGridView_MouseUp(object sender, MouseEventArgs e) {
+      if (!updateOnMouseUp)
+        return;
+
+      updateOnMouseUp = false;
+      dataGridView_SelectionChanged(sender, e);
+    }
+
+    private void btnApplySort_Click(object sender, System.EventArgs e) {
+      Content.ManipulationLogic.ReOrderToIndices(virtualRowIndices);
+      OnContentChanged();
+    }
+
+    #region FindAndReplaceDialog
+
+    private void CreateFindAndReplaceDialog() {
+      if (findAndReplaceDialog == null || findAndReplaceDialog.IsDisposed) {
+        findAndReplaceDialog = new SearchAndReplaceDialog();
+        findAndReplaceDialog.Show(this);
+        if (AreMultipleCellsSelected()) {
+          ResetHighlightedCellsBackground();
+          HightlightedCellsBackground = GetSelectedCells();
+          dataGridView.ClearSelection();
+        }
+        findAndReplaceDialog.FindAllEvent += findAndReplaceDialog_FindAllEvent;
+        findAndReplaceDialog.FindNextEvent += findAndReplaceDialog_FindNextEvent;
+        findAndReplaceDialog.ReplaceAllEvent += findAndReplaceDialog_ReplaceAllEvent;
+        findAndReplaceDialog.ReplaceNextEvent += findAndReplaceDialog_ReplaceEvent;
+        findAndReplaceDialog.FormClosing += findAndReplaceDialog_FormClosing;
+        searchIterator = null;
+        DataGridView.SelectionChanged += DataGridView_SelectionChanged_FindAndReplace;
+        if (Content.FilterLogic.IsFiltered) {
+          findAndReplaceDialog.DisableReplace();
+        }
+      }
+    }
+
+    private void DataGridView_SelectionChanged_FindAndReplace(object sender, EventArgs e) {
+      if (Content != null) {
+        if (!isSearching && AreMultipleCellsSelected()) {
+          ResetHighlightedCellsBackground();
+          HightlightedCellsBackground = GetSelectedCells();
+          searchIterator = null;
+        }
+      }
+    }
+
+    void findAndReplaceDialog_FormClosing(object sender, FormClosingEventArgs e) {
+      ResetHighlightedCellsBackground();
+      searchIterator = null;
+      DataGridView.SelectionChanged -= DataGridView_SelectionChanged_FindAndReplace;
+    }
+
+    void findAndReplaceDialog_ReplaceEvent(object sender, EventArgs e) {
+      if (searchIterator != null && searchIterator.GetCurrent() != null) {
+        Replace(TransformToDictionary(currentCell));
+      }
+    }
+
+    void findAndReplaceDialog_ReplaceAllEvent(object sender, EventArgs e) {
+      Replace(FindAll(findAndReplaceDialog.GetSearchText()));
+    }
+
+    void findAndReplaceDialog_FindNextEvent(object sender, EventArgs e) {
+      if (searchIterator == null
+        || currentSearchText != findAndReplaceDialog.GetSearchText()
+        || currentComparisonOperation != findAndReplaceDialog.GetComparisonOperation()) {
+
+        searchIterator = new FindPreprocessingItemsIterator(FindAll(findAndReplaceDialog.GetSearchText()));
+        currentSearchText = findAndReplaceDialog.GetSearchText();
+        currentComparisonOperation = findAndReplaceDialog.GetComparisonOperation();
+      }
+
+      if (IsOneCellSelected()) {
+        var first = GetSelectedCells().First();
+        searchIterator.SetStartCell(first.Key, first.Value[0]);
+      }
+
+      bool moreOccurences = false;
+      currentCell = searchIterator.GetCurrent();
+      moreOccurences = searchIterator.MoveNext();
+      if (IsOneCellSelected() && currentCell != null) {
+        var first = GetSelectedCells().First();
+        if (currentCell.Item1 == first.Key && currentCell.Item2 == first.Value[0]) {
+          if (!moreOccurences) {
+            searchIterator.Reset();
+          }
+          currentCell = searchIterator.GetCurrent();
+          moreOccurences = searchIterator.MoveNext();
+          if (!moreOccurences) {
+            searchIterator.Reset();
+          }
+        }
+      }
+
+      dataGridView.ClearSelection();
+
+      if (currentCell != null) {
+        dataGridView[currentCell.Item1, currentCell.Item2].Selected = true;
+        dataGridView.CurrentCell = dataGridView[currentCell.Item1, currentCell.Item2];
+      }
+    }
+
+    private bool AreMultipleCellsSelected() {
+      return GetSelectedCellCount() > 1;
+    }
+
+    private bool IsOneCellSelected() {
+      return GetSelectedCellCount() == 1;
+    }
+
+    private int GetSelectedCellCount() {
+      int count = 0;
+      foreach (var column in GetSelectedCells()) {
+        count += column.Value.Count();
+      }
+      return count;
+    }
+
+    void findAndReplaceDialog_FindAllEvent(object sender, EventArgs e) {
+      dataGridView.ClearSelection();
+      isSearching = true;
+      SuspendRepaint();
+      var selectedCells = FindAll(findAndReplaceDialog.GetSearchText());
+      foreach (var column in selectedCells) {
+        foreach (var cell in column.Value) {
+          dataGridView[column.Key, cell].Selected = true;
+        }
+      }
+      ResumeRepaint(true);
+      isSearching = false;
+      Content.Selection = selectedCells;
+      //update statistic in base
+      base.dataGridView_SelectionChanged(sender, e);
+    }
+
+    private Core.ConstraintOperation GetConstraintOperation(ComparisonOperation comparisonOperation) {
+      Core.ConstraintOperation constraintOperation = Core.ConstraintOperation.Equal;
+      switch (comparisonOperation) {
+        case ComparisonOperation.Equal:
+          constraintOperation = Core.ConstraintOperation.Equal;
+          break;
+        case ComparisonOperation.Greater:
+          constraintOperation = Core.ConstraintOperation.Greater;
+          break;
+        case ComparisonOperation.GreaterOrEqual:
+          constraintOperation = Core.ConstraintOperation.GreaterOrEqual;
+          break;
+        case ComparisonOperation.Less:
+          constraintOperation = Core.ConstraintOperation.Less;
+          break;
+        case ComparisonOperation.LessOrEqual:
+          constraintOperation = Core.ConstraintOperation.LessOrEqual;
+          break;
+        case ComparisonOperation.NotEqual:
+          constraintOperation = Core.ConstraintOperation.NotEqual;
+          break;
+      }
+      return constraintOperation;
+    }
+
+    private IDictionary<int, IList<int>> FindAll(string match) {
+      bool searchInSelection = HightlightedCellsBackground.Values.Sum(list => list.Count) > 1;
+      ComparisonOperation comparisonOperation = findAndReplaceDialog.GetComparisonOperation();
+      var foundCells = new Dictionary<int, IList<int>>();
+      for (int i = 0; i < Content.FilterLogic.PreprocessingData.Columns; i++) {
+        var filters = CreateFilters(match, comparisonOperation, i);
+
+        bool[] filteredRows = Content.FilterLogic.GetFilterResult(filters, true);
+        var foundIndices = new List<int>();
+        for (int idx = 0; idx < filteredRows.Length; ++idx) {
+          var notFilteredThusFound = !filteredRows[idx];
+          if (notFilteredThusFound) {
+            foundIndices.Add(idx);
+          }
+        }
+        foundCells[i] = foundIndices;
+        IList<int> selectedList;
+        if (searchInSelection && HightlightedCellsBackground.TryGetValue(i, out selectedList)) {
+          foundCells[i] = foundCells[i].Intersect(selectedList).ToList<int>();
+        } else if (searchInSelection) {
+          foundCells[i].Clear();
+        }
+      }
+      return MapToSorting(foundCells);
+    }
+
+    private List<IFilter> CreateFilters(string match, ComparisonOperation comparisonOperation, int columnIndex) {
+      IPreprocessingData preprocessingData = Content.FilterLogic.PreprocessingData;
+      IStringConvertibleValue value;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        value = new DoubleValue();
+      } else if (preprocessingData.VariableHasType<String>(columnIndex)) {
+        value = new StringValue();
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        value = new DateTimeValue();
+      } else {
+        throw new ArgumentException("unsupported type");
+      }
+      value.SetValue(match);
+      var comparisonFilter = new ComparisonFilter(preprocessingData, GetConstraintOperation(comparisonOperation), value, true);
+      comparisonFilter.ConstraintColumn = columnIndex;
+      return new List<Filter.IFilter>() { comparisonFilter };
+    }
+
+    private IDictionary<int, IList<int>> MapToSorting(Dictionary<int, IList<int>> foundCells) {
+      if (sortedColumnIndices.Count == 0) {
+        return foundCells;
+      } else {
+        var sortedFoundCells = new Dictionary<int, IList<int>>();
+
+        var indicesToVirtual = new Dictionary<int, int>();
+        for (int i = 0; i < virtualRowIndices.Length; ++i) {
+          indicesToVirtual.Add(virtualRowIndices[i], i);
+        }
+
+        foreach (var entry in foundCells) {
+          var cells = new List<int>();
+          foreach (var cell in entry.Value) {
+            cells.Add(indicesToVirtual[cell]);
+          }
+          cells.Sort();
+          sortedFoundCells.Add(entry.Key, cells);
+        }
+        return sortedFoundCells;
+      }
+    }
+
+    private void Replace(IDictionary<int, IList<int>> cells) {
+      if (findAndReplaceDialog != null) {
+        ReplaceTransaction(() => {
+          switch (findAndReplaceDialog.GetReplaceAction()) {
+            case ReplaceAction.Value:
+              Content.ManipulationLogic.ReplaceIndicesByValue(cells, findAndReplaceDialog.GetReplaceText());
+              break;
+            case ReplaceAction.Average:
+              Content.ManipulationLogic.ReplaceIndicesByAverageValue(cells, false);
+              break;
+            case ReplaceAction.Median:
+              Content.ManipulationLogic.ReplaceIndicesByMedianValue(cells, false);
+              break;
+            case ReplaceAction.Random:
+              Content.ManipulationLogic.ReplaceIndicesByRandomValue(cells, false);
+              break;
+            case ReplaceAction.MostCommon:
+              Content.ManipulationLogic.ReplaceIndicesByMostCommonValue(cells, false);
+              break;
+            case ReplaceAction.Interpolation:
+              Content.ManipulationLogic.ReplaceIndicesByLinearInterpolationOfNeighbours(cells);
+              break;
+          }
+        });
+      }
+    }
+
+    private IDictionary<int, IList<int>> TransformToDictionary(Tuple<int, int> tuple) {
+      var highlightCells = new Dictionary<int, IList<int>>();
+      highlightCells.Add(tuple.Item1, new List<int>() { tuple.Item2 });
+      return highlightCells;
+    }
+
+    private void ResetHighlightedCellsBackground() {
+      HightlightedCellsBackground = new Dictionary<int, IList<int>>();
+    }
+
+    #endregion FindAndReplaceDialog
+
+    private void dataGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (Content == null) return;
+      if (e.Button == MouseButtons.Right && !(e.ColumnIndex != -1 && e.RowIndex == -1)) {
+        if (e.ColumnIndex == -1 || e.RowIndex == -1) {
+          replaceValueOverColumnToolStripMenuItem.Visible = false;
+          contextMenuCell.Show(MousePosition);
+        } else {
+          if (!dataGridView.SelectedCells.Contains(dataGridView[e.ColumnIndex, e.RowIndex])) {
+            dataGridView.ClearSelection();
+            dataGridView[e.ColumnIndex, e.RowIndex].Selected = true;
+          }
+
+          var columnIndices = new HashSet<int>();
+          for (int i = 0; i < dataGridView.SelectedCells.Count; i++) {
+            columnIndices.Add(dataGridView.SelectedCells[i].ColumnIndex);
+          }
+
+          replaceValueOverSelectionToolStripMenuItem.Enabled = AreMultipleCellsSelected();
+
+          averageToolStripMenuItem_Column.Enabled =
+            averageToolStripMenuItem_Selection.Enabled =
+            medianToolStripMenuItem_Column.Enabled =
+            medianToolStripMenuItem_Selection.Enabled =
+            randomToolStripMenuItem_Column.Enabled =
+            randomToolStripMenuItem_Selection.Enabled = !Content.PreProcessingData.AreAllStringColumns(columnIndices);
+
+          smoothingToolStripMenuItem_Column.Enabled =
+            interpolationToolStripMenuItem_Column.Enabled = !dataGridView.SelectedCells.Contains(dataGridView[e.ColumnIndex, 0])
+            && !dataGridView.SelectedCells.Contains(dataGridView[e.ColumnIndex, Content.Rows - 1])
+            && !Content.PreProcessingData.AreAllStringColumns(columnIndices);
+
+          replaceValueOverColumnToolStripMenuItem.Visible = true;
+          contextMenuCell.Show(MousePosition);
+        }
+      }
+    }
+
+    protected override void dataGridView_KeyDown(object sender, KeyEventArgs e) {
+      base.dataGridView_KeyDown(sender, e);
+      //data is in read only mode....
+      if (Content.FilterLogic.IsFiltered) return;
+
+      if (e.KeyCode == Keys.Delete) {
+        //Delete column
+        if (dataGridView.SelectedColumns.Count > 0) {
+          var columnsToDelete = dataGridView.SelectedColumns.Cast<DataGridViewColumn>().OrderByDescending(col => col.Index).ToList();
+          foreach (var col in columnsToDelete)
+            Content.DeleteColumn(col.Index);
+        }
+        //Delete row
+        if (dataGridView.SelectedRows.Count > 0) {
+          //necessary if columns are sorted to translate the selected row index
+          var rowIndexes = dataGridView.SelectedRows.Cast<DataGridViewRow>().Select(row => GetRowIndex(row.Index)).ToList();
+          Content.DeleteRows(rowIndexes);
+        }
+      } else if (e.Control && e.KeyCode == Keys.F) {
+        CreateFindAndReplaceDialog();
+        findAndReplaceDialog.ActivateSearch();
+      } else if (e.Control && e.KeyCode == Keys.R) {
+        CreateFindAndReplaceDialog();
+        findAndReplaceDialog.ActivateReplace();
+      }
+    }
+
+    private IDictionary<int, IList<int>> GetSelectedCells() {
+      IDictionary<int, IList<int>> selectedCells = new Dictionary<int, IList<int>>();
+
+      //special case if all cells are selected
+      if (dataGridView.AreAllCellsSelected(true)) {
+        for (int i = 0; i < Content.Columns; i++)
+          selectedCells[i] = Enumerable.Range(0, Content.Rows).ToList();
+        return selectedCells;
+      }
+
+      foreach (var selectedCell in dataGridView.SelectedCells) {
+        var cell = (DataGridViewCell)selectedCell;
+        if (!selectedCells.ContainsKey(cell.ColumnIndex))
+          selectedCells.Add(cell.ColumnIndex, new List<int>(1024));
+        selectedCells[cell.ColumnIndex].Add(cell.RowIndex);
+      }
+
+      return selectedCells;
+    }
+
+    private void StartReplacing() {
+      SuspendRepaint();
+    }
+
+    private void StopReplacing() {
+      ResumeRepaint(true);
+    }
+
+    private void ReplaceTransaction(Action action) {
+      StartReplacing();
+      action();
+      StopReplacing();
+    }
+
+    private void btnSearch_Click(object sender, EventArgs e) {
+      CreateFindAndReplaceDialog();
+      findAndReplaceDialog.ActivateSearch();
+    }
+
+    private void btnReplace_Click(object sender, EventArgs e) {
+      CreateFindAndReplaceDialog();
+      findAndReplaceDialog.ActivateReplace();
+    }
+
+    #region ContextMenu Events
+
+    private void ReplaceWithAverage_Column_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByAverageValue(GetSelectedCells(), false);
+      });
+    }
+    private void ReplaceWithAverage_Selection_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByAverageValue(GetSelectedCells(), true);
+      });
+    }
+
+    private void ReplaceWithMedian_Column_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByMedianValue(GetSelectedCells(), false);
+      });
+    }
+    private void ReplaceWithMedian_Selection_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByMedianValue(GetSelectedCells(), true);
+      });
+    }
+
+    private void ReplaceWithRandom_Column_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByRandomValue(GetSelectedCells(), false);
+      });
+    }
+    private void ReplaceWithRandom_Selection_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByRandomValue(GetSelectedCells(), true);
+      });
+    }
+
+    private void ReplaceWithMostCommon_Column_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByMostCommonValue(GetSelectedCells(), false);
+      });
+    }
+    private void ReplaceWithMostCommon_Selection_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByMostCommonValue(GetSelectedCells(), true);
+      });
+    }
+
+    private void ReplaceWithInterpolation_Column_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesByLinearInterpolationOfNeighbours(GetSelectedCells());
+      });
+    }
+
+    private void ReplaceWithSmoothing_Selection_Click(object sender, EventArgs e) {
+      ReplaceTransaction(() => {
+        Content.ManipulationLogic.ReplaceIndicesBySmoothing(GetSelectedCells());
+      });
+    }
+    #endregion
+
+    private void addRowButton_Click(object sender, EventArgs e) {
+      Content.PreProcessingData.InsertRow(Content.Rows);
+    }
+
+    private void addColumnButton_Click(object sender, EventArgs e) {
+      Content.PreProcessingData.InsertColumn<double>(Content.Columns.ToString(), Content.Columns);
+    }
+
+    private void renameColumnsButton_Click(object sender, EventArgs e) {
+      var renameDialog = new RenameColumnsDialog(Content.ColumnNames);
+
+      if (renameDialog.ShowDialog(this) == DialogResult.OK) {
+        Content.PreProcessingData.RenameColumns(renameDialog.ColumnNames);
+      }
+    }
+
+    private void checkInputsTargetButton_Click(object sender, EventArgs e) {
+      foreach (DataGridViewColumn column in DataGridView.Columns) {
+        var variable = column.HeaderText;
+        bool isInputTarget = Content.PreProcessingData.InputVariables.Contains(variable)
+          || Content.PreProcessingData.TargetVariable == variable;
+        column.Visible = isInputTarget;
+      }
+    }
+
+    private void checkAllButton_Click(object sender, EventArgs e) {
+      foreach (DataGridViewColumn column in DataGridView.Columns) {
+        column.Visible = true;
+      }
+    }
+
+    private void uncheckAllButton_Click(object sender, EventArgs e) {
+      foreach (DataGridViewColumn column in DataGridView.Columns) {
+        column.Visible = false;
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingMenuItem.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingMenuItem.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingMenuItem.cs	(revision 15268)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimizer;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  public class DataPreprocessingMenuItem {
+    internal class CreateExperimentMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+      public override string Name {
+        get { return "Data &Preprocessing"; }
+      }
+      public override IEnumerable<string> Structure {
+        get { return new string[] { "&Edit", "&Data Analysis" }; }
+      }
+      public override int Position {
+        get { return 5500; }
+      }
+      public override string ToolTipText {
+        get { return "Create a new data preprocessing"; }
+      }
+
+      public override void Execute() {
+        MainFormManager.MainForm.ShowContent(new PreprocessingContext(new RegressionProblemData()));
+      }
+
+      public override Keys ShortCutKeys {
+        get { return Keys.Control | Keys.D; }
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 15268)
@@ -0,0 +1,280 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.IO;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis.Views;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("DataPreprocessing View")]
+  [Content(typeof(PreprocessingContext), true)]
+  public partial class DataPreprocessingView : NamedItemView {
+    public new PreprocessingContext Content {
+      get { return (PreprocessingContext)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public DataPreprocessingView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        var data = Content.Data;
+        var filterLogic = new FilterLogic(data);
+        var searchLogic = new SearchLogic(data, filterLogic);
+        var statisticsLogic = new StatisticsLogic(data, searchLogic);
+        var manipulationLogic = new ManipulationLogic(data, searchLogic, statisticsLogic);
+
+        var viewShortcuts = new ItemList<IViewShortcut> {
+          new DataGridContent(data, manipulationLogic, filterLogic),
+          new StatisticsContent(data, statisticsLogic),
+
+          new LineChartContent(data),
+          new HistogramContent(data),
+          new SingleScatterPlotContent(data),
+          new MultiScatterPlotContent(data),
+          new CorrelationMatrixContent(Content),
+          new DataCompletenessChartContent(searchLogic),
+
+          new FilterContent(filterLogic),
+          new ManipulationContent(manipulationLogic, searchLogic, filterLogic),
+          new TransformationContent(data, filterLogic)
+        };
+
+        viewShortcutListView.Content = viewShortcuts.AsReadOnly();
+        viewShortcutListView.ItemsListView.Items[0].Selected = true;
+        viewShortcutListView.Select();
+
+        applyTypeContextMenuStrip.Items.Clear();
+        exportTypeContextMenuStrip.Items.Clear();
+        foreach (var exportOption in Content.GetSourceExportOptions()) {
+          var applyMenuItem = new ToolStripMenuItem(exportOption.Key) { Tag = exportOption.Value };
+          applyMenuItem.Click += applyToolStripMenuItem_Click;
+          applyTypeContextMenuStrip.Items.Add(applyMenuItem);
+
+          var exportMenuItem = new ToolStripMenuItem(exportOption.Key) { Tag = exportOption.Value };
+          exportMenuItem.Click += exportToolStripMenuItem_Click;
+          exportTypeContextMenuStrip.Items.Add(exportMenuItem);
+        }
+        var exportCsvMenuItem = new ToolStripMenuItem(".csv");
+        exportCsvMenuItem.Click += exportCsvMenuItem_Click;
+        exportTypeContextMenuStrip.Items.Add(exportCsvMenuItem);
+      } else {
+        viewShortcutListView.Content = null;
+      }
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Reset += Content_Reset;
+      Content.Data.FilterChanged += Data_FilterChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.Reset -= Content_Reset;
+      Content.Data.FilterChanged -= Data_FilterChanged;
+    }
+
+    void Content_Reset(object sender, EventArgs e) {
+      OnContentChanged(); // Reset by setting new content
+    }
+
+    void Data_FilterChanged(object sender, EventArgs e) {
+      lblFilterActive.Visible = Content.Data.IsFiltered;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      viewShortcutListView.Enabled = Content != null;
+      applyInNewTabButton.Enabled = Content != null;
+      exportProblemButton.Enabled = Content != null && Content.CanExport;
+      undoButton.Enabled = Content != null;
+    }
+
+    #region New
+    private void newButton_Click(object sender, EventArgs e) {
+      newProblemDataTypeContextMenuStrip.Show(Cursor.Position);
+    }
+    private void newRegressionToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (CheckNew("Regression"))
+        Content.Import(new RegressionProblemData());
+    }
+    private void newClassificationToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (CheckNew("Classification"))
+        Content.Import(new ClassificationProblemData());
+    }
+    private void newTimeSeriesToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (CheckNew("Time Series Prognosis"))
+        Content.Import(new TimeSeriesPrognosisProblemData());
+    }
+
+    private bool CheckNew(string type) {
+      return DialogResult.OK == MessageBox.Show(
+               this,
+               string.Format("When creating a new {0}, all previous information will be lost.", type),
+               "Continue?",
+               MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
+    }
+    #endregion
+
+    #region Import
+    private void importButton_Click(object sender, EventArgs e) {
+      importProblemDataTypeContextMenuStrip.Show(Cursor.Position);
+    }
+    private void importRegressionToolStripMenuItem_Click(object sender, EventArgs e) {
+      Import(new RegressionCSVInstanceProvider(), new RegressionImportDialog(),
+        (dialog => ((RegressionImportDialog)dialog).ImportType));
+    }
+    private void importClassificationToolStripMenuItem_Click(object sender, EventArgs e) {
+      Import(new ClassificationCSVInstanceProvider(), new ClassificationImportDialog(),
+        (dialog => ((ClassificationImportDialog)dialog).ImportType));
+    }
+    private void importTimeSeriesToolStripMenuItem_Click(object sender, EventArgs e) {
+      Import(new TimeSeriesPrognosisCSVInstanceProvider(), new TimeSeriesPrognosisImportDialog(),
+        (dialog => ((TimeSeriesPrognosisImportDialog)dialog).ImportType));
+    }
+    private void Import<TProblemData, TImportType>(DataAnalysisInstanceProvider<TProblemData, TImportType> instanceProvider, DataAnalysisImportDialog importDialog,
+      Func<DataAnalysisImportDialog, TImportType> getImportType)
+      where TProblemData : class, IDataAnalysisProblemData
+      where TImportType : DataAnalysisImportType {
+      if (importDialog.ShowDialog() == DialogResult.OK) {
+        Task.Run(() => {
+          TProblemData instance;
+          var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
+          // lock active view and show progress bar
+          var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
+
+          try {
+            var progress = mainForm.AddOperationProgressToContent(activeView.Content, "Loading problem instance.");
+
+            instanceProvider.ProgressChanged += (o, args) => { progress.ProgressValue = args.ProgressPercentage / 100.0; };
+
+            instance = instanceProvider.ImportData(importDialog.Path, getImportType(importDialog), importDialog.CSVFormat);
+          } catch (IOException ex) {
+            MessageBox.Show(string.Format("There was an error parsing the file: {0}", Environment.NewLine + ex.Message), "Error while parsing", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            return;
+          }
+          try {
+            Content.Import(instance);
+          } catch (IOException ex) {
+            MessageBox.Show(string.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(importDialog.Path), Environment.NewLine + ex.Message), "Cannot load instance");
+          } finally {
+            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+          }
+        });
+      }
+    }
+    #endregion
+
+    #region Apply
+    private void applyInNewTabButton_Click(object sender, EventArgs e) {
+      applyTypeContextMenuStrip.Show(Cursor.Position);
+    }
+    private void applyToolStripMenuItem_Click(object sender, EventArgs e) {
+      var menuItem = (ToolStripMenuItem)sender;
+      var itemCreator = (Func<IItem>)menuItem.Tag;
+      MainFormManager.MainForm.ShowContent(itemCreator());
+    }
+    #endregion
+
+    #region Export
+    private void exportProblemButton_Click(object sender, EventArgs e) {
+      exportTypeContextMenuStrip.Show(Cursor.Position);
+    }
+    private void exportToolStripMenuItem_Click(object sender, EventArgs e) {
+      var menuItem = (ToolStripMenuItem)sender;
+      var itemCreator = (Func<IItem>)menuItem.Tag;
+      var saveFileDialog = new SaveFileDialog {
+        Title = "Save Item",
+        DefaultExt = "hl",
+        Filter = "Uncompressed HeuristicLab Files|*.hl|HeuristicLab Files|*.hl|All Files|*.*",
+        FilterIndex = 2
+      };
+
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        Task.Run(() => {
+          bool compressed = saveFileDialog.FilterIndex != 1;
+          var storable = itemCreator() as IStorableContent;
+          if (storable != null) {
+            var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
+            var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
+            try {
+              mainForm.AddOperationProgressToContent(activeView.Content, "Exporting data.");
+              ContentManager.Save(storable, saveFileDialog.FileName, compressed);
+            } finally {
+              mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            }
+          }
+        });
+      }
+    }
+    private void exportCsvMenuItem_Click(object sender, EventArgs e) {
+      var saveFileDialog = new SaveFileDialog {
+        Title = "Save Data",
+        DefaultExt = "csv",
+        Filter = "CSV files|*.csv|All files|*.*",
+        FilterIndex = 1
+      };
+
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        Task.Run(() => {
+          var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
+          var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
+          try {
+            var problemData = Content.CreateNewProblemData();
+            mainForm.AddOperationProgressToContent(activeView.Content, "Exporting data.");
+            if (problemData is TimeSeriesPrognosisProblemData)
+              Export(new TimeSeriesPrognosisCSVInstanceProvider(), problemData, saveFileDialog.FileName);
+            else if (problemData is RegressionProblemData)
+              Export(new RegressionCSVInstanceProvider(), problemData, saveFileDialog.FileName);
+            else if (problemData is ClassificationProblemData)
+              Export(new ClassificationCSVInstanceProvider(), problemData, saveFileDialog.FileName);
+          } finally {
+            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+          }
+        });
+      }
+    }
+    private void Export<TProblemData, TImportType>(DataAnalysisInstanceProvider<TProblemData, TImportType> instanceProvider,
+      IDataAnalysisProblemData problemData, string path)
+      where TProblemData : class, IDataAnalysisProblemData where TImportType : DataAnalysisImportType {
+      instanceProvider.ExportData((TProblemData)problemData, path);
+    }
+    #endregion
+
+    #region Undo / Redo
+    private void undoButton_Click(object sender, EventArgs e) {
+      Content.Data.Undo();
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.designer.cs	(revision 15268)
@@ -0,0 +1,293 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class DataPreprocessingView {
+    /// <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.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DataPreprocessingView));
+      this.undoButton = new System.Windows.Forms.Button();
+      this.applyInNewTabButton = new System.Windows.Forms.Button();
+      this.exportProblemButton = new System.Windows.Forms.Button();
+      this.lblFilterActive = new System.Windows.Forms.Label();
+      this.redoButton = new System.Windows.Forms.Button();
+      this.newButton = new System.Windows.Forms.Button();
+      this.importButton = new System.Windows.Forms.Button();
+      this.newProblemDataTypeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.newRegressionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.newClassificationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.newTimeSeriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.importProblemDataTypeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.importRegressionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.importClassificationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.importTimeSeriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewShortcutListView = new HeuristicLab.DataPreprocessing.Views.ViewShortcutListView();
+      this.applyTypeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.exportTypeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.newProblemDataTypeContextMenuStrip.SuspendLayout();
+      this.importProblemDataTypeContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(755, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(819, 3);
+      // 
+      // undoButton
+      // 
+      this.undoButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Undo;
+      this.undoButton.Location = new System.Drawing.Point(131, 26);
+      this.undoButton.Name = "undoButton";
+      this.undoButton.Size = new System.Drawing.Size(24, 24);
+      this.undoButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.undoButton, "Undo");
+      this.undoButton.UseVisualStyleBackColor = true;
+      this.undoButton.Click += new System.EventHandler(this.undoButton_Click);
+      // 
+      // applyInNewTabButton
+      // 
+      this.applyInNewTabButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.applyInNewTabButton.Location = new System.Drawing.Point(69, 26);
+      this.applyInNewTabButton.Name = "applyInNewTabButton";
+      this.applyInNewTabButton.Size = new System.Drawing.Size(24, 24);
+      this.applyInNewTabButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.applyInNewTabButton, "Apply in new Tab");
+      this.applyInNewTabButton.UseVisualStyleBackColor = true;
+      this.applyInNewTabButton.Click += new System.EventHandler(this.applyInNewTabButton_Click);
+      // 
+      // exportProblemButton
+      // 
+      this.exportProblemButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.SaveAs;
+      this.exportProblemButton.Location = new System.Drawing.Point(99, 26);
+      this.exportProblemButton.Name = "exportProblemButton";
+      this.exportProblemButton.Size = new System.Drawing.Size(24, 24);
+      this.exportProblemButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.exportProblemButton, "Export to File");
+      this.exportProblemButton.UseVisualStyleBackColor = true;
+      this.exportProblemButton.Click += new System.EventHandler(this.exportProblemButton_Click);
+      // 
+      // lblFilterActive
+      // 
+      this.lblFilterActive.AutoSize = true;
+      this.lblFilterActive.Location = new System.Drawing.Point(203, 31);
+      this.lblFilterActive.Name = "lblFilterActive";
+      this.lblFilterActive.Size = new System.Drawing.Size(277, 13);
+      this.lblFilterActive.TabIndex = 5;
+      this.lblFilterActive.Text = "Attention! The data is read-only, because a filter is active.";
+      this.lblFilterActive.Visible = false;
+      // 
+      // redoButton
+      // 
+      this.redoButton.Enabled = false;
+      this.redoButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Redo;
+      this.redoButton.Location = new System.Drawing.Point(161, 26);
+      this.redoButton.Name = "redoButton";
+      this.redoButton.Size = new System.Drawing.Size(24, 24);
+      this.redoButton.TabIndex = 6;
+      this.toolTip.SetToolTip(this.redoButton, "Redo (not implemented yet)");
+      this.redoButton.UseVisualStyleBackColor = true;
+      // 
+      // newButton
+      // 
+      this.newButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.NewDocument;
+      this.newButton.Location = new System.Drawing.Point(6, 26);
+      this.newButton.Name = "newButton";
+      this.newButton.Size = new System.Drawing.Size(24, 24);
+      this.newButton.TabIndex = 3;
+      this.newButton.UseVisualStyleBackColor = true;
+      this.newButton.Click += new System.EventHandler(this.newButton_Click);
+      // 
+      // importButton
+      // 
+      this.importButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.importButton.Location = new System.Drawing.Point(36, 26);
+      this.importButton.Name = "importButton";
+      this.importButton.Size = new System.Drawing.Size(24, 24);
+      this.importButton.TabIndex = 3;
+      this.importButton.UseVisualStyleBackColor = true;
+      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      // 
+      // newProblemDataTypeContextMenuStrip
+      // 
+      this.newProblemDataTypeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newRegressionToolStripMenuItem,
+            this.newClassificationToolStripMenuItem,
+            this.newTimeSeriesToolStripMenuItem});
+      this.newProblemDataTypeContextMenuStrip.Name = "newProblemDataTypeContextMenuStrip";
+      this.newProblemDataTypeContextMenuStrip.Size = new System.Drawing.Size(190, 70);
+      // 
+      // newRegressionToolStripMenuItem
+      // 
+      this.newRegressionToolStripMenuItem.Name = "newRegressionToolStripMenuItem";
+      this.newRegressionToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+      this.newRegressionToolStripMenuItem.Text = "Regression";
+      this.newRegressionToolStripMenuItem.Click += new System.EventHandler(this.newRegressionToolStripMenuItem_Click);
+      // 
+      // newClassificationToolStripMenuItem
+      // 
+      this.newClassificationToolStripMenuItem.Name = "newClassificationToolStripMenuItem";
+      this.newClassificationToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+      this.newClassificationToolStripMenuItem.Text = "Classification";
+      this.newClassificationToolStripMenuItem.Click += new System.EventHandler(this.newClassificationToolStripMenuItem_Click);
+      // 
+      // newTimeSeriesToolStripMenuItem
+      // 
+      this.newTimeSeriesToolStripMenuItem.Name = "newTimeSeriesToolStripMenuItem";
+      this.newTimeSeriesToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+      this.newTimeSeriesToolStripMenuItem.Text = "Time Series Prognosis";
+      this.newTimeSeriesToolStripMenuItem.Click += new System.EventHandler(this.newTimeSeriesToolStripMenuItem_Click);
+      // 
+      // importProblemDataTypeContextMenuStrip
+      // 
+      this.importProblemDataTypeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.importRegressionToolStripMenuItem,
+            this.importClassificationToolStripMenuItem,
+            this.importTimeSeriesToolStripMenuItem});
+      this.importProblemDataTypeContextMenuStrip.Name = "newProblemDataTypeContextMenuStrip";
+      this.importProblemDataTypeContextMenuStrip.Size = new System.Drawing.Size(190, 92);
+      // 
+      // importRegressionToolStripMenuItem
+      // 
+      this.importRegressionToolStripMenuItem.Name = "importRegressionToolStripMenuItem";
+      this.importRegressionToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+      this.importRegressionToolStripMenuItem.Text = "Regression";
+      this.importRegressionToolStripMenuItem.Click += new System.EventHandler(this.importRegressionToolStripMenuItem_Click);
+      // 
+      // importClassificationToolStripMenuItem
+      // 
+      this.importClassificationToolStripMenuItem.Name = "importClassificationToolStripMenuItem";
+      this.importClassificationToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+      this.importClassificationToolStripMenuItem.Text = "Classification";
+      this.importClassificationToolStripMenuItem.Click += new System.EventHandler(this.importClassificationToolStripMenuItem_Click);
+      // 
+      // importTimeSeriesToolStripMenuItem
+      // 
+      this.importTimeSeriesToolStripMenuItem.Name = "importTimeSeriesToolStripMenuItem";
+      this.importTimeSeriesToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+      this.importTimeSeriesToolStripMenuItem.Text = "Time Series Prognosis";
+      this.importTimeSeriesToolStripMenuItem.Click += new System.EventHandler(this.importTimeSeriesToolStripMenuItem_Click);
+      // 
+      // viewShortcutListView
+      // 
+      this.viewShortcutListView.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.viewShortcutListView.Caption = "ViewShortcutCollection View";
+      this.viewShortcutListView.Content = null;
+      this.viewShortcutListView.Location = new System.Drawing.Point(4, 56);
+      this.viewShortcutListView.Name = "viewShortcutListView";
+      this.viewShortcutListView.ReadOnly = false;
+      this.viewShortcutListView.Size = new System.Drawing.Size(831, 390);
+      this.viewShortcutListView.TabIndex = 7;
+      // 
+      // applyTypeContextMenuStrip
+      // 
+      this.applyTypeContextMenuStrip.Name = "newProblemDataTypeContextMenuStrip";
+      this.applyTypeContextMenuStrip.Size = new System.Drawing.Size(61, 4);
+      // 
+      // exportTypeContextMenuStrip
+      // 
+      this.exportTypeContextMenuStrip.Name = "newProblemDataTypeContextMenuStrip";
+      this.exportTypeContextMenuStrip.Size = new System.Drawing.Size(61, 4);
+      // 
+      // DataPreprocessingView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.newButton);
+      this.Controls.Add(this.importButton);
+      this.Controls.Add(this.applyInNewTabButton);
+      this.Controls.Add(this.exportProblemButton);
+      this.Controls.Add(this.undoButton);
+      this.Controls.Add(this.redoButton);
+      this.Controls.Add(this.lblFilterActive);
+      this.Controls.Add(this.viewShortcutListView);
+      this.Name = "DataPreprocessingView";
+      this.Size = new System.Drawing.Size(838, 449);
+      this.Controls.SetChildIndex(this.viewShortcutListView, 0);
+      this.Controls.SetChildIndex(this.lblFilterActive, 0);
+      this.Controls.SetChildIndex(this.redoButton, 0);
+      this.Controls.SetChildIndex(this.undoButton, 0);
+      this.Controls.SetChildIndex(this.exportProblemButton, 0);
+      this.Controls.SetChildIndex(this.applyInNewTabButton, 0);
+      this.Controls.SetChildIndex(this.importButton, 0);
+      this.Controls.SetChildIndex(this.newButton, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.newProblemDataTypeContextMenuStrip.ResumeLayout(false);
+      this.importProblemDataTypeContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button exportProblemButton;
+    private System.Windows.Forms.Button applyInNewTabButton;
+    private System.Windows.Forms.Button undoButton;
+    private ViewShortcutListView viewShortcutListView;
+    private System.Windows.Forms.Label lblFilterActive;
+    private System.Windows.Forms.Button redoButton;
+    private System.Windows.Forms.Button newButton;
+    private System.Windows.Forms.Button importButton;
+    private System.Windows.Forms.ContextMenuStrip newProblemDataTypeContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem newRegressionToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem newClassificationToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem newTimeSeriesToolStripMenuItem;
+    private System.Windows.Forms.ContextMenuStrip importProblemDataTypeContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem importRegressionToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem importClassificationToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem importTimeSeriesToolStripMenuItem;
+    private System.Windows.Forms.ContextMenuStrip applyTypeContextMenuStrip;
+    private System.Windows.Forms.ContextMenuStrip exportTypeContextMenuStrip;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessorStarter.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessorStarter.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessorStarter.cs	(revision 15268)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Views;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  public class DataPreprocessorStarter : IDataPreprocessorStarter {
+    public void Start(IDataAnalysisProblemData problemData, IContentView currentView) {
+      IAlgorithm algorithm;
+      IDataAnalysisProblem problem;
+      GetMostOuterContent(currentView as Control, out algorithm, out problem);
+      var context = new PreprocessingContext(problemData, algorithm ?? problem ?? problemData as IItem);
+      MainFormManager.MainForm.ShowContent(context);
+    }
+
+    private void GetMostOuterContent(Control control, out IAlgorithm algorithm, out IDataAnalysisProblem problem) {
+      algorithm = null;
+      problem = null;
+
+      while (control != null) {
+        var contentView = control as IContentView;
+        if (contentView != null) {
+          var newAlgorithm = contentView.Content as IAlgorithm;
+          if (newAlgorithm != null)
+            algorithm = newAlgorithm;
+          var newProblem = contentView.Content as IDataAnalysisProblem;
+          if (newProblem != null)
+            problem = newProblem;
+        }
+        control = control.Parent;
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.Designer.cs	(revision 15268)
@@ -0,0 +1,318 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class FilterView {
+    /// <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.groupBoxFilter = new System.Windows.Forms.GroupBox();
+      this.checkedFilterView = new HeuristicLab.DataPreprocessing.Views.CheckedFilterCollectionView();
+      this.groupBoxFilterInfo = new System.Windows.Forms.GroupBox();
+      this.lblPercentage = new System.Windows.Forms.Label();
+      this.tbPercentage = new System.Windows.Forms.TextBox();
+      this.tbRemaining = new System.Windows.Forms.TextBox();
+      this.lblRemaining = new System.Windows.Forms.Label();
+      this.tbTotal = new System.Windows.Forms.TextBox();
+      this.lblTotal = new System.Windows.Forms.Label();
+      this.applyFilterButton = new System.Windows.Forms.Button();
+      this.rBtnOr = new System.Windows.Forms.RadioButton();
+      this.rBtnAnd = new System.Windows.Forms.RadioButton();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.bottomPanel = new System.Windows.Forms.Panel();
+      this.groupBoxFilter.SuspendLayout();
+      this.groupBoxFilterInfo.SuspendLayout();
+      this.groupBox1.SuspendLayout();
+      this.bottomPanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // groupBoxFilter
+      // 
+      this.groupBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBoxFilter.Controls.Add(this.checkedFilterView);
+      this.groupBoxFilter.Location = new System.Drawing.Point(4, 4);
+      this.groupBoxFilter.Name = "groupBoxFilter";
+      this.groupBoxFilter.Size = new System.Drawing.Size(658, 327);
+      this.groupBoxFilter.TabIndex = 0;
+      this.groupBoxFilter.TabStop = false;
+      this.groupBoxFilter.Text = "Filter";
+      // 
+      // checkedFilterView
+      // 
+      this.checkedFilterView.Caption = "filterView";
+      this.checkedFilterView.Content = null;
+      this.checkedFilterView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.checkedFilterView.Location = new System.Drawing.Point(3, 16);
+      this.checkedFilterView.Name = "checkedFilterView";
+      this.checkedFilterView.ReadOnly = false;
+      this.checkedFilterView.ShowDetails = true;
+      this.checkedFilterView.Size = new System.Drawing.Size(652, 308);
+      this.checkedFilterView.TabIndex = 0;
+      // 
+      // groupBoxFilterInfo
+      // 
+      this.groupBoxFilterInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBoxFilterInfo.Controls.Add(this.lblPercentage);
+      this.groupBoxFilterInfo.Controls.Add(this.tbPercentage);
+      this.groupBoxFilterInfo.Controls.Add(this.tbRemaining);
+      this.groupBoxFilterInfo.Controls.Add(this.lblRemaining);
+      this.groupBoxFilterInfo.Controls.Add(this.tbTotal);
+      this.groupBoxFilterInfo.Controls.Add(this.lblTotal);
+      this.groupBoxFilterInfo.Location = new System.Drawing.Point(4, 337);
+      this.groupBoxFilterInfo.Name = "groupBoxFilterInfo";
+      this.groupBoxFilterInfo.Size = new System.Drawing.Size(658, 102);
+      this.groupBoxFilterInfo.TabIndex = 1;
+      this.groupBoxFilterInfo.TabStop = false;
+      this.groupBoxFilterInfo.Text = "Filter Preview";
+      // 
+      // lblPercentage
+      // 
+      this.lblPercentage.AutoSize = true;
+      this.lblPercentage.Location = new System.Drawing.Point(15, 74);
+      this.lblPercentage.Name = "lblPercentage";
+      this.lblPercentage.Size = new System.Drawing.Size(65, 13);
+      this.lblPercentage.TabIndex = 11;
+      this.lblPercentage.Text = "Percentage:";
+      // 
+      // tbPercentage
+      // 
+      this.tbPercentage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tbPercentage.Enabled = false;
+      this.tbPercentage.Location = new System.Drawing.Point(104, 71);
+      this.tbPercentage.Name = "tbPercentage";
+      this.tbPercentage.Size = new System.Drawing.Size(548, 20);
+      this.tbPercentage.TabIndex = 10;
+      // 
+      // tbRemaining
+      // 
+      this.tbRemaining.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tbRemaining.Enabled = false;
+      this.tbRemaining.Location = new System.Drawing.Point(104, 45);
+      this.tbRemaining.Name = "tbRemaining";
+      this.tbRemaining.Size = new System.Drawing.Size(548, 20);
+      this.tbRemaining.TabIndex = 9;
+      // 
+      // lblRemaining
+      // 
+      this.lblRemaining.AutoSize = true;
+      this.lblRemaining.Location = new System.Drawing.Point(15, 47);
+      this.lblRemaining.Name = "lblRemaining";
+      this.lblRemaining.Size = new System.Drawing.Size(60, 13);
+      this.lblRemaining.TabIndex = 8;
+      this.lblRemaining.Text = "Remaining:";
+      // 
+      // tbTotal
+      // 
+      this.tbTotal.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tbTotal.Enabled = false;
+      this.tbTotal.Location = new System.Drawing.Point(104, 19);
+      this.tbTotal.Name = "tbTotal";
+      this.tbTotal.Size = new System.Drawing.Size(548, 20);
+      this.tbTotal.TabIndex = 7;
+      // 
+      // lblTotal
+      // 
+      this.lblTotal.AutoSize = true;
+      this.lblTotal.Location = new System.Drawing.Point(15, 21);
+      this.lblTotal.Name = "lblTotal";
+      this.lblTotal.Size = new System.Drawing.Size(34, 13);
+      this.lblTotal.TabIndex = 6;
+      this.lblTotal.Text = "Total:";
+      // 
+      // applyFilterButton
+      // 
+      this.applyFilterButton.Anchor = System.Windows.Forms.AnchorStyles.Right;
+      this.applyFilterButton.Cursor = System.Windows.Forms.Cursors.Default;
+      this.applyFilterButton.Enabled = false;
+      this.applyFilterButton.Location = new System.Drawing.Point(559, 3);
+      this.applyFilterButton.Name = "applyFilterButton";
+      this.applyFilterButton.Size = new System.Drawing.Size(107, 23);
+      this.applyFilterButton.TabIndex = 2;
+      this.applyFilterButton.Text = "Apply Filters";
+      this.applyFilterButton.UseVisualStyleBackColor = true;
+      this.applyFilterButton.Click += new System.EventHandler(this.applyFilterButton_Click);
+      // 
+      // rBtnOr
+      // 
+      this.rBtnOr.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.rBtnOr.AutoSize = true;
+      this.rBtnOr.Cursor = System.Windows.Forms.Cursors.Default;
+      this.rBtnOr.Enabled = false;
+      this.rBtnOr.Location = new System.Drawing.Point(53, 6);
+      this.rBtnOr.Name = "rBtnOr";
+      this.rBtnOr.Size = new System.Drawing.Size(36, 17);
+      this.rBtnOr.TabIndex = 3;
+      this.rBtnOr.Text = "Or";
+      this.rBtnOr.UseVisualStyleBackColor = true;
+      // 
+      // rBtnAnd
+      // 
+      this.rBtnAnd.Anchor = System.Windows.Forms.AnchorStyles.Left;
+      this.rBtnAnd.AutoSize = true;
+      this.rBtnAnd.Checked = true;
+      this.rBtnAnd.Cursor = System.Windows.Forms.Cursors.Default;
+      this.rBtnAnd.Enabled = false;
+      this.rBtnAnd.Location = new System.Drawing.Point(3, 6);
+      this.rBtnAnd.Name = "rBtnAnd";
+      this.rBtnAnd.Size = new System.Drawing.Size(44, 17);
+      this.rBtnAnd.TabIndex = 4;
+      this.rBtnAnd.TabStop = true;
+      this.rBtnAnd.Text = "And";
+      this.rBtnAnd.UseVisualStyleBackColor = true;
+      this.rBtnAnd.CheckedChanged += new System.EventHandler(this.rBtnAnd_CheckedChanged);
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox1.Controls.Add(this.label4);
+      this.groupBox1.Controls.Add(this.label1);
+      this.groupBox1.Controls.Add(this.label2);
+      this.groupBox1.Controls.Add(this.label3);
+      this.groupBox1.Location = new System.Drawing.Point(4, 445);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(658, 130);
+      this.groupBox1.TabIndex = 12;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "Filter Info";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(15, 98);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(455, 13);
+      this.label4.TabIndex = 12;
+      this.label4.Text = "The Apply Filter Button permanently activates the filters. This means unfiltered " +
+    "rows are deleted.";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(15, 74);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(529, 13);
+      this.label1.TabIndex = 11;
+      this.label1.Text = "All preprocessing views are updated when a filter gets activated or deactivated b" +
+    "ut the unfiltered rows still exist.";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(15, 47);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(402, 13);
+      this.label2.TabIndex = 8;
+      this.label2.Text = "In the Filter Preview all effects of the activated filters on the dataset are sum" +
+    "marized.";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(15, 21);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(249, 13);
+      this.label3.TabIndex = 6;
+      this.label3.Text = "A filter specifies the data rows which should remain.";
+      // 
+      // bottomPanel
+      // 
+      this.bottomPanel.Controls.Add(this.applyFilterButton);
+      this.bottomPanel.Controls.Add(this.rBtnAnd);
+      this.bottomPanel.Controls.Add(this.rBtnOr);
+      this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.bottomPanel.Location = new System.Drawing.Point(0, 580);
+      this.bottomPanel.Name = "bottomPanel";
+      this.bottomPanel.Size = new System.Drawing.Size(670, 30);
+      this.bottomPanel.TabIndex = 13;
+      // 
+      // FilterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.bottomPanel);
+      this.Controls.Add(this.groupBox1);
+      this.Controls.Add(this.groupBoxFilterInfo);
+      this.Controls.Add(this.groupBoxFilter);
+      this.Name = "FilterView";
+      this.Size = new System.Drawing.Size(670, 610);
+      this.groupBoxFilter.ResumeLayout(false);
+      this.groupBoxFilterInfo.ResumeLayout(false);
+      this.groupBoxFilterInfo.PerformLayout();
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
+      this.bottomPanel.ResumeLayout(false);
+      this.bottomPanel.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBoxFilter;
+    private System.Windows.Forms.GroupBox groupBoxFilterInfo;
+    private System.Windows.Forms.Button applyFilterButton;
+    private System.Windows.Forms.TextBox tbTotal;
+    private System.Windows.Forms.Label lblTotal;
+    private System.Windows.Forms.Label lblPercentage;
+    private System.Windows.Forms.TextBox tbPercentage;
+    private System.Windows.Forms.TextBox tbRemaining;
+    private System.Windows.Forms.Label lblRemaining;
+    private System.Windows.Forms.RadioButton rBtnOr;
+    private System.Windows.Forms.RadioButton rBtnAnd;
+    private CheckedFilterCollectionView checkedFilterView;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Panel bottomPanel;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs	(revision 15268)
@@ -0,0 +1,124 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.DataPreprocessing.Filter;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("CheckedFilterCollection View")]
+  [Content(typeof(FilterContent), true)]
+  public partial class FilterView : ItemView {
+    public new FilterContent Content {
+      get { return (FilterContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public FilterView() {
+      InitializeComponent();
+      tbTotal.Text = "0";
+      tbRemaining.Text = "0";
+      tbPercentage.Text = "0%";
+    }
+
+    private void InitData() {
+      checkedFilterView.Content = Content.Filters;
+      checkedFilterView.Content.ItemsAdded += Content_ItemsAdded;
+      checkedFilterView.Content.ItemsRemoved += Content_ItemsRemoved;
+      checkedFilterView.Content.CheckedItemsChanged += Content_CheckedItemsChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        InitData();
+        UpdateFilterInfo();
+      }
+    }
+
+    private void Content_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IFilter> e) {
+      if (Content != null) {
+        foreach (IFilter filter in e.Items) {
+          filter.Active = checkedFilterView.Content.ItemChecked(filter);
+        }
+        UpdateFilterInfo();
+      }
+    }
+
+    private void UpdateFilterInfo() {
+      List<IFilter> filters = Content.Filters.ToList();
+      int activeFilters = filters.Count(c => c.Active);
+      applyFilterButton.Enabled = (activeFilters > 0);
+      rBtnAnd.Enabled = (activeFilters > 0);
+      rBtnOr.Enabled = (activeFilters > 0);
+      Content.FilterLogic.Reset();
+      bool[] result = Content.FilterLogic.Preview(filters, rBtnAnd.Checked);
+
+      int filteredCnt = result.Count(c => !c);
+
+      tbRemaining.Text = filteredCnt.ToString();
+      double percentage = result.Length == 0 ? 0.0 : filteredCnt * 100 / (double)result.Length;
+      tbPercentage.Text = String.Format("{0:0.0000}%", percentage);
+      tbTotal.Text = result.Length.ToString();
+    }
+
+    private void applyFilterButton_Click(object sender, EventArgs e) {
+      if (Content != null) {
+        List<IFilter> filters = Content.Filters.ToList();
+        //apply filters
+        Content.FilterLogic.Apply(filters, rBtnAnd.Checked);
+        //deactivate checked filters
+        filters = checkedFilterView.Content.CheckedItems.ToList();
+        foreach (IFilter filter in filters) {
+          checkedFilterView.Content.SetItemCheckedState(filter, false);
+          filter.Active = false;
+        }
+        UpdateFilterInfo();
+      }
+    }
+
+    //whenever a new filter is added the preprocessing data is set to the filter
+    private void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IFilter> e) {
+      if (Content != null) {
+        foreach (IFilter filter in e.Items) {
+          filter.ConstrainedValue = Content.FilterLogic.PreprocessingData;
+        }
+      }
+    }
+
+    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IFilter> e) {
+      if (Content != null) {
+        UpdateFilterInfo();
+      }
+    }
+
+    private void rBtnAnd_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        UpdateFilterInfo();
+        Content.IsAndCombination = rBtnAnd.Checked;
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15268)
@@ -0,0 +1,360 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataPreprocessing.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.DataPreprocessing.Views-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\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>..\..\..\..\trunk\sources\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|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\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>..\..\..\..\trunk\sources\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>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\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>..\..\..\..\trunk\sources\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>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimizer-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimizer-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Views-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances.DataAnalysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances.DataAnalysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances.DataAnalysis.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances.DataAnalysis.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataPreprocessingMenuItem.cs" />
+    <Compile Include="PreprocessingCheckedVariablesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PreprocessingCheckedVariablesView.Designer.cs">
+      <DependentUpon>PreprocessingCheckedVariablesView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PreprocessingFeatureCorrelationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PreprocessingFeatureCorrelationView.Designer.cs">
+      <DependentUpon>PreprocessingFeatureCorrelationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CheckedFilterCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CheckedFilterCollectionView.Designer.cs">
+      <DependentUpon>CheckedFilterCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CheckedTransformationListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CheckedTransformationListView.Designer.cs">
+      <DependentUpon>CheckedTransformationListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComparisonFilterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ComparisonFilterView.Designer.cs">
+      <DependentUpon>ComparisonFilterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PreprocessingIcons.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PreprocessingIcons.resx</DependentUpon>
+    </Compile>
+    <Compile Include="RenameColumnsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="RenameColumnsDialog.Designer.cs">
+      <DependentUpon>RenameColumnsDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScatterPlotSingleView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScatterPlotSingleView.Designer.cs">
+      <DependentUpon>ScatterPlotSingleView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DataCompletenessView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DataCompletenessView.Designer.cs">
+      <DependentUpon>DataCompletenessView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DataGridContentView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DataGridContentView.Designer.cs">
+      <DependentUpon>DataGridContentView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DataPreprocessingView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DataPreprocessingView.designer.cs">
+      <DependentUpon>DataPreprocessingView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DataPreprocessorStarter.cs" />
+    <Compile Include="FilterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FilterView.Designer.cs">
+      <DependentUpon>FilterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScatterPlotMultiView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScatterPlotMultiView.Designer.cs">
+      <DependentUpon>ScatterPlotMultiView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SearchAndReplaceDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SearchAndReplaceDialog.Designer.cs">
+      <DependentUpon>SearchAndReplaceDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HistogramView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HistogramView.Designer.cs">
+      <DependentUpon>HistogramView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LineChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LineChartView.Designer.cs">
+      <DependentUpon>LineChartView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ManipulationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ManipulationView.Designer.cs">
+      <DependentUpon>ManipulationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="PreprocessingChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PreprocessingChartView.Designer.cs">
+      <DependentUpon>PreprocessingChartView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StatisticsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StatisticsView.Designer.cs">
+      <DependentUpon>StatisticsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TransformationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TransformationView.Designer.cs">
+      <DependentUpon>TransformationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Utils\FindPreprocessingItemsIterator.cs" />
+    <Compile Include="Utils\IFindPreprocessingItemsIterator.cs" />
+    <Compile Include="Utils\VerticalLabel.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ViewShortcutListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ViewShortcutListView.Designer.cs">
+      <DependentUpon>ViewShortcutListView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.DataPreprocessing\3.4\HeuristicLab.DataPreprocessing-3.4.csproj">
+      <Project>{3B90F866-70F8-43EF-A541-51819D255B7B}</Project>
+      <Name>HeuristicLab.DataPreprocessing-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="PreprocessingIcons.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>PreprocessingIcons.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ScatterPlotSingleView.resx">
+      <DependentUpon>ScatterPlotSingleView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Icons\All.png" />
+    <Content Include="Icons\Inputs.png" />
+    <Content Include="Icons\None.png" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <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>
+  <!-- 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>
+  -->
+</Project>
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.Designer.cs	(revision 15268)
@@ -0,0 +1,203 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class HistogramView {
+    /// <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();
+      this.optionsBox = new System.Windows.Forms.GroupBox();
+      this.groupingTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.variableLabel = new System.Windows.Forms.Label();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.aggregationLabel = new System.Windows.Forms.Label();
+      this.orderComboBox = new System.Windows.Forms.ComboBox();
+      this.groupingComboBox = new System.Windows.Forms.ComboBox();
+      this.aggregationComboBox = new System.Windows.Forms.ComboBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.optionsBox.SuspendLayout();
+      this.groupingTableLayoutPanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // sizeGroupBox
+      // 
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 258);
+      // 
+      // splitContainer
+      // 
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.optionsBox);
+      // 
+      // optionsBox
+      // 
+      this.optionsBox.Controls.Add(this.groupingTableLayoutPanel);
+      this.optionsBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.optionsBox.Location = new System.Drawing.Point(0, 302);
+      this.optionsBox.Name = "optionsBox";
+      this.optionsBox.Size = new System.Drawing.Size(180, 101);
+      this.optionsBox.TabIndex = 7;
+      this.optionsBox.TabStop = false;
+      this.optionsBox.Text = "Grouping Options";
+      // 
+      // groupingTableLayoutPanel
+      // 
+      this.groupingTableLayoutPanel.ColumnCount = 2;
+      this.groupingTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.groupingTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+      this.groupingTableLayoutPanel.Controls.Add(this.variableLabel, 0, 0);
+      this.groupingTableLayoutPanel.Controls.Add(this.orderLabel, 0, 2);
+      this.groupingTableLayoutPanel.Controls.Add(this.aggregationLabel, 0, 1);
+      this.groupingTableLayoutPanel.Controls.Add(this.orderComboBox, 1, 2);
+      this.groupingTableLayoutPanel.Controls.Add(this.groupingComboBox, 1, 0);
+      this.groupingTableLayoutPanel.Controls.Add(this.aggregationComboBox, 1, 1);
+      this.groupingTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupingTableLayoutPanel.Location = new System.Drawing.Point(3, 16);
+      this.groupingTableLayoutPanel.Name = "groupingTableLayoutPanel";
+      this.groupingTableLayoutPanel.RowCount = 3;
+      this.groupingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.groupingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.groupingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.groupingTableLayoutPanel.Size = new System.Drawing.Size(174, 82);
+      this.groupingTableLayoutPanel.TabIndex = 3;
+      // 
+      // variableLabel
+      // 
+      this.variableLabel.AutoSize = true;
+      this.variableLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableLabel.Location = new System.Drawing.Point(3, 0);
+      this.variableLabel.Name = "variableLabel";
+      this.variableLabel.Size = new System.Drawing.Size(48, 27);
+      this.variableLabel.TabIndex = 2;
+      this.variableLabel.Text = "Variable:";
+      this.variableLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.orderLabel.Location = new System.Drawing.Point(3, 54);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(48, 28);
+      this.orderLabel.TabIndex = 2;
+      this.orderLabel.Text = "Order:";
+      this.orderLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.toolTip.SetToolTip(this.orderLabel, "Order of Legend Entries");
+      // 
+      // aggregationLabel
+      // 
+      this.aggregationLabel.AutoSize = true;
+      this.aggregationLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.aggregationLabel.Location = new System.Drawing.Point(3, 27);
+      this.aggregationLabel.Name = "aggregationLabel";
+      this.aggregationLabel.Size = new System.Drawing.Size(48, 27);
+      this.aggregationLabel.TabIndex = 2;
+      this.aggregationLabel.Text = "Aggr.:";
+      this.aggregationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.toolTip.SetToolTip(this.aggregationLabel, "Aggregation");
+      // 
+      // orderComboBox
+      // 
+      this.orderComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.orderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.orderComboBox.FormattingEnabled = true;
+      this.orderComboBox.Location = new System.Drawing.Point(57, 57);
+      this.orderComboBox.Name = "orderComboBox";
+      this.orderComboBox.Size = new System.Drawing.Size(114, 21);
+      this.orderComboBox.TabIndex = 1;
+      this.orderComboBox.SelectedIndexChanged += new System.EventHandler(this.orderComboBox_SelectedIndexChanged);
+      // 
+      // groupingComboBox
+      // 
+      this.groupingComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupingComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.groupingComboBox.FormattingEnabled = true;
+      this.groupingComboBox.Location = new System.Drawing.Point(57, 3);
+      this.groupingComboBox.Name = "groupingComboBox";
+      this.groupingComboBox.Size = new System.Drawing.Size(114, 21);
+      this.groupingComboBox.TabIndex = 1;
+      this.groupingComboBox.SelectedIndexChanged += new System.EventHandler(this.classifierComboBox_SelectedIndexChanged);
+      // 
+      // aggregationComboBox
+      // 
+      this.aggregationComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.aggregationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.aggregationComboBox.FormattingEnabled = true;
+      this.aggregationComboBox.Location = new System.Drawing.Point(57, 30);
+      this.aggregationComboBox.Name = "aggregationComboBox";
+      this.aggregationComboBox.Size = new System.Drawing.Size(114, 21);
+      this.aggregationComboBox.TabIndex = 1;
+      this.aggregationComboBox.SelectedIndexChanged += new System.EventHandler(this.aggregationComboBox_SelectedIndexChanged);
+      // 
+      // HistogramView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Margin = new System.Windows.Forms.Padding(4);
+      this.Name = "HistogramView";
+      this.splitContainer.Panel1.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.optionsBox.ResumeLayout(false);
+      this.groupingTableLayoutPanel.ResumeLayout(false);
+      this.groupingTableLayoutPanel.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox optionsBox;
+    private System.Windows.Forms.ComboBox groupingComboBox;
+    private System.Windows.Forms.Label variableLabel;
+    private System.Windows.Forms.Label aggregationLabel;
+    private System.Windows.Forms.ComboBox aggregationComboBox;
+    private System.Windows.Forms.TableLayoutPanel groupingTableLayoutPanel;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.ComboBox orderComboBox;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.cs	(revision 15268)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Analysis;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Histogram View")]
+  [Content(typeof(HistogramContent), true)]
+  public partial class HistogramView : PreprocessingChartView {
+    public new HistogramContent Content {
+      get { return (HistogramContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HistogramView() {
+      InitializeComponent();
+      aggregationComboBox.DataSource = Enum.GetValues(typeof(DataTableVisualProperties.DataTableHistogramAggregation));
+      aggregationComboBox.SelectedItem = DataTableVisualProperties.DataTableHistogramAggregation.Overlapping;
+      orderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
+      orderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      groupingComboBox.Items.Clear();
+      groupingComboBox.Items.Add(string.Empty);
+
+      if (Content != null) {
+        foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData)) {
+          groupingComboBox.Items.Add(var);
+        }
+
+        groupingComboBox.SelectedItem = Content.GroupingVariableName ?? string.Empty;
+      }
+    }
+
+    protected override DataTable CreateDataTable(string variableName) {
+      var aggregation = (DataTableVisualProperties.DataTableHistogramAggregation)aggregationComboBox.SelectedItem;
+      var hist = HistogramContent.CreateHistogram(Content.PreprocessingData, variableName, Content.GroupingVariableName, aggregation, Content.Order);
+      hist.VisualProperties.TitleFont = new Font(DefaultFont.FontFamily, 10, FontStyle.Bold);
+      return hist;
+    }
+
+    private void classifierComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.GroupingVariableName = groupingComboBox.SelectedItem.ToString();
+
+      // rebuild datatables
+      InitData();
+      GenerateLayout();
+    }
+
+    private void aggregationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      foreach (var dt in dataTables.Values) {
+        dt.VisualProperties.HistogramAggregation = (DataTableVisualProperties.DataTableHistogramAggregation)aggregationComboBox.SelectedItem;
+      }
+    }
+
+    private void orderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (Content == null) return;
+
+      Content.Order = (PreprocessingChartContent.LegendOrder)orderComboBox.SelectedItem;
+
+      // rebuild datatables
+      InitData();
+      GenerateLayout();
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.Designer.cs	(revision 15268)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class LineChartView {
+    /// <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.optionsBox = new System.Windows.Forms.GroupBox();
+      this.allInOneCheckBox = new System.Windows.Forms.CheckBox();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.optionsBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.optionsBox);
+      // 
+      // optionsBox
+      // 
+      this.optionsBox.Controls.Add(this.allInOneCheckBox);
+      this.optionsBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.optionsBox.Location = new System.Drawing.Point(0, 357);
+      this.optionsBox.Name = "optionsBox";
+      this.optionsBox.Size = new System.Drawing.Size(180, 46);
+      this.optionsBox.TabIndex = 7;
+      this.optionsBox.TabStop = false;
+      this.optionsBox.Text = "Options";
+      // 
+      // allInOneCheckBox
+      // 
+      this.allInOneCheckBox.AutoSize = true;
+      this.allInOneCheckBox.Checked = true;
+      this.allInOneCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.allInOneCheckBox.Location = new System.Drawing.Point(6, 19);
+      this.allInOneCheckBox.Name = "allInOneCheckBox";
+      this.allInOneCheckBox.Size = new System.Drawing.Size(69, 17);
+      this.allInOneCheckBox.TabIndex = 0;
+      this.allInOneCheckBox.Text = "All in one";
+      this.allInOneCheckBox.UseVisualStyleBackColor = true;
+      this.allInOneCheckBox.CheckedChanged += new System.EventHandler(this.allInOneCheckBox_CheckedChanged);
+      // 
+      // LineChartView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "LineChartView";
+      this.splitContainer.Panel1.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.optionsBox.ResumeLayout(false);
+      this.optionsBox.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox optionsBox;
+    private System.Windows.Forms.CheckBox allInOneCheckBox;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.cs	(revision 15268)
@@ -0,0 +1,151 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Analysis;
+using HeuristicLab.Analysis.Views;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.Visualization.ChartControlsExtensions;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Line Chart View")]
+  [Content(typeof(LineChartContent), true)]
+  public partial class LineChartView : PreprocessingChartView {
+    protected Dictionary<string, DataRow> allInOneDataRows;
+    protected DataTable allInOneDataTable;
+    protected DataTableView allInOneDataTableView;
+
+    public new LineChartContent Content {
+      get { return (LineChartContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public LineChartView() {
+      InitializeComponent();
+      sizeGroupBox.Visible = false;
+
+      allInOneDataRows = new Dictionary<string, DataRow>();
+      allInOneDataTable = new DataTable();
+    }
+
+    protected override void InitData() {
+      base.InitData();
+
+      allInOneDataRows.Clear();
+      foreach (var x in Content.VariableItemList.Select((v, i) => new { variable = v.Value, i })) {
+        var row = Content.CreateDataRow(x.variable, DataRowVisualProperties.DataRowChartType.Line);
+        row.VisualProperties.Color = Colors[x.i % Colors.Length];
+        allInOneDataRows.Add(x.variable, row);
+      }
+
+      allInOneDataTable.Rows.Clear();
+      var rows = Content.VariableItemList.CheckedItems.Select(v => allInOneDataRows[v.Value.Value]);
+      allInOneDataTable.Rows.AddRange(rows);
+    }
+
+    protected override int GetNumberOfVisibleDataTables() {
+      return Content.AllInOneMode ? 1 : base.GetNumberOfVisibleDataTables();
+    }
+    protected override IEnumerable<DataTableView> GetVisibleDataTables() {
+      if (Content.AllInOneMode) {
+        if (allInOneDataTableView == null)
+          allInOneDataTableView = new DataTableView() { Content = allInOneDataTable, ShowChartOnly = true };
+        return new[] { allInOneDataTableView };
+      }
+      return base.GetVisibleDataTables();
+    }
+    protected override DataTable CreateDataTable(string variableName) {
+      var dt = new DataTable();
+      var row = Content.CreateDataRow(variableName, DataRowVisualProperties.DataRowChartType.Line);
+      dt.Rows.Add(row);
+
+      var validValues = row.Values.Where(x => !double.IsNaN(x) && !double.IsInfinity(x)).ToList();
+      if (validValues.Any()) {
+        try {
+          double axisMin, axisMax, axisInterval;
+          ChartUtil.CalculateOptimalAxisInterval(validValues.Min(), validValues.Max(), out axisMin, out axisMax, out axisInterval);
+          dt.VisualProperties.YAxisMinimumAuto = false;
+          dt.VisualProperties.YAxisMaximumAuto = false;
+          dt.VisualProperties.YAxisMinimumFixedValue = axisMin;
+          dt.VisualProperties.YAxisMaximumFixedValue = axisMax;
+        } catch (ArgumentOutOfRangeException) { }
+      }
+      return dt;
+    }
+
+    private void allInOneCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.AllInOneMode = allInOneCheckBox.Checked;
+
+      sizeGroupBox.Visible = !allInOneCheckBox.Checked;
+
+      GenerateLayout();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        allInOneCheckBox.Checked = Content.AllInOneMode;
+      }
+    }
+
+    protected override void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+      base.CheckedItemsChanged(sender, checkedItems);
+
+      foreach (IndexedItem<StringValue> item in checkedItems.Items) {
+        string variableName = item.Value.Value;
+
+        if (IsVariableChecked(variableName)) {
+          // ToDo: avoid clearing all rows, but how?
+          allInOneDataTable.Rows.Clear();
+          var rows = Content.VariableItemList.CheckedItems.Select(r => allInOneDataRows[r.Value.Value]);
+          allInOneDataTable.Rows.AddRange(rows);
+        } else {
+          allInOneDataTable.Rows.Remove(variableName);
+        }
+      }
+    }
+
+    #region Add/Remove/Update Variable, Reset
+    protected override void AddVariable(string name) {
+      base.AddVariable(name);
+      var row = Content.CreateDataRow(name, DataRowVisualProperties.DataRowChartType.Line);
+      allInOneDataTable.Rows.Add(row);
+    }
+
+    // remove variable from data table and item list
+    protected override void RemoveVariable(string name) {
+      base.RemoveVariable(name);
+      allInOneDataTable.Rows.Remove(name);
+    }
+
+    protected override void UpdateVariable(string name) {
+      base.UpdateVariable(name);
+      allInOneDataTable.Rows.Remove(name);
+      var newRow = Content.CreateDataRow(name, DataRowVisualProperties.DataRowChartType.Line);
+      allInOneDataTable.Rows.Add(newRow);
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.Designer.cs	(revision 15268)
@@ -0,0 +1,737 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class ManipulationView {
+    /// <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.lstMethods = new System.Windows.Forms.ListBox();
+      this.btnApply = new System.Windows.Forms.Button();
+      this.grpBoxData = new System.Windows.Forms.GroupBox();
+      this.tabsData = new System.Windows.Forms.TabControl();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.label7 = new System.Windows.Forms.Label();
+      this.tabDataDeleteColumnsInformation = new System.Windows.Forms.TabPage();
+      this.label2 = new System.Windows.Forms.Label();
+      this.txtDeleteColumnsInfo = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.tabDataDeleteColumnsVariance = new System.Windows.Forms.TabPage();
+      this.txtDeleteColumnsVariance = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.tabDataDeleteRowsInfo = new System.Windows.Forms.TabPage();
+      this.label3 = new System.Windows.Forms.Label();
+      this.txtDeleteRowsInfo = new System.Windows.Forms.TextBox();
+      this.label5 = new System.Windows.Forms.Label();
+      this.tabReplaceMissingValues = new System.Windows.Forms.TabPage();
+      this.txtReplaceValue = new System.Windows.Forms.TextBox();
+      this.cmbVariableNames = new System.Windows.Forms.ComboBox();
+      this.cmbReplaceWith = new System.Windows.Forms.ComboBox();
+      this.lblValueColon = new System.Windows.Forms.Label();
+      this.label8 = new System.Windows.Forms.Label();
+      this.label10 = new System.Windows.Forms.Label();
+      this.tabDataShuffle = new System.Windows.Forms.TabPage();
+      this.shuffleSeparatelyCheckbox = new System.Windows.Forms.CheckBox();
+      this.lblShuffleProperties = new System.Windows.Forms.Label();
+      this.grpBoxPreview = new System.Windows.Forms.GroupBox();
+      this.tabsPreview = new System.Windows.Forms.TabControl();
+      this.tabPreviewInactive = new System.Windows.Forms.TabPage();
+      this.lblPreviewInActive = new System.Windows.Forms.Label();
+      this.tabPreviewDeleteColumnsInfo = new System.Windows.Forms.TabPage();
+      this.lblPreviewColumnsInfo = new System.Windows.Forms.Label();
+      this.tabPreviewDeleteColumnsVariance = new System.Windows.Forms.TabPage();
+      this.label12 = new System.Windows.Forms.Label();
+      this.lblPreviewColumnsVariance = new System.Windows.Forms.Label();
+      this.tabPreviewDeleteRowsInfo = new System.Windows.Forms.TabPage();
+      this.lblPreviewRowsInfo = new System.Windows.Forms.Label();
+      this.tabPreviewReplaceMissingValues = new System.Windows.Forms.TabPage();
+      this.lblPreviewReplaceMissingValues = new System.Windows.Forms.Label();
+      this.tabPreviewShuffle = new System.Windows.Forms.TabPage();
+      this.lblPreviewShuffle = new System.Windows.Forms.Label();
+      this.label9 = new System.Windows.Forms.Label();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.panel2 = new System.Windows.Forms.Panel();
+      this.grpBoxData.SuspendLayout();
+      this.tabsData.SuspendLayout();
+      this.tabPage1.SuspendLayout();
+      this.tabDataDeleteColumnsInformation.SuspendLayout();
+      this.tabDataDeleteColumnsVariance.SuspendLayout();
+      this.tabDataDeleteRowsInfo.SuspendLayout();
+      this.tabReplaceMissingValues.SuspendLayout();
+      this.tabDataShuffle.SuspendLayout();
+      this.grpBoxPreview.SuspendLayout();
+      this.tabsPreview.SuspendLayout();
+      this.tabPreviewInactive.SuspendLayout();
+      this.tabPreviewDeleteColumnsInfo.SuspendLayout();
+      this.tabPreviewDeleteColumnsVariance.SuspendLayout();
+      this.tabPreviewDeleteRowsInfo.SuspendLayout();
+      this.tabPreviewReplaceMissingValues.SuspendLayout();
+      this.tabPreviewShuffle.SuspendLayout();
+      this.panel1.SuspendLayout();
+      this.panel2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // lstMethods
+      // 
+      this.lstMethods.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.lstMethods.FormattingEnabled = true;
+      this.lstMethods.ItemHeight = 16;
+      this.lstMethods.Items.AddRange(new object[] {
+            "Delete Columns with insufficient Information",
+            "Delete Columns with insufficient Variance",
+            "Delete Rows with insufficient Information",
+            "Replace Missing Values",
+            "Shuffle Data"});
+      this.lstMethods.Location = new System.Drawing.Point(4, 4);
+      this.lstMethods.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.lstMethods.Name = "lstMethods";
+      this.lstMethods.Size = new System.Drawing.Size(976, 116);
+      this.lstMethods.Sorted = true;
+      this.lstMethods.TabIndex = 0;
+      this.lstMethods.SelectedIndexChanged += new System.EventHandler(this.lstMethods_SelectedIndexChanged);
+      // 
+      // btnApply
+      // 
+      this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnApply.Enabled = false;
+      this.btnApply.Location = new System.Drawing.Point(804, 615);
+      this.btnApply.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.btnApply.Name = "btnApply";
+      this.btnApply.Size = new System.Drawing.Size(172, 28);
+      this.btnApply.TabIndex = 2;
+      this.btnApply.Text = "Apply Manipulation";
+      this.btnApply.UseVisualStyleBackColor = true;
+      this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
+      // 
+      // grpBoxData
+      // 
+      this.grpBoxData.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.grpBoxData.Controls.Add(this.tabsData);
+      this.grpBoxData.Location = new System.Drawing.Point(5, 129);
+      this.grpBoxData.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.grpBoxData.Name = "grpBoxData";
+      this.grpBoxData.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.grpBoxData.Size = new System.Drawing.Size(976, 233);
+      this.grpBoxData.TabIndex = 3;
+      this.grpBoxData.TabStop = false;
+      this.grpBoxData.Text = "Properties";
+      // 
+      // tabsData
+      // 
+      this.tabsData.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabsData.Controls.Add(this.tabPage1);
+      this.tabsData.Controls.Add(this.tabDataDeleteColumnsInformation);
+      this.tabsData.Controls.Add(this.tabDataDeleteColumnsVariance);
+      this.tabsData.Controls.Add(this.tabDataDeleteRowsInfo);
+      this.tabsData.Controls.Add(this.tabReplaceMissingValues);
+      this.tabsData.Controls.Add(this.tabDataShuffle);
+      this.tabsData.ItemSize = new System.Drawing.Size(58, 18);
+      this.tabsData.Location = new System.Drawing.Point(8, 23);
+      this.tabsData.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabsData.Name = "tabsData";
+      this.tabsData.SelectedIndex = 0;
+      this.tabsData.Size = new System.Drawing.Size(959, 202);
+      this.tabsData.TabIndex = 3;
+      // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.label7);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPage1.Size = new System.Drawing.Size(951, 176);
+      this.tabPage1.TabIndex = 5;
+      this.tabPage1.Text = "tabDataInactive";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Enabled = false;
+      this.label7.Location = new System.Drawing.Point(4, 4);
+      this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(345, 17);
+      this.label7.TabIndex = 1;
+      this.label7.Text = "Please select one of the manipulation methods above";
+      // 
+      // tabDataDeleteColumnsInformation
+      // 
+      this.tabDataDeleteColumnsInformation.Controls.Add(this.label2);
+      this.tabDataDeleteColumnsInformation.Controls.Add(this.txtDeleteColumnsInfo);
+      this.tabDataDeleteColumnsInformation.Controls.Add(this.label1);
+      this.tabDataDeleteColumnsInformation.Location = new System.Drawing.Point(4, 22);
+      this.tabDataDeleteColumnsInformation.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataDeleteColumnsInformation.Name = "tabDataDeleteColumnsInformation";
+      this.tabDataDeleteColumnsInformation.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataDeleteColumnsInformation.Size = new System.Drawing.Size(951, 176);
+      this.tabDataDeleteColumnsInformation.TabIndex = 0;
+      this.tabDataDeleteColumnsInformation.Text = "del columns info";
+      this.tabDataDeleteColumnsInformation.UseVisualStyleBackColor = true;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(272, 4);
+      this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(120, 17);
+      this.label2.TabIndex = 5;
+      this.label2.Text = "% missing values.";
+      // 
+      // txtDeleteColumnsInfo
+      // 
+      this.txtDeleteColumnsInfo.Location = new System.Drawing.Point(219, 0);
+      this.txtDeleteColumnsInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.txtDeleteColumnsInfo.Name = "txtDeleteColumnsInfo";
+      this.txtDeleteColumnsInfo.Size = new System.Drawing.Size(44, 22);
+      this.txtDeleteColumnsInfo.TabIndex = 4;
+      this.txtDeleteColumnsInfo.TextChanged += new System.EventHandler(this.txtDeleteColumnsInfo_TextChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(4, 4);
+      this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(205, 17);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Delete columns with more than ";
+      // 
+      // tabDataDeleteColumnsVariance
+      // 
+      this.tabDataDeleteColumnsVariance.Controls.Add(this.txtDeleteColumnsVariance);
+      this.tabDataDeleteColumnsVariance.Controls.Add(this.label4);
+      this.tabDataDeleteColumnsVariance.Location = new System.Drawing.Point(4, 22);
+      this.tabDataDeleteColumnsVariance.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataDeleteColumnsVariance.Name = "tabDataDeleteColumnsVariance";
+      this.tabDataDeleteColumnsVariance.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataDeleteColumnsVariance.Size = new System.Drawing.Size(951, 176);
+      this.tabDataDeleteColumnsVariance.TabIndex = 1;
+      this.tabDataDeleteColumnsVariance.Text = "del columns variance";
+      this.tabDataDeleteColumnsVariance.UseVisualStyleBackColor = true;
+      // 
+      // txtDeleteColumnsVariance
+      // 
+      this.txtDeleteColumnsVariance.Location = new System.Drawing.Point(305, 0);
+      this.txtDeleteColumnsVariance.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.txtDeleteColumnsVariance.Name = "txtDeleteColumnsVariance";
+      this.txtDeleteColumnsVariance.Size = new System.Drawing.Size(179, 22);
+      this.txtDeleteColumnsVariance.TabIndex = 4;
+      this.txtDeleteColumnsVariance.TextChanged += new System.EventHandler(this.txtDeleteColumnsVariance_TextChanged);
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(4, 4);
+      this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(292, 17);
+      this.label4.TabIndex = 3;
+      this.label4.Text = "Delete columns with a variance smaller than  ";
+      // 
+      // tabDataDeleteRowsInfo
+      // 
+      this.tabDataDeleteRowsInfo.Controls.Add(this.label3);
+      this.tabDataDeleteRowsInfo.Controls.Add(this.txtDeleteRowsInfo);
+      this.tabDataDeleteRowsInfo.Controls.Add(this.label5);
+      this.tabDataDeleteRowsInfo.Location = new System.Drawing.Point(4, 22);
+      this.tabDataDeleteRowsInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataDeleteRowsInfo.Name = "tabDataDeleteRowsInfo";
+      this.tabDataDeleteRowsInfo.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataDeleteRowsInfo.Size = new System.Drawing.Size(951, 176);
+      this.tabDataDeleteRowsInfo.TabIndex = 2;
+      this.tabDataDeleteRowsInfo.Text = "del rows info";
+      this.tabDataDeleteRowsInfo.UseVisualStyleBackColor = true;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(252, 4);
+      this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(120, 17);
+      this.label3.TabIndex = 8;
+      this.label3.Text = "% missing values.";
+      // 
+      // txtDeleteRowsInfo
+      // 
+      this.txtDeleteRowsInfo.Location = new System.Drawing.Point(196, 0);
+      this.txtDeleteRowsInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.txtDeleteRowsInfo.Name = "txtDeleteRowsInfo";
+      this.txtDeleteRowsInfo.Size = new System.Drawing.Size(44, 22);
+      this.txtDeleteRowsInfo.TabIndex = 7;
+      this.txtDeleteRowsInfo.TextChanged += new System.EventHandler(this.txtDeleteRowsInfo_TextChanged);
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(4, 4);
+      this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(182, 17);
+      this.label5.TabIndex = 6;
+      this.label5.Text = "Delete rows with more than ";
+      // 
+      // tabReplaceMissingValues
+      // 
+      this.tabReplaceMissingValues.Controls.Add(this.txtReplaceValue);
+      this.tabReplaceMissingValues.Controls.Add(this.cmbVariableNames);
+      this.tabReplaceMissingValues.Controls.Add(this.cmbReplaceWith);
+      this.tabReplaceMissingValues.Controls.Add(this.lblValueColon);
+      this.tabReplaceMissingValues.Controls.Add(this.label8);
+      this.tabReplaceMissingValues.Controls.Add(this.label10);
+      this.tabReplaceMissingValues.Location = new System.Drawing.Point(4, 22);
+      this.tabReplaceMissingValues.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabReplaceMissingValues.Name = "tabReplaceMissingValues";
+      this.tabReplaceMissingValues.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabReplaceMissingValues.Size = new System.Drawing.Size(951, 176);
+      this.tabReplaceMissingValues.TabIndex = 6;
+      this.tabReplaceMissingValues.Text = "repl missing vals";
+      this.tabReplaceMissingValues.UseVisualStyleBackColor = true;
+      // 
+      // txtReplaceValue
+      // 
+      this.txtReplaceValue.Location = new System.Drawing.Point(231, 33);
+      this.txtReplaceValue.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.txtReplaceValue.Name = "txtReplaceValue";
+      this.txtReplaceValue.Size = new System.Drawing.Size(132, 22);
+      this.txtReplaceValue.TabIndex = 2;
+      this.txtReplaceValue.TextChanged += new System.EventHandler(this.txtReplaceValue_TextChanged);
+      // 
+      // cmbVariableNames
+      // 
+      this.cmbVariableNames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbVariableNames.FormattingEnabled = true;
+      this.cmbVariableNames.Location = new System.Drawing.Point(189, 0);
+      this.cmbVariableNames.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.cmbVariableNames.Name = "cmbVariableNames";
+      this.cmbVariableNames.Size = new System.Drawing.Size(160, 24);
+      this.cmbVariableNames.TabIndex = 1;
+      this.cmbVariableNames.SelectedIndexChanged += new System.EventHandler(this.cmbReplaceWith_SelectedIndexChanged);
+      // 
+      // cmbReplaceWith
+      // 
+      this.cmbReplaceWith.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbReplaceWith.FormattingEnabled = true;
+      this.cmbReplaceWith.Items.AddRange(new object[] {
+            "Value",
+            "Average",
+            "Median",
+            "Most Common",
+            "Random"});
+      this.cmbReplaceWith.Location = new System.Drawing.Point(47, 33);
+      this.cmbReplaceWith.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.cmbReplaceWith.Name = "cmbReplaceWith";
+      this.cmbReplaceWith.Size = new System.Drawing.Size(160, 24);
+      this.cmbReplaceWith.TabIndex = 1;
+      this.cmbReplaceWith.SelectedIndexChanged += new System.EventHandler(this.cmbReplaceWith_SelectedIndexChanged);
+      // 
+      // lblValueColon
+      // 
+      this.lblValueColon.AutoSize = true;
+      this.lblValueColon.Location = new System.Drawing.Point(209, 37);
+      this.lblValueColon.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblValueColon.Name = "lblValueColon";
+      this.lblValueColon.Size = new System.Drawing.Size(12, 17);
+      this.lblValueColon.TabIndex = 0;
+      this.lblValueColon.Text = ":";
+      // 
+      // label8
+      // 
+      this.label8.AutoSize = true;
+      this.label8.Location = new System.Drawing.Point(4, 37);
+      this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label8.Name = "label8";
+      this.label8.Size = new System.Drawing.Size(32, 17);
+      this.label8.TabIndex = 0;
+      this.label8.Text = "with";
+      // 
+      // label10
+      // 
+      this.label10.AutoSize = true;
+      this.label10.Location = new System.Drawing.Point(4, 4);
+      this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label10.Name = "label10";
+      this.label10.Size = new System.Drawing.Size(177, 17);
+      this.label10.TabIndex = 0;
+      this.label10.Text = "Replace missing values for";
+      // 
+      // tabDataShuffle
+      // 
+      this.tabDataShuffle.Controls.Add(this.shuffleSeparatelyCheckbox);
+      this.tabDataShuffle.Controls.Add(this.lblShuffleProperties);
+      this.tabDataShuffle.Location = new System.Drawing.Point(4, 22);
+      this.tabDataShuffle.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataShuffle.Name = "tabDataShuffle";
+      this.tabDataShuffle.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabDataShuffle.Size = new System.Drawing.Size(951, 176);
+      this.tabDataShuffle.TabIndex = 4;
+      this.tabDataShuffle.Text = "shuffle";
+      this.tabDataShuffle.UseVisualStyleBackColor = true;
+      // 
+      // shuffleSeparatelyCheckbox
+      // 
+      this.shuffleSeparatelyCheckbox.AutoSize = true;
+      this.shuffleSeparatelyCheckbox.Location = new System.Drawing.Point(8, 2);
+      this.shuffleSeparatelyCheckbox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.shuffleSeparatelyCheckbox.Name = "shuffleSeparatelyCheckbox";
+      this.shuffleSeparatelyCheckbox.Size = new System.Drawing.Size(312, 21);
+      this.shuffleSeparatelyCheckbox.TabIndex = 1;
+      this.shuffleSeparatelyCheckbox.Text = "Shuffle training and test partitions separately";
+      this.shuffleSeparatelyCheckbox.UseVisualStyleBackColor = true;
+      // 
+      // lblShuffleProperties
+      // 
+      this.lblShuffleProperties.AutoSize = true;
+      this.lblShuffleProperties.Enabled = false;
+      this.lblShuffleProperties.Location = new System.Drawing.Point(4, 4);
+      this.lblShuffleProperties.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblShuffleProperties.Name = "lblShuffleProperties";
+      this.lblShuffleProperties.Size = new System.Drawing.Size(154, 17);
+      this.lblShuffleProperties.TabIndex = 0;
+      this.lblShuffleProperties.Text = "No properties available";
+      // 
+      // grpBoxPreview
+      // 
+      this.grpBoxPreview.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.grpBoxPreview.Controls.Add(this.tabsPreview);
+      this.grpBoxPreview.Location = new System.Drawing.Point(5, 370);
+      this.grpBoxPreview.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.grpBoxPreview.Name = "grpBoxPreview";
+      this.grpBoxPreview.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.grpBoxPreview.Size = new System.Drawing.Size(976, 238);
+      this.grpBoxPreview.TabIndex = 4;
+      this.grpBoxPreview.TabStop = false;
+      this.grpBoxPreview.Text = "Preview";
+      // 
+      // tabsPreview
+      // 
+      this.tabsPreview.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabsPreview.Controls.Add(this.tabPreviewInactive);
+      this.tabsPreview.Controls.Add(this.tabPreviewDeleteColumnsInfo);
+      this.tabsPreview.Controls.Add(this.tabPreviewDeleteColumnsVariance);
+      this.tabsPreview.Controls.Add(this.tabPreviewDeleteRowsInfo);
+      this.tabsPreview.Controls.Add(this.tabPreviewReplaceMissingValues);
+      this.tabsPreview.Controls.Add(this.tabPreviewShuffle);
+      this.tabsPreview.ItemSize = new System.Drawing.Size(58, 18);
+      this.tabsPreview.Location = new System.Drawing.Point(8, 23);
+      this.tabsPreview.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabsPreview.Name = "tabsPreview";
+      this.tabsPreview.SelectedIndex = 0;
+      this.tabsPreview.Size = new System.Drawing.Size(959, 207);
+      this.tabsPreview.TabIndex = 3;
+      // 
+      // tabPreviewInactive
+      // 
+      this.tabPreviewInactive.Controls.Add(this.lblPreviewInActive);
+      this.tabPreviewInactive.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewInactive.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewInactive.Name = "tabPreviewInactive";
+      this.tabPreviewInactive.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewInactive.Size = new System.Drawing.Size(951, 181);
+      this.tabPreviewInactive.TabIndex = 5;
+      this.tabPreviewInactive.Text = "inactive";
+      this.tabPreviewInactive.UseVisualStyleBackColor = true;
+      // 
+      // lblPreviewInActive
+      // 
+      this.lblPreviewInActive.AutoSize = true;
+      this.lblPreviewInActive.Location = new System.Drawing.Point(4, 4);
+      this.lblPreviewInActive.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblPreviewInActive.Name = "lblPreviewInActive";
+      this.lblPreviewInActive.Size = new System.Drawing.Size(491, 51);
+      this.lblPreviewInActive.TabIndex = 2;
+      this.lblPreviewInActive.Text = "Filters are active and thus manipulations cannot be applied!\r\n\r\nPlease deactive t" +
+    "he filter(s) first in order to be able to perform manipulations.";
+      this.lblPreviewInActive.Visible = false;
+      // 
+      // tabPreviewDeleteColumnsInfo
+      // 
+      this.tabPreviewDeleteColumnsInfo.Controls.Add(this.panel1);
+      this.tabPreviewDeleteColumnsInfo.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewDeleteColumnsInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewDeleteColumnsInfo.Name = "tabPreviewDeleteColumnsInfo";
+      this.tabPreviewDeleteColumnsInfo.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewDeleteColumnsInfo.Size = new System.Drawing.Size(951, 181);
+      this.tabPreviewDeleteColumnsInfo.TabIndex = 0;
+      this.tabPreviewDeleteColumnsInfo.Text = "del columns info";
+      this.tabPreviewDeleteColumnsInfo.UseVisualStyleBackColor = true;
+      // 
+      // lblPreviewColumnsInfo
+      // 
+      this.lblPreviewColumnsInfo.AutoSize = true;
+      this.lblPreviewColumnsInfo.Dock = System.Windows.Forms.DockStyle.Left;
+      this.lblPreviewColumnsInfo.Location = new System.Drawing.Point(0, 0);
+      this.lblPreviewColumnsInfo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblPreviewColumnsInfo.Name = "lblPreviewColumnsInfo";
+      this.lblPreviewColumnsInfo.Size = new System.Drawing.Size(423, 17);
+      this.lblPreviewColumnsInfo.TabIndex = 1;
+      this.lblPreviewColumnsInfo.Text = "{0} columns with more than {1} % missing values would be deleted";
+      // 
+      // tabPreviewDeleteColumnsVariance
+      // 
+      this.tabPreviewDeleteColumnsVariance.Controls.Add(this.panel2);
+      this.tabPreviewDeleteColumnsVariance.Controls.Add(this.label12);
+      this.tabPreviewDeleteColumnsVariance.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewDeleteColumnsVariance.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewDeleteColumnsVariance.Name = "tabPreviewDeleteColumnsVariance";
+      this.tabPreviewDeleteColumnsVariance.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewDeleteColumnsVariance.Size = new System.Drawing.Size(951, 181);
+      this.tabPreviewDeleteColumnsVariance.TabIndex = 1;
+      this.tabPreviewDeleteColumnsVariance.Text = "del columns variance";
+      this.tabPreviewDeleteColumnsVariance.UseVisualStyleBackColor = true;
+      // 
+      // label12
+      // 
+      this.label12.AutoSize = true;
+      this.label12.Location = new System.Drawing.Point(8, 27);
+      this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.label12.Name = "label12";
+      this.label12.Size = new System.Drawing.Size(0, 17);
+      this.label12.TabIndex = 2;
+      // 
+      // lblPreviewColumnsVariance
+      // 
+      this.lblPreviewColumnsVariance.AutoSize = true;
+      this.lblPreviewColumnsVariance.Dock = System.Windows.Forms.DockStyle.Left;
+      this.lblPreviewColumnsVariance.Location = new System.Drawing.Point(0, 0);
+      this.lblPreviewColumnsVariance.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblPreviewColumnsVariance.Name = "lblPreviewColumnsVariance";
+      this.lblPreviewColumnsVariance.Size = new System.Drawing.Size(398, 17);
+      this.lblPreviewColumnsVariance.TabIndex = 2;
+      this.lblPreviewColumnsVariance.Text = "{0} columns with a variance smaller than {1} would be deleted.";
+      // 
+      // tabPreviewDeleteRowsInfo
+      // 
+      this.tabPreviewDeleteRowsInfo.Controls.Add(this.lblPreviewRowsInfo);
+      this.tabPreviewDeleteRowsInfo.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewDeleteRowsInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewDeleteRowsInfo.Name = "tabPreviewDeleteRowsInfo";
+      this.tabPreviewDeleteRowsInfo.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewDeleteRowsInfo.Size = new System.Drawing.Size(951, 181);
+      this.tabPreviewDeleteRowsInfo.TabIndex = 2;
+      this.tabPreviewDeleteRowsInfo.Text = "del rows info";
+      this.tabPreviewDeleteRowsInfo.UseVisualStyleBackColor = true;
+      // 
+      // lblPreviewRowsInfo
+      // 
+      this.lblPreviewRowsInfo.AutoSize = true;
+      this.lblPreviewRowsInfo.Location = new System.Drawing.Point(4, 4);
+      this.lblPreviewRowsInfo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblPreviewRowsInfo.Name = "lblPreviewRowsInfo";
+      this.lblPreviewRowsInfo.Size = new System.Drawing.Size(400, 17);
+      this.lblPreviewRowsInfo.TabIndex = 2;
+      this.lblPreviewRowsInfo.Text = "{0} rows with more than {1} % missing values would be deleted";
+      // 
+      // tabPreviewReplaceMissingValues
+      // 
+      this.tabPreviewReplaceMissingValues.Controls.Add(this.lblPreviewReplaceMissingValues);
+      this.tabPreviewReplaceMissingValues.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewReplaceMissingValues.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewReplaceMissingValues.Name = "tabPreviewReplaceMissingValues";
+      this.tabPreviewReplaceMissingValues.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewReplaceMissingValues.Size = new System.Drawing.Size(951, 181);
+      this.tabPreviewReplaceMissingValues.TabIndex = 6;
+      this.tabPreviewReplaceMissingValues.Text = "repl missing vals";
+      this.tabPreviewReplaceMissingValues.UseVisualStyleBackColor = true;
+      // 
+      // lblPreviewReplaceMissingValues
+      // 
+      this.lblPreviewReplaceMissingValues.AutoSize = true;
+      this.lblPreviewReplaceMissingValues.Location = new System.Drawing.Point(4, 4);
+      this.lblPreviewReplaceMissingValues.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblPreviewReplaceMissingValues.Name = "lblPreviewReplaceMissingValues";
+      this.lblPreviewReplaceMissingValues.Size = new System.Drawing.Size(449, 17);
+      this.lblPreviewReplaceMissingValues.TabIndex = 3;
+      this.lblPreviewReplaceMissingValues.Text = "{0} cells detected with missing values which would be replaced with {1}";
+      // 
+      // tabPreviewShuffle
+      // 
+      this.tabPreviewShuffle.Controls.Add(this.lblPreviewShuffle);
+      this.tabPreviewShuffle.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewShuffle.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewShuffle.Name = "tabPreviewShuffle";
+      this.tabPreviewShuffle.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.tabPreviewShuffle.Size = new System.Drawing.Size(951, 181);
+      this.tabPreviewShuffle.TabIndex = 4;
+      this.tabPreviewShuffle.Text = "shuffle";
+      this.tabPreviewShuffle.UseVisualStyleBackColor = true;
+      // 
+      // lblPreviewShuffle
+      // 
+      this.lblPreviewShuffle.AutoSize = true;
+      this.lblPreviewShuffle.Location = new System.Drawing.Point(4, 4);
+      this.lblPreviewShuffle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+      this.lblPreviewShuffle.Name = "lblPreviewShuffle";
+      this.lblPreviewShuffle.Size = new System.Drawing.Size(337, 17);
+      this.lblPreviewShuffle.TabIndex = 0;
+      this.lblPreviewShuffle.Text = "Data will be shuffled randomly - preview not possible";
+      // 
+      // label9
+      // 
+      this.label9.Location = new System.Drawing.Point(0, 0);
+      this.label9.Name = "label9";
+      this.label9.Size = new System.Drawing.Size(100, 23);
+      this.label9.TabIndex = 0;
+      // 
+      // panel1
+      // 
+      this.panel1.AutoScroll = true;
+      this.panel1.Controls.Add(this.lblPreviewColumnsInfo);
+      this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.panel1.Location = new System.Drawing.Point(4, 4);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(943, 173);
+      this.panel1.TabIndex = 2;
+      // 
+      // panel2
+      // 
+      this.panel2.AutoScroll = true;
+      this.panel2.Controls.Add(this.lblPreviewColumnsVariance);
+      this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.panel2.Location = new System.Drawing.Point(4, 4);
+      this.panel2.Name = "panel2";
+      this.panel2.Size = new System.Drawing.Size(943, 173);
+      this.panel2.TabIndex = 3;
+      // 
+      // ManipulationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.btnApply);
+      this.Controls.Add(this.grpBoxPreview);
+      this.Controls.Add(this.grpBoxData);
+      this.Controls.Add(this.lstMethods);
+      this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+      this.Name = "ManipulationView";
+      this.Size = new System.Drawing.Size(985, 651);
+      this.grpBoxData.ResumeLayout(false);
+      this.tabsData.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage1.PerformLayout();
+      this.tabDataDeleteColumnsInformation.ResumeLayout(false);
+      this.tabDataDeleteColumnsInformation.PerformLayout();
+      this.tabDataDeleteColumnsVariance.ResumeLayout(false);
+      this.tabDataDeleteColumnsVariance.PerformLayout();
+      this.tabDataDeleteRowsInfo.ResumeLayout(false);
+      this.tabDataDeleteRowsInfo.PerformLayout();
+      this.tabReplaceMissingValues.ResumeLayout(false);
+      this.tabReplaceMissingValues.PerformLayout();
+      this.tabDataShuffle.ResumeLayout(false);
+      this.tabDataShuffle.PerformLayout();
+      this.grpBoxPreview.ResumeLayout(false);
+      this.tabsPreview.ResumeLayout(false);
+      this.tabPreviewInactive.ResumeLayout(false);
+      this.tabPreviewInactive.PerformLayout();
+      this.tabPreviewDeleteColumnsInfo.ResumeLayout(false);
+      this.tabPreviewDeleteColumnsVariance.ResumeLayout(false);
+      this.tabPreviewDeleteColumnsVariance.PerformLayout();
+      this.tabPreviewDeleteRowsInfo.ResumeLayout(false);
+      this.tabPreviewDeleteRowsInfo.PerformLayout();
+      this.tabPreviewReplaceMissingValues.ResumeLayout(false);
+      this.tabPreviewReplaceMissingValues.PerformLayout();
+      this.tabPreviewShuffle.ResumeLayout(false);
+      this.tabPreviewShuffle.PerformLayout();
+      this.panel1.ResumeLayout(false);
+      this.panel1.PerformLayout();
+      this.panel2.ResumeLayout(false);
+      this.panel2.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListBox lstMethods;
+    private System.Windows.Forms.Button btnApply;
+    private System.Windows.Forms.GroupBox grpBoxData;
+    private System.Windows.Forms.GroupBox grpBoxPreview;
+    private System.Windows.Forms.TabControl tabsPreview;
+    private System.Windows.Forms.TabPage tabPreviewDeleteColumnsInfo;
+    private System.Windows.Forms.TabPage tabPreviewDeleteColumnsVariance;
+    private System.Windows.Forms.TabPage tabPreviewDeleteRowsInfo;
+    private System.Windows.Forms.TabPage tabPreviewShuffle;
+    private System.Windows.Forms.Label lblPreviewShuffle;
+    private System.Windows.Forms.TabPage tabPreviewInactive;
+    private System.Windows.Forms.Label lblPreviewColumnsInfo;
+    private System.Windows.Forms.Label label12;
+    private System.Windows.Forms.Label lblPreviewColumnsVariance;
+    private System.Windows.Forms.Label lblPreviewRowsInfo;
+    private System.Windows.Forms.TabPage tabPreviewReplaceMissingValues;
+    private System.Windows.Forms.Label lblPreviewReplaceMissingValues;
+    private System.Windows.Forms.Label label9;
+    private System.Windows.Forms.TabControl tabsData;
+    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.Label label7;
+    private System.Windows.Forms.TabPage tabDataDeleteColumnsInformation;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox txtDeleteColumnsInfo;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TabPage tabDataDeleteColumnsVariance;
+    private System.Windows.Forms.TextBox txtDeleteColumnsVariance;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.TabPage tabDataDeleteRowsInfo;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox txtDeleteRowsInfo;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.TabPage tabReplaceMissingValues;
+    private System.Windows.Forms.TextBox txtReplaceValue;
+    private System.Windows.Forms.ComboBox cmbReplaceWith;
+    private System.Windows.Forms.Label lblValueColon;
+    private System.Windows.Forms.Label label10;
+    private System.Windows.Forms.TabPage tabDataShuffle;
+    private System.Windows.Forms.Label lblShuffleProperties;
+    private System.Windows.Forms.ComboBox cmbVariableNames;
+    private System.Windows.Forms.Label label8;
+    private System.Windows.Forms.Label lblPreviewInActive;
+    private System.Windows.Forms.CheckBox shuffleSeparatelyCheckbox;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.Panel panel2;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs	(revision 15268)
@@ -0,0 +1,341 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Manipulation Chart View")]
+  [Content(typeof(ManipulationContent), true)]
+  public partial class ManipulationView : ItemView {
+    private Action[] validators;
+    private Action[] manipulations;
+
+    public new ManipulationContent Content {
+      get { return (ManipulationContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ManipulationView() {
+      InitializeComponent();
+      cmbReplaceWith.SelectedIndex = 0;
+      tabsData.Appearance = TabAppearance.FlatButtons;
+      tabsData.ItemSize = new Size(0, 1);
+      tabsData.SizeMode = TabSizeMode.Fixed;
+      tabsPreview.Appearance = TabAppearance.FlatButtons;
+      tabsPreview.ItemSize = new Size(0, 1);
+      tabsPreview.SizeMode = TabSizeMode.Fixed;
+
+      validators = new Action[] {
+        () => ValidateDeleteColumnsInfo(),
+        () => ValidateDeleteColumnsVariance(),
+        () => ValidateDeleteRowsInfo(),
+        () => ValidateReplaceWith(),
+        () => ValidateShuffle()
+      };
+
+      manipulations = new Action[] {
+        () => Content.ManipulationLogic.DeleteColumnsWithMissingValuesGreater(GetDeleteColumnsInfo()),
+        () => Content.ManipulationLogic.DeleteColumnsWithVarianceSmaller(GetDeleteColumnsVariance()),
+        () => Content.ManipulationLogic.DeleteRowsWithMissingValuesGreater(GetRowsColumnsInfo()),
+        () => ReplaceMissingValues(),
+        () => Content.ManipulationLogic.Shuffle(shuffleSeparatelyCheckbox.Checked)
+      };
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        cmbVariableNames.Items.Clear();
+        foreach (var name in Content.ManipulationLogic.VariableNames) {
+          cmbVariableNames.Items.Add(name);
+        }
+        cmbVariableNames.SelectedIndex = 0;
+        CheckFilters();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
+      base.DeregisterContentEvents();
+    }
+
+    private void FilterLogic_FilterChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        CheckFilters();
+      }
+    }
+
+    private void CheckFilters() {
+      if (Content.FilterLogic.IsFiltered) {
+        tabsPreview.SelectedIndex = 0;
+        lstMethods.Enabled = false;
+        tabsData.Enabled = false;
+        tabsPreview.Enabled = false;
+        lblPreviewInActive.Visible = true;
+        btnApply.Enabled = false;
+      } else {
+        lblPreviewInActive.Visible = false;
+        tabsData.Enabled = true;
+        tabsPreview.Enabled = true;
+        lstMethods.Enabled = true;
+        lstMethods_SelectedIndexChanged(null, null);
+      }
+    }
+
+    private double GetDeleteColumnsInfo() {
+      return double.Parse(txtDeleteColumnsInfo.Text);
+    }
+
+    private double GetDeleteColumnsVariance() {
+      return double.Parse(txtDeleteColumnsVariance.Text);
+    }
+
+    private double GetRowsColumnsInfo() {
+      return double.Parse(txtDeleteRowsInfo.Text);
+    }
+
+    private void ReplaceMissingValues() {
+      var allIndices = Content.SearchLogic.GetMissingValueIndices();
+      var columnIndex = cmbVariableNames.SelectedIndex;
+      var columnIndices = new Dictionary<int, IList<int>>{
+          {columnIndex,   allIndices[columnIndex]}
+      };
+
+      switch (cmbReplaceWith.SelectedIndex) {
+        case 0: //Value
+          Content.ManipulationLogic.ReplaceIndicesByValue(columnIndices, txtReplaceValue.Text);
+          break;
+        case 1: //Average
+          Content.ManipulationLogic.ReplaceIndicesByAverageValue(columnIndices);
+          break;
+        case 2: //Median
+          Content.ManipulationLogic.ReplaceIndicesByMedianValue(columnIndices);
+          break;
+        case 3: //Most Common
+          Content.ManipulationLogic.ReplaceIndicesByMostCommonValue(columnIndices);
+          break;
+        case 4: //Random
+          Content.ManipulationLogic.ReplaceIndicesByRandomValue(columnIndices);
+          break;
+      }
+    }
+
+    private void ValidateDeleteColumnsInfo() {
+      ValidateDoubleTextBox(txtDeleteColumnsInfo.Text);
+      if (btnApply.Enabled) {
+        var filteredColumns = Content.ManipulationLogic.ColumnsWithMissingValuesGreater(GetDeleteColumnsInfo());
+        int count = filteredColumns.Count;
+        int columnCount = Content.FilterLogic.PreprocessingData.Columns;
+        lblPreviewColumnsInfo.Text = string.Format("{0} column{1} of {2} ({3}) were detected with more than {4}% missing values.", count, (count > 1 || count == 0 ? "s" : ""), columnCount, string.Format("{0:F2}%", 100d / columnCount * count), txtDeleteColumnsInfo.Text);
+
+        //only display column names more than 0 and fewer than 50 are affected
+        if (count > 0 && count < 50) {
+          StringBuilder sb = new StringBuilder();
+          sb.Append(Environment.NewLine);
+          sb.Append("Columns: ");
+          sb.Append(Content.SearchLogic.VariableNames.ElementAt(filteredColumns.ElementAt(0)));
+          for (int i = 1; i < filteredColumns.Count; i++) {
+            string columnName = Content.SearchLogic.VariableNames.ElementAt(filteredColumns.ElementAt(i));
+            sb.Append(", ");
+            sb.Append(columnName);
+          }
+          sb.Append(Environment.NewLine);
+          sb.Append("Please press the button \"Apply Manipulation\" if you wish to delete those columns.");
+
+          lblPreviewColumnsInfo.Text += sb.ToString();
+        }
+
+        btnApply.Enabled = count > 0;
+      } else {
+        lblPreviewColumnsInfo.Text = "Preview not possible yet - please input the limit above.";
+      }
+    }
+
+    private void ValidateDeleteColumnsVariance() {
+      ValidateDoubleTextBox(txtDeleteColumnsVariance.Text);
+      if (btnApply.Enabled) {
+        var filteredColumns = Content.ManipulationLogic.ColumnsWithVarianceSmaller(GetDeleteColumnsVariance());
+        int count = filteredColumns.Count;
+        int columnCount = Content.FilterLogic.PreprocessingData.Columns;
+        lblPreviewColumnsVariance.Text = string.Format("{0} column{1} of {2} ({3}) were detected with a variance smaller than {4}.", count, (count > 1 || count == 0 ? "s" : ""), columnCount, string.Format("{0:F2}%", 100d / columnCount * count), txtDeleteColumnsVariance.Text);
+
+        //only display column names more than 0 and fewer than 50 are affected
+        if (count > 0 && count < 50) {
+          StringBuilder sb = new StringBuilder();
+          sb.Append(Environment.NewLine);
+          sb.Append("Columns: ");
+          sb.Append(Content.SearchLogic.VariableNames.ElementAt(filteredColumns.ElementAt(0)));
+          for (int i = 1; i < filteredColumns.Count; i++) {
+            string columnName = Content.SearchLogic.VariableNames.ElementAt(filteredColumns.ElementAt(i));
+            sb.Append(", ");
+            sb.Append(columnName);
+          }
+          sb.Append(Environment.NewLine);
+          sb.Append("Please press the button \"Apply Manipulation\" if you wish to delete those columns.");
+
+          lblPreviewColumnsVariance.Text += sb.ToString();
+        }
+
+        btnApply.Enabled = count > 0;
+      } else {
+        lblPreviewColumnsVariance.Text = "Preview not possible yet - please input the limit for the variance above.";
+      }
+    }
+
+    private void ValidateDeleteRowsInfo() {
+      ValidateDoubleTextBox(txtDeleteRowsInfo.Text);
+      if (btnApply.Enabled) {
+        int count = Content.ManipulationLogic.RowsWithMissingValuesGreater(GetRowsColumnsInfo()).Count;
+        int rowCount = Content.FilterLogic.PreprocessingData.Rows;
+        lblPreviewRowsInfo.Text = count + " row" + (count > 1 || count == 0 ? "s" : "") + " of " + rowCount + " (" + string.Format("{0:F2}%", 100d / rowCount * count) + ") were detected with more than " + txtDeleteRowsInfo.Text + "% missing values.";
+        if (count > 0) {
+          lblPreviewRowsInfo.Text += Environment.NewLine + Environment.NewLine + "Please press the button \"Apply Manipulation\" if you wish to delete those rows.";
+        } else {
+          btnApply.Enabled = false;
+        }
+      } else {
+        lblPreviewRowsInfo.Text = "Preview not possible yet - please input the limit above.";
+      }
+    }
+
+    private void ValidateReplaceWith() {
+      btnApply.Enabled = false;
+      string replaceWith = (string)cmbReplaceWith.SelectedItem;
+      int columnIndex = cmbVariableNames.SelectedIndex;
+
+      if (cmbReplaceWith.SelectedIndex == 0) {
+        string errorMessage;
+        string replaceValue = txtReplaceValue.Text;
+        if (string.IsNullOrEmpty(replaceValue)) {
+          lblPreviewReplaceMissingValues.Text = "Preview not possible yet - please input the text which will be used as replacement.";
+        } else if (!Content.ManipulationLogic.PreProcessingData.Validate(txtReplaceValue.Text, out errorMessage, columnIndex)) {
+          lblPreviewReplaceMissingValues.Text = "Preview not possible yet - " + errorMessage;
+        } else {
+          btnApply.Enabled = true;
+        }
+        replaceWith = "\"" + replaceValue + "\"";
+      } else {
+        btnApply.Enabled = true;
+      }
+      if (btnApply.Enabled) {
+        var allIndices = Content.SearchLogic.GetMissingValueIndices();
+        int count = allIndices[columnIndex].Count;
+        int cellCount = Content.FilterLogic.PreprocessingData.Rows * Content.FilterLogic.PreprocessingData.Columns;
+        lblPreviewReplaceMissingValues.Text = count + " cell" + (count > 1 || count == 0 ? "s" : "")
+          + " of " + cellCount + " (" + string.Format("{0:F2}%", 100d / cellCount * count) + ") were detected with missing values which would be replaced with " + replaceWith;
+        if (count > 0) {
+          lblPreviewReplaceMissingValues.Text += Environment.NewLine + Environment.NewLine + "Please press the button \"Apply Manipulation\" if you wish to perform the replacement.";
+        } else {
+          btnApply.Enabled = false;
+        }
+      }
+    }
+
+    private void ValidateShuffle() {
+      btnApply.Enabled = true;
+      lblShuffleProperties.Enabled = false;
+      lblShuffleProperties.Visible = false;
+      shuffleSeparatelyCheckbox.Enabled = true;
+      shuffleSeparatelyCheckbox.Visible = true;
+    }
+
+    private void lstMethods_SelectedIndexChanged(object sender, System.EventArgs e) {
+      int index = lstMethods.SelectedIndex;
+      tabsData.SelectedIndex = index + 1;
+      tabsPreview.SelectedIndex = index + 1;
+      btnApply.Enabled = false;
+
+      //in order that button is enabled if necessary input was already entered
+      if (index >= 0) {
+        validators[index]();
+      }
+    }
+
+    private void btnApply_Click(object sender, System.EventArgs e) {
+      manipulations[lstMethods.SelectedIndex]();
+      switch (lstMethods.SelectedIndex) {
+        case 0:
+          lblPreviewColumnsInfo.Text = "columns successfully deleted.";
+          break;
+        case 1:
+          lblPreviewColumnsVariance.Text = "columns successfully deleted.";
+          break;
+        case 2:
+          lblPreviewRowsInfo.Text = "rows successfully deleted.";
+          break;
+        case 3:
+          lblPreviewReplaceMissingValues.Text = "missing values successfully replaced.";
+          btnApply.Enabled = false;
+          break;
+        case 4:
+          lblPreviewShuffle.Text = "dataset shuffled successfully.";
+          btnApply.Enabled = false;
+          break;
+      }
+    }
+
+    private void ValidateDoubleTextBox(String text) {
+      btnApply.Enabled = false;
+      if (!string.IsNullOrEmpty(text)) {
+        double percent;
+        if (Double.TryParse(text, NumberStyles.Number ^ NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out percent)) {
+          btnApply.Enabled = true;
+        }
+      }
+    }
+
+    private void txtDeleteColumnsInfo_TextChanged(object sender, EventArgs e) {
+      ValidateDeleteColumnsInfo();
+    }
+
+    private void txtDeleteColumnsVariance_TextChanged(object sender, EventArgs e) {
+      ValidateDeleteColumnsVariance();
+    }
+
+    private void txtDeleteRowsInfo_TextChanged(object sender, EventArgs e) {
+      ValidateDeleteRowsInfo();
+    }
+
+    private void cmbReplaceWith_SelectedIndexChanged(object sender, EventArgs e) {
+      bool isReplaceWithValueSelected = cmbReplaceWith.SelectedIndex == 0;
+      lblValueColon.Visible = isReplaceWithValueSelected;
+      txtReplaceValue.Visible = isReplaceWithValueSelected;
+      ValidateReplaceWith();
+    }
+
+    private void txtReplaceValue_TextChanged(object sender, EventArgs e) {
+      ValidateReplaceWith();
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Plugin.cs.frame	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Plugin.cs.frame	(revision 15268)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Data plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.DataPreprocessing.Views", "3.4.4.$WCREV$")]
+  [PluginFile("HeuristicLab.DataPreprocessing.Views-3.4.dll", PluginFileType.Assembly)]
+  [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.DataPreprocessing", "3.4")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")] 
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimizer", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Views", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances.DataAnalysis", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances.DataAnalysis.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
+  public class HeuristicLabDataPreprocessingViewPlugin : PluginBase {
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs	(revision 15268)
@@ -0,0 +1,166 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class PreprocessingChartView {
+    /// <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.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.sizeGroupBox = new System.Windows.Forms.GroupBox();
+      this.columnsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.columnsLabel = new System.Windows.Forms.Label();
+      this.scrollPanel = new System.Windows.Forms.Panel();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.sizeGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.columnsNumericUpDown)).BeginInit();
+      this.scrollPanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.sizeGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.scrollPanel);
+      this.splitContainer.Panel2.Resize += new System.EventHandler(this.splitContainer_Panel2_Resize);
+      // 
+      // tableLayoutPanel
+      // 
+      this.tableLayoutPanel.AutoSize = true;
+      this.tableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.tableLayoutPanel.ColumnCount = 1;
+      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.tableLayoutPanel.Name = "tableLayoutPanel";
+      this.tableLayoutPanel.RowCount = 1;
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.tableLayoutPanel.Size = new System.Drawing.Size(0, 0);
+      this.tableLayoutPanel.TabIndex = 0;
+      this.tableLayoutPanel.Layout += new System.Windows.Forms.LayoutEventHandler(this.tableLayoutPanel_Layout);
+      // 
+      // sizeGroupBox
+      // 
+      this.sizeGroupBox.Controls.Add(this.columnsNumericUpDown);
+      this.sizeGroupBox.Controls.Add(this.columnsLabel);
+      this.sizeGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 359);
+      this.sizeGroupBox.Name = "sizeGroupBox";
+      this.sizeGroupBox.Size = new System.Drawing.Size(180, 44);
+      this.sizeGroupBox.TabIndex = 8;
+      this.sizeGroupBox.TabStop = false;
+      this.sizeGroupBox.Text = "Chart Size";
+      // 
+      // columnsNumericUpDown
+      // 
+      this.columnsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.columnsNumericUpDown.Location = new System.Drawing.Point(88, 14);
+      this.columnsNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.columnsNumericUpDown.Name = "columnsNumericUpDown";
+      this.columnsNumericUpDown.Size = new System.Drawing.Size(86, 20);
+      this.columnsNumericUpDown.TabIndex = 3;
+      this.columnsNumericUpDown.Value = new decimal(new int[] {
+            3,
+            0,
+            0,
+            0});
+      this.columnsNumericUpDown.ValueChanged += new System.EventHandler(this.columnsNumericUpDown_ValueChanged);
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.AutoSize = true;
+      this.columnsLabel.Location = new System.Drawing.Point(6, 16);
+      this.columnsLabel.Name = "columnsLabel";
+      this.columnsLabel.Size = new System.Drawing.Size(76, 13);
+      this.columnsLabel.TabIndex = 1;
+      this.columnsLabel.Text = "Max. Columns:";
+      // 
+      // scrollPanel
+      // 
+      this.scrollPanel.AutoScroll = true;
+      this.scrollPanel.Controls.Add(this.tableLayoutPanel);
+      this.scrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scrollPanel.Location = new System.Drawing.Point(0, 0);
+      this.scrollPanel.Name = "scrollPanel";
+      this.scrollPanel.Size = new System.Drawing.Size(470, 403);
+      this.scrollPanel.TabIndex = 1;
+      // 
+      // PreprocessingChartView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "PreprocessingChartView";
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.sizeGroupBox.ResumeLayout(false);
+      this.sizeGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.columnsNumericUpDown)).EndInit();
+      this.scrollPanel.ResumeLayout(false);
+      this.scrollPanel.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+    private System.Windows.Forms.NumericUpDown columnsNumericUpDown;
+    private System.Windows.Forms.Label columnsLabel;
+    private System.Windows.Forms.Panel scrollPanel;
+    protected System.Windows.Forms.GroupBox sizeGroupBox;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 15268)
@@ -0,0 +1,228 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Analysis.Views;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Preprocessing Chart View")]
+  [Content(typeof(PreprocessingChartContent), false)]
+  public partial class PreprocessingChartView : PreprocessingCheckedVariablesView {
+    protected Dictionary<string, DataTable> dataTables;
+    protected Dictionary<string, DataTableView> dataTableViews;
+
+    public static readonly Color[] Colors = {
+      Color.FromArgb(59, 136, 239), Color.FromArgb(252, 177, 59), Color.FromArgb(226, 64, 10),
+      Color.FromArgb(5, 100, 146), Color.FromArgb(191, 191, 191), Color.FromArgb(26, 59, 105),
+      Color.FromArgb(255, 226, 126), Color.FromArgb(18, 156, 221), Color.FromArgb(202, 107, 75),
+      Color.FromArgb(0, 92, 219), Color.FromArgb(243, 210, 136), Color.FromArgb(80, 99, 129),
+      Color.FromArgb(241, 185, 168), Color.FromArgb(224, 131, 10), Color.FromArgb(120, 147, 190)
+    };
+
+    public PreprocessingChartView() {
+      InitializeComponent();
+      dataTables = new Dictionary<string, DataTable>();
+      dataTableViews = new Dictionary<string, DataTableView>();
+      scrollPanel.HorizontalScroll.Visible = false;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        InitData();
+        GenerateLayout();
+      }
+    }
+
+    protected virtual int GetNumberOfVisibleDataTables() {
+      return Content.VariableItemList.CheckedItems.Count();
+    }
+
+    protected virtual IEnumerable<DataTableView> GetVisibleDataTables() {
+      foreach (var name in Content.VariableItemList.CheckedItems) {
+        if (!dataTableViews.ContainsKey(name.Value.Value))
+          dataTableViews.Add(name.Value.Value, new DataTableView() { Content = dataTables[name.Value.Value], ShowChartOnly = true });
+        yield return dataTableViews[name.Value.Value];
+      }
+    }
+
+    protected virtual DataTable CreateDataTable(string variableName) {
+      return null;
+    }
+
+    protected virtual void InitData() {
+      dataTables.Clear();
+      dataTableViews.Clear();
+      foreach (var variable in Content.VariableItemList.Select(v => v.Value)) {
+        dataTables.Add(variable, CreateDataTable(variable));
+      }
+    }
+
+    protected override void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+      base.CheckedItemsChanged(sender, checkedItems);
+
+      GenerateLayout();
+    }
+
+
+    #region Add/Remove/Update Variable, Reset
+    protected override void AddVariable(string name) {
+      base.AddVariable(name);
+      dataTables.Add(name, CreateDataTable(name));
+
+      GenerateLayout();
+    }
+
+    // remove variable from data table and item list
+    protected override void RemoveVariable(string name) {
+      base.RemoveVariable(name);
+      dataTables.Remove(name);
+      dataTableViews.Remove(name);
+
+      GenerateLayout();
+    }
+
+    protected override void UpdateVariable(string name) {
+      base.UpdateVariable(name);
+      dataTables.Remove(name);
+      var newDataTable = CreateDataTable(name);
+      dataTables.Add(name, newDataTable);
+      dataTableViews[name].Content = newDataTable;
+      GenerateLayout();
+    }
+    protected override void ResetAllVariables() {
+      InitData();
+    }
+    #endregion
+
+    protected override void CheckedChangedUpdate() {
+      GenerateLayout();
+    }
+
+    #region Generate Layout
+    protected void GenerateLayout() {
+      if (SuppressCheckedChangedUpdate)
+        return;
+
+      scrollPanel.SuspendRepaint();
+
+      ClearTableLayout();
+
+      int nrCharts = GetNumberOfVisibleDataTables();
+
+      // Set columns and rows based on number of items
+      int columns = Math.Min(nrCharts, (int)columnsNumericUpDown.Value);
+      int rows = (int)Math.Ceiling((float)nrCharts / columns);
+
+      tableLayoutPanel.ColumnCount = Math.Max(columns, 0);
+      tableLayoutPanel.RowCount = Math.Max(rows, 0);
+
+      if (columns > 0 && rows > 0) {
+        var width = (splitContainer.Panel2.Width - SystemInformation.VerticalScrollBarWidth) / columns;
+        var height = width * 0.75f;
+
+        using (var enumerator = GetVisibleDataTables().GetEnumerator()) {
+          for (int row = 0; row < rows; row++) {
+            tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, height));
+            for (int col = 0; col < columns; col++) {
+              if (row == 0) {
+                // Add a column-style only when creating the first row
+                tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, width));
+              }
+
+              if (enumerator.MoveNext())
+                AddDataTableToTableLayout(enumerator.Current, row, col);
+
+            }
+          }
+        }
+        tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 0));
+      }
+
+      scrollPanel.ResumeRepaint(true);
+    }
+
+    private void AddDataTableToTableLayout(DataTableView dataTable, int row, int col) {
+      if (dataTable == null) {
+        // dummy panel for empty field 
+        Panel p = new Panel { Dock = DockStyle.Fill };
+        tableLayoutPanel.Controls.Add(p, col, row);
+      } else {
+        dataTable.Dock = DockStyle.Fill;
+        tableLayoutPanel.Controls.Add(dataTable, col, row);
+      }
+    }
+
+    protected void ClearTableLayout() {
+      //Clear out the existing controls
+      tableLayoutPanel.Controls.Clear();
+
+      //Clear out the existing row and column styles
+      tableLayoutPanel.ColumnStyles.Clear();
+      tableLayoutPanel.RowStyles.Clear();
+    }
+    //Remove horizontal scroll bar if visible
+    private void tableLayoutPanel_Layout(object sender, LayoutEventArgs e) {
+      if (tableLayoutPanel.HorizontalScroll.Visible) {
+        // Add padding on the right in order to accomodate the vertical scrollbar
+        tableLayoutPanel.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0);
+      } else {
+        // Reset padding
+        tableLayoutPanel.Padding = new Padding(0);
+      }
+    }
+    #endregion
+
+    private void columnsNumericUpDown_ValueChanged(object sender, System.EventArgs e) {
+      GenerateLayout();
+    }
+
+    private void splitContainer_Panel2_Resize(object sender, EventArgs e) {
+      if (SuppressCheckedChangedUpdate)
+        return;
+
+      scrollPanel.SuspendRepaint();
+
+      if (tableLayoutPanel.ColumnCount > 0 && tableLayoutPanel.RowCount > 0) {
+        var width = (splitContainer.Panel2.Width - SystemInformation.VerticalScrollBarWidth) / tableLayoutPanel.ColumnCount;
+        var height = width * 0.75f;
+
+        for (int i = 0; i < tableLayoutPanel.RowStyles.Count - 1; i++) {
+          tableLayoutPanel.RowStyles[i].Height = height;
+        }
+        for (int i = 0; i < tableLayoutPanel.ColumnStyles.Count; i++) {
+          tableLayoutPanel.ColumnStyles[i].Width = width;
+        }
+      }
+
+      scrollPanel.ResumeRepaint(true);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 15268)
@@ -0,0 +1,170 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class PreprocessingCheckedVariablesView {
+    /// <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();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesListView = new System.Windows.Forms.ListView();
+      this.columnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.variablesGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(940, 698);
+      this.splitContainer.SplitterDistance = 180;
+      this.splitContainer.TabIndex = 7;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.uncheckAllButton);
+      this.variablesGroupBox.Controls.Add(this.checkAllButton);
+      this.variablesGroupBox.Controls.Add(this.checkInputsTargetButton);
+      this.variablesGroupBox.Controls.Add(this.variablesListView);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(180, 698);
+      this.variablesGroupBox.TabIndex = 7;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Variables";
+      // 
+      // variablesListView
+      // 
+      this.variablesListView.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.variablesListView.CheckBoxes = true;
+      this.variablesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader});
+      this.variablesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variablesListView.HideSelection = false;
+      this.variablesListView.Location = new System.Drawing.Point(6, 49);
+      this.variablesListView.Name = "variablesListView";
+      this.variablesListView.Size = new System.Drawing.Size(168, 643);
+      this.variablesListView.TabIndex = 12;
+      this.variablesListView.UseCompatibleStateImageBehavior = false;
+      this.variablesListView.View = System.Windows.Forms.View.Details;
+      // 
+      // columnHeader
+      // 
+      this.columnHeader.Text = "";
+      this.columnHeader.Width = 164;
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(66, 19);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 9;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "Show None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(6, 19);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.checkAllButton, "Show All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
+      // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(36, 19);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 8;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Show Inputs & Target");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // PreprocessingCheckedVariablesView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "PreprocessingCheckedVariablesView";
+      this.Size = new System.Drawing.Size(940, 698);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ColumnHeader columnHeader;
+    private System.Windows.Forms.ListView variablesListView;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs	(revision 15268)
@@ -0,0 +1,157 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Preprocessing Checked Variables View")]
+  [Content(typeof(PreprocessingChartContent), false)]
+  public abstract partial class PreprocessingCheckedVariablesView : ItemView {
+    protected bool SuppressCheckedChangedUpdate = false;
+
+    public new PreprocessingChartContent Content {
+      get { return (PreprocessingChartContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected PreprocessingCheckedVariablesView() {
+      InitializeComponent();
+    }
+
+    protected bool IsVariableChecked(string name) {
+      return Content.VariableItemList.CheckedItems.Any(x => x.Value.Value == name);
+    }
+    protected IList<string> GetCheckedVariables() {
+      return Content.VariableItemList.CheckedItems.Select(i => i.Value.Value).ToList();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) return;
+
+      variablesListView.ItemChecked -= variablesListView_ItemChecked;
+      variablesListView.Items.Clear();
+      foreach (var variable in Content.VariableItemList) {
+        bool isInputTarget = Content.PreprocessingData.InputVariables.Contains(variable.Value)
+          || Content.PreprocessingData.TargetVariable == variable.Value;
+        variablesListView.Items.Add(new ListViewItem(variable.Value) {
+          Tag = variable,
+          Checked = IsVariableChecked(variable.Value),
+          ForeColor = isInputTarget ? Color.Black : Color.Gray
+        });
+      }
+      variablesListView.ItemChecked += variablesListView_ItemChecked;
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PreprocessingData.Changed += PreprocessingData_Changed;
+      Content.VariableItemList.CheckedItemsChanged += CheckedItemsChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PreprocessingData.Changed -= PreprocessingData_Changed;
+      Content.VariableItemList.CheckedItemsChanged -= CheckedItemsChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected virtual void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+      // sync listview
+      foreach (var item in checkedItems.Items)
+        variablesListView.Items[item.Index].Checked = Content.VariableItemList.ItemChecked(item.Value);
+    }
+    private void variablesListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      // sync checked item list
+      var variable = (StringValue)e.Item.Tag;
+      Content.VariableItemList.SetItemCheckedState(variable, e.Item.Checked);
+    }
+
+    private void PreprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      switch (e.Type) {
+        case DataPreprocessingChangedEventType.DeleteColumn:
+          RemoveVariable(Content.PreprocessingData.GetVariableName(e.Column));
+          break;
+        case DataPreprocessingChangedEventType.AddColumn:
+          AddVariable(Content.PreprocessingData.GetVariableName(e.Column));
+          break;
+        case DataPreprocessingChangedEventType.ChangeColumn:
+        case DataPreprocessingChangedEventType.ChangeItem:
+          UpdateVariable(Content.PreprocessingData.GetVariableName(e.Column));
+          break;
+        default:
+          ResetAllVariables();
+          break;
+      }
+    }
+
+    protected virtual void AddVariable(string name) {
+      Content.VariableItemList.Add(new StringValue(name));
+      if (!Content.PreprocessingData.InputVariables.Contains(name) && Content.PreprocessingData.TargetVariable != name) {
+        var listViewItem = variablesListView.FindItemWithText(name, false, 0, false);
+        listViewItem.ForeColor = Color.LightGray;
+      }
+    }
+    protected virtual void RemoveVariable(string name) {
+      var stringValue = Content.VariableItemList.SingleOrDefault(n => n.Value == name);
+      if (stringValue != null)
+        Content.VariableItemList.Remove(stringValue);
+    }
+    protected virtual void UpdateVariable(string name) { }
+    protected virtual void ResetAllVariables() { }
+    protected virtual void CheckedChangedUpdate() { }
+
+    private void checkInputsTargetButton_Click(object sender, System.EventArgs e) {
+      SuppressCheckedChangedUpdate = true;
+      foreach (var name in Content.VariableItemList) {
+        var isInputTarget = Content.PreprocessingData.InputVariables.Contains(name.Value) || Content.PreprocessingData.TargetVariable == name.Value;
+        Content.VariableItemList.SetItemCheckedState(name, isInputTarget);
+      }
+      SuppressCheckedChangedUpdate = false;
+      CheckedChangedUpdate();
+    }
+
+    private void checkAllButton_Click(object sender, System.EventArgs e) {
+      SuppressCheckedChangedUpdate = true;
+      foreach (var name in Content.VariableItemList) {
+        Content.VariableItemList.SetItemCheckedState(name, true);
+      }
+      SuppressCheckedChangedUpdate = false;
+      CheckedChangedUpdate();
+    }
+
+    private void uncheckAllButton_Click(object sender, System.EventArgs e) {
+      SuppressCheckedChangedUpdate = true;
+      foreach (var name in Content.VariableItemList) {
+        Content.VariableItemList.SetItemCheckedState(name, false);
+      }
+      SuppressCheckedChangedUpdate = false;
+      CheckedChangedUpdate();
+    }
+  }
+}
+
+
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.Designer.cs	(revision 15268)
@@ -0,0 +1,135 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class PreprocessingFeatureCorrelationView {
+    /// <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();
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.correlationView = new HeuristicLab.Problems.DataAnalysis.Views.FeatureCorrelationView();
+      this.variablesLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(736, 5);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Inputs & Target Variables");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(766, 5);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(706, 5);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.checkAllButton, "All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
+      // 
+      // correlationView
+      // 
+      this.correlationView.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.correlationView.Caption = "Feature Correlation View";
+      this.correlationView.Content = null;
+      this.correlationView.Location = new System.Drawing.Point(0, 0);
+      this.correlationView.Name = "correlationView";
+      this.correlationView.ReadOnly = false;
+      this.correlationView.Size = new System.Drawing.Size(1013, 640);
+      this.correlationView.TabIndex = 18;
+      // 
+      // variablesLabel
+      // 
+      this.variablesLabel.AutoSize = true;
+      this.variablesLabel.Location = new System.Drawing.Point(650, 11);
+      this.variablesLabel.Name = "variablesLabel";
+      this.variablesLabel.Size = new System.Drawing.Size(50, 13);
+      this.variablesLabel.TabIndex = 15;
+      this.variablesLabel.Text = "Variables";
+      // 
+      // PreprocessingFeatureCorrelationView
+      // 
+      this.Controls.Add(this.variablesLabel);
+      this.Controls.Add(this.checkInputsTargetButton);
+      this.Controls.Add(this.uncheckAllButton);
+      this.Controls.Add(this.checkAllButton);
+      this.Controls.Add(this.correlationView);
+      this.Name = "PreprocessingFeatureCorrelationView";
+      this.Size = new System.Drawing.Size(1013, 640);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
+    private HeuristicLab.Problems.DataAnalysis.Views.FeatureCorrelationView correlationView;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Label variablesLabel;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.cs	(revision 15268)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Data.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Preprocessing Feature Correlation View")]
+  [Content(typeof(CorrelationMatrixContent), true)]
+  public partial class PreprocessingFeatureCorrelationView : AsynchronousContentView {
+    public new CorrelationMatrixContent Content {
+      get { return (CorrelationMatrixContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public PreprocessingFeatureCorrelationView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Changed += Data_Changed;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Changed -= Data_Changed;
+      base.DeregisterContentEvents();
+    }
+
+    private void Data_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      OnContentChanged();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      correlationView.Content = Content != null ? Content.ProblemData : null;
+    }
+
+    #region Check Variables
+    private void checkAllButton_Click(object sender, System.EventArgs e) {
+      SetVisibility(x => true);
+    }
+    private void checkInputsTargetButton_Click(object sender, System.EventArgs e) {
+      var ppd = Content.PreprocessingData;
+      SetVisibility(x => ppd.InputVariables.Contains(x) || ppd.TargetVariable == x);
+    }
+    private void uncheckAllButton_Click(object sender, System.EventArgs e) {
+      SetVisibility(x => false);
+    }
+    private void SetVisibility(Func<string, bool> check) {
+      var dataView = (EnhancedStringConvertibleMatrixView)correlationView.Controls.Find("DataView", searchAllChildren: true).Single();
+      var ppd = Content.PreprocessingData;
+      var visibilities = ppd.VariableNames.Where((v, i) => ppd.VariableHasType<double>(i)).Select(check).ToList();
+      if (dataView.Content.Rows != dataView.Content.Columns || dataView.Content.Rows != visibilities.Count)
+        return;
+
+      dataView.ColumnVisibility = visibilities;
+      dataView.RowVisibility = visibilities;
+      dataView.UpdateColumnHeaders();
+      dataView.UpdateRowHeaders();
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.Designer.cs	(revision 15268)
@@ -0,0 +1,93 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.DataPreprocessing.Views {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class PreprocessingIcons {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal PreprocessingIcons() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.DataPreprocessing.Views.PreprocessingIcons", typeof(PreprocessingIcons).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap All {
+            get {
+                object obj = ResourceManager.GetObject("All", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Inputs {
+            get {
+                object obj = ResourceManager.GetObject("Inputs", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap None {
+            get {
+                object obj = ResourceManager.GetObject("None", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.resx
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.resx	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.resx	(revision 15268)
@@ -0,0 +1,130 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="All" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Icons\All.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Inputs" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Icons\Inputs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="None" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Icons\None.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 15268)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("49b6ce71-b783-47f7-99af-c63365261c45")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.4.$WCREV$")]
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.Designer.cs	(revision 15268)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class RenameColumnsDialog {
+    /// <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.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.ColumName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(48, 302);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(129, 302);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 1;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.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.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.ColumnHeadersVisible = false;
+      this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ColumName});
+      this.dataGridView.Location = new System.Drawing.Point(0, 0);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.RowHeadersVisible = false;
+      this.dataGridView.Size = new System.Drawing.Size(207, 296);
+      this.dataGridView.TabIndex = 2;
+      // 
+      // ColumName
+      // 
+      this.ColumName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+      this.ColumName.HeaderText = "Column Name";
+      this.ColumName.Name = "ColumName";
+      this.ColumName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+      // 
+      // RenameColumnsDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(207, 330);
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "RenameColumnsDialog";
+      this.ShowIcon = false;
+      this.Text = "Rename Columns";
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.DataGridView dataGridView;
+    private System.Windows.Forms.DataGridViewTextBoxColumn ColumName;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.cs	(revision 15268)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  public partial class RenameColumnsDialog : Form {
+    public IList<string> ColumnNames {
+      get {
+        var names = new List<string>(dataGridView.RowCount);
+        for (int i = 0; i < dataGridView.RowCount; i++) {
+          names.Insert(i, (string)dataGridView[0, i].Value);
+        }
+        return names.AsReadOnly();
+      }
+    }
+
+    public RenameColumnsDialog() : this(Enumerable.Empty<string>()) { }
+    public RenameColumnsDialog(IEnumerable<string> names) {
+      InitializeComponent();
+      foreach (var name in names) {
+        dataGridView.Rows.Add(name);
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 15268)
@@ -0,0 +1,625 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class ScatterPlotMultiView {
+    /// <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.frameTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.columnHeaderScrollPanel = new System.Windows.Forms.Panel();
+      this.columnHeaderTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.rowHeaderScrollPanel = new System.Windows.Forms.Panel();
+      this.rowHeaderTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.bodyScrollPanel = new System.Windows.Forms.Panel();
+      this.bodyTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.sizeGroupBox = new System.Windows.Forms.GroupBox();
+      this.heightNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.widthNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.heightLabel = new System.Windows.Forms.Label();
+      this.widthLabel = new System.Windows.Forms.Label();
+      this.lockAspectCheckBox = new System.Windows.Forms.CheckBox();
+      this.pointSizeNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.pointSizeLabel = new System.Windows.Forms.Label();
+      this.regressionGroupBox = new System.Windows.Forms.GroupBox();
+      this.regressionTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.polynomialRegressionOrderNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.regressionTyleLabel = new System.Windows.Forms.Label();
+      this.groupingOptionsBox = new System.Windows.Forms.GroupBox();
+      this.legendGroupBox = new System.Windows.Forms.GroupBox();
+      this.legendCheckbox = new System.Windows.Forms.CheckBox();
+      this.legendOrderComboBox = new System.Windows.Forms.ComboBox();
+      this.legendOrderLabel = new System.Windows.Forms.Label();
+      this.aggregationLabel = new System.Windows.Forms.Label();
+      this.aggregationComboBox = new System.Windows.Forms.ComboBox();
+      this.groupingComboBox = new System.Windows.Forms.ComboBox();
+      this.opacityLabel = new System.Windows.Forms.Label();
+      this.pointOpacityNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.pointsGroupBox = new System.Windows.Forms.GroupBox();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.frameTableLayoutPanel.SuspendLayout();
+      this.columnHeaderScrollPanel.SuspendLayout();
+      this.rowHeaderScrollPanel.SuspendLayout();
+      this.bodyScrollPanel.SuspendLayout();
+      this.sizeGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.heightNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.widthNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.pointSizeNumericUpDown)).BeginInit();
+      this.regressionGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).BeginInit();
+      this.groupingOptionsBox.SuspendLayout();
+      this.legendGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pointOpacityNumericUpDown)).BeginInit();
+      this.pointsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.sizeGroupBox);
+      this.splitContainer.Panel1.Controls.Add(this.pointsGroupBox);
+      this.splitContainer.Panel1.Controls.Add(this.groupingOptionsBox);
+      this.splitContainer.Panel1.Controls.Add(this.regressionGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.frameTableLayoutPanel);
+      this.splitContainer.Size = new System.Drawing.Size(589, 451);
+      // 
+      // frameTableLayoutPanel
+      // 
+      this.frameTableLayoutPanel.ColumnCount = 2;
+      this.frameTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 40F));
+      this.frameTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.frameTableLayoutPanel.Controls.Add(this.columnHeaderScrollPanel, 1, 0);
+      this.frameTableLayoutPanel.Controls.Add(this.rowHeaderScrollPanel, 0, 1);
+      this.frameTableLayoutPanel.Controls.Add(this.bodyScrollPanel, 1, 1);
+      this.frameTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.frameTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.frameTableLayoutPanel.Name = "frameTableLayoutPanel";
+      this.frameTableLayoutPanel.RowCount = 2;
+      this.frameTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
+      this.frameTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.frameTableLayoutPanel.Size = new System.Drawing.Size(405, 451);
+      this.frameTableLayoutPanel.TabIndex = 0;
+      // 
+      // columnHeaderScrollPanel
+      // 
+      this.columnHeaderScrollPanel.Controls.Add(this.columnHeaderTableLayoutPanel);
+      this.columnHeaderScrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.columnHeaderScrollPanel.Location = new System.Drawing.Point(40, 0);
+      this.columnHeaderScrollPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.columnHeaderScrollPanel.Name = "columnHeaderScrollPanel";
+      this.columnHeaderScrollPanel.Size = new System.Drawing.Size(365, 40);
+      this.columnHeaderScrollPanel.TabIndex = 3;
+      // 
+      // columnHeaderTableLayoutPanel
+      // 
+      this.columnHeaderTableLayoutPanel.AutoSize = true;
+      this.columnHeaderTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.columnHeaderTableLayoutPanel.ColumnCount = 2;
+      this.columnHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Left;
+      this.columnHeaderTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.columnHeaderTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.columnHeaderTableLayoutPanel.Name = "columnHeaderTableLayoutPanel";
+      this.columnHeaderTableLayoutPanel.RowCount = 1;
+      this.columnHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.Size = new System.Drawing.Size(0, 40);
+      this.columnHeaderTableLayoutPanel.TabIndex = 1;
+      // 
+      // rowHeaderScrollPanel
+      // 
+      this.rowHeaderScrollPanel.Controls.Add(this.rowHeaderTableLayoutPanel);
+      this.rowHeaderScrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.rowHeaderScrollPanel.Location = new System.Drawing.Point(0, 40);
+      this.rowHeaderScrollPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.rowHeaderScrollPanel.Name = "rowHeaderScrollPanel";
+      this.rowHeaderScrollPanel.Size = new System.Drawing.Size(40, 411);
+      this.rowHeaderScrollPanel.TabIndex = 4;
+      // 
+      // rowHeaderTableLayoutPanel
+      // 
+      this.rowHeaderTableLayoutPanel.AutoSize = true;
+      this.rowHeaderTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.rowHeaderTableLayoutPanel.ColumnCount = 1;
+      this.rowHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Top;
+      this.rowHeaderTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.rowHeaderTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.rowHeaderTableLayoutPanel.Name = "rowHeaderTableLayoutPanel";
+      this.rowHeaderTableLayoutPanel.RowCount = 2;
+      this.rowHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.Size = new System.Drawing.Size(40, 0);
+      this.rowHeaderTableLayoutPanel.TabIndex = 2;
+      // 
+      // bodyScrollPanel
+      // 
+      this.bodyScrollPanel.AutoScroll = true;
+      this.bodyScrollPanel.Controls.Add(this.bodyTableLayoutPanel);
+      this.bodyScrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.bodyScrollPanel.Location = new System.Drawing.Point(40, 40);
+      this.bodyScrollPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.bodyScrollPanel.Name = "bodyScrollPanel";
+      this.bodyScrollPanel.Size = new System.Drawing.Size(365, 411);
+      this.bodyScrollPanel.TabIndex = 5;
+      this.bodyScrollPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.bodyScrollPanel_Scroll);
+      // 
+      // bodyTableLayoutPanel
+      // 
+      this.bodyTableLayoutPanel.AutoSize = true;
+      this.bodyTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.bodyTableLayoutPanel.ColumnCount = 2;
+      this.bodyTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.bodyTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.bodyTableLayoutPanel.Name = "bodyTableLayoutPanel";
+      this.bodyTableLayoutPanel.RowCount = 2;
+      this.bodyTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.Size = new System.Drawing.Size(0, 0);
+      this.bodyTableLayoutPanel.TabIndex = 0;
+      // 
+      // sizeGroupBox
+      // 
+      this.sizeGroupBox.Controls.Add(this.heightNumericUpDown);
+      this.sizeGroupBox.Controls.Add(this.widthNumericUpDown);
+      this.sizeGroupBox.Controls.Add(this.heightLabel);
+      this.sizeGroupBox.Controls.Add(this.widthLabel);
+      this.sizeGroupBox.Controls.Add(this.lockAspectCheckBox);
+      this.sizeGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 78);
+      this.sizeGroupBox.Name = "sizeGroupBox";
+      this.sizeGroupBox.Size = new System.Drawing.Size(180, 98);
+      this.sizeGroupBox.TabIndex = 5;
+      this.sizeGroupBox.TabStop = false;
+      this.sizeGroupBox.Text = "Chart Size";
+      // 
+      // heightNumericUpDown
+      // 
+      this.heightNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.heightNumericUpDown.Increment = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+      this.heightNumericUpDown.Location = new System.Drawing.Point(50, 46);
+      this.heightNumericUpDown.Maximum = new decimal(new int[] {
+            100000,
+            0,
+            0,
+            0});
+      this.heightNumericUpDown.Name = "heightNumericUpDown";
+      this.heightNumericUpDown.Size = new System.Drawing.Size(124, 20);
+      this.heightNumericUpDown.TabIndex = 4;
+      this.heightNumericUpDown.Value = new decimal(new int[] {
+            225,
+            0,
+            0,
+            0});
+      this.heightNumericUpDown.ValueChanged += new System.EventHandler(this.heightNumericUpDown_ValueChanged);
+      // 
+      // widthNumericUpDown
+      // 
+      this.widthNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.widthNumericUpDown.Increment = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+      this.widthNumericUpDown.Location = new System.Drawing.Point(50, 20);
+      this.widthNumericUpDown.Maximum = new decimal(new int[] {
+            10000,
+            0,
+            0,
+            0});
+      this.widthNumericUpDown.Name = "widthNumericUpDown";
+      this.widthNumericUpDown.Size = new System.Drawing.Size(124, 20);
+      this.widthNumericUpDown.TabIndex = 3;
+      this.widthNumericUpDown.Value = new decimal(new int[] {
+            300,
+            0,
+            0,
+            0});
+      this.widthNumericUpDown.ValueChanged += new System.EventHandler(this.widthNumericUpDown_ValueChanged);
+      // 
+      // heightLabel
+      // 
+      this.heightLabel.AutoSize = true;
+      this.heightLabel.Location = new System.Drawing.Point(6, 48);
+      this.heightLabel.Name = "heightLabel";
+      this.heightLabel.Size = new System.Drawing.Size(41, 13);
+      this.heightLabel.TabIndex = 2;
+      this.heightLabel.Text = "Height:";
+      // 
+      // widthLabel
+      // 
+      this.widthLabel.AutoSize = true;
+      this.widthLabel.Location = new System.Drawing.Point(6, 22);
+      this.widthLabel.Name = "widthLabel";
+      this.widthLabel.Size = new System.Drawing.Size(38, 13);
+      this.widthLabel.TabIndex = 1;
+      this.widthLabel.Text = "Width:";
+      // 
+      // lockAspectCheckBox
+      // 
+      this.lockAspectCheckBox.AutoSize = true;
+      this.lockAspectCheckBox.Checked = true;
+      this.lockAspectCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.lockAspectCheckBox.Location = new System.Drawing.Point(50, 73);
+      this.lockAspectCheckBox.Name = "lockAspectCheckBox";
+      this.lockAspectCheckBox.Size = new System.Drawing.Size(114, 17);
+      this.lockAspectCheckBox.TabIndex = 6;
+      this.lockAspectCheckBox.Text = "Lock Aspect Ratio";
+      this.lockAspectCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // pointSizeNumericUpDown
+      // 
+      this.pointSizeNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pointSizeNumericUpDown.Location = new System.Drawing.Point(58, 15);
+      this.pointSizeNumericUpDown.Maximum = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+      this.pointSizeNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.pointSizeNumericUpDown.Name = "pointSizeNumericUpDown";
+      this.pointSizeNumericUpDown.Size = new System.Drawing.Size(116, 20);
+      this.pointSizeNumericUpDown.TabIndex = 8;
+      this.pointSizeNumericUpDown.Value = new decimal(new int[] {
+            3,
+            0,
+            0,
+            0});
+      this.pointSizeNumericUpDown.ValueChanged += new System.EventHandler(this.pointSizeNumericUpDown_ValueChanged);
+      // 
+      // pointSizeLabel
+      // 
+      this.pointSizeLabel.AutoSize = true;
+      this.pointSizeLabel.Location = new System.Drawing.Point(6, 17);
+      this.pointSizeLabel.Name = "pointSizeLabel";
+      this.pointSizeLabel.Size = new System.Drawing.Size(30, 13);
+      this.pointSizeLabel.TabIndex = 7;
+      this.pointSizeLabel.Text = "Size:";
+      // 
+      // regressionGroupBox
+      // 
+      this.regressionGroupBox.Controls.Add(this.regressionTypeComboBox);
+      this.regressionGroupBox.Controls.Add(this.polynomialRegressionOrderNumericUpDown);
+      this.regressionGroupBox.Controls.Add(this.orderLabel);
+      this.regressionGroupBox.Controls.Add(this.regressionTyleLabel);
+      this.regressionGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.regressionGroupBox.Location = new System.Drawing.Point(0, 376);
+      this.regressionGroupBox.Name = "regressionGroupBox";
+      this.regressionGroupBox.Size = new System.Drawing.Size(180, 75);
+      this.regressionGroupBox.TabIndex = 3;
+      this.regressionGroupBox.TabStop = false;
+      this.regressionGroupBox.Text = "Regression";
+      // 
+      // regressionTypeComboBox
+      // 
+      this.regressionTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.regressionTypeComboBox.FormattingEnabled = true;
+      this.regressionTypeComboBox.Location = new System.Drawing.Point(67, 19);
+      this.regressionTypeComboBox.Name = "regressionTypeComboBox";
+      this.regressionTypeComboBox.Size = new System.Drawing.Size(107, 21);
+      this.regressionTypeComboBox.TabIndex = 14;
+      this.regressionTypeComboBox.SelectedValueChanged += new System.EventHandler(this.regressionTypeComboBox_SelectedValueChanged);
+      // 
+      // polynomialRegressionOrderNumericUpDown
+      // 
+      this.polynomialRegressionOrderNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.polynomialRegressionOrderNumericUpDown.Location = new System.Drawing.Point(67, 45);
+      this.polynomialRegressionOrderNumericUpDown.Margin = new System.Windows.Forms.Padding(9, 3, 3, 3);
+      this.polynomialRegressionOrderNumericUpDown.Maximum = new decimal(new int[] {
+            6,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Minimum = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Name = "polynomialRegressionOrderNumericUpDown";
+      this.polynomialRegressionOrderNumericUpDown.Size = new System.Drawing.Size(107, 20);
+      this.polynomialRegressionOrderNumericUpDown.TabIndex = 15;
+      this.polynomialRegressionOrderNumericUpDown.Value = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.ValueChanged += new System.EventHandler(this.polynomialRegressionOrderNumericUpDown_ValueChanged);
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Location = new System.Drawing.Point(6, 47);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(36, 13);
+      this.orderLabel.TabIndex = 16;
+      this.orderLabel.Text = "Order:";
+      // 
+      // regressionTyleLabel
+      // 
+      this.regressionTyleLabel.AutoSize = true;
+      this.regressionTyleLabel.Location = new System.Drawing.Point(6, 22);
+      this.regressionTyleLabel.Name = "regressionTyleLabel";
+      this.regressionTyleLabel.Size = new System.Drawing.Size(34, 13);
+      this.regressionTyleLabel.TabIndex = 13;
+      this.regressionTyleLabel.Text = "Type:";
+      // 
+      // groupingOptionsBox
+      // 
+      this.groupingOptionsBox.Controls.Add(this.legendGroupBox);
+      this.groupingOptionsBox.Controls.Add(this.aggregationLabel);
+      this.groupingOptionsBox.Controls.Add(this.aggregationComboBox);
+      this.groupingOptionsBox.Controls.Add(this.groupingComboBox);
+      this.groupingOptionsBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.groupingOptionsBox.Location = new System.Drawing.Point(0, 245);
+      this.groupingOptionsBox.Name = "groupingOptionsBox";
+      this.groupingOptionsBox.Size = new System.Drawing.Size(180, 131);
+      this.groupingOptionsBox.TabIndex = 8;
+      this.groupingOptionsBox.TabStop = false;
+      this.groupingOptionsBox.Text = "Grouping";
+      // 
+      // legendGroupBox
+      // 
+      this.legendGroupBox.Controls.Add(this.legendCheckbox);
+      this.legendGroupBox.Controls.Add(this.legendOrderComboBox);
+      this.legendGroupBox.Controls.Add(this.legendOrderLabel);
+      this.legendGroupBox.Enabled = false;
+      this.legendGroupBox.Location = new System.Drawing.Point(6, 73);
+      this.legendGroupBox.Name = "legendGroupBox";
+      this.legendGroupBox.Size = new System.Drawing.Size(167, 50);
+      this.legendGroupBox.TabIndex = 7;
+      this.legendGroupBox.TabStop = false;
+      this.legendGroupBox.Text = "Legend";
+      // 
+      // legendCheckbox
+      // 
+      this.legendCheckbox.AutoSize = true;
+      this.legendCheckbox.Checked = true;
+      this.legendCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.legendCheckbox.Location = new System.Drawing.Point(56, -1);
+      this.legendCheckbox.Name = "legendCheckbox";
+      this.legendCheckbox.Size = new System.Drawing.Size(56, 17);
+      this.legendCheckbox.TabIndex = 0;
+      this.legendCheckbox.Text = "Visible";
+      this.legendCheckbox.UseVisualStyleBackColor = true;
+      this.legendCheckbox.CheckedChanged += new System.EventHandler(this.legendCheckbox_CheckedChanged);
+      // 
+      // legendOrderComboBox
+      // 
+      this.legendOrderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.legendOrderComboBox.FormattingEnabled = true;
+      this.legendOrderComboBox.Location = new System.Drawing.Point(49, 19);
+      this.legendOrderComboBox.Name = "legendOrderComboBox";
+      this.legendOrderComboBox.Size = new System.Drawing.Size(109, 21);
+      this.legendOrderComboBox.TabIndex = 5;
+      this.legendOrderComboBox.SelectedIndexChanged += new System.EventHandler(this.legendOrderComboBox_SelectedIndexChanged);
+      // 
+      // legendOrderLabel
+      // 
+      this.legendOrderLabel.AutoSize = true;
+      this.legendOrderLabel.Location = new System.Drawing.Point(7, 22);
+      this.legendOrderLabel.Name = "legendOrderLabel";
+      this.legendOrderLabel.Size = new System.Drawing.Size(36, 13);
+      this.legendOrderLabel.TabIndex = 4;
+      this.legendOrderLabel.Text = "Order:";
+      this.legendOrderLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // aggregationLabel
+      // 
+      this.aggregationLabel.AutoSize = true;
+      this.aggregationLabel.Enabled = false;
+      this.aggregationLabel.Location = new System.Drawing.Point(5, 49);
+      this.aggregationLabel.Name = "aggregationLabel";
+      this.aggregationLabel.Size = new System.Drawing.Size(67, 13);
+      this.aggregationLabel.TabIndex = 3;
+      this.aggregationLabel.Text = "Aggregation:";
+      // 
+      // aggregationComboBox
+      // 
+      this.aggregationComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.aggregationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.aggregationComboBox.Enabled = false;
+      this.aggregationComboBox.FormattingEnabled = true;
+      this.aggregationComboBox.Location = new System.Drawing.Point(79, 46);
+      this.aggregationComboBox.Name = "aggregationComboBox";
+      this.aggregationComboBox.Size = new System.Drawing.Size(96, 21);
+      this.aggregationComboBox.TabIndex = 2;
+      this.aggregationComboBox.SelectedIndexChanged += new System.EventHandler(this.aggregationComboBox_SelectedIndexChanged);
+      // 
+      // groupingComboBox
+      // 
+      this.groupingComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupingComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.groupingComboBox.FormattingEnabled = true;
+      this.groupingComboBox.Location = new System.Drawing.Point(6, 19);
+      this.groupingComboBox.Name = "groupingComboBox";
+      this.groupingComboBox.Size = new System.Drawing.Size(169, 21);
+      this.groupingComboBox.TabIndex = 1;
+      this.groupingComboBox.SelectedIndexChanged += new System.EventHandler(this.groupingComboBox_SelectedIndexChanged);
+      // 
+      // opacityLabel
+      // 
+      this.opacityLabel.AutoSize = true;
+      this.opacityLabel.Location = new System.Drawing.Point(6, 43);
+      this.opacityLabel.Name = "opacityLabel";
+      this.opacityLabel.Size = new System.Drawing.Size(46, 13);
+      this.opacityLabel.TabIndex = 7;
+      this.opacityLabel.Text = "Opacity:";
+      // 
+      // pointOpacityNumericUpDown
+      // 
+      this.pointOpacityNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pointOpacityNumericUpDown.DecimalPlaces = 2;
+      this.pointOpacityNumericUpDown.Increment = new decimal(new int[] {
+            1,
+            0,
+            0,
+            65536});
+      this.pointOpacityNumericUpDown.Location = new System.Drawing.Point(58, 41);
+      this.pointOpacityNumericUpDown.Maximum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.pointOpacityNumericUpDown.Name = "pointOpacityNumericUpDown";
+      this.pointOpacityNumericUpDown.Size = new System.Drawing.Size(115, 20);
+      this.pointOpacityNumericUpDown.TabIndex = 8;
+      this.pointOpacityNumericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.pointOpacityNumericUpDown.ValueChanged += new System.EventHandler(this.pointOpacityNumericUpDown_ValueChanged);
+      // 
+      // pointsGroupBox
+      // 
+      this.pointsGroupBox.Controls.Add(this.pointOpacityNumericUpDown);
+      this.pointsGroupBox.Controls.Add(this.pointSizeLabel);
+      this.pointsGroupBox.Controls.Add(this.pointSizeNumericUpDown);
+      this.pointsGroupBox.Controls.Add(this.opacityLabel);
+      this.pointsGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.pointsGroupBox.Location = new System.Drawing.Point(0, 176);
+      this.pointsGroupBox.Name = "pointsGroupBox";
+      this.pointsGroupBox.Size = new System.Drawing.Size(180, 69);
+      this.pointsGroupBox.TabIndex = 4;
+      this.pointsGroupBox.TabStop = false;
+      this.pointsGroupBox.Text = "Points";
+      // 
+      // ScatterPlotMultiView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "ScatterPlotMultiView";
+      this.Size = new System.Drawing.Size(589, 451);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.frameTableLayoutPanel.ResumeLayout(false);
+      this.columnHeaderScrollPanel.ResumeLayout(false);
+      this.columnHeaderScrollPanel.PerformLayout();
+      this.rowHeaderScrollPanel.ResumeLayout(false);
+      this.rowHeaderScrollPanel.PerformLayout();
+      this.bodyScrollPanel.ResumeLayout(false);
+      this.bodyScrollPanel.PerformLayout();
+      this.sizeGroupBox.ResumeLayout(false);
+      this.sizeGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.heightNumericUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.widthNumericUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.pointSizeNumericUpDown)).EndInit();
+      this.regressionGroupBox.ResumeLayout(false);
+      this.regressionGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).EndInit();
+      this.groupingOptionsBox.ResumeLayout(false);
+      this.groupingOptionsBox.PerformLayout();
+      this.legendGroupBox.ResumeLayout(false);
+      this.legendGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pointOpacityNumericUpDown)).EndInit();
+      this.pointsGroupBox.ResumeLayout(false);
+      this.pointsGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TableLayoutPanel frameTableLayoutPanel;
+    private System.Windows.Forms.TableLayoutPanel columnHeaderTableLayoutPanel;
+    private System.Windows.Forms.TableLayoutPanel rowHeaderTableLayoutPanel;
+    private System.Windows.Forms.TableLayoutPanel bodyTableLayoutPanel;
+    private System.Windows.Forms.Panel columnHeaderScrollPanel;
+    private System.Windows.Forms.Panel rowHeaderScrollPanel;
+    private System.Windows.Forms.Panel bodyScrollPanel;
+    private System.Windows.Forms.GroupBox sizeGroupBox;
+    private System.Windows.Forms.Label heightLabel;
+    private System.Windows.Forms.Label widthLabel;
+    private System.Windows.Forms.GroupBox regressionGroupBox;
+    private System.Windows.Forms.ComboBox regressionTypeComboBox;
+    private System.Windows.Forms.NumericUpDown polynomialRegressionOrderNumericUpDown;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.Label regressionTyleLabel;
+    private System.Windows.Forms.GroupBox groupingOptionsBox;
+    private System.Windows.Forms.ComboBox groupingComboBox;
+    private System.Windows.Forms.NumericUpDown widthNumericUpDown;
+    private System.Windows.Forms.NumericUpDown heightNumericUpDown;
+    private System.Windows.Forms.CheckBox lockAspectCheckBox;
+    private System.Windows.Forms.NumericUpDown pointSizeNumericUpDown;
+    private System.Windows.Forms.Label pointSizeLabel;
+    private System.Windows.Forms.Label aggregationLabel;
+    private System.Windows.Forms.ComboBox aggregationComboBox;
+    private System.Windows.Forms.GroupBox pointsGroupBox;
+    private System.Windows.Forms.NumericUpDown pointOpacityNumericUpDown;
+    private System.Windows.Forms.Label opacityLabel;
+    private System.Windows.Forms.Label legendOrderLabel;
+    private System.Windows.Forms.ComboBox legendOrderComboBox;
+    private System.Windows.Forms.GroupBox legendGroupBox;
+    private System.Windows.Forms.CheckBox legendCheckbox;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 15268)
@@ -0,0 +1,768 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Analysis.Views;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using AggregationType = HeuristicLab.Analysis.DataTableVisualProperties.DataTableHistogramAggregation;
+using RegressionType = HeuristicLab.Analysis.ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Scatter Plot Multi View")]
+  [Content(typeof(MultiScatterPlotContent), true)]
+  public sealed partial class ScatterPlotMultiView : PreprocessingCheckedVariablesView {
+    private readonly IDictionary<string, Label> columnHeaderCache = new Dictionary<string, Label>();
+    private readonly IDictionary<string, VerticalLabel> rowHeaderCache = new Dictionary<string, VerticalLabel>();
+    private readonly IDictionary<Tuple<string/*col*/, string/*row*/>, Control> bodyCache = new Dictionary<Tuple<string, string>, Control>();
+
+    public new MultiScatterPlotContent Content {
+      get { return (MultiScatterPlotContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ScatterPlotMultiView() {
+      InitializeComponent();
+
+      oldWidth = (int)widthNumericUpDown.Value;
+      oldHeight = (int)heightNumericUpDown.Value;
+
+      regressionTypeComboBox.DataSource = Enum.GetValues(typeof(RegressionType));
+      regressionTypeComboBox.SelectedItem = RegressionType.None;
+
+      aggregationComboBox.DataSource = Enum.GetValues(typeof(AggregationType));
+      aggregationComboBox.SelectedItem = AggregationType.Overlapping;
+
+      legendOrderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
+      legendOrderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
+
+      #region Initialize Scrollbars
+      columnHeaderScrollPanel.HorizontalScroll.Enabled = true;
+      columnHeaderScrollPanel.VerticalScroll.Enabled = false;
+      columnHeaderScrollPanel.HorizontalScroll.Visible = false;
+      columnHeaderScrollPanel.VerticalScroll.Visible = false;
+
+      rowHeaderScrollPanel.HorizontalScroll.Enabled = false;
+      rowHeaderScrollPanel.VerticalScroll.Enabled = true;
+      rowHeaderScrollPanel.HorizontalScroll.Visible = false;
+      rowHeaderScrollPanel.VerticalScroll.Visible = false;
+
+      bodyScrollPanel.HorizontalScroll.Enabled = true;
+      bodyScrollPanel.VerticalScroll.Enabled = true;
+      bodyScrollPanel.HorizontalScroll.Visible = true;
+      bodyScrollPanel.VerticalScroll.Visible = true;
+      bodyScrollPanel.AutoScroll = true;
+      #endregion
+
+      bodyScrollPanel.MouseWheel += bodyScrollPanel_MouseWheel;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        groupingComboBox.Items.Add(string.Empty);
+        foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData)) {
+          groupingComboBox.Items.Add(var);
+        }
+        SuppressCheckedChangedUpdate = true;
+        groupingComboBox.SelectedItem = Content.GroupingVariable ?? string.Empty;
+        SuppressCheckedChangedUpdate = false;
+
+        // uncheck variables that max 20 vars are selected initially
+        var variables = Content.VariableItemList;
+        int numChecked = variables.CheckedItems.Count();
+        if (numChecked > 20) {
+          string message = string.Format("Display all {0} input variables ({1} charts)?" + Environment.NewLine +
+                                         "Press No to reduce the number of checked variables to 20." + Environment.NewLine +
+                                         "Press Cancel to uncheck all.",
+            numChecked, numChecked * numChecked);
+          var dialogResult = MessageBox.Show(this, message, "Display All Input Variables?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
+          if (dialogResult == DialogResult.No || dialogResult == DialogResult.Cancel) {
+            SuppressCheckedChangedUpdate = true;
+            IEnumerable<StringValue> toUncheck = variables;
+            if (dialogResult == DialogResult.No) // only show the first 20
+              toUncheck = variables.CheckedItems.Reverse().Take(numChecked - 20).Select(x => x.Value);
+            foreach (var var in toUncheck)
+              Content.VariableItemList.SetItemCheckedState(var, false);
+            SuppressCheckedChangedUpdate = false;
+          }
+        }
+        GenerateCharts(true);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
+      sizeGroupBox.Enabled = Content != null;
+      pointsGroupBox.Enabled = Content != null;
+      groupingComboBox.Enabled = Content != null;
+      regressionGroupBox.Enabled = Content != null;
+    }
+
+    protected override void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+      base.CheckedItemsChanged(sender, checkedItems);
+      if (SuppressCheckedChangedUpdate) return;
+
+      foreach (var variable in checkedItems.Items) {
+        if (Content.VariableItemList.ItemChecked(variable.Value))
+          ShowChartOnTable(variable.Value.Value, variable.Index);
+        else
+          HideChartFromTable(variable.Value.Value, variable.Index);
+      }
+    }
+
+    #region Show and Hide charts
+    private void ShowChartOnTable(string variable, int idx) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // show column header
+      var colH = columnHeaderTableLayoutPanel;
+      colH.ColumnStyles[idx].Width = GetColumnWidth();
+      if (colH.GetControlFromPosition(idx, 0) == null)
+        colH.Controls.Add(GetColumnHeader(variable), idx, 0);
+      else
+        colH.GetControlFromPosition(idx, 0).Visible = true;
+
+      // show row header
+      var rowH = rowHeaderTableLayoutPanel;
+      rowH.RowStyles[idx].Height = GetRowHeight();
+      if (rowH.GetControlFromPosition(0, idx) == null)
+        rowH.Controls.Add(GetRowHeader(variable), 0, idx);
+      else
+        rowH.GetControlFromPosition(0, idx).Visible = true;
+
+      // show body
+      var body = bodyTableLayoutPanel;
+      ShowColumnHelper(body, idx, r => GetBody(variable, Content.VariableItemList[r].Value));
+      ShowRowHelper(body, idx, c => GetBody(Content.VariableItemList[c].Value, variable));
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void ShowColumnHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      tlp.ColumnStyles[idx].Width = GetColumnWidth();
+      for (int r = 0; r < tlp.RowCount; r++) {
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[r])) {
+          var control = tlp.GetControlFromPosition(idx, r);
+          if (control == null)
+            tlp.Controls.Add(creatorFunc(r), idx, r);
+          else
+            control.Visible = true;
+        }
+      }
+    }
+    private void ShowRowHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      tlp.RowStyles[idx].Height = GetRowHeight();
+      for (int c = 0; c < tlp.ColumnCount; c++) {
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[c])) {
+          var control = tlp.GetControlFromPosition(c, idx);
+          if (control == null)
+            tlp.Controls.Add(creatorFunc(c), c, idx);
+          else
+            tlp.GetControlFromPosition(c, idx).Visible = true;
+        }
+      }
+    }
+
+    private void HideChartFromTable(string variable, int idx) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // hide column header
+      var colH = columnHeaderTableLayoutPanel;
+      HideColumnHelper(colH, idx);
+
+      // hide row header
+      var rowH = rowHeaderTableLayoutPanel;
+      HideRowHelper(rowH, idx);
+
+      // hide from body
+      var body = bodyTableLayoutPanel;
+      HideColumnHelper(body, idx);
+      HideRowHelper(body, idx);
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void HideColumnHelper(TableLayoutPanel tlp, int idx) {
+      tlp.ColumnStyles[idx].Width = 0;
+      // hide controls
+      for (int r = 0; r < tlp.RowCount; r++) {
+        var control = tlp.GetControlFromPosition(idx, r);
+        if (control != null)
+          control.Visible = false;
+      }
+    }
+    private void HideRowHelper(TableLayoutPanel tlp, int idx) {
+      tlp.RowStyles[idx].Height = 0;
+      // hide controls
+      for (int c = 0; c < tlp.ColumnCount; c++) {
+        var control = tlp.GetControlFromPosition(c, idx);
+        if (control != null)
+          control.Visible = false;
+      }
+    }
+    #endregion
+
+    #region Add/Remove/Update Variable
+    protected override void AddVariable(string name) {
+      base.AddVariable(name);
+      if (IsVariableChecked(name))
+        AddChartToTable(name);
+    }
+    protected override void RemoveVariable(string name) {
+      base.RemoveVariable(name);
+
+      if (IsVariableChecked(name)) {
+        RemoveChartFromTable(name);
+      }
+
+      // clear caches
+      columnHeaderCache[name].Dispose();
+      columnHeaderCache.Remove(name);
+      rowHeaderCache[name].Dispose();
+      rowHeaderCache.Remove(name);
+      var keys = bodyCache.Keys.Where(t => t.Item1 == name || t.Item2 == name).ToList();
+      foreach (var key in keys) {
+        bodyCache[key].Dispose();
+        bodyCache.Remove(key);
+      }
+    }
+    protected override void UpdateVariable(string name) {
+      base.UpdateVariable(name);
+      RemoveVariable(name);
+      AddVariable(name);
+    }
+    protected override void ResetAllVariables() {
+      GenerateCharts(true);
+    }
+
+    private void AddChartToTable(string variable) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // find index to insert 
+      var variables = Content.VariableItemList.Select(v => v.Value).ToList();
+      int idx = variables              // all variables
+        .TakeWhile(t => t != variable) // ... until the variable that was checked
+        .Count(IsVariableChecked);     // ... how many checked variables
+
+      // add column header
+      var colH = columnHeaderTableLayoutPanel;
+      AddColumnHelper(colH, idx, _ => GetColumnHeader(variable));
+
+      // add row header
+      var rowH = rowHeaderTableLayoutPanel;
+      AddRowHelper(rowH, idx, _ => GetRowHeader(variable));
+
+      // add body
+      var body = bodyTableLayoutPanel;
+      var vars = GetCheckedVariables();
+      var varsMinus = vars.Except(new[] { variable }).ToList();
+      AddColumnHelper(body, idx, r => GetBody(variable, varsMinus[r])); // exclude "variable" because the row for it does not exist yet
+      AddRowHelper(body, idx, c => GetBody(vars[c], variable));
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void AddColumnHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      // add column
+      tlp.ColumnCount++;
+      tlp.ColumnStyles.Insert(idx, new ColumnStyle(SizeType.Absolute, GetColumnWidth()));
+      // shift right
+      for (int c = tlp.ColumnCount; c > idx - 1; c--) {
+        for (int r = 0; r < tlp.RowCount; r++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetColumn(control, c + 1);
+          }
+        }
+      }
+      // add controls
+      for (int r = 0; r < tlp.RowCount; r++) {
+        if (tlp.GetControlFromPosition(idx, r) == null)
+          tlp.Controls.Add(creatorFunc(r), idx, r);
+      }
+
+    }
+    private void AddRowHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      // add row
+      tlp.RowCount++;
+      tlp.RowStyles.Insert(idx, new RowStyle(SizeType.Absolute, GetRowHeight()));
+      // shift right
+      for (int r = tlp.RowCount; r > idx - 1; r--) {
+        for (int c = 0; c < tlp.ColumnCount; c++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetRow(control, r + 1);
+          }
+        }
+      }
+      // add controls
+      for (int c = 0; c < tlp.ColumnCount; c++)
+        if (tlp.GetControlFromPosition(c, idx) == null)
+          tlp.Controls.Add(creatorFunc(c), c, idx);
+    }
+
+    private void RemoveChartFromTable(string variable) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // remove column header
+      var colH = columnHeaderTableLayoutPanel;
+      int colIdx = colH.GetColumn(colH.Controls[variable]);
+      RemoveColumnHelper(colH, colIdx);
+
+      // remove row header
+      var rowH = rowHeaderTableLayoutPanel;
+      int rowIdx = rowH.GetRow(rowH.Controls[variable]);
+      RemoveRowHelper(rowH, rowIdx);
+
+      // remove from body
+      var body = bodyTableLayoutPanel;
+      RemoveColumnHelper(body, colIdx);
+      RemoveRowHelper(body, rowIdx);
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void RemoveColumnHelper(TableLayoutPanel tlp, int idx) {
+      // remove controls
+      for (int r = 0; r < tlp.RowCount; r++)
+        tlp.Controls.Remove(tlp.GetControlFromPosition(idx, r));
+      // shift left
+      for (int c = idx + 1; c < tlp.ColumnCount; c++) {
+        for (int r = 0; r < tlp.RowCount; r++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetColumn(control, c - 1);
+          }
+        }
+      }
+      // delete column
+      tlp.ColumnStyles.RemoveAt(tlp.ColumnCount - 1);
+      tlp.ColumnCount--;
+    }
+    private void RemoveRowHelper(TableLayoutPanel tlp, int idx) {
+      // remove controls
+      for (int c = 0; c < tlp.ColumnCount; c++)
+        tlp.Controls.Remove(tlp.GetControlFromPosition(c, idx));
+      // shift left
+      for (int r = idx + 1; r < tlp.RowCount; r++) {
+        for (int c = 0; c < tlp.ColumnCount; c++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetRow(control, r - 1);
+          }
+        }
+      }
+      // delete rows
+      tlp.RowStyles.RemoveAt(tlp.RowCount - 1);
+      tlp.RowCount--;
+    }
+    #endregion
+
+    #region Creating Headers and Body
+    private Label GetColumnHeader(string variable) {
+      if (!columnHeaderCache.ContainsKey(variable)) {
+        columnHeaderCache.Add(variable, new Label() {
+          Text = variable,
+          TextAlign = ContentAlignment.MiddleCenter,
+          Name = variable,
+          Height = columnHeaderTableLayoutPanel.Height,
+          Dock = DockStyle.Fill,
+          Margin = new Padding(3)
+        });
+      }
+      return columnHeaderCache[variable];
+    }
+    private Label GetRowHeader(string variable) {
+      if (!rowHeaderCache.ContainsKey(variable)) {
+        rowHeaderCache.Add(variable, new VerticalLabel() {
+          Text = variable,
+          TextAlign = ContentAlignment.MiddleCenter,
+          Name = variable,
+          Width = rowHeaderTableLayoutPanel.Width,
+          Height = columnHeaderScrollPanel.Width,
+          Dock = DockStyle.Fill,
+          Margin = new Padding(3)
+        });
+      }
+      return rowHeaderCache[variable];
+    }
+    private Control GetBody(string colVariable, string rowVariable) {
+      var key = Tuple.Create(colVariable, rowVariable);
+      if (!bodyCache.ContainsKey(key)) {
+        if (rowVariable == colVariable) { // use historgram if x and y variable are equal
+          var dataTable = HistogramContent.CreateHistogram(
+            Content.PreprocessingData,
+            rowVariable,
+            (string)groupingComboBox.SelectedItem,
+            (AggregationType)aggregationComboBox.SelectedItem,
+            (PreprocessingChartContent.LegendOrder)legendOrderComboBox.SelectedItem);
+          dataTable.VisualProperties.Title = string.Empty;
+          foreach (var dataRow in dataTable.Rows) {
+            dataRow.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+          }
+          var pcv = new DataTableView {
+            Name = key.ToString(),
+            Content = dataTable,
+            Dock = DockStyle.Fill,
+            ShowChartOnly = true
+          };
+          //pcv.ChartDoubleClick += HistogramDoubleClick;  // ToDo: not working; double click is already handled by the chart
+          bodyCache.Add(key, pcv);
+        } else { //scatter plot
+          var scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData,
+            colVariable,
+            rowVariable,
+            (string)groupingComboBox.SelectedItem,
+            (PreprocessingChartContent.LegendOrder)legendOrderComboBox.SelectedItem);
+          var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+          int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+          int i = 0;
+          var colors = PreprocessingChartView.Colors;
+          foreach (var row in scatterPlot.Rows) {
+            row.VisualProperties.PointSize = (int)pointSizeNumericUpDown.Value;
+            row.VisualProperties.Color = Color.FromArgb((int)(pointOpacityNumericUpDown.Value * 255),
+              row.VisualProperties.Color.IsEmpty ? colors[i++ % colors.Length] : row.VisualProperties.Color);
+            row.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+            row.VisualProperties.IsRegressionVisibleInLegend = false;
+            row.VisualProperties.RegressionType = regressionType;
+            row.VisualProperties.PolynomialRegressionOrder = order;
+          }
+          scatterPlot.VisualProperties.Title = string.Empty;
+          var scatterPlotView = new ScatterPlotView {
+            Name = key.ToString(),
+            Content = scatterPlot,
+            Dock = DockStyle.Fill,
+            ShowName = false
+            //ShowLegend = false,
+            //XAxisFormat = "G3"
+          };
+          //scatterPlotView.DoubleClick += ScatterPlotDoubleClick; // ToDo: not working; double click is already handled by the chart
+          bodyCache.Add(key, scatterPlotView);
+        }
+      }
+      return bodyCache[key];
+    }
+    #endregion
+
+    protected override void CheckedChangedUpdate() {
+      GenerateCharts(false); // only checked-changes -> reuse cached values
+    }
+
+    #region Generate Charts
+    private void GenerateCharts(bool clearCache) {
+      if (Content == null || SuppressCheckedChangedUpdate) return;
+
+      // Clear old layouts and cache
+      foreach (var tableLayoutPanel in new[] { columnHeaderTableLayoutPanel, rowHeaderTableLayoutPanel, bodyTableLayoutPanel }) {
+        tableLayoutPanel.Controls.Clear();
+        tableLayoutPanel.ColumnStyles.Clear();
+        tableLayoutPanel.RowStyles.Clear();
+      }
+
+      if (clearCache) {
+        foreach (var control in bodyCache.Values.Concat(columnHeaderCache.Values).Concat(rowHeaderCache.Values)) {
+          control.Dispose();
+        }
+        columnHeaderCache.Clear();
+        rowHeaderCache.Clear();
+        bodyCache.Clear();
+      }
+
+      var variables = Content.VariableItemList.Select(x => x.Value).ToList();
+
+      // Set row and column count
+      columnHeaderTableLayoutPanel.ColumnCount = variables.Count;
+      rowHeaderTableLayoutPanel.RowCount = variables.Count;
+      bodyTableLayoutPanel.ColumnCount = variables.Count;
+      bodyTableLayoutPanel.RowCount = variables.Count;
+
+      // Set column and row layout
+      for (int i = 0; i < variables.Count; i++) {
+        bool @checked = Content.VariableItemList.ItemChecked(Content.VariableItemList[i]);
+        columnHeaderTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, @checked ? GetColumnWidth() : 0));
+        rowHeaderTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, @checked ? GetRowHeight() : 0));
+        bodyTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, @checked ? GetColumnWidth() : 0));
+        bodyTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, @checked ? GetRowHeight() : 0));
+      }
+
+      frameTableLayoutPanel.SuspendLayout();
+      AddHeaderToTableLayoutPanels();
+      AddChartsToTableLayoutPanel();
+      UpdateHeaderMargin();
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+
+    private void AddHeaderToTableLayoutPanels() {
+      for (int i = 0; i < Content.VariableItemList.Count; i++) {
+        var variable = Content.VariableItemList[i];
+        if (Content.VariableItemList.ItemChecked(variable)) {
+          columnHeaderTableLayoutPanel.Controls.Add(GetColumnHeader(variable.Value), i, 0);
+          rowHeaderTableLayoutPanel.Controls.Add(GetRowHeader(variable.Value), 0, i);
+        }
+      }
+    }
+    private void AddChartsToTableLayoutPanel() {
+      for (int c = 0; c < Content.VariableItemList.Count; c++) {
+        var colVar = Content.VariableItemList[c].Value;
+        if (!IsVariableChecked(colVar)) continue;
+        for (int r = 0; r < Content.VariableItemList.Count; r++) {
+          var rowVar = Content.VariableItemList[r].Value;
+          if (!IsVariableChecked(rowVar)) continue;
+          bodyTableLayoutPanel.Controls.Add(GetBody(colVar, rowVar), c, r);
+        }
+      }
+      UpdateRegressionLine();
+    }
+
+    #endregion
+
+    #region DoubleClick Events
+    //Open scatter plot in new tab with new content when double clicked
+    private void ScatterPlotDoubleClick(object sender, EventArgs e) {
+      var scatterPlotView = (ScatterPlotView)sender;
+      var scatterContent = new SingleScatterPlotContent(Content.PreprocessingData);
+      ScatterPlot scatterPlot = scatterPlotView.Content;
+
+      //Extract variable names from scatter plot and set them in content
+      if (scatterPlot.Rows.Count == 1) {
+        string[] variables = scatterPlot.Rows.ElementAt(0).Name.Split(new string[] { " - " }, StringSplitOptions.None); // extract variable names from string
+        scatterContent.SelectedXVariable = variables[0];
+        scatterContent.SelectedYVariable = variables[1];
+      }
+
+      MainFormManager.MainForm.ShowContent(scatterContent, typeof(ScatterPlotSingleView)); // open in new tab
+    }
+
+    //open histogram in new tab with new content when double clicked
+    private void HistogramDoubleClick(object sender, EventArgs e) {
+      DataTableView pcv = (DataTableView)sender;
+      HistogramContent histoContent = new HistogramContent(Content.PreprocessingData);  // create new content     
+                                                                                        //ToDo: histoContent.VariableItemList = Content.CreateVariableItemList();
+      var dataTable = pcv.Content;
+
+      //Set variable item list from with variable from data table
+      if (dataTable.Rows.Count == 1) { // only one data row should be in data table 
+        string variableName = dataTable.Rows.ElementAt(0).Name;
+
+        // set only variable name checked
+        foreach (var checkedItem in histoContent.VariableItemList) {
+          histoContent.VariableItemList.SetItemCheckedState(checkedItem, checkedItem.Value == variableName);
+        }
+      }
+      MainFormManager.MainForm.ShowContent(histoContent, typeof(HistogramView)); // open in new tab
+    }
+    #endregion
+
+    #region Scrolling
+    private void bodyScrollPanel_Scroll(object sender, ScrollEventArgs e) {
+      SyncScroll();
+
+      UpdateHeaderMargin();
+    }
+    private void bodyScrollPanel_MouseWheel(object sender, MouseEventArgs e) {
+      // Scrolling with the mouse wheel is not captured in the Scoll event
+      SyncScroll();
+    }
+    private void SyncScroll() {
+      frameTableLayoutPanel.SuspendRepaint();
+
+      columnHeaderScrollPanel.HorizontalScroll.Minimum = bodyScrollPanel.HorizontalScroll.Minimum;
+      columnHeaderScrollPanel.HorizontalScroll.Maximum = bodyScrollPanel.HorizontalScroll.Maximum;
+      rowHeaderScrollPanel.VerticalScroll.Minimum = bodyScrollPanel.VerticalScroll.Minimum;
+      rowHeaderScrollPanel.VerticalScroll.Maximum = bodyScrollPanel.VerticalScroll.Maximum;
+
+      columnHeaderScrollPanel.HorizontalScroll.Value = Math.Max(bodyScrollPanel.HorizontalScroll.Value, 1);
+      rowHeaderScrollPanel.VerticalScroll.Value = Math.Max(bodyScrollPanel.VerticalScroll.Value, 1);
+      // minimum 1 is nececary  because of two factors:
+      // - setting the Value-property of Horizontal/VerticalScroll updates the internal state but the Value-property stays 0
+      // - setting the same number of the Value-property has no effect
+      // since the Value-property is always 0, setting it to 0 would have no effect; so it is set to 1 instead
+
+      frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    // add a margin to the header table layouts if the scollbar is visible to account for the width/height of the scrollbar
+    private void UpdateHeaderMargin() {
+      columnHeaderScrollPanel.Margin = new Padding(0, 0, bodyScrollPanel.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0, 0);
+      rowHeaderScrollPanel.Margin = new Padding(0, 0, 0, bodyScrollPanel.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0);
+    }
+    #endregion
+
+    #region Sizing of Charts
+    private int oldWidth;
+    private int oldHeight;
+    private float AspectRatio {
+      get {
+        if (oldWidth == 0 || oldHeight == 0) return 1;
+        return (float)oldWidth / oldHeight;
+      }
+    }
+    private bool lockChange = false;
+
+    private int GetColumnWidth() { return (int)widthNumericUpDown.Value; }
+    private int GetRowHeight() { return (int)heightNumericUpDown.Value; }
+
+    private void widthNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      frameTableLayoutPanel.SuspendRepaint();
+      if (lockAspectCheckBox.Checked && !lockChange) {
+        lockChange = true;
+        heightNumericUpDown.Value = (int)((double)widthNumericUpDown.Value / AspectRatio);
+        lockChange = false;
+      }
+      for (int i = 0; i < columnHeaderTableLayoutPanel.ColumnCount; i++) {
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[i])) {
+          columnHeaderTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
+          bodyTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
+        }
+      }
+      oldWidth = GetColumnWidth();
+      oldHeight = GetRowHeight();
+      frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    private void heightNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      frameTableLayoutPanel.SuspendRepaint();
+      if (lockAspectCheckBox.Checked && !lockChange) {
+        lockChange = true;
+        widthNumericUpDown.Value = (int)((double)heightNumericUpDown.Value * AspectRatio);
+        lockChange = false;
+      }
+      for (int i = 0; i < rowHeaderTableLayoutPanel.RowCount; i++) {
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[i])) {
+          rowHeaderTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
+          bodyTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
+        }
+      }
+      oldWidth = GetColumnWidth();
+      oldHeight = GetRowHeight();
+      frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    private void pointSizeNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      int pointSize = (int)pointSizeNumericUpDown.Value;
+      foreach (var control in bodyCache.ToList()) {
+        var scatterPlotView = control.Value as ScatterPlotView;
+        if (scatterPlotView != null) {
+          foreach (var row in scatterPlotView.Content.Rows) {
+            row.VisualProperties.PointSize = pointSize;
+          }
+        }
+      }
+    }
+    private void pointOpacityNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      float opacity = (float)pointOpacityNumericUpDown.Value;
+      foreach (var control in bodyCache.ToList()) {
+        var scatterPlotView = control.Value as ScatterPlotView;
+        if (scatterPlotView != null) {
+          foreach (var row in scatterPlotView.Content.Rows) {
+            var color = row.VisualProperties.Color;
+            if (color.IsEmpty)
+              color = PreprocessingChartView.Colors.First();
+            row.VisualProperties.Color = Color.FromArgb((int)(opacity * 255), color);
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Regression Line
+    private void regressionTypeComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
+      UpdateRegressionLine();
+    }
+
+    private void polynomialRegressionOrderNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      UpdateRegressionLine();
+    }
+
+    private void UpdateRegressionLine() {
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+
+      foreach (var control in bodyCache.ToList()) {
+        // hidden chart => reset cache
+        if (!bodyTableLayoutPanel.Controls.Contains(control.Value)) {
+          bodyCache.Remove(control.Key);
+        }
+
+        var scatterPlotView = control.Value as ScatterPlotView;
+        if (scatterPlotView != null) {
+          foreach (var row in scatterPlotView.Content.Rows) {
+            row.VisualProperties.IsRegressionVisibleInLegend = false;
+            row.VisualProperties.RegressionType = regressionType;
+            row.VisualProperties.PolynomialRegressionOrder = order;
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Grouping
+    private void groupingComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      aggregationLabel.Enabled = groupingComboBox.SelectedIndex > 0;
+      aggregationComboBox.Enabled = groupingComboBox.SelectedIndex > 0;
+      legendGroupBox.Enabled = groupingComboBox.SelectedIndex > 0;
+      GenerateCharts(true); // new series within charts -> clear cache
+    }
+
+    private void aggregationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      var aggregation = (AggregationType)aggregationComboBox.SelectedValue;
+      foreach (var control in bodyCache.ToList()) {
+        // hidden chart => reset cache
+        if (!bodyTableLayoutPanel.Controls.Contains(control.Value)) {
+          bodyCache.Remove(control.Key);
+        }
+
+        var histogramView = control.Value as DataTableView;
+        if (histogramView != null) {
+          histogramView.Content.VisualProperties.HistogramAggregation = aggregation;
+        }
+      }
+    }
+
+    private void legendCheckbox_CheckedChanged(object sender, EventArgs e) {
+      foreach (var control in bodyCache.ToList()) {
+        var histogramControl = control.Value as DataTableView;
+        if (histogramControl != null) {
+          foreach (var row in histogramControl.Content.Rows) {
+            row.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+          }
+        }
+        var scatterplotControl = control.Value as ScatterPlotView;
+        if (scatterplotControl != null) {
+          foreach (var row in scatterplotControl.Content.Rows) {
+            row.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+          }
+        }
+      }
+    }
+
+    private void legendOrderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      GenerateCharts(true);
+    }
+    #endregion
+  }
+}
+
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs	(revision 15268)
@@ -0,0 +1,392 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class ScatterPlotSingleView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScatterPlotSingleView));
+      this.scatterPlotView = new HeuristicLab.Analysis.Views.ScatterPlotView();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.orderComboBox = new System.Windows.Forms.ComboBox();
+      this.legendOrderLabel = new System.Windows.Forms.Label();
+      this.useGradientCheckBox = new System.Windows.Forms.CheckBox();
+      this.groupLabel = new System.Windows.Forms.Label();
+      this.yLabel = new System.Windows.Forms.Label();
+      this.xLabel = new System.Windows.Forms.Label();
+      this.comboBoxGroup = new System.Windows.Forms.ComboBox();
+      this.comboBoxYVariable = new System.Windows.Forms.ComboBox();
+      this.comboBoxXVariable = new System.Windows.Forms.ComboBox();
+      this.regressionGroupBox = new System.Windows.Forms.GroupBox();
+      this.regressionTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.polynomialRegressionOrderNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.regressionTypeLabel = new System.Windows.Forms.Label();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.gradientPanel = new System.Windows.Forms.Panel();
+      this.gradientPictureBox = new System.Windows.Forms.PictureBox();
+      this.gradientMinimumLabel = new System.Windows.Forms.Label();
+      this.gradientMaximumLabel = new System.Windows.Forms.Label();
+      this.variablesGroupBox.SuspendLayout();
+      this.regressionGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.gradientPanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.gradientPictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // scatterPlotView
+      // 
+      this.scatterPlotView.Caption = "View";
+      this.scatterPlotView.Content = null;
+      this.scatterPlotView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scatterPlotView.Location = new System.Drawing.Point(0, 0);
+      this.scatterPlotView.Name = "scatterPlotView";
+      this.scatterPlotView.ReadOnly = false;
+      this.scatterPlotView.ShowName = false;
+      this.scatterPlotView.Size = new System.Drawing.Size(618, 517);
+      this.scatterPlotView.TabIndex = 0;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.orderComboBox);
+      this.variablesGroupBox.Controls.Add(this.legendOrderLabel);
+      this.variablesGroupBox.Controls.Add(this.useGradientCheckBox);
+      this.variablesGroupBox.Controls.Add(this.groupLabel);
+      this.variablesGroupBox.Controls.Add(this.yLabel);
+      this.variablesGroupBox.Controls.Add(this.xLabel);
+      this.variablesGroupBox.Controls.Add(this.comboBoxGroup);
+      this.variablesGroupBox.Controls.Add(this.comboBoxYVariable);
+      this.variablesGroupBox.Controls.Add(this.comboBoxXVariable);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Top;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(172, 178);
+      this.variablesGroupBox.TabIndex = 1;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Variables";
+      // 
+      // orderComboBox
+      // 
+      this.orderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.orderComboBox.FormattingEnabled = true;
+      this.orderComboBox.Location = new System.Drawing.Point(51, 144);
+      this.orderComboBox.Name = "orderComboBox";
+      this.orderComboBox.Size = new System.Drawing.Size(115, 21);
+      this.orderComboBox.TabIndex = 6;
+      this.orderComboBox.SelectedIndexChanged += new System.EventHandler(this.orderComboBox_SelectedIndexChanged);
+      // 
+      // legendOrderLabel
+      // 
+      this.legendOrderLabel.AutoSize = true;
+      this.legendOrderLabel.Location = new System.Drawing.Point(6, 149);
+      this.legendOrderLabel.Name = "legendOrderLabel";
+      this.legendOrderLabel.Size = new System.Drawing.Size(36, 13);
+      this.legendOrderLabel.TabIndex = 5;
+      this.legendOrderLabel.Text = "Order:";
+      this.legendOrderLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // useGradientCheckBox
+      // 
+      this.useGradientCheckBox.AutoSize = true;
+      this.useGradientCheckBox.Location = new System.Drawing.Point(51, 121);
+      this.useGradientCheckBox.Name = "useGradientCheckBox";
+      this.useGradientCheckBox.Size = new System.Drawing.Size(115, 17);
+      this.useGradientCheckBox.TabIndex = 4;
+      this.useGradientCheckBox.Text = "Use Color Gradient";
+      this.useGradientCheckBox.UseVisualStyleBackColor = true;
+      this.useGradientCheckBox.CheckedChanged += new System.EventHandler(this.useGradientCheckBox_CheckedChanged);
+      // 
+      // groupLabel
+      // 
+      this.groupLabel.AutoSize = true;
+      this.groupLabel.Location = new System.Drawing.Point(6, 97);
+      this.groupLabel.Name = "groupLabel";
+      this.groupLabel.Size = new System.Drawing.Size(39, 13);
+      this.groupLabel.TabIndex = 3;
+      this.groupLabel.Text = "Group:";
+      // 
+      // yLabel
+      // 
+      this.yLabel.AutoSize = true;
+      this.yLabel.Location = new System.Drawing.Point(6, 63);
+      this.yLabel.Name = "yLabel";
+      this.yLabel.Size = new System.Drawing.Size(17, 13);
+      this.yLabel.TabIndex = 3;
+      this.yLabel.Text = "Y:";
+      // 
+      // xLabel
+      // 
+      this.xLabel.AutoSize = true;
+      this.xLabel.Location = new System.Drawing.Point(6, 29);
+      this.xLabel.Name = "xLabel";
+      this.xLabel.Size = new System.Drawing.Size(17, 13);
+      this.xLabel.TabIndex = 2;
+      this.xLabel.Text = "X:";
+      // 
+      // comboBoxGroup
+      // 
+      this.comboBoxGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.comboBoxGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.comboBoxGroup.FormattingEnabled = true;
+      this.comboBoxGroup.Location = new System.Drawing.Point(51, 94);
+      this.comboBoxGroup.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
+      this.comboBoxGroup.Name = "comboBoxGroup";
+      this.comboBoxGroup.Size = new System.Drawing.Size(115, 21);
+      this.comboBoxGroup.TabIndex = 1;
+      this.comboBoxGroup.SelectedIndexChanged += new System.EventHandler(this.comboBoxGroup_SelectedIndexChanged);
+      // 
+      // comboBoxYVariable
+      // 
+      this.comboBoxYVariable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.comboBoxYVariable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.comboBoxYVariable.FormattingEnabled = true;
+      this.comboBoxYVariable.Location = new System.Drawing.Point(51, 60);
+      this.comboBoxYVariable.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
+      this.comboBoxYVariable.Name = "comboBoxYVariable";
+      this.comboBoxYVariable.Size = new System.Drawing.Size(115, 21);
+      this.comboBoxYVariable.TabIndex = 1;
+      this.comboBoxYVariable.SelectedIndexChanged += new System.EventHandler(this.comboBoxYVariable_SelectedIndexChanged);
+      // 
+      // comboBoxXVariable
+      // 
+      this.comboBoxXVariable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.comboBoxXVariable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.comboBoxXVariable.FormattingEnabled = true;
+      this.comboBoxXVariable.Location = new System.Drawing.Point(51, 26);
+      this.comboBoxXVariable.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
+      this.comboBoxXVariable.Name = "comboBoxXVariable";
+      this.comboBoxXVariable.Size = new System.Drawing.Size(115, 21);
+      this.comboBoxXVariable.TabIndex = 0;
+      this.comboBoxXVariable.SelectedIndexChanged += new System.EventHandler(this.comboBoxXVariable_SelectedIndexChanged);
+      // 
+      // regressionGroupBox
+      // 
+      this.regressionGroupBox.Controls.Add(this.regressionTypeComboBox);
+      this.regressionGroupBox.Controls.Add(this.polynomialRegressionOrderNumericUpDown);
+      this.regressionGroupBox.Controls.Add(this.orderLabel);
+      this.regressionGroupBox.Controls.Add(this.regressionTypeLabel);
+      this.regressionGroupBox.Dock = System.Windows.Forms.DockStyle.Top;
+      this.regressionGroupBox.Location = new System.Drawing.Point(0, 178);
+      this.regressionGroupBox.Name = "regressionGroupBox";
+      this.regressionGroupBox.Size = new System.Drawing.Size(172, 78);
+      this.regressionGroupBox.TabIndex = 4;
+      this.regressionGroupBox.TabStop = false;
+      this.regressionGroupBox.Text = "Regression";
+      // 
+      // regressionTypeComboBox
+      // 
+      this.regressionTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.regressionTypeComboBox.FormattingEnabled = true;
+      this.regressionTypeComboBox.Location = new System.Drawing.Point(51, 19);
+      this.regressionTypeComboBox.Name = "regressionTypeComboBox";
+      this.regressionTypeComboBox.Size = new System.Drawing.Size(115, 21);
+      this.regressionTypeComboBox.TabIndex = 14;
+      this.regressionTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.regressionTypeComboBox_SelectedIndexChanged);
+      // 
+      // polynomialRegressionOrderNumericUpDown
+      // 
+      this.polynomialRegressionOrderNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.polynomialRegressionOrderNumericUpDown.Location = new System.Drawing.Point(51, 47);
+      this.polynomialRegressionOrderNumericUpDown.Margin = new System.Windows.Forms.Padding(9, 3, 3, 3);
+      this.polynomialRegressionOrderNumericUpDown.Maximum = new decimal(new int[] {
+            6,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Minimum = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Name = "polynomialRegressionOrderNumericUpDown";
+      this.polynomialRegressionOrderNumericUpDown.Size = new System.Drawing.Size(115, 20);
+      this.polynomialRegressionOrderNumericUpDown.TabIndex = 15;
+      this.polynomialRegressionOrderNumericUpDown.Value = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.ValueChanged += new System.EventHandler(this.polynomialRegressionOrderNumericUpDown_ValueChanged);
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Location = new System.Drawing.Point(6, 49);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(36, 13);
+      this.orderLabel.TabIndex = 16;
+      this.orderLabel.Text = "Order:";
+      // 
+      // regressionTypeLabel
+      // 
+      this.regressionTypeLabel.AutoSize = true;
+      this.regressionTypeLabel.Location = new System.Drawing.Point(6, 22);
+      this.regressionTypeLabel.Name = "regressionTypeLabel";
+      this.regressionTypeLabel.Size = new System.Drawing.Size(34, 13);
+      this.regressionTypeLabel.TabIndex = 13;
+      this.regressionTypeLabel.Text = "Type:";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.regressionGroupBox);
+      this.splitContainer.Panel1.Controls.Add(this.variablesGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.scatterPlotView);
+      this.splitContainer.Panel2.Controls.Add(this.gradientPanel);
+      this.splitContainer.Size = new System.Drawing.Size(863, 517);
+      this.splitContainer.SplitterDistance = 172;
+      this.splitContainer.TabIndex = 5;
+      // 
+      // gradientPanel
+      // 
+      this.gradientPanel.Controls.Add(this.gradientPictureBox);
+      this.gradientPanel.Controls.Add(this.gradientMinimumLabel);
+      this.gradientPanel.Controls.Add(this.gradientMaximumLabel);
+      this.gradientPanel.Dock = System.Windows.Forms.DockStyle.Right;
+      this.gradientPanel.Location = new System.Drawing.Point(618, 0);
+      this.gradientPanel.Name = "gradientPanel";
+      this.gradientPanel.Size = new System.Drawing.Size(69, 517);
+      this.gradientPanel.TabIndex = 1;
+      this.gradientPanel.Visible = false;
+      // 
+      // gradientPictureBox
+      // 
+      this.gradientPictureBox.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.gradientPictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.gradientPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("gradientPictureBox.Image")));
+      this.gradientPictureBox.Location = new System.Drawing.Point(17, 29);
+      this.gradientPictureBox.Name = "gradientPictureBox";
+      this.gradientPictureBox.Size = new System.Drawing.Size(35, 460);
+      this.gradientPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+      this.gradientPictureBox.TabIndex = 19;
+      this.gradientPictureBox.TabStop = false;
+      // 
+      // gradientMinimumLabel
+      // 
+      this.gradientMinimumLabel.BackColor = System.Drawing.Color.Transparent;
+      this.gradientMinimumLabel.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.gradientMinimumLabel.Location = new System.Drawing.Point(0, 492);
+      this.gradientMinimumLabel.Name = "gradientMinimumLabel";
+      this.gradientMinimumLabel.Size = new System.Drawing.Size(69, 25);
+      this.gradientMinimumLabel.TabIndex = 18;
+      this.gradientMinimumLabel.Text = "0.0";
+      this.gradientMinimumLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+      // 
+      // gradientMaximumLabel
+      // 
+      this.gradientMaximumLabel.BackColor = System.Drawing.Color.Transparent;
+      this.gradientMaximumLabel.Dock = System.Windows.Forms.DockStyle.Top;
+      this.gradientMaximumLabel.Location = new System.Drawing.Point(0, 0);
+      this.gradientMaximumLabel.Name = "gradientMaximumLabel";
+      this.gradientMaximumLabel.Size = new System.Drawing.Size(69, 25);
+      this.gradientMaximumLabel.TabIndex = 17;
+      this.gradientMaximumLabel.Text = "1.0";
+      this.gradientMaximumLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+      // 
+      // ScatterPlotSingleView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ScatterPlotSingleView";
+      this.Size = new System.Drawing.Size(863, 517);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.variablesGroupBox.PerformLayout();
+      this.regressionGroupBox.ResumeLayout(false);
+      this.regressionGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.gradientPanel.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.gradientPictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Analysis.Views.ScatterPlotView scatterPlotView;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.Label yLabel;
+    private System.Windows.Forms.Label xLabel;
+    private System.Windows.Forms.ComboBox comboBoxYVariable;
+    private System.Windows.Forms.ComboBox comboBoxXVariable;
+    private System.Windows.Forms.ComboBox comboBoxGroup;
+    private System.Windows.Forms.Label groupLabel;
+    private System.Windows.Forms.GroupBox regressionGroupBox;
+    private System.Windows.Forms.ComboBox regressionTypeComboBox;
+    private System.Windows.Forms.NumericUpDown polynomialRegressionOrderNumericUpDown;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.Label regressionTypeLabel;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.CheckBox useGradientCheckBox;
+    private System.Windows.Forms.Panel gradientPanel;
+    private System.Windows.Forms.Label gradientMinimumLabel;
+    private System.Windows.Forms.Label gradientMaximumLabel;
+    private System.Windows.Forms.PictureBox gradientPictureBox;
+    private System.Windows.Forms.Label legendOrderLabel;
+    private System.Windows.Forms.ComboBox orderComboBox;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs	(revision 15268)
@@ -0,0 +1,249 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using RegressionType = HeuristicLab.Analysis.ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+
+  [View("Scatter Plot Single View")]
+  [Content(typeof(SingleScatterPlotContent), true)]
+  public sealed partial class ScatterPlotSingleView : ItemView {
+    private readonly string NoGroupItem = "";
+
+    public new SingleScatterPlotContent Content {
+      get { return (SingleScatterPlotContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ScatterPlotSingleView() {
+      InitializeComponent();
+
+      regressionTypeComboBox.DataSource = Enum.GetValues(typeof(RegressionType));
+      regressionTypeComboBox.SelectedItem = RegressionType.None;
+      orderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
+      orderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      useGradientCheckBox.Enabled = (string)comboBoxGroup.SelectedItem != NoGroupItem;
+      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked; ;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        InitData();
+      }
+    }
+
+    private void InitData() {
+      IEnumerable<string> variables = Content.PreprocessingData.GetDoubleVariableNames();
+
+      comboBoxXVariable.Items.Clear();
+      comboBoxYVariable.Items.Clear();
+      comboBoxGroup.Items.Clear();
+
+      comboBoxXVariable.Items.AddRange(variables.ToArray());
+      comboBoxYVariable.Items.AddRange(variables.ToArray());
+      comboBoxGroup.Items.Add(NoGroupItem);
+      foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData, 50)) {
+        comboBoxGroup.Items.Add(var);
+      }
+      comboBoxGroup.SelectedItem = Content.GroupingVariable ?? NoGroupItem;
+
+      // use x and y variable from content
+      if (Content.SelectedXVariable != null && Content.SelectedYVariable != null && Content.GroupingVariable != null) {
+        comboBoxXVariable.SelectedItem = Content.SelectedXVariable;
+        comboBoxYVariable.SelectedItem = Content.SelectedYVariable;
+        comboBoxGroup.SelectedItem = Content.GroupingVariable;
+      } else {
+        if (variables.Count() >= 2) {
+          comboBoxXVariable.SelectedIndex = 0;
+          comboBoxYVariable.SelectedIndex = 1;
+          comboBoxGroup.SelectedIndex = 0;
+          UpdateScatterPlot();
+        }
+      }
+    }
+
+    private void UpdateScatterPlot() {
+      if (comboBoxXVariable.SelectedItem != null && comboBoxYVariable.SelectedItem != null && comboBoxGroup.SelectedItem != null) {
+        var xVariable = (string)comboBoxXVariable.SelectedItem;
+        var yVariable = (string)comboBoxYVariable.SelectedItem;
+        var groupVariable = (string)comboBoxGroup.SelectedItem;
+        var legendOrder = (PreprocessingChartContent.LegendOrder)orderComboBox.SelectedItem;
+
+        ScatterPlot scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData, xVariable, yVariable, groupVariable, legendOrder);
+        //rows are saved and removed to avoid firing of visual property changed events
+        var rows = scatterPlot.Rows.ToList();
+        scatterPlot.Rows.Clear();
+        var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+        int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+        foreach (var row in rows) {
+          row.VisualProperties.PointSize = 6;
+          row.VisualProperties.IsRegressionVisibleInLegend = false;
+          row.VisualProperties.RegressionType = regressionType;
+          row.VisualProperties.PolynomialRegressionOrder = order;
+          row.VisualProperties.IsVisibleInLegend = !useGradientCheckBox.Checked;
+        }
+        scatterPlot.Rows.AddRange(rows);
+        var vp = scatterPlot.VisualProperties;
+        vp.Title = string.Empty;
+        vp.XAxisTitle = xVariable;
+        vp.YAxisTitle = yVariable;
+
+        scatterPlotView.Content = scatterPlot;
+
+        //save selected x and y variable in content
+        this.Content.SelectedXVariable = (string)comboBoxXVariable.SelectedItem;
+        this.Content.SelectedYVariable = (string)comboBoxYVariable.SelectedItem;
+        this.Content.GroupingVariable = (string)comboBoxGroup.SelectedItem;
+      }
+    }
+
+    private void comboBoxXVariable_SelectedIndexChanged(object sender, EventArgs e) {
+      var oldPlot = scatterPlotView.Content;
+      UpdateScatterPlot();
+      var newPlot = scatterPlotView.Content;
+
+      if (oldPlot == null || newPlot == null) return;
+      newPlot.VisualProperties.YAxisMinimumAuto = oldPlot.VisualProperties.YAxisMinimumAuto;
+      newPlot.VisualProperties.YAxisMaximumAuto = oldPlot.VisualProperties.YAxisMaximumAuto;
+      newPlot.VisualProperties.YAxisMinimumFixedValue = oldPlot.VisualProperties.YAxisMinimumFixedValue;
+      newPlot.VisualProperties.YAxisMaximumFixedValue = oldPlot.VisualProperties.YAxisMaximumFixedValue;
+
+      foreach (var x in newPlot.Rows.Zip(oldPlot.Rows, (nr, or) => new { nr, or })) {
+        var newVisuapProperties = (ScatterPlotDataRowVisualProperties)x.or.VisualProperties.Clone();
+        newVisuapProperties.DisplayName = x.nr.VisualProperties.DisplayName;
+        x.nr.VisualProperties = newVisuapProperties;
+      }
+    }
+
+    private void comboBoxYVariable_SelectedIndexChanged(object sender, EventArgs e) {
+      SuspendRepaint();
+      var oldPlot = scatterPlotView.Content;
+      UpdateScatterPlot();
+      var newPlot = scatterPlotView.Content;
+
+      if (oldPlot == null || newPlot == null) return;
+      newPlot.VisualProperties.XAxisMinimumAuto = oldPlot.VisualProperties.XAxisMinimumAuto;
+      newPlot.VisualProperties.XAxisMaximumAuto = oldPlot.VisualProperties.XAxisMaximumAuto;
+      newPlot.VisualProperties.XAxisMinimumFixedValue = oldPlot.VisualProperties.XAxisMinimumFixedValue;
+      newPlot.VisualProperties.XAxisMaximumFixedValue = oldPlot.VisualProperties.XAxisMaximumFixedValue;
+
+      foreach (var x in newPlot.Rows.Zip(oldPlot.Rows, (nr, or) => new { nr, or })) {
+        var newVisuapProperties = (ScatterPlotDataRowVisualProperties)x.or.VisualProperties.Clone();
+        newVisuapProperties.DisplayName = x.nr.VisualProperties.DisplayName;
+        x.nr.VisualProperties = newVisuapProperties;
+      }
+      ResumeRepaint(true);
+    }
+
+    private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e) {
+      useGradientCheckBox.Enabled = (string)comboBoxGroup.SelectedItem != NoGroupItem && Content.PreprocessingData.GetDoubleVariableNames().Contains((string)comboBoxGroup.SelectedItem);
+      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked;
+      UpdateScatterPlot();
+    }
+
+    #region Regression Line
+    private void regressionTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
+
+      UpdateRegressionLine();
+    }
+
+    private void polynomialRegressionOrderNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      UpdateRegressionLine();
+    }
+
+    private void UpdateRegressionLine() {
+      if (Content == null) return;
+
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+
+      foreach (var row in scatterPlotView.Content.Rows) {
+        row.VisualProperties.IsRegressionVisibleInLegend = false;
+        row.VisualProperties.RegressionType = regressionType;
+        row.VisualProperties.PolynomialRegressionOrder = order;
+      }
+    }
+    #endregion
+
+    private void useGradientCheckBox_CheckedChanged(object sender, EventArgs e) {
+      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked;
+
+      // remove rows and re-add them later to avoid firing visual property changd events
+      var rows = scatterPlotView.Content.Rows.ToDictionary(r => r.Name, r => r);
+      scatterPlotView.Content.Rows.Clear();
+
+      if (useGradientCheckBox.Checked) {
+        var groupVariable = (string)comboBoxGroup.SelectedItem;
+        if (groupVariable == NoGroupItem) return;
+
+        var groupValues = Content.PreprocessingData.GetValues<double>(Content.PreprocessingData.GetColumnIndex(groupVariable))
+          .Distinct().OrderBy(x => x).ToList();
+        double min = groupValues.FirstOrDefault(x => !double.IsNaN(x)), max = groupValues.LastOrDefault(x => !double.IsNaN(x));
+        foreach (var group in groupValues) {
+          ScatterPlotDataRow row;
+          if (rows.TryGetValue(group.ToString("R"), out row)) {
+            row.VisualProperties.Color = GetColor(group, min, max);
+            row.VisualProperties.IsVisibleInLegend = false;
+          }
+        }
+        gradientMinimumLabel.Text = min.ToString("G5");
+        gradientMaximumLabel.Text = max.ToString("G5");
+      } else {
+        foreach (var row in rows.Values) {
+          row.VisualProperties.Color = Color.Empty;
+          row.VisualProperties.IsVisibleInLegend = true;
+        }
+      }
+      scatterPlotView.Content.Rows.AddRange(rows.Values);
+    }
+
+    private static Color GetColor(double value, double min, double max) {
+      if (double.IsNaN(value)) {
+        return Color.Black;
+      }
+      var colors = ColorGradient.Colors;
+      int index = (int)((colors.Count - 1) * (value - min) / (max - min));
+      if (index >= colors.Count) index = colors.Count - 1;
+      if (index < 0) index = 0;
+      return colors[index];
+    }
+
+    private void orderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateScatterPlot();
+    }
+  }
+}
+
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.resx
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.resx	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.resx	(revision 15268)
@@ -0,0 +1,1022 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="gradientPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        Qk0S0gAAAAAAADYAAAAoAAAAMQAAAGsBAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAeAP8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8A
+        G/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8A
+        G/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AGwD/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABgA/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV
+        /wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV
+        /wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAVAP8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEgD/AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//
+        AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//
+        AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA8A/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAMAP8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8A
+        Cf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8A
+        Cf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACQD/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAYA/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAGAP8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        AwD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMAAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAAD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQAA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwAAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAAD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgAA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUAAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAAD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwAA/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4AAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAAA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycAAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AAD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/
+        LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/
+        LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA
+        /zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA
+        /zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAAAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAAD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/
+        NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/
+        NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgAA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkAAP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88
+        AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88
+        AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AAD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwAA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA
+        /0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA
+        /0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IAAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/
+        SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/
+        SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAAA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sAAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAAD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgAA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EAAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AAD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwAA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oAAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAAA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MAAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAAD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQAA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wAAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAAD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgAA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UAAP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94
+        AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94
+        AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AAD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewAA/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A
+        /34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A
+        /34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34AAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/
+        hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/
+        hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAAA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA
+        /4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA
+        /4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cAAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAAD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/
+        jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/
+        jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQAA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AAAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+T
+        AP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+T
+        AP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAAD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgAA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA
+        /5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA
+        /5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kAAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAAA/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58AAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAAD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQAA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gAAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AAD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgAA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EAAP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AAD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twAA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oAAP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAAA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MAAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAAD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/
+        yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/
+        yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQAA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wAAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/P
+        AP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/P
+        AP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAAD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gAA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA
+        /9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA
+        /9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UAAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AAD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/
+        2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/
+        2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wAA/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A
+        /94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A
+        /94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94AAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAAD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/
+        5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/
+        5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AAA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cAAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAAD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gAA/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0AAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAAD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wAA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YAAP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AAD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AAA//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8AAPz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        AAD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wAA9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8AAPP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/AADw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wAA7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8AAOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AADn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wAA5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A
+        5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A
+        5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8AAOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AADe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe
+        /wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe
+        /wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wAA2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8AANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/
+        ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/
+        ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/AADV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wAA0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A
+        0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A
+        0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8AAM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AADM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM
+        /wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM
+        /wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wAAyf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8A
+        yf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8A
+        yf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8AAMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AADG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wAAw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8AAMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AAC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wAAuv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8AALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/AAC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wAAsf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8AAK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AACr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wAAqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AAKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AACi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wAAn/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8AAJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AACZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ
+        /wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ
+        /wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wAAlv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8AAJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/
+        AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/
+        AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AACQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wAAjf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8A
+        jf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8A
+        jf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8AAIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AACH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH
+        /wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH
+        /wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wAAhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AAIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/
+        AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/
+        AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AAB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wAAe/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8A
+        e/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8A
+        e/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8AAHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AAB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wAAdf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8AAHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AABv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wAAbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AAGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AABm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wAAY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AAGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AABd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wAAWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AAFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AABU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wAAUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AAE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AABL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL
+        /wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL
+        /wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wAASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8A
+        SP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8A
+        SP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8AAEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AABC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC
+        /wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC
+        /wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wAAP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/
+        ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/
+        ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/AAA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wAANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8A
+        Nv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8A
+        Nv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8AADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/AAAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw
+        /wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw
+        /wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8AACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/
+        ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/
+        ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/AAAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAAJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        AAAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAAHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/AAAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAAFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/AAAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8AAAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAAA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMAAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAAD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQAA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwAAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAAD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgAA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUAAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAAD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwAA/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4AAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAAA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycAAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAAD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/
+        KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/
+        KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgAA/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0AAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8w
+        AP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8w
+        AP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAAD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwAA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA
+        /zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA
+        /zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYAAP85AP85AP85AP85AP85AP85AP85AP85AP85AP85
+        AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85
+        AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAAA/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A
+        /z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A
+        /z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8AAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAAD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/
+        RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/
+        RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQAA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gAAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAAD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgAA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EAAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAAD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwAA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oAAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAAA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MAAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAAD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQAA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wAAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAAD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgAA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UAAP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91
+        AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91
+        AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAAA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA
+        /3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA
+        /3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sAAP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AAD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/
+        gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/
+        gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQAA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QAAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+H
+        AP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+H
+        AP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAAD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igAA/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A
+        /40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A
+        /40A/40A/40A/40A/40A/40A/40A/40A/40A/40AAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+Q
+        AP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+Q
+        AP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAAD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwAA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA
+        /5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA
+        /5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YAAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAAA/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58AAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAAD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQAA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gAAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAAD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgAA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EAAP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AAD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twAA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oAAP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAAA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MAAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAAD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/
+        xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/
+        xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgAA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kAAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/M
+        AP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/M
+        AP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAAD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwAA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA
+        /9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA
+        /9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IAAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAAD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/
+        2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/
+        2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AAA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sAAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/e
+        AP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/e
+        AP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAAD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QAA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA
+        /+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA
+        /+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QAAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAAD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gAA/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0AAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAAD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wAA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YAAP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AAD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AAA//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8AAPz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/AAD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wAA9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8AAPP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/AADw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wAA7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8AAOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AADq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wAA5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A
+        5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A
+        5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8AAOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AADh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh
+        /wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh
+        /wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wAA3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8AANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/
+        ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/
+        ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/AADY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wAA1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A
+        1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A
+        1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8AANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/AADP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP
+        /wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP
+        /wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wAAzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AAMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/
+        AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/
+        AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AADG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wAAw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8AAMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AAC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wAAuv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8AALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/AAC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wAAsf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8AAK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AACr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wAAqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AAKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AACi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wAAn/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8AAJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AACc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wAAmf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8A
+        mf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8A
+        mf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8AAJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/
+        AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/
+        AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AACT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wAAkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8A
+        kP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8A
+        kP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AAI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AACK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK
+        /wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK
+        /wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wAAh/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8AAIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/
+        AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/
+        AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AACB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wAAfv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8A
+        fv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8A
+        fv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8AAHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AAB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wAAdf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8AAHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AABv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wAAbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AAGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AABm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wAAY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AAGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AABd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wAAWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AAFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AABU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wAAUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AAE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AABO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO
+        /wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO
+        /wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wAAS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AAEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/
+        AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/
+        AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AABF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wAAQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8A
+        Qv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8A
+        Qv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AAD//AD//AD//AD//AD//AD//AD//AD//AD//AD//
+        AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//
+        AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AAA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wAAOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8A
+        Of8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8A
+        Of8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/AAAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz
+        /wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz
+        /wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAAMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AAC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/
+        AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/
+        AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AAAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAAJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/AAAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAAHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/AAAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAAFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/AAAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8AAAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAAA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8A
+</value>
+  </data>
+</root>
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.Designer.cs	(revision 15268)
@@ -0,0 +1,242 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class SearchAndReplaceDialog {
+    /// <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.tabSearchReplace = new System.Windows.Forms.TabControl();
+      this.tabSearch = new System.Windows.Forms.TabPage();
+      this.tabReplace = new System.Windows.Forms.TabPage();
+      this.cmbComparisonOperator = new System.Windows.Forms.ComboBox();
+      this.txtSearchString = new System.Windows.Forms.TextBox();
+      this.lblSearch = new System.Windows.Forms.Label();
+      this.btnFindAll = new System.Windows.Forms.Button();
+      this.btnFindNext = new System.Windows.Forms.Button();
+      this.lblValue = new System.Windows.Forms.Label();
+      this.btnReplaceAll = new System.Windows.Forms.Button();
+      this.btnReplace = new System.Windows.Forms.Button();
+      this.cmbReplaceWith = new System.Windows.Forms.ComboBox();
+      this.txtValue = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.tabSearchReplace.SuspendLayout();
+      this.tabReplace.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabSearchReplace
+      // 
+      this.tabSearchReplace.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.tabSearchReplace.Controls.Add(this.tabSearch);
+      this.tabSearchReplace.Controls.Add(this.tabReplace);
+      this.tabSearchReplace.Location = new System.Drawing.Point(12, 12);
+      this.tabSearchReplace.Name = "tabSearchReplace";
+      this.tabSearchReplace.SelectedIndex = 0;
+      this.tabSearchReplace.Size = new System.Drawing.Size(564, 132);
+      this.tabSearchReplace.TabIndex = 0;
+      this.tabSearchReplace.SelectedIndexChanged += new System.EventHandler(this.tabSearchReplace_SelectedIndexChanged);
+      // 
+      // tabSearch
+      // 
+      this.tabSearch.Location = new System.Drawing.Point(4, 22);
+      this.tabSearch.Name = "tabSearch";
+      this.tabSearch.Padding = new System.Windows.Forms.Padding(3);
+      this.tabSearch.Size = new System.Drawing.Size(556, 106);
+      this.tabSearch.TabIndex = 0;
+      this.tabSearch.Text = "Search";
+      this.tabSearch.UseVisualStyleBackColor = true;
+      // 
+      // tabReplace
+      // 
+      this.tabReplace.Controls.Add(this.cmbComparisonOperator);
+      this.tabReplace.Controls.Add(this.txtSearchString);
+      this.tabReplace.Controls.Add(this.lblSearch);
+      this.tabReplace.Controls.Add(this.btnFindAll);
+      this.tabReplace.Controls.Add(this.btnFindNext);
+      this.tabReplace.Controls.Add(this.lblValue);
+      this.tabReplace.Controls.Add(this.btnReplaceAll);
+      this.tabReplace.Controls.Add(this.btnReplace);
+      this.tabReplace.Controls.Add(this.cmbReplaceWith);
+      this.tabReplace.Controls.Add(this.txtValue);
+      this.tabReplace.Controls.Add(this.label1);
+      this.tabReplace.Location = new System.Drawing.Point(4, 22);
+      this.tabReplace.Name = "tabReplace";
+      this.tabReplace.Padding = new System.Windows.Forms.Padding(3);
+      this.tabReplace.Size = new System.Drawing.Size(556, 106);
+      this.tabReplace.TabIndex = 1;
+      this.tabReplace.Text = "Replace";
+      this.tabReplace.UseVisualStyleBackColor = true;
+      // 
+      // cmbComparisonOperator
+      // 
+      this.cmbComparisonOperator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbComparisonOperator.FormattingEnabled = true;
+      this.cmbComparisonOperator.Location = new System.Drawing.Point(103, 19);
+      this.cmbComparisonOperator.Name = "cmbComparisonOperator";
+      this.cmbComparisonOperator.Size = new System.Drawing.Size(45, 21);
+      this.cmbComparisonOperator.TabIndex = 24;
+      // 
+      // txtSearchString
+      // 
+      this.txtSearchString.Location = new System.Drawing.Point(154, 20);
+      this.txtSearchString.Name = "txtSearchString";
+      this.txtSearchString.Size = new System.Drawing.Size(203, 20);
+      this.txtSearchString.TabIndex = 23;
+      // 
+      // lblSearch
+      // 
+      this.lblSearch.AutoSize = true;
+      this.lblSearch.Location = new System.Drawing.Point(41, 26);
+      this.lblSearch.Name = "lblSearch";
+      this.lblSearch.Size = new System.Drawing.Size(56, 13);
+      this.lblSearch.TabIndex = 22;
+      this.lblSearch.Text = "Search for";
+      // 
+      // btnFindAll
+      // 
+      this.btnFindAll.Location = new System.Drawing.Point(458, 20);
+      this.btnFindAll.Name = "btnFindAll";
+      this.btnFindAll.Size = new System.Drawing.Size(80, 23);
+      this.btnFindAll.TabIndex = 21;
+      this.btnFindAll.Text = "Find All";
+      this.btnFindAll.UseVisualStyleBackColor = true;
+      // 
+      // btnFindNext
+      // 
+      this.btnFindNext.Location = new System.Drawing.Point(372, 20);
+      this.btnFindNext.Name = "btnFindNext";
+      this.btnFindNext.Size = new System.Drawing.Size(80, 23);
+      this.btnFindNext.TabIndex = 20;
+      this.btnFindNext.Text = "Find Next";
+      this.btnFindNext.UseVisualStyleBackColor = true;
+      // 
+      // lblValue
+      // 
+      this.lblValue.AutoSize = true;
+      this.lblValue.Location = new System.Drawing.Point(64, 76);
+      this.lblValue.Name = "lblValue";
+      this.lblValue.Size = new System.Drawing.Size(34, 13);
+      this.lblValue.TabIndex = 19;
+      this.lblValue.Text = "Value";
+      // 
+      // btnReplaceAll
+      // 
+      this.btnReplaceAll.Location = new System.Drawing.Point(458, 47);
+      this.btnReplaceAll.Name = "btnReplaceAll";
+      this.btnReplaceAll.Size = new System.Drawing.Size(80, 23);
+      this.btnReplaceAll.TabIndex = 18;
+      this.btnReplaceAll.Text = "Replace All";
+      this.btnReplaceAll.UseVisualStyleBackColor = true;
+      // 
+      // btnReplace
+      // 
+      this.btnReplace.Location = new System.Drawing.Point(372, 47);
+      this.btnReplace.Name = "btnReplace";
+      this.btnReplace.Size = new System.Drawing.Size(80, 23);
+      this.btnReplace.TabIndex = 17;
+      this.btnReplace.Text = "Replace";
+      this.btnReplace.UseVisualStyleBackColor = true;
+      // 
+      // cmbReplaceWith
+      // 
+      this.cmbReplaceWith.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.cmbReplaceWith.FormattingEnabled = true;
+      this.cmbReplaceWith.Location = new System.Drawing.Point(103, 46);
+      this.cmbReplaceWith.Name = "cmbReplaceWith";
+      this.cmbReplaceWith.Size = new System.Drawing.Size(254, 21);
+      this.cmbReplaceWith.TabIndex = 16;
+      this.cmbReplaceWith.SelectedIndexChanged += new System.EventHandler(this.cmbReplaceWith_SelectedIndexChanged);
+      // 
+      // txtValue
+      // 
+      this.txtValue.Location = new System.Drawing.Point(103, 73);
+      this.txtValue.Name = "txtValue";
+      this.txtValue.Size = new System.Drawing.Size(254, 20);
+      this.txtValue.TabIndex = 15;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(28, 49);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(69, 13);
+      this.label1.TabIndex = 14;
+      this.label1.Text = "Replace with";
+      // 
+      // SearchAndReplaceDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(588, 156);
+      this.Controls.Add(this.tabSearchReplace);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "SearchAndReplaceDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.Text = "Search and Replace";
+      this.tabSearchReplace.ResumeLayout(false);
+      this.tabReplace.ResumeLayout(false);
+      this.tabReplace.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabSearchReplace;
+    private System.Windows.Forms.TabPage tabSearch;
+    private System.Windows.Forms.TabPage tabReplace;
+    private System.Windows.Forms.TextBox txtSearchString;
+    private System.Windows.Forms.Label lblSearch;
+    private System.Windows.Forms.Button btnFindAll;
+    private System.Windows.Forms.Button btnFindNext;
+    private System.Windows.Forms.Label lblValue;
+    private System.Windows.Forms.Button btnReplaceAll;
+    private System.Windows.Forms.Button btnReplace;
+    private System.Windows.Forms.ComboBox cmbReplaceWith;
+    private System.Windows.Forms.TextBox txtValue;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox cmbComparisonOperator;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.cs	(revision 15268)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Windows.Forms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  public enum ReplaceAction {
+    Value,
+    Average,
+    Median,
+    Random,
+    MostCommon,
+    Interpolation
+  }
+
+  public enum ComparisonOperation {
+    Equal,
+    Less,
+    LessOrEqual,
+    Greater,
+    GreaterOrEqual,
+    NotEqual
+  }
+
+  public partial class SearchAndReplaceDialog : Form {
+    private static readonly string[] ItemsText = { "Value", "Average", "Median", "Random", "Most Common", "Interpolation" };
+    private static readonly string[] ComparisonOperatorText = { "==", "<", "<=", ">", ">=", "!=" };
+
+    public SearchAndReplaceDialog() {
+      InitializeComponent();
+      cmbReplaceWith.Items.AddRange(ItemsText);
+      cmbReplaceWith.SelectedIndex = (int)ReplaceAction.Value;
+      cmbComparisonOperator.Items.AddRange(ComparisonOperatorText);
+      cmbComparisonOperator.SelectedIndex = (int)ComparisonOperation.Equal;
+    }
+
+    public void ActivateSearch() {
+      tabSearchReplace.SelectTab(tabSearch);
+      AddControlsToCurrentTab();
+    }
+
+    public void ActivateReplace() {
+      tabSearchReplace.SelectTab(tabReplace);
+      AddControlsToCurrentTab();
+    }
+
+    public void DisableReplace() {
+      tabSearchReplace.SelectTab(tabSearch);
+      tabReplace.Enabled = false;
+    }
+
+    public void EnableReplace() {
+      tabReplace.Enabled = true;
+    }
+
+    private void tabSearchReplace_SelectedIndexChanged(object sender, System.EventArgs e) {
+      AddControlsToCurrentTab();
+    }
+
+    private void cmbReplaceWith_SelectedIndexChanged(object sender, System.EventArgs e) {
+      lblValue.Visible = txtValue.Visible = cmbReplaceWith.SelectedIndex == (int)ReplaceAction.Value;
+    }
+
+    private void AddControlsToCurrentTab() {
+      tabSearchReplace.SelectedTab.Controls.Add(btnFindAll);
+      tabSearchReplace.SelectedTab.Controls.Add(btnFindNext);
+      tabSearchReplace.SelectedTab.Controls.Add(lblSearch);
+      tabSearchReplace.SelectedTab.Controls.Add(txtSearchString);
+      tabSearchReplace.SelectedTab.Controls.Add(cmbComparisonOperator);
+      ActiveControl = txtSearchString;
+      AcceptButton = btnFindNext;
+    }
+
+    public String GetSearchText() {
+      return txtSearchString.Text;
+    }
+
+    public string GetReplaceText() {
+      return txtValue.Text;
+    }
+
+    public ReplaceAction GetReplaceAction() {
+      return (ReplaceAction)cmbReplaceWith.SelectedIndex;
+    }
+
+    public ComparisonOperation GetComparisonOperation() {
+      return (ComparisonOperation)cmbComparisonOperator.SelectedIndex;
+    }
+
+    public event EventHandler FindAllEvent {
+      add { btnFindAll.Click += value; }
+      remove { btnFindAll.Click -= value; }
+    }
+
+    public event EventHandler FindNextEvent {
+      add { btnFindNext.Click += value; }
+      remove { btnFindNext.Click -= value; }
+    }
+
+    public event EventHandler ReplaceAllEvent {
+      add { btnReplaceAll.Click += value; }
+      remove { btnReplaceAll.Click -= value; }
+    }
+
+    public event EventHandler ReplaceNextEvent {
+      add { btnReplace.Click += value; }
+      remove { btnReplace.Click -= value; }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.Designer.cs	(revision 15268)
@@ -0,0 +1,386 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class StatisticsView {
+    /// <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();
+      this.lblRows = new System.Windows.Forms.Label();
+      this.lblColumns = new System.Windows.Forms.Label();
+      this.lblMissingValuesTotal = new System.Windows.Forms.Label();
+      this.lblNumericColumns = new System.Windows.Forms.Label();
+      this.lblNominalColumns = new System.Windows.Forms.Label();
+      this.stringMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.showVariablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.lblTNumValues = new System.Windows.Forms.Label();
+      this.orientationGroupBox = new System.Windows.Forms.GroupBox();
+      this.verticalRadioButton = new System.Windows.Forms.RadioButton();
+      this.horizontalRadioButton = new System.Windows.Forms.RadioButton();
+      this.rowsTextBox = new System.Windows.Forms.TextBox();
+      this.columnsTextBox = new System.Windows.Forms.TextBox();
+      this.totalValuesTextBox = new System.Windows.Forms.TextBox();
+      this.overviewTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.numericColumnsTextBox = new System.Windows.Forms.TextBox();
+      this.nominalColumnsTextBox5 = new System.Windows.Forms.TextBox();
+      this.missingValuesTextBox = new System.Windows.Forms.TextBox();
+      this.overviewGroupBox = new System.Windows.Forms.GroupBox();
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.showVariablesGroupBox.SuspendLayout();
+      this.orientationGroupBox.SuspendLayout();
+      this.overviewTableLayoutPanel.SuspendLayout();
+      this.overviewGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // lblRows
+      // 
+      this.lblRows.AutoSize = true;
+      this.lblRows.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblRows.Location = new System.Drawing.Point(3, 0);
+      this.lblRows.Name = "lblRows";
+      this.lblRows.Size = new System.Drawing.Size(52, 26);
+      this.lblRows.TabIndex = 0;
+      this.lblRows.Text = "Datarows";
+      this.lblRows.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // lblColumns
+      // 
+      this.lblColumns.AutoSize = true;
+      this.lblColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblColumns.Location = new System.Drawing.Point(3, 26);
+      this.lblColumns.Name = "lblColumns";
+      this.lblColumns.Size = new System.Drawing.Size(52, 26);
+      this.lblColumns.TabIndex = 2;
+      this.lblColumns.Text = "Variables";
+      this.lblColumns.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // lblMissingValuesTotal
+      // 
+      this.lblMissingValuesTotal.AutoSize = true;
+      this.lblMissingValuesTotal.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblMissingValuesTotal.Location = new System.Drawing.Point(275, 26);
+      this.lblMissingValuesTotal.Name = "lblMissingValuesTotal";
+      this.lblMissingValuesTotal.Size = new System.Drawing.Size(77, 26);
+      this.lblMissingValuesTotal.TabIndex = 3;
+      this.lblMissingValuesTotal.Text = "Missing Values";
+      this.lblMissingValuesTotal.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // lblNumericColumns
+      // 
+      this.lblNumericColumns.AutoSize = true;
+      this.lblNumericColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblNumericColumns.Location = new System.Drawing.Point(119, 0);
+      this.lblNumericColumns.Name = "lblNumericColumns";
+      this.lblNumericColumns.Size = new System.Drawing.Size(92, 26);
+      this.lblNumericColumns.TabIndex = 3;
+      this.lblNumericColumns.Text = "Numeric Variables";
+      this.lblNumericColumns.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // lblNominalColumns
+      // 
+      this.lblNominalColumns.AutoSize = true;
+      this.lblNominalColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblNominalColumns.Location = new System.Drawing.Point(119, 26);
+      this.lblNominalColumns.Name = "lblNominalColumns";
+      this.lblNominalColumns.Size = new System.Drawing.Size(92, 26);
+      this.lblNominalColumns.TabIndex = 3;
+      this.lblNominalColumns.Text = "Nominal Variables";
+      this.lblNominalColumns.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // stringMatrixView
+      // 
+      this.stringMatrixView.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.stringMatrixView.Caption = "StringConvertibleMatrix View";
+      this.stringMatrixView.Content = null;
+      this.stringMatrixView.Location = new System.Drawing.Point(3, 74);
+      this.stringMatrixView.Name = "stringMatrixView";
+      this.stringMatrixView.ReadOnly = true;
+      this.stringMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.stringMatrixView.ShowStatisticalInformation = true;
+      this.stringMatrixView.Size = new System.Drawing.Size(655, 374);
+      this.stringMatrixView.TabIndex = 4;
+      // 
+      // showVariablesGroupBox
+      // 
+      this.showVariablesGroupBox.Controls.Add(this.checkInputsTargetButton);
+      this.showVariablesGroupBox.Controls.Add(this.uncheckAllButton);
+      this.showVariablesGroupBox.Controls.Add(this.checkAllButton);
+      this.showVariablesGroupBox.Location = new System.Drawing.Point(458, 0);
+      this.showVariablesGroupBox.Name = "showVariablesGroupBox";
+      this.showVariablesGroupBox.Size = new System.Drawing.Size(97, 71);
+      this.showVariablesGroupBox.TabIndex = 16;
+      this.showVariablesGroupBox.TabStop = false;
+      this.showVariablesGroupBox.Text = "Show Variables";
+      // 
+      // lblTNumValues
+      // 
+      this.lblTNumValues.AutoSize = true;
+      this.lblTNumValues.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblTNumValues.Location = new System.Drawing.Point(275, 0);
+      this.lblTNumValues.Name = "lblTNumValues";
+      this.lblTNumValues.Size = new System.Drawing.Size(77, 26);
+      this.lblTNumValues.TabIndex = 2;
+      this.lblTNumValues.Text = "Total Values";
+      this.lblTNumValues.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.toolTip.SetToolTip(this.lblTNumValues, "Valid Values (excl. missing Values)");
+      // 
+      // orientationGroupBox
+      // 
+      this.orientationGroupBox.Controls.Add(this.verticalRadioButton);
+      this.orientationGroupBox.Controls.Add(this.horizontalRadioButton);
+      this.orientationGroupBox.Location = new System.Drawing.Point(561, 0);
+      this.orientationGroupBox.Name = "orientationGroupBox";
+      this.orientationGroupBox.Size = new System.Drawing.Size(94, 71);
+      this.orientationGroupBox.TabIndex = 17;
+      this.orientationGroupBox.TabStop = false;
+      this.orientationGroupBox.Text = "Orientation";
+      // 
+      // verticalRadioButton
+      // 
+      this.verticalRadioButton.AutoSize = true;
+      this.verticalRadioButton.Checked = true;
+      this.verticalRadioButton.Location = new System.Drawing.Point(6, 32);
+      this.verticalRadioButton.Name = "verticalRadioButton";
+      this.verticalRadioButton.Size = new System.Drawing.Size(60, 17);
+      this.verticalRadioButton.TabIndex = 1;
+      this.verticalRadioButton.TabStop = true;
+      this.verticalRadioButton.Text = "Vertical";
+      this.verticalRadioButton.UseVisualStyleBackColor = true;
+      this.verticalRadioButton.CheckedChanged += new System.EventHandler(this.verticalRadioButton_CheckedChanged);
+      // 
+      // horizontalRadioButton
+      // 
+      this.horizontalRadioButton.AutoSize = true;
+      this.horizontalRadioButton.Location = new System.Drawing.Point(6, 14);
+      this.horizontalRadioButton.Name = "horizontalRadioButton";
+      this.horizontalRadioButton.Size = new System.Drawing.Size(72, 17);
+      this.horizontalRadioButton.TabIndex = 0;
+      this.horizontalRadioButton.Text = "Horizontal";
+      this.horizontalRadioButton.UseVisualStyleBackColor = true;
+      this.horizontalRadioButton.CheckedChanged += new System.EventHandler(this.horizontalRadioButton_CheckedChanged);
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.rowsTextBox.Location = new System.Drawing.Point(61, 3);
+      this.rowsTextBox.Name = "rowsTextBox";
+      this.rowsTextBox.ReadOnly = true;
+      this.rowsTextBox.Size = new System.Drawing.Size(52, 20);
+      this.rowsTextBox.TabIndex = 18;
+      this.rowsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.columnsTextBox.Location = new System.Drawing.Point(61, 29);
+      this.columnsTextBox.Name = "columnsTextBox";
+      this.columnsTextBox.ReadOnly = true;
+      this.columnsTextBox.Size = new System.Drawing.Size(52, 20);
+      this.columnsTextBox.TabIndex = 18;
+      this.columnsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // totalValuesTextBox
+      // 
+      this.totalValuesTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.totalValuesTextBox.Location = new System.Drawing.Point(358, 3);
+      this.totalValuesTextBox.Name = "totalValuesTextBox";
+      this.totalValuesTextBox.ReadOnly = true;
+      this.totalValuesTextBox.Size = new System.Drawing.Size(82, 20);
+      this.totalValuesTextBox.TabIndex = 18;
+      this.totalValuesTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // overviewTableLayoutPanel
+      // 
+      this.overviewTableLayoutPanel.ColumnCount = 6;
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 28.57143F));
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 28.57143F));
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 42.85715F));
+      this.overviewTableLayoutPanel.Controls.Add(this.lblRows, 0, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblColumns, 0, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.columnsTextBox, 1, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblNominalColumns, 2, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblNumericColumns, 2, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.rowsTextBox, 1, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.numericColumnsTextBox, 3, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.nominalColumnsTextBox5, 3, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.missingValuesTextBox, 5, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblTNumValues, 4, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.totalValuesTextBox, 5, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblMissingValuesTotal, 4, 1);
+      this.overviewTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.overviewTableLayoutPanel.Location = new System.Drawing.Point(3, 16);
+      this.overviewTableLayoutPanel.Name = "overviewTableLayoutPanel";
+      this.overviewTableLayoutPanel.RowCount = 3;
+      this.overviewTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.overviewTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.overviewTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+      this.overviewTableLayoutPanel.Size = new System.Drawing.Size(443, 52);
+      this.overviewTableLayoutPanel.TabIndex = 19;
+      // 
+      // numericColumnsTextBox
+      // 
+      this.numericColumnsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.numericColumnsTextBox.Location = new System.Drawing.Point(217, 3);
+      this.numericColumnsTextBox.Name = "numericColumnsTextBox";
+      this.numericColumnsTextBox.ReadOnly = true;
+      this.numericColumnsTextBox.Size = new System.Drawing.Size(52, 20);
+      this.numericColumnsTextBox.TabIndex = 18;
+      this.numericColumnsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // nominalColumnsTextBox5
+      // 
+      this.nominalColumnsTextBox5.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.nominalColumnsTextBox5.Location = new System.Drawing.Point(217, 29);
+      this.nominalColumnsTextBox5.Name = "nominalColumnsTextBox5";
+      this.nominalColumnsTextBox5.ReadOnly = true;
+      this.nominalColumnsTextBox5.Size = new System.Drawing.Size(52, 20);
+      this.nominalColumnsTextBox5.TabIndex = 18;
+      this.nominalColumnsTextBox5.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // missingValuesTextBox
+      // 
+      this.missingValuesTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.missingValuesTextBox.Location = new System.Drawing.Point(358, 29);
+      this.missingValuesTextBox.Name = "missingValuesTextBox";
+      this.missingValuesTextBox.ReadOnly = true;
+      this.missingValuesTextBox.Size = new System.Drawing.Size(82, 20);
+      this.missingValuesTextBox.TabIndex = 18;
+      this.missingValuesTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // overviewGroupBox
+      // 
+      this.overviewGroupBox.Controls.Add(this.overviewTableLayoutPanel);
+      this.overviewGroupBox.Location = new System.Drawing.Point(3, 0);
+      this.overviewGroupBox.Name = "overviewGroupBox";
+      this.overviewGroupBox.Size = new System.Drawing.Size(449, 71);
+      this.overviewGroupBox.TabIndex = 20;
+      this.overviewGroupBox.TabStop = false;
+      this.overviewGroupBox.Text = "Overview";
+      // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(36, 19);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Show Inputs & Target");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(66, 19);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "Show None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(6, 19);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.checkAllButton, "Show All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
+      // 
+      // StatisticsView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.overviewGroupBox);
+      this.Controls.Add(this.orientationGroupBox);
+      this.Controls.Add(this.showVariablesGroupBox);
+      this.Controls.Add(this.stringMatrixView);
+      this.Name = "StatisticsView";
+      this.Size = new System.Drawing.Size(661, 451);
+      this.showVariablesGroupBox.ResumeLayout(false);
+      this.orientationGroupBox.ResumeLayout(false);
+      this.orientationGroupBox.PerformLayout();
+      this.overviewTableLayoutPanel.ResumeLayout(false);
+      this.overviewTableLayoutPanel.PerformLayout();
+      this.overviewGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label lblRows;
+    private System.Windows.Forms.Label lblColumns;
+    private System.Windows.Forms.Label lblMissingValuesTotal;
+    private System.Windows.Forms.Label lblNumericColumns;
+    private System.Windows.Forms.Label lblNominalColumns;
+    private HeuristicLab.Data.Views.StringConvertibleMatrixView stringMatrixView;
+    private System.Windows.Forms.GroupBox showVariablesGroupBox;
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.GroupBox orientationGroupBox;
+    private System.Windows.Forms.RadioButton verticalRadioButton;
+    private System.Windows.Forms.RadioButton horizontalRadioButton;
+    private System.Windows.Forms.Label lblTNumValues;
+    private System.Windows.Forms.TextBox rowsTextBox;
+    private System.Windows.Forms.TextBox columnsTextBox;
+    private System.Windows.Forms.TextBox totalValuesTextBox;
+    private System.Windows.Forms.TableLayoutPanel overviewTableLayoutPanel;
+    private System.Windows.Forms.TextBox numericColumnsTextBox;
+    private System.Windows.Forms.TextBox nominalColumnsTextBox5;
+    private System.Windows.Forms.TextBox missingValuesTextBox;
+    private System.Windows.Forms.GroupBox overviewGroupBox;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs	(revision 15268)
@@ -0,0 +1,275 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Statistics View")]
+  [Content(typeof(StatisticsContent), true)]
+  public partial class StatisticsView : ItemView {
+    private bool horizontal = false;
+    private StringMatrix statisticsMatrix;
+    private static readonly string[] StatisticsNames = new[] {
+      "Type",
+      "Missing Values",
+      "Min",
+      "Max",
+      "Median",
+      "Average",
+      "Std. Deviation",
+      "Variance",
+      "25th Percentile",
+      "75th Percentile",
+      "Most Common Value",
+      "Num. diff. Values"
+    };
+
+    public new StatisticsContent Content {
+      get { return (StatisticsContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public StatisticsView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        rowsTextBox.Text = string.Empty;
+        columnsTextBox.Text = string.Empty;
+        numericColumnsTextBox.Text = string.Empty;
+        nominalColumnsTextBox5.Text = string.Empty;
+        missingValuesTextBox.Text = string.Empty;
+        totalValuesTextBox.Text = string.Empty;
+        stringMatrixView.Content = null;
+        statisticsMatrix = null;
+      } else {
+        UpdateData();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Changed += Content_Changed;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Changed -= Content_Changed;
+      base.DeregisterContentEvents();
+    }
+
+    private void UpdateData(Dictionary<string, bool> oldVisibility = null) {
+      var logic = Content.StatisticsLogic;
+      rowsTextBox.Text = logic.GetRowCount().ToString();
+      columnsTextBox.Text = logic.GetColumnCount().ToString();
+      numericColumnsTextBox.Text = logic.GetNumericColumnCount().ToString();
+      nominalColumnsTextBox5.Text = logic.GetNominalColumnCount().ToString();
+      missingValuesTextBox.Text = logic.GetMissingValueCount().ToString();
+      totalValuesTextBox.Text = (logic.GetColumnCount() * logic.GetRowCount() - logic.GetMissingValueCount()).ToString();
+
+      var variableNames = Content.PreprocessingData.VariableNames.ToList();
+      if (horizontal)
+        statisticsMatrix = new StringMatrix(StatisticsNames.Length, Content.PreprocessingData.Columns) {
+          RowNames = StatisticsView.StatisticsNames,
+          ColumnNames = variableNames
+        };
+      else
+        statisticsMatrix = new StringMatrix(Content.PreprocessingData.Columns, StatisticsNames.Length) {
+          RowNames = variableNames,
+          ColumnNames = StatisticsView.StatisticsNames
+        };
+
+      for (int i = 0; i < logic.GetColumnCount(); i++) {
+        var data = GetStatistics(i);
+        for (int j = 0; j < data.Count; j++) {
+          if (horizontal)
+            statisticsMatrix[j, i] = data[j];
+          else
+            statisticsMatrix[i, j] = data[j];
+        }
+      }
+
+      stringMatrixView.Parent.SuspendRepaint();
+      stringMatrixView.Content = statisticsMatrix;
+
+      var grid = stringMatrixView.DataGridView;
+      int idx = 0;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      foreach (DataGridViewBand band in list) {
+        var variable = variableNames[idx++];
+        if (oldVisibility != null) {
+          band.Visible = !oldVisibility.ContainsKey(variable) || oldVisibility[variable];
+        }
+      }
+      if (horizontal)
+        stringMatrixView.UpdateColumnHeaders();
+      else
+        stringMatrixView.UpdateRowHeaders();
+
+      stringMatrixView.DataGridView.AutoResizeColumns();
+      stringMatrixView.Parent.ResumeRepaint(true);
+    }
+
+    private List<string> GetStatistics(int varIdx) {
+      List<string> list;
+      var logic = Content.StatisticsLogic;
+      if (logic.VariableHasType<double>(varIdx)) {
+        list = GetDoubleColumns(varIdx);
+      } else if (logic.VariableHasType<string>(varIdx)) {
+        list = GetStringColumns(varIdx);
+      } else if (logic.VariableHasType<DateTime>(varIdx)) {
+        list = GetDateTimeColumns(varIdx);
+      } else {
+        list = new List<string>();
+        for (int j = 0; j < StatisticsNames.Length; ++j) {
+          list.Add("unknown column type");
+        }
+      }
+      return list;
+    }
+
+    private List<string> GetDoubleColumns(int statIdx) {
+      var logic = Content.StatisticsLogic;
+      return new List<string> {
+        logic.GetColumnTypeAsString(statIdx),
+        logic.GetMissingValueCount(statIdx).ToString(),
+        logic.GetMin<double>(statIdx, double.NaN).ToString(),
+        logic.GetMax<double>(statIdx, double.NaN).ToString(),
+        logic.GetMedian(statIdx).ToString(),
+        logic.GetAverage(statIdx).ToString(),
+        logic.GetStandardDeviation(statIdx).ToString(),
+        logic.GetVariance(statIdx).ToString(),
+        logic.GetOneQuarterPercentile(statIdx).ToString(),
+        logic.GetThreeQuarterPercentile(statIdx).ToString(),
+        logic.GetMostCommonValue<double>(statIdx, double.NaN).ToString(),
+        logic.GetDifferentValuesCount<double>(statIdx).ToString()
+      };
+    }
+
+    private List<string> GetStringColumns(int statIdx) {
+      var logic = Content.StatisticsLogic;
+      return new List<string> {
+        logic.GetColumnTypeAsString(statIdx),
+        logic.GetMissingValueCount(statIdx).ToString(),
+        "", //min
+        "", //max
+        "", //median
+        "", //average
+        "", //standard deviation
+        "", //variance
+        "", //quarter percentile
+        "", //three quarter percentile
+        logic.GetMostCommonValue<string>(statIdx,string.Empty) ?? "",
+        logic.GetDifferentValuesCount<string>(statIdx).ToString()
+      };
+    }
+
+    private List<string> GetDateTimeColumns(int statIdx) {
+      var logic = Content.StatisticsLogic;
+      return new List<string> {
+        logic.GetColumnTypeAsString(statIdx),
+        logic.GetMissingValueCount(statIdx).ToString(),
+        logic.GetMin<DateTime>(statIdx, DateTime.MinValue).ToString(),
+        logic.GetMax<DateTime>(statIdx, DateTime.MinValue).ToString(),
+        logic.GetMedianDateTime(statIdx).ToString(),
+        logic.GetAverageDateTime(statIdx).ToString(),
+        logic.GetStandardDeviation(statIdx).ToString(),
+        logic.GetVariance(statIdx).ToString(),
+        logic.GetOneQuarterPercentile(statIdx).ToString(),
+        logic.GetThreeQuarterPercentile(statIdx).ToString(),
+        logic.GetMostCommonValue<DateTime>(statIdx, DateTime.MinValue).ToString(),
+        logic.GetDifferentValuesCount<DateTime>(statIdx).ToString()
+      };
+    }
+
+    private void Content_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      UpdateData();
+    }
+
+    #region Show/Hide Variables
+    private void checkInputsTargetButton_Click(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      var variableNames = Content.PreprocessingData.VariableNames.ToList();
+      int idx = 0;
+      foreach (DataGridViewBand band in list) {
+        var variable = variableNames[idx++];
+        bool isInputTarget = Content.PreprocessingData.InputVariables.Contains(variable)
+                             || Content.PreprocessingData.TargetVariable == variable;
+        band.Visible = isInputTarget;
+        if (horizontal)
+          stringMatrixView.UpdateColumnHeaders();
+        else
+          stringMatrixView.UpdateRowHeaders();
+      }
+
+    }
+    private void checkAllButton_Click(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      foreach (DataGridViewBand band in list) {
+        band.Visible = true;
+      }
+      if (horizontal)
+        stringMatrixView.UpdateColumnHeaders();
+      else
+        stringMatrixView.UpdateRowHeaders();
+    }
+    private void uncheckAllButton_Click(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      foreach (DataGridViewBand band in list) {
+        band.Visible = false;
+      }
+    }
+    #endregion
+
+    #region Orientation
+    private void horizontalRadioButton_CheckedChanged(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var oldVisibility = new Dictionary<string, bool>();
+      var variableNames = Content.PreprocessingData.VariableNames.ToList();
+      if (stringMatrixView.Content != null) {
+        var list = horizontal ? grid.Columns : grid.Rows as IList;
+        int idx = 0;
+        foreach (DataGridViewBand band in list) {
+          var variable = variableNames[idx++];
+          oldVisibility.Add(variable, band.Visible);
+        }
+      }
+      horizontal = horizontalRadioButton.Checked;
+      UpdateData(oldVisibility);
+    }
+    private void verticalRadioButton_CheckedChanged(object sender, EventArgs e) {
+      // everything is handled in horizontalRadioButton_CheckedChanged 
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 15268)
@@ -0,0 +1,120 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class TransformationView {
+    /// <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.applyButton = new System.Windows.Forms.Button();
+      this.preserveColumnsCheckbox = new System.Windows.Forms.CheckBox();
+      this.lblFilterNotice = new System.Windows.Forms.Label();
+      this.transformationListView = new HeuristicLab.DataPreprocessing.Views.CheckedTransformationListView();
+      this.SuspendLayout();
+      // 
+      // applyButton
+      // 
+      this.applyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.applyButton.Location = new System.Drawing.Point(490, 488);
+      this.applyButton.Name = "applyButton";
+      this.applyButton.Size = new System.Drawing.Size(134, 23);
+      this.applyButton.TabIndex = 1;
+      this.applyButton.Text = "Apply Transformations";
+      this.applyButton.UseVisualStyleBackColor = true;
+      this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
+      // 
+      // preserveColumnsCheckbox
+      // 
+      this.preserveColumnsCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.preserveColumnsCheckbox.AutoSize = true;
+      this.preserveColumnsCheckbox.Location = new System.Drawing.Point(337, 492);
+      this.preserveColumnsCheckbox.Name = "preserveColumnsCheckbox";
+      this.preserveColumnsCheckbox.Size = new System.Drawing.Size(147, 17);
+      this.preserveColumnsCheckbox.TabIndex = 2;
+      this.preserveColumnsCheckbox.Text = "Preserve original Columns";
+      this.preserveColumnsCheckbox.UseVisualStyleBackColor = true;
+      // 
+      // lblFilterNotice
+      // 
+      this.lblFilterNotice.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.lblFilterNotice.AutoSize = true;
+      this.lblFilterNotice.Location = new System.Drawing.Point(20, 493);
+      this.lblFilterNotice.Name = "lblFilterNotice";
+      this.lblFilterNotice.Size = new System.Drawing.Size(274, 13);
+      this.lblFilterNotice.TabIndex = 3;
+      this.lblFilterNotice.Text = "Transformations cannot be applied since a filter is active!";
+      this.lblFilterNotice.Visible = false;
+      // 
+      // transformationListView
+      // 
+      this.transformationListView.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.transformationListView.Caption = "Transformations";
+      this.transformationListView.Content = null;
+      this.transformationListView.Location = new System.Drawing.Point(0, 0);
+      this.transformationListView.Name = "transformationListView";
+      this.transformationListView.ReadOnly = false;
+      this.transformationListView.Size = new System.Drawing.Size(627, 482);
+      this.transformationListView.TabIndex = 0;
+      // 
+      // TransformationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.lblFilterNotice);
+      this.Controls.Add(this.preserveColumnsCheckbox);
+      this.Controls.Add(this.applyButton);
+      this.Controls.Add(this.transformationListView);
+      this.Name = "TransformationView";
+      this.Size = new System.Drawing.Size(627, 514);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+    private CheckedTransformationListView transformationListView;
+    private System.Windows.Forms.Button applyButton;
+    private System.Windows.Forms.CheckBox preserveColumnsCheckbox;
+    private System.Windows.Forms.Label lblFilterNotice;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15268)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Transformation View")]
+  [Content(typeof(TransformationContent), true)]
+  public partial class TransformationView : AsynchronousContentView {
+    public new TransformationContent Content {
+      get { return (TransformationContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public TransformationView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        transformationListView.Content = null;
+      } else {
+        transformationListView.Content = Content.CheckedTransformationList;
+        CheckFilters();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
+    }
+
+    void FilterLogic_FilterChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        CheckFilters();
+      }
+    }
+
+    private void CheckFilters() {
+      if (Content.FilterLogic.IsFiltered) {
+        applyButton.Enabled = false;
+        lblFilterNotice.Visible = true;
+      } else {
+        applyButton.Enabled = true;
+        lblFilterNotice.Visible = false;
+      }
+    }
+
+    private void applyButton_Click(object sender, EventArgs e) {
+      var transformations = Content.CheckedTransformationList.CheckedItems.Select(x => x.Value);
+
+      if (transformations.Any(x => ((Transformation)x).ColumnParameter.Value == null)) {
+        MessageBox.Show(this, "Parameter \"Column\" of a selected Transformation is not set.", "Applying Transformations...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+        return;
+      }
+
+      var transformator = new PreprocessingTransformator(Content.Data);
+      bool preserve = preserveColumnsCheckbox.CheckState == CheckState.Checked;
+      string errorMsg;
+      bool success = transformator.ApplyTransformations(transformations, preserve, out errorMsg);
+      if (success) {
+        Content.CheckedTransformationList.Clear();
+        MessageBox.Show(this, "Transformations applied.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
+      } else {
+        MessageBox.Show(this,
+          "Error in Transformation.\nValue is copied when transformion of cell failed.\n" + errorMsg,
+          "Transformation failed", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/FindPreprocessingItemsIterator.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/FindPreprocessingItemsIterator.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/FindPreprocessingItemsIterator.cs	(revision 15268)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  class FindPreprocessingItemsIterator : IFindPreprocessingItemsIterator {
+    private IDictionary<int, IList<int>> items;
+    private Tuple<int, int> currentCell;
+
+    public FindPreprocessingItemsIterator(IDictionary<int, IList<int>> items) {
+      this.items = items;
+      Reset();
+    }
+
+    public void SetStartCell(int columnIndex, int rowIndex) {
+      Tuple<int, int> startCell = GetNextFoundCell(columnIndex, rowIndex);
+      if (startCell == null) {
+        int tmpColumnIndex = columnIndex;
+        do {
+          ++tmpColumnIndex;
+          if (!items.ContainsKey(tmpColumnIndex)) {
+            tmpColumnIndex = 0;
+          }
+          startCell = GetNextFoundCell(tmpColumnIndex, 0);
+        } while (startCell == null && tmpColumnIndex != columnIndex);
+
+        if (startCell == null && tmpColumnIndex == columnIndex && rowIndex != 0) {
+          startCell = GetNextFoundCell(columnIndex, 0);
+        }
+      }
+      currentCell = startCell;
+    }
+
+    private Tuple<int, int> GetNextFoundCell(int columnIndex, int rowIndex) {
+      Tuple<int, int> next = null;
+      for (int i = 0; i < items[columnIndex].Count; ++i) {
+        if (items[columnIndex][i] >= rowIndex) {
+          next = new Tuple<int, int>(columnIndex, i);
+          break;
+        }
+      }
+      return next;
+    }
+
+    public bool MoveNext() {
+      bool result = false;
+      bool endReached = false;
+      if (CurrentCellExists()) {
+        do {
+          if (currentCell.Item2 < items[currentCell.Item1].Count - 1) {
+            currentCell = new Tuple<int, int>(currentCell.Item1, currentCell.Item2 + 1);
+          } else if (currentCell.Item1 < items.Count - 1) {
+            currentCell = new Tuple<int, int>(currentCell.Item1 + 1, 0);
+          } else {
+            endReached = true;
+          }
+        } while (!endReached && !CurrentCellExists());
+        result = !endReached;
+      }
+      return result;
+    }
+
+    public Tuple<int, int> GetCurrent() {
+      Tuple<int, int> resultCell = null;
+      if (items != null && CurrentCellExists()) {
+        int cellRow = items[currentCell.Item1].ElementAt(currentCell.Item2);
+        resultCell = new Tuple<int, int>(currentCell.Item1, cellRow);
+      }
+      return resultCell;
+    }
+
+    public void Reset() {
+      SetStartCell(0, 0);
+      if (!CurrentCellExists()) {
+        MoveNext();
+      }
+    }
+
+    private bool CurrentCellExists() {
+      bool result = false;
+      if (currentCell != null && items != null) {
+        result = items.ContainsKey(currentCell.Item1) && currentCell.Item2 < items[currentCell.Item1].Count;
+      }
+      return result;
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/IFindPreprocessingItemsIterator.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/IFindPreprocessingItemsIterator.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/IFindPreprocessingItemsIterator.cs	(revision 15268)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  interface IFindPreprocessingItemsIterator {
+    Tuple<int, int> GetCurrent();
+    bool MoveNext();
+    void Reset();
+    void SetStartCell(int columnIndex, int rowIndex); 
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/VerticalLabel.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/VerticalLabel.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/Utils/VerticalLabel.cs	(revision 15268)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  public class VerticalLabel : Label {
+    protected override void OnPaint(PaintEventArgs e) {
+      Brush b = new SolidBrush(ForeColor);
+      var stringFormat = new StringFormat(StringFormatFlags.DirectionVertical);
+
+      var textSize = e.Graphics.MeasureString(Text, Font, PointF.Empty, stringFormat);
+      e.Graphics.TranslateTransform(Width / 2 + textSize.Width / 2, Height / 2 + textSize.Height / 2);
+      e.Graphics.RotateTransform(180);
+
+      e.Graphics.DrawString(Text, Font, b, PointF.Empty, stringFormat);
+    }
+  }
+}
+
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.Designer.cs	(revision 15268)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
+  partial class ViewShortcutListView {
+    /// <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() {
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      // 
+      // viewHost
+      // 
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.ViewsLabelVisible = false;
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Visible = false;
+      // 
+      // ViewShortcutListView
+      // 
+      this.Name = "ViewShortcutListView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.cs	(revision 15268)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("ViewShortcutCollection View")]
+  [Content(typeof(IItemList<IViewShortcut>), true)]
+  public partial class ViewShortcutListView : ItemListView<IViewShortcut> {
+    public ViewShortcutListView() {
+      InitializeComponent();
+      Controls.Clear();
+      Controls.Add(splitContainer);
+      splitContainer.Panel1.Controls.Clear();
+      splitContainer.Panel1.Controls.Add(itemsListView);
+      splitContainer.Panel2.Controls.Clear();
+      splitContainer.Panel2.Controls.Add(viewHost);
+    }
+
+    //Open item in new tab on double click
+    //Clone chart items
+    protected override void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        IViewShortcut item = itemsListView.SelectedItems[0].Tag as IViewShortcut;
+        if (item != null) {
+          try {
+            item = (IViewShortcut)item.Clone();
+            var view = MainFormManager.MainForm.ShowContent(item);
+            if (view != null) {
+              view.ReadOnly = ReadOnly;
+              view.Locked = Locked;
+            }
+          } catch (NullReferenceException) {
+            // cloning for preprocessing not done properly yet
+          }
+        }
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs	(revision 15268)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Feature Correlation Matrix", "Represents the feature correlation matrix.")]
+  public class CorrelationMatrixContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Gradient; }
+    }
+
+    public PreprocessingContext Context { get; private set; }
+    public ITransactionalPreprocessingData PreprocessingData {
+      get { return Context.Data; }
+    }
+
+    public DataAnalysisProblemData ProblemData {
+      get {
+        var problemData = (DataAnalysisProblemData)Context.CreateNewProblemData();
+        foreach (var input in problemData.InputVariables)
+          problemData.InputVariables.SetItemCheckedState(input, true);
+        // CorrelationView hides non-input columns per default
+        return problemData;
+      }
+    }
+
+    public CorrelationMatrixContent(PreprocessingContext context) {
+      Context = context;
+    }
+
+    public CorrelationMatrixContent(CorrelationMatrixContent original, Cloner cloner)
+      : base(original, cloner) {
+      Context = original.Context;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CorrelationMatrixContent(this, cloner);
+    }
+
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { PreprocessingData.Changed += value; }
+      remove { PreprocessingData.Changed -= value; }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs	(revision 15268)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Data Completeness Chart", "Represents a datacompleteness chart.")]
+
+  public class DataCompletenessChartContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.EditBrightnessContrast; }
+    }
+
+    public SearchLogic SearchLogic { get; private set; }
+
+    public DataCompletenessChartContent(SearchLogic searchLogic) {
+      SearchLogic = searchLogic;
+    }
+
+    public DataCompletenessChartContent(DataCompletenessChartContent content, Cloner cloner)
+      : base(content, cloner) {
+      SearchLogic = content.SearchLogic;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DataCompletenessChartContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs	(revision 15268)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Data Grid", "Represents a data grid.")]
+  public class DataGridContent : Item, IStringConvertibleMatrix, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Table; }
+    }
+
+    public ITransactionalPreprocessingData PreProcessingData { get; private set; }
+
+    public ManipulationLogic ManipulationLogic { get; private set; }
+    public FilterLogic FilterLogic { get; private set; }
+
+    public int Rows {
+      get { return PreProcessingData.Rows; }
+      set { }
+    }
+
+    public int Columns {
+      get { return PreProcessingData.Columns; }
+      set { }
+    }
+
+    public IEnumerable<string> ColumnNames {
+      get { return PreProcessingData.VariableNames; }
+      set { }
+    }
+
+    public IEnumerable<string> RowNames {
+      get { return Enumerable.Range(1, Rows).Select(n => n.ToString()); }
+      set { throw new NotSupportedException(); }
+    }
+
+    public bool SortableView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
+    public bool ReadOnly {
+      get { return false; }
+    }
+
+    public IDictionary<int, IList<int>> Selection {
+      get { return PreProcessingData.Selection; }
+      set { PreProcessingData.Selection = value; }
+    }
+
+    public DataGridContent(ITransactionalPreprocessingData preProcessingData, ManipulationLogic theManipulationLogic, FilterLogic theFilterLogic) {
+      ManipulationLogic = theManipulationLogic;
+      FilterLogic = theFilterLogic;
+      PreProcessingData = preProcessingData;
+    }
+
+    public DataGridContent(DataGridContent dataGridContent, Cloner cloner)
+      : base(dataGridContent, cloner) {
+
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DataGridContent(this, cloner);
+    }
+
+    public void DeleteRows(IEnumerable<int> rows) {
+      PreProcessingData.DeleteRowsWithIndices(rows);
+    }
+
+    public void DeleteColumn(int column) {
+      PreProcessingData.DeleteColumn(column);
+    }
+
+    public bool Validate(string value, out string errorMessage, int columnIndex) {
+      return PreProcessingData.Validate(value, out errorMessage, columnIndex);
+    }
+
+    public string GetValue(int rowIndex, int columnIndex) {
+      return PreProcessingData.GetCellAsString(columnIndex, rowIndex);
+    }
+
+    public bool SetValue(string value, int rowIndex, int columnIndex) {
+      return PreProcessingData.SetValue(value, columnIndex, rowIndex);
+    }
+
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { PreProcessingData.Changed += value; }
+      remove { PreProcessingData.Changed -= value; }
+    }
+
+    #region unused stuff/not implemented but necessary due to IStringConvertibleMatrix
+#pragma warning disable 0067
+    // Is not used since DataGridContentView overrides dataGridView_CellValidating and uses 
+    // DataGridLogic#Validate(string value, out string errorMessage, int columnIndex)
+    public bool Validate(string value, out string errorMessage) {
+      errorMessage = string.Empty;
+      return true;
+    }
+
+    public event EventHandler ColumnsChanged;
+    public event EventHandler RowsChanged;
+    public event EventHandler ColumnNamesChanged;
+    public event EventHandler RowNamesChanged;
+    public event EventHandler SortableViewChanged;
+    public event EventHandler<EventArgs<int, int>> ItemChanged;
+    public event EventHandler Reset;
+#pragma warning restore 0067
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs	(revision 15268)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.DataPreprocessing.Filter;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Filter", "Represents the filter grid.")]
+  public class FilterContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Filter; }
+    }
+
+    public FilterLogic FilterLogic { get; private set; }
+
+    public ICheckedItemCollection<IFilter> Filters { get; private set; }
+
+    public bool IsAndCombination { get; set; }
+
+    public FilterContent(FilterLogic filterLogic) {
+      Filters = new CheckedItemCollection<IFilter>();
+      IsAndCombination = true;
+      FilterLogic = filterLogic;
+    }
+
+    protected FilterContent(FilterContent content, Cloner cloner)
+      : base(content, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FilterContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs	(revision 15268)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Histogram", "Represents the histogram grid.")]
+  public class HistogramContent : PreprocessingChartContent {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Statistics; }
+    }
+
+    public string GroupingVariableName { get; set; }
+
+    public int Bins { get; set; }
+    public bool ExactBins { get; set; }
+
+    public LegendOrder Order { get; set; }
+
+    public HistogramContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+      Bins = 10;
+      ExactBins = false;
+    }
+
+    public HistogramContent(HistogramContent content, Cloner cloner)
+      : base(content, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HistogramContent(this, cloner);
+    }
+
+    public static DataTable CreateHistogram(IFilteredPreprocessingData preprocessingData, string variableName, string groupingVariableName, DataTableVisualProperties.DataTableHistogramAggregation aggregation, LegendOrder legendOrder = LegendOrder.Alphabetically) {
+      var dataTable = new DataTable {
+        VisualProperties = { Title = variableName, HistogramAggregation = aggregation },
+      };
+
+      if (string.IsNullOrEmpty(groupingVariableName)) {
+        var row = PreprocessingChartContent.CreateDataRow(preprocessingData, variableName, DataRowVisualProperties.DataRowChartType.Histogram);
+        row.VisualProperties.IsVisibleInLegend = false;
+        dataTable.Rows.Add(row);
+        return dataTable;
+      }
+
+      int variableIndex = preprocessingData.GetColumnIndex(variableName);
+      var variableValues = preprocessingData.GetValues<double>(variableIndex);
+      int groupVariableIndex = preprocessingData.GetColumnIndex(groupingVariableName);
+      var groupingValues = Enumerable.Empty<string>();
+
+      if (preprocessingData.VariableHasType<double>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<double>(groupVariableIndex).Select(x => x.ToString());
+      } else if (preprocessingData.VariableHasType<string>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<string>(groupVariableIndex);
+      } else if (preprocessingData.VariableHasType<DateTime>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<DateTime>(groupVariableIndex).Select(x => x.ToString());
+      }
+
+      var groups = groupingValues.Zip(variableValues, Tuple.Create).GroupBy(t => t.Item1, t => t.Item2);
+
+      if (legendOrder == LegendOrder.Alphabetically)
+        groups = groups.OrderBy(x => x.Key, new NaturalStringComparer());
+
+      foreach (var group in groups) {
+        var classRow = new DataRow {
+          Name = group.Key,
+          VisualProperties = {
+              ChartType = DataRowVisualProperties.DataRowChartType.Histogram,
+              IsVisibleInLegend = !string.IsNullOrEmpty(groupingVariableName)
+            }
+        };
+        classRow.Values.AddRange(group);
+        dataTable.Rows.Add(classRow);
+      }
+      return dataTable;
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/IViewShortcut.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/IViewShortcut.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/IViewShortcut.cs	(revision 15268)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+  public interface IViewShortcut : IItem {
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs	(revision 15268)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Line Chart", "Represents the line chart grid.")]
+  public class LineChartContent : PreprocessingChartContent {
+    public bool AllInOneMode { get; set; }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    public LineChartContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+      AllInOneMode = true;
+    }
+
+    public LineChartContent(LineChartContent content, Cloner cloner)
+      : base(content, cloner) {
+      this.AllInOneMode = content.AllInOneMode;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LineChartContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs	(revision 15268)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Manipulation", "Represents the available manipulations on a data set.")]
+  public class ManipulationContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
+    }
+
+    public ManipulationLogic ManipulationLogic { get; private set; }
+    public SearchLogic SearchLogic { get; private set; }
+    public FilterLogic FilterLogic { get; private set; }
+
+    public ManipulationContent(ManipulationLogic manipulationLogic, SearchLogic searchLogic, FilterLogic filterLogic) {
+      ManipulationLogic = manipulationLogic;
+      SearchLogic = searchLogic;
+      FilterLogic = filterLogic;
+    }
+
+    public ManipulationContent(ManipulationContent content, Cloner cloner) : base(content, cloner) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ManipulationContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs	(revision 15268)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Multi Scatter Plot", "Represents a multi scatter plot.")]
+  public class MultiScatterPlotContent : ScatterPlotContent {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    public MultiScatterPlotContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+    }
+
+    public MultiScatterPlotContent(MultiScatterPlotContent content, Cloner cloner)
+      : base(content, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiScatterPlotContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs	(revision 15268)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("PreprocessingChart", "Represents a preprocessing chart.")]
+  public class PreprocessingChartContent : Item, IViewShortcut {
+    public enum LegendOrder {
+      Alphabetically,
+      Appearance
+    }
+
+    public static new Image StaticItemImage {
+      get { return VSImageLibrary.PieChart; }
+    }
+
+    private ICheckedItemList<StringValue> variableItemList = null;
+    public ICheckedItemList<StringValue> VariableItemList {
+      get {
+        if (variableItemList == null)
+          variableItemList = CreateVariableItemList(PreprocessingData);
+        return this.variableItemList;
+      }
+    }
+
+    public IFilteredPreprocessingData PreprocessingData { get; private set; }
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { PreprocessingData.Changed += value; }
+      remove { PreprocessingData.Changed -= value; }
+    }
+
+    public PreprocessingChartContent(IFilteredPreprocessingData preprocessingData) {
+      PreprocessingData = preprocessingData;
+    }
+
+    public PreprocessingChartContent(PreprocessingChartContent content, Cloner cloner)
+      : base(content, cloner) {
+      this.PreprocessingData = content.PreprocessingData;
+      this.variableItemList = cloner.Clone<ICheckedItemList<StringValue>>(variableItemList);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreprocessingChartContent(this, cloner);
+    }
+
+    public DataRow CreateDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
+      return CreateDataRow(PreprocessingData, variableName, chartType);
+    }
+
+    public static DataRow CreateDataRow(IFilteredPreprocessingData preprocessingData, string variableName, DataRowVisualProperties.DataRowChartType chartType) {
+      IList<double> values = preprocessingData.GetValues<double>(preprocessingData.GetColumnIndex(variableName));
+      DataRow row = new DataRow(variableName, "", values);
+      row.VisualProperties.ChartType = chartType;
+      return row;
+    }
+
+    private static ICheckedItemList<StringValue> CreateVariableItemList(IPreprocessingData preprocessingData) {
+      ICheckedItemList<StringValue> itemList = new CheckedItemList<StringValue>();
+      foreach (string name in preprocessingData.GetDoubleVariableNames()) {
+        var n = new StringValue(name);
+        bool isInputTarget = preprocessingData.InputVariables.Contains(name) || preprocessingData.TargetVariable == name;
+        itemList.Add(n, isInputTarget);
+      }
+      return new ReadOnlyCheckedItemList<StringValue>(itemList);
+    }
+
+    public static IEnumerable<string> GetVariableNamesForGrouping(IPreprocessingData preprocessingData, int maxDistinctValues = 20) {
+      var variableNames = new List<string>();
+
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        int distinctValues = Int32.MaxValue;
+        if (preprocessingData.VariableHasType<double>(i))
+          distinctValues = preprocessingData.GetValues<double>(i).GroupBy(x => x).Count();
+        else if (preprocessingData.VariableHasType<string>(i))
+          distinctValues = preprocessingData.GetValues<string>(i).GroupBy(x => x).Count();
+        else if (preprocessingData.VariableHasType<DateTime>(i))
+          distinctValues = preprocessingData.GetValues<DateTime>(i).GroupBy(x => x).Count();
+
+        if (distinctValues <= maxDistinctValues)
+          variableNames.Add(preprocessingData.GetVariableName(i));
+      }
+      return variableNames;
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 15268)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Visualization.ChartControlsExtensions;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  public abstract class ScatterPlotContent : PreprocessingChartContent {
+    public string GroupingVariable { get; set; }
+
+    protected ScatterPlotContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+    }
+
+    protected ScatterPlotContent(ScatterPlotContent content, Cloner cloner)
+      : base(content, cloner) {
+    }
+
+    public static ScatterPlot CreateScatterPlot(IFilteredPreprocessingData preprocessingData, string variableNameX, string variableNameY, string variableNameGroup = "-", LegendOrder legendOrder = LegendOrder.Alphabetically) {
+      ScatterPlot scatterPlot = new ScatterPlot();
+
+      IList<double> xValues = preprocessingData.GetValues<double>(preprocessingData.GetColumnIndex(variableNameX));
+      IList<double> yValues = preprocessingData.GetValues<double>(preprocessingData.GetColumnIndex(variableNameY));
+
+      var points = xValues.Zip(yValues, (x, y) => new Point2D<double>(x, y)).ToList();
+      var validPoints = points.Where(p => !double.IsNaN(p.X) && !double.IsNaN(p.Y) && !double.IsInfinity(p.X) && !double.IsInfinity(p.Y)).ToList();
+      if (validPoints.Any()) {
+        try {
+          double axisMin, axisMax, axisInterval;
+          ChartUtil.CalculateOptimalAxisInterval(validPoints.Min(p => p.X), validPoints.Max(p => p.X), out axisMin, out axisMax, out axisInterval);
+          scatterPlot.VisualProperties.XAxisMinimumAuto = false;
+          scatterPlot.VisualProperties.XAxisMaximumAuto = false;
+          scatterPlot.VisualProperties.XAxisMinimumFixedValue = axisMin;
+          scatterPlot.VisualProperties.XAxisMaximumFixedValue = axisMax;
+        } catch (ArgumentOutOfRangeException) { } // error during CalculateOptimalAxisInterval 
+        try {
+          double axisMin, axisMax, axisInterval;
+          ChartUtil.CalculateOptimalAxisInterval(validPoints.Min(p => p.Y), validPoints.Max(p => p.Y), out axisMin, out axisMax, out axisInterval);
+          scatterPlot.VisualProperties.YAxisMinimumAuto = false;
+          scatterPlot.VisualProperties.YAxisMaximumAuto = false;
+          scatterPlot.VisualProperties.YAxisMinimumFixedValue = axisMin;
+          scatterPlot.VisualProperties.YAxisMaximumFixedValue = axisMax;
+        } catch (ArgumentOutOfRangeException) { } // error during CalculateOptimalAxisInterval 
+      }
+
+
+      //No Grouping
+      if (string.IsNullOrEmpty(variableNameGroup) || variableNameGroup == "-") {
+        ScatterPlotDataRow scdr = new ScatterPlotDataRow(variableNameX + " - " + variableNameY, "", validPoints);
+        scdr.VisualProperties.IsVisibleInLegend = false;
+        scatterPlot.Rows.Add(scdr);
+        return scatterPlot;
+      }
+
+      //Grouping
+      int groupVariableIndex = preprocessingData.GetColumnIndex(variableNameGroup);
+      var groupingValues = Enumerable.Empty<string>();
+
+      if (preprocessingData.VariableHasType<double>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<double>(groupVariableIndex).Select(x => x.ToString());
+      } else if (preprocessingData.VariableHasType<string>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<string>(groupVariableIndex);
+      } else if (preprocessingData.VariableHasType<DateTime>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<DateTime>(groupVariableIndex).Select(x => x.ToString());
+      }
+      var groups = groupingValues.Zip(validPoints, Tuple.Create).GroupBy(t => t.Item1, t => t.Item2);
+
+      if (legendOrder == LegendOrder.Alphabetically)
+        groups = groups.OrderBy(x => x.Key, new NaturalStringComparer());
+
+      foreach (var group in groups) {
+        var scdr = new ScatterPlotDataRow {
+          Name = group.Key,
+          VisualProperties = {
+            IsVisibleInLegend = true,
+            PointSize = 6
+          }
+        };
+        scdr.Points.AddRange(group);
+        scatterPlot.Rows.Add(scdr);
+      }
+      return scatterPlot;
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs	(revision 15268)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Scatter Plot", "Represents a scatter plot.")]
+  public class SingleScatterPlotContent : ScatterPlotContent {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    public string SelectedXVariable { get; set; }
+    public string SelectedYVariable { get; set; }
+
+    public SingleScatterPlotContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+    }
+
+    public SingleScatterPlotContent(SingleScatterPlotContent content, Cloner cloner)
+      : base(content, cloner) {
+      this.SelectedXVariable = content.SelectedXVariable;
+      this.SelectedYVariable = content.SelectedYVariable;
+      this.GroupingVariable = content.GroupingVariable;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleScatterPlotContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs	(revision 15268)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Statistics", "Represents the statistics grid.")]
+  public class StatisticsContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
+    }
+
+    public ITransactionalPreprocessingData PreprocessingData { get; private set; }
+    public StatisticsLogic StatisticsLogic { get; private set; }
+
+    public StatisticsContent(ITransactionalPreprocessingData preProcessingData, StatisticsLogic statisticsLogic) {
+      PreprocessingData = preProcessingData;
+      StatisticsLogic = statisticsLogic;
+    }
+
+    public StatisticsContent(StatisticsContent content, Cloner cloner)
+      : base(content, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StatisticsContent(this, cloner);
+    }
+
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { StatisticsLogic.Changed += value; }
+      remove { StatisticsLogic.Changed -= value; }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15268)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Transformation", "Represents the transformation grid.")]
+  public class TransformationContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
+    }
+
+    public IPreprocessingData Data { get; private set; }
+    public FilterLogic FilterLogic { get; private set; }
+
+    public ICheckedItemList<ITransformation> CheckedTransformationList { get; private set; }
+
+    public TransformationContent(IPreprocessingData data, FilterLogic filterLogic) {
+      Data = data;
+      CheckedTransformationList = new CheckedItemList<ITransformation>();
+      FilterLogic = filterLogic;
+    }
+
+    public TransformationContent(TransformationContent original, Cloner cloner)
+      : base(original, cloner) {
+      Data = original.Data;
+      CheckedTransformationList = new CheckedItemList<ITransformation>(original.CheckedTransformationList);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TransformationContent(this, cloner);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/DataPreprocessingChangedEvent.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/DataPreprocessingChangedEvent.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/DataPreprocessingChangedEvent.cs	(revision 15268)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+
+namespace HeuristicLab.DataPreprocessing {
+  public enum DataPreprocessingChangedEventType {
+    DeleteColumn,
+    AddColumn,
+    ChangeColumn,
+    DeleteRow,
+    AddRow,
+    ChangeItem,
+    Any,
+    Transformation
+  }
+
+  public class DataPreprocessingChangedEventArgs : EventArgs {
+    public DataPreprocessingChangedEventType Type { get; private set; }
+    public int Row { get; private set; }
+    public int Column { get; private set; }
+
+    public DataPreprocessingChangedEventArgs(DataPreprocessingChangedEventType type, int column, int row) {
+      Type = type;
+      Column = column;
+      Row = row;
+    }
+  }
+
+  public delegate void DataPreprocessingChangedEventHandler(object sender, DataPreprocessingChangedEventArgs e);
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15268)
@@ -0,0 +1,280 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class FilteredPreprocessingData : NamedItem, IFilteredPreprocessingData {
+    private readonly ITransactionalPreprocessingData originalData;
+    private ITransactionalPreprocessingData filteredData;
+
+    public IntRange TrainingPartition {
+      get { return originalData.TrainingPartition; }
+    }
+
+    public IntRange TestPartition {
+      get { return originalData.TestPartition; }
+    }
+
+    public IList<ITransformation> Transformations {
+      get { return originalData.Transformations; }
+    }
+
+    public IEnumerable<string> VariableNames {
+      get { return ActiveData.VariableNames; }
+    }
+
+    public IList<string> InputVariables { get { return ActiveData.InputVariables; } }
+    public string TargetVariable { get { return ActiveData.TargetVariable; } } // optional
+
+    public IDictionary<int, IList<int>> Selection {
+      get { return originalData.Selection; }
+      set { originalData.Selection = value; }
+    }
+
+    public int Columns {
+      get { return ActiveData.Columns; }
+    }
+
+    public int Rows {
+      get { return ActiveData.Rows; }
+    }
+
+    public ITransactionalPreprocessingData ActiveData {
+      get { return IsFiltered ? filteredData : originalData; }
+    }
+
+    public bool IsUndoAvailable {
+      get { return IsFiltered ? false : originalData.IsUndoAvailable; }
+    }
+
+    public bool IsFiltered {
+      get { return filteredData != null; }
+    }
+
+
+    public FilteredPreprocessingData(ITransactionalPreprocessingData preporcessingData)
+      : base() {
+      originalData = preporcessingData;
+      filteredData = null;
+    }
+
+    protected FilteredPreprocessingData(FilteredPreprocessingData original, Cloner cloner)
+      : base(original, cloner) {
+      originalData = original.originalData;
+      filteredData = original.filteredData;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FilteredPreprocessingData(this, cloner);
+    }
+
+    public T GetCell<T>(int columnIndex, int rowIndex) {
+      return ActiveData.GetCell<T>(columnIndex, rowIndex);
+    }
+
+    public void SetCell<T>(int columnIndex, int rowIndex, T value) {
+      if (IsFiltered)
+        throw new InvalidOperationException("SetValues not possible while data is filtered");
+      originalData.SetCell<T>(columnIndex, rowIndex, value);
+    }
+
+    public string GetCellAsString(int columnIndex, int rowIndex) {
+      return ActiveData.GetCellAsString(columnIndex, rowIndex);
+    }
+
+    public IList<T> GetValues<T>(int columnIndex, bool considerSelection) {
+      return ActiveData.GetValues<T>(columnIndex, considerSelection);
+    }
+
+    public void SetValues<T>(int columnIndex, IList<T> values) {
+      if (IsFiltered)
+        throw new InvalidOperationException("SetValues not possible while data is filtered");
+
+      originalData.SetValues<T>(columnIndex, values);
+    }
+
+    public void InsertRow(int rowIndex) {
+      if (IsFiltered)
+        throw new InvalidOperationException("InsertRow not possible while data is filtered");
+
+      originalData.InsertRow(rowIndex);
+    }
+
+    public void DeleteRow(int rowIndex) {
+      if (IsFiltered)
+        throw new InvalidOperationException("DeleteRow not possible while data is filtered");
+
+      originalData.DeleteRow(rowIndex);
+    }
+
+    public void InsertColumn<T>(string variableName, int columnIndex) {
+      if (IsFiltered)
+        throw new InvalidOperationException("InsertColumn not possible while data is filtered");
+
+      originalData.InsertColumn<T>(variableName, columnIndex);
+    }
+
+    public void DeleteColumn(int columnIndex) {
+      if (IsFiltered)
+        throw new InvalidOperationException("DeleteColumn not possible while data is filtered");
+      originalData.DeleteColumn(columnIndex);
+    }
+
+    public void RenameColumn(int columnIndex, string name) {
+      if (IsFiltered)
+        throw new InvalidOperationException("RenameColumn not possible while data is filtered");
+      originalData.RenameColumn(columnIndex, name);
+    }
+
+    public void RenameColumns(IList<string> names) {
+      if (IsFiltered)
+        throw new InvalidOperationException("RenameColumns not possible while data is filtered");
+      originalData.RenameColumns(names);
+    }
+
+    public string GetVariableName(int columnIndex) {
+      return ActiveData.GetVariableName(columnIndex);
+    }
+
+    public int GetColumnIndex(string variableName) {
+      return ActiveData.GetColumnIndex(variableName);
+    }
+
+    public bool VariableHasType<T>(int columnIndex) {
+      return originalData.VariableHasType<T>(columnIndex);
+    }
+
+    public Dataset ExportToDataset() {
+      return originalData.ExportToDataset();
+    }
+
+    public void SetFilter(bool[] rowFilters) {
+      filteredData = (ITransactionalPreprocessingData)originalData.Clone();
+      filteredData.InTransaction(() => {
+        for (int row = (rowFilters.Length - 1); row >= 0; --row) {
+          if (rowFilters[row]) {
+            filteredData.DeleteRow(row);
+          }
+        }
+      });
+      OnFilterChanged();
+    }
+
+    public void PersistFilter() {
+      originalData.InTransaction(() => {
+        for (int i = 0; i < filteredData.Columns; ++i) {
+          if (filteredData.VariableHasType<double>(i)) {
+            originalData.SetValues<double>(i, filteredData.GetValues<double>(i));
+          } else if (filteredData.VariableHasType<string>(i)) {
+            originalData.SetValues<string>(i, filteredData.GetValues<string>(i));
+          } else if (filteredData.VariableHasType<DateTime>(i)) {
+            originalData.SetValues<DateTime>(i, filteredData.GetValues<DateTime>(i));
+          } else {
+            throw new ArgumentException("Data types of columns do not match");
+          }
+        }
+      });
+      ResetFilter();
+    }
+
+    public void ResetFilter() {
+      filteredData = null;
+      OnFilterChanged();
+    }
+
+    private void OnFilterChanged() {
+      if (FilterChanged != null) {
+        FilterChanged(this, new EventArgs());
+      }
+    }
+
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { originalData.Changed += value; }
+      remove { originalData.Changed -= value; }
+    }
+
+    public bool SetValue(string value, int columnIndex, int rowIndex) {
+      if (IsFiltered)
+        throw new InvalidOperationException("SetValue not possible while data is filtered");
+      return originalData.SetValue(value, columnIndex, rowIndex);
+    }
+
+    public bool AreAllStringColumns(IEnumerable<int> columnIndices) {
+      return originalData.AreAllStringColumns(columnIndices);
+    }
+
+    public void DeleteRowsWithIndices(IEnumerable<int> rows) {
+      if (IsFiltered)
+        throw new InvalidOperationException("DeleteRowsWithIndices not possible while data is filtered");
+
+      originalData.DeleteRowsWithIndices(rows);
+    }
+
+    public void Undo() {
+      if (IsFiltered)
+        throw new InvalidOperationException("Undo not possible while data is filtered");
+
+      originalData.Undo();
+    }
+
+    public void InTransaction(Action action, DataPreprocessingChangedEventType type = DataPreprocessingChangedEventType.Any) {
+      if (IsFiltered)
+        throw new InvalidOperationException("Transaction not possible while data is filtered");
+      originalData.InTransaction(action, type);
+    }
+
+    public void BeginTransaction(DataPreprocessingChangedEventType type) {
+      if (IsFiltered)
+        throw new InvalidOperationException("Transaction not possible while data is filtered");
+      originalData.BeginTransaction(type);
+    }
+
+    public void EndTransaction() {
+      originalData.EndTransaction();
+    }
+
+    public IEnumerable<string> GetDoubleVariableNames() {
+      return originalData.GetDoubleVariableNames();
+    }
+
+    public void ClearSelection() {
+      originalData.ClearSelection();
+    }
+
+    public event EventHandler SelectionChanged {
+      add { originalData.SelectionChanged += value; }
+      remove { originalData.SelectionChanged -= value; }
+    }
+
+    #region IPreprocessingData Members
+    public bool Validate(string value, out string errorMessage, int columnIndex) {
+      return originalData.Validate(value, out errorMessage, columnIndex);
+    }
+
+    public event EventHandler FilterChanged;
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/IFilteredPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/IFilteredPreprocessingData.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/IFilteredPreprocessingData.cs	(revision 15268)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+
+namespace HeuristicLab.DataPreprocessing {
+  public interface IFilteredPreprocessingData : ITransactionalPreprocessingData {
+    void SetFilter(bool[] rowFilters);
+    void PersistFilter();
+    void ResetFilter();
+    bool IsFiltered { get; }
+
+    event EventHandler FilterChanged;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15268)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  public interface IPreprocessingData : INamedItem {
+    T GetCell<T>(int columnIndex, int rowIndex);
+
+    void SetCell<T>(int columnIndex, int rowIndex, T value);
+
+    string GetCellAsString(int columnIndex, int rowIndex);
+
+    IList<T> GetValues<T>(int columnIndex, bool considerSelection = false);
+
+    void SetValues<T>(int columnIndex, IList<T> values);
+    bool SetValue(string value, int columnIndex, int rowIndex);
+
+    void InsertRow(int rowIndex);
+    void DeleteRow(int rowIndex);
+    void DeleteRowsWithIndices(IEnumerable<int> rows);
+    void InsertColumn<T>(string variableName, int columnIndex);
+
+    void DeleteColumn(int columnIndex);
+
+    void RenameColumn(int columnIndex, string name);
+    void RenameColumns(IList<string> names);
+
+    bool AreAllStringColumns(IEnumerable<int> columnIndices);
+    bool Validate(string value, out string errorMessage, int columnIndex);
+
+    IntRange TrainingPartition { get; }
+    IntRange TestPartition { get; }
+
+    IList<ITransformation> Transformations { get; }
+
+    IEnumerable<string> VariableNames { get; }
+    IEnumerable<string> GetDoubleVariableNames();
+    string GetVariableName(int columnIndex);
+    int GetColumnIndex(string variableName);
+
+    bool VariableHasType<T>(int columnIndex);
+
+    IList<string> InputVariables { get; }
+    string TargetVariable { get; } // optional
+
+    int Columns { get; }
+    int Rows { get; }
+
+    Dataset ExportToDataset();
+
+    IDictionary<int, IList<int>> Selection { get; set; }
+    void ClearSelection();
+
+    event EventHandler SelectionChanged;
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/ITransactionalPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/ITransactionalPreprocessingData.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/ITransactionalPreprocessingData.cs	(revision 15268)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+
+namespace HeuristicLab.DataPreprocessing {
+  public interface ITransactionalPreprocessingData : IPreprocessingData {
+    event DataPreprocessingChangedEventHandler Changed;
+
+    bool IsUndoAvailable { get; }
+    void Undo();
+    void InTransaction(Action action, DataPreprocessingChangedEventType type = DataPreprocessingChangedEventType.Any);
+    void BeginTransaction(DataPreprocessingChangedEventType type);
+    void EndTransaction();
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15268)
@@ -0,0 +1,216 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("PreprocessingData", "Represents data used for preprocessing.")]
+  public abstract class PreprocessingData : NamedItem, IPreprocessingData {
+    public IntRange TrainingPartition { get; set; }
+    public IntRange TestPartition { get; set; }
+
+    public IList<ITransformation> Transformations { get; protected set; }
+
+    protected IList<IList> variableValues;
+    protected IList<string> variableNames;
+
+    public IEnumerable<string> VariableNames {
+      get { return variableNames; }
+    }
+
+    public IEnumerable<string> GetDoubleVariableNames() {
+      var doubleVariableNames = new List<string>();
+      for (int i = 0; i < Columns; ++i) {
+        if (VariableHasType<double>(i)) {
+          doubleVariableNames.Add(variableNames[i]);
+        }
+      }
+      return doubleVariableNames;
+    }
+
+    public IList<string> InputVariables { get; private set; }
+    public string TargetVariable { get; private set; } // optional
+
+    public int Columns {
+      get { return variableNames.Count; }
+    }
+
+    public int Rows {
+      get { return variableValues.Count > 0 ? variableValues[0].Count : 0; }
+    }
+
+    protected IDictionary<int, IList<int>> selection;
+    public IDictionary<int, IList<int>> Selection {
+      get { return selection; }
+      set {
+        selection = value;
+        OnSelectionChanged();
+      }
+    }
+
+    protected PreprocessingData(PreprocessingData original, Cloner cloner)
+      : base(original, cloner) {
+      variableValues = CopyVariableValues(original.variableValues);
+      variableNames = new List<string>(original.variableNames);
+      TrainingPartition = (IntRange)original.TrainingPartition.Clone(cloner);
+      TestPartition = (IntRange)original.TestPartition.Clone(cloner);
+      Transformations = new List<ITransformation>(original.Transformations.Select(cloner.Clone));
+
+      InputVariables = new List<string>(original.InputVariables);
+      TargetVariable = original.TargetVariable;
+
+      RegisterEventHandler();
+    }
+
+    protected PreprocessingData(IDataAnalysisProblemData problemData)
+      : base() {
+      Name = "Preprocessing Data";
+
+      Transformations = new List<ITransformation>();
+      selection = new Dictionary<int, IList<int>>();
+
+      Import(problemData);
+
+      RegisterEventHandler();
+    }
+
+    public void Import(IDataAnalysisProblemData problemData) {
+      Dataset dataset = (Dataset)problemData.Dataset;
+      variableNames = new List<string>(problemData.Dataset.VariableNames);
+      InputVariables = new List<string>(problemData.AllowedInputVariables);
+      TargetVariable = (problemData is IRegressionProblemData) ? ((IRegressionProblemData)problemData).TargetVariable
+        : (problemData is IClassificationProblemData) ? ((IClassificationProblemData)problemData).TargetVariable
+        : null;
+
+      int columnIndex = 0;
+      variableValues = new List<IList>();
+      foreach (var variableName in problemData.Dataset.VariableNames) {
+        if (dataset.VariableHasType<double>(variableName)) {
+          variableValues.Insert(columnIndex, dataset.GetDoubleValues(variableName).ToList());
+        } else if (dataset.VariableHasType<string>(variableName)) {
+          variableValues.Insert(columnIndex, dataset.GetStringValues(variableName).ToList());
+        } else if (dataset.VariableHasType<DateTime>(variableName)) {
+          variableValues.Insert(columnIndex, dataset.GetDateTimeValues(variableName).ToList());
+        } else {
+          throw new ArgumentException("The datatype of column " + variableName + " must be of type double, string or DateTime");
+        }
+        ++columnIndex;
+      }
+
+      TrainingPartition = new IntRange(problemData.TrainingPartition.Start, problemData.TrainingPartition.End);
+      TestPartition = new IntRange(problemData.TestPartition.Start, problemData.TestPartition.End);
+    }
+
+    private void RegisterEventHandler() {
+      Changed += (s, e) => {
+        switch (e.Type) {
+          case DataPreprocessingChangedEventType.DeleteRow:
+            CheckPartitionRanges();
+            break;
+          case DataPreprocessingChangedEventType.Any:
+            CheckPartitionRanges();
+            break;
+          case DataPreprocessingChangedEventType.Transformation:
+            CheckPartitionRanges();
+            break;
+        }
+      };
+    }
+
+    private void CheckPartitionRanges() {
+      int maxRowIndex = Math.Max(0, Rows);
+      TrainingPartition.Start = Math.Min(TrainingPartition.Start, maxRowIndex);
+      TrainingPartition.End = Math.Min(TrainingPartition.End, maxRowIndex);
+      TestPartition.Start = Math.Min(TestPartition.Start, maxRowIndex);
+      TestPartition.End = Math.Min(TestPartition.End, maxRowIndex);
+    }
+
+    protected IList<IList> CopyVariableValues(IList<IList> original) {
+      var copy = new List<IList>(original);
+      for (int i = 0; i < original.Count; ++i) {
+        copy[i] = (IList)Activator.CreateInstance(original[i].GetType(), original[i]);
+      }
+      return copy;
+    }
+
+
+    #region IPreprocessingData Members
+    public abstract T GetCell<T>(int columnIndex, int rowIndex);
+
+    public abstract void SetCell<T>(int columnIndex, int rowIndex, T value);
+
+    public abstract string GetCellAsString(int columnIndex, int rowIndex);
+
+    public abstract string GetVariableName(int columnIndex);
+
+    public abstract int GetColumnIndex(string variableName);
+
+    public abstract bool VariableHasType<T>(int columnIndex);
+
+    [Obsolete("use the index based variant, is faster")]
+    public abstract IList<T> GetValues<T>(string variableName, bool considerSelection);
+
+    public abstract IList<T> GetValues<T>(int columnIndex, bool considerSelection);
+
+    public abstract void SetValues<T>(int columnIndex, IList<T> values);
+
+    public abstract bool SetValue(string value, int columnIndex, int rowIndex);
+
+    public abstract bool Validate(string value, out string errorMessage, int columnIndex);
+
+    public abstract bool AreAllStringColumns(IEnumerable<int> columnIndices);
+
+    public abstract void DeleteRowsWithIndices(IEnumerable<int> rows);
+
+    public abstract void InsertRow(int rowIndex);
+
+    public abstract void DeleteRow(int rowIndex);
+
+    public abstract void InsertColumn<T>(string variableName, int columnIndex);
+
+    public abstract void DeleteColumn(int columnIndex);
+
+    public abstract void RenameColumn(int columnIndex, string name);
+    public abstract void RenameColumns(IList<string> list);
+
+    public abstract Dataset ExportToDataset();
+
+    public abstract void ClearSelection();
+
+    public abstract event EventHandler SelectionChanged;
+    protected abstract void OnSelectionChanged();
+
+    public event DataPreprocessingChangedEventHandler Changed;
+    protected virtual void OnChanged(DataPreprocessingChangedEventType type, int column, int row) {
+      var listeners = Changed;
+      if (listeners != null) listeners(this, new DataPreprocessingChangedEventArgs(type, column, row));
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/TransactionalPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/TransactionalPreprocessingData.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/TransactionalPreprocessingData.cs	(revision 15268)
@@ -0,0 +1,382 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("PreprocessingData", "Represents data used for preprocessing.")]
+  public class TransactionalPreprocessingData : PreprocessingData, ITransactionalPreprocessingData {
+    private class Snapshot {
+      public IList<IList> VariableValues { get; set; }
+      public IList<string> VariableNames { get; set; }
+
+      public IntRange TrainingPartition { get; set; }
+      public IntRange TestPartition { get; set; }
+      public IList<ITransformation> Transformations { get; set; }
+      public DataPreprocessingChangedEventType ChangedType { get; set; }
+
+      public int ChangedColumn { get; set; }
+      public int ChangedRow { get; set; }
+    }
+
+    private const int MAX_UNDO_DEPTH = 5;
+
+    private readonly IList<Snapshot> undoHistory = new List<Snapshot>();
+    private readonly Stack<DataPreprocessingChangedEventType> eventStack = new Stack<DataPreprocessingChangedEventType>();
+
+    public bool IsInTransaction { get { return eventStack.Count > 0; } }
+
+    public TransactionalPreprocessingData(IDataAnalysisProblemData problemData)
+      : base(problemData) {
+    }
+
+    protected TransactionalPreprocessingData(TransactionalPreprocessingData original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    private void SaveSnapshot(DataPreprocessingChangedEventType changedType, int column, int row) {
+      if (IsInTransaction) return;
+
+      var currentSnapshot = new Snapshot {
+        VariableValues = CopyVariableValues(variableValues),
+        VariableNames = new List<string>(variableNames),
+        TrainingPartition = new IntRange(TrainingPartition.Start, TrainingPartition.End),
+        TestPartition = new IntRange(TestPartition.Start, TestPartition.End),
+        Transformations = new List<ITransformation>(Transformations),
+        ChangedType = changedType,
+        ChangedColumn = column,
+        ChangedRow = row
+      };
+
+      if (undoHistory.Count >= MAX_UNDO_DEPTH)
+        undoHistory.RemoveAt(0);
+
+      undoHistory.Add(currentSnapshot);
+    }
+
+    #region NamedItem abstract Member Implementations
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TransactionalPreprocessingData(this, cloner);
+    }
+    #endregion
+
+    #region Overridden IPreprocessingData Members
+    public override T GetCell<T>(int columnIndex, int rowIndex) {
+      return (T)variableValues[columnIndex][rowIndex];
+    }
+
+    public override void SetCell<T>(int columnIndex, int rowIndex, T value) {
+      SaveSnapshot(DataPreprocessingChangedEventType.ChangeItem, columnIndex, rowIndex);
+
+      for (int i = Rows; i <= rowIndex; i++)
+        InsertRow(i);
+      for (int i = Columns; i <= columnIndex; i++)
+        InsertColumn<T>(i.ToString(), i);
+
+      variableValues[columnIndex][rowIndex] = value;
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeItem, columnIndex, rowIndex);
+    }
+
+    public override string GetCellAsString(int columnIndex, int rowIndex) {
+      return variableValues[columnIndex][rowIndex].ToString();
+    }
+
+    public override string GetVariableName(int columnIndex) {
+      return variableNames[columnIndex];
+    }
+
+    public override int GetColumnIndex(string variableName) {
+      return variableNames.IndexOf(variableName);
+    }
+
+    public override bool VariableHasType<T>(int columnIndex) {
+      return columnIndex >= variableValues.Count || variableValues[columnIndex] is List<T>;
+    }
+
+    [Obsolete("use the index based variant, is faster")]
+    public override IList<T> GetValues<T>(string variableName, bool considerSelection) {
+      return GetValues<T>(GetColumnIndex(variableName), considerSelection);
+    }
+
+    public override IList<T> GetValues<T>(int columnIndex, bool considerSelection) {
+      if (considerSelection) {
+        var list = new List<T>();
+        foreach (var rowIdx in selection[columnIndex]) {
+          list.Add((T)variableValues[columnIndex][rowIdx]);
+        }
+        return list;
+      } else {
+        return (IList<T>)variableValues[columnIndex];
+      }
+    }
+
+    public override void SetValues<T>(int columnIndex, IList<T> values) {
+      SaveSnapshot(DataPreprocessingChangedEventType.ChangeColumn, columnIndex, -1);
+      if (VariableHasType<T>(columnIndex)) {
+        variableValues[columnIndex] = (IList)values;
+      } else {
+        throw new ArgumentException("The datatype of column " + columnIndex + " must be of type " + variableValues[columnIndex].GetType().Name + " but was " + typeof(T).Name);
+      }
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeColumn, columnIndex, -1);
+    }
+
+    public override bool SetValue(string value, int columnIndex, int rowIndex) {
+      bool valid = false;
+      if (VariableHasType<double>(columnIndex)) {
+        double val;
+        valid = double.TryParse(value, out val);
+        SetValueIfValid(columnIndex, rowIndex, valid, val);
+      } else if (VariableHasType<string>(columnIndex)) {
+        valid = value != null;
+        SetValueIfValid(columnIndex, rowIndex, valid, value);
+      } else if (VariableHasType<DateTime>(columnIndex)) {
+        DateTime date;
+        valid = DateTime.TryParse(value, out date);
+        SetValueIfValid(columnIndex, rowIndex, valid, date);
+      } else {
+        throw new ArgumentException("column " + columnIndex + " contains a non supported type.");
+      }
+
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeColumn, columnIndex, -1);
+
+      return valid;
+    }
+
+    public override bool Validate(string value, out string errorMessage, int columnIndex) {
+      if (columnIndex < 0 || columnIndex > VariableNames.Count()) {
+        throw new ArgumentOutOfRangeException("column index is out of range");
+      }
+
+      bool valid = false;
+      errorMessage = string.Empty;
+      if (VariableHasType<double>(columnIndex)) {
+        double val;
+        valid = double.TryParse(value, out val);
+        if (!valid) {
+          errorMessage = "Invalid Value (Valid Value Format: \"" + FormatPatterns.GetDoubleFormatPattern() + "\")";
+        }
+      } else if (VariableHasType<string>(columnIndex)) {
+        valid = value != null;
+        if (!valid) {
+          errorMessage = "Invalid Value (string must not be null)";
+        }
+      } else if (VariableHasType<DateTime>(columnIndex)) {
+        DateTime date;
+        valid = DateTime.TryParse(value, out date);
+        if (!valid) {
+          errorMessage = "Invalid Value (Valid Value Format: \"" + CultureInfo.CurrentCulture.DateTimeFormat + "\"";
+        }
+      } else {
+        throw new ArgumentException("column " + columnIndex + " contains a non supported type.");
+      }
+
+      return valid;
+    }
+
+    private void SetValueIfValid<T>(int columnIndex, int rowIndex, bool valid, T value) {
+      if (valid)
+        SetCell<T>(columnIndex, rowIndex, value);
+    }
+
+    public override bool AreAllStringColumns(IEnumerable<int> columnIndices) {
+      return columnIndices.All(x => VariableHasType<string>(x));
+    }
+
+    public override void InsertRow(int rowIndex) {
+      SaveSnapshot(DataPreprocessingChangedEventType.DeleteRow, -1, rowIndex);
+      foreach (IList column in variableValues) {
+        Type type = column.GetType().GetGenericArguments()[0];
+        column.Insert(rowIndex, type.IsValueType ? Activator.CreateInstance(type) : null);
+      }
+      if (TrainingPartition.Start <= rowIndex && rowIndex <= TrainingPartition.End) {
+        TrainingPartition.End++;
+        if (TrainingPartition.End <= TestPartition.Start) {
+          TestPartition.Start++;
+          TestPartition.End++;
+        }
+      } else if (TestPartition.Start <= rowIndex && rowIndex <= TestPartition.End) {
+        TestPartition.End++;
+        if (TestPartition.End <= TrainingPartition.Start) {
+          TestPartition.Start++;
+          TestPartition.End++;
+        }
+      }
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.AddRow, -1, rowIndex);
+    }
+    public override void DeleteRow(int rowIndex) {
+      SaveSnapshot(DataPreprocessingChangedEventType.AddRow, -1, rowIndex);
+      foreach (IList column in variableValues) {
+        column.RemoveAt(rowIndex);
+      }
+      if (TrainingPartition.Start <= rowIndex && rowIndex <= TrainingPartition.End) {
+        TrainingPartition.End--;
+        if (TrainingPartition.End <= TestPartition.Start) {
+          TestPartition.Start--;
+          TestPartition.End--;
+        }
+      } else if (TestPartition.Start <= rowIndex && rowIndex <= TestPartition.End) {
+        TestPartition.End--;
+        if (TestPartition.End <= TrainingPartition.Start) {
+          TestPartition.Start--;
+          TestPartition.End--;
+        }
+      }
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.DeleteRow, -1, rowIndex);
+    }
+    public override void DeleteRowsWithIndices(IEnumerable<int> rows) {
+      SaveSnapshot(DataPreprocessingChangedEventType.AddRow, -1, -1);
+      foreach (int rowIndex in rows.OrderByDescending(x => x)) {
+        foreach (IList column in variableValues) {
+          column.RemoveAt(rowIndex);
+        }
+        if (TrainingPartition.Start <= rowIndex && rowIndex <= TrainingPartition.End) {
+          TrainingPartition.End--;
+          if (TrainingPartition.End <= TestPartition.Start) {
+            TestPartition.Start--;
+            TestPartition.End--;
+          }
+        } else if (TestPartition.Start <= rowIndex && rowIndex <= TestPartition.End) {
+          TestPartition.End--;
+          if (TestPartition.End <= TrainingPartition.Start) {
+            TestPartition.Start--;
+            TestPartition.End--;
+          }
+        }
+      }
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.DeleteRow, -1, -1);
+    }
+
+    public override void InsertColumn<T>(string variableName, int columnIndex) {
+      SaveSnapshot(DataPreprocessingChangedEventType.DeleteColumn, columnIndex, -1);
+      variableValues.Insert(columnIndex, new List<T>(Enumerable.Repeat(default(T), Rows)));
+      variableNames.Insert(columnIndex, variableName);
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.AddColumn, columnIndex, -1);
+    }
+
+    public override void DeleteColumn(int columnIndex) {
+      SaveSnapshot(DataPreprocessingChangedEventType.AddColumn, columnIndex, -1);
+      variableValues.RemoveAt(columnIndex);
+      variableNames.RemoveAt(columnIndex);
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.DeleteColumn, columnIndex, -1);
+    }
+
+    public override void RenameColumn(int columnIndex, string name) {
+      SaveSnapshot(DataPreprocessingChangedEventType.ChangeColumn, columnIndex, -1);
+      if (columnIndex < 0 || columnIndex > variableNames.Count)
+        throw new ArgumentOutOfRangeException("columnIndex");
+      variableNames[columnIndex] = name;
+
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeColumn, -1, -1);
+    }
+
+    public override void RenameColumns(IList<string> names) {
+      if (names == null) throw new ArgumentNullException("names");
+      if (names.Count != variableNames.Count) throw new ArgumentException("number of names must match the number of columns.", "names");
+
+      SaveSnapshot(DataPreprocessingChangedEventType.ChangeColumn, -1, -1);
+      for (int i = 0; i < names.Count; i++)
+        variableNames[i] = names[i];
+
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeColumn, -1, -1);
+    }
+
+    public override Dataset ExportToDataset() {
+      IList<IList> values = new List<IList>();
+
+      for (int i = 0; i < Columns; ++i) {
+        values.Add(variableValues[i]);
+      }
+
+      var dataset = new Dataset(variableNames, values);
+      return dataset;
+    }
+
+    public override void ClearSelection() {
+      Selection = new Dictionary<int, IList<int>>();
+    }
+
+    public override event EventHandler SelectionChanged;
+
+    protected override void OnSelectionChanged() {
+      var listeners = SelectionChanged;
+      if (listeners != null) listeners(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region TransactionalPreprocessingData members
+    public bool IsUndoAvailable {
+      get { return undoHistory.Count > 0; }
+    }
+
+    public void Undo() {
+      if (IsUndoAvailable) {
+        Snapshot previousSnapshot = undoHistory[undoHistory.Count - 1];
+        variableValues = previousSnapshot.VariableValues;
+        variableNames = previousSnapshot.VariableNames;
+        TrainingPartition = previousSnapshot.TrainingPartition;
+        TestPartition = previousSnapshot.TestPartition;
+        Transformations = previousSnapshot.Transformations;
+        undoHistory.Remove(previousSnapshot);
+        OnChanged(previousSnapshot.ChangedType,
+          previousSnapshot.ChangedColumn,
+          previousSnapshot.ChangedRow);
+      }
+    }
+
+    public void InTransaction(Action action, DataPreprocessingChangedEventType type = DataPreprocessingChangedEventType.Any) {
+      BeginTransaction(type);
+      action();
+      EndTransaction();
+    }
+
+    public void BeginTransaction(DataPreprocessingChangedEventType type) {
+      SaveSnapshot(type, -1, -1);
+      eventStack.Push(type);
+    }
+
+    public void EndTransaction() {
+      if (eventStack.Count == 0)
+        throw new InvalidOperationException("There is no open transaction that can be ended.");
+
+      var @event = eventStack.Pop();
+      OnChanged(@event, -1, -1);
+    }
+    #endregion
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15268)
@@ -0,0 +1,181 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{3B90F866-70F8-43EF-A541-51819D255B7B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.DataPreprocessing</RootNamespace>
+    <AssemblyName>HeuristicLab.DataPreprocessing-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <PlatformTarget>x64</PlatformTarget>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <PlatformTarget>x64</PlatformTarget>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <Optimize>true</Optimize>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Content\MultiScatterPlotContent.cs" />
+    <Compile Include="Content\SingleScatterPlotContent.cs" />
+    <Compile Include="Content\ScatterPlotContent.cs" />
+    <Compile Include="Content\DataCompletenessChartContent.cs" />
+    <Compile Include="Data\FilteredPreprocessingData.cs" />
+    <Compile Include="Content\ManipulationContent.cs" />
+    <Compile Include="Content\PreprocessingChartContent.cs" />
+    <Compile Include="Data\PreprocessingData.cs" />
+    <Compile Include="Data\IFilteredPreprocessingData.cs" />
+    <Compile Include="Content\CorrelationMatrixContent.cs" />
+    <Compile Include="PreprocessingTransformator.cs" />
+    <Compile Include="Data\DataPreprocessingChangedEvent.cs" />
+    <Compile Include="Logic\Filter\ComparisonFilter.cs" />
+    <Compile Include="Logic\Filter\IFilter.cs" />
+    <Compile Include="Logic\ManipulationLogic.cs" />
+    <Compile Include="Data\IPreprocessingData.cs" />
+    <Compile Include="Content\FilterContent.cs" />
+    <Compile Include="Logic\FilterLogic.cs" />
+    <Compile Include="Content\HistogramContent.cs" />
+    <Compile Include="Content\LineChartContent.cs" />
+    <Compile Include="Content\StatisticsContent.cs" />
+    <Compile Include="Content\TransformationContent.cs" />
+    <Compile Include="Content\IViewShortcut.cs" />
+    <Compile Include="ProblemDataCreator.cs" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Content\DataGridContent.cs" />
+    <Compile Include="PreprocessingContext.cs" />
+    <Compile Include="Data\TransactionalPreprocessingData.cs" />
+    <Compile Include="Logic\SearchLogic.cs" />
+    <Compile Include="Logic\StatisticsLogic.cs" />
+    <Compile Include="Data\ITransactionalPreprocessingData.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <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>
+  <!-- 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>
+  -->
+</Project>
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/ComparisonFilter.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/ComparisonFilter.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/ComparisonFilter.cs	(revision 15268)
@@ -0,0 +1,139 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.DataPreprocessing.Filter {
+  [Item("ComparisonFilter", "A filter which compares the member of the preprocessing data with the constraint data.")]
+  public class ComparisonFilter : ComparisonConstraint, IFilter {
+    public override string ItemName {
+      get { return "ComparisonFilter"; }
+    }
+
+    public override Image ItemImage {
+      get { return VSImageLibrary.Filter; }
+    }
+
+    public new IPreprocessingData ConstrainedValue {
+      get { return (IPreprocessingData)base.ConstrainedValue; }
+      set { base.ConstrainedValue = value; }
+    }
+
+    public new IStringConvertibleValue ConstraintData {
+      get { return (IStringConvertibleValue)base.ConstraintData; }
+      set {
+        if (!(value is IComparable))
+          throw new ArgumentException("Only IComparables allowed for ConstraintData");
+        base.ConstraintData = value;
+      }
+    }
+
+    public ComparisonFilter() : base() { }
+    protected ComparisonFilter(bool deserializing) : base(deserializing) { }
+
+    public ComparisonFilter(IPreprocessingData constrainedValue, ConstraintOperation constraintOperation, object constraintData)
+      : base(constrainedValue, constraintOperation, constraintData) {
+    }
+
+    public ComparisonFilter(IPreprocessingData constrainedValue, ConstraintOperation constraintOperation, object constraintData, bool active)
+      : base(constrainedValue, constraintOperation, constraintData, active) {
+    }
+
+    protected ComparisonFilter(ComparisonFilter original, Cloner cloner)
+      : base(original, cloner) {
+      constraintColumn = original.constraintColumn;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ComparisonFilter(this, cloner);
+    }
+
+    private int constraintColumn;
+    public int ConstraintColumn {
+      get { return constraintColumn; }
+      set {
+        if (ConstrainedValue.Columns < value)
+          throw new ArgumentException("Could not set ConstraintData to not existing column index.");
+
+        if (constraintColumn != value) {
+          constraintColumn = value;
+          this.OnConstraintColumnChanged();
+          this.OnToStringChanged();
+        }
+      }
+    }
+
+    public new bool[] Check() {
+      bool[] result = new bool[ConstrainedValue.Rows];
+
+      if (!Active)
+        return result;
+
+      for (int row = 0; row < ConstrainedValue.Rows; ++row) {
+        object item = null;
+        if (ConstrainedValue.VariableHasType<double>(constraintColumn)) {
+          item = new HeuristicLab.Data.DoubleValue(ConstrainedValue.GetCell<double>(ConstraintColumn, row));
+        } else if (ConstrainedValue.VariableHasType<DateTime>(constraintColumn)) {
+          item = new HeuristicLab.Data.DateTimeValue(ConstrainedValue.GetCell<DateTime>(ConstraintColumn, row));
+        } else {
+          item = new StringValue(ConstrainedValue.GetCell<string>(ConstraintColumn, row));
+        }
+
+        result[row] = !base.Check(item);
+      }
+
+      return result;
+    }
+
+    public new bool[] Check(out string errorMessage) {
+      errorMessage = string.Empty;
+      return this.Check();
+    }
+
+    public override string ToString() {
+      string s = string.Empty;
+      if (ConstrainedValue != null)
+        s += ConstrainedValue.GetVariableName(ConstraintColumn) + " ";
+
+      if (ConstraintOperation != null)
+        s += ConstraintOperation.ToString() + " ";
+
+      if (ConstraintData != null)
+        s += ConstraintData.ToString();
+      else
+        s += "null";
+
+      s += ".";
+      return s;
+    }
+
+    public event EventHandler ConstraintColumnChanged;
+    protected virtual void OnConstraintColumnChanged() {
+      EventHandler handler = ConstraintColumnChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/IFilter.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/IFilter.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/IFilter.cs	(revision 15268)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Core;
+
+namespace HeuristicLab.DataPreprocessing.Filter {
+  public interface IFilter : IConstraint {
+    new bool[] Check();
+    new bool[] Check(out string errorMessage);
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs	(revision 15268)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing.Filter;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class FilterLogic {
+    public IFilteredPreprocessingData PreprocessingData { get; private set; }
+
+    public bool IsFiltered {
+      get { return PreprocessingData.IsFiltered; }
+    }
+
+    public FilterLogic(IFilteredPreprocessingData preprocessingData) {
+      PreprocessingData = preprocessingData;
+    }
+
+    public bool[] GetFilterResult(IList<IFilter> filters, bool isAndCombination) {
+      IList<IFilter> activeFilters = filters.Where(f => f.Active && f.ConstraintData != null).ToList<IFilter>();
+
+      if (activeFilters.Count == 0) {
+        return CreateBoolArray(PreprocessingData.Rows, false);
+      }
+      return GetActiveFilterResult(activeFilters, isAndCombination);
+    }
+
+    private bool[] GetActiveFilterResult(IList<IFilter> activeFilters, bool isAndCombination) {
+      bool[] result = CreateBoolArray(PreprocessingData.Rows, !isAndCombination);
+
+      foreach (IFilter filter in activeFilters) {
+        bool[] filterResult = filter.Check();
+        for (int row = 0; row < result.Length; ++row) {
+          result[row] = Result(result[row], filterResult[row], isAndCombination);
+        }
+      }
+      return result;
+    }
+
+    public bool[] Preview(IList<IFilter> filters, bool isAndCombination) {
+      IList<IFilter> activeFilters = filters.Where(f => f.Active && f.ConstraintData != null).ToList<IFilter>();
+      if (activeFilters.Count > 0) {
+        var result = GetActiveFilterResult(activeFilters, isAndCombination);
+        PreprocessingData.SetFilter(result);
+        return result;
+      } else {
+        return CreateBoolArray(PreprocessingData.Rows, false);
+      }
+    }
+
+    public bool[] CreateBoolArray(int rows, bool value) {
+      return Enumerable.Repeat<bool>(value, rows).ToArray();
+    }
+
+    public bool Result(bool current, bool addition, bool isAndCombination) {
+      return isAndCombination ? current || addition : current && addition;
+    }
+
+    public void Apply(IList<IFilter> filters, bool isAndCombination) {
+      PreprocessingData.PersistFilter();
+      Reset();
+    }
+
+    public void Reset() {
+      PreprocessingData.ResetFilter();
+    }
+
+    public event EventHandler FilterChanged {
+      add { PreprocessingData.FilterChanged += value; }
+      remove { PreprocessingData.FilterChanged -= value; }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs	(revision 15268)
@@ -0,0 +1,355 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class ManipulationLogic {
+    private readonly ITransactionalPreprocessingData preprocessingData;
+    private readonly StatisticsLogic statisticsLogic;
+    private readonly SearchLogic searchLogic;
+
+    public IEnumerable<string> VariableNames {
+      get { return preprocessingData.VariableNames; }
+    }
+
+    public ITransactionalPreprocessingData PreProcessingData {
+      get { return preprocessingData; }
+    }
+
+    public ManipulationLogic(ITransactionalPreprocessingData preprocessingData, SearchLogic theSearchLogic, StatisticsLogic theStatisticsLogic) {
+      this.preprocessingData = preprocessingData;
+      searchLogic = theSearchLogic;
+      statisticsLogic = theStatisticsLogic;
+    }
+
+    public void ReplaceIndicesByValue<T>(int columnIndex, IEnumerable<int> rowIndices, T value) {
+      foreach (int index in rowIndices) {
+        preprocessingData.SetCell<T>(columnIndex, index, value);
+      }
+    }
+
+    public void ReplaceIndicesByAverageValue(IDictionary<int, IList<int>> cells, bool considerSelection = false) {
+      preprocessingData.InTransaction(() => {
+        foreach (var column in cells) {
+          if (preprocessingData.VariableHasType<double>(column.Key)) {
+            double average = statisticsLogic.GetAverage(column.Key, considerSelection);
+            ReplaceIndicesByValue<double>(column.Key, column.Value, average);
+          } else if (preprocessingData.VariableHasType<DateTime>(column.Key)) {
+            DateTime average = statisticsLogic.GetAverageDateTime(column.Key, considerSelection);
+            ReplaceIndicesByValue<DateTime>(column.Key, column.Value, average);
+          }
+        }
+      });
+    }
+
+    public void ReplaceIndicesByMedianValue(IDictionary<int, IList<int>> cells, bool considerSelection = false) {
+      preprocessingData.InTransaction(() => {
+        foreach (var column in cells) {
+          if (preprocessingData.VariableHasType<double>(column.Key)) {
+            double median = statisticsLogic.GetMedian(column.Key, considerSelection);
+            ReplaceIndicesByValue<double>(column.Key, column.Value, median);
+          } else if (preprocessingData.VariableHasType<DateTime>(column.Key)) {
+            DateTime median = statisticsLogic.GetMedianDateTime(column.Key, considerSelection);
+            ReplaceIndicesByValue<DateTime>(column.Key, column.Value, median);
+          }
+        }
+      });
+    }
+
+    public void ReplaceIndicesByRandomValue(IDictionary<int, IList<int>> cells, bool considerSelection = false) {
+      preprocessingData.InTransaction(() => {
+        System.Random r = new System.Random();
+
+        foreach (var column in cells) {
+          if (preprocessingData.VariableHasType<double>(column.Key)) {
+            double max = statisticsLogic.GetMax<double>(column.Key, double.NaN, considerSelection);
+            double min = statisticsLogic.GetMin<double>(column.Key, double.NaN, considerSelection);
+            double randMultiplier = (max - min);
+            foreach (int index in column.Value) {
+              double rand = r.NextDouble() * randMultiplier + min;
+              preprocessingData.SetCell<double>(column.Key, index, rand);
+            }
+          } else if (preprocessingData.VariableHasType<DateTime>(column.Key)) {
+            DateTime min = statisticsLogic.GetMin<DateTime>(column.Key, DateTime.MinValue, considerSelection);
+            DateTime max = statisticsLogic.GetMax<DateTime>(column.Key, DateTime.MinValue, considerSelection);
+            double randMultiplier = (max - min).TotalSeconds;
+            foreach (int index in column.Value) {
+              double rand = r.NextDouble() * randMultiplier;
+              preprocessingData.SetCell<DateTime>(column.Key, index, min.AddSeconds(rand));
+            }
+          }
+        }
+      });
+    }
+
+    public void ReplaceIndicesByLinearInterpolationOfNeighbours(IDictionary<int, IList<int>> cells) {
+      preprocessingData.InTransaction(() => {
+        foreach (var column in cells) {
+          IList<Tuple<int, int>> startEndings = GetStartAndEndingsForInterpolation(column);
+          foreach (var tuple in startEndings) {
+            Interpolate(column, tuple.Item1, tuple.Item2);
+          }
+        }
+      });
+    }
+
+    private List<Tuple<int, int>> GetStartAndEndingsForInterpolation(KeyValuePair<int, IList<int>> column) {
+      List<Tuple<int, int>> startEndings = new List<Tuple<int, int>>();
+      var rowIndices = column.Value;
+      rowIndices = rowIndices.OrderBy(x => x).ToList();
+      var count = rowIndices.Count;
+      int start = int.MinValue;
+      for (int i = 0; i < count; ++i) {
+        if (start == int.MinValue) {
+          start = indexOfPrevPresentValue(column.Key, rowIndices[i]);
+        }
+        if (i + 1 == count || (i + 1 < count && rowIndices[i + 1] - rowIndices[i] > 1)) {
+          int next = indexOfNextPresentValue(column.Key, rowIndices[i]);
+          if (start > 0 && next < preprocessingData.Rows) {
+            startEndings.Add(new Tuple<int, int>(start, next));
+          }
+          start = int.MinValue;
+        }
+      }
+      return startEndings;
+    }
+
+    public void ReplaceIndicesBySmoothing(IDictionary<int, IList<int>> cells) {
+      preprocessingData.InTransaction(() => {
+        foreach (var column in cells) {
+          int countValues = preprocessingData.Rows;
+
+          foreach (int index in column.Value) {
+            // dont replace first or last values
+            if (index > 0 && index < countValues) {
+              int prevIndex = indexOfPrevPresentValue(column.Key, index);
+              int nextIndex = indexOfNextPresentValue(column.Key, index);
+
+              // no neighbours found
+              if (prevIndex < 0 || nextIndex >= countValues) {
+                continue;
+              }
+
+              Interpolate(column, prevIndex, nextIndex);
+            }
+          }
+        }
+      });
+    }
+
+    private void Interpolate(KeyValuePair<int, IList<int>> column, int prevIndex, int nextIndex) {
+      int valuesToInterpolate = nextIndex - prevIndex;
+
+      if (preprocessingData.VariableHasType<double>(column.Key)) {
+        double prev = preprocessingData.GetCell<double>(column.Key, prevIndex);
+        double next = preprocessingData.GetCell<double>(column.Key, nextIndex);
+        double interpolationStep = (next - prev) / valuesToInterpolate;
+
+        for (int i = prevIndex; i < nextIndex; ++i) {
+          double interpolated = prev + (interpolationStep * (i - prevIndex));
+          preprocessingData.SetCell<double>(column.Key, i, interpolated);
+        }
+      } else if (preprocessingData.VariableHasType<DateTime>(column.Key)) {
+        DateTime prev = preprocessingData.GetCell<DateTime>(column.Key, prevIndex);
+        DateTime next = preprocessingData.GetCell<DateTime>(column.Key, nextIndex);
+        double interpolationStep = (next - prev).TotalSeconds / valuesToInterpolate;
+
+        for (int i = prevIndex; i < nextIndex; ++i) {
+          DateTime interpolated = prev.AddSeconds(interpolationStep * (i - prevIndex));
+          preprocessingData.SetCell<DateTime>(column.Key, i, interpolated);
+        }
+      }
+    }
+
+    private int indexOfPrevPresentValue(int columnIndex, int start) {
+      int offset = start - 1;
+      while (offset >= 0 && searchLogic.IsMissingValue(columnIndex, offset)) {
+        offset--;
+      }
+
+      return offset;
+    }
+
+    private int indexOfNextPresentValue(int columnIndex, int start) {
+      int offset = start + 1;
+      while (offset < preprocessingData.Rows && searchLogic.IsMissingValue(columnIndex, offset)) {
+        offset++;
+      }
+
+      return offset;
+    }
+
+    public void ReplaceIndicesByMostCommonValue(IDictionary<int, IList<int>> cells, bool considerSelection = false) {
+      preprocessingData.InTransaction(() => {
+        foreach (var column in cells) {
+          if (preprocessingData.VariableHasType<double>(column.Key)) {
+            ReplaceIndicesByValue<double>(column.Key, column.Value, statisticsLogic.GetMostCommonValue<double>(column.Key, double.NaN, considerSelection));
+          } else if (preprocessingData.VariableHasType<string>(column.Key)) {
+            ReplaceIndicesByValue<string>(column.Key, column.Value, statisticsLogic.GetMostCommonValue<string>(column.Key, string.Empty, considerSelection));
+          } else if (preprocessingData.VariableHasType<DateTime>(column.Key)) {
+            ReplaceIndicesByValue<DateTime>(column.Key, column.Value, statisticsLogic.GetMostCommonValue<DateTime>(column.Key, DateTime.MinValue, considerSelection));
+          } else {
+            throw new ArgumentException("column with index: " + column.Key + " contains a non supported type.");
+          }
+        }
+      });
+    }
+
+    public void Shuffle(bool shuffleRangesSeparately) {
+      var random = new FastRandom();
+
+      if (shuffleRangesSeparately) {
+        var ranges = new[] { preprocessingData.TestPartition, preprocessingData.TrainingPartition };
+        preprocessingData.InTransaction(() => {
+          // process all given ranges - e.g. TrainingPartition, TestPartition
+          foreach (IntRange range in ranges) {
+            var indices = Enumerable.Range(0, preprocessingData.Rows).ToArray();
+            var shuffledIndices = Enumerable.Range(range.Start, range.Size).Shuffle(random).ToArray();
+            for (int i = range.Start, j = 0; i < range.End; i++, j++)
+              indices[i] = shuffledIndices[j];
+
+            ReOrderToIndices(indices);
+          }
+        });
+
+      } else {
+        preprocessingData.InTransaction(() => {
+          var indices = Enumerable.Range(0, preprocessingData.Rows);
+          var shuffledIndices = indices.Shuffle(random).ToArray();
+          ReOrderToIndices(shuffledIndices);
+        });
+      }
+    }
+
+    public void ReOrderToIndices(int[] indices) {
+      preprocessingData.InTransaction(() => {
+        for (int i = 0; i < preprocessingData.Columns; ++i) {
+          if (preprocessingData.VariableHasType<double>(i)) {
+            ReOrderToIndices<double>(i, indices);
+          } else if (preprocessingData.VariableHasType<string>(i)) {
+            ReOrderToIndices<string>(i, indices);
+          } else if (preprocessingData.VariableHasType<DateTime>(i)) {
+            ReOrderToIndices<DateTime>(i, indices);
+          }
+        }
+      });
+    }
+
+    private void ReOrderToIndices<T>(int columnIndex, int[] indices) {
+      List<T> originalData = new List<T>(preprocessingData.GetValues<T>(columnIndex));
+      if (indices.Length != originalData.Count) throw new InvalidOperationException("The number of provided indices does not match the values.");
+
+      for (int i = 0; i < indices.Length; i++) {
+        int originalIndex = i;
+        int replaceIndex = indices[i];
+
+        T replaceValue = originalData.ElementAt<T>(replaceIndex);
+        preprocessingData.SetCell<T>(columnIndex, originalIndex, replaceValue);
+      }
+    }
+
+    public void ReplaceIndicesByValue(IDictionary<int, IList<int>> cells, string value) {
+      preprocessingData.InTransaction(() => {
+        foreach (var column in cells) {
+          foreach (var rowIdx in column.Value) {
+            preprocessingData.SetValue(value, column.Key, rowIdx);
+          }
+        }
+      });
+    }
+
+
+    public List<int> RowsWithMissingValuesGreater(double percent) {
+      List<int> rows = new List<int>();
+
+      for (int i = 0; i < preprocessingData.Rows; ++i) {
+        int missingCount = statisticsLogic.GetRowMissingValueCount(i);
+        if (100f / preprocessingData.Columns * missingCount > percent) {
+          rows.Add(i);
+        }
+      }
+
+      return rows;
+    }
+
+    public List<int> ColumnsWithMissingValuesGreater(double percent) {
+      List<int> columns = new List<int>();
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        int missingCount = statisticsLogic.GetMissingValueCount(i);
+        if (100f / preprocessingData.Rows * missingCount > percent) {
+          columns.Add(i);
+        }
+      }
+
+      return columns;
+    }
+
+    public List<int> ColumnsWithVarianceSmaller(double variance) {
+      List<int> columns = new List<int>();
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        if (preprocessingData.VariableHasType<double>(i) || preprocessingData.VariableHasType<DateTime>(i)) {
+          double columnVariance = statisticsLogic.GetVariance(i);
+          if (columnVariance < variance) {
+            columns.Add(i);
+          }
+        }
+      }
+      return columns;
+    }
+
+    public void DeleteRowsWithMissingValuesGreater(double percent) {
+      DeleteRows(RowsWithMissingValuesGreater(percent));
+    }
+
+    public void DeleteColumnsWithMissingValuesGreater(double percent) {
+      DeleteColumns(ColumnsWithMissingValuesGreater(percent));
+    }
+
+    public void DeleteColumnsWithVarianceSmaller(double variance) {
+      DeleteColumns(ColumnsWithVarianceSmaller(variance));
+    }
+
+    private void DeleteRows(List<int> rows) {
+      rows.Sort();
+      rows.Reverse();
+      preprocessingData.InTransaction(() => {
+        foreach (int row in rows) {
+          preprocessingData.DeleteRow(row);
+        }
+      });
+    }
+
+    private void DeleteColumns(List<int> columns) {
+      columns.Sort();
+      columns.Reverse();
+      preprocessingData.InTransaction(() => {
+        foreach (int column in columns) {
+          preprocessingData.DeleteColumn(column);
+        }
+      });
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/SearchLogic.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/SearchLogic.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/SearchLogic.cs	(revision 15268)
@@ -0,0 +1,166 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using System.Collections.Generic;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class SearchLogic {
+    private readonly ITransactionalPreprocessingData preprocessingData;
+    private readonly FilterLogic filterLogic;
+
+    private Dictionary<int, IList<int>> MissingValueIndicies { get; set; }
+    private Dictionary<int, IList> ValuesWithoutNaN { get; set; }
+
+    public IEnumerable<string> VariableNames {
+      get { return preprocessingData.VariableNames; }
+    }
+
+    public int Columns {
+      get { return preprocessingData.Columns; }
+    }
+
+    public int Rows {
+      get { return preprocessingData.Rows; }
+    }
+
+    public SearchLogic(ITransactionalPreprocessingData thePreprocessingData, FilterLogic theFilterLogic) {
+      preprocessingData = thePreprocessingData;
+      filterLogic = theFilterLogic;
+
+      MissingValueIndicies = new Dictionary<int, IList<int>>();
+      ValuesWithoutNaN = new Dictionary<int, IList>();
+
+      preprocessingData.Changed += PreprocessingData_Changed;
+      filterLogic.FilterChanged += FilterLogic_FilterChanged;
+    }
+
+    void FilterLogic_FilterChanged(object sender, EventArgs e) {
+      //recalculate
+      for (int i = 0; i < Columns; i++) {
+        MissingValueIndicies.Remove(i);
+        ValuesWithoutNaN.Remove(i);
+      }
+    }
+
+    void PreprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      switch (e.Type) {
+        case DataPreprocessingChangedEventType.DeleteColumn:
+        case DataPreprocessingChangedEventType.ChangeColumn:
+          MissingValueIndicies.Remove(e.Column);
+          ValuesWithoutNaN.Remove(e.Column);
+          break;
+        case DataPreprocessingChangedEventType.AddColumn:
+          //cache does not need to be updated, will be calculated the first time it is requested
+          break;
+        case DataPreprocessingChangedEventType.DeleteRow:
+        case DataPreprocessingChangedEventType.AddRow:
+        case DataPreprocessingChangedEventType.ChangeItem:
+        case DataPreprocessingChangedEventType.Any:
+        case DataPreprocessingChangedEventType.Transformation:
+        default:
+          MissingValueIndicies = new Dictionary<int, IList<int>>();
+          ValuesWithoutNaN = new Dictionary<int, IList>();
+          break;
+      }
+    }
+
+    public IDictionary<int, IList<int>> GetMissingValueIndices() {
+      var dic = new Dictionary<int, IList<int>>();
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        dic.Add(i, GetMissingValueIndices(i));
+      }
+      return dic;
+    }
+
+    public IList<int> GetMissingValueIndices(int columnIndex) {
+      int index = 0;
+      var indices = new List<int>();
+
+      if (MissingValueIndicies.ContainsKey(columnIndex)) {
+        return MissingValueIndicies[columnIndex];
+      }
+
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        foreach (var v in preprocessingData.GetValues<double>(columnIndex)) {
+          if (double.IsNaN(v)) indices.Add(index);
+          index++;
+        }
+      } else if (preprocessingData.VariableHasType<string>(columnIndex)) {
+        foreach (var v in preprocessingData.GetValues<string>(columnIndex)) {
+          if (string.IsNullOrEmpty(v)) indices.Add(index);
+          index++;
+        }
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        foreach (var v in preprocessingData.GetValues<DateTime>(columnIndex)) {
+          if (DateTime.MinValue.Equals(v)) indices.Add(index);
+          index++;
+        }
+      } else {
+        throw new ArgumentException("column " + columnIndex + " contains a non supported type.");
+      }
+
+      MissingValueIndicies[columnIndex] = indices;
+      return MissingValueIndicies[columnIndex];
+    }
+
+
+    public bool IsMissingValue(int columnIndex, int rowIndex) {
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        return double.IsNaN(preprocessingData.GetCell<double>(columnIndex, rowIndex));
+      } else if (preprocessingData.VariableHasType<string>(columnIndex)) {
+        return string.IsNullOrEmpty(preprocessingData.GetCell<string>(columnIndex, rowIndex));
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        return preprocessingData.GetCell<DateTime>(columnIndex, rowIndex).Equals(DateTime.MinValue);
+      } else {
+        throw new ArgumentException("cell in column " + columnIndex + " and row index " + rowIndex + " contains a non supported type.");
+      }
+    }
+
+    public IEnumerable<T> GetValuesWithoutNaN<T>(int columnIndex, bool considerSelection) {
+      if (considerSelection) {
+        var selectedRows = preprocessingData.Selection[columnIndex];
+
+        List<T> values = new List<T>();
+        foreach (var rowIdx in selectedRows) {
+          if (!IsMissingValue(columnIndex, rowIdx)) {
+            values.Add(preprocessingData.GetCell<T>(columnIndex, rowIdx));
+          }
+        }
+        return values;
+      } else {
+        if (!ValuesWithoutNaN.ContainsKey(columnIndex)) {
+          List<T> values = new List<T>();
+
+          for (int row = 0; row < preprocessingData.Rows; ++row) {
+            if (!IsMissingValue(columnIndex, row)) {
+              values.Add(preprocessingData.GetCell<T>(columnIndex, row));
+            }
+          }
+
+          ValuesWithoutNaN[columnIndex] = values;
+        }
+        return (IEnumerable<T>)ValuesWithoutNaN[columnIndex];
+      }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs	(revision 15268)
@@ -0,0 +1,234 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing {
+  public class StatisticsLogic {
+    private readonly ITransactionalPreprocessingData preprocessingData;
+    private readonly SearchLogic searchLogic;
+
+    public StatisticsLogic(ITransactionalPreprocessingData thePreprocessingData, SearchLogic theSearchLogic) {
+      preprocessingData = thePreprocessingData;
+      searchLogic = theSearchLogic;
+    }
+
+    public int GetColumnCount() {
+      return searchLogic.Columns;
+    }
+
+    public int GetRowCount() {
+      return searchLogic.Rows;
+    }
+
+    public int GetNumericColumnCount() {
+      int count = 0;
+
+      for (int i = 0; i < searchLogic.Columns; ++i) {
+        if (preprocessingData.VariableHasType<double>(i)) {
+          ++count;
+        }
+      }
+      return count;
+    }
+
+    public int GetNominalColumnCount() {
+      return searchLogic.Columns - GetNumericColumnCount();
+    }
+
+    public int GetMissingValueCount() {
+      int count = 0;
+      for (int i = 0; i < searchLogic.Columns; ++i) {
+        count += GetMissingValueCount(i);
+      }
+      return count;
+    }
+
+    public int GetMissingValueCount(int columnIndex) {
+      return searchLogic.GetMissingValueIndices(columnIndex).Count();
+    }
+
+    public T GetMin<T>(int columnIndex, T defaultValue, bool considerSelection = false) where T : IComparable<T> {
+      var min = defaultValue;
+      if (preprocessingData.VariableHasType<T>(columnIndex)) {
+        var values = GetValuesWithoutNaN<T>(columnIndex, considerSelection);
+        if (values.Any()) {
+          min = values.Min();
+        }
+      }
+      return min;
+    }
+
+    public T GetMax<T>(int columnIndex, T defaultValue, bool considerSelection = false) where T : IComparable<T> {
+      var max = defaultValue;
+      if (preprocessingData.VariableHasType<T>(columnIndex)) {
+        var values = GetValuesWithoutNaN<T>(columnIndex, considerSelection);
+        if (values.Any()) {
+          max = values.Max();
+        }
+      }
+      return max;
+    }
+
+    public double GetMedian(int columnIndex, bool considerSelection = false) {
+      double median = double.NaN;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        var values = GetValuesWithoutNaN<double>(columnIndex, considerSelection);
+        if (values.Any()) {
+          median = values.Median();
+        }
+      }
+      return median;
+    }
+
+    public double GetAverage(int columnIndex, bool considerSelection = false) {
+      double avg = double.NaN;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        var values = GetValuesWithoutNaN<double>(columnIndex, considerSelection);
+        if (values.Any()) {
+          avg = values.Average();
+        }
+      }
+      return avg;
+    }
+
+    public DateTime GetMedianDateTime(int columnIndex, bool considerSelection = false) {
+      DateTime median = new DateTime();
+      if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        median = GetSecondsAsDateTime(GetDateTimeAsSeconds(columnIndex, considerSelection).Median());
+      }
+      return median;
+    }
+
+    public DateTime GetAverageDateTime(int columnIndex, bool considerSelection = false) {
+      DateTime avg = new DateTime();
+      if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        avg = GetSecondsAsDateTime(GetDateTimeAsSeconds(columnIndex, considerSelection).Average());
+      }
+      return avg;
+    }
+
+    public T GetMostCommonValue<T>(int columnIndex, T defaultValue, bool considerSelection = false) {
+      var values = GetValuesWithoutNaN<T>(columnIndex, considerSelection);
+      if (!values.Any())
+        return defaultValue;
+      return values.GroupBy(x => x)
+                              .OrderByDescending(g => g.Count())
+                              .Select(g => g.Key)
+                              .First();
+    }
+
+
+    public double GetStandardDeviation(int columnIndex) {
+      double stdDev = double.NaN;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        stdDev = GetValuesWithoutNaN<double>(columnIndex).StandardDeviation();
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        stdDev = GetDateTimeAsSeconds(columnIndex).StandardDeviation();
+      }
+      return stdDev;
+    }
+
+    public double GetVariance(int columnIndex) {
+      double variance = double.NaN;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        variance = GetValuesWithoutNaN<double>(columnIndex).Variance();
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        variance = GetDateTimeAsSeconds(columnIndex).Variance();
+      }
+      return variance;
+    }
+
+    public double GetOneQuarterPercentile(int columnIndex) {
+      double percentile = double.NaN;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        percentile = GetValuesWithoutNaN<double>(columnIndex).DefaultIfEmpty(double.NaN).Quantile(0.25);
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        percentile = GetDateTimeAsSeconds(columnIndex).DefaultIfEmpty(double.NaN).Quantile(0.25);
+      }
+      return percentile;
+    }
+
+    public double GetThreeQuarterPercentile(int columnIndex) {
+      double percentile = double.NaN;
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        percentile = GetValuesWithoutNaN<double>(columnIndex).DefaultIfEmpty(double.NaN).Quantile(0.75);
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        percentile = GetDateTimeAsSeconds(columnIndex).DefaultIfEmpty(double.NaN).Quantile(0.75);
+      }
+      return percentile;
+    }
+
+    public int GetDifferentValuesCount<T>(int columnIndex) {
+      return preprocessingData.GetValues<T>(columnIndex).GroupBy(x => x).Count();
+    }
+
+    public int GetRowMissingValueCount(int rowIndex) {
+      int count = 0;
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        if (searchLogic.IsMissingValue(i, rowIndex)) {
+          ++count;
+        }
+      }
+      return count;
+    }
+
+    public string GetVariableName(int columnIndex) {
+      return preprocessingData.GetVariableName(columnIndex);
+    }
+
+    public bool VariableHasType<T>(int columnIndex) {
+      return preprocessingData.VariableHasType<T>(columnIndex);
+    }
+
+    public string GetColumnTypeAsString(int columnIndex) {
+      if (preprocessingData.VariableHasType<double>(columnIndex)) {
+        return "double";
+      } else if (preprocessingData.VariableHasType<string>(columnIndex)) {
+        return "string";
+      } else if (preprocessingData.VariableHasType<DateTime>(columnIndex)) {
+        return "DateTime";
+      }
+      return "Unknown Type";
+    }
+
+    private IEnumerable<double> GetDateTimeAsSeconds(int columnIndex, bool considerSelection = false) {
+      return GetValuesWithoutNaN<DateTime>(columnIndex, considerSelection).Select(x => (double)x.Ticks / TimeSpan.TicksPerSecond);
+    }
+
+    private IEnumerable<T> GetValuesWithoutNaN<T>(int columnIndex, bool considerSelection = false) {
+      return searchLogic.GetValuesWithoutNaN<T>(columnIndex, considerSelection);
+    }
+
+    private DateTime GetSecondsAsDateTime(double seconds) {
+      DateTime dateTime = new DateTime();
+      return dateTime.AddSeconds(seconds);
+    }
+
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { preprocessingData.Changed += value; }
+      remove { preprocessingData.Changed -= value; }
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Plugin.cs.frame
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Plugin.cs.frame	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Plugin.cs.frame	(revision 15268)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Data plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.DataPreprocessing", "3.4.4.$WCREV$")]
+  [PluginFile("HeuristicLab.DataPreprocessing-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Data","3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis","3.4")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
+  public class HeuristicLabDataPreprocessingPlugin : PluginBase {
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/PreprocessingContext.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/PreprocessingContext.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/PreprocessingContext.cs	(revision 15268)
@@ -0,0 +1,142 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("PreprocessingContext", "PreprocessingContext")]
+  [StorableClass]
+  public class PreprocessingContext : NamedItem, IStorableContent {
+    public string Filename { get; set; }
+
+    [Storable]
+    public IFilteredPreprocessingData Data { get; private set; }
+
+    [Storable]
+    private IItem Source { get; set; }
+
+    public event EventHandler Reset;
+
+    #region Constructors
+    public PreprocessingContext(IDataAnalysisProblemData problemData, IItem source = null)
+      : base("Data Preprocessing") {
+      if (problemData == null) throw new ArgumentNullException("problemData");
+      Import(problemData, source);
+    }
+
+    [StorableConstructor]
+    protected PreprocessingContext(bool deserializing)
+      : base(deserializing) { }
+    protected PreprocessingContext(PreprocessingContext original, Cloner cloner)
+      : base(original, cloner) {
+      Source = cloner.Clone(original.Source);
+      Data = cloner.Clone(original.Data);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreprocessingContext(this, cloner);
+    }
+    #endregion
+
+    #region Import
+    public void Import(IDataAnalysisProblemData problemData, IItem source = null) {
+      if (problemData == null) throw new ArgumentNullException("problemData");
+      if (source != null && ExtractProblemData(source) != problemData)
+        source = null; // ignore the source if the source's problem data is different
+      Source = source ?? problemData;
+      var namedSource = Source as INamedItem;
+      if (namedSource != null)
+        Name = "Preprocessing " + namedSource.Name;
+      Data = new FilteredPreprocessingData(new TransactionalPreprocessingData(problemData));
+      OnReset();
+      // Reset GUI:
+      // - OnContentChanged for PreprocessingView!
+      // event? task(async import)?
+    }
+    private IDataAnalysisProblemData ExtractProblemData(IItem source) {
+      var algorithm = source as Algorithm;
+      var problem = algorithm != null ? algorithm.Problem as IDataAnalysisProblem : source as IDataAnalysisProblem;
+      var problemData = problem != null ? problem.ProblemData : source as IDataAnalysisProblemData;
+      return problemData;
+    }
+    #endregion
+
+    #region Export
+    public bool CanExport {
+      get { return Source is IAlgorithm || Source is IDataAnalysisProblem || Source is IDataAnalysisProblemData; }
+    }
+    public IEnumerable<KeyValuePair<string, Func<IItem>>> GetSourceExportOptions() {
+      var algorithm = Source as IAlgorithm;
+      if (algorithm != null)
+        yield return new KeyValuePair<string, Func<IItem>>(
+          algorithm.GetType().GetPrettyName(),
+          () => ExportAlgorithm(algorithm));
+
+      var problem = algorithm != null ? algorithm.Problem as IDataAnalysisProblem : Source as IDataAnalysisProblem;
+      if (problem != null)
+        yield return new KeyValuePair<string, Func<IItem>>(
+          problem.GetType().GetPrettyName(),
+          () => ExportProblem(problem));
+
+      var problemData = problem != null ? problem.ProblemData : Source as IDataAnalysisProblemData;
+      if (problemData != null)
+        yield return new KeyValuePair<string, Func<IItem>>(
+          problemData.GetType().GetPrettyName(),
+          () => ExportProblemData(problemData));
+    }
+
+    private IAlgorithm ExportAlgorithm(IAlgorithm source) {
+      var preprocessedAlgorithm = (IAlgorithm)source.Clone();
+      preprocessedAlgorithm.Name = preprocessedAlgorithm.Name + "(Preprocessed)";
+      preprocessedAlgorithm.Runs.Clear();
+      var problem = (IDataAnalysisProblem)preprocessedAlgorithm.Problem;
+      problem.ProblemDataParameter.ActualValue = CreateNewProblemData();
+      return preprocessedAlgorithm;
+    }
+    private IDataAnalysisProblem ExportProblem(IDataAnalysisProblem source) {
+      var preprocessedProblem = (IDataAnalysisProblem)source.Clone();
+      preprocessedProblem.ProblemDataParameter.ActualValue = CreateNewProblemData();
+      return preprocessedProblem;
+    }
+    private IDataAnalysisProblemData ExportProblemData(IDataAnalysisProblemData source) {
+      return CreateNewProblemData();
+    }
+
+    public IDataAnalysisProblemData CreateNewProblemData() {
+      var creator = new ProblemDataCreator(this);
+      var oldProblemData = ExtractProblemData(Source);
+      var newProblemData = creator.CreateProblemData(oldProblemData);
+      newProblemData.Name = "Preprocessed " + oldProblemData.Name;
+      return newProblemData;
+    }
+    #endregion
+
+    protected virtual void OnReset() {
+      if (Reset != null)
+        Reset(this, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs	(revision 15268)
@@ -0,0 +1,178 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class PreprocessingTransformator {
+    private readonly ITransactionalPreprocessingData preprocessingData;
+
+    private readonly IDictionary<string, IList<double>> originalColumns;
+
+    private readonly IDictionary<string, string> renamedColumns;
+
+    public PreprocessingTransformator(IPreprocessingData preprocessingData) {
+      this.preprocessingData = (ITransactionalPreprocessingData)preprocessingData;
+      originalColumns = new Dictionary<string, IList<double>>();
+      renamedColumns = new Dictionary<string, string>();
+    }
+
+    public bool ApplyTransformations(IEnumerable<ITransformation> transformations, bool preserveColumns, out string errorMsg) {
+      bool success = false;
+      errorMsg = string.Empty;
+      preprocessingData.BeginTransaction(DataPreprocessingChangedEventType.Transformation);
+
+      try {
+        var doubleTransformations = transformations.OfType<Transformation<double>>().ToList();
+
+        if (preserveColumns) {
+          PreserveColumns(doubleTransformations);
+        }
+
+        // all transformations are performed inplace. no creation of new columns for transformations
+        ApplyDoubleTranformationsInplace(doubleTransformations, preserveColumns, out success, out errorMsg);
+
+        if (preserveColumns) {
+          RenameTransformedColumsAndRestorePreservedColumns(doubleTransformations);
+          RenameTransformationColumnParameter(doubleTransformations);
+          InsertCopyColumTransformations(doubleTransformations);
+
+          originalColumns.Clear();
+          renamedColumns.Clear();
+        }
+        // only accept changes if everything was successful
+        if (!success) {
+          preprocessingData.Undo();
+        }
+      }
+      catch (Exception e) {
+        preprocessingData.Undo();
+        if (string.IsNullOrEmpty(errorMsg)) errorMsg = e.Message;
+      }
+      finally {
+        preprocessingData.EndTransaction();
+      }
+
+      return success;
+    }
+
+    private void PreserveColumns(IEnumerable<Transformation<double>> transformations) {
+      foreach (var transformation in transformations) {
+        if (!originalColumns.ContainsKey(transformation.Column)) {
+          int colIndex = preprocessingData.GetColumnIndex(transformation.Column);
+          var originalData = preprocessingData.GetValues<double>(colIndex);
+          originalColumns.Add(transformation.Column, originalData);
+        }
+      }
+    }
+
+    private void ApplyDoubleTranformationsInplace(IEnumerable<Transformation<double>> transformations, bool preserveColumns, out bool success, out string errorMsg) {
+      errorMsg = string.Empty;
+      success = true;
+      foreach (var transformation in transformations) {
+        int colIndex = preprocessingData.GetColumnIndex(transformation.Column);
+
+        var originalData = preprocessingData.GetValues<double>(colIndex);
+
+        string errorMsgPart;
+        bool successPart;
+        var transformedData = ApplyDoubleTransformation(transformation, originalData, out successPart, out errorMsgPart);
+        errorMsg += errorMsgPart + Environment.NewLine;
+
+        if (!successPart) success = false;
+        preprocessingData.SetValues(colIndex, transformedData.ToList());
+        preprocessingData.Transformations.Add(transformation);
+      }
+    }
+
+    private IEnumerable<double> ApplyDoubleTransformation(Transformation<double> transformation, IList<double> data, out bool success, out string errorMsg) {
+      success = transformation.Check(data, out errorMsg);
+      // don't apply when the check fails
+      if (success)
+        return transformation.ConfigureAndApply(data);
+      else
+        return data;
+    }
+
+    private void RenameTransformationColumnParameter(List<Transformation<double>> transformations) {
+      foreach (var transformation in transformations) {
+        var newColumnName = new StringValue(renamedColumns[transformation.Column]);
+        transformation.ColumnParameter.ValidValues.Add(newColumnName);
+        transformation.ColumnParameter.Value = newColumnName;
+      }
+    }
+
+    private void InsertCopyColumTransformations(IList<Transformation<double>> transformations) {
+      foreach (var renaming in renamedColumns) {
+        string oldName = renaming.Key;
+        string newName = renaming.Value;
+
+        var copyTransformation = CreateCopyTransformation(oldName, newName);
+        preprocessingData.Transformations.Insert(0, copyTransformation);
+      }
+    }
+
+    private CopyColumnTransformation CreateCopyTransformation(string oldColumn, string newColumn) {
+      var newColumName = new StringValue(newColumn);
+
+      var copyTransformation = new CopyColumnTransformation();
+      copyTransformation.ColumnParameter.ValidValues.Add(newColumName);
+      copyTransformation.ColumnParameter.Value = newColumName;
+
+      copyTransformation.CopiedColumnNameParameter.Value.Value = oldColumn;
+      return copyTransformation;
+    }
+
+    private void RenameTransformedColumsAndRestorePreservedColumns(IList<Transformation<double>> transformations) {
+      foreach (var column in originalColumns) {
+        int originalColumnIndex = preprocessingData.GetColumnIndex(column.Key);
+        int newColumnIndex = originalColumnIndex + 1;
+        string newColumnName = GetTransformatedColumnName(transformations, column.Key);
+        // save renaming mapping
+        renamedColumns[column.Key] = newColumnName;
+        // create new transformed column
+        preprocessingData.InsertColumn<double>(newColumnName, newColumnIndex);
+        preprocessingData.SetValues(newColumnIndex, preprocessingData.GetValues<double>(originalColumnIndex));
+        // restore old values
+        preprocessingData.SetValues(originalColumnIndex, column.Value);
+      }
+    }
+
+    private string GetTransformatedColumnName(IList<Transformation<double>> transformations, string column) {
+      string suffix = GetTransformationSuffix(transformations, column);
+      return column + "_" + suffix;
+    }
+
+    private string GetTransformationSuffix(IList<Transformation<double>> transformations, string column) {
+      var suffixes = transformations.Where(t => t.Column == column).Select(t => t.ShortName);
+      var builder = new StringBuilder();
+      foreach (var suffix in suffixes) {
+        builder.Append(suffix);
+      }
+      return builder.ToString();
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15268)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class ProblemDataCreator {
+    private readonly PreprocessingContext context;
+
+    private Dataset ExportedDataset {
+      get { return context.Data.ExportToDataset(); }
+    }
+
+    private IList<ITransformation> Transformations {
+      get { return context.Data.Transformations; }
+    }
+
+    public ProblemDataCreator(PreprocessingContext context) {
+      this.context = context;
+    }
+
+    public IDataAnalysisProblemData CreateProblemData(IDataAnalysisProblemData oldProblemData) {
+      if (context.Data.Rows == 0 || context.Data.Columns == 0) return null;
+
+      IDataAnalysisProblemData problemData;
+
+      if (oldProblemData is TimeSeriesPrognosisProblemData) {
+        problemData = CreateTimeSeriesPrognosisData((TimeSeriesPrognosisProblemData)oldProblemData);
+      } else if (oldProblemData is RegressionProblemData) {
+        problemData = CreateRegressionData((RegressionProblemData)oldProblemData);
+      } else if (oldProblemData is ClassificationProblemData) {
+        problemData = CreateClassificationData((ClassificationProblemData)oldProblemData);
+      } else if (oldProblemData is ClusteringProblemData) {
+        problemData = CreateClusteringData((ClusteringProblemData)oldProblemData);
+      } else {
+        throw new NotImplementedException("The type of the DataAnalysisProblemData is not supported.");
+      }
+
+      SetTrainingAndTestPartition(problemData);
+      // set the input variables to the correct checked state
+      var inputVariables = oldProblemData.InputVariables.ToDictionary(x => x.Value, x => x);
+      foreach (var variable in problemData.InputVariables) {
+        bool isChecked = inputVariables.ContainsKey(variable.Value) && oldProblemData.InputVariables.ItemChecked(inputVariables[variable.Value]);
+        problemData.InputVariables.SetItemCheckedState(variable, isChecked);
+      }
+
+      return problemData;
+    }
+
+    private IDataAnalysisProblemData CreateTimeSeriesPrognosisData(TimeSeriesPrognosisProblemData oldProblemData) {
+      var targetVariable = oldProblemData.TargetVariable;
+      if (!context.Data.VariableNames.Contains(targetVariable))
+        targetVariable = context.Data.VariableNames.First();
+      var inputVariables = GetDoubleInputVariables(targetVariable);
+      var newProblemData = new TimeSeriesPrognosisProblemData(ExportedDataset, inputVariables, targetVariable, Transformations) {
+        TrainingHorizon = oldProblemData.TrainingHorizon,
+        TestHorizon = oldProblemData.TestHorizon
+      };
+      return newProblemData;
+    }
+
+    private IDataAnalysisProblemData CreateRegressionData(RegressionProblemData oldProblemData) {
+      var targetVariable = oldProblemData.TargetVariable;
+      if (!context.Data.VariableNames.Contains(targetVariable))
+        targetVariable = context.Data.VariableNames.First();
+      var inputVariables = GetDoubleInputVariables(targetVariable);
+      var newProblemData = new RegressionProblemData(ExportedDataset, inputVariables, targetVariable, Transformations);
+      return newProblemData;
+    }
+
+    private IDataAnalysisProblemData CreateClassificationData(ClassificationProblemData oldProblemData) {
+      var targetVariable = oldProblemData.TargetVariable;
+      if (!context.Data.VariableNames.Contains(targetVariable))
+        targetVariable = context.Data.VariableNames.First();
+      var inputVariables = GetDoubleInputVariables(targetVariable);
+      var newProblemData = new ClassificationProblemData(ExportedDataset, inputVariables, targetVariable, Transformations) {
+        PositiveClass = oldProblemData.PositiveClass
+      };
+      return newProblemData;
+    }
+
+    private IDataAnalysisProblemData CreateClusteringData(ClusteringProblemData oldProblemData) {
+      return new ClusteringProblemData(ExportedDataset, GetDoubleInputVariables(String.Empty), Transformations);
+    }
+
+    private void SetTrainingAndTestPartition(IDataAnalysisProblemData problemData) {
+      var ppData = context.Data;
+
+      problemData.TrainingPartition.Start = ppData.TrainingPartition.Start;
+      problemData.TrainingPartition.End = ppData.TrainingPartition.End;
+      problemData.TestPartition.Start = ppData.TestPartition.Start;
+      problemData.TestPartition.End = ppData.TestPartition.End;
+    }
+
+    private IEnumerable<string> GetDoubleInputVariables(string targetVariable) {
+      var variableNames = new List<string>();
+      for (int i = 0; i < context.Data.Columns; ++i) {
+        var variableName = context.Data.GetVariableName(i);
+        if (context.Data.VariableHasType<double>(i)
+          && variableName != targetVariable
+          && IsNotConstantInputVariable(context.Data.GetValues<double>(i))) {
+
+          variableNames.Add(variableName);
+        }
+      }
+      return variableNames;
+    }
+
+    private bool IsNotConstantInputVariable(IList<double> list) {
+      return context.Data.TrainingPartition.End - context.Data.TrainingPartition.Start > 1 || list.Range() > 0;
+    }
+  }
+}
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Properties/AssemblyInfo.cs.frame	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Properties/AssemblyInfo.cs.frame	(revision 15268)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.DataPreprocessing")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("923b1ea4-9504-4afd-b2ad-dd6ee72c7af6")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.4.$WCREV$")]
Index: /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Properties/Resources.Designer.cs
===================================================================
--- /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Properties/Resources.Designer.cs	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Properties/Resources.Designer.cs	(revision 15268)
@@ -0,0 +1,63 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18408
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.DataPreprocessing.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.DataPreprocessing.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
Index: /branches/DataPreprocessing Cleanup/PreBuildEvent.cmd
===================================================================
--- /branches/DataPreprocessing Cleanup/PreBuildEvent.cmd	(revision 15268)
+++ /branches/DataPreprocessing Cleanup/PreBuildEvent.cmd	(revision 15268)
@@ -0,0 +1,11 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+GOTO Done
+
+:Error_Handling
+ECHO There was an error while running subwcrev. Please verify that the *.cs.frame files have been correctly converted to *.cs files, otherwise HeuristicLab won't build. 
+exit 0
+
+:Done
