Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15274)
@@ -51,5 +51,5 @@
           // TODO: Avoid accessing parent view
           var transformationView = (TransformationView)Parent;
-          var columnNames = transformationView.Content.Data.VariableNames;
+          var columnNames = transformationView.Content.PreprocessingData.VariableNames;
 
           return (ITransformation)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType(new[] { columnNames });
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs	(revision 15274)
@@ -85,5 +85,5 @@
       base.RegisterContentEvents();
       Content.Changed += Content_Changed;
-      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+      Content.PreprocessingData.FilterChanged += FilterLogic_FilterChanged;
     }
 
@@ -91,5 +91,5 @@
       base.DeregisterContentEvents();
       Content.Changed -= Content_Changed;
-      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
+      Content.PreprocessingData.FilterChanged -= FilterLogic_FilterChanged;
     }
 
@@ -98,5 +98,5 @@
       searchIterator = null;
       if (findAndReplaceDialog != null && !findAndReplaceDialog.IsDisposed) {
-        if (Content.FilterLogic.IsFiltered) {
+        if (Content.PreprocessingData.IsFiltered) {
           findAndReplaceDialog.DisableReplace();
         } else {
@@ -104,5 +104,5 @@
         }
       }
-      btnReplace.Enabled = !Content.FilterLogic.IsFiltered;
+      btnReplace.Enabled = !Content.PreprocessingData.IsFiltered;
     }
 
@@ -126,5 +126,5 @@
       string errorMessage;
       if (!String.IsNullOrEmpty(e.FormattedValue.ToString())) {
-        if (dataGridView.IsCurrentCellInEditMode && Content.FilterLogic.IsFiltered) {
+        if (dataGridView.IsCurrentCellInEditMode && Content.PreprocessingData.IsFiltered) {
           errorMessage = "A filter is active, you cannot modify data. Press ESC to exit edit mode.";
         } else {
@@ -271,5 +271,5 @@
         searchIterator = null;
         DataGridView.SelectionChanged += DataGridView_SelectionChanged_FindAndReplace;
-        if (Content.FilterLogic.IsFiltered) {
+        if (Content.PreprocessingData.IsFiltered) {
           findAndReplaceDialog.DisableReplace();
         }
@@ -405,8 +405,8 @@
       ComparisonOperation comparisonOperation = findAndReplaceDialog.GetComparisonOperation();
       var foundCells = new Dictionary<int, IList<int>>();
-      for (int i = 0; i < Content.FilterLogic.PreprocessingData.Columns; i++) {
+      for (int i = 0; i < Content.PreprocessingData.Columns; i++) {
         var filters = CreateFilters(match, comparisonOperation, i);
 
-        bool[] filteredRows = Content.FilterLogic.GetFilterResult(filters, true);
+        bool[] filteredRows = GetFilterResult(filters, true);
         var foundIndices = new List<int>();
         for (int idx = 0; idx < filteredRows.Length; ++idx) {
@@ -427,6 +427,23 @@
     }
 
+    private bool[] GetFilterResult(IList<IFilter> filters, bool isAndCombination) {
+      IList<IFilter> activeFilters = filters.Where(f => f.Active && f.ConstraintData != null).ToList();
+
+      if (activeFilters.Count == 0) {
+        return Enumerable.Repeat(false, Content.PreprocessingData.Rows).ToArray(); ;
+      }
+
+      var result = Enumerable.Repeat(!isAndCombination, Content.PreprocessingData.Rows).ToArray();
+      foreach (IFilter filter in activeFilters) {
+        bool[] filterResult = filter.Check();
+        for (int row = 0; row < result.Length; ++row) {
+          result[row] = isAndCombination ? result[row] || filterResult[row] : result[row] && filterResult[row];
+        }
+      }
+      return result;
+    }
+
     private List<IFilter> CreateFilters(string match, ComparisonOperation comparisonOperation, int columnIndex) {
-      IPreprocessingData preprocessingData = Content.FilterLogic.PreprocessingData;
+      IPreprocessingData preprocessingData = Content.PreprocessingData;
       IStringConvertibleValue value;
       if (preprocessingData.VariableHasType<double>(columnIndex)) {
@@ -547,5 +564,5 @@
       base.dataGridView_KeyDown(sender, e);
       //data is in read only mode....
-      if (Content.FilterLogic.IsFiltered) return;
+      if (Content.PreprocessingData.IsFiltered) return;
 
       if (e.KeyCode == Keys.Delete) {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 15274)
@@ -49,10 +49,9 @@
       if (Content != null) {
         var data = Content.Data;
-        var filterLogic = new FilterLogic(data);
         var statisticsLogic = new StatisticsLogic(data);
         var manipulationLogic = new ManipulationLogic(data, statisticsLogic);
 
         var viewShortcuts = new ItemList<IViewShortcut> {
-          new DataGridContent(data, manipulationLogic, filterLogic),
+          new DataGridContent(data, manipulationLogic),
           new StatisticsContent(data, statisticsLogic),
 
@@ -64,7 +63,7 @@
           new DataCompletenessChartContent(data),
 
-          new FilterContent(filterLogic),
-          new ManipulationContent(manipulationLogic, filterLogic),
-          new TransformationContent(data, filterLogic)
+          new FilterContent(data),
+          new ManipulationContent(data, manipulationLogic),
+          new TransformationContent(data)
         };
 
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs	(revision 15274)
@@ -74,6 +74,23 @@
       rBtnAnd.Enabled = (activeFilters > 0);
       rBtnOr.Enabled = (activeFilters > 0);
-      Content.FilterLogic.Reset();
-      bool[] result = Content.FilterLogic.Preview(filters, rBtnAnd.Checked);
+      Content.PreprocessingData.ResetFilter();
+      bool isAndCombination = rBtnAnd.Checked;
+      bool[] ret;
+      IList<IFilter> activeFilters1 = filters.Where(f => f.Active && f.ConstraintData != null).ToList();
+      if (activeFilters1.Count > 0) {
+        var result1 = Enumerable.Repeat(!isAndCombination, Content.PreprocessingData.Rows).ToArray();
+
+        foreach (IFilter filter in activeFilters1) {
+          bool[] filterResult = filter.Check();
+          for (int row = 0; row < result1.Length; ++row) {
+            result1[row] = isAndCombination ? result1[row] || filterResult[row] : result1[row] && filterResult[row];
+          }
+        }
+        Content.PreprocessingData.SetFilter(result1);
+        ret = result1;
+      } else {
+        ret = Enumerable.Repeat(false, Content.PreprocessingData.Rows).ToArray();
+      }
+      bool[] result = ret;
 
       int filteredCnt = result.Count(c => !c);
@@ -89,5 +106,7 @@
         List<IFilter> filters = Content.Filters.ToList();
         //apply filters
-        Content.FilterLogic.Apply(filters, rBtnAnd.Checked);
+        bool isAndCombination = rBtnAnd.Checked;
+        Content.PreprocessingData.PersistFilter();
+        Content.PreprocessingData.ResetFilter();
         //deactivate checked filters
         filters = checkedFilterView.Content.CheckedItems.ToList();
@@ -104,5 +123,5 @@
       if (Content != null) {
         foreach (IFilter filter in e.Items) {
-          filter.ConstrainedValue = Content.FilterLogic.PreprocessingData;
+          filter.ConstrainedValue = Content.PreprocessingData;
         }
       }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs	(revision 15274)
@@ -83,9 +83,9 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+      Content.ManipulationLogic.PreProcessingData.FilterChanged += FilterLogic_FilterChanged;
     }
 
     protected override void DeregisterContentEvents() {
-      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
+      Content.ManipulationLogic.PreProcessingData.FilterChanged -= FilterLogic_FilterChanged;
       base.DeregisterContentEvents();
     }
@@ -98,5 +98,5 @@
 
     private void CheckFilters() {
-      if (Content.FilterLogic.IsFiltered) {
+      if (Content.PreprocessingData.IsFiltered) {
         tabsPreview.SelectedIndex = 0;
         lstMethods.Enabled = false;
@@ -159,5 +159,5 @@
         var filteredColumns = Content.ManipulationLogic.ColumnsWithMissingValuesGreater(GetDeleteColumnsInfo());
         int count = filteredColumns.Count;
-        int columnCount = Content.FilterLogic.PreprocessingData.Columns;
+        int columnCount = Content.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);
 
@@ -190,5 +190,5 @@
         var filteredColumns = Content.ManipulationLogic.ColumnsWithVarianceSmaller(GetDeleteColumnsVariance());
         int count = filteredColumns.Count;
-        int columnCount = Content.FilterLogic.PreprocessingData.Columns;
+        int columnCount = Content.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);
 
@@ -220,5 +220,5 @@
       if (btnApply.Enabled) {
         int count = Content.ManipulationLogic.RowsWithMissingValuesGreater(GetRowsColumnsInfo()).Count;
-        int rowCount = Content.FilterLogic.PreprocessingData.Rows;
+        int rowCount = Content.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) {
@@ -256,5 +256,5 @@
           if (Content.ManipulationLogic.PreProcessingData.IsCellEmpty(columnIndex, rowIndex)) count++;
 
-        int cellCount = Content.FilterLogic.PreprocessingData.Rows * Content.FilterLogic.PreprocessingData.Columns;
+        int cellCount = Content.PreprocessingData.Rows * Content.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;
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs	(revision 15274)
@@ -88,10 +88,11 @@
     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();
+      var data = Content.PreprocessingData;
+      rowsTextBox.Text = data.Rows.ToString();
+      columnsTextBox.Text = data.Rows.ToString();
+      numericColumnsTextBox.Text = GetColumnCount<double>().ToString();
+      nominalColumnsTextBox5.Text = GetColumnCount<string>().ToString();
       missingValuesTextBox.Text = logic.GetMissingValueCount().ToString();
-      totalValuesTextBox.Text = (logic.GetColumnCount() * logic.GetRowCount() - logic.GetMissingValueCount()).ToString();
+      totalValuesTextBox.Text = (data.Rows * data.Rows - logic.GetMissingValueCount()).ToString();
 
       var variableNames = Content.PreprocessingData.VariableNames.ToList();
@@ -107,11 +108,11 @@
         };
 
-      for (int i = 0; i < logic.GetColumnCount(); i++) {
-        var data = GetStatistics(i);
-        for (int j = 0; j < data.Count; j++) {
+      for (int i = 0; i < data.Columns; i++) {
+        var statistics = GetStatistics(i);
+        for (int j = 0; j < statistics.Count; j++) {
           if (horizontal)
-            statisticsMatrix[j, i] = data[j];
+            statisticsMatrix[j, i] = statistics[j];
           else
-            statisticsMatrix[i, j] = data[j];
+            statisticsMatrix[i, j] = statistics[j];
         }
       }
@@ -136,4 +137,14 @@
       stringMatrixView.DataGridView.AutoResizeColumns();
       stringMatrixView.Parent.ResumeRepaint(true);
+    }
+
+    public int GetColumnCount<T>() {
+      int count = 0;
+      for (int i = 0; i < Content.PreprocessingData.Columns; ++i) {
+        if (Content.PreprocessingData.VariableHasType<T>(i)) {
+          ++count;
+        }
+      }
+      return count;
     }
 
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15274)
@@ -51,9 +51,9 @@
 
     protected override void RegisterContentEvents() {
-      Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
+      Content.PreprocessingData.FilterChanged += FilterLogic_FilterChanged;
     }
 
     protected override void DeregisterContentEvents() {
-      Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
+      Content.PreprocessingData.FilterChanged -= FilterLogic_FilterChanged;
     }
 
@@ -65,5 +65,5 @@
 
     private void CheckFilters() {
-      if (Content.FilterLogic.IsFiltered) {
+      if (Content.PreprocessingData.IsFiltered) {
         applyButton.Enabled = false;
         lblFilterNotice.Visible = true;
@@ -82,5 +82,5 @@
       }
 
-      var transformator = new PreprocessingTransformator(Content.Data);
+      var transformator = new PreprocessingTransformator(Content.PreprocessingData);
       bool preserve = preserveColumnsCheckbox.CheckState == CheckState.Checked;
       string errorMsg;
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs	(revision 15274)
@@ -23,17 +23,18 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("Feature Correlation Matrix", "Represents the feature correlation matrix.")]
-  public class CorrelationMatrixContent : Item, IViewShortcut {
+  [StorableClass]
+  public class CorrelationMatrixContent : PreprocessingContent, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Gradient; }
     }
 
+    [Storable]
     public PreprocessingContext Context { get; private set; }
-    public IPreprocessingData PreprocessingData {
-      get { return Context.Data; }
-    }
+
 
     public DataAnalysisProblemData ProblemData {
@@ -47,5 +48,7 @@
     }
 
-    public CorrelationMatrixContent(PreprocessingContext context) {
+    #region Constructor, Cloning & Persistence
+    public CorrelationMatrixContent(PreprocessingContext context)
+      : base(context.Data) {
       Context = context;
     }
@@ -55,8 +58,12 @@
       Context = original.Context;
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new CorrelationMatrixContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected CorrelationMatrixContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public event DataPreprocessingChangedEventHandler Changed {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs	(revision 15274)
@@ -23,27 +23,30 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("Data Completeness Chart", "Represents a datacompleteness chart.")]
-
-  public class DataCompletenessChartContent : Item, IViewShortcut {
+  [StorableClass]
+  public class DataCompletenessChartContent : PreprocessingContent, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.EditBrightnessContrast; }
     }
 
-    public IPreprocessingData PreprocessingData { get; private set; }
-
-    public DataCompletenessChartContent(IPreprocessingData preprocessingData) {
-      PreprocessingData = preprocessingData;
+    #region Constructor, Cloning & Persistence
+    public DataCompletenessChartContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
     }
 
     public DataCompletenessChartContent(DataCompletenessChartContent content, Cloner cloner)
       : base(content, cloner) {
-      PreprocessingData = content.PreprocessingData;
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new DataCompletenessChartContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected DataCompletenessChartContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs	(revision 15274)
@@ -27,17 +27,16 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
-
   [Item("Data Grid", "Represents a data grid.")]
-  public class DataGridContent : Item, IStringConvertibleMatrix, IViewShortcut {
+  [StorableClass]
+  public class DataGridContent : PreprocessingContent, IStringConvertibleMatrix, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Table; }
     }
 
-    public IPreprocessingData PreprocessingData { get; private set; }
-
+    [Storable]
     public ManipulationLogic ManipulationLogic { get; private set; }
-    public FilterLogic FilterLogic { get; private set; }
 
     public int Rows {
@@ -75,17 +74,22 @@
     }
 
-    public DataGridContent(IPreprocessingData preprocessingData, ManipulationLogic theManipulationLogic, FilterLogic theFilterLogic) {
-      ManipulationLogic = theManipulationLogic;
-      FilterLogic = theFilterLogic;
-      PreprocessingData = preprocessingData;
+    #region Constructor, Cloning & Persistence
+    public DataGridContent(IFilteredPreprocessingData preprocessingData, ManipulationLogic manipulationLogic)
+      : base(preprocessingData) {
+      ManipulationLogic = manipulationLogic;
     }
 
-    public DataGridContent(DataGridContent dataGridContent, Cloner cloner)
-      : base(dataGridContent, cloner) {
-
+    public DataGridContent(DataGridContent original, Cloner cloner)
+      : base(original, cloner) {
+      ManipulationLogic = cloner.Clone(original.ManipulationLogic);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new DataGridContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected DataGridContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public void DeleteRows(IEnumerable<int> rows) {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs	(revision 15274)
@@ -24,31 +24,39 @@
 using HeuristicLab.Core;
 using HeuristicLab.DataPreprocessing.Filter;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("Filter", "Represents the filter grid.")]
-  public class FilterContent : Item, IViewShortcut {
+  [StorableClass]
+  public class FilterContent : PreprocessingContent, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Filter; }
     }
-
-    public FilterLogic FilterLogic { get; private set; }
-
+    [Storable]
     public ICheckedItemCollection<IFilter> Filters { get; private set; }
 
+    [Storable]
     public bool IsAndCombination { get; set; }
 
-    public FilterContent(FilterLogic filterLogic) {
+    #region Constructor, Cloning & Persistence
+    public FilterContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
       Filters = new CheckedItemCollection<IFilter>();
       IsAndCombination = true;
-      FilterLogic = filterLogic;
     }
 
-    protected FilterContent(FilterContent content, Cloner cloner)
-      : base(content, cloner) {
+    protected FilterContent(FilterContent original, Cloner cloner)
+      : base(original, cloner) {
+      Filters = cloner.Clone(original.Filters);
+      IsAndCombination = original.IsAndCombination;
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new FilterContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected FilterContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs	(revision 15274)
@@ -26,7 +26,9 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("Histogram", "Represents the histogram grid.")]
+  [StorableClass]
   public class HistogramContent : PreprocessingChartContent {
     public static new Image StaticItemImage {
@@ -34,11 +36,16 @@
     }
 
+    [Storable]
     public string GroupingVariableName { get; set; }
 
+    [Storable]
     public int Bins { get; set; }
+    [Storable]
     public bool ExactBins { get; set; }
 
+    [Storable]
     public LegendOrder Order { get; set; }
 
+    #region Constructor, Cloning & Persistence
     public HistogramContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
@@ -47,10 +54,19 @@
     }
 
-    public HistogramContent(HistogramContent content, Cloner cloner)
-      : base(content, cloner) {
+    public HistogramContent(HistogramContent original, Cloner cloner)
+      : base(original, cloner) {
+      GroupingVariableName = original.GroupingVariableName;
+      Bins = original.Bins;
+      ExactBins = original.ExactBins;
+      Order = original.Order;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new HistogramContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected HistogramContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public static DataTable CreateHistogram(IFilteredPreprocessingData preprocessingData, string variableName, string groupingVariableName, DataTableVisualProperties.DataTableHistogramAggregation aggregation, LegendOrder legendOrder = LegendOrder.Alphabetically) {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs	(revision 15274)
@@ -23,15 +23,19 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
-
   [Item("Line Chart", "Represents the line chart grid.")]
+  [StorableClass]
   public class LineChartContent : PreprocessingChartContent {
-    public bool AllInOneMode { get; set; }
-
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
     }
 
+    [Storable]
+    public bool AllInOneMode { get; set; }
+
+
+    #region Constructor, Cloning & Persistence
     public LineChartContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
@@ -39,11 +43,16 @@
     }
 
-    public LineChartContent(LineChartContent content, Cloner cloner)
-      : base(content, cloner) {
-      this.AllInOneMode = content.AllInOneMode;
+    public LineChartContent(LineChartContent original, Cloner cloner)
+      : base(original, cloner) {
+      AllInOneMode = original.AllInOneMode;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new LineChartContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected LineChartContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs	(revision 15274)
@@ -23,26 +23,35 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
-
   [Item("Manipulation", "Represents the available manipulations on a data set.")]
-  public class ManipulationContent : Item, IViewShortcut {
+  [StorableClass]
+  public class ManipulationContent : PreprocessingContent, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
     }
 
+    [Storable]
     public ManipulationLogic ManipulationLogic { get; private set; }
-    public FilterLogic FilterLogic { get; private set; }
 
-    public ManipulationContent(ManipulationLogic manipulationLogic, FilterLogic filterLogic) {
+    #region Constructor, Cloning & Persistence
+    public ManipulationContent(IFilteredPreprocessingData preprocessingData, ManipulationLogic manipulationLogic)
+      : base(preprocessingData) {
       ManipulationLogic = manipulationLogic;
-      FilterLogic = filterLogic;
     }
 
-    public ManipulationContent(ManipulationContent content, Cloner cloner) : base(content, cloner) { }
-
+    public ManipulationContent(ManipulationContent original, Cloner cloner) :
+      base(original, cloner) {
+      ManipulationLogic = cloner.Clone(original.ManipulationLogic);
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new ManipulationContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected ManipulationContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs	(revision 15274)
@@ -23,8 +23,9 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
-
   [Item("Multi Scatter Plot", "Represents a multi scatter plot.")]
+  [StorableClass]
   public class MultiScatterPlotContent : ScatterPlotContent {
     public static new Image StaticItemImage {
@@ -32,15 +33,20 @@
     }
 
+    #region Constructor, Cloning & Persistence
     public MultiScatterPlotContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
     }
 
-    public MultiScatterPlotContent(MultiScatterPlotContent content, Cloner cloner)
-      : base(content, cloner) {
+    public MultiScatterPlotContent(MultiScatterPlotContent original, Cloner cloner)
+      : base(original, cloner) {
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new MultiScatterPlotContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected MultiScatterPlotContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs	(revision 15274)
@@ -29,8 +29,10 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("PreprocessingChart", "Represents a preprocessing chart.")]
-  public class PreprocessingChartContent : Item, IViewShortcut {
+  [StorableClass]
+  public class PreprocessingChartContent : PreprocessingContent, IViewShortcut {
     public enum LegendOrder {
       Alphabetically,
@@ -42,14 +44,14 @@
     }
 
-    private ICheckedItemList<StringValue> variableItemList = null;
+    [Storable]
+    private ICheckedItemList<StringValue> variableItemList;
     public ICheckedItemList<StringValue> VariableItemList {
       get {
         if (variableItemList == null)
           variableItemList = CreateVariableItemList(PreprocessingData);
-        return this.variableItemList;
+        return variableItemList;
       }
     }
 
-    public IFilteredPreprocessingData PreprocessingData { get; private set; }
     public event DataPreprocessingChangedEventHandler Changed {
       add { PreprocessingData.Changed += value; }
@@ -57,16 +59,21 @@
     }
 
-    public PreprocessingChartContent(IFilteredPreprocessingData preprocessingData) {
-      PreprocessingData = preprocessingData;
+    #region Constructor, Cloning & Persistence
+    public PreprocessingChartContent(IFilteredPreprocessingData preprocessingData)
+       : base(preprocessingData) {
     }
 
-    public PreprocessingChartContent(PreprocessingChartContent content, Cloner cloner)
-      : base(content, cloner) {
-      this.PreprocessingData = content.PreprocessingData;
-      this.variableItemList = cloner.Clone<ICheckedItemList<StringValue>>(variableItemList);
+    public PreprocessingChartContent(PreprocessingChartContent original, Cloner cloner)
+      : base(original, cloner) {
+      variableItemList = cloner.Clone(original.variableItemList);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new PreprocessingChartContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected PreprocessingChartContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public DataRow CreateDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingContent.cs	(revision 15274)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingContent.cs	(revision 15274)
@@ -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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("PreprocessingContent", "")]
+  [StorableClass]
+  public abstract class PreprocessingContent : Item {
+
+    public IFilteredPreprocessingData PreprocessingData { get; private set; }
+
+    #region Constructor, Cloning & Persistence
+    protected PreprocessingContent(IFilteredPreprocessingData preprocessingData) {
+      PreprocessingData = preprocessingData;
+    }
+
+    protected PreprocessingContent(PreprocessingContent original, Cloner cloner)
+      : base(original, cloner) {
+      PreprocessingData = cloner.Clone(original.PreprocessingData);
+    }
+
+    [StorableConstructor]
+    protected PreprocessingContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+  }
+}
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 15274)
@@ -25,18 +25,29 @@
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Visualization.ChartControlsExtensions;
 
 namespace HeuristicLab.DataPreprocessing {
-
+  [Item("ScatterPlotContent", "")]
+  [StorableClass]
   public abstract class ScatterPlotContent : PreprocessingChartContent {
+    [Storable]
     public string GroupingVariable { get; set; }
 
+    #region Constructor, Cloning & Persistence
     protected ScatterPlotContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
     }
 
-    protected ScatterPlotContent(ScatterPlotContent content, Cloner cloner)
-      : base(content, cloner) {
+    protected ScatterPlotContent(ScatterPlotContent original, Cloner cloner)
+      : base(original, cloner) {
+      GroupingVariable = original.GroupingVariable;
     }
+
+    [StorableConstructor]
+    protected ScatterPlotContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public static ScatterPlot CreateScatterPlot(IFilteredPreprocessingData preprocessingData, string variableNameX, string variableNameY, string variableNameGroup = "-", LegendOrder legendOrder = LegendOrder.Alphabetically) {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs	(revision 15274)
@@ -23,8 +23,9 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
-
   [Item("Scatter Plot", "Represents a scatter plot.")]
+  [StorableClass]
   public class SingleScatterPlotContent : ScatterPlotContent {
     public static new Image StaticItemImage {
@@ -32,21 +33,27 @@
     }
 
+    [Storable]
     public string SelectedXVariable { get; set; }
+    [Storable]
     public string SelectedYVariable { get; set; }
 
+    #region Constructor, Cloning & Persistence
     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 SingleScatterPlotContent(SingleScatterPlotContent original, Cloner cloner)
+      : base(original, cloner) {
+      SelectedXVariable = original.SelectedXVariable;
+      SelectedYVariable = original.SelectedYVariable;
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new SingleScatterPlotContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected SingleScatterPlotContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs	(revision 15274)
@@ -23,27 +23,35 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("Statistics", "Represents the statistics grid.")]
-  public class StatisticsContent : Item, IViewShortcut {
+  [StorableClass]
+  public class StatisticsContent : PreprocessingContent, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
     }
 
-    public IPreprocessingData PreprocessingData { get; private set; }
+    [Storable]
     public StatisticsLogic StatisticsLogic { get; private set; }
 
-    public StatisticsContent(IPreprocessingData preProcessingData, StatisticsLogic statisticsLogic) {
-      PreprocessingData = preProcessingData;
+    #region Constructor, Cloning & Persistence
+    public StatisticsContent(IFilteredPreprocessingData preprocessingData, StatisticsLogic statisticsLogic)
+      : base(preprocessingData) {
       StatisticsLogic = statisticsLogic;
     }
 
-    public StatisticsContent(StatisticsContent content, Cloner cloner)
-      : base(content, cloner) {
+    public StatisticsContent(StatisticsContent original, Cloner cloner)
+      : base(original, cloner) {
+      StatisticsLogic = cloner.Clone(original.StatisticsLogic);
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new StatisticsContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected StatisticsContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public event DataPreprocessingChangedEventHandler Changed {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15274)
@@ -23,33 +23,36 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.DataPreprocessing {
   [Item("Transformation", "Represents the transformation grid.")]
-  public class TransformationContent : Item, IViewShortcut {
+  [StorableClass]
+  public class TransformationContent : PreprocessingContent, 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; }
-
+    [Storable]
     public ICheckedItemList<ITransformation> CheckedTransformationList { get; private set; }
 
-    public TransformationContent(IPreprocessingData data, FilterLogic filterLogic) {
-      Data = data;
+    #region Constructor, Cloning & Persistence
+    public TransformationContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
       CheckedTransformationList = new CheckedItemList<ITransformation>();
-      FilterLogic = filterLogic;
     }
 
     public TransformationContent(TransformationContent original, Cloner cloner)
       : base(original, cloner) {
-      Data = original.Data;
-      CheckedTransformationList = new CheckedItemList<ITransformation>(original.CheckedTransformationList);
+      CheckedTransformationList = cloner.Clone(original.CheckedTransformationList);
     }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new TransformationContent(this, cloner);
     }
+
+    [StorableConstructor]
+    protected TransformationContent(bool deserializing)
+      : base(deserializing) { }
+    #endregion
   }
 }
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15274)
@@ -42,5 +42,5 @@
     }
 
-    #region Constructor, Cloning & Persistance
+    #region Constructor, Cloning & Persistence
     public FilteredPreprocessingData(IPreprocessingData preporcessingData)
       : base() {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15274)
@@ -42,5 +42,5 @@
     protected IList<string> variableNames;
 
-    #region Constructor, Cloning & Persistance
+    #region Constructor, Cloning & Persistence
     public PreprocessingData(IDataAnalysisProblemData problemData)
       : base() {
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 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15274)
@@ -119,4 +119,5 @@
   <ItemGroup>
     <Compile Include="Content\MultiScatterPlotContent.cs" />
+    <Compile Include="Content\PreprocessingContent.cs" />
     <Compile Include="Content\SingleScatterPlotContent.cs" />
     <Compile Include="Content\ScatterPlotContent.cs" />
@@ -135,5 +136,4 @@
     <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" />
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs	(revision 15273)
+++ 	(revision )
@@ -1,93 +1,0 @@
-﻿#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();
-    }
-
-    private 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 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs	(revision 15274)
@@ -23,10 +23,19 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Random;
 
 namespace HeuristicLab.DataPreprocessing {
-  public class ManipulationLogic {
-    private readonly IPreprocessingData preprocessingData;
+  [Item("ManipulationLogic", "")]
+  [StorableClass]
+  public class ManipulationLogic : Item {
+
+    [Storable]
+    private readonly IFilteredPreprocessingData preprocessingData;
+
+    [Storable]
     private readonly StatisticsLogic statisticsLogic;
 
@@ -35,12 +44,26 @@
     }
 
-    public IPreprocessingData PreProcessingData {
+    public IFilteredPreprocessingData PreProcessingData {
       get { return preprocessingData; }
     }
 
-    public ManipulationLogic(IPreprocessingData preprocessingData, StatisticsLogic theStatisticsLogic) {
+    #region Constructor, Cloning & Persistence
+    public ManipulationLogic(IFilteredPreprocessingData preprocessingData, StatisticsLogic theStatisticsLogic) {
       this.preprocessingData = preprocessingData;
       statisticsLogic = theStatisticsLogic;
     }
+    public ManipulationLogic(ManipulationLogic original, Cloner cloner)
+      : base(original, cloner) {
+      preprocessingData = cloner.Clone(original.preprocessingData);
+      statisticsLogic = cloner.Clone(original.statisticsLogic);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ManipulationLogic(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected ManipulationLogic(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public void ReplaceIndicesByValue<T>(int columnIndex, IEnumerable<int> rowIndices, T value) {
@@ -123,8 +146,8 @@
       for (int i = 0; i < count; ++i) {
         if (start == int.MinValue) {
-          start = indexOfPrevPresentValue(column.Key, rowIndices[i]);
+          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]);
+          int next = IndexOfNextPresentValue(column.Key, rowIndices[i]);
           if (start > 0 && next < preprocessingData.Rows) {
             startEndings.Add(new Tuple<int, int>(start, next));
@@ -144,6 +167,6 @@
             // dont replace first or last values
             if (index > 0 && index < countValues) {
-              int prevIndex = indexOfPrevPresentValue(column.Key, index);
-              int nextIndex = indexOfNextPresentValue(column.Key, index);
+              int prevIndex = IndexOfPrevPresentValue(column.Key, index);
+              int nextIndex = IndexOfNextPresentValue(column.Key, index);
 
               // no neighbours found
@@ -183,5 +206,5 @@
     }
 
-    private int indexOfPrevPresentValue(int columnIndex, int start) {
+    private int IndexOfPrevPresentValue(int columnIndex, int start) {
       int offset = start - 1;
       while (offset >= 0 && preprocessingData.IsCellEmpty(columnIndex, offset)) {
@@ -192,5 +215,5 @@
     }
 
-    private int indexOfNextPresentValue(int columnIndex, int start) {
+    private int IndexOfNextPresentValue(int columnIndex, int start) {
       int offset = start + 1;
       while (offset < preprocessingData.Rows && preprocessingData.IsCellEmpty(columnIndex, offset)) {
Index: branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs
===================================================================
--- branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs	(revision 15273)
+++ branches/DataPreprocessing Cleanup/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs	(revision 15274)
@@ -24,35 +24,30 @@
 using System.Linq;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.DataPreprocessing {
-  public class StatisticsLogic {
+  [Item("StatisticsLogic", "")]
+  [StorableClass]
+  public class StatisticsLogic : Item {
+    [Storable]
     private readonly IPreprocessingData preprocessingData;
 
+    #region Constructor, Cloning & Persistence
     public StatisticsLogic(IPreprocessingData preprocessingData) {
       this.preprocessingData = preprocessingData;
     }
-
-    public int GetColumnCount() {
-      return preprocessingData.Columns;
-    }
-
-    public int GetRowCount() {
-      return preprocessingData.Rows;
-    }
-
-    public int GetNumericColumnCount() {
-      int count = 0;
-
-      for (int i = 0; i < preprocessingData.Columns; ++i) {
-        if (preprocessingData.VariableHasType<double>(i)) {
-          ++count;
-        }
-      }
-      return count;
-    }
-
-    public int GetNominalColumnCount() {
-      return preprocessingData.Columns - GetNumericColumnCount();
-    }
+    public StatisticsLogic(StatisticsLogic original, Cloner cloner)
+      : base(original, cloner) {
+      preprocessingData = cloner.Clone(original.preprocessingData);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StatisticsLogic(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected StatisticsLogic(bool deserializing)
+      : base(deserializing) { }
+    #endregion
 
     public int GetMissingValueCount() {
