Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/DataGridContentView.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/DataGridContentView.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/DataGridContentView.cs	(revision 10900)
@@ -96,9 +96,16 @@
       base.RegisterContentEvents();
       Content.Changed += Content_Changed;
-    }
+      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+    }
+
+    void FilterLogic_FilterChanged(object sender, EventArgs e) {
+      OnContentChanged();
+      searchIterator = null;
+    }   
 
     protected override void DeregisterContentEvents() {
       base.DeregisterContentEvents();
       Content.Changed -= Content_Changed;
+      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
     }
 
@@ -121,7 +128,15 @@
       if (!dataGridView.ReadOnly) {
         string errorMessage;
-        if (Content != null && !Content.DataGridLogic.Validate(e.FormattedValue.ToString(), out errorMessage, e.ColumnIndex)) {
-          e.Cancel = true;
-          dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+        if (Content != null){
+          if (dataGridView.IsCurrentCellInEditMode && Content.FilterLogic.IsFiltered()) {
+            errorMessage = "A filter is active, you cannot modify data. Press ESC to exit edit mode.";
+          } else {
+            Content.DataGridLogic.Validate(e.FormattedValue.ToString(), out errorMessage, e.ColumnIndex);
+          }
+
+          if (!String.IsNullOrEmpty(errorMessage)) {
+            e.Cancel = true;
+            dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+          }
         }
       }
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/FilterView.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/FilterView.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.3/FilterView.cs	(revision 10900)
@@ -93,5 +93,4 @@
           filter.ConstrainedValue = Content.FilterLogic.PreprocessingData;
         }
-        UpdateFilterInfo();
       }
     }
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridContent.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridContent.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridContent.cs	(revision 10900)
@@ -123,8 +123,4 @@
     }
 
-    public bool Validate(string value, out string errorMessage, int columnIndex) {
-      return dataGridLogic.Validate(value, out errorMessage, columnIndex);
-    }
-
     public string GetValue(int rowIndex, int columnIndex) {
       return dataGridLogic.GetValue(columnIndex, rowIndex);
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridLogic.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridLogic.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridLogic.cs	(revision 10900)
@@ -69,9 +69,10 @@
         throw new ArgumentOutOfRangeException("column index is out of range");
       }
+
       bool valid = false;
+      errorMessage = string.Empty;
       if (preprocessingData.IsType<double>(columnIndex)) {
         double val;
         valid = double.TryParse(value, out val);
-        errorMessage = string.Empty;
         if (!valid) {
           errorMessage = "Invalid Value (Valid Value Format: \"" + FormatPatterns.GetDoubleFormatPattern() + "\")";
@@ -79,5 +80,4 @@
       } else if (preprocessingData.IsType<string>(columnIndex)) {
         valid = value != null;
-        errorMessage = string.Empty;
         if (!valid) {
           errorMessage = "Invalid Value (string must not be null)";
@@ -86,5 +86,4 @@
         DateTime date;
         valid = DateTime.TryParse(value, out date);
-        errorMessage = string.Empty;
         if (!valid) {
           errorMessage = "Invalid Value (Valid Value Format: \"" + CultureInfo.CurrentCulture.DateTimeFormat + "\"";
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/FilterLogic.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/FilterLogic.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/FilterLogic.cs	(revision 10900)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -37,7 +38,10 @@
 
       if (activeFilters.Count == 0) {
-        return new bool[preprocessingData.Rows];
+        return CreateBoolArray(preprocessingData.Rows, false);
       }
+      return GetActiveFilterResult(activeFilters, isAndCombination);
+    }
 
+    private bool[] GetActiveFilterResult(IList<IFilter> activeFilters, bool isAndCombination) {
       bool[] result = CreateBoolArray(preprocessingData.Rows, !isAndCombination);
 
@@ -52,7 +56,12 @@
 
     public bool[] Preview(IList<IFilter> filters, bool isAndCombination) {
-      var result = GetFilterResult(filters, isAndCombination);
-      preprocessingData.SetFilter(result);
-      return result;
+      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);
+      }
     }
 
@@ -74,7 +83,16 @@
     }
 
+    public bool IsFiltered() {
+      return preprocessingData.IsFiltered;
+    }
+
     public IPreprocessingData PreprocessingData {
       get { return preprocessingData; }
     }
+
+    public event EventHandler FilterChanged {
+      add { preprocessingData.FilterChanged += value; }
+      remove { preprocessingData.FilterChanged -= value; }
+    }
   }
 }
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/FilteredPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/FilteredPreprocessingData.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/FilteredPreprocessingData.cs	(revision 10900)
@@ -118,8 +118,22 @@
         }
       }
+
+      OnFilterChanged();
     }
 
     public void PersistFilter() {
-      originalData = (ITransactionalPreprocessingData)filteredData.Clone();
+      originalData.InTransaction(() => {
+        for (int i = 0; i < filteredData.Columns; ++i) {
+          if (filteredData.IsType<double>(i)) {
+            originalData.SetValues<double>(i, filteredData.GetValues<double>(i));
+          } else if (filteredData.IsType<string>(i)) {
+            originalData.SetValues<string>(i, filteredData.GetValues<string>(i));
+          } else if (filteredData.IsType<DateTime>(i)) {
+            originalData.SetValues<DateTime>(i, filteredData.GetValues<DateTime>(i));
+          } else {
+            throw new ArgumentException("Data types of columns do not match");
+          }
+        }
+      });
       ResetFilter();
     }
@@ -127,4 +141,11 @@
     public void ResetFilter() {
       filteredData = null;
+      OnFilterChanged();
+    }
+
+    private void OnFilterChanged() {
+      if (FilterChanged != null) {
+        FilterChanged(this, new EventArgs());
+      }
     }
 
@@ -171,4 +192,6 @@
     }
 
+    public event EventHandler FilterChanged;
+
     #region IPreprocessingData Members
 
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IFilterLogic.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IFilterLogic.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IFilterLogic.cs	(revision 10900)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.DataPreprocessing.Filter;
@@ -25,8 +26,17 @@
   public interface IFilterLogic {
     bool[] GetFilterResult(IList<IFilter> filters, bool isAndCombination);
+    /// <summary>
+    /// Return an array which indicates whether the corresponding row should be filtered (true) or kept (false)
+    /// </summary>
+    /// <param name="filters"></param>
+    /// <param name="isAndCombination"></param>
+    /// <returns></returns>
     bool[] Preview(IList<IFilter> filters, bool isAndCombination);
     void Apply(IList<IFilter> filters, bool isAndCombination);
     IPreprocessingData PreprocessingData { get; }
     void Reset();
+    bool IsFiltered();
+
+    event EventHandler FilterChanged;
   }
 }
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IFilteredPreprocessingData.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IFilteredPreprocessingData.cs	(revision 10899)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Interfaces/IFilteredPreprocessingData.cs	(revision 10900)
@@ -11,4 +11,7 @@
     void PersistFilter();
     void ResetFilter();
+    bool IsFiltered { get; }
+
+    event EventHandler FilterChanged;
    }
 }
