Index: stable/HeuristicLab.DataPreprocessing/3.4/Implementations/DataGridContent.cs
===================================================================
--- stable/HeuristicLab.DataPreprocessing/3.4/Implementations/DataGridContent.cs	(revision 13151)
+++ stable/HeuristicLab.DataPreprocessing/3.4/Implementations/DataGridContent.cs	(revision 13289)
@@ -41,6 +41,4 @@
     public IFilterLogic FilterLogic { get; private set; }
 
-    private IEnumerable<string> rowNames;
-
     public int Rows {
       get {
@@ -72,8 +70,8 @@
     public IEnumerable<string> RowNames {
       get {
-        return rowNames;
+        return Enumerable.Range(1, Rows).Select(n => n.ToString());
       }
       set {
-        //not supported
+        throw new NotSupportedException();
       }
     }
@@ -84,5 +82,5 @@
       }
       set {
-        //not supported
+        throw new NotSupportedException();
       }
     }
@@ -103,5 +101,4 @@
       FilterLogic = theFilterLogic;
       PreProcessingData = preProcessingData;
-      createRowNames();
     }
 
@@ -116,5 +113,4 @@
     public void DeleteRows(IEnumerable<int> rows) {
       PreProcessingData.DeleteRowsWithIndices(rows);
-      createRowNames();
     }
 
@@ -133,8 +129,4 @@
     public bool SetValue(string value, int rowIndex, int columnIndex) {
       return PreProcessingData.SetValue(value, columnIndex, rowIndex);
-    }
-
-    private void createRowNames() {
-      rowNames = Enumerable.Range(1, Rows).Select(n => n.ToString());
     }
 
Index: stable/HeuristicLab.DataPreprocessing/3.4/Implementations/FilteredPreprocessingData.cs
===================================================================
--- stable/HeuristicLab.DataPreprocessing/3.4/Implementations/FilteredPreprocessingData.cs	(revision 13151)
+++ stable/HeuristicLab.DataPreprocessing/3.4/Implementations/FilteredPreprocessingData.cs	(revision 13289)
@@ -119,4 +119,16 @@
         throw new InvalidOperationException("DeleteColumn not possible while data is filtered");
       originalData.DeleteColumn(columnIndex);
+    }
+
+    public void RenameColumn(int columnIndex, string name) {
+      if (IsFiltered)
+        throw new InvalidOperationException("RenameColumn not possible while data is filtered");
+      originalData.RenameColumn(columnIndex, name);
+    }
+
+    public void RenameColumns(IList<string> names) {
+      if (IsFiltered)
+        throw new InvalidOperationException("RenameColumns not possible while data is filtered");
+      originalData.RenameColumns(names);
     }
 
Index: stable/HeuristicLab.DataPreprocessing/3.4/Implementations/PreprocessingData.cs
===================================================================
--- stable/HeuristicLab.DataPreprocessing/3.4/Implementations/PreprocessingData.cs	(revision 13151)
+++ stable/HeuristicLab.DataPreprocessing/3.4/Implementations/PreprocessingData.cs	(revision 13289)
@@ -196,4 +196,7 @@
     public abstract void DeleteColumn(int columnIndex);
 
+    public abstract void RenameColumn(int columnIndex, string name);
+    public abstract void RenameColumns(IList<string> list);
+
     public abstract Dataset ExportToDataset();
 
Index: stable/HeuristicLab.DataPreprocessing/3.4/Implementations/TransactionalPreprocessingData.cs
===================================================================
--- stable/HeuristicLab.DataPreprocessing/3.4/Implementations/TransactionalPreprocessingData.cs	(revision 13151)
+++ stable/HeuristicLab.DataPreprocessing/3.4/Implementations/TransactionalPreprocessingData.cs	(revision 13289)
@@ -98,4 +98,10 @@
     public override void SetCell<T>(int columnIndex, int rowIndex, T value) {
       SaveSnapshot(DataPreprocessingChangedEventType.ChangeItem, columnIndex, rowIndex);
+
+      for (int i = Rows; i <= rowIndex; i++)
+        InsertRow(i);
+      for (int i = Columns; i <= columnIndex; i++)
+        InsertColumn<T>(i.ToString(), i);
+
       variableValues[columnIndex][rowIndex] = value;
       if (!IsInTransaction)
@@ -116,5 +122,5 @@
 
     public override bool VariableHasType<T>(int columnIndex) {
-      return variableValues[columnIndex] is List<T>;
+      return columnIndex >= variableValues.Count || variableValues[columnIndex] is List<T>;
     }
 
@@ -219,4 +225,5 @@
       if (!IsInTransaction)
         OnChanged(DataPreprocessingChangedEventType.DeleteRow, -1, -1);
+      ResetPartitions();
     }
 
@@ -229,4 +236,5 @@
       if (!IsInTransaction)
         OnChanged(DataPreprocessingChangedEventType.AddRow, -1, rowIndex);
+      ResetPartitions();
     }
 
@@ -238,9 +246,10 @@
       if (!IsInTransaction)
         OnChanged(DataPreprocessingChangedEventType.DeleteRow, -1, rowIndex);
+      ResetPartitions();
     }
 
     public override void InsertColumn<T>(string variableName, int columnIndex) {
       SaveSnapshot(DataPreprocessingChangedEventType.DeleteColumn, columnIndex, -1);
-      variableValues.Insert(columnIndex, new List<T>(Rows));
+      variableValues.Insert(columnIndex, new List<T>(Enumerable.Repeat(default(T), Rows)));
       variableNames.Insert(columnIndex, variableName);
       if (!IsInTransaction)
@@ -256,4 +265,26 @@
     }
 
+    public override void RenameColumn(int columnIndex, string name) {
+      SaveSnapshot(DataPreprocessingChangedEventType.ChangeColumn, columnIndex, -1);
+      if (columnIndex < 0 || columnIndex > variableNames.Count)
+        throw new ArgumentOutOfRangeException("columnIndex");
+      variableNames[columnIndex] = name;
+
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeColumn, -1, -1);
+    }
+
+    public override void RenameColumns(IList<string> names) {
+      if (names == null) throw new ArgumentNullException("names");
+      if (names.Count != variableNames.Count) throw new ArgumentException("number of names must match the number of columns.", "names");
+
+      SaveSnapshot(DataPreprocessingChangedEventType.ChangeColumn, -1, -1);
+      for (int i = 0; i < names.Count; i++)
+        variableNames[i] = names[i];
+
+      if (!IsInTransaction)
+        OnChanged(DataPreprocessingChangedEventType.ChangeColumn, -1, -1);
+    }
+
     public override Dataset ExportToDataset() {
       IList<IList> values = new List<IList>();
@@ -278,4 +309,9 @@
     }
 
+
+    private void ResetPartitions() {
+      TrainingPartition = new IntRange();
+      TestPartition = new IntRange();
+    }
 
     #endregion
