Index: anches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.Designer.cs	(revision 15864)
+++ 	(revision )
@@ -1,53 +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
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  partial class CheckedTransformationListView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      components = new System.ComponentModel.Container();
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-    }
-
-    #endregion
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15864)
+++ 	(revision )
@@ -1,75 +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 System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.Data;
-using HeuristicLab.MainForm;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  [View("CheckedTransformationList View")]
-  [Content(typeof(ICheckedItemList<IDataAnalysisTransformation>), false)]
-  public partial class CheckedTransformationListView : CheckedItemListView<IDataAnalysisTransformation> {
-
-    internal IFilteredPreprocessingData PreprocessingData { get; set; }
-
-    public CheckedTransformationListView() {
-      InitializeComponent();
-      itemsGroupBox.Text = "Transformations";
-    }
-
-    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;
-
-      //    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;
-    //}
-  }
-}
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 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15865)
@@ -202,9 +202,9 @@
       <DependentUpon>CheckedFilterCollectionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="CheckedTransformationListView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="CheckedTransformationListView.Designer.cs">
-      <DependentUpon>CheckedTransformationListView.cs</DependentUpon>
+    <Compile Include="TransformationListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TransformationListView.Designer.cs">
+      <DependentUpon>TransformationListView.cs</DependentUpon>
     </Compile>
     <Compile Include="ComparisonFilterView.cs">
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationListView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationListView.Designer.cs	(revision 15865)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationListView.Designer.cs	(revision 15865)
@@ -0,0 +1,53 @@
+﻿#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.DataPreprocessing.Views {
+  partial class TransformationListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationListView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationListView.cs	(revision 15865)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationListView.cs	(revision 15865)
@@ -0,0 +1,115 @@
+﻿#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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("TransformationList View")]
+  [Content(typeof(IItemList<PreprocessingTransformation>), false)]
+  public partial class TransformationListView : ItemListView<PreprocessingTransformation> {
+
+    internal IFilteredPreprocessingData PreprocessingData { get; set; }
+
+    public TransformationListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Transformations";
+    }
+
+    protected override PreprocessingTransformation CreateItem() {
+      var variableNames = PreprocessingData.VariableNames.Select(x => new StringValue(x))
+        .Concat(Content.Select(x => new StringValue(x.TransformedVariable))).Distinct();
+
+      var newTransformation = new PreprocessingTransformation(variableNames);
+      newTransformation.TransformedVariableParameter.ValidValues.Add(new StringValue("<New Variable>"));
+      return newTransformation;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) return;
+
+      int i = 0;
+      foreach (ListViewItem item in ItemsListView.Items) {
+        var transformation = PreprocessingData.Transformations[i];
+
+        item.ForeColor = transformation.IsApplied ? Color.Black : Color.Gray;
+        i++;
+      }
+      UpdateButtonsState();
+    }
+
+    protected override void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<PreprocessingTransformation>> e) {
+      base.Content_ItemsAdded(sender, e);
+
+      foreach (var transformation in e.Items) {
+        UpdateListViewItemsColor(transformation.Value);
+      }
+    }
+
+    protected override void RegisterItemEvents(PreprocessingTransformation item) {
+      base.RegisterItemEvents(item);
+      item.PropertyChanged += Item_PropertyChanged;
+    }
+    protected override void DeregisterItemEvents(PreprocessingTransformation item) {
+      item.PropertyChanged -= Item_PropertyChanged;
+      base.DeregisterItemEvents(item);
+    }
+
+    private void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
+      if (sender is PreprocessingTransformation transformation)
+        UpdateListViewItemsColor(transformation);
+    }
+
+    protected override void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      base.itemsListView_SelectedIndexChanged(sender, e);
+
+      UpdateButtonsState();
+    }
+
+    private void UpdateListViewItemsColor(PreprocessingTransformation transformation) {
+      foreach (ListViewItem item in itemListViewItemMapping[transformation]) {
+        item.ForeColor = transformation.IsApplied ? Color.Black : Color.Gray;
+      }
+    }
+
+    private void UpdateButtonsState() {
+      if (itemsListView.SelectedItems.Count != 1) return;
+      int selectedIndex = itemsListView.SelectedIndices[0];
+
+      // TODO: do not move/remove already applied transformations
+      // TODO: general disalow of movement?
+      if (Content[selectedIndex].IsApplied) {
+        moveUpButton.Enabled = selectedIndex > 0 && Content[selectedIndex - 1].IsApplied;
+        moveDownButton.Enabled = false;
+        removeButton.Enabled = false;
+      }
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.Designer.cs	(revision 15865)
@@ -47,5 +47,5 @@
       this.applyButton = new System.Windows.Forms.Button();
       this.lblFilterNotice = new System.Windows.Forms.Label();
-      this.transformationListView = new HeuristicLab.DataPreprocessing.Views.CheckedTransformationListView();
+      this.transformationListView = new HeuristicLab.DataPreprocessing.Views.TransformationListView();
       this.SuspendLayout();
       // 
@@ -100,5 +100,5 @@
 
     #endregion
-    private CheckedTransformationListView transformationListView;
+    private TransformationListView transformationListView;
     private System.Windows.Forms.Button applyButton;
     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 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15865)
@@ -43,6 +43,7 @@
       if (Content == null) {
         transformationListView.Content = null;
+        transformationListView.PreprocessingData = null;
       } else {
-        transformationListView.Content = Content.CheckedTransformationList;
+        transformationListView.Content = Content.TransformationList;
         transformationListView.PreprocessingData = Content.PreprocessingData;
         CheckFilters();
@@ -78,5 +79,5 @@
 
       if (success) {
-        //Content.CheckedTransformationList.Clear();
+        //Content.TransformationList.Clear();
         MessageBox.Show(this, "Transformations applied.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
       } else {
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15865)
@@ -29,4 +29,5 @@
 
 namespace HeuristicLab.DataPreprocessing {
+
   [Item("Transformation", "Represents the transformation grid.")]
   [StorableClass]
@@ -37,15 +38,15 @@
 
     [Storable]
-    public ICheckedItemList<IDataAnalysisTransformation> CheckedTransformationList { get; private set; }
+    public IItemList<PreprocessingTransformation> TransformationList { get; private set; }
 
     #region Constructor, Cloning & Persistence
     public TransformationContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
-      CheckedTransformationList = new CheckedItemList<IDataAnalysisTransformation>();
+      TransformationList = new ItemList<PreprocessingTransformation>();
     }
 
     public TransformationContent(TransformationContent original, Cloner cloner)
       : base(original, cloner) {
-      CheckedTransformationList = cloner.Clone(original.CheckedTransformationList);
+      TransformationList = cloner.Clone(original.TransformationList);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -59,11 +60,9 @@
 
     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) {
+      foreach (var transformation in TransformationList.Where(x => !x.IsApplied)) {
         var sourceVariable = transformation.OriginalVariable;
         var targetVariable = transformation.TransformedVariable ?? sourceVariable + " Transformed";
@@ -86,5 +85,6 @@
 
           PreprocessingData.Transformations.Add(transformation);
-          CheckedTransformationList.SetItemCheckedState(transformation, false);
+          transformation.IsApplied = true;
+          // TODO: remove unused valid values in constrainedParameters
         } else {
           success = false;
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15865)
@@ -204,5 +204,5 @@
 
     #region Transformations
-    public IList<IDataAnalysisTransformation> Transformations {
+    public IList<PreprocessingTransformation> 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 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15865)
@@ -78,5 +78,5 @@
 
     #region Transformations
-    IList<IDataAnalysisTransformation> Transformations { get; }
+    IList<PreprocessingTransformation> 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 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15865)
@@ -47,5 +47,5 @@
       Name = "Preprocessing Data";
 
-      Transformations = new List<IDataAnalysisTransformation>();
+      Transformations = new List<PreprocessingTransformation>();
       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<IDataAnalysisTransformation>(original.Transformations.Select(cloner.Clone));
+      Transformations = new List<PreprocessingTransformation>(original.Transformations.Select(cloner.Clone));
 
       InputVariables = new List<string>(original.InputVariables);
@@ -350,5 +350,5 @@
     #region Transformations
     [Storable]
-    public IList<IDataAnalysisTransformation> Transformations { get; protected set; }
+    public IList<PreprocessingTransformation> Transformations { get; protected set; }
     #endregion
 
@@ -414,4 +414,17 @@
       }
 
+      // TODO: set fixed constrained (allowed) values
+      foreach (var trans in problemData.Transformations) {
+        var newTrans = new PreprocessingTransformation(variableNames.Select(x => new StringValue(x))) {
+          OriginalVariable = trans.OriginalVariable,
+          TransformedVariable = trans.TransformedVariable,
+          IsApplied = true
+        };
+        var cloned = (ITransformation)trans.Transformation.Clone();
+        newTrans.TransformationParameter.ValidValues.Add(cloned);
+        newTrans.Transformation = cloned;
+        Transformations.Add(newTrans);
+      }
+
       TrainingPartition = new IntRange(problemData.TrainingPartition.Start, problemData.TrainingPartition.End);
       TestPartition = new IntRange(problemData.TestPartition.Start, problemData.TestPartition.End);
@@ -459,5 +472,5 @@
       public IntRange TrainingPartition { get; set; }
       public IntRange TestPartition { get; set; }
-      public IList<IDataAnalysisTransformation> Transformations { get; set; }
+      public IList<PreprocessingTransformation> Transformations { get; set; }
       public DataPreprocessingChangedEventType ChangedType { get; set; }
 
@@ -487,5 +500,5 @@
         TrainingPartition = new IntRange(TrainingPartition.Start, TrainingPartition.End),
         TestPartition = new IntRange(TestPartition.Start, TestPartition.End),
-        Transformations = new List<IDataAnalysisTransformation>(Transformations),
+        Transformations = new List<PreprocessingTransformation>(Transformations),
         ChangedType = changedType,
         ChangedColumn = column,
@@ -682,5 +695,5 @@
       l = 0;
       ir = n - 1;
-      for (;;) {
+      for (; ; ) {
         if (ir <= l + 1) {
           // Active partition contains 1 or 2 elements.
@@ -707,5 +720,5 @@
           j = ir;
           a = arr[l + 1]; // Partitioning element.
-          for (;;) { // Beginning of innermost loop.
+          for (; ; ) { // Beginning of innermost loop.
             do i++; while (arr[i].CompareTo(a) < 0); // Scan up to find element > a.
             do j--; while (arr[j].CompareTo(a) > 0); // Scan down to find element < a.
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingTransformation.cs	(revision 15865)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingTransformation.cs	(revision 15865)
@@ -0,0 +1,157 @@
+﻿#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.ComponentModel;
+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;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.DataPreprocessing {
+  [Item("Preprocessing Transformation", "")]
+  [StorableClass]
+  public class PreprocessingTransformation : ParameterizedNamedItem, INotifyPropertyChanged {
+    #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 IConstrainedValueParameter<ITransformation> TransformationParameter {
+      get { return (IConstrainedValueParameter<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; }
+    }
+
+    public bool IsApplied {
+      get { return isApplied; }
+      set { if (IsApplied != value) { isApplied = value; OnPropertyChanged(); } }
+    }
+    private bool isApplied;
+
+    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 PreprocessingTransformation(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()));
+
+      IsApplied = false;
+
+      RegisterEventHandlers();
+    }
+
+    protected PreprocessingTransformation(PreprocessingTransformation original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PreprocessingTransformation(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected PreprocessingTransformation(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;
+      OnPropertyChanged(nameof(OriginalVariable));
+    }
+    private void OriginalVariableParameterValue_ValueChanged(object sender, EventArgs e) {
+      OnPropertyChanged(nameof(OriginalVariable));
+    }
+
+    private void TransformedVariableParameter_ValueChanged(object sender, EventArgs e) {
+      TransformedVariableParameter.Value.ValueChanged += TransformedVariableParameterValue_ValueChanged;
+      OnPropertyChanged(nameof(TransformedVariable));
+    }
+    private void TransformedVariableParameterValue_ValueChanged(object sender, EventArgs e) {
+      OnPropertyChanged(nameof(TransformedVariable));
+    }
+
+    private void TransformationParameter_ValueChanged(object sender, EventArgs e) {
+      OnPropertyChanged(nameof(Transformation));
+    }
+    #endregion
+
+    public override string ToString() {
+      return $"{Transformation} ({OriginalVariable} -> {TransformedVariable})";
+    }
+
+    public event PropertyChangedEventHandler PropertyChanged;
+    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
+      OnToStringChanged();
+      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+    }
+  }
+}
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 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15865)
@@ -107,4 +107,8 @@
       <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>
+    </Reference>
     <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -134,4 +138,5 @@
     <Compile Include="Content\MultiScatterPlotContent.cs" />
     <Compile Include="Content\PreprocessingContent.cs" />
+    <Compile Include="Data\PreprocessingTransformation.cs" />
     <Compile Include="Content\SingleScatterPlotContent.cs" />
     <Compile Include="Content\ScatterPlotContent.cs" />
Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15865)
@@ -34,5 +34,5 @@
     }
 
-    private IList<IDataAnalysisTransformation> Transformations {
+    private IList<PreprocessingTransformation> Transformations {
       get { return context.Data.Transformations; }
     }
@@ -76,5 +76,5 @@
         targetVariable = context.Data.VariableNames.First();
       var inputVariables = GetDoubleInputVariables(targetVariable);
-      var newProblemData = new TimeSeriesPrognosisProblemData(ExportedDataset, inputVariables, targetVariable, Transformations) {
+      var newProblemData = new TimeSeriesPrognosisProblemData(ExportedDataset, inputVariables, targetVariable, CreateDataAnalysisTransformation()) {
         TrainingHorizon = oldProblemData.TrainingHorizon,
         TestHorizon = oldProblemData.TestHorizon
@@ -85,9 +85,9 @@
     private IDataAnalysisProblemData CreateRegressionData(RegressionProblemData oldProblemData) {
       // TODO: transformations (additional inputs, target changed)
-      var targetVariable = RegressionProblemData.GetTransformedTragetVariable(oldProblemData.TargetVariable, Transformations);
+      var targetVariable = RegressionProblemData.GetTransformedTragetVariable(oldProblemData.TargetVariable, CreateDataAnalysisTransformation());
       if (!context.Data.VariableNames.Contains(targetVariable))
         targetVariable = context.Data.VariableNames.First();
       var inputVariables = GetDoubleInputVariables(targetVariable);
-      var newProblemData = new RegressionProblemData(ExportedDataset, inputVariables, targetVariable, Transformations);
+      var newProblemData = new RegressionProblemData(ExportedDataset, inputVariables, targetVariable, CreateDataAnalysisTransformation());
       return newProblemData;
     }
@@ -98,5 +98,5 @@
         targetVariable = context.Data.VariableNames.First();
       var inputVariables = GetDoubleInputVariables(targetVariable);
-      var newProblemData = new ClassificationProblemData(ExportedDataset, inputVariables, targetVariable, Transformations) {
+      var newProblemData = new ClassificationProblemData(ExportedDataset, inputVariables, targetVariable, CreateDataAnalysisTransformation()) {
         PositiveClass = oldProblemData.PositiveClass
       };
@@ -105,5 +105,5 @@
 
     private IDataAnalysisProblemData CreateClusteringData(ClusteringProblemData oldProblemData) {
-      return new ClusteringProblemData(ExportedDataset, GetDoubleInputVariables(String.Empty), Transformations);
+      return new ClusteringProblemData(ExportedDataset, GetDoubleInputVariables(String.Empty), CreateDataAnalysisTransformation());
     }
 
@@ -117,6 +117,6 @@
     }
 
-     void SetAllowedInputVariables(IDataAnalysisProblemData problemData, IEnumerable<string> oldInputVariables) {
-       var inputs = DataAnalysisProblemData.ExtendInputVariables(oldInputVariables, Transformations);
+    void SetAllowedInputVariables(IDataAnalysisProblemData problemData, IEnumerable<string> oldInputVariables) {
+      var inputs = DataAnalysisProblemData.ExtendInputVariables(oldInputVariables, problemData.Transformations);
 
       foreach (var input in problemData.InputVariables) {
@@ -142,4 +142,8 @@
       return context.Data.TrainingPartition.End - context.Data.TrainingPartition.Start > 1 || list.Range() > 0;
     }
+
+    private IEnumerable<IDataAnalysisTransformation> CreateDataAnalysisTransformation() {
+      return Transformations.Select(x => new DataAnalysisTransformation(x.OriginalVariable, x.TransformedVariable, (ITransformation)x.Transformation.Clone()));
+    }
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs	(revision 15865)
@@ -21,7 +21,4 @@
 
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.CompilerServices;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -34,14 +31,14 @@
   [StorableClass]
   public class DataAnalysisTransformation : ParameterizedNamedItem, IDataAnalysisTransformation {
-    #region Parameters
-    public IConstrainedValueParameter<StringValue> OriginalVariableParameter {
-      get { return (IConstrainedValueParameter<StringValue>)Parameters["Original Variable"]; }
+    #region Parameter Properties
+    private IFixedValueParameter<StringValue> OriginalVariableParameter {
+      get { return (IFixedValueParameter<StringValue>)Parameters["Original Variable"]; }
     }
 
-    public IConstrainedValueParameter<StringValue> TransformedVariableParameter {
-      get { return (IConstrainedValueParameter<StringValue>)Parameters["Transformed Variable"]; }
+    private IFixedValueParameter<StringValue> TransformedVariableParameter {
+      get { return (IFixedValueParameter<StringValue>)Parameters["Transformed Variable"]; }
     }
 
-    public IValueParameter<ITransformation> TransformationParameter {
+    private IValueParameter<ITransformation> TransformationParameter {
       get { return (IValueParameter<ITransformation>)Parameters["Transformation"]; }
     }
@@ -51,10 +48,10 @@
     public string OriginalVariable {
       get { return OriginalVariableParameter.Value.Value; }
-      set { SetConstrainedValue(OriginalVariableParameter, value); }
+      set { OriginalVariableParameter.Value.Value = value; }
     }
 
     public string TransformedVariable {
       get { return TransformedVariableParameter.Value.Value; }
-      set { SetConstrainedValue(TransformedVariableParameter, value); }
+      set { TransformedVariableParameter.Value.Value = value; }
     }
 
@@ -63,25 +60,15 @@
       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)
+    public DataAnalysisTransformation()
+      : this("", "", new IdentityTransformation()) {
+    }
+    public DataAnalysisTransformation(string originalVariable, string transformedVariable, ITransformation transformation)
       : 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 ValueParameter<ITransformation>("Transformation", new IdentityTransformation()));
+      Parameters.Add(new FixedValueParameter<StringValue>("Original Variable", new StringValue(originalVariable)));
+      Parameters.Add(new FixedValueParameter<StringValue>("Transformed Variable", new StringValue(transformedVariable)));
+      Parameters.Add(new ValueParameter<ITransformation>("Transformation", transformation));
 
       RegisterEventHandlers();
@@ -109,19 +96,10 @@
     #region Event-Handling
     private void RegisterEventHandlers() {
-      OriginalVariableParameter.ValueChanged += OriginalVariableParameter_ValueChanged;
-      TransformedVariableParameter.ValueChanged += TransformedVariableParameter_ValueChanged;
+      OriginalVariableParameter.Value.ValueChanged += OriginalVariableParameterValue_ValueChanged;
+      TransformedVariableParameter.Value.ValueChanged += TransformedVariableParameterValue_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();
     }
@@ -129,10 +107,8 @@
       OnToStringChanged();
     }
-
     private void TransformationParameter_ValueChanged(object sender, EventArgs e) {
       OnToStringChanged();
     }
     #endregion
-
 
     public override string ToString() {
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ExponentialTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ExponentialTransformation.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ExponentialTransformation.cs	(revision 15865)
@@ -49,5 +49,5 @@
     public ExponentialTransformation()
       : base() {
-      Parameters.Add(new FixedValueParameter<DoubleValue>("Base", "Base the logarithm", new DoubleValue(Math.E)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Base", "", new DoubleValue(Math.E)));
     }
 
@@ -65,12 +65,4 @@
     #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);
@@ -80,4 +72,5 @@
       return InverseApply(data, Base);
     }
+
 
     public static IEnumerable<double> Apply(IEnumerable<double> data, double @base = Math.E) {
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LinearTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LinearTransformation.cs	(revision 15864)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LinearTransformation.cs	(revision 15865)
@@ -46,5 +46,5 @@
     public double Slope {
       get { return SlopeParameter.Value.Value; }
-      set { SlopeParameter.Value.Value = value; }
+      set { SlopeParameter.Value.Value = value; } //TODO: check for != 0?
     }
 
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 15864)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/LogarithmTransformation.cs	(revision 15865)
@@ -81,4 +81,5 @@
     }
 
+
     public static IEnumerable<double> Apply(IEnumerable<double> data, double @base = Math.E) {
       return data.Select(x => Math.Log(x, @base));
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 15864)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Transformations/ZNormalizationTransformation.cs	(revision 15865)
@@ -29,5 +29,5 @@
 
 namespace HeuristicLab.Problems.DataAnalysis {
-  [Item("Z-Score Normalization", "Z-Score normalization transformation to standardize (target_mu = 0, target_sigma = 1) the values")]
+  [Item("Z-Score Normalization", "Z-Score normalization transformation to standardize the values to a Target Mean and Target Standard Deviation.")]
   [StorableClass]
   public class ZNormalizationTransformation : Transformation<double> {
@@ -58,9 +58,9 @@
     public double OriginalMean {
       get { return OriginalMeanParameter.Value.Value; }
-      set { OriginalMeanParameter.Value.Value = value; }
+      private set { OriginalMeanParameter.Value.Value = value; }
     }
     public double OriginalStandardDeviation {
       get { return OriginalStandardDeviationParameter.Value.Value; }
-      set { OriginalStandardDeviationParameter.Value.Value = value; }
+      private set { OriginalStandardDeviationParameter.Value.Value = value; }
     }
     #endregion
@@ -103,5 +103,5 @@
 
     public override IEnumerable<double> Apply(IEnumerable<double> data) {
-      if (double.IsNaN(OriginalMean) || double.IsNaN(OriginalStandardDeviation))
+      if (double.IsNaN(OriginalMean) || double.IsNaN(OriginalStandardDeviation)) //TODO isConfigured field?
         Configure(data);
 
@@ -112,4 +112,5 @@
       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) {
