Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/HeuristicLab.DataPreprocessing.Views-3.3.csproj
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/HeuristicLab.DataPreprocessing.Views-3.3.csproj	(revision 10736)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/HeuristicLab.DataPreprocessing.Views-3.3.csproj	(revision 10737)
@@ -243,4 +243,9 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ManipulationView.resx">
+      <DependentUpon>ManipulationView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.Designer.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.Designer.cs	(revision 10736)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.Designer.cs	(revision 10737)
@@ -45,10 +45,14 @@
       this.grpBoxPreview = new System.Windows.Forms.GroupBox();
       this.tabsPreview = new System.Windows.Forms.TabControl();
+      this.tabPreviewInactive = new System.Windows.Forms.TabPage();
       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.tabPreviewShuffle = new System.Windows.Forms.TabPage();
-      this.label9 = new System.Windows.Forms.Label();
-      this.tabPreviewInactive = new System.Windows.Forms.TabPage();
+      this.lblPreviewShuffle = new System.Windows.Forms.Label();
       this.grpBoxData.SuspendLayout();
       this.tabsData.SuspendLayout();
@@ -60,4 +64,7 @@
       this.grpBoxPreview.SuspendLayout();
       this.tabsPreview.SuspendLayout();
+      this.tabPreviewDeleteColumnsInfo.SuspendLayout();
+      this.tabPreviewDeleteColumnsVariance.SuspendLayout();
+      this.tabPreviewDeleteRowsInfo.SuspendLayout();
       this.tabPreviewShuffle.SuspendLayout();
       this.SuspendLayout();
@@ -194,5 +201,5 @@
       // txtDeleteColumnsVariance
       // 
-      this.txtDeleteColumnsVariance.Location = new System.Drawing.Point(226, 0);
+      this.txtDeleteColumnsVariance.Location = new System.Drawing.Point(229, 0);
       this.txtDeleteColumnsVariance.Name = "txtDeleteColumnsVariance";
       this.txtDeleteColumnsVariance.Size = new System.Drawing.Size(135, 20);
@@ -205,7 +212,7 @@
       this.label4.Location = new System.Drawing.Point(3, 3);
       this.label4.Name = "label4";
-      this.label4.Size = new System.Drawing.Size(217, 13);
+      this.label4.Size = new System.Drawing.Size(220, 13);
       this.label4.TabIndex = 3;
-      this.label4.Text = "Delete columns with a variance smaller than ";
+      this.label4.Text = "Delete columns with a variance smaller than  ";
       // 
       // tabDataDeleteRowsInfo
@@ -298,6 +305,17 @@
       this.tabsPreview.TabIndex = 3;
       // 
+      // tabPreviewInactive
+      // 
+      this.tabPreviewInactive.Location = new System.Drawing.Point(4, 22);
+      this.tabPreviewInactive.Name = "tabPreviewInactive";
+      this.tabPreviewInactive.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPreviewInactive.Size = new System.Drawing.Size(711, 142);
+      this.tabPreviewInactive.TabIndex = 5;
+      this.tabPreviewInactive.Text = "inactive";
+      this.tabPreviewInactive.UseVisualStyleBackColor = true;
+      // 
       // tabPreviewDeleteColumnsInfo
       // 
+      this.tabPreviewDeleteColumnsInfo.Controls.Add(this.lblPreviewColumnsInfo);
       this.tabPreviewDeleteColumnsInfo.Location = new System.Drawing.Point(4, 22);
       this.tabPreviewDeleteColumnsInfo.Name = "tabPreviewDeleteColumnsInfo";
@@ -308,6 +326,17 @@
       this.tabPreviewDeleteColumnsInfo.UseVisualStyleBackColor = true;
       // 
+      // lblPreviewColumnsInfo
+      // 
+      this.lblPreviewColumnsInfo.AutoSize = true;
+      this.lblPreviewColumnsInfo.Location = new System.Drawing.Point(3, 3);
+      this.lblPreviewColumnsInfo.Name = "lblPreviewColumnsInfo";
+      this.lblPreviewColumnsInfo.Size = new System.Drawing.Size(318, 13);
+      this.lblPreviewColumnsInfo.TabIndex = 1;
+      this.lblPreviewColumnsInfo.Text = "{0} columns with more than {1} % missing values would be deleted";
+      // 
       // tabPreviewDeleteColumnsVariance
       // 
+      this.tabPreviewDeleteColumnsVariance.Controls.Add(this.label12);
+      this.tabPreviewDeleteColumnsVariance.Controls.Add(this.lblPreviewColumnsVariance);
       this.tabPreviewDeleteColumnsVariance.Location = new System.Drawing.Point(4, 22);
       this.tabPreviewDeleteColumnsVariance.Name = "tabPreviewDeleteColumnsVariance";
@@ -318,6 +347,24 @@
       this.tabPreviewDeleteColumnsVariance.UseVisualStyleBackColor = true;
       // 
+      // label12
+      // 
+      this.label12.AutoSize = true;
+      this.label12.Location = new System.Drawing.Point(6, 22);
+      this.label12.Name = "label12";
+      this.label12.Size = new System.Drawing.Size(0, 13);
+      this.label12.TabIndex = 2;
+      // 
+      // lblPreviewColumnsVariance
+      // 
+      this.lblPreviewColumnsVariance.AutoSize = true;
+      this.lblPreviewColumnsVariance.Location = new System.Drawing.Point(3, 3);
+      this.lblPreviewColumnsVariance.Name = "lblPreviewColumnsVariance";
+      this.lblPreviewColumnsVariance.Size = new System.Drawing.Size(301, 13);
+      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.Name = "tabPreviewDeleteRowsInfo";
@@ -328,7 +375,16 @@
       this.tabPreviewDeleteRowsInfo.UseVisualStyleBackColor = true;
       // 
+      // lblPreviewRowsInfo
+      // 
+      this.lblPreviewRowsInfo.AutoSize = true;
+      this.lblPreviewRowsInfo.Location = new System.Drawing.Point(3, 3);
+      this.lblPreviewRowsInfo.Name = "lblPreviewRowsInfo";
+      this.lblPreviewRowsInfo.Size = new System.Drawing.Size(301, 13);
+      this.lblPreviewRowsInfo.TabIndex = 2;
+      this.lblPreviewRowsInfo.Text = "{0} rows with more than {1} % missing values would be deleted";
+      // 
       // tabPreviewShuffle
       // 
-      this.tabPreviewShuffle.Controls.Add(this.label9);
+      this.tabPreviewShuffle.Controls.Add(this.lblPreviewShuffle);
       this.tabPreviewShuffle.Location = new System.Drawing.Point(4, 22);
       this.tabPreviewShuffle.Name = "tabPreviewShuffle";
@@ -339,22 +395,12 @@
       this.tabPreviewShuffle.UseVisualStyleBackColor = true;
       // 
-      // label9
-      // 
-      this.label9.AutoSize = true;
-      this.label9.Location = new System.Drawing.Point(3, 3);
-      this.label9.Name = "label9";
-      this.label9.Size = new System.Drawing.Size(252, 13);
-      this.label9.TabIndex = 0;
-      this.label9.Text = "Data will be shuffled randomly - preview not possible";
-      // 
-      // tabPreviewInactive
-      // 
-      this.tabPreviewInactive.Location = new System.Drawing.Point(4, 22);
-      this.tabPreviewInactive.Name = "tabPreviewInactive";
-      this.tabPreviewInactive.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPreviewInactive.Size = new System.Drawing.Size(711, 142);
-      this.tabPreviewInactive.TabIndex = 5;
-      this.tabPreviewInactive.Text = "inactive";
-      this.tabPreviewInactive.UseVisualStyleBackColor = true;
+      // lblPreviewShuffle
+      // 
+      this.lblPreviewShuffle.AutoSize = true;
+      this.lblPreviewShuffle.Location = new System.Drawing.Point(3, 3);
+      this.lblPreviewShuffle.Name = "lblPreviewShuffle";
+      this.lblPreviewShuffle.Size = new System.Drawing.Size(252, 13);
+      this.lblPreviewShuffle.TabIndex = 0;
+      this.lblPreviewShuffle.Text = "Data will be shuffled randomly - preview not possible";
       // 
       // ManipulationView
@@ -382,4 +428,10 @@
       this.grpBoxPreview.ResumeLayout(false);
       this.tabsPreview.ResumeLayout(false);
+      this.tabPreviewDeleteColumnsInfo.ResumeLayout(false);
+      this.tabPreviewDeleteColumnsInfo.PerformLayout();
+      this.tabPreviewDeleteColumnsVariance.ResumeLayout(false);
+      this.tabPreviewDeleteColumnsVariance.PerformLayout();
+      this.tabPreviewDeleteRowsInfo.ResumeLayout(false);
+      this.tabPreviewDeleteRowsInfo.PerformLayout();
       this.tabPreviewShuffle.ResumeLayout(false);
       this.tabPreviewShuffle.PerformLayout();
@@ -415,6 +467,10 @@
     private System.Windows.Forms.TabPage tabPage1;
     private System.Windows.Forms.Label label7;
-    private System.Windows.Forms.Label label9;
+    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;
   }
 }
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.cs	(revision 10736)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.cs	(revision 10737)
@@ -45,15 +45,83 @@
 
       validators = new Action[] { 
-        ()=>validateDoubleTextBox(txtDeleteColumnsInfo.Text),
-        ()=>validateDoubleTextBox(txtDeleteColumnsVariance.Text),
-        ()=>validateDoubleTextBox(txtDeleteRowsInfo.Text),
-        ()=>{btnApply.Enabled = true;} //shuffle
+        ()=>validateDeleteColumnsInfo(),
+        ()=>validateDeleteColumnsVariance(),
+        ()=>validateDeleteRowsInfo(),
+        ()=>{btnApply.Enabled = true; lblPreviewShuffle.Text = "Data will be shuffled randomly - preview not possible";} //shuffle
       };
+
       manipulations = new Action[] { 
-        ()=>{},
-        ()=>{},
-        ()=>{},
+        ()=>Content.ManipulationLogic.DeleteColumnsWithMissingValuesGreater(getDeleteColumnsInfo()),
+        ()=>Content.ManipulationLogic.DeleteColumnsWithVarianceSmaller(getDeleteColumnsVariance()),
+        ()=>Content.ManipulationLogic.DeleteRowsWithMissingValuesGreater(getRowsColumnsInfo()),
         ()=>Content.ManipulationLogic.ShuffleWithRanges()
       };
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ManipulationLogic.Changed += Content_Changed;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ManipulationLogic.Changed -= Content_Changed;
+    }
+
+    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 validateDeleteColumnsInfo() {
+      validateDoubleTextBox(txtDeleteColumnsInfo.Text);
+      if (btnApply.Enabled) {
+        int count = Content.ManipulationLogic.ColumnsWithMissingValuesGreater(getDeleteColumnsInfo()).Count;
+        lblPreviewColumnsInfo.Text = count + " column" + (count > 1 || count == 0 ? "s" : "") + " were detected with more than " + txtDeleteColumnsInfo.Text + "% missing values.";
+        if (count > 0) {
+          lblPreviewColumnsInfo.Text += Environment.NewLine + Environment.NewLine + "Please press the button \"Apply Manipulation\" if you wish to delete those columns.";
+        } else {
+          btnApply.Enabled = false;
+        }
+      } else {
+        lblPreviewColumnsInfo.Text = "Preview not possible yet - please input the limit above.";
+      }
+    }
+
+    private void validateDeleteColumnsVariance() {
+      validateDoubleTextBox(txtDeleteColumnsVariance.Text);
+      if (btnApply.Enabled) {
+        int count = Content.ManipulationLogic.ColumnsWithVarianceSmaller(getDeleteColumnsVariance()).Count;
+        lblPreviewColumnsVariance.Text = count + " column" + (count > 1 || count == 0 ? "s" : "") + " were detected with a variance smaller than " + txtDeleteColumnsVariance.Text + ".";
+        if (count > 0) {
+          lblPreviewColumnsVariance.Text += Environment.NewLine + Environment.NewLine + "Please press the button \"Apply Manipulation\" if you wish to delete those columns.";
+        } else {
+          btnApply.Enabled = false;
+        }
+      } 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;
+        lblPreviewRowsInfo.Text = count + " row" + (count > 1 || count == 0 ? "s" : "") + " 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.";
+      }
     }
 
@@ -70,5 +138,5 @@
       btnApply.Enabled = false;
 
-      //in order that button will be enabled if text is already valid
+      //in order that button is enabled if necessary input was already entered
       if (index >= 0) {
         validators[index]();
@@ -78,4 +146,19 @@
     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:
+          lblPreviewShuffle.Text = "dataset shuffled successfully.";
+          btnApply.Enabled = false;
+          break;
+      }
     }
 
@@ -91,13 +174,27 @@
 
     private void txtDeleteColumnsInfo_TextChanged(object sender, EventArgs e) {
-      validateDoubleTextBox(txtDeleteColumnsInfo.Text);
+      validateDeleteColumnsInfo();
     }
 
     private void txtDeleteColumnsVariance_TextChanged(object sender, EventArgs e) {
-      validateDoubleTextBox(txtDeleteColumnsVariance.Text);
+      validateDeleteColumnsVariance();
     }
 
     private void txtDeleteRowsInfo_TextChanged(object sender, EventArgs e) {
-      validateDoubleTextBox(txtDeleteRowsInfo.Text);
+      validateDeleteRowsInfo();
+    }
+
+    void Content_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      switch(lstMethods.SelectedIndex){
+        case 0:
+          validateDeleteColumnsInfo();
+          break;
+        case 1:
+          validateDeleteColumnsVariance();
+          break;
+        case 2:
+          validateDeleteRowsInfo();
+          break;
+      }
     }
   }
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.resx
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.resx	(revision 10737)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/ManipulationView.resx	(revision 10737)
@@ -0,0 +1,120 @@
+﻿<?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>
+</root>
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/ManipulationLogic.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/ManipulationLogic.cs	(revision 10736)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/ManipulationLogic.cs	(revision 10737)
@@ -299,8 +299,8 @@
       List<int> rows= new List<int>();
 
-      for (int i = preprocessingData.Rows - 1; i >= 0; --i)
+      for (int i = 0; i < preprocessingData.Rows; ++i)
       {
         int missingCount = statisticsLogic.GetRowMissingValueCount(i);
-        if (100f / preprocessingData.Columns * missingCount >= percent)
+        if (100f / preprocessingData.Columns * missingCount > percent)
         {
           rows.Add(i);
@@ -314,9 +314,7 @@
 
       List<int> columns = new List<int>();
-      for (int i = preprocessingData.Columns - 1; i >= 0; --i)
-      {
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
         int missingCount = statisticsLogic.GetMissingValueCount(i);
-        if (100f / preprocessingData.Columns * missingCount >= percent)
-        {
+        if (100f / preprocessingData.Rows * missingCount > percent) {
           columns.Add(i);
         }
@@ -329,6 +327,5 @@
 
       List<int> columns = new List<int>();
-      for (int i = preprocessingData.Columns - 1; i >= 0; --i)
-      {
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
         if (preprocessingData.IsType<double>(i) || preprocessingData.IsType<DateTime>(i))
         {
@@ -355,5 +352,7 @@
     }
 
-    private void DeleteRows(IEnumerable<int> rows) {
+    private void DeleteRows(List<int> rows) {
+      rows.Sort();
+      rows.Reverse();
       preprocessingData.InTransaction(() =>
       {
@@ -365,5 +364,7 @@
     }
 
-    private void DeleteColumns(IEnumerable<int> columns) {
+    private void DeleteColumns(List<int> columns) {
+      columns.Sort();
+      columns.Reverse();
       preprocessingData.InTransaction(() =>
       {
@@ -373,4 +374,9 @@
         }
       });
+    }
+
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { dataGridLogic.Changed += value; }
+      remove { dataGridLogic.Changed -= value; }
     }
   }
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/SearchLogic.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/SearchLogic.cs	(revision 10736)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/SearchLogic.cs	(revision 10737)
@@ -43,6 +43,22 @@
     void preprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e)
     {
-      MissingValueIndicies.Remove(e.Column);
-      ValuesWithoutNaN.Remove(e.Column);
+      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:
+          MissingValueIndicies = new Dictionary<int, IEnumerable<int>>();
+          ValuesWithoutNaN = new Dictionary<int, IEnumerable>();
+          break;
+      } 
     }
 
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IManipulationLogic.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IManipulationLogic.cs	(revision 10736)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IManipulationLogic.cs	(revision 10737)
@@ -43,4 +43,6 @@
     void DeleteColumnsWithMissingValuesGreater(double percent);
     void DeleteColumnsWithVarianceSmaller(double variance);
+
+    event DataPreprocessingChangedEventHandler Changed;
   }
 }
