Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 10947)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 10948)
@@ -49,10 +49,11 @@
       this.transformationListView = new HeuristicLab.DataPreprocessing.Views.CheckedTransformationListView();
       this.applyButton = new System.Windows.Forms.Button();
+      this.preserveColumnsCheckbox = new System.Windows.Forms.CheckBox();
       this.SuspendLayout();
       // 
       // transformationListView
       // 
-      this.transformationListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.transformationListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.transformationListView.Caption = "Transformations";
@@ -75,8 +76,20 @@
       this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
       // 
+      // preserveColumnsCheckbox
+      // 
+      this.preserveColumnsCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.preserveColumnsCheckbox.AutoSize = true;
+      this.preserveColumnsCheckbox.Location = new System.Drawing.Point(337, 492);
+      this.preserveColumnsCheckbox.Name = "preserveColumnsCheckbox";
+      this.preserveColumnsCheckbox.Size = new System.Drawing.Size(147, 17);
+      this.preserveColumnsCheckbox.TabIndex = 2;
+      this.preserveColumnsCheckbox.Text = "Preserve original Columns";
+      this.preserveColumnsCheckbox.UseVisualStyleBackColor = true;
+      // 
       // TransformationView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.preserveColumnsCheckbox);
       this.Controls.Add(this.applyButton);
       this.Controls.Add(this.transformationListView);
@@ -84,4 +97,5 @@
       this.Size = new System.Drawing.Size(627, 514);
       this.ResumeLayout(false);
+      this.PerformLayout();
 
     }
@@ -90,4 +104,5 @@
     private CheckedTransformationListView transformationListView;
     private System.Windows.Forms.Button applyButton;
+    private System.Windows.Forms.CheckBox preserveColumnsCheckbox;
   }
 }
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 10947)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 10948)
@@ -60,6 +60,7 @@
 
       var transformator = new PreprocessingTransformator(Content.Data);
+      bool preserve = preserveColumnsCheckbox.CheckState == CheckState.Checked;
       string errorMsg;
-      bool success = transformator.ApplyTransformations(transformations, out errorMsg);
+      bool success = transformator.ApplyTransformations(transformations, preserve, out errorMsg);
       if (success) {
         Content.CheckedTransformationList.Clear();
Index: /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs
===================================================================
--- /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs	(revision 10947)
+++ /branches/DataPreprocessing/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs	(revision 10948)
@@ -23,4 +23,6 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Text;
+using HeuristicLab.Data;
 using HeuristicLab.Problems.DataAnalysis.Transformations;
 
@@ -29,9 +31,12 @@
     private readonly ITransactionalPreprocessingData preprocessingData;
 
+    private readonly IDictionary<string, IList<double>> originalColumns;
+
     public PreprocessingTransformator(IPreprocessingData preprocessingData) {
       this.preprocessingData = (ITransactionalPreprocessingData)preprocessingData;
+      originalColumns = new Dictionary<string, IList<double>>();
     }
 
-    public bool ApplyTransformations(IEnumerable<ITransformation> transformations, out string errorMsg) {
+    public bool ApplyTransformations(IEnumerable<ITransformation> transformations, bool preserveColumns, out string errorMsg) {
       bool success;
 
@@ -39,9 +44,12 @@
       try {
         var doubleTransformations = transformations.OfType<Transformation<double>>().ToList();
-        ApplyDoubleTranformations(doubleTransformations, out success, out errorMsg);
+        ApplyDoubleTranformations(doubleTransformations, preserveColumns, out success, out errorMsg);
+
+        if (preserveColumns) {
+          RestorePreservedColumns(doubleTransformations);
+          originalColumns.Clear();
+        }
       } finally {
         preprocessingData.EndTransaction();
-        //if (!success)
-        //preprocessingData.Undo();
       }
 
@@ -49,5 +57,5 @@
     }
 
-    private void ApplyDoubleTranformations(IEnumerable<Transformation<double>> transformations, out bool success, out string errorMsg) {
+    private void ApplyDoubleTranformations(IList<Transformation<double>> transformations, bool preserveColumns, out bool success, out string errorMsg) {
       errorMsg = string.Empty;
       success = true;
@@ -56,20 +64,51 @@
 
         var originalData = preprocessingData.GetValues<double>(colIndex);
+
+        if (preserveColumns && !originalColumns.ContainsKey(transformation.Column))
+          originalColumns.Add(transformation.Column, originalData);
+
         string errorMsgPart;
         bool successPart;
         var transformedData = ApplyDoubleTransformation(transformation, originalData, out successPart, out errorMsgPart);
         errorMsg += errorMsgPart + Environment.NewLine;
-        //if (!success) return;
+
         if (!successPart) success = false;
         preprocessingData.SetValues(colIndex, transformedData.ToList());
         preprocessingData.Transformations.Add(transformation);
       }
-
     }
 
-    private IEnumerable<double> ApplyDoubleTransformation(Transformation<double> transformation, IEnumerable<double> data, out bool success, out string errorMsg) {
+    private IEnumerable<double> ApplyDoubleTransformation(Transformation<double> transformation, IList<double> data, out bool success, out string errorMsg) {
       success = transformation.Check(data, out errorMsg);
       return transformation.Apply(data);
     }
+
+    private void RestorePreservedColumns(IList<Transformation<double>> transformations) {
+      foreach (var column in originalColumns) {
+        int originalColumnIndex = preprocessingData.GetColumnIndex(column.Key);
+        int newColumnIndex = originalColumnIndex + 1;
+        string newColumnName = GetTransformatedColumnName(transformations, column.Key);
+
+        // create new transformed column
+        preprocessingData.InsertColumn<double>(newColumnName, newColumnIndex);
+        preprocessingData.SetValues(newColumnIndex, preprocessingData.GetValues<double>(originalColumnIndex));
+        // restore old values
+        preprocessingData.SetValues(originalColumnIndex, column.Value);
+      }
+    }
+
+    private string GetTransformatedColumnName(IList<Transformation<double>> transformations, string column) {
+      string suffix = GetTransformationSuffix(transformations, column);
+      return column + "_" + suffix;
+    }
+
+    private string GetTransformationSuffix(IList<Transformation<double>> transformations, string column) {
+      var suffixes = transformations.Where(t => t.Column == column).Select(t => t.ShortName);
+      var builder = new StringBuilder();
+      foreach (var suffix in suffixes) {
+        builder.Append(suffix);
+      }
+      return builder.ToString();
+    }
   }
 }
