Index: /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15869)
+++ /branches/2906_Transformations/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15870)
@@ -85,5 +85,5 @@
     private IDataAnalysisProblemData CreateRegressionData(RegressionProblemData oldProblemData) {
       // TODO: transformations (additional inputs, target changed)
-      var targetVariable = RegressionProblemData.GetTransformedTragetVariable(oldProblemData.TargetVariable, CreateDataAnalysisTransformation());
+      var targetVariable = RegressionTransformationModel.GetTransformedTragetVariable(oldProblemData.TargetVariable, CreateDataAnalysisTransformation());
       if (!context.Data.VariableNames.Contains(targetVariable))
         targetVariable = context.Data.VariableNames.First();
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisTransformationModelView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisTransformationModelView.Designer.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisTransformationModelView.Designer.cs	(revision 15870)
@@ -0,0 +1,174 @@
+﻿#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.Views {
+  partial class DataAnalysisTransformationModelView {
+    /// <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() {
+      this.originalModelTabPage = new System.Windows.Forms.TabPage();
+      this.modelViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.inputTransformationsTabPage = new System.Windows.Forms.TabPage();
+      this.inputTransformationsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.targetTransformationsTabPage = new System.Windows.Forms.TabPage();
+      this.targetTransformationsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.originalModelTabPage.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.inputTransformationsTabPage.SuspendLayout();
+      this.targetTransformationsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // originalModelTabPage
+      // 
+      this.originalModelTabPage.Controls.Add(this.modelViewHost);
+      this.originalModelTabPage.Location = new System.Drawing.Point(4, 22);
+      this.originalModelTabPage.Name = "originalModelTabPage";
+      this.originalModelTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.originalModelTabPage.Size = new System.Drawing.Size(486, 392);
+      this.originalModelTabPage.TabIndex = 0;
+      this.originalModelTabPage.Text = "Original Model";
+      this.originalModelTabPage.UseVisualStyleBackColor = true;
+      // 
+      // modelViewHost
+      // 
+      this.modelViewHost.Caption = "View";
+      this.modelViewHost.Content = null;
+      this.modelViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.modelViewHost.Enabled = false;
+      this.modelViewHost.Location = new System.Drawing.Point(3, 3);
+      this.modelViewHost.Name = "modelViewHost";
+      this.modelViewHost.ReadOnly = false;
+      this.modelViewHost.Size = new System.Drawing.Size(480, 386);
+      this.modelViewHost.TabIndex = 0;
+      this.modelViewHost.ViewsLabelVisible = true;
+      this.modelViewHost.ViewType = null;
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.originalModelTabPage);
+      this.tabControl.Controls.Add(this.inputTransformationsTabPage);
+      this.tabControl.Controls.Add(this.targetTransformationsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(494, 418);
+      this.tabControl.TabIndex = 0;
+      // 
+      // inputTransformationsTabPage
+      // 
+      this.inputTransformationsTabPage.Controls.Add(this.inputTransformationsViewHost);
+      this.inputTransformationsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.inputTransformationsTabPage.Name = "inputTransformationsTabPage";
+      this.inputTransformationsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.inputTransformationsTabPage.Size = new System.Drawing.Size(486, 392);
+      this.inputTransformationsTabPage.TabIndex = 1;
+      this.inputTransformationsTabPage.Text = "Input Transformations";
+      this.inputTransformationsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // inputTransformationsViewHost
+      // 
+      this.inputTransformationsViewHost.Caption = "View";
+      this.inputTransformationsViewHost.Content = null;
+      this.inputTransformationsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.inputTransformationsViewHost.Enabled = false;
+      this.inputTransformationsViewHost.Location = new System.Drawing.Point(3, 3);
+      this.inputTransformationsViewHost.Name = "inputTransformationsViewHost";
+      this.inputTransformationsViewHost.ReadOnly = false;
+      this.inputTransformationsViewHost.Size = new System.Drawing.Size(480, 386);
+      this.inputTransformationsViewHost.TabIndex = 1;
+      this.inputTransformationsViewHost.ViewsLabelVisible = false;
+      this.inputTransformationsViewHost.ViewType = null;
+      // 
+      // targetTransformationsTabPage
+      // 
+      this.targetTransformationsTabPage.Controls.Add(this.targetTransformationsViewHost);
+      this.targetTransformationsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.targetTransformationsTabPage.Name = "targetTransformationsTabPage";
+      this.targetTransformationsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.targetTransformationsTabPage.Size = new System.Drawing.Size(486, 392);
+      this.targetTransformationsTabPage.TabIndex = 2;
+      this.targetTransformationsTabPage.Text = "Target Transformations";
+      this.targetTransformationsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // targetTransformationsViewHost
+      // 
+      this.targetTransformationsViewHost.Caption = "View";
+      this.targetTransformationsViewHost.Content = null;
+      this.targetTransformationsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.targetTransformationsViewHost.Enabled = false;
+      this.targetTransformationsViewHost.Location = new System.Drawing.Point(3, 3);
+      this.targetTransformationsViewHost.Name = "targetTransformationsViewHost";
+      this.targetTransformationsViewHost.ReadOnly = false;
+      this.targetTransformationsViewHost.Size = new System.Drawing.Size(480, 386);
+      this.targetTransformationsViewHost.TabIndex = 1;
+      this.targetTransformationsViewHost.ViewsLabelVisible = false;
+      this.targetTransformationsViewHost.ViewType = null;
+      // 
+      // DataAnalysisTransformationModelView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "DataAnalysisTransformationModelView";
+      this.Size = new System.Drawing.Size(500, 424);
+      this.originalModelTabPage.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.inputTransformationsTabPage.ResumeLayout(false);
+      this.targetTransformationsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabPage originalModelTabPage;
+    private MainForm.WindowsForms.ViewHost modelViewHost;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage inputTransformationsTabPage;
+    private System.Windows.Forms.TabPage targetTransformationsTabPage;
+    private MainForm.WindowsForms.ViewHost inputTransformationsViewHost;
+    private MainForm.WindowsForms.ViewHost targetTransformationsViewHost;
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisTransformationModelView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisTransformationModelView.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/DataAnalysisTransformationModelView.cs	(revision 15870)
@@ -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.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Transformation Model View")]
+  [Content(typeof(IDataAnalysisTransformationModel), true)]
+  public partial class DataAnalysisTransformationModelView : ItemView {
+
+    public new IDataAnalysisTransformationModel Content {
+      get { return (IDataAnalysisTransformationModel)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public DataAnalysisTransformationModelView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      modelViewHost.Content = Content?.OriginalModel;
+      inputTransformationsViewHost.Content = Content?.InputTransformations;
+      targetTransformationsTabPage.Visible = Content is IRegressionTransformationModel;
+      targetTransformationsViewHost.Content = Content?.TargetTransformations;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      tabControl.Enabled = Content != null && !Locked;
+    }
+  }
+}
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 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 15870)
@@ -432,15 +432,9 @@
       <DependentUpon>RegressionSolutionScatterPlotView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Regression\TransformedRegressionModelView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Regression\TransformedRegressionModelView.Designer.cs">
-      <DependentUpon>TransformedRegressionModelView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Solution Views\TransformedRegressionSolutionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Solution Views\TransformedRegressionSolutionView.Designer.cs">
-      <DependentUpon>TransformedRegressionSolutionView.cs</DependentUpon>
+    <Compile Include="DataAnalysisTransformationModelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DataAnalysisTransformationModelView.Designer.cs">
+      <DependentUpon>DataAnalysisTransformationModelView.cs</DependentUpon>
     </Compile>
     <Compile Include="Solution Views\ClassificationSolutionView.cs">
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/TransformedRegressionModelView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/TransformedRegressionModelView.Designer.cs	(revision 15869)
+++ 	(revision )
@@ -1,130 +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.Problems.DataAnalysis.Views {
-  partial class TransformedRegressionModelView {
-    /// <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() {
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.tabPageModel = new System.Windows.Forms.TabPage();
-      this.tabPageTransformations = new System.Windows.Forms.TabPage();
-      this.modelViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.transformationsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.tabControl.SuspendLayout();
-      this.tabPageModel.SuspendLayout();
-      this.tabPageTransformations.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // tabControl
-      // 
-      this.tabControl.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.tabControl.Controls.Add(this.tabPageModel);
-      this.tabControl.Controls.Add(this.tabPageTransformations);
-      this.tabControl.Location = new System.Drawing.Point(3, 3);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(494, 418);
-      this.tabControl.TabIndex = 0;
-      // 
-      // tabPageModel
-      // 
-      this.tabPageModel.Controls.Add(this.modelViewHost);
-      this.tabPageModel.Location = new System.Drawing.Point(4, 22);
-      this.tabPageModel.Name = "tabPageModel";
-      this.tabPageModel.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPageModel.Size = new System.Drawing.Size(486, 392);
-      this.tabPageModel.TabIndex = 0;
-      this.tabPageModel.Text = "Original Model";
-      this.tabPageModel.UseVisualStyleBackColor = true;
-      // 
-      // tabPageTransformations
-      // 
-      this.tabPageTransformations.Controls.Add(this.transformationsViewHost);
-      this.tabPageTransformations.Location = new System.Drawing.Point(4, 22);
-      this.tabPageTransformations.Name = "tabPageTransformations";
-      this.tabPageTransformations.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPageTransformations.Size = new System.Drawing.Size(486, 392);
-      this.tabPageTransformations.TabIndex = 1;
-      this.tabPageTransformations.Text = "Transformations";
-      this.tabPageTransformations.UseVisualStyleBackColor = true;
-      // 
-      // modelViewHost
-      // 
-      this.modelViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.modelViewHost.Location = new System.Drawing.Point(3, 3);
-      this.modelViewHost.Name = "modelViewHost";
-      this.modelViewHost.Size = new System.Drawing.Size(480, 386);
-      this.modelViewHost.TabIndex = 0;
-      // 
-      // transformationsViewHost
-      // 
-      this.transformationsViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.transformationsViewHost.Location = new System.Drawing.Point(3, 3);
-      this.transformationsViewHost.Name = "transformationsViewHost";
-      this.transformationsViewHost.Size = new System.Drawing.Size(480, 386);
-      this.transformationsViewHost.TabIndex = 0;
-      // 
-      // TransformedRegressionModelView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Name = "TransformedRegressionModelView";
-      this.Size = new System.Drawing.Size(500, 424);
-      this.tabControl.ResumeLayout(false);
-      this.tabPageModel.ResumeLayout(false);
-      this.tabPageTransformations.ResumeLayout(false);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage tabPageModel;
-    private System.Windows.Forms.TabPage tabPageTransformations;
-    private HeuristicLab.MainForm.WindowsForms.ViewHost modelViewHost;
-    private HeuristicLab.MainForm.WindowsForms.ViewHost transformationsViewHost;
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/TransformedRegressionModelView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/TransformedRegressionModelView.cs	(revision 15869)
+++ 	(revision )
@@ -1,50 +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 HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Problems.DataAnalysis.Views {
-  [View("Transformed regression model")]
-  [Content(typeof(ITransformedRegressionModel), true)]
-  public partial class TransformedRegressionModelView : ItemView {
-
-    public new ITransformedRegressionModel Content {
-      get { return (ITransformedRegressionModel)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public TransformedRegressionModelView() {
-      InitializeComponent();
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      modelViewHost.Content = Content?.OriginalModel;
-      transformationsViewHost.Content = Content?.Transformations;
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      tabControl.Enabled = Content != null;
-    }
-  }
-}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.Designer.cs	(revision 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.Designer.cs	(revision 15870)
@@ -47,4 +47,5 @@
       this.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
       this.loadProblemDataButton = new System.Windows.Forms.Button();
+      this.transformButton = new System.Windows.Forms.Button();
       this.loadProblemDataFileDialog = new System.Windows.Forms.OpenFileDialog();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
@@ -54,4 +55,5 @@
       this.itemsGroupBox.SuspendLayout();
       this.detailsGroupBox.SuspendLayout();
+      this.flowLayoutPanel.SuspendLayout();
       this.SuspendLayout();
       //
@@ -77,14 +79,17 @@
       //
       // flowLayoutPanel
-      //
-      this.flowLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.LeftToRight;
+      // 
+      this.flowLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.flowLayoutPanel.Controls.Add(this.loadProblemDataButton);
+      this.flowLayoutPanel.Controls.Add(this.transformButton);
       this.flowLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.flowLayoutPanel.Name = "flowLayoutPanel";
       this.flowLayoutPanel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
       this.flowLayoutPanel.Size = new System.Drawing.Size(266, 30);
-      this.flowLayoutPanel.Controls.Add(this.loadProblemDataButton);
-      //
+      this.flowLayoutPanel.TabIndex = 1;
+      // 
       // loadProblemDataButton
-      //
+      // 
       this.loadProblemDataButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
       this.loadProblemDataButton.AutoSize = true;
@@ -98,7 +103,18 @@
       this.loadProblemDataButton.UseVisualStyleBackColor = true;
       this.loadProblemDataButton.Click += new System.EventHandler(this.loadProblemDataButton_Click);
-      this.toolTip.SetToolTip(this.loadProblemDataButton, "Creates a new data analysis solution with the same model and the loaded problem data.");
       // 
-      // openFileDialog
+      // transformButton
+      // 
+      this.transformButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.transformButton.Location = new System.Drawing.Point(6, 33);
+      this.transformButton.Name = "transformButton";
+      this.transformButton.Size = new System.Drawing.Size(152, 23);
+      this.transformButton.TabIndex = 7;
+      this.transformButton.Text = "Integrate Transformations";
+      this.transformButton.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.transformButton.UseVisualStyleBackColor = true;
+      this.transformButton.Click += new System.EventHandler(this.transformButton_Click);
+      // 
+      // loadProblemDataFileDialog
       // 
       this.loadProblemDataFileDialog.Filter = "HL files|*.hl";
@@ -115,4 +131,6 @@
       this.itemsGroupBox.ResumeLayout(false);
       this.detailsGroupBox.ResumeLayout(false);
+      this.flowLayoutPanel.ResumeLayout(false);
+      this.flowLayoutPanel.PerformLayout();
       this.ResumeLayout(false);
 
@@ -124,5 +142,5 @@
     protected System.Windows.Forms.OpenFileDialog loadProblemDataFileDialog;
     protected System.Windows.Forms.FlowLayoutPanel flowLayoutPanel;
-
+    protected System.Windows.Forms.Button transformButton;
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.cs	(revision 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/DataAnalysisSolutionView.cs	(revision 15870)
@@ -25,4 +25,5 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
@@ -37,7 +38,12 @@
   [Content(typeof(DataAnalysisSolution), false)]
   public partial class DataAnalysisSolutionView : NamedItemCollectionView<IResult> {
+
+    private const string BacktransformButtonText = "Integrate Transformations";
+    private const string ReapplyTransformationsButtonText = "Restore Original Model";
+
     public DataAnalysisSolutionView() {
       InitializeComponent();
       viewHost.ViewsLabelVisible = false;
+      transformButton.Image = VSImageLibrary.Event;
     }
 
@@ -52,4 +58,6 @@
       removeButton.Enabled = false;
       loadProblemDataButton.Enabled = Content != null && !Locked;
+      transformButton.Enabled = Content != null && !Locked;
+      transformButton.Visible = Content != null && Content.ProblemData.Transformations.Any();
     }
 
@@ -81,4 +89,9 @@
         }
       }
+
+      if (Content == null) return;
+
+      transformButton.Text = Content.Model is IDataAnalysisTransformationModel
+        ? ReapplyTransformationsButtonText : BacktransformButtonText;
     }
 
@@ -147,9 +160,7 @@
           solution.Name += " with loaded problemData";
         MainFormManager.MainForm.ShowContent(solution);
-      }
-      catch (InvalidOperationException invalidOperationException) {
+      } catch (InvalidOperationException invalidOperationException) {
         ErrorHandling.ShowErrorDialog(this, invalidOperationException);
-      }
-      catch (ArgumentException argumentException) {
+      } catch (ArgumentException argumentException) {
         ErrorHandling.ShowErrorDialog(this, argumentException);
       }
@@ -238,9 +249,7 @@
         Content.Filename = string.Empty;
         MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().UpdateTitle();
-      }
-      catch (InvalidOperationException invalidOperationException) {
+      } catch (InvalidOperationException invalidOperationException) {
         ErrorHandling.ShowErrorDialog(this, invalidOperationException);
-      }
-      catch (ArgumentException argumentException) {
+      } catch (ArgumentException argumentException) {
         ErrorHandling.ShowErrorDialog(this, argumentException);
       }
@@ -248,4 +257,42 @@
     #endregion
 
+    private void transformButton_Click(object sender, EventArgs e) {
+      var transformedSolution = CreateTransformedSolution(Content);
+      MainFormManager.MainForm.ShowContent(transformedSolution);
+    }
+
+    private static IDataAnalysisSolution CreateTransformedSolution(IDataAnalysisSolution solution) {
+      if (solution.Model is IRegressionTransformationModel regressionTransformationModel && !(solution.Model is ITimeSeriesPrognosisTransformationModel)) {
+        var originalData = (IRegressionProblemData)((IRegressionSolution)solution).ProblemData.Transform();
+        return regressionTransformationModel.OriginalModel.CreateRegressionSolution(originalData);
+      } else if (solution.Model is IClassificationTransformationModel classificationTransformationModel) {
+        var originalData = (IClassificationProblemData)((IClassificationSolution)solution).ProblemData.Transform();
+        return classificationTransformationModel.OriginalModel.CreateClassificationSolution(originalData);
+      } else if (solution.Model is IRegressionModel regressionModel && !(solution.Model is ITimeSeriesPrognosisModel)) {
+        var transformationModel = new RegressionTransformationModel(regressionModel, solution.ProblemData.Transformations);
+        var transformedData = (IRegressionProblemData)((IRegressionSolution)solution).ProblemData.InverseTransform();
+        return transformationModel.CreateRegressionSolution(transformedData);
+      } else if (solution.Model is IClassificationModel classificationModel) {
+        var transformationModel = new ClassificationTransformationModel(classificationModel, solution.ProblemData.Transformations);
+        var transformedData = (IClassificationProblemData)((IClassificationSolution)solution).ProblemData.InverseTransform();
+        return transformationModel.CreateClassificationSolution(transformedData);
+      } else throw new NotSupportedException();
+    }
+
+    /*if (Content.Model is IDataAnalysisTransformationModel transformationModel) {
+      var originalModel = transformationModel.InverseTransform();
+      originalModel.CreateSolution();
+    } else {
+      var originalModel = Content.Model;
+      var transformationModel = originalModel.Transform();
+      transformationModel.CreateSolution();
+    }*/
+
+    ////Content.Model.Transform()
+
+    //var transformedModel = new DataAnalysisTransformationModel(Content.Model, Content.ProblemData.Transformations);
+    //var originalProblemData = (IRegressionProblemData)Content.ProblemData.InverseTransform();
+    //var transformedSolution = new TransformedRegressionSolution(transformedModel, originalProblemData);
+    //MainFormManager.MainForm.ShowContent(transformedSolution);
   }
 }
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 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.Designer.cs	(revision 15870)
@@ -48,5 +48,4 @@
     private void InitializeComponent() {
       System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RegressionSolutionView));
-      this.TransformButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
@@ -72,18 +71,4 @@
       this.toolTip.SetToolTip(this.removeButton, "Remove");
       // 
-      // TransformButton
-      // 
-      this.TransformButton.AutoSize = true;
-      this.TransformButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.TransformButton.Location = new System.Drawing.Point(117, 3);
-      this.TransformButton.Name = "TransformButton";
-      this.TransformButton.Size = new System.Drawing.Size(108, 23);
-      this.TransformButton.TabIndex = 1;
-      this.TransformButton.Text = "Transform Back";
-      this.TransformButton.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
-      this.toolTip.SetToolTip(this.TransformButton, "TODO: Backtransform model based on the stored transformations.");
-      this.TransformButton.UseVisualStyleBackColor = true;
-      this.TransformButton.Click += new System.EventHandler(this.transformButton_Click);
-      // 
       // RegressionSolutionView
       // 
@@ -101,6 +86,4 @@
 
     #endregion
-
-    protected 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 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/RegressionSolutionView.cs	(revision 15870)
@@ -20,7 +20,5 @@
 #endregion
 
-using System.Linq;
 using System.Windows.Forms;
-using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
 using HeuristicLab.MainForm;
@@ -32,6 +30,4 @@
     public RegressionSolutionView() {
       InitializeComponent();
-      TransformButton.Image = VSImageLibrary.Event;
-      flowLayoutPanel.Controls.Add(TransformButton);
     }
 
@@ -43,6 +39,4 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      TransformButton.Enabled = Content != null;
-      TransformButton.Visible = Content != null && Content.ProblemData.Transformations.Any();
     }
 
@@ -61,11 +55,4 @@
     }
     #endregion
-
-    protected virtual void transformButton_Click(object sender, System.EventArgs e) {
-      var transformedModel = new TransformedRegressionModel(Content.Model, Content.ProblemData.Transformations);
-      var originalProblemData = (IRegressionProblemData)Content.ProblemData.InverseTransform();
-      var transformedSolution = new TransformedRegressionSolution(transformedModel, originalProblemData);
-      MainFormManager.MainForm.ShowContent(transformedSolution);
-    }
   }
 }
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/TransformedRegressionSolutionView.Designer.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/TransformedRegressionSolutionView.Designer.cs	(revision 15869)
+++ 	(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.Problems.DataAnalysis.Views {
-  partial class TransformedRegressionSolutionView {
-    /// <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.Problems.DataAnalysis.Views/3.4/Solution Views/TransformedRegressionSolutionView.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis.Views/3.4/Solution Views/TransformedRegressionSolutionView.cs	(revision 15869)
+++ 	(revision )
@@ -1,47 +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 HeuristicLab.MainForm;
-
-namespace HeuristicLab.Problems.DataAnalysis.Views {
-  [View("Transformation Solution View")]
-  [Content(typeof(TransformedRegressionSolution), false)]
-  public partial class TransformedRegressionSolutionView : RegressionSolutionView {
-
-    public new TransformedRegressionSolution Content {
-      get { return (TransformedRegressionSolution)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public TransformedRegressionSolutionView() {
-      InitializeComponent();
-      TransformButton.Text = "Re-Apply Transformation";
-    }
-
-    protected override void transformButton_Click(object sender, EventArgs e) {
-      var originalModel = Content.Model.OriginalModel;
-      var transformedProblemData = (IRegressionProblemData)Content.ProblemData.Transform();
-      var originalSolution = originalModel.CreateRegressionSolution(transformedProblemData);
-      MainFormManager.MainForm.ShowContent(originalSolution);
-    }
-  }
-}
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 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 15870)
@@ -187,4 +187,5 @@
     <Compile Include="Implementation\Classification\ClassificationSolutionBase.cs" />
     <Compile Include="Implementation\Classification\ClassificationSolutionVariableImpactsCalculator.cs" />
+    <Compile Include="Implementation\Classification\ClassificationTransformationModel.cs" />
     <Compile Include="Implementation\Classification\ConstantClassificationSolution.cs" />
     <Compile Include="Implementation\Classification\DiscriminantFunctionClassificationSolutionBase.cs" />
@@ -193,4 +194,5 @@
     <Compile Include="Implementation\Clustering\ClusteringProblemData.cs" />
     <Compile Include="Implementation\Clustering\ClusteringSolution.cs" />
+    <Compile Include="Implementation\Clustering\ClusteringTransformationModel.cs" />
     <Compile Include="Implementation\ConstantModel.cs" />
     <Compile Include="Implementation\DataAnalysisModel.cs" />
@@ -206,8 +208,9 @@
     <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\DataAnalysisTransformationModel.cs" />
+    <Compile Include="Implementation\Regression\RegressionTransformationModel.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\Models\ConstantTimeSeriesPrognosisModel.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\Models\TimeSeriesPrognosisAutoRegressiveModel.cs" />
+    <Compile Include="Implementation\TimeSeriesPrognosis\Models\TimeSeriesPrognosisTransformationModel.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\TimeSeriesPrognosisProblem.cs" />
     <Compile Include="Implementation\TimeSeriesPrognosis\TimeSeriesPrognosisProblemData.cs" />
@@ -236,12 +239,14 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Interfaces\Classification\IClassificationTransformationModel.cs" />
     <Compile Include="Interfaces\Classification\IDiscriminantFunctionThresholdCalculator.cs" />
+    <Compile Include="Interfaces\Clustering\IClusteringTransformationModel.cs" />
     <Compile Include="Interfaces\IDataAnalysisSolutionExporter.cs" />
     <Compile Include="Interfaces\IDataAnalysisTransformation.cs" />
+    <Compile Include="Interfaces\IDataAnalysisTransformationModel.cs" />
     <Compile Include="Interfaces\IDataset.cs" />
     <Compile Include="Interfaces\IDependencyCalculator.cs" />
     <Compile Include="Interfaces\ITransformation.cs" />
-    <Compile Include="Interfaces\Regression\ITransformedRegressionModel.cs" />
-    <Compile Include="Interfaces\Regression\ITransformedRegressionSolution.cs" />
+    <Compile Include="Interfaces\Regression\IRegressionTransformationModel.cs" />
     <Compile Include="Interfaces\Regression\IConfidenceRegressionModel.cs" />
     <Compile Include="Interfaces\Regression\IConfidenceRegressionSolution.cs" />
@@ -256,4 +261,5 @@
     <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisProblemData.cs" />
     <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisSolution.cs" />
+    <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisTransformationModel.cs" />
     <Compile Include="ModifiableDataset.cs" />
     <Compile Include="OnlineCalculators\AutoCorrelationCalculator.cs" />
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationTransformationModel.cs	(revision 15870)
@@ -0,0 +1,66 @@
+﻿#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("Classification Transformation Model", "A classification model that was transformed back to match the original variables after the training was performed on transformed variables.")]
+  [StorableClass]
+  public class ClassificationTransformationModel : DataAnalysisTransformationModel, IClassificationTransformationModel {
+    public new IClassificationModel OriginalModel {
+      get { return (IClassificationModel)base.OriginalModel; }
+    }
+
+
+    #region Constructor, Cloning & Persistence
+    public ClassificationTransformationModel(IClassificationModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
+      : base(originalModel, transformations) {
+      if (CalculateTransitiveVariables(new[] { originalModel.TargetVariable }, transformations).Any())
+        throw new NotSupportedException("Classification with a transformed target variable is not allowed");
+    }
+
+    protected ClassificationTransformationModel(ClassificationTransformationModel original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClassificationTransformationModel(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected ClassificationTransformationModel(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+
+    public virtual IEnumerable<double> GetEstimatedClassValues(IDataset dataset, IEnumerable<int> rows) {
+      return OriginalModel.GetEstimatedClassValues(Transform(dataset, InputTransformations), rows);
+    }
+
+    public virtual IClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
+      return new ClassificationSolution(this, problemData);
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringTransformationModel.cs	(revision 15870)
@@ -0,0 +1,58 @@
+﻿#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("Clustering Transformation Model", "A clustering model that was transformed back to match the original variables after the training was performed on transformed variables.")]
+  [StorableClass]
+  public class ClusteringTransformationModel : DataAnalysisTransformationModel, IClusteringTransformationModel {
+
+    public new IClusteringModel OriginalModel {
+      get { return (IClusteringModel)base.OriginalModel; }
+    }
+
+    #region Constructor, Cloning & Persistence
+    public ClusteringTransformationModel(IClusteringModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
+      : base(originalModel, transformations) {
+    }
+
+    protected ClusteringTransformationModel(ClusteringTransformationModel original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClusteringTransformationModel(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected ClusteringTransformationModel(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+
+    public IEnumerable<int> GetClusterValues(IDataset dataset, IEnumerable<int> rows) {
+      return OriginalModel.GetClusterValues(Transform(dataset, InputTransformations), rows);
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 15870)
@@ -243,5 +243,5 @@
 
     public virtual IDataAnalysisProblemData Transform() {
-      var newDataset = Transform(Dataset, Transformations);
+      var newDataset = DataAnalysisTransformationModel.Transform(Dataset, Transformations);
 
       var extendedInputs = ExtendInputVariables(AllowedInputVariables, Transformations);
@@ -253,5 +253,5 @@
       cloner.RegisterClonedObject(Dataset, newDataset);
       cloner.RegisterClonedObject(InputVariables, checkedInputs.AsReadOnly());
-      //cloner.RegisterClonedObject(TransformationsParameter.Value, new ItemList<IDataAnalysisTransformation>(transformations).AsReadOnly());
+      // TODO: valid values for target are not extended
 
       return cloner.Clone(this);
@@ -268,27 +268,7 @@
       cloner.RegisterClonedObject(Dataset, newDataset);
       cloner.RegisterClonedObject(InputVariables, checkedInputs.AsReadOnly());
-      //cloner.RegisterClonedObject(TransformationsParameter.Value, new ItemList<IDataAnalysisTransformation>().AsReadOnly());
+      // TODO: check valid target values 
 
       return cloner.Clone(this);
-    }
-
-    public static IDataset Transform(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
-      var modifiableDataset = ((Dataset)dataset).ToModifiable();
-
-      foreach (var transformation in transformations) {
-        var trans = (ITransformation<double>)transformation.Transformation;
-
-        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;
     }
 
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs	(revision 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs	(revision 15870)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -40,6 +39,6 @@
     }
 
-    private IValueParameter<ITransformation> TransformationParameter {
-      get { return (IValueParameter<ITransformation>)Parameters["Transformation"]; }
+    private ValueParameter<ITransformation> TransformationParameter {
+      get { return (ValueParameter<ITransformation>)Parameters["Transformation"]; }
     }
     #endregion
@@ -48,34 +47,25 @@
     public string OriginalVariable {
       get { return OriginalVariableParameter.Value.Value; }
-      set { OriginalVariableParameter.Value.Value = value; }
     }
 
     public string TransformedVariable {
       get { return TransformedVariableParameter.Value.Value; }
-      set { TransformedVariableParameter.Value.Value = value; }
     }
 
     public ITransformation Transformation {
       get { return TransformationParameter.Value; }
-      set { TransformationParameter.Value = value; }
     }
     #endregion
 
     #region Constructor, Cloning & Persistence
-    public DataAnalysisTransformation()
-      : this("", "", new IdentityTransformation()) {
-    }
     public DataAnalysisTransformation(string originalVariable, string transformedVariable, ITransformation transformation)
       : base() {
-      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();
+      Parameters.Add(new FixedValueParameter<StringValue>("Original Variable", new StringValue(originalVariable).AsReadOnly()));
+      Parameters.Add(new FixedValueParameter<StringValue>("Transformed Variable", new StringValue(transformedVariable).AsReadOnly()));
+      Parameters.Add(new ValueParameter<ITransformation>("Transformation", transformation)); // TODO: should be readonly/fixed
     }
 
     protected DataAnalysisTransformation(DataAnalysisTransformation original, Cloner cloner)
       : base(original, cloner) {
-      RegisterEventHandlers();
     }
 
@@ -89,25 +79,4 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterEventHandlers();
-    }
-    #endregion
-
-    #region Event-Handling
-    private void RegisterEventHandlers() {
-      OriginalVariableParameter.Value.ValueChanged += OriginalVariableParameterValue_ValueChanged;
-      TransformedVariableParameter.Value.ValueChanged += TransformedVariableParameterValue_ValueChanged;
-      TransformationParameter.ValueChanged += TransformationParameter_ValueChanged;
-    }
-
-    private void OriginalVariableParameterValue_ValueChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-    private void TransformedVariableParameterValue_ValueChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-    private void TransformationParameter_ValueChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
     #endregion
 
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformationModel.cs	(revision 15870)
@@ -0,0 +1,146 @@
+﻿#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("Data Analysis Transformation Model", "A model that was transformed back to match the original variables after the training was performed on transformed variables.")]
+  [StorableClass]
+  public abstract class DataAnalysisTransformationModel : DataAnalysisModel, IDataAnalysisTransformationModel {
+
+    [Storable]
+    public IDataAnalysisModel OriginalModel { get; protected set; }
+
+    [Storable]
+    public ReadOnlyItemList<IDataAnalysisTransformation> InputTransformations { get; protected set; }
+
+    [Storable]
+    public ReadOnlyItemList<IDataAnalysisTransformation> TargetTransformations { get; protected set; }
+
+    // Usually, the TargetVariable is usually only implemented for Regression and Classification.
+    // However, we implement it in the base class for reducing code duplication and to avoid quasi-identical views.
+    [Storable]
+    private string targetVariable;
+    public string TargetVariable {
+      get { return targetVariable; }
+      set {
+        if (string.IsNullOrEmpty(value) || targetVariable == value) return;
+        targetVariable = value;
+        OnTargetVariableChanged(this, EventArgs.Empty);
+      }
+    }
+
+    public override IEnumerable<string> VariablesUsedForPrediction {
+      get { return OriginalModel.VariablesUsedForPrediction; /* TODO: reduce extend-inputs */}
+    }
+
+    #region Constructor, Cloning & Persistence
+    protected DataAnalysisTransformationModel(IDataAnalysisModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
+      : base(originalModel.Name) {
+      OriginalModel = originalModel;
+      var transitiveInputs = CalculateTransitiveVariables(originalModel.VariablesUsedForPrediction, transformations);
+      InputTransformations = new ItemList<IDataAnalysisTransformation>(transformations.Where(t => transitiveInputs.Contains(t.OriginalVariable))).AsReadOnly();
+      TargetTransformations = new ReadOnlyItemList<IDataAnalysisTransformation>();
+    }
+
+    protected DataAnalysisTransformationModel(DataAnalysisTransformationModel original, Cloner cloner)
+      : base(original, cloner) {
+      OriginalModel = cloner.Clone(original.OriginalModel);
+      InputTransformations = cloner.Clone(original.InputTransformations);
+      TargetTransformations = cloner.Clone(original.TargetTransformations);
+      targetVariable = original.targetVariable;
+    }
+
+    [StorableConstructor]
+    protected DataAnalysisTransformationModel(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+
+    public static ISet<string> CalculateTransitiveVariables(IEnumerable<string> inputVariables, IEnumerable<IDataAnalysisTransformation> transformations) {
+      var transitiveInputs = new HashSet<string>(inputVariables);
+
+      foreach (var transformation in transformations.Reverse()) {
+        if (transitiveInputs.Contains(transformation.TransformedVariable)) {
+          transitiveInputs.Add(transformation.OriginalVariable);
+        }
+      }
+
+      return transitiveInputs;
+    }
+
+    public static IDataset Transform(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
+      var modifiableDataset = ((Dataset)dataset).ToModifiable();
+
+      foreach (var transformation in transformations) {
+        var trans = (ITransformation<double>)transformation.Transformation;
+
+        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;
+    }
+
+
+
+    #region Events
+    public event EventHandler TargetVariableChanged;
+    private void OnTargetVariableChanged(object sender, EventArgs args) {
+      var changed = TargetVariableChanged;
+      if (changed != null)
+        changed(sender, args);
+    }
+    #endregion
+
+
+
+
+
+
+    /*
+    // dataset in original data range
+    public override IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
+      var transformedDataset = Transform(dataset, Transformations);
+
+      var estimates = OriginalModel.GetEstimatedValues(transformedDataset, rows);
+
+      return InverseTransform(estimates, Transformations, OriginalModel.TargetVariable);
+    }
+
+    // problemData in original data range
+    public override IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
+      // TODO: specialized views for the original solution type are lost (RandomForestSolutionView, ...)
+      return new RegressionSolution(this, new RegressionProblemData(problemData));
+    } */
+  }
+}
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 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 15870)
@@ -183,5 +183,5 @@
     public override IDataAnalysisProblemData Transform() {
       var transformedProblemData = (IRegressionProblemData)base.Transform();
-      var targetVariable = GetTransformedTragetVariable(TargetVariable, Transformations);
+      var targetVariable = RegressionTransformationModel.GetTransformedTragetVariable(TargetVariable, Transformations);
       transformedProblemData.TargetVariable = targetVariable;
       return transformedProblemData;
@@ -190,26 +190,8 @@
     public override IDataAnalysisProblemData InverseTransform() {
       var transformedProblemData = (IRegressionProblemData)base.InverseTransform();
-      var targetVariable = GetOriginalTragetVariable(TargetVariable, Transformations);
+      var targetVariable = RegressionTransformationModel.GetOriginalTragetVariable(TargetVariable, Transformations);
       transformedProblemData.TargetVariable = targetVariable;
       return transformedProblemData;
     }
-
-    public static string GetTransformedTragetVariable(string originalTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
-      var transformedTarget = originalTarget;
-      foreach (var transformation in transformations) {
-        if (transformation.OriginalVariable == transformedTarget)
-          transformedTarget = transformation.TransformedVariable;
-      }
-      return transformedTarget;
-    }
-
-    public static string GetOriginalTragetVariable(string transformedTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
-      var originalTarget = transformedTarget;
-      foreach (var transformation in transformations.Reverse()) {
-        if (transformation.TransformedVariable == originalTarget)
-          originalTarget = transformation.OriginalVariable;
-      }
-      return originalTarget;
-    }
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionTransformationModel.cs	(revision 15870)
@@ -0,0 +1,104 @@
+﻿#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("Regression Transformation Model", "A regression model that was transformed back to match the original variables after the training was performed on transformed variables.")]
+  [StorableClass]
+  public class RegressionTransformationModel : DataAnalysisTransformationModel, IRegressionTransformationModel {
+
+    public new IRegressionModel OriginalModel {
+      get { return (IRegressionModel)base.OriginalModel; }
+    }
+
+    #region Constructor, Cloning & Persistence
+    public RegressionTransformationModel(IRegressionModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
+      : base(originalModel, transformations) {
+      var transitiveTargets = CalculateTransitiveVariables(new[] { originalModel.TargetVariable }, transformations);
+      TargetTransformations = new ItemList<IDataAnalysisTransformation>(transformations.Where(t => transitiveTargets.Contains(t.OriginalVariable))).AsReadOnly();
+      TargetVariable = GetOriginalTragetVariable(originalModel.TargetVariable, TargetTransformations);
+    }
+
+    protected RegressionTransformationModel(RegressionTransformationModel original, Cloner cloner)
+      : base(original, cloner) {
+      
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RegressionTransformationModel(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected RegressionTransformationModel(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+
+    public virtual IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
+      var estimates = OriginalModel.GetEstimatedValues(Transform(dataset, InputTransformations), rows);
+      return InverseTransform(estimates, TargetTransformations, OriginalModel.TargetVariable);
+    }
+
+    public virtual IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
+      return new RegressionSolution(this, new RegressionProblemData(problemData));
+    }
+
+    public static IEnumerable<double> InverseTransform(IEnumerable<double> data, IEnumerable<IDataAnalysisTransformation> transformations, string targetVariable) {
+      var estimates = data.ToList();
+
+      foreach (var transformation in transformations.Reverse()) {
+        if (transformation.TransformedVariable == targetVariable) {
+          var trans = (ITransformation<double>)transformation.Transformation;
+
+          estimates = trans.InverseApply(estimates).ToList();
+
+          // setup next iteration
+          targetVariable = transformation.OriginalVariable;
+        }
+      }
+
+      return estimates;
+    }
+
+    public static string GetTransformedTragetVariable(string originalTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
+      var transformedTarget = originalTarget;
+      foreach (var transformation in transformations) {
+        if (transformation.OriginalVariable == transformedTarget)
+          transformedTarget = transformation.TransformedVariable;
+      }
+      return transformedTarget;
+    }
+
+    public static string GetOriginalTragetVariable(string transformedTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
+      var originalTarget = transformedTarget;
+      foreach (var transformation in transformations.Reverse()) {
+        if (transformation.TransformedVariable == originalTarget)
+          originalTarget = transformation.OriginalVariable;
+      }
+      return originalTarget;
+    }
+  }
+}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionModel.cs	(revision 15869)
+++ 	(revision )
@@ -1,102 +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.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(RegressionProblemData.GetOriginalTragetVariable(originalModel.TargetVariable, transformations)) {
-      Name = "Transformed " + originalModel.Name;
-      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
-
-    // dataset in original data range
-    public override IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
-      var transformedDataset = TransformInputs(dataset, Transformations);
-
-      var estimates = OriginalModel.GetEstimatedValues(transformedDataset, rows);
-
-      return InverseTransformEstimates(estimates, Transformations, OriginalModel.TargetVariable);
-    }
-
-    // problemData in original data range
-    public override IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      // TODO: specialized views for the original solution type are lost (RandomForestSolutionView, ...)
-      return new TransformedRegressionSolution(this, new RegressionProblemData(problemData));
-    }
-
-    private static IDataset TransformInputs(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
-      return DataAnalysisProblemData.Transform(dataset, transformations);
-    }
-
-    private static IEnumerable<double> InverseTransformEstimates(IEnumerable<double> data, IEnumerable<IDataAnalysisTransformation> transformations, string targetVariable) {
-      var estimates = data.ToList();
-
-      foreach (var transformation in transformations.Reverse()) {
-        if (transformation.TransformedVariable == targetVariable) {
-          var trans = (ITransformation<double>)transformation.Transformation;
-
-          estimates = trans.InverseApply(estimates).ToList();
-
-          // setup next iteration
-          targetVariable = transformation.OriginalVariable;
-        }
-      }
-
-      return estimates;
-    }
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionSolution.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/TransformedRegressionSolution.cs	(revision 15869)
+++ 	(revision )
@@ -1,52 +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 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/Models/TimeSeriesPrognosisTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/Models/TimeSeriesPrognosisTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/Models/TimeSeriesPrognosisTransformationModel.cs	(revision 15870)
@@ -0,0 +1,64 @@
+﻿#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  [Item("Time Series Prognosis Transformation Model", "A time series prognosis model that was transformed back to match the original variables after the training was performed on transformed variables.")]
+  [StorableClass]
+  public class TimeSeriesPrognosisTransformationModel : RegressionTransformationModel, ITimeSeriesPrognosisTransformationModel {
+
+    public new ITimeSeriesPrognosisModel OriginalModel {
+      get { return (ITimeSeriesPrognosisModel)base.OriginalModel; }
+    }
+
+    #region Constructor, Cloning & Persistence
+    public TimeSeriesPrognosisTransformationModel(ITimeSeriesPrognosisModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
+      : base(originalModel, transformations) {
+    }
+
+    protected TimeSeriesPrognosisTransformationModel(TimeSeriesPrognosisTransformationModel original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TimeSeriesPrognosisTransformationModel(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected TimeSeriesPrognosisTransformationModel(bool deserializing)
+      : base(deserializing) { }
+    #endregion
+
+    public IEnumerable<IEnumerable<double>> GetPrognosedValues(IDataset dataset, IEnumerable<int> rows, IEnumerable<int> horizons) {
+      var estimates = OriginalModel.GetPrognosedValues(Transform(dataset, InputTransformations), rows, horizons);
+      return estimates.Select(x => InverseTransform(x, TargetTransformations, TargetVariable)); // TODO: transform the whole horizon?
+    }
+
+    public ITimeSeriesPrognosisSolution CreateTimeSeriesPrognosisSolution(ITimeSeriesPrognosisProblemData problemData) {
+      return new TimeSeriesPrognosisSolution(this, problemData);
+    }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationTransformationModel.cs	(revision 15870)
@@ -0,0 +1,27 @@
+﻿#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 IClassificationTransformationModel : IDataAnalysisTransformationModel, IClassificationModel {
+    new IClassificationModel OriginalModel { get; }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Clustering/IClusteringTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Clustering/IClusteringTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Clustering/IClusteringTransformationModel.cs	(revision 15870)
@@ -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 IClusteringTransformationModel : IDataAnalysisTransformationModel, IClusteringModel {
+    new IClusteringModel OriginalModel { get; }
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs	(revision 15869)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs	(revision 15870)
@@ -25,8 +25,8 @@
   public interface IDataAnalysisTransformation : INamedItem {
 
-    string OriginalVariable { get; set; }
-    string TransformedVariable { get; set; }
+    string OriginalVariable { get; }
+    string TransformedVariable { get; }
 
-    ITransformation Transformation { get; set; }
+    ITransformation Transformation { get; }
   }
 }
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformationModel.cs	(revision 15870)
@@ -0,0 +1,35 @@
+﻿#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 IDataAnalysisTransformationModel : IDataAnalysisModel {
+    IDataAnalysisModel OriginalModel { get; }
+
+    /// <summary>
+    /// Transformations that are used on the model's inputs.
+    /// </summary>                                                                      
+    ReadOnlyItemList<IDataAnalysisTransformation> InputTransformations { get; }  // TODO: IReadonlyList<>?
+
+    ReadOnlyItemList<IDataAnalysisTransformation> TargetTransformations { get; } // TODO: to Regression/Classification interface?
+  }
+}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionTransformationModel.cs	(revision 15870)
@@ -0,0 +1,28 @@
+﻿#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 IRegressionTransformationModel : IDataAnalysisTransformationModel, IRegressionModel {
+    new IRegressionModel OriginalModel { get; }
+  }
+}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionModel.cs	(revision 15869)
+++ 	(revision )
@@ -1,31 +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 HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.DataAnalysis {
-  public interface ITransformedRegressionModel : IRegressionModel {
-
-    IRegressionModel OriginalModel { get; }
-
-    ItemList<IDataAnalysisTransformation> Transformations { get; }
-  }
-}
Index: anches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionSolution.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/ITransformedRegressionSolution.cs	(revision 15869)
+++ 	(revision )
@@ -1,26 +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.Problems.DataAnalysis {
-  public interface ITransformedRegressionSolution : IRegressionSolution {
-    new ITransformedRegressionModel Model { get; }
-  }
-}
Index: /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/TimeSeriesPrognosis/ITimeSeriesPrognosisTransformationModel.cs
===================================================================
--- /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/TimeSeriesPrognosis/ITimeSeriesPrognosisTransformationModel.cs	(revision 15870)
+++ /branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/TimeSeriesPrognosis/ITimeSeriesPrognosisTransformationModel.cs	(revision 15870)
@@ -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 ITimeSeriesPrognosisTransformationModel : IRegressionTransformationModel, ITimeSeriesPrognosisModel {
+    new ITimeSeriesPrognosisModel OriginalModel { get; }
+  }
+}
