Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15846)
@@ -20,18 +20,19 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Reflection;
+using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
 using HeuristicLab.MainForm;
-using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.DataPreprocessing.Views {
   [View("CheckedTransformationList View")]
-  [Content(typeof(ICheckedItemList<ITransformation>), false)]
-  public partial class CheckedTransformationListView : CheckedItemListView<ITransformation> {
+  [Content(typeof(ICheckedItemList<IDataAnalysisTransformation>), false)]
+  public partial class CheckedTransformationListView : CheckedItemListView<IDataAnalysisTransformation> {
+
+    internal IFilteredPreprocessingData PreprocessingData { get; set; }
+
     public CheckedTransformationListView() {
       InitializeComponent();
@@ -39,33 +40,36 @@
     }
 
-    protected override ITransformation CreateItem() {
-      if (typeSelectorDialog == null) {
-        typeSelectorDialog = new TypeSelectorDialog();
-        typeSelectorDialog.Caption = "Select Transformation";
-        typeSelectorDialog.TypeSelector.Caption = "Available Transformations";
-        typeSelectorDialog.TypeSelector.Configure(typeof(ITransformation), showNotInstantiableTypes: true, showGenericTypes: false, typeCondition: CanInstanciateTransformation);
-      }
+    protected override IDataAnalysisTransformation CreateItem() {
+      var newTransformation = new DataAnalysisTransformation(PreprocessingData.VariableNames.Select(x => new StringValue(x)));
+      newTransformation.TransformedVariableParameter.ValidValues.Add(new StringValue("<New Variable>"));
+      return newTransformation;
+      //if (typeSelectorDialog == null) {
+      //  typeSelectorDialog = new TypeSelectorDialog();
+      //  typeSelectorDialog.Caption = "Select Transformation";
+      //  typeSelectorDialog.TypeSelector.Caption = "Available Transformations";
+      //  typeSelectorDialog.TypeSelector.Configure(typeof(IDataAnalysisTransformation), showNotInstantiableTypes: true, showGenericTypes: false, typeCondition: CanInstanciateTransformation);
+      //}
 
-      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
-        try {
-          // TODO: Avoid accessing parent view
-          var transformationView = (TransformationView)Parent;
-          var columnNames = transformationView.Content.PreprocessingData.VariableNames;
+      //if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+      //  try {
+      //    // TODO: Avoid accessing parent view
+      //    var transformationView = (TransformationView)Parent;
+      //    var columnNames = transformationView.Content.PreprocessingData.VariableNames;
 
-          return (ITransformation)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType(new[] { columnNames });
-        } catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog(this, ex);
-        }
-      }
-      return null;
+      //    return (IDataAnalysisTransformation)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType(new[] { columnNames });
+      //  } catch (Exception ex) {
+      //    ErrorHandling.ShowErrorDialog(this, ex);
+      //  }
+      //}
+      //return null;
     }
 
-    private bool CanInstanciateTransformation(Type type) {
-      foreach (ConstructorInfo ctor in type.GetConstructors(BindingFlags.Public | BindingFlags.Instance)) {
-        ParameterInfo[] parameters = ctor.GetParameters();
-        if (parameters.Length == 1 && parameters[0].ParameterType == typeof(IEnumerable<string>)) return true;
-      }
-      return false;
-    }
+    //private bool CanInstanciateTransformation(Type type) {
+    //  foreach (ConstructorInfo ctor in type.GetConstructors(BindingFlags.Public | BindingFlags.Instance)) {
+    //    ParameterInfo[] parameters = ctor.GetParameters();
+    //    if (parameters.Length == 1 && parameters[0].ParameterType == typeof(IEnumerable<string>)) return true;
+    //  }
+    //  return false;
+    //}
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15846)
@@ -91,69 +91,89 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Analysis.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Optimizer-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimizer-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Problems.Instances.DataAnalysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances.DataAnalysis-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Problems.Instances.DataAnalysis.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances.DataAnalysis.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="System" />
@@ -312,8 +332,10 @@
       <Project>{3e9e8944-44ff-40bb-a622-3a4a7dd0f198}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis.Views-3.4</Name>
+      <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis\3.4\HeuristicLab.Problems.DataAnalysis-3.4.csproj">
       <Project>{df87c13e-a889-46ff-8153-66dcaa8c5674}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
+      <Private>False</Private>
     </ProjectReference>
   </ItemGroup>
@@ -325,4 +347,7 @@
     <EmbeddedResource Include="ScatterPlotSingleView.resx">
       <DependentUpon>ScatterPlotSingleView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TransformationView.resx">
+      <DependentUpon>TransformationView.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 15846)
@@ -46,5 +46,4 @@
     private void InitializeComponent() {
       this.applyButton = new System.Windows.Forms.Button();
-      this.preserveColumnsCheckbox = new System.Windows.Forms.CheckBox();
       this.lblFilterNotice = new System.Windows.Forms.Label();
       this.transformationListView = new HeuristicLab.DataPreprocessing.Views.CheckedTransformationListView();
@@ -62,15 +61,4 @@
       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;
-      // 
       // lblFilterNotice
       // 
@@ -86,6 +74,6 @@
       // 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";
@@ -102,5 +90,4 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Controls.Add(this.lblFilterNotice);
-      this.Controls.Add(this.preserveColumnsCheckbox);
       this.Controls.Add(this.applyButton);
       this.Controls.Add(this.transformationListView);
@@ -115,5 +102,4 @@
     private CheckedTransformationListView transformationListView;
     private System.Windows.Forms.Button applyButton;
-    private System.Windows.Forms.CheckBox preserveColumnsCheckbox;
     private System.Windows.Forms.Label lblFilterNotice;
   }
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15846)
@@ -21,9 +21,8 @@
 
 using System;
-using System.Linq;
+using System.Collections.Generic;
 using System.Windows.Forms;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
-using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.DataPreprocessing.Views {
@@ -46,4 +45,5 @@
       } else {
         transformationListView.Content = Content.CheckedTransformationList;
+        transformationListView.PreprocessingData = Content.PreprocessingData;
         CheckFilters();
       }
@@ -75,22 +75,11 @@
 
     private void applyButton_Click(object sender, EventArgs e) {
-      var transformations = Content.CheckedTransformationList.CheckedItems.Select(x => x.Value);
+      bool success = Content.ApplyTransformations(out IEnumerable<string> errorMessages);
 
-      if (transformations.Any(x => ((Transformation)x).ColumnParameter.Value == null)) {
-        MessageBox.Show(this, "Parameter \"Column\" of a selected Transformation is not set.", "Applying Transformations...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
-        return;
-      }
-
-      var transformator = new PreprocessingTransformator(Content.PreprocessingData);
-      bool preserve = preserveColumnsCheckbox.CheckState == CheckState.Checked;
-      string errorMsg;
-      bool success = transformator.ApplyTransformations(transformations, preserve, out errorMsg);
       if (success) {
         Content.CheckedTransformationList.Clear();
         MessageBox.Show(this, "Transformations applied.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
       } else {
-        MessageBox.Show(this,
-          "Error in Transformation.\nValue is copied when transformion of cell failed.\n" + errorMsg,
-          "Transformation failed", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+        MessageBox.Show(this, string.Join(Environment.NewLine, errorMessages), "Transformation failed", MessageBoxButtons.OK, MessageBoxIcon.Warning);
       }
     }
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15846)
@@ -20,5 +20,7 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -35,10 +37,10 @@
 
     [Storable]
-    public ICheckedItemList<ITransformation> CheckedTransformationList { get; private set; }
+    public ICheckedItemList<IDataAnalysisTransformation> CheckedTransformationList { get; private set; }
 
     #region Constructor, Cloning & Persistence
     public TransformationContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
-      CheckedTransformationList = new CheckedItemList<ITransformation>();
+      CheckedTransformationList = new CheckedItemList<IDataAnalysisTransformation>();
     }
 
@@ -55,4 +57,42 @@
       : base(deserializing) { }
     #endregion
+
+    public bool ApplyTransformations(out IEnumerable<string> errorMessages) {
+      var transformations = CheckedTransformationList.CheckedItems.Select(x => x.Value);
+
+      bool success = true;
+      var errors = new List<string>();
+      errorMessages = errors;
+
+      foreach (var transformation in transformations) {
+        var sourceVariable = transformation.OriginalVariable;
+        var targetVariable = transformation.TransformedVariable ?? sourceVariable + " Transformed";
+        var sourceIdx = PreprocessingData.GetColumnIndex(sourceVariable);
+
+        if (transformation.Transformation is ITransformation<double> trans && PreprocessingData.VariableHasType<double>(sourceIdx)) {
+          if (!PreprocessingData.VariableNames.Contains(targetVariable))
+            PreprocessingData.InsertColumn<double>(targetVariable, PreprocessingData.Columns);
+          var targetIdx = PreprocessingData.GetColumnIndex(targetVariable);
+
+          if (!PreprocessingData.VariableHasType<double>(targetIdx)) { success = false; errors.Add("Target column is not double."); continue; }
+
+          var sourceData = PreprocessingData.GetValues<double>(sourceIdx);
+          if (!trans.Check(sourceData, out string msg)) { success = false; errors.Add(msg); continue; }
+
+          trans.Configure(sourceData);
+          var transformedData = trans.Apply(sourceData).ToList();
+
+          PreprocessingData.SetValues(targetIdx, transformedData);
+
+          PreprocessingData.Transformations.Add(transformation);
+          CheckedTransformationList.SetItemCheckedState(transformation, false);
+        } else {
+          success = false;
+          errors.Add("Transformation datatype is not supported.");
+        }
+      }
+
+      return success;
+    }
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15846)
@@ -204,5 +204,5 @@
 
     #region Transformations
-    public IList<ITransformation> Transformations {
+    public IList<IDataAnalysisTransformation> Transformations {
       get { return originalData.Transformations; }
     }
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15846)
@@ -78,5 +78,5 @@
 
     #region Transformations
-    IList<ITransformation> Transformations { get; }
+    IList<IDataAnalysisTransformation> Transformations { get; }
     #endregion
 
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15846)
@@ -47,5 +47,5 @@
       Name = "Preprocessing Data";
 
-      Transformations = new List<ITransformation>();
+      Transformations = new List<IDataAnalysisTransformation>();
       selection = new Dictionary<int, IList<int>>();
 
@@ -61,5 +61,5 @@
       TrainingPartition = (IntRange)original.TrainingPartition.Clone(cloner);
       TestPartition = (IntRange)original.TestPartition.Clone(cloner);
-      Transformations = new List<ITransformation>(original.Transformations.Select(cloner.Clone));
+      Transformations = new List<IDataAnalysisTransformation>(original.Transformations.Select(cloner.Clone));
 
       InputVariables = new List<string>(original.InputVariables);
@@ -350,5 +350,5 @@
     #region Transformations
     [Storable]
-    public IList<ITransformation> Transformations { get; protected set; }
+    public IList<IDataAnalysisTransformation> Transformations { get; protected set; }
     #endregion
 
@@ -459,5 +459,5 @@
       public IntRange TrainingPartition { get; set; }
       public IntRange TestPartition { get; set; }
-      public IList<ITransformation> Transformations { get; set; }
+      public IList<IDataAnalysisTransformation> Transformations { get; set; }
       public DataPreprocessingChangedEventType ChangedType { get; set; }
 
@@ -487,5 +487,5 @@
         TrainingPartition = new IntRange(TrainingPartition.Start, TrainingPartition.End),
         TestPartition = new IntRange(TestPartition.Start, TestPartition.End),
-        Transformations = new List<ITransformation>(Transformations),
+        Transformations = new List<IDataAnalysisTransformation>(Transformations),
         ChangedType = changedType,
         ChangedColumn = column,
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15846)
@@ -76,41 +76,54 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
-    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="System" />
@@ -130,5 +143,4 @@
     <Compile Include="Data\IFilteredPreprocessingData.cs" />
     <Compile Include="Content\CorrelationMatrixContent.cs" />
-    <Compile Include="PreprocessingTransformator.cs" />
     <Compile Include="Data\DataPreprocessingChangedEvent.cs" />
     <Compile Include="Filter\ComparisonFilter.cs" />
@@ -156,4 +168,5 @@
       <Project>{df87c13e-a889-46ff-8153-66dcaa8c5674}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
+      <Private>False</Private>
     </ProjectReference>
   </ItemGroup>
Index: anches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/PreprocessingTransformator.cs	(revision 15845)
+++ 	(revision )
@@ -1,176 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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 System.Text;
-using HeuristicLab.Data;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.DataPreprocessing {
-  public class PreprocessingTransformator {
-    private readonly IPreprocessingData preprocessingData;
-
-    private readonly IDictionary<string, IList<double>> originalColumns;
-
-    private readonly IDictionary<string, string> renamedColumns;
-
-    public PreprocessingTransformator(IPreprocessingData preprocessingData) {
-      this.preprocessingData = preprocessingData;
-      originalColumns = new Dictionary<string, IList<double>>();
-      renamedColumns = new Dictionary<string, string>();
-    }
-
-    public bool ApplyTransformations(IEnumerable<ITransformation> transformations, bool preserveColumns, out string errorMsg) {
-      bool success = false;
-      errorMsg = string.Empty;
-      preprocessingData.BeginTransaction(DataPreprocessingChangedEventType.Transformation);
-
-      try {
-        var doubleTransformations = transformations.OfType<Transformation<double>>().ToList();
-
-        if (preserveColumns) {
-          PreserveColumns(doubleTransformations);
-        }
-
-        // all transformations are performed inplace. no creation of new columns for transformations
-        ApplyDoubleTranformationsInplace(doubleTransformations, preserveColumns, out success, out errorMsg);
-
-        if (preserveColumns) {
-          RenameTransformedColumsAndRestorePreservedColumns(doubleTransformations);
-          RenameTransformationColumnParameter(doubleTransformations);
-          InsertCopyColumTransformations(doubleTransformations);
-
-          originalColumns.Clear();
-          renamedColumns.Clear();
-        }
-        // only accept changes if everything was successful
-        if (!success) {
-          preprocessingData.Undo();
-        }
-      } catch (Exception e) {
-        preprocessingData.Undo();
-        if (string.IsNullOrEmpty(errorMsg)) errorMsg = e.Message;
-      } finally {
-        preprocessingData.EndTransaction();
-      }
-
-      return success;
-    }
-
-    private void PreserveColumns(IEnumerable<Transformation<double>> transformations) {
-      foreach (var transformation in transformations) {
-        if (!originalColumns.ContainsKey(transformation.Column)) {
-          int colIndex = preprocessingData.GetColumnIndex(transformation.Column);
-          var originalData = preprocessingData.GetValues<double>(colIndex);
-          originalColumns.Add(transformation.Column, originalData);
-        }
-      }
-    }
-
-    private void ApplyDoubleTranformationsInplace(IEnumerable<Transformation<double>> transformations, bool preserveColumns, out bool success, out string errorMsg) {
-      errorMsg = string.Empty;
-      success = true;
-      foreach (var transformation in transformations) {
-        int colIndex = preprocessingData.GetColumnIndex(transformation.Column);
-
-        var originalData = preprocessingData.GetValues<double>(colIndex);
-
-        string errorMsgPart;
-        bool successPart;
-        var transformedData = ApplyDoubleTransformation(transformation, originalData, out successPart, out errorMsgPart);
-        errorMsg += errorMsgPart + Environment.NewLine;
-
-        if (!successPart) success = false;
-        preprocessingData.SetValues(colIndex, transformedData.ToList());
-        preprocessingData.Transformations.Add(transformation);
-      }
-    }
-
-    private IEnumerable<double> ApplyDoubleTransformation(Transformation<double> transformation, IList<double> data, out bool success, out string errorMsg) {
-      success = transformation.Check(data, out errorMsg);
-      // don't apply when the check fails
-      if (success)
-        return transformation.ConfigureAndApply(data);
-      else
-        return data;
-    }
-
-    private void RenameTransformationColumnParameter(List<Transformation<double>> transformations) {
-      foreach (var transformation in transformations) {
-        var newColumnName = new StringValue(renamedColumns[transformation.Column]);
-        transformation.ColumnParameter.ValidValues.Add(newColumnName);
-        transformation.ColumnParameter.Value = newColumnName;
-      }
-    }
-
-    private void InsertCopyColumTransformations(IList<Transformation<double>> transformations) {
-      foreach (var renaming in renamedColumns) {
-        string oldName = renaming.Key;
-        string newName = renaming.Value;
-
-        var copyTransformation = CreateCopyTransformation(oldName, newName);
-        preprocessingData.Transformations.Insert(0, copyTransformation);
-      }
-    }
-
-    private CopyColumnTransformation CreateCopyTransformation(string oldColumn, string newColumn) {
-      var newColumName = new StringValue(newColumn);
-
-      var copyTransformation = new CopyColumnTransformation();
-      copyTransformation.ColumnParameter.ValidValues.Add(newColumName);
-      copyTransformation.ColumnParameter.Value = newColumName;
-
-      copyTransformation.CopiedColumnNameParameter.Value.Value = oldColumn;
-      return copyTransformation;
-    }
-
-    private void RenameTransformedColumsAndRestorePreservedColumns(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);
-        // save renaming mapping
-        renamedColumns[column.Key] = newColumnName;
-        // 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();
-    }
-  }
-}
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15846)
@@ -34,5 +34,5 @@
     }
 
-    private IList<ITransformation> Transformations {
+    private IList<IDataAnalysisTransformation> Transformations {
       get { return context.Data.Transformations; }
     }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 15846)
@@ -101,4 +101,5 @@
     <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <HintPath>..\..\bin\ALGLIB-3.7.0.dll</HintPath>
+      <SpecificVersion>False</SpecificVersion>
       <Private>False</Private>
     </Reference>
@@ -106,67 +107,93 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Algorithms.DataAnalysis-3.4.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Optimization.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Optimizer-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimizer-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+	  <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="System" />
@@ -559,4 +586,7 @@
       <DependentUpon>AbstractFeatureCorrelationView.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Solution Views\RegressionSolutionView.resx">
+      <DependentUpon>RegressionSolutionView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
@@ -564,4 +594,5 @@
       <Project>{df87c13e-a889-46ff-8153-66dcaa8c5674}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
+      <Private>False</Private>
     </ProjectReference>
   </ItemGroup>
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.Designer.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.Designer.cs	(revision 15846)
@@ -46,4 +46,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.transformButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
@@ -53,4 +54,8 @@
       this.detailsGroupBox.SuspendLayout();
       this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      // 
       // itemsGroupBox
       // 
@@ -65,7 +70,16 @@
       this.toolTip.SetToolTip(this.removeButton, "Remove");
       // 
+      // transformButton
+      // 
+      this.transformButton.Location = new System.Drawing.Point(117, 3);
+      this.transformButton.Name = "transformButton";
+      this.transformButton.Size = new System.Drawing.Size(75, 23);
+      this.transformButton.TabIndex = 1;
+      this.transformButton.Text = "Transform";
+      this.transformButton.UseVisualStyleBackColor = true;
+      this.transformButton.Click += new System.EventHandler(this.transformButton_Click);
+      // 
       // RegressionSolutionView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Name = "RegressionSolutionView";
@@ -81,4 +95,6 @@
 
     #endregion
+
+    private System.Windows.Forms.Button transformButton;
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.cs	(revision 15846)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Core;
@@ -30,4 +31,5 @@
     public RegressionSolutionView() {
       InitializeComponent();
+      flowLayoutPanel.Controls.Add(transformButton);
     }
 
@@ -35,4 +37,9 @@
       get { return (RegressionSolutionBase)base.Content; }
       set { base.Content = value; }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      transformButton.Visible = Content != null && Content.ProblemData.Transformations.Any();
     }
 
@@ -51,4 +58,11 @@
     }
     #endregion
+
+    private void transformButton_Click(object sender, System.EventArgs e) {
+      var targetVariable = TransformedRegressionModel.GetOriginalTragetVariable(Content.Model.TargetVariable, Content.ProblemData.Transformations);
+      var transformedModel = new TransformedRegressionModel(Content.Model, Content.ProblemData.Transformations);
+      var transformedSolution = new TransformedRegressionSolution(transformedModel, new RegressionProblemData(Content.ProblemData) { TargetVariable = targetVariable });
+      MainFormManager.MainForm.ShowContent(transformedSolution);
+    }
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 15846)
@@ -101,46 +101,60 @@
     <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <HintPath>..\..\bin\ALGLIB-3.7.0.dll</HintPath>
-      <Private>False</Private>
-    </Reference>
-    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="System" />
@@ -181,4 +195,5 @@
     <Compile Include="Implementation\ConstantModel.cs" />
     <Compile Include="Implementation\DataAnalysisModel.cs" />
+    <Compile Include="Implementation\DataAnalysisTransformation.cs" />
     <Compile Include="Implementation\Regression\ConfidenceBoundRegressionSolution.cs" />
     <Compile Include="Implementation\Regression\ConstantRegressionModel.cs" />
@@ -191,4 +206,6 @@
     <Compile Include="Implementation\Regression\RegressionModel.cs" />
     <Compile Include="Implementation\Regression\RegressionSolutionVariableImpactsCalculator.cs" />
+    <Compile Include="Implementation\Regression\TransformedRegressionModel.cs" />
+    <Compile Include="Implementation\Regression\TransformedRegressionSolution.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\Models\ConstantTimeSeriesPrognosisModel.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\Models\TimeSeriesPrognosisAutoRegressiveModel.cs" />
@@ -198,13 +215,19 @@
     <Compile Include="Implementation\TimeSeriesPrognosis\TimeSeriesPrognosisSolution.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\TimeSeriesPrognosisSolutionBase.cs" />
-    <Compile Include="Implementation\Transformations\CopyColumnTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\CopyColumnTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\ExponentialTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\LinearTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\LogarithmicTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\PowerTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\ReciprocalTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\ShiftStandardDistributionTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\ShiftToRangeTransformation.cs" />
+    <None Include="Implementation\Transformations %28old%29\Transformation.cs" />
     <Compile Include="Implementation\Transformations\ExponentialTransformation.cs" />
+    <Compile Include="Implementation\Transformations\IdentityTransformation.cs" />
     <Compile Include="Implementation\Transformations\LinearTransformation.cs" />
-    <Compile Include="Implementation\Transformations\LogarithmicTransformation.cs" />
-    <Compile Include="Implementation\Transformations\PowerTransformation.cs" />
-    <Compile Include="Implementation\Transformations\ReciprocalTransformation.cs" />
-    <Compile Include="Implementation\Transformations\ShiftStandardDistributionTransformation.cs" />
-    <Compile Include="Implementation\Transformations\ShiftToRangeTransformation.cs" />
+    <Compile Include="Implementation\Transformations\LogarithmTransformation.cs" />
     <Compile Include="Implementation\Transformations\Transformation.cs" />
+    <Compile Include="Implementation\Transformations\ZNormalizationTransformation.cs" />
     <Compile Include="Interfaces\Classification\IClassificationEnsembleModel.cs">
       <SubType>Code</SubType>
@@ -215,8 +238,11 @@
     <Compile Include="Interfaces\Classification\IDiscriminantFunctionThresholdCalculator.cs" />
     <Compile Include="Interfaces\IDataAnalysisSolutionExporter.cs" />
+    <Compile Include="Interfaces\IDataAnalysisTransformation.cs" />
     <Compile Include="Interfaces\IDataset.cs" />
     <Compile Include="Interfaces\IDependencyCalculator.cs" />
     <Compile Include="Interfaces\ITransformation.cs" />
     <Compile Include="Interfaces\ITransformationMapper.cs" />
+    <Compile Include="Interfaces\Regression\ITransformedRegressionModel.cs" />
+    <Compile Include="Interfaces\Regression\ITransformedRegressionSolution.cs" />
     <Compile Include="Interfaces\Regression\IConfidenceRegressionModel.cs" />
     <Compile Include="Interfaces\Regression\IConfidenceRegressionSolution.cs" />
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 15846)
@@ -333,6 +333,6 @@
     }
 
-    public ClassificationProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<ITransformation> transformations = null)
-      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<ITransformation>()) {
+    public ClassificationProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<IDataAnalysisTransformation> transformations = null)
+      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<IDataAnalysisTransformation>()) {
       var validTargetVariableValues = CheckVariablesForPossibleTargetVariables(dataset).Select(x => new StringValue(x).AsReadOnly()).ToList();
       var target = validTargetVariableValues.Where(x => x.Value == targetVariable).DefaultIfEmpty(validTargetVariableValues.First()).First();
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblemData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblemData.cs	(revision 15846)
@@ -87,6 +87,6 @@
     }
 
-    public ClusteringProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<ITransformation> transformations = null)
-      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<ITransformation>()) {
+    public ClusteringProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<IDataAnalysisTransformation> transformations = null)
+      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<IDataAnalysisTransformation>()) {
     }
   }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 15846)
@@ -74,6 +74,6 @@
     }
 
-    public IFixedValueParameter<ReadOnlyItemList<ITransformation>> TransformationsParameter {
-      get { return (IFixedValueParameter<ReadOnlyItemList<ITransformation>>)Parameters[TransformationsParameterName]; }
+    public IFixedValueParameter<ReadOnlyItemList<IDataAnalysisTransformation>> TransformationsParameter {
+      get { return (IFixedValueParameter<ReadOnlyItemList<IDataAnalysisTransformation>>)Parameters[TransformationsParameterName]; }
     }
     #endregion
@@ -122,5 +122,5 @@
     }
 
-    public IEnumerable<ITransformation> Transformations {
+    public IEnumerable<IDataAnalysisTransformation> Transformations {
       get { return TransformationsParameter.Value; }
     }
@@ -148,12 +148,13 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      if (!Parameters.ContainsKey(TransformationsParameterName)) {
-        Parameters.Add(new FixedValueParameter<ReadOnlyItemList<ITransformation>>(TransformationsParameterName, "", new ItemList<ITransformation>().AsReadOnly()));
-        TransformationsParameter.Hidden = true;
-      }
+      if (Parameters[TransformationsParameterName] is FixedValueParameter<ReadOnlyItemList<ITransformation>>)
+        Parameters.Remove(TransformationsParameterName);
+      if (!Parameters.ContainsKey(TransformationsParameterName))
+        Parameters.Add(new FixedValueParameter<ReadOnlyItemList<IDataAnalysisTransformation>>(TransformationsParameterName, new ItemList<IDataAnalysisTransformation>().AsReadOnly()) { Hidden = true });
+
       RegisterEventHandlers();
     }
 
-    protected DataAnalysisProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<ITransformation> transformations = null) {
+    protected DataAnalysisProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<IDataAnalysisTransformation> transformations = null) {
       if (dataset == null) throw new ArgumentNullException("The dataset must not be null.");
       if (allowedInputVariables == null) throw new ArgumentNullException("The allowed input variables must not be null.");
@@ -172,5 +173,5 @@
       int testPartitionEnd = dataset.Rows;
 
-      var transformationsList = new ItemList<ITransformation>(transformations ?? Enumerable.Empty<ITransformation>());
+      var transformationsList = new ItemList<IDataAnalysisTransformation>(transformations ?? Enumerable.Empty<IDataAnalysisTransformation>());
 
       Parameters.Add(new FixedValueParameter<Dataset>(DatasetParameterName, "", (Dataset)dataset));
@@ -178,7 +179,5 @@
       Parameters.Add(new FixedValueParameter<IntRange>(TrainingPartitionParameterName, "", new IntRange(trainingPartitionStart, trainingPartitionEnd)));
       Parameters.Add(new FixedValueParameter<IntRange>(TestPartitionParameterName, "", new IntRange(testPartitionStart, testPartitionEnd)));
-      Parameters.Add(new FixedValueParameter<ReadOnlyItemList<ITransformation>>(TransformationsParameterName, "", transformationsList.AsReadOnly()));
-
-      TransformationsParameter.Hidden = true;
+      Parameters.Add(new FixedValueParameter<ReadOnlyItemList<IDataAnalysisTransformation>>(TransformationsParameterName, "", transformationsList.AsReadOnly()) { Hidden = transformationsList.Count == 0 });
 
       ((ValueParameter<Dataset>)DatasetParameter).ReactOnValueToStringChangedAndValueItemImageChanged = false;
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs	(revision 15846)
@@ -0,0 +1,143 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 System.Runtime.CompilerServices;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [Item("Transformation", "A transformation applied to a DataAnalysisProblemData")]
+  [StorableClass]
+  public class DataAnalysisTransformation : ParameterizedNamedItem, IDataAnalysisTransformation {
+    #region Parameters
+    public IConstrainedValueParameter<StringValue> OriginalVariableParameter {
+      get { return (IConstrainedValueParameter<StringValue>)Parameters["Original Variable"]; }
+    }
+
+    public IConstrainedValueParameter<StringValue> TransformedVariableParameter {
+      get { return (IConstrainedValueParameter<StringValue>)Parameters["Transformed Variable"]; }
+    }
+
+    public IValueParameter<ITransformation> TransformationParameter {
+      get { return (IValueParameter<ITransformation>)Parameters["Transformation"]; }
+    }
+    #endregion
+
+    #region Properties
+    public string OriginalVariable {
+      get { return OriginalVariableParameter.Value.Value; }
+      set { SetConstrainedValue(OriginalVariableParameter, value); }
+    }
+
+    public string TransformedVariable {
+      get { return TransformedVariableParameter.Value.Value; }
+      set { SetConstrainedValue(TransformedVariableParameter, value); }
+    }
+
+    public ITransformation Transformation {
+      get { return TransformationParameter.Value; }
+      set { TransformationParameter.Value = value; }
+    }
+
+    private static void SetConstrainedValue(IConstrainedValueParameter<StringValue> parameter, string value, [CallerMemberName] string caller = null) {
+      if (value == null) throw new ArgumentNullException(caller);
+      if (value == parameter.Value.Value) return;
+
+      var matchingValue = parameter.ValidValues.SingleOrDefault(v => v.Value == value);
+      if (matchingValue == null) throw new ArgumentException("The provided value is not valid.", caller);
+      parameter.Value = matchingValue;
+    }
+    #endregion
+
+    #region Constructor, Cloning & Persistence
+    public DataAnalysisTransformation(IEnumerable<StringValue> variableNames)
+      : base() {
+      var originalVariables = new ItemSet<StringValue>(variableNames.Select(x => x.AsReadOnly()));
+      var transformedVariables = new ItemSet<StringValue>(variableNames.Select(x => x.AsReadOnly()));
+      Parameters.Add(new ConstrainedValueParameter<StringValue>("Original Variable", new ItemSet<StringValue>(originalVariables), originalVariables.FirstOrDefault()));
+      Parameters.Add(new ConstrainedValueParameter<StringValue>("Transformed Variable", new ItemSet<StringValue>(transformedVariables), transformedVariables.FirstOrDefault()));
+
+      var transformations = new ItemSet<ITransformation>(ApplicationManager.Manager.GetInstances<ITransformation>());
+      Parameters.Add(new ConstrainedValueParameter<ITransformation>("Transformation", transformations, transformations.OfType<IdentityTransformation>().Single()));
+
+      RegisterEventHandlers();
+    }
+
+    protected DataAnalysisTransformation(DataAnalysisTransformation original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DataAnalysisTransformation(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected DataAnalysisTransformation(bool deserializing)
+      : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+    #endregion
+
+    #region Event-Handling
+    private void RegisterEventHandlers() {
+      OriginalVariableParameter.ValueChanged += OriginalVariableParameter_ValueChanged;
+      TransformedVariableParameter.ValueChanged += TransformedVariableParameter_ValueChanged;
+      TransformationParameter.ValueChanged += TransformationParameter_ValueChanged;
+    }
+
+    private void OriginalVariableParameter_ValueChanged(object sender, EventArgs e) {
+      OriginalVariableParameter.Value.ValueChanged += OriginalVariableParameterValue_ValueChanged;
+      OnToStringChanged();
+    }
+    private void OriginalVariableParameterValue_ValueChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    private void TransformedVariableParameter_ValueChanged(object sender, EventArgs e) {
+      TransformedVariableParameter.Value.ValueChanged += TransformedVariableParameterValue_ValueChanged;
+      OnToStringChanged();
+    }
+    private void TransformedVariableParameterValue_ValueChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    private void TransformationParameter_ValueChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+
+    public override string ToString() {
+      return $"{Transformation} ({OriginalVariable} -> {TransformedVariable})";
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 15846)
@@ -141,5 +141,5 @@
     }
     public RegressionProblemData(IRegressionProblemData regressionProblemData)
-      : this(regressionProblemData.Dataset, regressionProblemData.AllowedInputVariables, regressionProblemData.TargetVariable) {
+      : this(regressionProblemData.Dataset, regressionProblemData.AllowedInputVariables, regressionProblemData.TargetVariable, regressionProblemData.Transformations) {
       TrainingPartition.Start = regressionProblemData.TrainingPartition.Start;
       TrainingPartition.End = regressionProblemData.TrainingPartition.End;
@@ -148,6 +148,6 @@
     }
 
-    public RegressionProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<ITransformation> transformations = null)
-      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<ITransformation>()) {
+    public RegressionProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<IDataAnalysisTransformation> transformations = null)
+      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<IDataAnalysisTransformation>()) {
       var variables = InputVariables.Select(x => x.AsReadOnly()).ToList();
       Parameters.Add(new ConstrainedValueParameter<StringValue>(TargetVariableParameterName, new ItemSet<StringValue>(variables), variables.Where(x => x.Value == targetVariable).First()));
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionModel.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionModel.cs	(revision 15846)
@@ -0,0 +1,128 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [Item("Transformed Regression Model", "A model that was transformed back to match the original variables after the training was performed on transformed variables.")]
+  [StorableClass]
+  public class TransformedRegressionModel : RegressionModel, ITransformedRegressionModel {
+
+    [Storable]
+    public IRegressionModel OriginalModel { get; private set; }
+
+    [Storable]
+    public ItemList<IDataAnalysisTransformation> Transformations { get; private set; }
+
+    public override IEnumerable<string> VariablesUsedForPrediction {
+      get { return OriginalModel.VariablesUsedForPrediction; }
+    }
+
+    #region Constructor, Cloning & Persistence
+    public TransformedRegressionModel(IRegressionModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
+      : base(GetOriginalTragetVariable(originalModel.TargetVariable, transformations)) {
+      OriginalModel = originalModel;
+      Transformations = new ItemList<IDataAnalysisTransformation>(transformations);
+    }
+
+    protected TransformedRegressionModel(TransformedRegressionModel original, Cloner cloner)
+      : base(original, cloner) {
+      OriginalModel = cloner.Clone(original.OriginalModel);
+      Transformations = cloner.Clone(original.Transformations);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TransformedRegressionModel(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected TransformedRegressionModel(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+
+    public override IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
+      var transformedDataset = TransformInputs(dataset, Transformations);
+
+      var estimates = OriginalModel.GetEstimatedValues(transformedDataset, rows);
+
+      return TransformEstimates(estimates, Transformations, OriginalModel.TargetVariable);
+    }
+
+    public override IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
+      return new TransformedRegressionSolution(this, new RegressionProblemData(problemData) { TargetVariable = GetOriginalTragetVariable(TargetVariable, Transformations) });
+    }
+
+    private static IDataset TransformInputs(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
+      return dataset;
+
+      var modifiableDataset = ((Dataset)dataset).ToModifiable();
+
+      foreach (var transformation in transformations.Reverse()) {
+        var trans = (ITransformation<double>)transformation.Transformation;
+
+        // no transformations on target (but what if target is an input?)
+
+        var originalData = modifiableDataset.GetDoubleValues(transformation.OriginalVariable);
+        if (!trans.Check(originalData, out string errorMessage))
+          throw new InvalidOperationException($"Cannot estimate Values, Transformation is invalid: {errorMessage}");
+        var transformedData = trans.Apply(originalData).ToList();
+
+        if (modifiableDataset.VariableNames.Contains(transformation.TransformedVariable))
+          modifiableDataset.ReplaceVariable(transformation.TransformedVariable, transformedData);
+        else
+          modifiableDataset.AddVariable(transformation.TransformedVariable, transformedData);
+      }
+
+      return modifiableDataset;
+    }
+
+    private static IEnumerable<double> TransformEstimates(IEnumerable<double> data, IEnumerable<IDataAnalysisTransformation> transformations, string targetVariable) {
+      var targetTransformations = transformations.Where(x => x.TransformedVariable == targetVariable);
+
+      var transformedData = data.ToList();
+
+      foreach (var transformation in targetTransformations.Reverse()) {
+        var trans = (ITransformation<double>)transformation.Transformation;
+
+        if (!trans.Check(transformedData, out string errorMessage))
+          throw new InvalidOperationException($"Cannot estimate Values, Transformation is invalid: {errorMessage}");
+
+        transformedData = trans.InverseApply(transformedData).ToList();
+      }
+
+      return transformedData;
+    }
+
+    public static string GetOriginalTragetVariable(string transformedTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
+      var target = transformedTarget;
+      foreach (var transformation in transformations.Reverse()) {
+        if (transformation.TransformedVariable == target)
+          target = transformation.OriginalVariable;
+      }
+      return target;
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionSolution.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionSolution.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionSolution.cs	(revision 15846)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public class TransformedRegressionSolution : RegressionSolution, ITransformedRegressionSolution {
+
+    public new ITransformedRegressionModel Model {
+      get { return (ITransformedRegressionModel)base.Model; }
+      set { base.Model = value; }
+    }
+
+    #region Constructor, Cloning & Persistence
+    public TransformedRegressionSolution(ITransformedRegressionModel transformedModel, IRegressionProblemData problemData)
+      : base(transformedModel, problemData) {
+    }
+
+    protected TransformedRegressionSolution(TransformedRegressionSolution original, Cloner cloner)
+      : base(original, cloner) {
+
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TransformedRegressionSolution(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected TransformedRegressionSolution(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs	(revision 15846)
@@ -1582,6 +1582,6 @@
       TrainingPartition.Start = 50;
     }
-    public TimeSeriesPrognosisProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<ITransformation> transformations = null)
-      : base(dataset, allowedInputVariables, targetVariable, transformations ?? Enumerable.Empty<ITransformation>()) {
+    public TimeSeriesPrognosisProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<IDataAnalysisTransformation> transformations = null)
+      : base(dataset, allowedInputVariables, targetVariable, transformations ?? Enumerable.Empty<IDataAnalysisTransformation>()) {
       Parameters.Add(new FixedValueParameter<IntValue>(TrainingHorizonParameterName, "Specifies the horizon (how far the prognosis reaches in the future) for each training sample.", new IntValue(1)));
       Parameters.Add(new FixedValueParameter<IntValue>(TestHorizonParameterName, "Specifies the horizon (how far the prognosis reaches in the future) for each test sample.", new IntValue(1)));
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/CopyColumnTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/CopyColumnTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/CopyColumnTransformation.cs	(revision 15846)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("CopyColumnTransformation", "Represents a transformation which represents a copied Column.")]
+  public class CopyColumnTransformation : Transformation {
+    protected const string CopiedColumnNameParameterName = "CopiedColumnName";
+
+    #region Parameters
+    public IValueParameter<StringValue> CopiedColumnNameParameter {
+      get { return (IValueParameter<StringValue>)Parameters[CopiedColumnNameParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Cpy"; }
+    }
+    public string CopiedColumnName {
+      get { return CopiedColumnNameParameter.Value.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected CopyColumnTransformation(bool deserializing) : base(deserializing) { }
+    protected CopyColumnTransformation(CopyColumnTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public CopyColumnTransformation()
+      : base(Enumerable.Empty<string>()) {
+      Parameters.Add(new ValueParameter<StringValue>(CopiedColumnNameParameterName, "Name for the copied column", new StringValue()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CopyColumnTransformation(this, cloner);
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ExponentialTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ExponentialTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ExponentialTransformation.cs	(revision 15846)
@@ -0,0 +1,56 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Exponential Transformation", "f(x) = b ^ x | Represents a exponential transformation.")]
+  public class ExponentialTransformation : Transformation<double> {
+    protected const string BaseParameterName = "Base";
+
+    #region Parameters
+    public IValueParameter<DoubleValue> BaseParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[BaseParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Exp"; }
+    }
+    public double Base {
+      get { return BaseParameter.Value.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected ExponentialTransformation(bool deserializing) : base(deserializing) { }
+
+    protected ExponentialTransformation(ExponentialTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public ExponentialTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+      Parameters.Add(new ValueParameter<DoubleValue>(BaseParameterName, "b | Base of exp-function", new DoubleValue(Math.E)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExponentialTransformation(this, cloner);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      return data.Select(d => Math.Pow(Base, d));
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      errorMsg = "";
+      return true;
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/LinearTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/LinearTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/LinearTransformation.cs	(revision 15846)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Linear Transformation", "f(x) = k * x + d | Represents a linear transformation with multiplication and addition.")]
+  public class LinearTransformation : Transformation<double> {
+    protected const string MultiplierParameterName = "Multiplier";
+    protected const string AddendParameterName = "Addend";
+
+    #region Parameters
+    public IValueParameter<DoubleValue> MultiplierParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[MultiplierParameterName]; }
+    }
+    public IValueParameter<DoubleValue> AddendParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[AddendParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Lin"; }
+    }
+    public double Multiplier {
+      get { return MultiplierParameter.Value.Value; }
+      set {
+        MultiplierParameter.Value.Value = value;
+      }
+    }
+
+    public double Addend {
+      get { return AddendParameter.Value.Value; }
+      set {
+        AddendParameter.Value.Value = value;
+      }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected LinearTransformation(bool deserializing) : base(deserializing) { }
+    protected LinearTransformation(LinearTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public LinearTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+      Parameters.Add(new ValueParameter<DoubleValue>(MultiplierParameterName, "k | Multiplier for linear transformation", new DoubleValue(1.0)));
+      Parameters.Add(new ValueParameter<DoubleValue>(AddendParameterName, "d | Addend for linear transformation", new DoubleValue(0.0)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LinearTransformation(this, cloner);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      var m = Multiplier;
+      var a = Addend;
+      return data.Select(e => e * m + a);
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      errorMsg = null;
+      if (Multiplier.IsAlmost(0.0)) {
+        errorMsg = String.Format("Multiplicand is 0, all {0} entries will be set to {1}. Inverse apply will not be possible (division by 0).", data.Count(), Addend);
+        return false;
+      }
+      return true;
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/LogarithmicTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/LogarithmicTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/LogarithmicTransformation.cs	(revision 15846)
@@ -0,0 +1,61 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Logarithmic Transformation", "f(x) = log(x, b) | Represents a logarithmic transformation.")]
+  public class LogarithmicTransformation : Transformation<double> {
+    protected const string BaseParameterName = "Base";
+
+    #region Parameters
+    public IValueParameter<DoubleValue> BaseParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[BaseParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Log"; }
+    }
+    public double Base {
+      get { return BaseParameter.Value.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected LogarithmicTransformation(bool deserializing) : base(deserializing) { }
+    protected LogarithmicTransformation(LogarithmicTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public LogarithmicTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+      Parameters.Add(new ValueParameter<DoubleValue>(BaseParameterName, "b | Base of log-function", new DoubleValue(Math.E)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LogarithmicTransformation(this, cloner);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      var b = Base;
+      return data.Select(d => d > 0.0 ? Math.Log(d, b) : d);
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      errorMsg = null;
+      int errorCounter = data.Count(i => i <= 0.0);
+      if (errorCounter > 0) {
+        errorMsg = String.Format("{0} values are zero or below zero. Logarithm can not be applied onto these values", errorCounter);
+        return false;
+      }
+      return true;
+    }
+
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/PowerTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/PowerTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/PowerTransformation.cs	(revision 15846)
@@ -0,0 +1,55 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Power Transformation", "f(x) = x ^ exp | Represents a power transformation.")]
+  public class PowerTransformation : Transformation<double> {
+    protected const string ExponentParameterName = "Exponent";
+
+    #region Parameters
+    public IValueParameter<DoubleValue> ExponentParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[ExponentParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Pow"; }
+    }
+    public double Exponent {
+      get { return ExponentParameter.Value.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected PowerTransformation(bool deserializing) : base(deserializing) { }
+    protected PowerTransformation(PowerTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public PowerTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+      Parameters.Add(new ValueParameter<DoubleValue>(ExponentParameterName, "exp | Exponent for Exponentation", new DoubleValue(2.0)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PowerTransformation(this, cloner);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      return data.Select(i => Math.Pow(i, Exponent));
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      errorMsg = "";
+      return true;
+    }
+
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ReciprocalTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ReciprocalTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ReciprocalTransformation.cs	(revision 15846)
@@ -0,0 +1,46 @@
+﻿
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Reciprocal Transformation", "f(x) = 1 / x | Represents a reciprocal transformation.")]
+  public class ReciprocalTransformation : Transformation<double> {
+
+    #region properties
+    public override string ShortName {
+      get { return "Inv"; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected ReciprocalTransformation(bool deserializing) : base(deserializing) { }
+    protected ReciprocalTransformation(ReciprocalTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ReciprocalTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ReciprocalTransformation(this, cloner);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      return data.Select(d => d > 0 ? 1.0 / d : d);
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      errorMsg = null;
+      int errorCounter = data.Count(i => i <= 0.0);
+      if (errorCounter > 0) {
+        errorMsg = String.Format("{0} values are zero or below zero. 1/x can not be applied onto these values", errorCounter);
+        return false;
+      }
+      return true;
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ShiftStandardDistributionTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ShiftStandardDistributionTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ShiftStandardDistributionTransformation.cs	(revision 15846)
@@ -0,0 +1,100 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Shift Standard Distribution Transformation", "f(x) = ((x - m_org) / s_org ) * s_tar + m_tar | Represents Transformation to unit standard deviation and additional linear transformation to a target Mean and Standard deviation")]
+  public class ShiftStandardDistributionTransformation : Transformation<double> {
+    protected const string OriginalMeanParameterName = "Original Mean";
+    protected const string OriginalStandardDeviationParameterName = "Original Standard Deviation";
+    protected const string MeanParameterName = "Mean";
+    protected const string StandardDeviationParameterName = "Standard Deviation";
+
+    #region Parameters
+    public IValueParameter<DoubleValue> OriginalMeanParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[OriginalMeanParameterName]; }
+    }
+    public IValueParameter<DoubleValue> OriginalStandardDeviationParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[OriginalStandardDeviationParameterName]; }
+    }
+    public IValueParameter<DoubleValue> MeanParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[MeanParameterName]; }
+    }
+    public IValueParameter<DoubleValue> StandardDeviationParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[StandardDeviationParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Std"; }
+    }
+    public double OriginalMean {
+      get { return OriginalMeanParameter.Value.Value; }
+      set { OriginalMeanParameter.Value.Value = value; }
+    }
+    public double OriginalStandardDeviation {
+      get { return OriginalStandardDeviationParameter.Value.Value; }
+      set { OriginalStandardDeviationParameter.Value.Value = value; }
+    }
+    public double Mean {
+      get { return MeanParameter.Value.Value; }
+    }
+    public double StandardDeviation {
+      get { return StandardDeviationParameter.Value.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected ShiftStandardDistributionTransformation(bool deserializing) : base(deserializing) { }
+    protected ShiftStandardDistributionTransformation(ShiftStandardDistributionTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ShiftStandardDistributionTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+      Parameters.Add(new ValueParameter<DoubleValue>(OriginalMeanParameterName, "m_org | Mean value of the original data's deviation.", new DoubleValue()));
+      Parameters.Add(new ValueParameter<DoubleValue>(OriginalStandardDeviationParameterName, "s_org | Standard deviation of the original data.", new DoubleValue()));
+      OriginalMeanParameter.Hidden = true;
+      OriginalStandardDeviationParameter.Hidden = true;
+      Parameters.Add(new ValueParameter<DoubleValue>(MeanParameterName, "m_tar | Mean value for the target deviation.", new DoubleValue(0.0)));
+      Parameters.Add(new ValueParameter<DoubleValue>(StandardDeviationParameterName, "s_tar | Standard deviation for the target data.", new DoubleValue(1.0)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ShiftStandardDistributionTransformation(this, cloner);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      if (OriginalStandardDeviation.IsAlmost(0.0)) {
+        return data;
+      }
+      var old_m = OriginalMean;
+      var old_s = OriginalStandardDeviation;
+      var m = Mean;
+      var s = StandardDeviation;
+      return data
+        .Select(d => (d - old_m) / old_s) // standardized
+        .Select(d => d * s + m);
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      ConfigureParameters(data);
+      errorMsg = "";
+      if (OriginalStandardDeviation.IsAlmost(0.0)) {
+        errorMsg = "Standard deviaton for the original data is 0.0, Transformation cannot be applied onto these values.";
+        return false;
+      }
+      return true;
+    }
+
+    public override void ConfigureParameters(IEnumerable<double> data) {
+      OriginalStandardDeviation = data.StandardDeviation();
+      OriginalMean = data.Average();
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ShiftToRangeTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ShiftToRangeTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/ShiftToRangeTransformation.cs	(revision 15846)
@@ -0,0 +1,62 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [StorableClass]
+  [Item("Shift to Range Transformation", "f(x) = k * x + d, start <= f(x) <= end | Represents a linear Transformation using Parameters defining a target range")]
+  public class ShiftToRangeTransformation : LinearTransformation {
+    protected const string RangeParameterName = "Range";
+
+    #region Parameters
+    public IValueParameter<DoubleRange> RangeParameter {
+      get { return (IValueParameter<DoubleRange>)Parameters[RangeParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public override string ShortName {
+      get { return "Sft"; }
+    }
+    public DoubleRange Range {
+      get { return RangeParameter.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected ShiftToRangeTransformation(bool deserializing) : base(deserializing) { }
+    protected ShiftToRangeTransformation(ShiftToRangeTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public ShiftToRangeTransformation(IEnumerable<string> allowedColumns)
+      : base(allowedColumns) {
+      MultiplierParameter.Hidden = true;
+      AddendParameter.Hidden = true;
+      Parameters.Add(new ValueParameter<DoubleRange>(RangeParameterName, "start, end | Range for the target window of the linear transformation", new DoubleRange(0.0, 1.0)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ShiftToRangeTransformation(this, cloner);
+    }
+
+    public override bool Check(IEnumerable<double> data, out string errorMsg) {
+      ConfigureParameters(data);
+      return base.Check(data, out errorMsg);
+    }
+
+    public override void ConfigureParameters(IEnumerable<double> data) {
+      double originalRangeStart = data.Min();
+      double originalRangeEnd = data.Max();
+
+      double originalRangeWidth = originalRangeEnd - originalRangeStart;
+      double targetRangeWidth = Range.End - Range.Start;
+
+      Multiplier = targetRangeWidth / originalRangeWidth;
+      Addend = Range.Start - originalRangeStart * Multiplier;
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/Transformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/Transformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations (old)/Transformation.cs	(revision 15846)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+
+  [Item("Transformation", "Represents the base class for a transformation.")]
+  [StorableClass]
+  public abstract class Transformation : ParameterizedNamedItem, ITransformation {
+    protected const string ColumnParameterName = "Column";
+    #region parameter properties
+    public IConstrainedValueParameter<StringValue> ColumnParameter {
+      get { return (IConstrainedValueParameter<StringValue>)Parameters[ColumnParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public abstract string ShortName { get; }
+
+    public string Column {
+      get { return ColumnParameter.Value.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected Transformation(bool deserializing) : base(deserializing) { }
+    protected Transformation(Transformation original, Cloner cloner) : base(original, cloner) { }
+    protected Transformation(IEnumerable<string> allowedColumns) {
+      var allowed = new ItemSet<StringValue>(allowedColumns.Select(e => new StringValue(e)));
+      Parameters.Add(new ConstrainedValueParameter<StringValue>(ColumnParameterName, "Column used for the Transformation", allowed));
+    }
+  }
+
+  [Item("Transformation", "Represents the base class for a transformation.")]
+  [StorableClass]
+  public abstract class Transformation<T> : Transformation, ITransformation<T> {
+
+    [StorableConstructor]
+    protected Transformation(bool deserializing) : base(deserializing) { }
+    protected Transformation(Transformation<T> original, Cloner cloner) : base(original, cloner) { }
+    protected Transformation(IEnumerable<string> allowedColumns) : base(allowedColumns) { }
+
+    public virtual void ConfigureParameters(IEnumerable<T> data) {
+      // override in transformations with parameters
+    }
+
+    public abstract IEnumerable<T> Apply(IEnumerable<T> data);
+    public IEnumerable<T> ConfigureAndApply(IEnumerable<T> data) {
+      ConfigureParameters(data);
+      return Apply(data);
+    }
+
+    public abstract bool Check(IEnumerable<T> data, out string errorMsg);
+  }
+}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/CopyColumnTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/CopyColumnTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,65 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("CopyColumnTransformation", "Represents a transformation which represents a copied Column.")]
-  public class CopyColumnTransformation : Transformation {
-    protected const string CopiedColumnNameParameterName = "CopiedColumnName";
-
-    #region Parameters
-    public IValueParameter<StringValue> CopiedColumnNameParameter {
-      get { return (IValueParameter<StringValue>)Parameters[CopiedColumnNameParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Cpy"; }
-    }
-    public string CopiedColumnName {
-      get { return CopiedColumnNameParameter.Value.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected CopyColumnTransformation(bool deserializing) : base(deserializing) { }
-    protected CopyColumnTransformation(CopyColumnTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public CopyColumnTransformation()
-      : base(Enumerable.Empty<string>()) {
-      Parameters.Add(new ValueParameter<StringValue>(CopiedColumnNameParameterName, "Name for the copied column", new StringValue()));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new CopyColumnTransformation(this, cloner);
-    }
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ExponentialTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ExponentialTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,56 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Exponential Transformation", "f(x) = b ^ x | Represents a exponential transformation.")]
-  public class ExponentialTransformation : Transformation<double> {
-    protected const string BaseParameterName = "Base";
-
-    #region Parameters
-    public IValueParameter<DoubleValue> BaseParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[BaseParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Exp"; }
-    }
-    public double Base {
-      get { return BaseParameter.Value.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected ExponentialTransformation(bool deserializing) : base(deserializing) { }
-
-    protected ExponentialTransformation(ExponentialTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-
-    public ExponentialTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-      Parameters.Add(new ValueParameter<DoubleValue>(BaseParameterName, "b | Base of exp-function", new DoubleValue(Math.E)));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ExponentialTransformation(this, cloner);
-    }
-
-    public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      return data.Select(d => Math.Pow(Base, d));
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      errorMsg = "";
-      return true;
-    }
-  }
-}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/IdentityTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/IdentityTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/IdentityTransformation.cs	(revision 15846)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [Item("Identity", "Identity transformation x' = x")]
+  [StorableClass]
+  public class IdentityTransformation : Transformation<double> {
+    #region Constructor, Cloning & Persistence
+    public IdentityTransformation()
+      : base() {
+    }
+
+    protected IdentityTransformation(IdentityTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IdentityTransformation(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected IdentityTransformation(bool deserializing)
+      : base(deserializing) {
+    }
+    #endregion
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      return data;
+    }
+
+    public override IEnumerable<double> InverseApply(IEnumerable<double> data) {
+      return data;
+    }
+  }
+}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LinearTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LinearTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,97 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Linear Transformation", "f(x) = k * x + d | Represents a linear transformation with multiplication and addition.")]
-  public class LinearTransformation : Transformation<double> {
-    protected const string MultiplierParameterName = "Multiplier";
-    protected const string AddendParameterName = "Addend";
-
-    #region Parameters
-    public IValueParameter<DoubleValue> MultiplierParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[MultiplierParameterName]; }
-    }
-    public IValueParameter<DoubleValue> AddendParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[AddendParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Lin"; }
-    }
-    public double Multiplier {
-      get { return MultiplierParameter.Value.Value; }
-      set {
-        MultiplierParameter.Value.Value = value;
-      }
-    }
-
-    public double Addend {
-      get { return AddendParameter.Value.Value; }
-      set {
-        AddendParameter.Value.Value = value;
-      }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected LinearTransformation(bool deserializing) : base(deserializing) { }
-    protected LinearTransformation(LinearTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public LinearTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-      Parameters.Add(new ValueParameter<DoubleValue>(MultiplierParameterName, "k | Multiplier for linear transformation", new DoubleValue(1.0)));
-      Parameters.Add(new ValueParameter<DoubleValue>(AddendParameterName, "d | Addend for linear transformation", new DoubleValue(0.0)));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new LinearTransformation(this, cloner);
-    }
-
-    public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      var m = Multiplier;
-      var a = Addend;
-      return data.Select(e => e * m + a);
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      errorMsg = null;
-      if (Multiplier.IsAlmost(0.0)) {
-        errorMsg = String.Format("Multiplicand is 0, all {0} entries will be set to {1}. Inverse apply will not be possible (division by 0).", data.Count(), Addend);
-        return false;
-      }
-      return true;
-    }
-  }
-}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LogarithmTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LogarithmTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LogarithmTransformation.cs	(revision 15846)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [Item("Logarithm", "Logarithm transformation x' = log(x, Base)")]
+  [StorableClass]
+  public class LogarithmTransformation : Transformation<double> {
+    #region Parameters
+    private FixedValueParameter<DoubleValue> BaseParameter {
+      get { return (FixedValueParameter<DoubleValue>)Parameters["Base"]; }
+    }
+    #endregion
+
+    #region Properties
+    public double Base {
+      get { return BaseParameter.Value.Value; }
+      set { BaseParameter.Value.Value = value; }
+    }
+    #endregion
+
+    #region Constructor, Cloning & Persistence
+    public LogarithmTransformation()
+      : base() {
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Base", "Base the logarithm", new DoubleValue(Math.E)));
+    }
+
+    protected LogarithmTransformation(LogarithmTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LogarithmTransformation(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected LogarithmTransformation(bool deserializing)
+      : base(deserializing) {
+    }
+    #endregion
+
+    public override bool Check(IEnumerable<double> data, out string errorMessage) {
+      if (data.Any(x => x <= 0)) {
+        errorMessage = "Log is not available for zero or negative values";
+        return false;
+      }
+      return base.Check(data, out errorMessage);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      return Apply(data, Base);
+    }
+
+    public override IEnumerable<double> InverseApply(IEnumerable<double> data) {
+      return InverseApply(data, Base);
+    }
+
+    public static IEnumerable<double> Apply(IEnumerable<double> data, double @base = Math.E) {
+      return data.Select(x => Math.Log(x, @base));
+    }
+
+    public static IEnumerable<double> InverseApply(IEnumerable<double> data, double @base = Math.E) {
+      return ExponentialTransformation.Apply(data, @base);
+    }
+  }
+}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LogarithmicTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LogarithmicTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,61 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Logarithmic Transformation", "f(x) = log(x, b) | Represents a logarithmic transformation.")]
-  public class LogarithmicTransformation : Transformation<double> {
-    protected const string BaseParameterName = "Base";
-
-    #region Parameters
-    public IValueParameter<DoubleValue> BaseParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[BaseParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Log"; }
-    }
-    public double Base {
-      get { return BaseParameter.Value.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected LogarithmicTransformation(bool deserializing) : base(deserializing) { }
-    protected LogarithmicTransformation(LogarithmicTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public LogarithmicTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-      Parameters.Add(new ValueParameter<DoubleValue>(BaseParameterName, "b | Base of log-function", new DoubleValue(Math.E)));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new LogarithmicTransformation(this, cloner);
-    }
-
-    public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      var b = Base;
-      return data.Select(d => d > 0.0 ? Math.Log(d, b) : d);
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      errorMsg = null;
-      int errorCounter = data.Count(i => i <= 0.0);
-      if (errorCounter > 0) {
-        errorMsg = String.Format("{0} values are zero or below zero. Logarithm can not be applied onto these values", errorCounter);
-        return false;
-      }
-      return true;
-    }
-
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/PowerTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/PowerTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,55 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Power Transformation", "f(x) = x ^ exp | Represents a power transformation.")]
-  public class PowerTransformation : Transformation<double> {
-    protected const string ExponentParameterName = "Exponent";
-
-    #region Parameters
-    public IValueParameter<DoubleValue> ExponentParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[ExponentParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Pow"; }
-    }
-    public double Exponent {
-      get { return ExponentParameter.Value.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected PowerTransformation(bool deserializing) : base(deserializing) { }
-    protected PowerTransformation(PowerTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public PowerTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-      Parameters.Add(new ValueParameter<DoubleValue>(ExponentParameterName, "exp | Exponent for Exponentation", new DoubleValue(2.0)));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PowerTransformation(this, cloner);
-    }
-
-    public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      return data.Select(i => Math.Pow(i, Exponent));
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      errorMsg = "";
-      return true;
-    }
-
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ReciprocalTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ReciprocalTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,46 +1,0 @@
-﻿
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Reciprocal Transformation", "f(x) = 1 / x | Represents a reciprocal transformation.")]
-  public class ReciprocalTransformation : Transformation<double> {
-
-    #region properties
-    public override string ShortName {
-      get { return "Inv"; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected ReciprocalTransformation(bool deserializing) : base(deserializing) { }
-    protected ReciprocalTransformation(ReciprocalTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public ReciprocalTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ReciprocalTransformation(this, cloner);
-    }
-
-    public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      return data.Select(d => d > 0 ? 1.0 / d : d);
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      errorMsg = null;
-      int errorCounter = data.Count(i => i <= 0.0);
-      if (errorCounter > 0) {
-        errorMsg = String.Format("{0} values are zero or below zero. 1/x can not be applied onto these values", errorCounter);
-        return false;
-      }
-      return true;
-    }
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ShiftStandardDistributionTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ShiftStandardDistributionTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,100 +1,0 @@
-﻿using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Shift Standard Distribution Transformation", "f(x) = ((x - m_org) / s_org ) * s_tar + m_tar | Represents Transformation to unit standard deviation and additional linear transformation to a target Mean and Standard deviation")]
-  public class ShiftStandardDistributionTransformation : Transformation<double> {
-    protected const string OriginalMeanParameterName = "Original Mean";
-    protected const string OriginalStandardDeviationParameterName = "Original Standard Deviation";
-    protected const string MeanParameterName = "Mean";
-    protected const string StandardDeviationParameterName = "Standard Deviation";
-
-    #region Parameters
-    public IValueParameter<DoubleValue> OriginalMeanParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[OriginalMeanParameterName]; }
-    }
-    public IValueParameter<DoubleValue> OriginalStandardDeviationParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[OriginalStandardDeviationParameterName]; }
-    }
-    public IValueParameter<DoubleValue> MeanParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[MeanParameterName]; }
-    }
-    public IValueParameter<DoubleValue> StandardDeviationParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[StandardDeviationParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Std"; }
-    }
-    public double OriginalMean {
-      get { return OriginalMeanParameter.Value.Value; }
-      set { OriginalMeanParameter.Value.Value = value; }
-    }
-    public double OriginalStandardDeviation {
-      get { return OriginalStandardDeviationParameter.Value.Value; }
-      set { OriginalStandardDeviationParameter.Value.Value = value; }
-    }
-    public double Mean {
-      get { return MeanParameter.Value.Value; }
-    }
-    public double StandardDeviation {
-      get { return StandardDeviationParameter.Value.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected ShiftStandardDistributionTransformation(bool deserializing) : base(deserializing) { }
-    protected ShiftStandardDistributionTransformation(ShiftStandardDistributionTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public ShiftStandardDistributionTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-      Parameters.Add(new ValueParameter<DoubleValue>(OriginalMeanParameterName, "m_org | Mean value of the original data's deviation.", new DoubleValue()));
-      Parameters.Add(new ValueParameter<DoubleValue>(OriginalStandardDeviationParameterName, "s_org | Standard deviation of the original data.", new DoubleValue()));
-      OriginalMeanParameter.Hidden = true;
-      OriginalStandardDeviationParameter.Hidden = true;
-      Parameters.Add(new ValueParameter<DoubleValue>(MeanParameterName, "m_tar | Mean value for the target deviation.", new DoubleValue(0.0)));
-      Parameters.Add(new ValueParameter<DoubleValue>(StandardDeviationParameterName, "s_tar | Standard deviation for the target data.", new DoubleValue(1.0)));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ShiftStandardDistributionTransformation(this, cloner);
-    }
-
-    public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      if (OriginalStandardDeviation.IsAlmost(0.0)) {
-        return data;
-      }
-      var old_m = OriginalMean;
-      var old_s = OriginalStandardDeviation;
-      var m = Mean;
-      var s = StandardDeviation;
-      return data
-        .Select(d => (d - old_m) / old_s) // standardized
-        .Select(d => d * s + m);
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      ConfigureParameters(data);
-      errorMsg = "";
-      if (OriginalStandardDeviation.IsAlmost(0.0)) {
-        errorMsg = "Standard deviaton for the original data is 0.0, Transformation cannot be applied onto these values.";
-        return false;
-      }
-      return true;
-    }
-
-    public override void ConfigureParameters(IEnumerable<double> data) {
-      OriginalStandardDeviation = data.StandardDeviation();
-      OriginalMean = data.Average();
-    }
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ShiftToRangeTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ShiftToRangeTransformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,62 +1,0 @@
-﻿using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  [StorableClass]
-  [Item("Shift to Range Transformation", "f(x) = k * x + d, start <= f(x) <= end | Represents a linear Transformation using Parameters defining a target range")]
-  public class ShiftToRangeTransformation : LinearTransformation {
-    protected const string RangeParameterName = "Range";
-
-    #region Parameters
-    public IValueParameter<DoubleRange> RangeParameter {
-      get { return (IValueParameter<DoubleRange>)Parameters[RangeParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public override string ShortName {
-      get { return "Sft"; }
-    }
-    public DoubleRange Range {
-      get { return RangeParameter.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected ShiftToRangeTransformation(bool deserializing) : base(deserializing) { }
-    protected ShiftToRangeTransformation(ShiftToRangeTransformation original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public ShiftToRangeTransformation(IEnumerable<string> allowedColumns)
-      : base(allowedColumns) {
-      MultiplierParameter.Hidden = true;
-      AddendParameter.Hidden = true;
-      Parameters.Add(new ValueParameter<DoubleRange>(RangeParameterName, "start, end | Range for the target window of the linear transformation", new DoubleRange(0.0, 1.0)));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ShiftToRangeTransformation(this, cloner);
-    }
-
-    public override bool Check(IEnumerable<double> data, out string errorMsg) {
-      ConfigureParameters(data);
-      return base.Check(data, out errorMsg);
-    }
-
-    public override void ConfigureParameters(IEnumerable<double> data) {
-      double originalRangeStart = data.Min();
-      double originalRangeEnd = data.Max();
-
-      double originalRangeWidth = originalRangeEnd - originalRangeStart;
-      double targetRangeWidth = Range.End - Range.Start;
-
-      Multiplier = targetRangeWidth / originalRangeWidth;
-      Addend = Range.Start - originalRangeStart * Multiplier;
-    }
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/Transformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/Transformation.cs	(revision 15845)
+++ 	(revision )
@@ -1,80 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-
-  [Item("Transformation", "Represents the base class for a transformation.")]
-  [StorableClass]
-  public abstract class Transformation : ParameterizedNamedItem, ITransformation {
-    protected const string ColumnParameterName = "Column";
-    #region parameter properties
-    public IConstrainedValueParameter<StringValue> ColumnParameter {
-      get { return (IConstrainedValueParameter<StringValue>)Parameters[ColumnParameterName]; }
-    }
-    #endregion
-
-    #region properties
-    public abstract string ShortName { get; }
-
-    public string Column {
-      get { return ColumnParameter.Value.Value; }
-    }
-    #endregion
-
-    [StorableConstructor]
-    protected Transformation(bool deserializing) : base(deserializing) { }
-    protected Transformation(Transformation original, Cloner cloner) : base(original, cloner) { }
-    protected Transformation(IEnumerable<string> allowedColumns) {
-      var allowed = new ItemSet<StringValue>(allowedColumns.Select(e => new StringValue(e)));
-      Parameters.Add(new ConstrainedValueParameter<StringValue>(ColumnParameterName, "Column used for the Transformation", allowed));
-    }
-  }
-
-  [Item("Transformation", "Represents the base class for a transformation.")]
-  [StorableClass]
-  public abstract class Transformation<T> : Transformation, ITransformation<T> {
-
-    [StorableConstructor]
-    protected Transformation(bool deserializing) : base(deserializing) { }
-    protected Transformation(Transformation<T> original, Cloner cloner) : base(original, cloner) { }
-    protected Transformation(IEnumerable<string> allowedColumns) : base(allowedColumns) { }
-
-    public virtual void ConfigureParameters(IEnumerable<T> data) {
-      // override in transformations with parameters
-    }
-
-    public abstract IEnumerable<T> Apply(IEnumerable<T> data);
-    public IEnumerable<T> ConfigureAndApply(IEnumerable<T> data) {
-      ConfigureParameters(data);
-      return Apply(data);
-    }
-
-    public abstract bool Check(IEnumerable<T> data, out string errorMsg);
-  }
-}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ZNormalizationTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ZNormalizationTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ZNormalizationTransformation.cs	(revision 15846)
@@ -0,0 +1,128 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [Item("Z-Score Normalization", "Z-Score normalization transformation to standardize (target_mu = 0, target_sigma = 1) the values")]
+  [StorableClass]
+  public class ZNormalizationTransformation : Transformation<double> {
+    #region Parameters
+    private IFixedValueParameter<DoubleValue> TargetMeanParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["Target Mean"]; }
+    }
+    private IFixedValueParameter<DoubleValue> TargetStandardDeviationParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["Target Standard Deviation"]; }
+    }
+    private IFixedValueParameter<DoubleValue> OriginalMeanParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["Original Mean"]; }
+    }
+    private IFixedValueParameter<DoubleValue> OriginalStandardDeviationParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["Original Standard Deviation"]; }
+    }
+    #endregion
+
+    #region Properties
+    public double TargetMean {
+      get { return TargetMeanParameter.Value.Value; }
+      set { TargetMeanParameter.Value.Value = value; }
+    }
+    public double TargetStandardDeviation {
+      get { return TargetStandardDeviationParameter.Value.Value; }
+      set { TargetStandardDeviationParameter.Value.Value = value; }
+    }
+    public double OriginalMean {
+      get { return OriginalMeanParameter.Value.Value; }
+      set { OriginalMeanParameter.Value.Value = value; }
+    }
+    public double OriginalStandardDeviation {
+      get { return OriginalStandardDeviationParameter.Value.Value; }
+      set { OriginalStandardDeviationParameter.Value.Value = value; }
+    }
+    #endregion
+
+    #region Constructor, Cloning & Persistence
+    public ZNormalizationTransformation()
+      : base() {
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Target Mean", new DoubleValue(0)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Target Standard Deviation", new DoubleValue(1)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Original Mean", new DoubleValue(double.NaN)) { Hidden = true });
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Original Standard Deviation", new DoubleValue(double.NaN)) { Hidden = true });
+    }
+
+    protected ZNormalizationTransformation(ZNormalizationTransformation original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZNormalizationTransformation(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected ZNormalizationTransformation(bool deserializing)
+      : base(deserializing) {
+    }
+    #endregion
+
+    public override bool Check(IEnumerable<double> data, out string errorMessage) {
+      if (data.StandardDeviationPop().IsAlmost(0.0)) {
+        errorMessage = "Z-Score Normalization cannot be applied for data with a standard deviation of zero.";
+        return false;
+      }
+      return base.Check(data, out errorMessage);
+    }
+
+    public override void Configure(IEnumerable<double> data) {
+      OriginalMean = data.Average();
+      OriginalStandardDeviation = data.StandardDeviationPop();
+      base.Configure(data);
+    }
+
+    public override IEnumerable<double> Apply(IEnumerable<double> data) {
+      if (double.IsNaN(OriginalMean) || double.IsNaN(OriginalStandardDeviation))
+        Configure(data);
+
+      return Apply(data, TargetMean, TargetStandardDeviation, OriginalMean, OriginalStandardDeviation);
+    }
+
+    public override IEnumerable<double> InverseApply(IEnumerable<double> data) {
+      return InverseApply(data, TargetMean, TargetStandardDeviation, OriginalMean, OriginalStandardDeviation);
+    }
+
+    public static IEnumerable<double> Apply(IEnumerable<double> data, double targetMean, double targetStandardDeviation, double originalMean = double.NaN, double originalStandardDeviation = double.NaN) {
+      if (double.IsNaN(originalMean)) originalMean = data.Average();
+      if (double.IsNaN(originalStandardDeviation)) originalStandardDeviation = data.StandardDeviationPop();
+
+      return data
+        .Select(x => (x - originalMean) / originalStandardDeviation) // standardize (0, 1)
+        .Select(x => x * targetStandardDeviation + targetMean);
+    }
+
+    public static IEnumerable<double> InverseApply(IEnumerable<double> data, double targetMean, double targetStandardDeviation, double originalMean, double originalStandardDeviation) {
+      return Apply(data, originalMean, originalStandardDeviation, targetMean, targetStandardDeviation);
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisProblemData.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisProblemData.cs	(revision 15846)
@@ -43,5 +43,5 @@
     IEnumerable<int> TestIndices { get; }
 
-    IEnumerable<ITransformation> Transformations { get; }
+    IEnumerable<IDataAnalysisTransformation> Transformations { get; }
 
     bool IsTrainingSample(int index);
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs	(revision 15846)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Core;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public interface IDataAnalysisTransformation : INamedItem {
+
+    string OriginalVariable { get; set; }
+    string TransformedVariable { get; set; }
+
+    ITransformation Transformation { get; set; }
+
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/ITransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/ITransformation.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/ITransformation.cs	(revision 15846)
@@ -24,13 +24,14 @@
 
 namespace HeuristicLab.Problems.DataAnalysis {
-  public interface ITransformation : IParameterizedItem {
-    string ShortName { get; }
-    string Column { get; }
+  public interface ITransformation : IParameterizedNamedItem {
   }
 
   public interface ITransformation<T> : ITransformation {
-    void ConfigureParameters(IEnumerable<T> data);
-    IEnumerable<T> ConfigureAndApply(IEnumerable<T> data);
+    bool Check(IEnumerable<T> data, out string errorMessage);
+
+    void Configure(IEnumerable<T> data);
+
     IEnumerable<T> Apply(IEnumerable<T> data);
+    IEnumerable<T> InverseApply(IEnumerable<T> data);
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/ITransformationMapper.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/ITransformationMapper.cs	(revision 15845)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/ITransformationMapper.cs	(revision 15846)
@@ -21,5 +21,8 @@
 
 
+using System;
+
 namespace HeuristicLab.Problems.DataAnalysis {
+  [Obsolete]
   public interface ITransformationMapper<out T> {
     T GenerateModel(ITransformation transformation);
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionModel.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionModel.cs	(revision 15846)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public interface ITransformedRegressionModel : IRegressionModel {
+    IRegressionModel OriginalModel { get; }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionSolution.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionSolution.cs	(revision 15846)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionSolution.cs	(revision 15846)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public interface ITransformedRegressionSolution : IRegressionSolution {
+    new ITransformedRegressionModel Model { get; }
+  }
+}
