Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridContent.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridContent.cs	(revision 10367)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/DataGridContent.cs	(revision 10369)
@@ -11,6 +11,6 @@
 
     private readonly IDataGridLogic dataGridLogic;
-    private readonly IPreprocessingDataManipulation preprocessingDataManipulation;
-    public DataGridContent(IDataGridLogic theDataGridLogic, IPreprocessingDataManipulation thePreprocessingDataManipulation) {
+    private readonly IManipulationLogic preprocessingDataManipulation;
+    public DataGridContent(IDataGridLogic theDataGridLogic, IManipulationLogic thePreprocessingDataManipulation) {
       dataGridLogic = theDataGridLogic;
       preprocessingDataManipulation = thePreprocessingDataManipulation;
@@ -21,5 +21,5 @@
     }
 
-    public IPreprocessingDataManipulation PreprocessingDataManipulation {
+    public IManipulationLogic PreprocessingDataManipulation {
       get { return preprocessingDataManipulation; }
     }
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/ManipulationLogic.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/ManipulationLogic.cs	(revision 10369)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/ManipulationLogic.cs	(revision 10369)
@@ -0,0 +1,157 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.DataPreprocessing {
+  public class ManipulationLogic : IManipulationLogic {
+    private IPreprocessingData preprocessingData;
+    private IStatisticsLogic statisticInfo;
+    private ISearchLogic searchLogic;
+
+    public ManipulationLogic(IPreprocessingData _prepocessingData, ISearchLogic theSearchLogic, IStatisticsLogic theStatisticsLogic) {
+      preprocessingData = _prepocessingData;
+      searchLogic = theSearchLogic;
+      statisticInfo = theStatisticsLogic;
+    }
+
+    public void ReplaceIndicesByValue<T>(int columnIndex, IEnumerable<int> rowIndices, T value) {
+      foreach (int index in rowIndices) {
+        preprocessingData.SetCell<T>(columnIndex, index, value);
+      }
+    }
+
+    public void ReplaceIndicesByAverageValue(int columnIndex, IEnumerable<int> rowIndices) {
+      double average = statisticInfo.GetAverage(columnIndex);
+      ReplaceIndicesByValue<double>(columnIndex, rowIndices, average);
+    }
+
+    public void ReplaceIndicesByMedianValue(int columnIndex, IEnumerable<int> rowIndices) {
+      double median = statisticInfo.GetMedian(columnIndex);
+      ReplaceIndicesByValue<double>(columnIndex, rowIndices, median);
+    }
+
+    public void ReplaceIndicesByRandomValue(int columnIndex, IEnumerable<int> rowIndices) {
+      Random r = new Random();
+
+      double max = statisticInfo.GetMax<double>(columnIndex);
+      double min = statisticInfo.GetMin<double>(columnIndex);
+      double randMultiplier = (max - min);
+      foreach (int index in rowIndices) {
+        double rand = r.NextDouble() * randMultiplier + min;
+        preprocessingData.SetCell<double>(columnIndex, index, rand);
+      }
+    }
+
+    public void ReplaceIndicesByLinearInterpolationOfNeighbours(int columnIndex, IEnumerable<int> rowIndices) {
+      int countValues = preprocessingData.GetValues<double>(columnIndex).Count();
+      foreach (int index in rowIndices) {
+        // dont replace first or last values
+        if (index > 0 && index < countValues) {
+          int prevIndex = indexOfPrevPresentValue(columnIndex, index);
+          int nextIndex = indexOfNextPresentValue(columnIndex, index);
+
+          // no neighbours found
+          if (prevIndex < 0 && nextIndex >= countValues) {
+            continue;
+          }
+          double prev = preprocessingData.GetCell<double>(columnIndex, prevIndex);
+          double next = preprocessingData.GetCell<double>(columnIndex, nextIndex);
+
+          int valuesToInterpolate = nextIndex - prevIndex;
+
+          double interpolationStep = (prev + next) / valuesToInterpolate;
+
+          for (int i = prevIndex; i < nextIndex; ++i) {
+            double interpolated = prev + (interpolationStep * (i - prevIndex));
+            preprocessingData.SetCell<double>(columnIndex, i, interpolated);
+          }
+        }
+      }
+    }
+
+    private int indexOfPrevPresentValue(int columnIndex, int start) {
+      int offset = start - 1;
+      while (offset >= 0 && searchLogic.IsMissingValue(columnIndex, offset)) {
+        offset--;
+      }
+
+      return offset;
+    }
+
+    private int indexOfNextPresentValue(int columnIndex, int start) {
+      int offset = start + 1;
+      while (offset < preprocessingData.Rows && searchLogic.IsMissingValue(columnIndex, offset)) {
+        offset++;
+      }
+
+      return offset;
+    }
+
+    public void ReplaceIndicesByMostCommonValue(int columnIndex, IEnumerable<int> rowIndices) {
+      if (preprocessingData.IsType<double>(columnIndex)) {
+        ReplaceIndicesByValue<double>(columnIndex, rowIndices, statisticInfo.GetMostCommonValue<double>(columnIndex));
+      } else if (preprocessingData.IsType<string>(columnIndex)) {
+        ReplaceIndicesByValue<string>(columnIndex, rowIndices, statisticInfo.GetMostCommonValue<string>(columnIndex));
+      } else if (preprocessingData.IsType<DateTime>(columnIndex)) {
+        ReplaceIndicesByValue<DateTime>(columnIndex, rowIndices, statisticInfo.GetMostCommonValue<DateTime>(columnIndex));
+      } else {
+        throw new ArgumentException("column with index: " + columnIndex + " contains a non supported type.");
+      }
+    }
+
+    public void ShuffleWithRanges(IEnumerable<IntRange> ranges) {
+      // init random outside loop
+      Random random = new Random();
+
+      // process all given ranges - e.g. TrainingPartition, Trainingpartition
+      foreach (IntRange range in ranges) {
+        List<Tuple<int, int>> shuffledIndices = new List<Tuple<int, int>>();
+
+        // generate random indices used for shuffeling each column
+        for (int i = range.End; i > range.Start; --i) {
+          int rand = random.Next(range.Start, i);
+          shuffledIndices.Add(new Tuple<int, int>(i, rand));
+        }
+
+        reOrderToIndices(shuffledIndices);
+      }
+    }
+
+    public void reOrderToIndices(IEnumerable<int> indices) {
+      List<Tuple<int, int>> indicesTuple = new List<Tuple<int, int>>();
+
+      for (int i = 0; i < indices.Count(); ++i) {
+        indicesTuple.Add(new Tuple<int, int>(i, indices.ElementAt(i)));
+      }
+
+      reOrderToIndices(indicesTuple);
+    }
+
+    public void reOrderToIndices(IList<System.Tuple<int, int>> indices) {
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        if (preprocessingData.IsType<double>(i)) {
+          reOrderToIndices<double>(i, indices);
+        } else if (preprocessingData.IsType<string>(i)) {
+          reOrderToIndices<string>(i, indices);
+        } else if (preprocessingData.IsType<DateTime>(i)) {
+          reOrderToIndices<DateTime>(i, indices);
+        }
+      }
+    }
+
+    private void reOrderToIndices<T>(int columnIndex, IList<Tuple<int, int>> indices) {
+
+      List<T> originalData = new List<T>(preprocessingData.GetValues<T>(columnIndex));
+
+      // process all columns equally
+      foreach (Tuple<int, int> index in indices) {
+        int originalIndex = index.Item1;
+        int replaceIndex = index.Item2;
+
+        T replaceValue = originalData.ElementAt<T>(replaceIndex);
+        preprocessingData.SetCell<T>(columnIndex, originalIndex, replaceValue);
+      }
+    }
+  }
+}
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/PreprocessingDataManipulation.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/PreprocessingDataManipulation.cs	(revision 10367)
+++ 	(revision )
@@ -1,157 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Data;
-
-namespace HeuristicLab.DataPreprocessing {
-  public class PreprocessingDataManipulation : IPreprocessingDataManipulation {
-    private IPreprocessingData preprocessingData;
-    private IStatisticsLogic statisticInfo;
-    private ISearchLogic searchLogic;
-
-    public PreprocessingDataManipulation(IPreprocessingData _prepocessingData, ISearchLogic theSearchLogic, IStatisticsLogic theStatisticsLogic) {
-      preprocessingData = _prepocessingData;
-      searchLogic = theSearchLogic;
-      statisticInfo = theStatisticsLogic;
-    }
-
-    public void ReplaceIndicesByValue<T>(int columnIndex, IEnumerable<int> rowIndices, T value) {
-      foreach (int index in rowIndices) {
-        preprocessingData.SetCell<T>(columnIndex, index, value);
-      }
-    }
-
-    public void ReplaceIndicesByAverageValue(int columnIndex, IEnumerable<int> rowIndices) {
-      double average = statisticInfo.GetAverage(columnIndex);
-      ReplaceIndicesByValue<double>(columnIndex, rowIndices, average);
-    }
-
-    public void ReplaceIndicesByMedianValue(int columnIndex, IEnumerable<int> rowIndices) {
-      double median = statisticInfo.GetMedian(columnIndex);
-      ReplaceIndicesByValue<double>(columnIndex, rowIndices, median);
-    }
-
-    public void ReplaceIndicesByRandomValue(int columnIndex, IEnumerable<int> rowIndices) {
-      Random r = new Random();
-
-      double max = statisticInfo.GetMax<double>(columnIndex);
-      double min = statisticInfo.GetMin<double>(columnIndex);
-      double randMultiplier = (max - min);
-      foreach (int index in rowIndices) {
-        double rand = r.NextDouble() * randMultiplier + min;
-        preprocessingData.SetCell<double>(columnIndex, index, rand);
-      }
-    }
-
-    public void ReplaceIndicesByLinearInterpolationOfNeighbours(int columnIndex, IEnumerable<int> rowIndices) {
-      int countValues = preprocessingData.GetValues<double>(columnIndex).Count();
-      foreach (int index in rowIndices) {
-        // dont replace first or last values
-        if (index > 0 && index < countValues) {
-          int prevIndex = indexOfPrevPresentValue(columnIndex, index);
-          int nextIndex = indexOfNextPresentValue(columnIndex, index);
-
-          // no neighbours found
-          if (prevIndex < 0 && nextIndex >= countValues) {
-            continue;
-          }
-          double prev = preprocessingData.GetCell<double>(columnIndex, prevIndex);
-          double next = preprocessingData.GetCell<double>(columnIndex, nextIndex);
-
-          int valuesToInterpolate = nextIndex - prevIndex;
-
-          double interpolationStep = (prev + next) / valuesToInterpolate;
-
-          for (int i = prevIndex; i < nextIndex; ++i) {
-            double interpolated = prev + (interpolationStep * (i - prevIndex));
-            preprocessingData.SetCell<double>(columnIndex, i, interpolated);
-          }
-        }
-      }
-    }
-
-    private int indexOfPrevPresentValue(int columnIndex, int start) {
-      int offset = start - 1;
-      while (offset >= 0 && searchLogic.IsMissingValue(columnIndex, offset)) {
-        offset--;
-      }
-
-      return offset;
-    }
-
-    private int indexOfNextPresentValue(int columnIndex, int start) {
-      int offset = start + 1;
-      while (offset < preprocessingData.Rows && searchLogic.IsMissingValue(columnIndex, offset)) {
-        offset++;
-      }
-
-      return offset;
-    }
-
-    public void ReplaceIndicesByMostCommonValue(int columnIndex, IEnumerable<int> rowIndices) {
-      if (preprocessingData.IsType<double>(columnIndex)) {
-        ReplaceIndicesByValue<double>(columnIndex, rowIndices, statisticInfo.GetMostCommonValue<double>(columnIndex));
-      } else if (preprocessingData.IsType<string>(columnIndex)) {
-        ReplaceIndicesByValue<string>(columnIndex, rowIndices, statisticInfo.GetMostCommonValue<string>(columnIndex));
-      } else if (preprocessingData.IsType<DateTime>(columnIndex)) {
-        ReplaceIndicesByValue<DateTime>(columnIndex, rowIndices, statisticInfo.GetMostCommonValue<DateTime>(columnIndex));
-      } else {
-        throw new ArgumentException("column with index: " + columnIndex + " contains a non supported type.");
-      }
-    }
-
-    public void ShuffleWithRanges(IEnumerable<IntRange> ranges) {
-      // init random outside loop
-      Random random = new Random();
-
-      // process all given ranges - e.g. TrainingPartition, Trainingpartition
-      foreach (IntRange range in ranges) {
-        List<Tuple<int, int>> shuffledIndices = new List<Tuple<int, int>>();
-
-        // generate random indices used for shuffeling each column
-        for (int i = range.End; i > range.Start; --i) {
-          int rand = random.Next(range.Start, i);
-          shuffledIndices.Add(new Tuple<int, int>(i, rand));
-        }
-
-        reOrderToIndices(shuffledIndices);
-      }
-    }
-
-    public void reOrderToIndices(IEnumerable<int> indices) {
-      List<Tuple<int, int>> indicesTuple = new List<Tuple<int, int>>();
-
-      for (int i = 0; i < indices.Count(); ++i) {
-        indicesTuple.Add(new Tuple<int, int>(i, indices.ElementAt(i)));
-      }
-
-      reOrderToIndices(indicesTuple);
-    }
-
-    public void reOrderToIndices(IList<System.Tuple<int, int>> indices) {
-      for (int i = 0; i < preprocessingData.Columns; ++i) {
-        if (preprocessingData.IsType<double>(i)) {
-          reOrderToIndices<double>(i, indices);
-        } else if (preprocessingData.IsType<string>(i)) {
-          reOrderToIndices<string>(i, indices);
-        } else if (preprocessingData.IsType<DateTime>(i)) {
-          reOrderToIndices<DateTime>(i, indices);
-        }
-      }
-    }
-
-    private void reOrderToIndices<T>(int columnIndex, IList<Tuple<int, int>> indices) {
-
-      List<T> originalData = new List<T>(preprocessingData.GetValues<T>(columnIndex));
-
-      // process all columns equally
-      foreach (Tuple<int, int> index in indices) {
-        int originalIndex = index.Item1;
-        int replaceIndex = index.Item2;
-
-        T replaceValue = originalData.ElementAt<T>(replaceIndex);
-        preprocessingData.SetCell<T>(columnIndex, originalIndex, replaceValue);
-      }
-    }
-  }
-}
Index: branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/StatisticsLogic.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/StatisticsLogic.cs	(revision 10367)
+++ branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.3/Implementations/StatisticsLogic.cs	(revision 10369)
@@ -25,6 +25,7 @@
     public int GetNumericColumnCount() {
       int count = 0;
-      foreach (var variableName in preprocessingData.VariableNames) {
-        if (preprocessingData.IsType<double>(variableName)) {
+
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        if (preprocessingData.IsType<double>(i)) {
           ++count;
         }
@@ -39,5 +40,5 @@
     public int GetMissingValueCount() {
       int count = 0;
-      for(int i = 0; i < preprocessingData.Columns; ++i){
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
         count += GetMissingValueCount(i);
       }
@@ -104,5 +105,5 @@
     public int GetRowMissingValueCount(int rowIndex) {
       int count = 0;
-       for(int i = 0; i < preprocessingData.Columns; ++i){
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
         if (searchLogic.IsMissingValue(i, rowIndex)) {
           ++count;
